From c28d99ee98ea9ccaa44ab7548d49c2f12b257c56 Mon Sep 17 00:00:00 2001 From: bglynn Date: Fri, 19 Jan 2024 11:32:12 -0800 Subject: [PATCH 01/20] Initial restructuring to move towards a more linear user flow in the docs. --- .gitignore | 1 + .../AWS IAM/Examples}/_category_.json | 2 +- .../AWS IAM/Examples}/aws-iam-eks.mdx | 4 +- docs/access-types/AWS IAM/Overview.mdx | 8 +++ docs/access-types/AWS IAM/Reference.mdx | 4 ++ docs/access-types/AWS IAM/_category_.json | 5 ++ .../Istio/Examples/_category_.json | 5 ++ .../k8s-istio-authorization-policies.mdx | 14 ++-- .../Istio/Examples}/k8s-istio-watcher.mdx | 16 ++--- docs/access-types/Istio/Overview.mdx | 4 ++ docs/access-types/Istio/Reference.mdx | 4 ++ docs/access-types/Istio/_category_.json | 5 ++ .../Kafka/Examples/_category_.json | 5 ++ .../Kafka/Examples}/k8s-kafka-mapping.mdx | 10 +-- .../Examples}/k8s-kafka-mtls-cert-manager.mdx | 28 ++++---- .../Kafka/Examples}/k8s-kafka-mtls.mdx | 24 +++---- docs/access-types/Kafka/Overview.mdx | 4 ++ docs/access-types/Kafka/Reference.mdx | 4 ++ docs/access-types/Kafka/_category_.json | 5 ++ .../Networking/Examples/_category_.json | 5 ++ .../Networking/Examples}/aws-eks-cni-mini.mdx | 14 ++-- .../Examples}/k8s-network-mapper.mdx | 14 ++-- .../Examples}/k8s-network-policies.mdx | 22 +++--- .../protect-1-service-network-policies.mdx | 13 ++-- docs/access-types/Networking/Overview.mdx | 4 ++ .../Reference/Network-Policies-Deep-Dive.mdx} | 2 +- .../Networking/Reference/README.mdx | 4 ++ docs/access-types/Networking/_category_.json | 5 ++ .../Postgres/Examples/_category_.json | 5 ++ .../Postgres/Examples}/postgres.mdx | 0 docs/access-types/Postgres/Overview.mdx | 4 ++ docs/access-types/Postgres/Reference.mdx | 4 ++ .../Postgres}/_category_.json | 2 +- docs/access-types/README.mdx | 4 ++ docs/access-types/_category_.json | 5 ++ docs/getting-started/README.mdx | 4 +- docs/getting-started/_category_.json | 3 +- docs/guides/_category_.json | 5 -- docs/overview/README.mdx | 4 ++ docs/overview/_category_.json | 4 ++ docs/{ => overview}/installation/README.mdx | 12 ++-- .../intent-based-access-control.mdx} | 8 +-- docs/{ => overview}/otterize-cloud/README.mdx | 0 .../otterize-cloud/_category_.json | 0 .../_environments_and_namespaces.mdx | 0 .../otterize-cloud/object-model.mdx | 0 docs/{ => overview}/otterize-oss/README.mdx | 0 .../otterize-oss/_category_.json | 0 .../otterize-oss/error-telemetry.mdx | 0 .../otterize-oss/usage-telemetry.mdx | 0 docs/quickstart/_category_.json | 5 -- .../quickstart/access-control/_category_.json | 5 -- .../IBAC-Overview.mdx} | 0 docs/reference/_category_.json | 2 +- .../shadow-vs-active-enforcement/README.mdx | 0 .../troubleshooting/README.mdx | 0 docusaurus.config.js | 70 +++++++++++++------ src/css/custom.css | 11 ++- 58 files changed, 255 insertions(+), 137 deletions(-) rename docs/{quickstart/visualization => access-types/AWS IAM/Examples}/_category_.json (60%) rename docs/{quickstart/access-control => access-types/AWS IAM/Examples}/aws-iam-eks.mdx (98%) create mode 100644 docs/access-types/AWS IAM/Overview.mdx create mode 100644 docs/access-types/AWS IAM/Reference.mdx create mode 100644 docs/access-types/AWS IAM/_category_.json create mode 100644 docs/access-types/Istio/Examples/_category_.json rename docs/{quickstart/access-control => access-types/Istio/Examples}/k8s-istio-authorization-policies.mdx (95%) rename docs/{quickstart/visualization => access-types/Istio/Examples}/k8s-istio-watcher.mdx (92%) create mode 100644 docs/access-types/Istio/Overview.mdx create mode 100644 docs/access-types/Istio/Reference.mdx create mode 100644 docs/access-types/Istio/_category_.json create mode 100644 docs/access-types/Kafka/Examples/_category_.json rename docs/{quickstart/visualization => access-types/Kafka/Examples}/k8s-kafka-mapping.mdx (95%) rename docs/{quickstart/access-control => access-types/Kafka/Examples}/k8s-kafka-mtls-cert-manager.mdx (93%) rename docs/{quickstart/access-control => access-types/Kafka/Examples}/k8s-kafka-mtls.mdx (93%) create mode 100644 docs/access-types/Kafka/Overview.mdx create mode 100644 docs/access-types/Kafka/Reference.mdx create mode 100644 docs/access-types/Kafka/_category_.json create mode 100644 docs/access-types/Networking/Examples/_category_.json rename docs/{quickstart/access-control => access-types/Networking/Examples}/aws-eks-cni-mini.mdx (94%) rename docs/{quickstart/visualization => access-types/Networking/Examples}/k8s-network-mapper.mdx (93%) rename docs/{quickstart/access-control => access-types/Networking/Examples}/k8s-network-policies.mdx (92%) rename docs/{guides => access-types/Networking/Examples}/protect-1-service-network-policies.mdx (97%) create mode 100644 docs/access-types/Networking/Overview.mdx rename docs/{reference/access-controls/network-policies/README.mdx => access-types/Networking/Reference/Network-Policies-Deep-Dive.mdx} (99%) create mode 100644 docs/access-types/Networking/Reference/README.mdx create mode 100644 docs/access-types/Networking/_category_.json create mode 100644 docs/access-types/Postgres/Examples/_category_.json rename docs/{quickstart/access-control => access-types/Postgres/Examples}/postgres.mdx (100%) create mode 100644 docs/access-types/Postgres/Overview.mdx create mode 100644 docs/access-types/Postgres/Reference.mdx rename docs/{concepts => access-types/Postgres}/_category_.json (62%) create mode 100644 docs/access-types/README.mdx create mode 100644 docs/access-types/_category_.json delete mode 100644 docs/guides/_category_.json create mode 100644 docs/overview/README.mdx create mode 100644 docs/overview/_category_.json rename docs/{ => overview}/installation/README.mdx (90%) rename docs/{reference/intents-and-intents-files/README.mdx => overview/intent-based-access-control.mdx} (96%) rename docs/{ => overview}/otterize-cloud/README.mdx (100%) rename docs/{ => overview}/otterize-cloud/_category_.json (100%) rename docs/{ => overview}/otterize-cloud/_environments_and_namespaces.mdx (100%) rename docs/{ => overview}/otterize-cloud/object-model.mdx (100%) rename docs/{ => overview}/otterize-oss/README.mdx (100%) rename docs/{ => overview}/otterize-oss/_category_.json (100%) rename docs/{ => overview}/otterize-oss/error-telemetry.mdx (100%) rename docs/{ => overview}/otterize-oss/usage-telemetry.mdx (100%) delete mode 100644 docs/quickstart/_category_.json delete mode 100644 docs/quickstart/access-control/_category_.json rename docs/{intent-based-access-control/README.mdx => reference/IBAC-Overview.mdx} (100%) rename docs/{ => reference}/shadow-vs-active-enforcement/README.mdx (100%) rename docs/{ => reference}/troubleshooting/README.mdx (100%) diff --git a/.gitignore b/.gitignore index 26328349a..fc9af2b85 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,4 @@ yarn-error.log* .idea package-lock.json +.vercel diff --git a/docs/quickstart/visualization/_category_.json b/docs/access-types/AWS IAM/Examples/_category_.json similarity index 60% rename from docs/quickstart/visualization/_category_.json rename to docs/access-types/AWS IAM/Examples/_category_.json index 4564c5be8..bbac434cd 100644 --- a/docs/quickstart/visualization/_category_.json +++ b/docs/access-types/AWS IAM/Examples/_category_.json @@ -1,5 +1,5 @@ { - "label": "Visualization", + "label": "Examples", "position": 2, "collapsed": false } diff --git a/docs/quickstart/access-control/aws-iam-eks.mdx b/docs/access-types/AWS IAM/Examples/aws-iam-eks.mdx similarity index 98% rename from docs/quickstart/access-control/aws-iam-eks.mdx rename to docs/access-types/AWS IAM/Examples/aws-iam-eks.mdx index 7bb03fa5a..94b8fd774 100644 --- a/docs/quickstart/access-control/aws-iam-eks.mdx +++ b/docs/access-types/AWS IAM/Examples/aws-iam-eks.mdx @@ -187,7 +187,7 @@ kubectl patch deployment -n otterize-tutorial-iam server --type='json' -p="[{\"o Expand to see the deployment YAML ```yaml -{@include: ../../../static/code-examples/aws-iam-eks/client-and-server.yaml} +{@include: ../../../../static/code-examples/aws-iam-eks/client-and-server.yaml} ``` @@ -287,7 +287,7 @@ By annotating the pod, we've created an IAM role. We now need to specify what we We will specify the following ClientIntents, granting the PutObject permission to the `otterize-tutorial-bucket` S3 bucket. ```yaml -{@include: ../../../static/code-examples/aws-iam-eks/clientintents.yaml} +{@include: ../../../../static/code-examples/aws-iam-eks/clientintents.yaml} ``` To apply these intents, run the following command: diff --git a/docs/access-types/AWS IAM/Overview.mdx b/docs/access-types/AWS IAM/Overview.mdx new file mode 100644 index 000000000..cf6694baa --- /dev/null +++ b/docs/access-types/AWS IAM/Overview.mdx @@ -0,0 +1,8 @@ +--- +sidebar_position: 1 +title: Overview +hide_table_of_contents: false +--- + + + diff --git a/docs/access-types/AWS IAM/Reference.mdx b/docs/access-types/AWS IAM/Reference.mdx new file mode 100644 index 000000000..626ea0452 --- /dev/null +++ b/docs/access-types/AWS IAM/Reference.mdx @@ -0,0 +1,4 @@ +--- +sidebar_position: 3 +title: Reference +--- \ No newline at end of file diff --git a/docs/access-types/AWS IAM/_category_.json b/docs/access-types/AWS IAM/_category_.json new file mode 100644 index 000000000..aca2a23bb --- /dev/null +++ b/docs/access-types/AWS IAM/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "AWS IAM", + "position": 2, + "collapsed": true +} diff --git a/docs/access-types/Istio/Examples/_category_.json b/docs/access-types/Istio/Examples/_category_.json new file mode 100644 index 000000000..0e3676464 --- /dev/null +++ b/docs/access-types/Istio/Examples/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Examples", + "position": 2, + "collapsed": true +} diff --git a/docs/quickstart/access-control/k8s-istio-authorization-policies.mdx b/docs/access-types/Istio/Examples/k8s-istio-authorization-policies.mdx similarity index 95% rename from docs/quickstart/access-control/k8s-istio-authorization-policies.mdx rename to docs/access-types/Istio/Examples/k8s-istio-authorization-policies.mdx index 41582428c..4f26a65ef 100644 --- a/docs/quickstart/access-control/k8s-istio-authorization-policies.mdx +++ b/docs/access-types/Istio/Examples/k8s-istio-authorization-policies.mdx @@ -29,7 +29,7 @@ In this tutorial, we will: Before you start, you'll need a Kubernetes cluster. Having a cluster with a [CNI](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/) that supports [NetworkPolicies](https://kubernetes.io/docs/concepts/services-networking/network-policies/) isn't required for this tutorial, but is recommended so that your cluster works with other tutorials. -{@include: ../../_common/cluster-setup.md} +{@include: ../../../_common/cluster-setup.md} @@ -42,7 +42,7 @@ So either forego browser visualization and:
Install Otterize in your cluster, without Otterize Cloud -{@include: ../../_common/install-otterize-istio-enabled.md} +{@include: ../../../_common/install-otterize-istio-enabled.md}
@@ -53,11 +53,11 @@ Or choose to include browser visualization and: #### Create an Otterize Cloud account -{@include: ../../_common/create-account.md} +{@include: ../../../_common/create-account.md} #### Install Otterize OSS, connected to Otterize Cloud -{@include: ../../_common/install-otterize-from-cloud-with-istio-enforcement.md} +{@include: ../../../_common/install-otterize-from-cloud-with-istio-enforcement.md} @@ -66,7 +66,7 @@ Or choose to include browser visualization and:
Install Istio in the cluster via Helm -{@include: ../../_common/install-istio.md} +{@include: ../../../_common/install-istio.md}
@@ -79,7 +79,7 @@ kubectl apply -f ${ABSOLUTE_URL}/code-examples/network-mapper/istio-telemetry-en ``` ```yaml -{@include: ../../../static/code-examples/network-mapper/istio-telemetry-enablement.yaml} +{@include: ../../../../static/code-examples/network-mapper/istio-telemetry-enablement.yaml} ```
@@ -116,7 +116,7 @@ You can click on the services or the lines connecting them to see which ClientIn 1. Here is the `intents.yaml` declaration of the client, which we will apply below: ```yaml -{@include: ../../../static/code-examples/istio-authorization-policies/intents.yaml} +{@include: ../../../../static/code-examples/istio-authorization-policies/intents.yaml} ``` To apply it, use: diff --git a/docs/quickstart/visualization/k8s-istio-watcher.mdx b/docs/access-types/Istio/Examples/k8s-istio-watcher.mdx similarity index 92% rename from docs/quickstart/visualization/k8s-istio-watcher.mdx rename to docs/access-types/Istio/Examples/k8s-istio-watcher.mdx index 93f87c243..422daa522 100644 --- a/docs/quickstart/visualization/k8s-istio-watcher.mdx +++ b/docs/access-types/Istio/Examples/k8s-istio-watcher.mdx @@ -23,7 +23,7 @@ In this tutorial, we will: Before you start, you'll need a Kubernetes cluster. Having a cluster with a [CNI](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/) that supports [NetworkPolicies](https://kubernetes.io/docs/concepts/services-networking/network-policies/) isn't required for this tutorial, but is recommended so that your cluster works with other tutorials. -{@include: ../../_common/cluster-setup.md} +{@include: ../../../_common/cluster-setup.md} @@ -36,7 +36,7 @@ So either forego browser visualization and:
Install the Otterize network mapper in your cluster with the Istio watcher component enabled, and without Otterize Cloud -{@include: ../../_common/install-otterize-istio-watcher.md} +{@include: ../../../_common/install-otterize-istio-watcher.md}
@@ -47,11 +47,11 @@ Or choose to include browser visualization and: #### Create an Otterize Cloud account -{@include: ../../_common/create-account.md} +{@include: ../../../_common/create-account.md} #### Install Otterize OSS, connected to Otterize Cloud -{@include: ../../_common/install-otterize-from-cloud-with-enforcement-with-istiowatcher.md} +{@include: ../../../_common/install-otterize-from-cloud-with-enforcement-with-istiowatcher.md} @@ -60,7 +60,7 @@ Finally, you'll need to install the Otterize CLI (if you haven't already) to int
Install the Otterize CLI -{@include: ../../_common/install-otterize-cli.md} +{@include: ../../../_common/install-otterize-cli.md}
@@ -69,7 +69,7 @@ Finally, you'll need to install the Otterize CLI (if you haven't already) to int
Install Istio in the cluster via Helm -{@include: ../../_common/install-istio.md} +{@include: ../../../_common/install-istio.md}
@@ -91,7 +91,7 @@ kubectl apply -f ${ABSOLUTE_URL}/code-examples/network-mapper/istio-telemetry-en ``` ```yaml -{@include: ../../../static/code-examples/network-mapper/istio-telemetry-enablement.yaml} +{@include: ../../../../static/code-examples/network-mapper/istio-telemetry-enablement.yaml} ```
@@ -122,7 +122,7 @@ For a complete list of the CLI capabilities read the [CLI command reference](/re ### Extract and see the network map -{@include: ../../getting-started/_show_mapped_istio_traffic_cli.mdx} +{@include: ../../../getting-started/_show_mapped_istio_traffic_cli.mdx} ### Show the access graph in Otterize Cloud diff --git a/docs/access-types/Istio/Overview.mdx b/docs/access-types/Istio/Overview.mdx new file mode 100644 index 000000000..7e4dcc2d8 --- /dev/null +++ b/docs/access-types/Istio/Overview.mdx @@ -0,0 +1,4 @@ +--- +sidebar_position: 1 +title: Overview +--- \ No newline at end of file diff --git a/docs/access-types/Istio/Reference.mdx b/docs/access-types/Istio/Reference.mdx new file mode 100644 index 000000000..626ea0452 --- /dev/null +++ b/docs/access-types/Istio/Reference.mdx @@ -0,0 +1,4 @@ +--- +sidebar_position: 3 +title: Reference +--- \ No newline at end of file diff --git a/docs/access-types/Istio/_category_.json b/docs/access-types/Istio/_category_.json new file mode 100644 index 000000000..1654bce0e --- /dev/null +++ b/docs/access-types/Istio/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Istio", + "position": 4, + "collapsed": true +} diff --git a/docs/access-types/Kafka/Examples/_category_.json b/docs/access-types/Kafka/Examples/_category_.json new file mode 100644 index 000000000..bbac434cd --- /dev/null +++ b/docs/access-types/Kafka/Examples/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Examples", + "position": 2, + "collapsed": false +} diff --git a/docs/quickstart/visualization/k8s-kafka-mapping.mdx b/docs/access-types/Kafka/Examples/k8s-kafka-mapping.mdx similarity index 95% rename from docs/quickstart/visualization/k8s-kafka-mapping.mdx rename to docs/access-types/Kafka/Examples/k8s-kafka-mapping.mdx index c4bdc8a9d..56ad8433f 100644 --- a/docs/quickstart/visualization/k8s-kafka-mapping.mdx +++ b/docs/access-types/Kafka/Examples/k8s-kafka-mapping.mdx @@ -24,7 +24,7 @@ We will **not** be doing any access control in this demo, just purely mapping cl Before you start, you'll need a Kubernetes cluster. Having a cluster with a [CNI](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/) that supports [NetworkPolicies](https://kubernetes.io/docs/concepts/services-networking/network-policies/) isn't required for this tutorial, but is recommended so that your cluster works with other tutorials. -{@include: ../../_common/cluster-setup.md} +{@include: ../../../_common/cluster-setup.md} @@ -53,11 +53,11 @@ Or choose to include browser visualization and: #### Create an Otterize Cloud account -{@include: ../../_common/create-account.md} +{@include: ../../../_common/create-account.md} #### Install Otterize OSS, connected to Otterize Cloud -{@include: ../../_common/install-otterize-from-cloud-with-shadow-mode-and-kafka-watcher.md} +{@include: ../../../_common/install-otterize-from-cloud-with-shadow-mode-and-kafka-watcher.md} @@ -66,7 +66,7 @@ Finally, you'll need to install the Otterize CLI (if you haven't already) to int
Install the Otterize CLI -{@include: ../../_common/install-otterize-cli.md} +{@include: ../../../_common/install-otterize-cli.md}
@@ -82,7 +82,7 @@ In the chart we will configure Kafka to: Expand to see the Helm values.yaml used with the Bitnami chart ```yaml -{@include: ../../../static/code-examples/kafka-mapping/helm/values.yaml} +{@include: ../../../../static/code-examples/kafka-mapping/helm/values.yaml} ``` diff --git a/docs/quickstart/access-control/k8s-kafka-mtls-cert-manager.mdx b/docs/access-types/Kafka/Examples/k8s-kafka-mtls-cert-manager.mdx similarity index 93% rename from docs/quickstart/access-control/k8s-kafka-mtls-cert-manager.mdx rename to docs/access-types/Kafka/Examples/k8s-kafka-mtls-cert-manager.mdx index 4b8813a89..ec754ba6c 100644 --- a/docs/quickstart/access-control/k8s-kafka-mtls-cert-manager.mdx +++ b/docs/access-types/Kafka/Examples/k8s-kafka-mtls-cert-manager.mdx @@ -1,6 +1,6 @@ --- sidebar_position: 5 -title: Kafka access automation using cert-manager mTLS +title: Kafka Access Automation Using Cert-Manager mTLS image: /img/quick-tutorials/k8s-kafka-mtls-cert-mgr/social.png --- @@ -29,7 +29,7 @@ In this tutorial, we will: Before you start, you'll need a Kubernetes cluster. -{@include: ../../_common/cluster-setup.md} +{@include: ../../../_common/cluster-setup.md} @@ -50,7 +50,7 @@ This tutorial uses the built-in and easy-to-setup `CA` Issuer type so that the t ::: ```yaml -{@include: ../../../static/code-examples/kafka-mtls-cert-manager/clusterissuer.yaml} +{@include: ../../../../static/code-examples/kafka-mtls-cert-manager/clusterissuer.yaml} ``` Deploy this `ClusterIssuer`: @@ -72,7 +72,7 @@ You can now install Otterize in your cluster, and connect to Otterize Cloud. Con -{@include: ../../_common/install-otterize-from-cloud-with-shadow-mode-and-kafka-watcher-and-cert-manager.md} +{@include: ../../../_common/install-otterize-from-cloud-with-shadow-mode-and-kafka-watcher-and-cert-manager.md} #### Configure the access graph in Otterize Cloud to only show Kafka authorization status @@ -80,7 +80,7 @@ You want to make sure that under **Istio Policies** _Use in access graph_ is tur Keep _Use in access graph_ **on** under **Kafka ACLs** so that the access graph only shows the authorization status for Kafka ACLs. -![Make sure access graph is configured correctly](../../../static/img/quick-tutorials/k8s-kafka-mtls-cert-mgr//cloud-settings.png) +![Make sure access graph is configured correctly](/img/quick-tutorials/k8s-kafka-mtls-cert-mgr//cloud-settings.png) @@ -119,7 +119,7 @@ In the chart we will configure Kafka to: Expand to see the Helm values.yaml used with the Bitnami chart ```yaml -{@include: ../../../static/code-examples/kafka-mtls-cert-manager/helm/values.yaml} +{@include: ../../../../static/code-examples/kafka-mtls-cert-manager/helm/values.yaml} ``` @@ -145,7 +145,7 @@ kubectl apply -f ${ABSOLUTE_URL}/code-examples/kafka-mtls-cert-manager/kafkaserv ``` ```yaml -{@include: ../../../static/code-examples/kafka-mtls-cert-manager/kafkaserverconfig.yaml} +{@include: ../../../../static/code-examples/kafka-mtls-cert-manager/kafkaserverconfig.yaml} ``` ## Deploy clients @@ -203,7 +203,7 @@ spec: ```yaml -{@include: ../../../static/code-examples/kafka-mtls-cert-manager/client-deployment.yaml} +{@include: ../../../../static/code-examples/kafka-mtls-cert-manager/client-deployment.yaml} ``` @@ -211,7 +211,7 @@ spec: ```yaml -{@include: ../../../static/code-examples/kafka-mtls-cert-manager/client-other-deployment.yaml} +{@include: ../../../../static/code-examples/kafka-mtls-cert-manager/client-other-deployment.yaml} ``` @@ -348,7 +348,7 @@ You can click on the services or the lines connecting them to see which ClientIn 1. The client declares its intent to call the `kafka.kafka` server with this `intents.yaml` file: ```yaml -{@include: ../../../static/code-examples/kafka-mtls-cert-manager/client-intents.yaml} +{@include: ../../../../static/code-examples/kafka-mtls-cert-manager/client-intents.yaml} ``` We can apply intents for the `client` by applying the `client-intents.yaml` file: @@ -361,11 +361,11 @@ If you go back to your access graph, you'll now see that the `client` has a soli If you click on that solid line, you will see that the declared intents match the discovered intents, so access is assured. -![client intents applied](../../../static/img/quick-tutorials/k8s-kafka-mtls-cert-mgr/client-intents.png) +![client intents applied](/img/quick-tutorials/k8s-kafka-mtls-cert-mgr/client-intents.png) 2. At this point, since the Kafka server is not actually protected, the `client-other` can still access the topics. The line is orange, indicating that it has no declared intents. -![Declared Intent](../../../static/img/quick-tutorials/k8s-kafka-mtls-cert-mgr/declared-intent.png) +![Declared Intent](/img/quick-tutorials/k8s-kafka-mtls-cert-mgr/declared-intent.png) We can see what happened: @@ -382,7 +382,7 @@ Let's see that in action. Our clients that have not declared intents will be blo We need to turn protection on in for this Kafka broker by declaring it as a protected service: ```yaml -{@include: ../../../static/code-examples/kafka-mtls-cert-manager/protectedservice.yaml} +{@include: ../../../../static/code-examples/kafka-mtls-cert-manager/protectedservice.yaml} ``` Apply this `ProtectedService` resource: @@ -406,7 +406,7 @@ error="kafka server: The client is not authorized to access this topic And if you look back at your access graph, you'll see that the Kafka broker is now protected, and that the `client-other` and `client-authenticated` are blocked. -![Clients blocked](../../../static/img/quick-tutorials/k8s-kafka-mtls-cert-mgr//clients-blocked.png) +![Clients blocked](/img/quick-tutorials/k8s-kafka-mtls-cert-mgr//clients-blocked.png) ## What did we accomplish? diff --git a/docs/quickstart/access-control/k8s-kafka-mtls.mdx b/docs/access-types/Kafka/Examples/k8s-kafka-mtls.mdx similarity index 93% rename from docs/quickstart/access-control/k8s-kafka-mtls.mdx rename to docs/access-types/Kafka/Examples/k8s-kafka-mtls.mdx index 75c58068c..f06e2d51d 100644 --- a/docs/quickstart/access-control/k8s-kafka-mtls.mdx +++ b/docs/access-types/Kafka/Examples/k8s-kafka-mtls.mdx @@ -28,7 +28,7 @@ In this tutorial, we will: Before you start, you'll need a Kubernetes cluster. -{@include: ../../_common/cluster-setup.md} +{@include: ../../../_common/cluster-setup.md} @@ -40,7 +40,7 @@ You can now install Otterize in your cluster, and connect to Otterize Cloud. Con 2. Generate certificates using the Otterize Cloud hosted service. If you prefer to generate certificates in-cluster, you can [follow the tutorial for cert-manager](/quickstart/access-control/k8s-kafka-mtls-cert-manager). #### Install Otterize OSS, connected to Otterize Cloud -{@include: ../../_common/install-otterize-from-cloud-with-shadow-mode-and-kafka-watcher.md} +{@include: ../../../_common/install-otterize-from-cloud-with-shadow-mode-and-kafka-watcher.md} #### Configure the access graph in Otterize Cloud to only show Kafka authorization status @@ -48,7 +48,7 @@ You want to make sure that under **Istio Policies** _Use in access graph_ is tur Keep _Use in access graph_ **on** under **Kafka ACLs** so that the access graph only shows the authorization status for Kafka ACLs. -![Make sure access graph is configured correctly](../../../static/img/quick-tutorials/k8s-kafka-mtls//cloud-settings.png) +![Make sure access graph is configured correctly](/img/quick-tutorials/k8s-kafka-mtls//cloud-settings.png) ## Install Kafka @@ -65,7 +65,7 @@ In the chart we will configure Kafka to: Expand to see the Helm values.yaml used with the Bitnami chart ```yaml -{@include: ../../../static/code-examples/kafka-mtls/helm/values.yaml} +{@include: ../../../../static/code-examples/kafka-mtls/helm/values.yaml} ``` @@ -91,7 +91,7 @@ kubectl apply -f ${ABSOLUTE_URL}/code-examples/kafka-mtls/kafkaserverconfig.yaml ``` ```yaml -{@include: ../../../static/code-examples/kafka-mtls/kafkaserverconfig.yaml} +{@include: ../../../../static/code-examples/kafka-mtls/kafkaserverconfig.yaml} ``` ## Deploy clients @@ -149,7 +149,7 @@ spec: ```yaml -{@include: ../../../static/code-examples/kafka-mtls/client-deployment.yaml} +{@include: ../../../../static/code-examples/kafka-mtls/client-deployment.yaml} ``` @@ -157,7 +157,7 @@ spec: ```yaml -{@include: ../../../static/code-examples/kafka-mtls/client-other-deployment.yaml} +{@include: ../../../../static/code-examples/kafka-mtls/client-other-deployment.yaml} ``` @@ -259,7 +259,7 @@ You can click on the services or the lines connecting them to see which ClientIn 1. The client declares its intent to call the `kafka.kafka` server with this `intents.yaml` file: ```yaml -{@include: ../../../static/code-examples/kafka-mtls/client-intents.yaml} +{@include: ../../../../static/code-examples/kafka-mtls/client-intents.yaml} ``` We can apply intents for the `client` by applying the `client-intents.yaml` file: @@ -272,11 +272,11 @@ If you go back to your access graph, you'll now see that the `client` has a soli If you click on that solid line, you will see that the declared intents match the discovered intents, so access is assured. -![client intents applied](../../../static/img/quick-tutorials/k8s-kafka-mtls/client-intents.png) +![client intents applied](/img/quick-tutorials/k8s-kafka-mtls/client-intents.png) 2. At this point, since the Kafka server is not actually protected, the `client-other` can still access the topics. The line is orange, indicating that it has no declared intents. -![Declared Intent](../../../static/img/quick-tutorials/k8s-kafka-mtls/declared-intent.png) +![Declared Intent](/img/quick-tutorials/k8s-kafka-mtls/declared-intent.png) We can see what happened: @@ -295,7 +295,7 @@ Let's see that in action. Our clients that have not declared intents will be blo We need to turn protection on in for this Kafka broker by declaring it as a protected service: ```yaml -{@include: ../../../static/code-examples/kafka-mtls/protectedservice.yaml} +{@include: ../../../../static/code-examples/kafka-mtls/protectedservice.yaml} ``` Apply this `ProtectedService` resource: @@ -319,7 +319,7 @@ error="kafka server: The client is not authorized to access this topic And if you look back at your access graph, you'll see that the Kafka broker is now protected, and that the `client-other` and `client-authenticated` are blocked. -![Clients blocked](../../../static/img/quick-tutorials/k8s-kafka-mtls/clients-blocked.png) +![Clients blocked](/img/quick-tutorials/k8s-kafka-mtls/clients-blocked.png) ## What did we accomplish? diff --git a/docs/access-types/Kafka/Overview.mdx b/docs/access-types/Kafka/Overview.mdx new file mode 100644 index 000000000..7e4dcc2d8 --- /dev/null +++ b/docs/access-types/Kafka/Overview.mdx @@ -0,0 +1,4 @@ +--- +sidebar_position: 1 +title: Overview +--- \ No newline at end of file diff --git a/docs/access-types/Kafka/Reference.mdx b/docs/access-types/Kafka/Reference.mdx new file mode 100644 index 000000000..626ea0452 --- /dev/null +++ b/docs/access-types/Kafka/Reference.mdx @@ -0,0 +1,4 @@ +--- +sidebar_position: 3 +title: Reference +--- \ No newline at end of file diff --git a/docs/access-types/Kafka/_category_.json b/docs/access-types/Kafka/_category_.json new file mode 100644 index 000000000..4861435c0 --- /dev/null +++ b/docs/access-types/Kafka/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Kafka", + "position": 3, + "collapsed": true +} diff --git a/docs/access-types/Networking/Examples/_category_.json b/docs/access-types/Networking/Examples/_category_.json new file mode 100644 index 000000000..0e3676464 --- /dev/null +++ b/docs/access-types/Networking/Examples/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Examples", + "position": 2, + "collapsed": true +} diff --git a/docs/quickstart/access-control/aws-eks-cni-mini.mdx b/docs/access-types/Networking/Examples/aws-eks-cni-mini.mdx similarity index 94% rename from docs/quickstart/access-control/aws-eks-cni-mini.mdx rename to docs/access-types/Networking/Examples/aws-eks-cni-mini.mdx index fbf8809dc..f49bd7e7b 100644 --- a/docs/quickstart/access-control/aws-eks-cni-mini.mdx +++ b/docs/access-types/Networking/Examples/aws-eks-cni-mini.mdx @@ -1,6 +1,6 @@ --- -sidebar_position: 2 -title: Network policies on AWS EKS with the VPC CNI +sidebar_position: 4 +title: AWS EKS Network policies With The VPC CNI image: /img/quick-tutorials/aws-eks-mini/social.png --- @@ -86,7 +86,7 @@ So either forego browser visualization and:
Install Otterize in your cluster, without Otterize Cloud -{@include: ../../_common/install-otterize.md} +{@include: ../../../_common/install-otterize.md}
@@ -97,11 +97,11 @@ Or choose to include browser visualization and: #### Create an Otterize Cloud account -{@include: ../../_common/create-account.md} +{@include: ../../../_common/create-account.md} #### Install Otterize OSS, connected to Otterize Cloud -{@include: ../../_common/install-otterize-from-cloud.md} +{@include: ../../../_common/install-otterize-from-cloud.md} @@ -110,7 +110,7 @@ Finally, you'll need to install the Otterize CLI (if you haven't already) to int
Install the Otterize CLI -{@include: ../../_common/install-otterize-cli.md} +{@include: ../../../_common/install-otterize-cli.md}
@@ -173,7 +173,7 @@ At which point you should see that the `server` service is ready to be protected And you can then protect the `server` service by applying the following `yaml` file: ```yaml -{@include: ../../../static/code-examples/aws-eks-mini/protect-server.yaml} +{@include: ../../../../static/code-examples/aws-eks-mini/protect-server.yaml} ``` Protect the server by applying the resource: diff --git a/docs/quickstart/visualization/k8s-network-mapper.mdx b/docs/access-types/Networking/Examples/k8s-network-mapper.mdx similarity index 93% rename from docs/quickstart/visualization/k8s-network-mapper.mdx rename to docs/access-types/Networking/Examples/k8s-network-mapper.mdx index b703b3cf7..0db7cfd8b 100644 --- a/docs/quickstart/visualization/k8s-network-mapper.mdx +++ b/docs/access-types/Networking/Examples/k8s-network-mapper.mdx @@ -1,6 +1,6 @@ --- sidebar_position: 1 -title: Network mapping a Kubernetes cluster +title: Visualizing a Kubernetes Network image: /img/visualization/k8s-network-mapper/social.png --- @@ -22,7 +22,7 @@ In this tutorial, we will: Before you start, you'll need a Kubernetes cluster. Having a cluster with a [CNI](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/) that supports [NetworkPolicies](https://kubernetes.io/docs/concepts/services-networking/network-policies/) isn't required for this tutorial, but is recommended so that your cluster works with other tutorials. -{@include: ../../_common/cluster-setup.md} +{@include: ../../../_common/cluster-setup.md} @@ -36,7 +36,7 @@ So either forego browser visualization and:
Install Otterize in your cluster, without Otterize Cloud -{@include: ../../_common/install-otterize.md} +{@include: ../../../_common/install-otterize.md}
@@ -47,11 +47,11 @@ Or choose to include browser visualization and: #### Create an Otterize Cloud account -{@include: ../../_common/create-account.md} +{@include: ../../../_common/create-account.md} #### Install Otterize OSS, connected to Otterize Cloud -{@include: ../../_common/install-otterize-from-cloud-with-enforcement.md} +{@include: ../../../_common/install-otterize-from-cloud-with-enforcement.md} @@ -60,7 +60,7 @@ Finally, you'll need to install the Otterize CLI (if you haven't already) to int
Install the Otterize CLI -{@include: ../../_common/install-otterize-cli.md} +{@include: ../../../_common/install-otterize-cli.md}
@@ -92,7 +92,7 @@ For a complete list of the CLI capabilities read the [CLI command reference](/re ### Extract and see the network map -{@include: ../../getting-started/_show_mapped_traffic_cli.mdx} +{@include: ../../../getting-started/_show_mapped_traffic_cli.mdx} ### Show the access graph in Otterize Cloud diff --git a/docs/quickstart/access-control/k8s-network-policies.mdx b/docs/access-types/Networking/Examples/k8s-network-policies.mdx similarity index 92% rename from docs/quickstart/access-control/k8s-network-policies.mdx rename to docs/access-types/Networking/Examples/k8s-network-policies.mdx index 2117d5210..781e43f1c 100644 --- a/docs/quickstart/access-control/k8s-network-policies.mdx +++ b/docs/access-types/Networking/Examples/k8s-network-policies.mdx @@ -1,6 +1,6 @@ --- sidebar_position: 1 -title: NetworkPolicy automation +title: Network Policy Automation image: /img/quick-tutorials/network-policies/social.png --- @@ -28,7 +28,7 @@ In this tutorial, we will: Before you start, you'll need a Kubernetes cluster with a [CNI](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/) that supports [NetworkPolicies](https://kubernetes.io/docs/concepts/services-networking/network-policies/). -{@include: ../../_common/cluster-setup.md} +{@include: ../../../_common/cluster-setup.md} @@ -42,7 +42,7 @@ So either forego browser visualization and:
Install Otterize in your cluster, without Otterize Cloud -{@include: ../../_common/install-otterize.md} +{@include: ../../../_common/install-otterize.md}
@@ -53,11 +53,11 @@ Or choose to include browser visualization and: #### Create an Otterize Cloud account -{@include: ../../_common/create-account.md} +{@include: ../../../_common/create-account.md} #### Install Otterize OSS, connected to Otterize Cloud -{@include: ../../_common/install-otterize-from-cloud-with-enforcement.md} +{@include: ../../../_common/install-otterize-from-cloud-with-enforcement.md} @@ -72,7 +72,7 @@ Our simple example consists of three pods: an HTTP server and two clients that c ```yaml -{@include: ../../../static/code-examples/automate-network-policies/namespace.yaml} +{@include: ../../../../static/code-examples/automate-network-policies/namespace.yaml} ``` @@ -80,23 +80,23 @@ Our simple example consists of three pods: an HTTP server and two clients that c ```yaml -{@include: ../../../static/code-examples/automate-network-policies/server-deployment.yaml} +{@include: ../../../../static/code-examples/automate-network-policies/server-deployment.yaml} --- -{@include: ../../../static/code-examples/automate-network-policies/server-service.yaml} +{@include: ../../../../static/code-examples/automate-network-policies/server-service.yaml} ``` ```yaml -{@include: ../../../static/code-examples/automate-network-policies/client-deployment.yaml} +{@include: ../../../../static/code-examples/automate-network-policies/client-deployment.yaml} ``` ```yaml -{@include: ../../../static/code-examples/automate-network-policies/client-other-deployment.yaml} +{@include: ../../../../static/code-examples/automate-network-policies/client-other-deployment.yaml} ``` @@ -193,7 +193,7 @@ You can click on the services or the lines connecting them to see which ClientIn 1. Here is the `intents.yaml` declaration of the client, which we will apply below: ```yaml -{@include: ../../../static/code-examples/automate-network-policies/intents.yaml} +{@include: ../../../../static/code-examples/automate-network-policies/intents.yaml} ``` ### See it in action diff --git a/docs/guides/protect-1-service-network-policies.mdx b/docs/access-types/Networking/Examples/protect-1-service-network-policies.mdx similarity index 97% rename from docs/guides/protect-1-service-network-policies.mdx rename to docs/access-types/Networking/Examples/protect-1-service-network-policies.mdx index 13b485874..7bcaacd3e 100644 --- a/docs/guides/protect-1-service-network-policies.mdx +++ b/docs/access-types/Networking/Examples/protect-1-service-network-policies.mdx @@ -1,7 +1,6 @@ --- sidebar_position: 1 -title: "Protecting one service with network policies" -sidebar_label: "Protecting one service with network policies" +title: "Protecting A Service With Network Policies" --- import CodeBlock from "@theme/CodeBlock"; @@ -32,7 +31,7 @@ Note: all the capabilities of IBAC are within Otterize OSS, while the access gra Before you start, you'll need a Kubernetes cluster. -{@include: ../_common/cluster-setup.md} +{@include: ../../../_common/cluster-setup.md}
@@ -106,21 +105,21 @@ Go ahead and browse to the URL above to "shop" and get a feel for the demo's beh
Create an Otterize Cloud account -{@include: ../_common/create-account.md} +{@include: ../../../_common/create-account.md}
Install Otterize OSS -{@include: ../_common/install-otterize-from-cloud.md} +{@include: ../../../_common/install-otterize-from-cloud.md}
Install the Otterize CLI -{@include: ../_common/install-otterize-cli.md} +{@include: ../../../_common/install-otterize-cli.md}
@@ -305,7 +304,7 @@ Now that we've verified no intended clients would be blocked, we can safely prot To do so, recall that we configured Otterize OSS to be in the `defaultShadow` mode: by default, it's in shadow mode for all services, not actually managing network policies for them. To protect a service is a simple matter of applying a `ProtectedService` YAML for it, overriding the default for it: ```yaml -{@include: ../../static/code-examples/guides/protect-1-service-network-policies/protect-productcatalogservice.yaml} +{@include: ../../../../static/code-examples/guides/protect-1-service-network-policies/protect-productcatalogservice.yaml} ``` Let's apply this file to our cluster: diff --git a/docs/access-types/Networking/Overview.mdx b/docs/access-types/Networking/Overview.mdx new file mode 100644 index 000000000..7e4dcc2d8 --- /dev/null +++ b/docs/access-types/Networking/Overview.mdx @@ -0,0 +1,4 @@ +--- +sidebar_position: 1 +title: Overview +--- \ No newline at end of file diff --git a/docs/reference/access-controls/network-policies/README.mdx b/docs/access-types/Networking/Reference/Network-Policies-Deep-Dive.mdx similarity index 99% rename from docs/reference/access-controls/network-policies/README.mdx rename to docs/access-types/Networking/Reference/Network-Policies-Deep-Dive.mdx index fb5e5ad53..10517004d 100644 --- a/docs/reference/access-controls/network-policies/README.mdx +++ b/docs/access-types/Networking/Reference/Network-Policies-Deep-Dive.mdx @@ -1,6 +1,6 @@ --- sidebar_position: 1 -title: Network policies deep dive +title: Network Policies Deep Dive --- import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; diff --git a/docs/access-types/Networking/Reference/README.mdx b/docs/access-types/Networking/Reference/README.mdx new file mode 100644 index 000000000..626ea0452 --- /dev/null +++ b/docs/access-types/Networking/Reference/README.mdx @@ -0,0 +1,4 @@ +--- +sidebar_position: 3 +title: Reference +--- \ No newline at end of file diff --git a/docs/access-types/Networking/_category_.json b/docs/access-types/Networking/_category_.json new file mode 100644 index 000000000..cffc70f0d --- /dev/null +++ b/docs/access-types/Networking/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Networking", + "position": 1, + "collapsed": true +} diff --git a/docs/access-types/Postgres/Examples/_category_.json b/docs/access-types/Postgres/Examples/_category_.json new file mode 100644 index 000000000..0e3676464 --- /dev/null +++ b/docs/access-types/Postgres/Examples/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Examples", + "position": 2, + "collapsed": true +} diff --git a/docs/quickstart/access-control/postgres.mdx b/docs/access-types/Postgres/Examples/postgres.mdx similarity index 100% rename from docs/quickstart/access-control/postgres.mdx rename to docs/access-types/Postgres/Examples/postgres.mdx diff --git a/docs/access-types/Postgres/Overview.mdx b/docs/access-types/Postgres/Overview.mdx new file mode 100644 index 000000000..7e4dcc2d8 --- /dev/null +++ b/docs/access-types/Postgres/Overview.mdx @@ -0,0 +1,4 @@ +--- +sidebar_position: 1 +title: Overview +--- \ No newline at end of file diff --git a/docs/access-types/Postgres/Reference.mdx b/docs/access-types/Postgres/Reference.mdx new file mode 100644 index 000000000..626ea0452 --- /dev/null +++ b/docs/access-types/Postgres/Reference.mdx @@ -0,0 +1,4 @@ +--- +sidebar_position: 3 +title: Reference +--- \ No newline at end of file diff --git a/docs/concepts/_category_.json b/docs/access-types/Postgres/_category_.json similarity index 62% rename from docs/concepts/_category_.json rename to docs/access-types/Postgres/_category_.json index b8adac8f0..bc6190e1f 100644 --- a/docs/concepts/_category_.json +++ b/docs/access-types/Postgres/_category_.json @@ -1,5 +1,5 @@ { - "label": "Concepts", + "label": "PostgreSQL", "position": 5, "collapsed": true } diff --git a/docs/access-types/README.mdx b/docs/access-types/README.mdx new file mode 100644 index 000000000..ce1f892fc --- /dev/null +++ b/docs/access-types/README.mdx @@ -0,0 +1,4 @@ +--- +sidebar_position: 1 +title: Access Types +--- \ No newline at end of file diff --git a/docs/access-types/_category_.json b/docs/access-types/_category_.json new file mode 100644 index 000000000..867232c84 --- /dev/null +++ b/docs/access-types/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Access Types", + "position": 3, + "collapsed": false +} diff --git a/docs/getting-started/README.mdx b/docs/getting-started/README.mdx index 2da7691cd..b8d8d040b 100644 --- a/docs/getting-started/README.mdx +++ b/docs/getting-started/README.mdx @@ -1,7 +1,7 @@ --- sidebar_position: 1 slug: / -title: Getting started +title: Getting Started --- export const LinkButton = (props) => ( @@ -24,7 +24,7 @@ Otterize is a platform for implementing intent-based access control ([IBAC](/int The platform is composed of **Otterize OSS**, which is tailored for a single Kubernetes cluster, and **Otterize Cloud**, which adds visibility and operationalization across Kubernetes clusters and non-Kubernetes infrastructures. Otterize enables platform engineers to easily implement, expand, and unify secured access for their Kubernetes workloads. -## Let's go! +## Let's go! 🚀 Dive right in with simple demos to manage access control: * [Create and manage network policies](/quickstart/access-control/k8s-network-policies). * [Network policies on AWS EKS with the VPC CNI](/quickstart/access-control/aws-eks-cni-mini). diff --git a/docs/getting-started/_category_.json b/docs/getting-started/_category_.json index 38eabb7ef..594203d97 100644 --- a/docs/getting-started/_category_.json +++ b/docs/getting-started/_category_.json @@ -1,3 +1,4 @@ { - "collapsed": false + "collapsed": true, + "label": "Getting Started" } \ No newline at end of file diff --git a/docs/guides/_category_.json b/docs/guides/_category_.json deleted file mode 100644 index 7cb5603b2..000000000 --- a/docs/guides/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "Guides", - "position": 4, - "collapsed": false -} \ No newline at end of file diff --git a/docs/overview/README.mdx b/docs/overview/README.mdx new file mode 100644 index 000000000..7e4dcc2d8 --- /dev/null +++ b/docs/overview/README.mdx @@ -0,0 +1,4 @@ +--- +sidebar_position: 1 +title: Overview +--- \ No newline at end of file diff --git a/docs/overview/_category_.json b/docs/overview/_category_.json new file mode 100644 index 000000000..ef3474b29 --- /dev/null +++ b/docs/overview/_category_.json @@ -0,0 +1,4 @@ +{ + "collapsed": true, + "label": "Overview" +} \ No newline at end of file diff --git a/docs/installation/README.mdx b/docs/overview/installation/README.mdx similarity index 90% rename from docs/installation/README.mdx rename to docs/overview/installation/README.mdx index 102d628a5..503ea7a3b 100644 --- a/docs/installation/README.mdx +++ b/docs/overview/installation/README.mdx @@ -1,12 +1,12 @@ --- -sidebar_position: 5 +sidebar_position: 1 title: Installation --- import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; ## Install Otterize without Otterize Cloud (OSS only) -{@include: ../_common/install-otterize.md} +{@include: ../../_common/install-otterize.md}
@@ -17,11 +17,11 @@ import TabItem from '@theme/TabItem'; Before you start, you need to have a Kubernetes cluster with a [CNI](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/) that supports [NetworkPolicies](https://kubernetes.io/docs/concepts/services-networking/network-policies/). -{@include: ../_common/cluster-setup.md} +{@include: ../../_common/cluster-setup.md}
### Upgrade Otterize -{@include: ../_common/upgrade-otterize.md} +{@include: ../../_common/upgrade-otterize.md} ## Connect Otterize OSS to Otterize Cloud, or install Otterize with Otterize Cloud To connect Otterize OSS to Otterize Cloud you will need to [login](https://app.otterize.com), create a cluster, and follow the instructions. @@ -29,7 +29,7 @@ To connect Otterize OSS to Otterize Cloud you will need to [login](https://app.o In a nutshell, you need to `helm upgrade` the same Helm chart, but provide Otterize Cloud credentials. Upon creating a cluster, a guide will appear that walks you through doing this with the new credentials jut created. ## Install just the Otterize network mapper -{@include: ../_common/install-otterize-network-mapper.md} +{@include: ../../_common/install-otterize-network-mapper.md} ## Install the Otterize CLI @@ -37,7 +37,7 @@ The [Otterize CLI](/reference/cli) is a command-line utility used to control and To install the CLI: -{@include: ../_common/install-otterize-cli.md} +{@include: ../../_common/install-otterize-cli.md} ## Uninstall Otterize diff --git a/docs/reference/intents-and-intents-files/README.mdx b/docs/overview/intent-based-access-control.mdx similarity index 96% rename from docs/reference/intents-and-intents-files/README.mdx rename to docs/overview/intent-based-access-control.mdx index 9f7e76924..ade9e2477 100644 --- a/docs/reference/intents-and-intents-files/README.mdx +++ b/docs/overview/intent-based-access-control.mdx @@ -1,6 +1,6 @@ --- -sidebar_position: 4 -title: Intents and intents files +sidebar_position: 2 +title: Intent-Based Access Control (IBAC) --- Intent-based access control is, not surprisingly, centered around declaring intents — specifically, declaring **client** intents @@ -39,7 +39,7 @@ As an example, let's look at the core of a client intents file for a service cal It declares that it will call the `emailservice`, the `orderservice`, and the `ecomm-events` Kafka service. It also provides more granular information for some of the calls: ```yaml -{@include: ../../../static/resources/example-intents.yaml} +{@include: ../../static/resources/example-intents.yaml} ``` You can actually create and use such "plain" or "vanilla" intents files without any other metadata. Currently, Otterize only supports processing client intents via the Otterize OSS intents operator for Kubernetes, so you'll need to run the plain intents files through the Otterize CLI (`otterize intents convert`) to convert them into Kubernetes custom resource YAML files. @@ -55,7 +55,7 @@ Here is the same client intents file, now formatted as a Kubernetes custom resou so it can be applied directly via `kubectl apply`: ```yaml -{@include: ../../../static/resources/example-intents-resource-highlighted.yaml} +{@include: ../../static/resources/example-intents-resource-highlighted.yaml} ``` ## Intents file specification diff --git a/docs/otterize-cloud/README.mdx b/docs/overview/otterize-cloud/README.mdx similarity index 100% rename from docs/otterize-cloud/README.mdx rename to docs/overview/otterize-cloud/README.mdx diff --git a/docs/otterize-cloud/_category_.json b/docs/overview/otterize-cloud/_category_.json similarity index 100% rename from docs/otterize-cloud/_category_.json rename to docs/overview/otterize-cloud/_category_.json diff --git a/docs/otterize-cloud/_environments_and_namespaces.mdx b/docs/overview/otterize-cloud/_environments_and_namespaces.mdx similarity index 100% rename from docs/otterize-cloud/_environments_and_namespaces.mdx rename to docs/overview/otterize-cloud/_environments_and_namespaces.mdx diff --git a/docs/otterize-cloud/object-model.mdx b/docs/overview/otterize-cloud/object-model.mdx similarity index 100% rename from docs/otterize-cloud/object-model.mdx rename to docs/overview/otterize-cloud/object-model.mdx diff --git a/docs/otterize-oss/README.mdx b/docs/overview/otterize-oss/README.mdx similarity index 100% rename from docs/otterize-oss/README.mdx rename to docs/overview/otterize-oss/README.mdx diff --git a/docs/otterize-oss/_category_.json b/docs/overview/otterize-oss/_category_.json similarity index 100% rename from docs/otterize-oss/_category_.json rename to docs/overview/otterize-oss/_category_.json diff --git a/docs/otterize-oss/error-telemetry.mdx b/docs/overview/otterize-oss/error-telemetry.mdx similarity index 100% rename from docs/otterize-oss/error-telemetry.mdx rename to docs/overview/otterize-oss/error-telemetry.mdx diff --git a/docs/otterize-oss/usage-telemetry.mdx b/docs/overview/otterize-oss/usage-telemetry.mdx similarity index 100% rename from docs/otterize-oss/usage-telemetry.mdx rename to docs/overview/otterize-oss/usage-telemetry.mdx diff --git a/docs/quickstart/_category_.json b/docs/quickstart/_category_.json deleted file mode 100644 index 69cd49661..000000000 --- a/docs/quickstart/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "Quickstart", - "position": 1, - "collapsed": false -} diff --git a/docs/quickstart/access-control/_category_.json b/docs/quickstart/access-control/_category_.json deleted file mode 100644 index 58976741d..000000000 --- a/docs/quickstart/access-control/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "Access control", - "position": 1, - "collapsed": false -} diff --git a/docs/intent-based-access-control/README.mdx b/docs/reference/IBAC-Overview.mdx similarity index 100% rename from docs/intent-based-access-control/README.mdx rename to docs/reference/IBAC-Overview.mdx diff --git a/docs/reference/_category_.json b/docs/reference/_category_.json index 8c87aa627..323775976 100644 --- a/docs/reference/_category_.json +++ b/docs/reference/_category_.json @@ -1,5 +1,5 @@ { "label": "Reference", "position": 11, - "collapsed": false + "collapsed": true } diff --git a/docs/shadow-vs-active-enforcement/README.mdx b/docs/reference/shadow-vs-active-enforcement/README.mdx similarity index 100% rename from docs/shadow-vs-active-enforcement/README.mdx rename to docs/reference/shadow-vs-active-enforcement/README.mdx diff --git a/docs/troubleshooting/README.mdx b/docs/reference/troubleshooting/README.mdx similarity index 100% rename from docs/troubleshooting/README.mdx rename to docs/reference/troubleshooting/README.mdx diff --git a/docusaurus.config.js b/docusaurus.config.js index 1fdac1096..cc13b705f 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -137,6 +137,28 @@ const config = { { redirects: [ { + from: ['/getting-started/oss-installation', '/installation'], + to: '/overview/installation', + }, + { + from: ['/intent-based-access-control', '/reference/intents-and-intents-files'], + to: '/overview/intent-based-access-control' + }, + { + from: ['/otterize-oss'], + to: '/overview/otterize-oss' + }, + { + from: ['/reference/access-controls/network-policies'], + to: '/access-types/Networking/Reference/Network-Policies-Deep-Dive' + }, + { + from: ['/shadow-vs-active-enforcement'], + to: '/reference/shadow-vs-active-enforcement' + }, + { + from: ['/otterize-cloud'], + to: '/overview/otterize-cloud' from: '/quick-tutorials', to: '/', }, @@ -149,48 +171,52 @@ const config = { to: '/installation', }, { - from: '/quick-tutorials/k8s-network-policies', - to: '/quickstart/access-control/k8s-network-policies', + from: ['/otterize-oss/usage-telemetry'], + to: '/overview/otterize-oss/usage-telemetry' }, { - from: '/quick-tutorials/k8s-istio-authorization-policies', - to: '/quickstart/access-control/k8s-istio-authorization-policies', + from: ['/otterize-oss/error-telemetry'], + to: '/overview/otterize-oss/error-telemetry' }, { - from: '/quick-tutorials/k8s-kafka-mtls', - to: '/quickstart/access-control/k8s-kafka-mtls', + from: ['/otterize-cloud/object-model'], + to: '/overview/otterize-cloud/object-model' }, { - from: '/quick-tutorials/aws-eks-cni-mini', - to: '/quickstart/access-control/aws-eks-cni-mini', + from: ['/guides/protect-1-service-network-policies'], + to: '/access-types/Networking/Examples/protect-1-service-network-policies' }, { - from: '/quick-tutorials/k8s-kafka-mtls-cert-manager', - to: '/quickstart/access-control/k8s-kafka-mtls-cert-manager', + from: ['/quick-tutorials/k8s-kafka-mtls', '/quickstart/access-control/k8s-kafka-mtls'], + to: '/access-types/Kafka/Examples/k8s-kafka-mtls', + }, + { + from: ['/quick-tutorials/aws-eks-cni-mini','/quickstart/access-control/aws-eks-cni-mini'], + to: '/access-types/Networking/Examples/aws-eks-cni-mini', }, { - from: '/quick-tutorials/k8s-network-mapper', - to: '/quickstart/visualization/k8s-network-mapper', + from: ['/quick-tutorials/k8s-kafka-mtls-cert-manager', '/quickstart/access-control/k8s-kafka-mtls-cert-manager'], + to: '/access-types/Kafka/Examples/k8s-kafka-mtls-cert-manager', }, { - from: '/quick-tutorials/k8s-istio-watcher', - to: '/quickstart/visualization/k8s-istio-watcher', + from: ['/quick-tutorials/k8s-istio-watcher', '/quickstart/visualization/k8s-istio-watcher'], + to: '/access-types/Istio/Examples/k8s-istio-watcher', }, { - from: '/quick-visual-tutorials/visual-ibac-istio-authorization-policies', - to: '/quickstart/access-control/k8s-istio-authorization-policies', + from: ['/quick-visual-tutorials/visual-ibac-istio-authorization-policies','/quickstart/access-control/k8s-istio-authorization-policies', '/quickstart/k8s-istio-authorization-policies'], + to: '/access-types/Istio/Examples/k8s-istio-authorization-policies', }, { - from: '/quick-visual-tutorials/visual-ibac-kafka-k8s', - to: '/quickstart/access-control/k8s-kafka-mtls', + from: ['/quick-visual-tutorials/visual-ibac-kafka-k8s'], + to: '/access-types/Kafka/Examples/k8s-kafka-mapping', }, { - from: '/quick-visual-tutorials/visual-ibac-network-policies', - to: '/quickstart/access-control/k8s-network-policies', + from: ['/quick-visual-tutorials/visual-ibac-network-policies', '/quick-tutorials/k8s-network-policies', '/quickstart/access-control/k8s-network-policies'], + to: '/access-types/Networking/Examples/k8s-network-policies', }, { - from: '/quick-visual-tutorials/visual-k8s-cluster-mapping', - to: '/quickstart/visualization/k8s-network-mapper', + from: ['/quick-visual-tutorials/visual-k8s-cluster-mapping', '/quickstart/visualization/k8s-network-mapper', '/quick-tutorials/k8s-network-mapper'], + to: '/access-types/Networking/Examples/k8s-network-mapper', }, // Redirect from multiple old paths to the new path // { diff --git a/src/css/custom.css b/src/css/custom.css index 39fa32fb8..01d80d9cb 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -10,18 +10,22 @@ /* You can override the default Infima variables here. */ :root { - --ifm-color-primary: #306e96; + --ifm-color-primary: #4d3df7; --ifm-color-primary-dark: #2b6387; --ifm-color-primary-darker: #295e80; --ifm-color-primary-darkest: #224d69; --ifm-color-primary-light: #3579a5; --ifm-color-primary-lighter: #377fad; --ifm-color-primary-lightest: #408fc2; - --ifm-code-font-size: 95%; + --ifm-code-font-size: 85%; + --ifm-font-size-base: 0.9rem; + --ifm-font-weight-base: 400; + --ifm-h1-font-size: 2.5rem; --ifm-code-border-radius: 5px; --docusaurus-highlighted-code-line-bg: rgba(255, 255, 255, 0.2); --ifm-navbar-height: 5rem; + --ifm-menu-color: #333; --ifm-footer-background-color: white; --ifm-footer-color: white; @@ -31,11 +35,12 @@ } .navbar__title { - color: #2186e6; + color: #4d3df7; } .navbar__item { margin-left: 10px; + font-size: 12px; white-space: nowrap; } From 1af2efff93890c0afd4928c4f20ed02c5623b7a6 Mon Sep 17 00:00:00 2001 From: bglynn Date: Mon, 22 Jan 2024 10:08:14 -0800 Subject: [PATCH 02/20] * Added support to tailwind in the documents * Access Type / AWS IAM Draft content --- docs/access-types/AWS IAM/Overview.mdx | 8 -- docs/access-types/AWS IAM/Reference.mdx | 4 - .../Istio/Examples/_category_.json | 2 +- .../Networking/Examples/_category_.json | 2 +- .../Postgres/Examples/_category_.json | 2 +- docs/access-types/README.mdx | 82 ++++++++++++++++++- .../Examples/_category_.json | 0 .../Examples/aws-iam-eks.mdx | 0 docs/access-types/aws-iam/Overview.mdx | 46 +++++++++++ docs/access-types/aws-iam/Reference.mdx | 40 +++++++++ .../{AWS IAM => aws-iam}/_category_.json | 2 +- package.json | 1 + src/css/custom.css | 6 ++ tailwind.config.js | 2 +- yarn.lock | 5 ++ 15 files changed, 184 insertions(+), 18 deletions(-) delete mode 100644 docs/access-types/AWS IAM/Overview.mdx delete mode 100644 docs/access-types/AWS IAM/Reference.mdx rename docs/access-types/{AWS IAM => aws-iam}/Examples/_category_.json (100%) rename docs/access-types/{AWS IAM => aws-iam}/Examples/aws-iam-eks.mdx (100%) create mode 100644 docs/access-types/aws-iam/Overview.mdx create mode 100644 docs/access-types/aws-iam/Reference.mdx rename docs/access-types/{AWS IAM => aws-iam}/_category_.json (67%) diff --git a/docs/access-types/AWS IAM/Overview.mdx b/docs/access-types/AWS IAM/Overview.mdx deleted file mode 100644 index cf6694baa..000000000 --- a/docs/access-types/AWS IAM/Overview.mdx +++ /dev/null @@ -1,8 +0,0 @@ ---- -sidebar_position: 1 -title: Overview -hide_table_of_contents: false ---- - - - diff --git a/docs/access-types/AWS IAM/Reference.mdx b/docs/access-types/AWS IAM/Reference.mdx deleted file mode 100644 index 626ea0452..000000000 --- a/docs/access-types/AWS IAM/Reference.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -sidebar_position: 3 -title: Reference ---- \ No newline at end of file diff --git a/docs/access-types/Istio/Examples/_category_.json b/docs/access-types/Istio/Examples/_category_.json index 0e3676464..bbac434cd 100644 --- a/docs/access-types/Istio/Examples/_category_.json +++ b/docs/access-types/Istio/Examples/_category_.json @@ -1,5 +1,5 @@ { "label": "Examples", "position": 2, - "collapsed": true + "collapsed": false } diff --git a/docs/access-types/Networking/Examples/_category_.json b/docs/access-types/Networking/Examples/_category_.json index 0e3676464..bbac434cd 100644 --- a/docs/access-types/Networking/Examples/_category_.json +++ b/docs/access-types/Networking/Examples/_category_.json @@ -1,5 +1,5 @@ { "label": "Examples", "position": 2, - "collapsed": true + "collapsed": false } diff --git a/docs/access-types/Postgres/Examples/_category_.json b/docs/access-types/Postgres/Examples/_category_.json index 0e3676464..bbac434cd 100644 --- a/docs/access-types/Postgres/Examples/_category_.json +++ b/docs/access-types/Postgres/Examples/_category_.json @@ -1,5 +1,5 @@ { "label": "Examples", "position": 2, - "collapsed": true + "collapsed": false } diff --git a/docs/access-types/README.mdx b/docs/access-types/README.mdx index ce1f892fc..176cb8bf0 100644 --- a/docs/access-types/README.mdx +++ b/docs/access-types/README.mdx @@ -1,4 +1,84 @@ --- sidebar_position: 1 title: Access Types ---- \ No newline at end of file +hide_title: true +--- + +export const types = [ + { + name: 'Networking', + role: 'Admin', + url: '/access-types/Networking/Overview', + imageUrl: '/img/icons/networking.png', + }, + { + name: 'AWS IAM', + role: 'Admin', + url: '/access-types/aws-iam/Overview', + imageUrl: '/img/icons/aws.png', + }, + { + name: 'Kafka', + role: 'Admin', + url: '/access-types/Kafka/Overview', + imageUrl: '/img/icons/kafka.png', + }, + { + name: 'Istio', + role: 'Admin', + url: '/access-types/Istio/Overview', + imageUrl: '/img/icons/istio.png', + }, + { + name: 'PostgreSQL', + role: 'Cloud', + url: '/access-types/Postgres/Overview', + imageUrl: '/img/icons/postgresql.png', + }, + // More types... +] + +export default function AccessTypesCards() { + return ( +
+

Access Types

+

+ Otterize makes it easy to create authorization for your Kubernetes clusters across a variety of + different types of access. Explore each below. +

+ +
+ ) +} + + + + + + diff --git a/docs/access-types/AWS IAM/Examples/_category_.json b/docs/access-types/aws-iam/Examples/_category_.json similarity index 100% rename from docs/access-types/AWS IAM/Examples/_category_.json rename to docs/access-types/aws-iam/Examples/_category_.json diff --git a/docs/access-types/AWS IAM/Examples/aws-iam-eks.mdx b/docs/access-types/aws-iam/Examples/aws-iam-eks.mdx similarity index 100% rename from docs/access-types/AWS IAM/Examples/aws-iam-eks.mdx rename to docs/access-types/aws-iam/Examples/aws-iam-eks.mdx diff --git a/docs/access-types/aws-iam/Overview.mdx b/docs/access-types/aws-iam/Overview.mdx new file mode 100644 index 000000000..13fcffd3c --- /dev/null +++ b/docs/access-types/aws-iam/Overview.mdx @@ -0,0 +1,46 @@ +--- +sidebar_position: 1 +title: Overview +hide_table_of_contents: true +hide_title: true +--- + +# AWS IAM + +Otterize can provide least-privilege access from your EKS Kubernetes clusters to AWS Resources with [IBAC](/overview/intent-based-access-control/) support for AWS's IAM policies. + +### About + +In many workloads, EKS clusters must access external cloud resources such as databases, object storage, or additional services. Otterize provides unique credentials and policies for each pod for exactly the authorization they require. + +### How does it work + +To follow along with a full example, take a look at [Automate AWS IAM for EKS](/access-types/aws-iam/Examples/aws-iam-eks) + +1. First, the EKS cluster must have [Otterize installed](/overview/installation). +2. We must label the pod with `credentials-operator.otterize.com/create-aws-role: "true"` +3. Once that is complete, Otterize’s credential operator will create a role and an `AssumeRolePolicy` bound to ServiceAccount. +4. At this point, the role does not have the ability to perform any actions. We will need to create a ClientIntents YAML for the access the service requires and apply it to our cluster. Below is an example of a ClientIntents file for accessing an S3 bucket. View the [reference](/access-types/aws-iam/Reference) to learn more about the AWS IAM Client Intent syntax. +5. Once the intent is applied, a new policy will be attached to the service’s role with the appropriate access. + +```yaml +apiVersion: k8s.otterize.com/v1alpha3 +kind: ClientIntents +metadata: + name: server +spec: + service: + name: server + calls: + - name: arn:aws:s3:::example-bucket-*/* + type: aws + awsActions: + - "s3:PutObject" + - "s3:GetObject" +``` + +### Coming Soon + +Building least-privilege access can be difficult. Many actions have dependent actions, or services can require a lot of access to perform their functions. To help reduce this burden, Otterize will provide automated ClientIntents based on the actions your service actually requires by detecting the calls being made and converting them into the necessary YAML syntax. + + diff --git a/docs/access-types/aws-iam/Reference.mdx b/docs/access-types/aws-iam/Reference.mdx new file mode 100644 index 000000000..bfc777d18 --- /dev/null +++ b/docs/access-types/aws-iam/Reference.mdx @@ -0,0 +1,40 @@ +--- +sidebar_position: 3 +title: Reference +--- +**Metadata/Labels** + +| label | type | Description | +|---------------------------------------------------|---------|--------------------------------------------------------------| +| credentials-operator.otterize.com/create-aws-role | boolean | By setting to **true** the credential operator will create an unique AWS Role for the associated pod | +**ClientIntents** (YAML) + +| key | sub-ley | type | type | Description | +|-------------|------------|-------|--------|--------------------------------------------------------------| +| **service** | name | value | string | The name of the pod that will be granted access | +| **calls** | name | list | ARN | The AWS ARN or ARN wildcard that references the resource(s) for the authorization. See [ARN Formats - Amazon QuickSight](https://docs.aws.amazon.com/quicksight/latest/APIReference/qs-arn-format.html) for more information | +| **calls** | type | value | string | a value of “aws” to indicate the type of calls being authorized and specified. | +| **calls** | awsActions | list | Action | The [AWS Actions](https://docs.aws.amazon.com/service-authorization/latest/reference/reference_policies_actions-resources-contextkeys.html) or action wildcards that will be provided to the specified resources. | +Multiple call definitions can be defined for a single service. + +**Example YAML** + +```yaml +apiVersion: k8s.otterize.com/v1alpha3 +kind: ClientIntents +metadata: + name: server +spec: + service: + name: server + calls: + - name: arn:aws:s3:::example-bucket-*/* + type: aws + awsActions: + - "s3:PutObject" + - "s3:GetObject" + - name: arn:aws:s3:::read-only-bucket-*/* + type: aws + awsActions: + - "s3:GetObject" +``` diff --git a/docs/access-types/AWS IAM/_category_.json b/docs/access-types/aws-iam/_category_.json similarity index 67% rename from docs/access-types/AWS IAM/_category_.json rename to docs/access-types/aws-iam/_category_.json index aca2a23bb..31268af38 100644 --- a/docs/access-types/AWS IAM/_category_.json +++ b/docs/access-types/aws-iam/_category_.json @@ -1,5 +1,5 @@ { "label": "AWS IAM", "position": 2, - "collapsed": true + "collapsed": false } diff --git a/package.json b/package.json index 70dbf3159..d1c852a70 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "clsx": "^1.2.1", "docusaurus-plugin-hotjar": "^0.0.2", "docusaurus-plugin-includes": "^1.1.4", + "heroicons": "^2.1.1", "prism-react-renderer": "^1.3.5", "react": "^17.0.2", "react-dom": "^17.0.2" diff --git a/src/css/custom.css b/src/css/custom.css index 01d80d9cb..7232bddbf 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -34,6 +34,12 @@ --ifm-footer-padding-horizontal: 20px; } +article { + max-width: 800px; + margin-left: 2rem; + margin-right: auto; +} + .navbar__title { color: #4d3df7; } diff --git a/tailwind.config.js b/tailwind.config.js index 066cdd952..a1768b0f8 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -1,6 +1,6 @@ /** @type {import('tailwindcss').Config} */ module.exports = { - content: ['./src/**/*.{js,jsx,ts,tsx}', './docusaurus.config.js'], + content: ['./src/**/*.{js,jsx,ts,tsx}', './docusaurus.config.js', './docs/**/*.mdx'], prefix: 'tw-', // This is important to avoid conflicts with Docusaurus styles. theme: { screens: { diff --git a/yarn.lock b/yarn.lock index 2aab033f1..199721d77 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4416,6 +4416,11 @@ he@^1.2.0: resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== +heroicons@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/heroicons/-/heroicons-2.1.1.tgz#b574c2d87bc504bf7f4fefacc20960c5672b0202" + integrity sha512-54kHbrxsTyAJJU7z07XN1OrVBX8ogN/tbclP8Doxk0X4IQmR6LEhLzJBkFK9Yc814NoXG6ZJBh9Bi/qvauzjfA== + history@^4.9.0: version "4.10.1" resolved "https://registry.npmjs.org/history/-/history-4.10.1.tgz" From 784d60db2d7bc4b344151c383f98c21783b072c0 Mon Sep 17 00:00:00 2001 From: bglynn Date: Wed, 24 Jan 2024 12:21:46 -0800 Subject: [PATCH 03/20] * "Features" * Draft content for new getting started page --- docs/access-types/Istio/_category_.json | 5 - docs/access-types/Kafka/_category_.json | 5 - docs/access-types/Networking/_category_.json | 5 - docs/access-types/Postgres/_category_.json | 5 - docs/access-types/README.mdx | 84 ------- docs/access-types/_category_.json | 5 - docs/access-types/aws-iam/_category_.json | 5 - .../Istio/Examples/_category_.json | 0 .../k8s-istio-authorization-policies.mdx | 0 .../Istio/Examples/k8s-istio-watcher.mdx | 0 .../Istio/Overview.mdx | 0 .../Istio/Reference.mdx | 0 docs/features/Istio/_category_.json | 8 + .../Kafka/Examples/_category_.json | 0 .../Kafka/Examples/k8s-kafka-mapping.mdx | 0 .../Examples/k8s-kafka-mtls-cert-manager.mdx | 2 +- .../Kafka/Examples/k8s-kafka-mtls.mdx | 0 .../Kafka/Overview.mdx | 0 .../Kafka/Reference.mdx | 0 docs/features/Kafka/_category_.json | 9 + .../Networking/Examples/_category_.json | 0 .../Networking/Examples/aws-eks-cni-mini.mdx | 2 +- .../Examples/k8s-network-mapper.mdx | 2 +- .../Examples/k8s-network-policies.mdx | 2 +- .../protect-1-service-network-policies.mdx | 2 +- .../Networking/Overview.mdx | 0 .../Reference/Network-Policies-Deep-Dive.mdx | 0 .../Networking/Reference/README.mdx | 0 docs/features/Networking/_category_.json | 8 + .../Postgres/Examples/_category_.json | 0 .../Postgres/Examples/postgres.mdx | 0 .../Postgres/Overview.mdx | 0 .../Postgres/Reference.mdx | 0 docs/features/Postgres/_category_.json | 8 + docs/features/README.mdx | 55 +++++ docs/features/_category_.json | 8 + .../aws-iam/Examples/_category_.json | 0 .../aws-iam/Examples/aws-iam-eks.mdx | 0 .../aws-iam/Overview.mdx | 4 +- .../aws-iam/Reference.mdx | 0 docs/features/aws-iam/_category_.json | 8 + docs/getting-started/README.mdx | 224 ++++++++++++++---- docusaurus.config.js | 20 +- src/components/CardList/index.js | 29 +++ src/components/LinkCard/index.js | 35 +++ static/img/icons/aws.png | Bin 0 -> 46809 bytes static/img/icons/istio.png | Bin 0 -> 20852 bytes static/img/icons/kafka.png | Bin 0 -> 13675 bytes static/img/icons/networking.png | Bin 0 -> 21015 bytes static/img/icons/postgresql.png | Bin 0 -> 35042 bytes 50 files changed, 365 insertions(+), 175 deletions(-) delete mode 100644 docs/access-types/Istio/_category_.json delete mode 100644 docs/access-types/Kafka/_category_.json delete mode 100644 docs/access-types/Networking/_category_.json delete mode 100644 docs/access-types/Postgres/_category_.json delete mode 100644 docs/access-types/README.mdx delete mode 100644 docs/access-types/_category_.json delete mode 100644 docs/access-types/aws-iam/_category_.json rename docs/{access-types => features}/Istio/Examples/_category_.json (100%) rename docs/{access-types => features}/Istio/Examples/k8s-istio-authorization-policies.mdx (100%) rename docs/{access-types => features}/Istio/Examples/k8s-istio-watcher.mdx (100%) rename docs/{access-types => features}/Istio/Overview.mdx (100%) rename docs/{access-types => features}/Istio/Reference.mdx (100%) create mode 100644 docs/features/Istio/_category_.json rename docs/{access-types => features}/Kafka/Examples/_category_.json (100%) rename docs/{access-types => features}/Kafka/Examples/k8s-kafka-mapping.mdx (100%) rename docs/{access-types => features}/Kafka/Examples/k8s-kafka-mtls-cert-manager.mdx (99%) rename docs/{access-types => features}/Kafka/Examples/k8s-kafka-mtls.mdx (100%) rename docs/{access-types => features}/Kafka/Overview.mdx (100%) rename docs/{access-types => features}/Kafka/Reference.mdx (100%) create mode 100644 docs/features/Kafka/_category_.json rename docs/{access-types => features}/Networking/Examples/_category_.json (100%) rename docs/{access-types => features}/Networking/Examples/aws-eks-cni-mini.mdx (99%) rename docs/{access-types => features}/Networking/Examples/k8s-network-mapper.mdx (99%) rename docs/{access-types => features}/Networking/Examples/k8s-network-policies.mdx (99%) rename docs/{access-types => features}/Networking/Examples/protect-1-service-network-policies.mdx (99%) rename docs/{access-types => features}/Networking/Overview.mdx (100%) rename docs/{access-types => features}/Networking/Reference/Network-Policies-Deep-Dive.mdx (100%) rename docs/{access-types => features}/Networking/Reference/README.mdx (100%) create mode 100644 docs/features/Networking/_category_.json rename docs/{access-types => features}/Postgres/Examples/_category_.json (100%) rename docs/{access-types => features}/Postgres/Examples/postgres.mdx (100%) rename docs/{access-types => features}/Postgres/Overview.mdx (100%) rename docs/{access-types => features}/Postgres/Reference.mdx (100%) create mode 100644 docs/features/Postgres/_category_.json create mode 100644 docs/features/README.mdx create mode 100644 docs/features/_category_.json rename docs/{access-types => features}/aws-iam/Examples/_category_.json (100%) rename docs/{access-types => features}/aws-iam/Examples/aws-iam-eks.mdx (100%) rename docs/{access-types => features}/aws-iam/Overview.mdx (91%) rename docs/{access-types => features}/aws-iam/Reference.mdx (100%) create mode 100644 docs/features/aws-iam/_category_.json create mode 100644 src/components/CardList/index.js create mode 100644 src/components/LinkCard/index.js create mode 100644 static/img/icons/aws.png create mode 100644 static/img/icons/istio.png create mode 100644 static/img/icons/kafka.png create mode 100644 static/img/icons/networking.png create mode 100644 static/img/icons/postgresql.png diff --git a/docs/access-types/Istio/_category_.json b/docs/access-types/Istio/_category_.json deleted file mode 100644 index 1654bce0e..000000000 --- a/docs/access-types/Istio/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "Istio", - "position": 4, - "collapsed": true -} diff --git a/docs/access-types/Kafka/_category_.json b/docs/access-types/Kafka/_category_.json deleted file mode 100644 index 4861435c0..000000000 --- a/docs/access-types/Kafka/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "Kafka", - "position": 3, - "collapsed": true -} diff --git a/docs/access-types/Networking/_category_.json b/docs/access-types/Networking/_category_.json deleted file mode 100644 index cffc70f0d..000000000 --- a/docs/access-types/Networking/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "Networking", - "position": 1, - "collapsed": true -} diff --git a/docs/access-types/Postgres/_category_.json b/docs/access-types/Postgres/_category_.json deleted file mode 100644 index bc6190e1f..000000000 --- a/docs/access-types/Postgres/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "PostgreSQL", - "position": 5, - "collapsed": true -} diff --git a/docs/access-types/README.mdx b/docs/access-types/README.mdx deleted file mode 100644 index 176cb8bf0..000000000 --- a/docs/access-types/README.mdx +++ /dev/null @@ -1,84 +0,0 @@ ---- -sidebar_position: 1 -title: Access Types -hide_title: true ---- - -export const types = [ - { - name: 'Networking', - role: 'Admin', - url: '/access-types/Networking/Overview', - imageUrl: '/img/icons/networking.png', - }, - { - name: 'AWS IAM', - role: 'Admin', - url: '/access-types/aws-iam/Overview', - imageUrl: '/img/icons/aws.png', - }, - { - name: 'Kafka', - role: 'Admin', - url: '/access-types/Kafka/Overview', - imageUrl: '/img/icons/kafka.png', - }, - { - name: 'Istio', - role: 'Admin', - url: '/access-types/Istio/Overview', - imageUrl: '/img/icons/istio.png', - }, - { - name: 'PostgreSQL', - role: 'Cloud', - url: '/access-types/Postgres/Overview', - imageUrl: '/img/icons/postgresql.png', - }, - // More types... -] - -export default function AccessTypesCards() { - return ( -
-

Access Types

-

- Otterize makes it easy to create authorization for your Kubernetes clusters across a variety of - different types of access. Explore each below. -

- -
- ) -} - - - - - - diff --git a/docs/access-types/_category_.json b/docs/access-types/_category_.json deleted file mode 100644 index 867232c84..000000000 --- a/docs/access-types/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "Access Types", - "position": 3, - "collapsed": false -} diff --git a/docs/access-types/aws-iam/_category_.json b/docs/access-types/aws-iam/_category_.json deleted file mode 100644 index 31268af38..000000000 --- a/docs/access-types/aws-iam/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "AWS IAM", - "position": 2, - "collapsed": false -} diff --git a/docs/access-types/Istio/Examples/_category_.json b/docs/features/Istio/Examples/_category_.json similarity index 100% rename from docs/access-types/Istio/Examples/_category_.json rename to docs/features/Istio/Examples/_category_.json diff --git a/docs/access-types/Istio/Examples/k8s-istio-authorization-policies.mdx b/docs/features/Istio/Examples/k8s-istio-authorization-policies.mdx similarity index 100% rename from docs/access-types/Istio/Examples/k8s-istio-authorization-policies.mdx rename to docs/features/Istio/Examples/k8s-istio-authorization-policies.mdx diff --git a/docs/access-types/Istio/Examples/k8s-istio-watcher.mdx b/docs/features/Istio/Examples/k8s-istio-watcher.mdx similarity index 100% rename from docs/access-types/Istio/Examples/k8s-istio-watcher.mdx rename to docs/features/Istio/Examples/k8s-istio-watcher.mdx diff --git a/docs/access-types/Istio/Overview.mdx b/docs/features/Istio/Overview.mdx similarity index 100% rename from docs/access-types/Istio/Overview.mdx rename to docs/features/Istio/Overview.mdx diff --git a/docs/access-types/Istio/Reference.mdx b/docs/features/Istio/Reference.mdx similarity index 100% rename from docs/access-types/Istio/Reference.mdx rename to docs/features/Istio/Reference.mdx diff --git a/docs/features/Istio/_category_.json b/docs/features/Istio/_category_.json new file mode 100644 index 000000000..1768d992d --- /dev/null +++ b/docs/features/Istio/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Istio", + "position": 4, + "collapsed": true, + "customProps": { + "image": "/img/icons/istio.png" + } +} diff --git a/docs/access-types/Kafka/Examples/_category_.json b/docs/features/Kafka/Examples/_category_.json similarity index 100% rename from docs/access-types/Kafka/Examples/_category_.json rename to docs/features/Kafka/Examples/_category_.json diff --git a/docs/access-types/Kafka/Examples/k8s-kafka-mapping.mdx b/docs/features/Kafka/Examples/k8s-kafka-mapping.mdx similarity index 100% rename from docs/access-types/Kafka/Examples/k8s-kafka-mapping.mdx rename to docs/features/Kafka/Examples/k8s-kafka-mapping.mdx diff --git a/docs/access-types/Kafka/Examples/k8s-kafka-mtls-cert-manager.mdx b/docs/features/Kafka/Examples/k8s-kafka-mtls-cert-manager.mdx similarity index 99% rename from docs/access-types/Kafka/Examples/k8s-kafka-mtls-cert-manager.mdx rename to docs/features/Kafka/Examples/k8s-kafka-mtls-cert-manager.mdx index ec754ba6c..8bd74c7dd 100644 --- a/docs/access-types/Kafka/Examples/k8s-kafka-mtls-cert-manager.mdx +++ b/docs/features/Kafka/Examples/k8s-kafka-mtls-cert-manager.mdx @@ -1,6 +1,6 @@ --- sidebar_position: 5 -title: Kafka Access Automation Using Cert-Manager mTLS +title: Kafka access automation using cert-manager mTLS image: /img/quick-tutorials/k8s-kafka-mtls-cert-mgr/social.png --- diff --git a/docs/access-types/Kafka/Examples/k8s-kafka-mtls.mdx b/docs/features/Kafka/Examples/k8s-kafka-mtls.mdx similarity index 100% rename from docs/access-types/Kafka/Examples/k8s-kafka-mtls.mdx rename to docs/features/Kafka/Examples/k8s-kafka-mtls.mdx diff --git a/docs/access-types/Kafka/Overview.mdx b/docs/features/Kafka/Overview.mdx similarity index 100% rename from docs/access-types/Kafka/Overview.mdx rename to docs/features/Kafka/Overview.mdx diff --git a/docs/access-types/Kafka/Reference.mdx b/docs/features/Kafka/Reference.mdx similarity index 100% rename from docs/access-types/Kafka/Reference.mdx rename to docs/features/Kafka/Reference.mdx diff --git a/docs/features/Kafka/_category_.json b/docs/features/Kafka/_category_.json new file mode 100644 index 000000000..671f785b5 --- /dev/null +++ b/docs/features/Kafka/_category_.json @@ -0,0 +1,9 @@ +{ + "label": "Kafka", + "position": 3, + "collapsed": true, + "customProps": { + "image": "/img/icons/kafka.png", + "cloud-only": "true" + } +} diff --git a/docs/access-types/Networking/Examples/_category_.json b/docs/features/Networking/Examples/_category_.json similarity index 100% rename from docs/access-types/Networking/Examples/_category_.json rename to docs/features/Networking/Examples/_category_.json diff --git a/docs/access-types/Networking/Examples/aws-eks-cni-mini.mdx b/docs/features/Networking/Examples/aws-eks-cni-mini.mdx similarity index 99% rename from docs/access-types/Networking/Examples/aws-eks-cni-mini.mdx rename to docs/features/Networking/Examples/aws-eks-cni-mini.mdx index f49bd7e7b..9e6ea6e55 100644 --- a/docs/access-types/Networking/Examples/aws-eks-cni-mini.mdx +++ b/docs/features/Networking/Examples/aws-eks-cni-mini.mdx @@ -1,6 +1,6 @@ --- sidebar_position: 4 -title: AWS EKS Network policies With The VPC CNI +title: AWS EKS network policies with the VPC CNI image: /img/quick-tutorials/aws-eks-mini/social.png --- diff --git a/docs/access-types/Networking/Examples/k8s-network-mapper.mdx b/docs/features/Networking/Examples/k8s-network-mapper.mdx similarity index 99% rename from docs/access-types/Networking/Examples/k8s-network-mapper.mdx rename to docs/features/Networking/Examples/k8s-network-mapper.mdx index 0db7cfd8b..7c3db3339 100644 --- a/docs/access-types/Networking/Examples/k8s-network-mapper.mdx +++ b/docs/features/Networking/Examples/k8s-network-mapper.mdx @@ -1,6 +1,6 @@ --- sidebar_position: 1 -title: Visualizing a Kubernetes Network +title: Visualizing a Kubernetes network image: /img/visualization/k8s-network-mapper/social.png --- diff --git a/docs/access-types/Networking/Examples/k8s-network-policies.mdx b/docs/features/Networking/Examples/k8s-network-policies.mdx similarity index 99% rename from docs/access-types/Networking/Examples/k8s-network-policies.mdx rename to docs/features/Networking/Examples/k8s-network-policies.mdx index 781e43f1c..3686dc23f 100644 --- a/docs/access-types/Networking/Examples/k8s-network-policies.mdx +++ b/docs/features/Networking/Examples/k8s-network-policies.mdx @@ -1,6 +1,6 @@ --- sidebar_position: 1 -title: Network Policy Automation +title: NetworkPolicy Automation image: /img/quick-tutorials/network-policies/social.png --- diff --git a/docs/access-types/Networking/Examples/protect-1-service-network-policies.mdx b/docs/features/Networking/Examples/protect-1-service-network-policies.mdx similarity index 99% rename from docs/access-types/Networking/Examples/protect-1-service-network-policies.mdx rename to docs/features/Networking/Examples/protect-1-service-network-policies.mdx index 7bcaacd3e..d43d3b445 100644 --- a/docs/access-types/Networking/Examples/protect-1-service-network-policies.mdx +++ b/docs/features/Networking/Examples/protect-1-service-network-policies.mdx @@ -1,6 +1,6 @@ --- sidebar_position: 1 -title: "Protecting A Service With Network Policies" +title: "Protecting a service with network policies" --- import CodeBlock from "@theme/CodeBlock"; diff --git a/docs/access-types/Networking/Overview.mdx b/docs/features/Networking/Overview.mdx similarity index 100% rename from docs/access-types/Networking/Overview.mdx rename to docs/features/Networking/Overview.mdx diff --git a/docs/access-types/Networking/Reference/Network-Policies-Deep-Dive.mdx b/docs/features/Networking/Reference/Network-Policies-Deep-Dive.mdx similarity index 100% rename from docs/access-types/Networking/Reference/Network-Policies-Deep-Dive.mdx rename to docs/features/Networking/Reference/Network-Policies-Deep-Dive.mdx diff --git a/docs/access-types/Networking/Reference/README.mdx b/docs/features/Networking/Reference/README.mdx similarity index 100% rename from docs/access-types/Networking/Reference/README.mdx rename to docs/features/Networking/Reference/README.mdx diff --git a/docs/features/Networking/_category_.json b/docs/features/Networking/_category_.json new file mode 100644 index 000000000..d8135a87a --- /dev/null +++ b/docs/features/Networking/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Networking", + "position": 1, + "collapsed": true, + "customProps": { + "image": "/img/icons/networking.png" + } +} diff --git a/docs/access-types/Postgres/Examples/_category_.json b/docs/features/Postgres/Examples/_category_.json similarity index 100% rename from docs/access-types/Postgres/Examples/_category_.json rename to docs/features/Postgres/Examples/_category_.json diff --git a/docs/access-types/Postgres/Examples/postgres.mdx b/docs/features/Postgres/Examples/postgres.mdx similarity index 100% rename from docs/access-types/Postgres/Examples/postgres.mdx rename to docs/features/Postgres/Examples/postgres.mdx diff --git a/docs/access-types/Postgres/Overview.mdx b/docs/features/Postgres/Overview.mdx similarity index 100% rename from docs/access-types/Postgres/Overview.mdx rename to docs/features/Postgres/Overview.mdx diff --git a/docs/access-types/Postgres/Reference.mdx b/docs/features/Postgres/Reference.mdx similarity index 100% rename from docs/access-types/Postgres/Reference.mdx rename to docs/features/Postgres/Reference.mdx diff --git a/docs/features/Postgres/_category_.json b/docs/features/Postgres/_category_.json new file mode 100644 index 000000000..02b31b4a4 --- /dev/null +++ b/docs/features/Postgres/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "PostgreSQL", + "position": 5, + "collapsed": true, + "customProps": { + "image": "/img/icons/postgresql.png" + } +} diff --git a/docs/features/README.mdx b/docs/features/README.mdx new file mode 100644 index 000000000..1513e9df8 --- /dev/null +++ b/docs/features/README.mdx @@ -0,0 +1,55 @@ +--- +sidebar_position: 1 +title: Features +hide_title: true +--- + + +import { + useCurrentSidebarCategory +} from '@docusaurus/theme-common'; + + + +export default function FeatureCards() { + const category = useCurrentSidebarCategory(); + const features = category.items; + return ( +
+

Features

+

+ Otterize makes it easy to create and visualize authorization for your Kubernetes clusters across a + variety of + services. Explore each below. +

+
+ {features.map((feature) => ( +
+ {feature.items && feature.items[0] && feature.items[0].href && + +
+
+ {feature.customProps && feature.customProps.image && + + } +
+

{feature.label}

+
+
+ } +
+ ))} +
+
+ ) +} + + + + + + diff --git a/docs/features/_category_.json b/docs/features/_category_.json new file mode 100644 index 000000000..5299b8d4f --- /dev/null +++ b/docs/features/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Features", + "position": 3, + "collapsed": false, + "customProps": { + "image": "/img/icons/aws.png" + } +} diff --git a/docs/access-types/aws-iam/Examples/_category_.json b/docs/features/aws-iam/Examples/_category_.json similarity index 100% rename from docs/access-types/aws-iam/Examples/_category_.json rename to docs/features/aws-iam/Examples/_category_.json diff --git a/docs/access-types/aws-iam/Examples/aws-iam-eks.mdx b/docs/features/aws-iam/Examples/aws-iam-eks.mdx similarity index 100% rename from docs/access-types/aws-iam/Examples/aws-iam-eks.mdx rename to docs/features/aws-iam/Examples/aws-iam-eks.mdx diff --git a/docs/access-types/aws-iam/Overview.mdx b/docs/features/aws-iam/Overview.mdx similarity index 91% rename from docs/access-types/aws-iam/Overview.mdx rename to docs/features/aws-iam/Overview.mdx index 13fcffd3c..c55d04df4 100644 --- a/docs/access-types/aws-iam/Overview.mdx +++ b/docs/features/aws-iam/Overview.mdx @@ -15,12 +15,12 @@ In many workloads, EKS clusters must access external cloud resources such as dat ### How does it work -To follow along with a full example, take a look at [Automate AWS IAM for EKS](/access-types/aws-iam/Examples/aws-iam-eks) +To follow along with a full example, take a look at [Automate AWS IAM for EKS](/features/aws-iam/Examples/aws-iam-eks) 1. First, the EKS cluster must have [Otterize installed](/overview/installation). 2. We must label the pod with `credentials-operator.otterize.com/create-aws-role: "true"` 3. Once that is complete, Otterize’s credential operator will create a role and an `AssumeRolePolicy` bound to ServiceAccount. -4. At this point, the role does not have the ability to perform any actions. We will need to create a ClientIntents YAML for the access the service requires and apply it to our cluster. Below is an example of a ClientIntents file for accessing an S3 bucket. View the [reference](/access-types/aws-iam/Reference) to learn more about the AWS IAM Client Intent syntax. +4. At this point, the role does not have the ability to perform any actions. We will need to create a ClientIntents YAML for the access the service requires and apply it to our cluster. Below is an example of a ClientIntents file for accessing an S3 bucket. View the [reference](/features/aws-iam/Reference) to learn more about the AWS IAM Client Intent syntax. 5. Once the intent is applied, a new policy will be attached to the service’s role with the appropriate access. ```yaml diff --git a/docs/access-types/aws-iam/Reference.mdx b/docs/features/aws-iam/Reference.mdx similarity index 100% rename from docs/access-types/aws-iam/Reference.mdx rename to docs/features/aws-iam/Reference.mdx diff --git a/docs/features/aws-iam/_category_.json b/docs/features/aws-iam/_category_.json new file mode 100644 index 000000000..793b7a8c4 --- /dev/null +++ b/docs/features/aws-iam/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "AWS IAM", + "position": 2, + "collapsed": true, + "customProps": { + "image": "/img/icons/aws.png" + } +} diff --git a/docs/getting-started/README.mdx b/docs/getting-started/README.mdx index b8d8d040b..480851c46 100644 --- a/docs/getting-started/README.mdx +++ b/docs/getting-started/README.mdx @@ -2,63 +2,199 @@ sidebar_position: 1 slug: / title: Getting Started +hide_title: true --- -export const LinkButton = (props) => ( - -); - -Otterize is a platform for implementing intent-based access control ([IBAC](/intent-based-access-control)) for workloads. +export const introduction = [ + { + title: 'What is Otterize', + description: 'Learn how Otterize helps visualize and manages your authorization', + }, + { + title: 'Intent-Based Access Control', + description: 'Dive into declarative access.', + url: '/overview/intent-based-access-control' + }, +]; + +export const features = [ + { + title: 'Network Policies', + icon: '/img/icons/networking.png', + url: '/features/Networking/Overview' + }, + { + title: 'AWS IAM', + icon: '/img/icons/aws.png', + url: '/features/aws-iam/Overview' + }, + { + title: 'Kafka', + icon: '/img/icons/kafka.png', + url: '/features/kafka/Overview' + }, + { + title: 'PostgreSQL', + icon: '/img/icons/postgresql.png', + url: '/features/postgresql/Overview' + }, + { + title: 'Istio', + icon: '/img/icons/istio.png', + url: '/features/istio/Overview' + }, +]; + +export const tutorials_access = [ + { + title: 'Create and manage network policies', + description: 'Create Kubernetes network policies using IBAC', + url: '/features/Networking/Examples/k8s-network-policies' + }, + { + title: 'Network policies on AWS EKS', + description: 'Jump start network policies using AWS EKS and VPC CNI', + url: '/features/Networking/Examples/aws-eks-cni-mini' + }, + { + title: 'Create and manage Istio authorization policies', + description: 'Using Istio and IBAC to secure your K8s cluster', + url: '/features/Istio/Examples/k8s-istio-authorization-policies' + }, + { + title: 'Configure secure access for Kafka using Otterize Cloud mTLS', + description: 'Declaring and applying intents to easily secure access to Kafka', + url: '/features/Kafka/Examples/k8s-kafka-mtls-cert-manager' + } +]; + +export const tutorials_visualization = [ + { + title: 'Network mapping a Kubernetes cluster', + description: 'Map pod-to-pod traffic within your K8s cluster', + url: '/features/Networking/Examples/k8s-network-mapper' + }, + { + title: 'Istio HTTP-level access mapping', + description: 'The network mapper allows you to map pod-to-pod Istio traffic', + url: '/features/Istio/Examples/k8s-istio-watcher' + }, + { + title: 'Kafka topic-level access mapping', + description: 'View topic-level access to Kafka servers within your Kubernetes cluster', + url: 'features/Kafka/Examples/k8s-kafka-mapping' + } +]; + +export const editions = [ + { + title: 'Community Edition', + description: 'Our open source edition focuses on a single Kubernetes cluster. ', + url: '/overview/otterize-oss' + }, + { + title: 'Cloud', + description: 'Visualize all your clusters, automate policies, and more', + url: '/overview/otterize-cloud' + } +]; + + +import DocsLinkCard from "@site/src/components/LinkCard"; + + + +Otterize is a platform that allows you to visualize, and build secure access for Kubernetes workloads. +Secure access is managed through declarative intent-based access control ([IBAC](/intent-based-access-control)) providing an easy understood and centralized approach to auth. + The platform is composed of **Otterize OSS**, which is tailored for a single Kubernetes cluster, and **Otterize Cloud**, which adds visibility and operationalization across Kubernetes clusters and non-Kubernetes infrastructures. -Otterize enables platform engineers to easily implement, expand, and unify secured access for their Kubernetes workloads. -## Let's go! 🚀 -Dive right in with simple demos to manage access control: -* [Create and manage network policies](/quickstart/access-control/k8s-network-policies). -* [Network policies on AWS EKS with the VPC CNI](/quickstart/access-control/aws-eks-cni-mini). -* [Create and manage Istio authorization policies](/quickstart/access-control/k8s-istio-authorization-policies). -* [Configure secure access for Kafka using Otterize Cloud mTLS](/quickstart/access-control/k8s-kafka-mtls), or [using cert-manager mTLS](/quickstart/access-control/k8s-kafka-mtls-cert-manager). +### Introduction + + + +### Features + +Otterize makes it easy to create and visualize authorization for your Kubernetes clusters across a variety of services. Explore each below. + + + +### Tutorials + +#### Learn more about access control + + + +#### See how to visualize access + + + +### Editions + + + + +[//]: # () +[//]: # (## Let's go! 🚀) + +[//]: # (Dive right in with simple demos to manage access control:) + +[//]: # (* [Create and manage network policies](/quickstart/access-control/k8s-network-policies).) + +[//]: # (* [Network policies on AWS EKS with the VPC CNI](/quickstart/access-control/aws-eks-cni-mini).) + +[//]: # (* [Create and manage Istio authorization policies](/quickstart/access-control/k8s-istio-authorization-policies).) + +[//]: # (* [Configure secure access for Kafka using Otterize Cloud mTLS](/quickstart/access-control/k8s-kafka-mtls), or [using cert-manager mTLS](/quickstart/access-control/k8s-kafka-mtls-cert-manager).) + +[//]: # () +[//]: # (Or visualize communication in your cluster:) + +[//]: # (* [Network mapping a Kubernetes cluster](/quickstart/visualization/k8s-network-mapper).) + +[//]: # (* [Istio HTTP-level access mapping](/quickstart/visualization/k8s-istio-watcher).) + +[//]: # (* [Kafka topic-level access mapping](/quickstart/visualization/k8s-network-mapper).) + +[//]: # () +[//]: # (## Components) + +[//]: # () +[//]: # (### Otterize OSS) + +[//]: # (The Otterize OSS components are standalone open-source projects that implement intent-based access control (IBAC) for a single Kubernetes cluster. This same set of components is used to integrate with Otterize Cloud.) + +[//]: # (- The [Otterize intents operator](/reference/configuration/intents-operator) translates ClientIntents resources to access controls: currently, network policies for pod-to-pod access, and ACLs for in-cluster Kafka client access. [See it in GitHub](https://github.com/otterize/intents-operator)) -Or visualize communication in your cluster: -* [Network mapping a Kubernetes cluster](/quickstart/visualization/k8s-network-mapper). -* [Istio HTTP-level access mapping](/quickstart/visualization/k8s-istio-watcher). -* [Kafka topic-level access mapping](/quickstart/visualization/k8s-network-mapper). +[//]: # (- The [Otterize credentials operator](/reference/configuration/credentials-operator) integrates with SPIFFE/SPIRE to handle pod identities and manage certificates. [See it in GitHub](https://github.com/otterize/credentials-operator)) -## Components +[//]: # (- The [Otterize network mapper](/reference/configuration/network-mapper) sniffs pod-to-pod traffic and builds a network map, which is useful on its own and may also be exported as client intents files for bootstrapping IBAC. [See it in GitHub](https://github.com/otterize/network-mapper)) -### Otterize OSS -The Otterize OSS components are standalone open-source projects that implement intent-based access control (IBAC) for a single Kubernetes cluster. This same set of components is used to integrate with Otterize Cloud. -- The [Otterize intents operator](/reference/configuration/intents-operator) translates ClientIntents resources to access controls: currently, network policies for pod-to-pod access, and ACLs for in-cluster Kafka client access. [See it in GitHub](https://github.com/otterize/intents-operator) -- The [Otterize credentials operator](/reference/configuration/credentials-operator) integrates with SPIFFE/SPIRE to handle pod identities and manage certificates. [See it in GitHub](https://github.com/otterize/credentials-operator) -- The [Otterize network mapper](/reference/configuration/network-mapper) sniffs pod-to-pod traffic and builds a network map, which is useful on its own and may also be exported as client intents files for bootstrapping IBAC. [See it in GitHub](https://github.com/otterize/network-mapper) +[//]: # () +[//]: # () +[//]: # (### Otterize CLI) +[//]: # () +[//]: # (The [Otterize CLI](/reference/cli) is used to control the network mapper or output its data, convert non-Kubernetes client) -### Otterize CLI +[//]: # (intents files (if needed) to Kubernetes custom resource YAMLs, interface with the Otterize Cloud.) -The [Otterize CLI](/reference/cli) is used to control the network mapper or output its data, convert non-Kubernetes client -intents files (if needed) to Kubernetes custom resource YAMLs, interface with the Otterize Cloud. +[//]: # () +[//]: # (## Open source and Cloud) -## Open source and Cloud +[//]: # () +[//]: # (### Otterize OSS) -### Otterize OSS +[//]: # () +[//]: # (Otterize OSS is a standalone open-source implementation of intent-based access control (IBAC) for a single Kubernetes cluster. As well as being open source, Otterize OSS is completely free, licensed under the Apache 2.0 license and does not require Otterize Cloud.) -Otterize OSS is a standalone open-source implementation of intent-based access control (IBAC) for a single Kubernetes cluster. As well as being open source, Otterize OSS is completely free, licensed under the Apache 2.0 license and does not require Otterize Cloud. +[//]: # () +[//]: # (### Otterize Cloud) -### Otterize Cloud +[//]: # () +[//]: # (Otterize Cloud adds unified visibility and operationalization,) -Otterize Cloud adds unified visibility and operationalization, -and spans multiple Kubernetes clusters as well as (coming soon) non-Kubernetes infrastructures. +[//]: # (and spans multiple Kubernetes clusters as well as (coming soon) non-Kubernetes infrastructures.) -Read more in our [product page](https://otterize.com/product). \ No newline at end of file +[//]: # () +[//]: # (Read more in our [product page](https://otterize.com/product).) \ No newline at end of file diff --git a/docusaurus.config.js b/docusaurus.config.js index cc13b705f..e5dfddc06 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -150,7 +150,7 @@ const config = { }, { from: ['/reference/access-controls/network-policies'], - to: '/access-types/Networking/Reference/Network-Policies-Deep-Dive' + to: '/features/Networking/Reference/Network-Policies-Deep-Dive' }, { from: ['/shadow-vs-active-enforcement'], @@ -184,39 +184,39 @@ const config = { }, { from: ['/guides/protect-1-service-network-policies'], - to: '/access-types/Networking/Examples/protect-1-service-network-policies' + to: '/features/Networking/Examples/protect-1-service-network-policies' }, { from: ['/quick-tutorials/k8s-kafka-mtls', '/quickstart/access-control/k8s-kafka-mtls'], - to: '/access-types/Kafka/Examples/k8s-kafka-mtls', + to: '/features/Kafka/Examples/k8s-kafka-mtls', }, { from: ['/quick-tutorials/aws-eks-cni-mini','/quickstart/access-control/aws-eks-cni-mini'], - to: '/access-types/Networking/Examples/aws-eks-cni-mini', + to: '/features/Networking/Examples/aws-eks-cni-mini', }, { from: ['/quick-tutorials/k8s-kafka-mtls-cert-manager', '/quickstart/access-control/k8s-kafka-mtls-cert-manager'], - to: '/access-types/Kafka/Examples/k8s-kafka-mtls-cert-manager', + to: '/features/Kafka/Examples/k8s-kafka-mtls-cert-manager', }, { from: ['/quick-tutorials/k8s-istio-watcher', '/quickstart/visualization/k8s-istio-watcher'], - to: '/access-types/Istio/Examples/k8s-istio-watcher', + to: '/features/Istio/Examples/k8s-istio-watcher', }, { from: ['/quick-visual-tutorials/visual-ibac-istio-authorization-policies','/quickstart/access-control/k8s-istio-authorization-policies', '/quickstart/k8s-istio-authorization-policies'], - to: '/access-types/Istio/Examples/k8s-istio-authorization-policies', + to: '/features/Istio/Examples/k8s-istio-authorization-policies', }, { from: ['/quick-visual-tutorials/visual-ibac-kafka-k8s'], - to: '/access-types/Kafka/Examples/k8s-kafka-mapping', + to: '/features/Kafka/Examples/k8s-kafka-mapping', }, { from: ['/quick-visual-tutorials/visual-ibac-network-policies', '/quick-tutorials/k8s-network-policies', '/quickstart/access-control/k8s-network-policies'], - to: '/access-types/Networking/Examples/k8s-network-policies', + to: '/features/Networking/Examples/k8s-network-policies', }, { from: ['/quick-visual-tutorials/visual-k8s-cluster-mapping', '/quickstart/visualization/k8s-network-mapper', '/quick-tutorials/k8s-network-mapper'], - to: '/access-types/Networking/Examples/k8s-network-mapper', + to: '/features/Networking/Examples/k8s-network-mapper', }, // Redirect from multiple old paths to the new path // { diff --git a/src/components/CardList/index.js b/src/components/CardList/index.js new file mode 100644 index 000000000..c7f8a5e8e --- /dev/null +++ b/src/components/CardList/index.js @@ -0,0 +1,29 @@ +import React from 'react'; + +export default function CardList(props) { + console.log(JSON.stringify(props)); + return ( + + ); +} \ No newline at end of file diff --git a/src/components/LinkCard/index.js b/src/components/LinkCard/index.js new file mode 100644 index 000000000..414c2df27 --- /dev/null +++ b/src/components/LinkCard/index.js @@ -0,0 +1,35 @@ +import React from 'react'; + +export default function DocsLinkCard({items, colSize}) { + let colClasses = "lg:tw-grid-cols-2 tw-gap-4 xs:tw-grid-cols-1 "; + if (colSize === "lg") { + colClasses = "lg:tw-grid-cols-4 tw-gap-2 xs:tw-grid-cols-2" + }else if (colSize === "md") { + colClasses = "lg:tw-grid-cols-3 tw-gap-2 xs:tw-grid-cols-1 md:tw-grid-cols-2" + } + return ( +
+ {items.map((item) => ( + + ))} +
+ ) +} diff --git a/static/img/icons/aws.png b/static/img/icons/aws.png new file mode 100644 index 0000000000000000000000000000000000000000..3b53d8f20f9a6fb407c82e7e219369729669ff47 GIT binary patch literal 46809 zcmeEuWmweR+pQu<2?#1EsZ!F9!YCnv(kb1gfWQph9Ri}_fOL1q&_kz6m(E$f8Gka>45)Wo4l5LeeGItFyYxdoNL#FuSto%R&l<*F^TJ}qB_>N6BT*eb-V76 zEcCaG_lVoiPhTgIheMMNn;yEI1)kMw)oWvHj-+?Pg(ZE2SLzNG!h{Jt55EcAe`wrM zx11=j*U-z|%fNk@xR*Fx#juc|oO=eP`QdX73-6)#fBfQ|f~86X4=lPZeC;~+fBy0Z z|9j({`2X}b|7dw*NA^vMSpVNY@fsFGQ6=tw{wT~3`9}WG$JqYxHueATIj-TeZ~fmN z0Q{>o97%%*lY-a*|M9^we-y?Fbo(DZws52AbutZcCz7T||M|M$Ux8Pm{r8pr-KGCN z3jY?~)gk%!Ed7PDf8pUTI{ypee;dxf@bE7@{2wIeUwHTz9{x{K`7b>D3lIOF!9y+; z4b5NWGs0>;)A)L{+M>pMs(R9O>d|=l_V1O?x)K?|?NK%y99)LNt#`EG!}K*HaSnRP&gI5E4UBRgd1MPoFB)sKx(kZaz+2A1q)bqC!R8M6b)xuUFap z{M26}rfk+%8-t#ZT^m9e!s4FX!sxh0_v`3WlgUr;60^PMqm?d!=2IndwoaRo2~{;7 zy)MVcB|=>KyZI9D6hpS1f=}x9)(ab?;cG(~T4<!@+dKiQ{NaK&x%+7Fsd*c z2Jc!Mstf#exJ{3L}+9hy8eurKP<6~`!X@3-FAjOdm8m%tvpyHDqNB9?g>%4GInPgL%5 z@1(EZ0``C>xsZW)jqA(KdAdl=b3H4v9eVI)q|CxtY;)D&Hy?Qmr{iZky!nvc6B1L( z%>d!xet$r`O}Rt0 zn)kh|3}r#h&#U)IyTMAFSY{Wonk^Blb>${>+I|L;qb_=Z!N{wRC z3NTF@YL?&0o`QVm>33tS4_NvUGFkM~-@LbXcL^5;xa#-hS``DS>Gi`z)E?X!EA<$h3Bj#eEta1NvVsT9DIN(`xb*Lkga(+Nt@7=m*XF$YabLJ z{fz0cW4sdKAAR>BjuM*z@`P{o{`*$dj-lV^xOHH4dimz3K|05$Li!Pf4VQftu-Jm< z_DJ%i`rXjI#f^ctgQ^+J>&FKHtGhosFGDgq)uAvM3bxs!9$2p?y(6V*-oVyZ$BnLt zim6kTsmlc!MSVMJmgG!|+-bh71fE1AR0xkd#-!n86~^jR)FY4pr?7)UAr1N=t2ctH zK8AH#F7A;VqK}F?g)m#pg)51-=>@CI=Bve_`F@zyp&W$++eIE{jqq0eqE z{E(#LToX38W*Yv^7q`8$SCG{P0;4@ApN=APUTLRT5ZZQES-a<QhgV zgCKMp6fe*%HT9&)vq21HEDZC3t9^*lc&DXy+mrTIDGyk#09a6PTI|5`#+POofx=Ig z^;u+7?_>^Zi0G}4eLU{8!M;bWcS|=}HSmM&fJ4|qzVh2Y6QA=Zbln(Oj>~>iSq(%4 zPkL3vyR}F?k09r3#vqKm&?PH9dH$<*EyAs1=Ivl=ojC2?gVUt;^WgKzC8Zl&oX?rW zmwL{$YC~nGYaMFN<`-Wqr1dt0gocJTQgy@x;Ji09MC5GF8}~OaYo?X(Q+pHyz@NzWtCiY7Tt&v8>5LI9gE&2*=oybdki*~!vnIL5(|XvjdH zvLrQd(2Q3MX_*v7u%vlitaG@`Z<74ftKk@_rboLYKTYn;i??%lRlcd#fZejavQb8u z6^80lpWtJVf5!AW zf$?Op!6B1yY*-mePmVko%eliDm6hZrMofFlN*VX`aT)^#d{4pF)=meMff~GZSF$sj zS$*0*I6dC8xb}F9Ih72HdJE6}VDZqlpD(ICSg6;Q+4~{XVk%$iwuyk-nj4+h>>B^u zo^sBk{%P0kuo*7fqpxBzk%5%R)}0#fG5p=1z4aI8I1~-Ju+4q5xnkpS$Ew{Hp$^31 zO9p5eWdJvpm{{|!mzwRLvb{p17w=3yv)sFmovPrCt#;RuUrzkm^<`|8(1lu=!l=N4 zTFuOENu))fy29<=FjW<<7wiY)K$?%tvd%=bERF{+mJ zyV-y;JpJfwokhH5QB5Jq<2V5_x0tLwL|0Jpp1_7G3jZU}H?LO!f3<4z#$YhO@<-q}CkXCn>4!3~#gUR`I<5)O zd2&+7Rx6fUj=wYdJd~>%HYHe1d1u^2-@{6l-SXx$!w<2=%K4s0s}wKHzU7_TvAs6@ z(U+l&s|b4(W1EdE*gD%wvmLJ^dHQ(7U!Ko;CV9es_`H6SMmIZ=71OpqlRosh_f%I( z1Z*17b%?GQqBtF;)uC530>7QjE$QPzNZ$T{LXU$Gv8v8Qi@$UJ4PS=QaA*Z-D)b@K zm{KM=w3tl|0eSu^!6zqSe`z^-$Bwrz*{c12xGT#mN7UDO0W%yu#Zo8HC)*kz|>52 zC+x&`eRKuvEc_Owe}6n$?bKTqs@|zy@bqz_ zDaji|AUX>-sf7H9>x(177yPWtmTpTG8ta5ry9a$KMM}%jPn8PP zbmDJGQQx<|-pcUmoYp&v%6qEd(u_6A7s&d` z#|cx<*d2EPO<*GA!aRPFu;|?R__>}(R`QIuj@@1zV54gEvHy7PThq_|!F@NU_3mOM z-t(a2W2fGift-t2)Xrn5~Z z#G@$v7gdeF%R5BDwNc+!a%ja*k6;lQ48eH(o&ualYo~OJvsoAKBoxC_q#ibSlWN3f z=iI!G{a6w}6t)8sm`z<5#Hw+OEAIK4h!WT5Nb)>Ra6dbKQSf3S-OLZjh`UHTwKAGa z1~Dufb(q28*4Ul498#yATAaZARgL3E64om>)a$uGvT`M z6#K=#O5(^UGL78AC8OA4LjBcK@z&u?S-Nj@za?UMEYs841J)IklM3t5Z*6B9n|>DV z;9wg4HLMW8N!XO!A{`%jd(#7OHkaDM%YWyen?rN>>L`3&5e_kZ>ZBZsUCp0SSt+`t zO|M;R@60j#A<8265n*K(LvUH1)b)roah*xmUXc=q@gVP>WlWy|AH0?m?9aNO zWL0k#O06ngg!$6Otz)Czih>q{ex4tuRFm97CdJe*R}hLEeU;y9C|$zq42ttE<E27Dy^WX4Dbf;HMi&gOlx0RPC^8B%#<66_U7EhplE~Q=IMBW4)gEC6eAjK9W>! zh|i;_ZEacL@+>?1;$XM0Ov-R|tjf2{a`cTB(wqsQ#S@i@s`esU8wxu?uSwRqI%ELw z%br$M&7(bzsi7p&H9|;fnx1>Iva^Q*Y-``DJ2mP}oc0vjoGO)gZZ*jn_rfXyjxrpG zM5I1XGq{V4+P?oD!&F5j4Qwbdr9#S@{3=I{9*e)+iY^UgEO22nwOBJ%_s=(d2s~)9^|#!);i; zzv%V(_e=P(xREAZSvHAwdbwoUCv=7fV@8gghFYQKcByvxdnCGc?C=x{T0(?Q`}kF% zXM*wOvkd0XH^6SSSH;t_d;&!+hWey`s$#>zahiH}9k!vPJy4jU^YvHagdNt5{Rjs$sk7cjN6{meVKI!xG zn~Co-*MHyNekvUW6GLa`gu3PTQR}@-HKWNtKixB$oii?QQf6EC^?4;&WA?>xFVZ3v zRlobAuRxBC&-2Wb&vW9*^mb;NgyO2DZ|uixGLtpMlaZL3&chnkPHC+?iJnwraakD- z8hZV!Dm`NY11f>*;I;lFd&i!<;IT=*Rg99PH1f!u%usfd2vcn$8_Ls`5GR(~7qqOm z47FOD-H$Qbog^7BUfWmcl@oH`p66N^>*NZ}l%vFvAw4*TQ$GLhbMAV2QAAKv^bete zRDzg{y5u&k?oamijm|n=kKbImx=muiyQzN*5y2+HD32cP6uOkb*4)?IwH?Xf;EhQJlzxBi)pPDs4B zgU=2j>dlkzeC@*yNXUWo?n7!5!%PyU^_W-LsvGgGS`7 zXoyh~6lij*i3i`GbIV>s<&Qs{ew*+}-(5hJTpQoLhB#tl9)o?z;J|;%Srw3PC@I$&ULkZOn|Z;* zy^@pP5ws9dJSl5{_t2oIF~qH(lKM#sMk6xe{rWXnB=~JhSD@2kSf52m_M*^z=K^Ls zd5=OuY&VxDU7En-wB0KosoWCjIa*mLbhZH-eoraj8Vz%ZD$szx>3V7~yV3u2^cWeH zMRG#(Y}v($AiaSoLNIUDmr3@qr9VYC?n&gm>1vidRIqSp^yIJo^Wz3y!L-I?YS5M! z8~;25b)t|c+4*za$juzns10a$MCa%0Xa0 zmLl%%ei0$yCCSus80Ly{6=0%fVjzjPRT$WQJp0)%#ONN{7yoeP^CNsR_0kVw@5Xkg z!p#~!OTUk?&Q_G@eR;C{StsnNjy_U;F(!+aE2;L}Yxms5svSP8!?bgLN_`K|fJhYFO2S}ir zd!6VWB5rSanz3W@a`nLRJd#(An^Q2jMjqpuFFP?<@6Hlpkv#l zNk*Z*leKlxrv{B}F5{Yx03MO|g6j9f&hNi`b}J+<7@$#XVL`yJs(t~t{`O!1kC1>^ z(y`}pSaoxxhDv{{pF_lksciZ;2DZ+}4)Px~xnLd$z<-`OhVNa{?(Gu(@;k^)`WZa! z6*Y*^mdLYXP|4h&gyg^7WhLVedk$=(b)XY%g#W zel&WzvZj$^772(PQUii_eE-yb0}VulAsKc3_;{Secy(8`9x0`TH09*b=E++jn<7*c zw$OYvFjnC1*)w-rrs%TdL5|t8)j7LOuF6odq11LM--eH_kJqj>d0 zS|}e|42DX#B}6|HPfJeB{g73Y)F>^5Dh-_I&9U20R#OO!tS&_!i&rF*^n)>1_>UiNaNYE* z`uxSjO00LD)kW~@Xftpw)Z3!9M$0|2e%eM*6s}LtP8<`mk+jTm4@zphO18NlGk2x( zu*iUKaQhDPRl=*1<#!#7xoV|$VDi@N=V}j_Fo(4XQMOImCmPZ~?dj}hv?>{!Qjp6Y zMSByTbX$&R`{!hqkc(4uRD9J1m#*6u@CVCa106djB(&_|#%yW=dT)*IiLQOP7J-aA zyn0?2#)12*$R2tNKfr=kYauEtpH0~;XYj?07N|^As}inGAxqgD=yc5(5WX4Y*26X{ zIzP?7AZNX`uwRA}-y!E2hIm-_^)I3;h8H3>(> zY0AqS8b+JhD_b6!p)J7RD^26O9uZOldn>%m=c2T!wX|`zW+cEug;~c&DvYh#_f{0c zTOTS&8!Qz4Qkt$hTwFtLZIWe@xqu#1Iec_Ev_bVC3^I-8eM4k$-qMW`%nDp2N7X>H zNe}nXcr3RL<+FIWIglKUS->g(!Aw_kA#B{I4~HULYd4C#oU zk504h(0VpCaRCD3m2y5H;2R^q(>u@bE?Uf_0;EF^#VaqD6` z!Cei;g3#HVvLCh{cLa0ScD*9riT6LMJ<}t2h6O2eDl2*Oqc|wAL1^`?tU;JG|@b>{Zn*1p}iH-|J3m zj{_{LGf6chf-5O`l7m$cx!Voz^z?9Lnzs(@tHX`z25^Uj%15H3Z7;i5T@8I9&5;;I z2;N8;d;h$*J)Hc`)d)mb6mNfPbm+6A`E>oj5U=bAT!C@7|JhR2+HL8@8pmx?n)T?M zRg*ebYL|xG$w^oHb!zF6N4jaStmf|@^A=JyS2ZKzXE(;7vj;}7va~IF&Yp90mRf;k zR?X-jW*7t(v@RloLw@#5=-#W_JaU`Yz-2Qsgp@1~>w6I$p9piQ zq%A$jW9STH_*G8y=WCtK>a&x;BUuk9X8z{X6VU z2M7GEBh~Ax6JftP*o5Z?JQ7`a8f=-kA4pDhLxqT%1S32g;bFRE*6T_r#i@1U1gb3< zw4&L9Gno8V2GMDLP7Waj7vZAPc!87@?K^GFrn@RxjtB#Jrv)A4Yu_=m@c&xFJJ^y2 zF~13aU4iHAGU4^e?hMxlX<8pSpL7upVvSnTG0D>F)Y~E#w#Me4iz%Q@y5i^tk5dwL zrX=%r^+=G39R&kO0}o>x>^)Dd59RCl;X8&CQU*x#KKA>p5I zLXoxp2UL)JE`A9z*QY*<2W|Dhyq98Q)7)xFany#)IxqihXYzY}>u)9E;j>#}{XJ>~ zV9Gg&9@*R7)eV01v_5GtPkk88J7`Z|NWDkS9-5l^zV+wkcwWt5zUIaIi7&n4t2T|!F1dc1*va1O@?9}N<1Vi+lJR`6^2dIJIJAL*-d<$nAwSG_!(mM$axjZ z=#6vzvV(LVcM|GZ1pNlX<=rXAGqh)&8?T;3^1bZ(qoX}5EWw1mtKN3oS`<8)KL763 zlaob~Uwa&8b>F)uAVkD*TLyxaCk|ipiCMdGC87Lz4E>^9uF?FuT$G#twXM@p1JC#gI#-dmu`ig~P13?oG}0+$!9Nl5Wu z2*-SPf-3`2IQbc3r%*1dGb) z69A`*EpYYouzk>v-TpUQmT#pT?9SOPiTWGfzP*ep5X$Sz#LUmk$Lj~s8hC$ek{@`t zVkQj(P*5@tA7evXo2#aR=E%T)6a4Tq^Rr~8!K!++FGrW}e9q>TA0fxRpJdXycjhni zD_qg{9@1oB2~lGCGxMvw&3+vKI7#=*S3xLJ$ypIH+?%$s<#s5m3HB%*ySR;!Rd~*i zF@tQpt4L9^f2YVtTMUP8Vyne_GBPQO@$t3)}`QJb7==V}d|UotTVQ+|++q7E`_ z&V|^bnun|F8!u+PkFYS0eF(*#xa_8e4D#H?{ISu}XJq7lP2jESmoF${Uh$7SM`%@6 zuapVV4rBppyL=?#uCcx3RAP(;jrXuR)%f5g7CoB~Z!J;&?oMPd@Eiw7BV?H(M~2MUkVl zy(dx9frWOURwNPYVl;8v4fHxJ8mD<&e+(O?thX?e%LNT?ue^J4p}3ECTP4| zMJ?-=AGJ>+v+|XliT<_&ZLo`@9a8VE4kkZNt}3&SL)l^F)2+AkJTBOg1!7%y=5A!dMc%?LG(I=@F=&i54nN9n|EG7HxG)>?nn!t#|Y>X`zy|?0<~67{;FbA>Po+^Ruc&^n`j#vnb7mDNo`rD^a#H@ zbE1Bs;Ski=F^SYx%hy^j9IIR&EMr$Ul$N4hg`P{OPgNPZJ>V(Y?&G3DpC{IxF7%QJ zaWE$dNM*_=nW>m#`(kS2HXmp^kF&VU@G)z84eOPUP1>aX(deL}Mm5Tdz!5uAYdQO! z@5$Jffi8XD8?)c+6j{k?g?hT75=2Cd<`RW5)=Mlwkyh%nooe}!Fw1)No)~AEFYGl6 zEV!7Zn<=`6pa1i&``=47!bW)iz>79KCyKe%2Prk=>Ez;g$dNbIiX`5DA0YPSXxKl_ zWGWiGTUNGTl_4^8f(E{hQlTXc!r`XUs8lN>#&O5u8~SXw#G$buW0c^0kg?moV3ko+ z^!sxq-c<=Uj$^pjq?hPlp3?Xf>nAR=WOr;apa^^ZqntshEQJXV>?pzyBN2rG)rk>3 zW`5P|AN_SJjjFO&O)Y6M<>>YWvb}nv-p0>dqPTm(kTRrZ%T4wZom0@unC^|V)DM7gDQo!VCiyY%|!%$8b#;NYUdv@{mGtnyHn3k(7H8;ZETmG z5}|Kj>2p>sJwHCnV*vx3*J*}KykKpwUEjlW*kNW-zrPe>1dHkHk>wb_#skgKcQrSa zgtO_3Tpich9o7el(+RYDV#4@(BW*X>LFj0pXYM0wp4B#Oe~HULazUSq?WUFuM)5kR znYrmgzh1^kMd0|;|RY^(dy_@dczv93JQ#OTf&A{XhQ#PS5Z9l8z z%x!VPnHY<92?>nacU6O?A2=Y;VPKSTUrA6kPc7o;`iWy4w*^f;utwVBqwa(z&`^L; zTT$A5iO$L&vEn1SV%!qzzg3SeYTb`lN(+tq9h};J@0hgf(;mllm59%TboCG27{t`A zGe~en9-e&reAOFoXR9Pj&5HvV?v?Jf+x08Ebx1z{s#;fbk6hZuW~Yy9{KDf$WBofu zViB6Ud(tBIayhqn$~WT0LZg!CR#wZCoF+yT%cIPke4rfpLQ@C0HGvLwwG+BEi<2bG zoxk#|BAN_)zt>!zR089%V{W_P@YZ$ATYtb;dBH}Vdc{etm4xM{M;e6Q?&kMBaY1EG zA0Oi=si?3wqxOl=IZjgTk1%e~CG8Mmc}?l3>tKOy=L=*`5LySJ1z{FRH>biGw$7<1;$tT0g}=88AGI)w#&;!->3B*PCnDEKLC^`US{siQT?Yu;_JKvf2q)awsr-9`@|MNOhb^j2*nnj zQZb*mgLPZ+6FQAlJXFoVGjmIWdeuTI02C@mqu1h{ls~!b@9K z5jpyAnb>M?+)W89PX%(UwzukO7#!HG5uW5m-P#Y+K9L-#Z?BcczFIu8My~6ZG=LO@1s1 z5Evj=pwEdc)Zri`=ZuJNmNA~4TP*n@t+P2)bY6S%Q%kUXd&CT0z|uhR9y<74jU!Gb z4#gn`w_F)4PO#tlEzhqR97$U8N#+>wVm<+rdDQOoszc7lYX?Xh=-M`oTB>g6slz$D zdNenjZxt68gVE7p(V8MXE$+cO!onUND{lG*Ykj8aP0Wkwy1tJr?NibQIZ0_w)3ymO z{~VRRo3zraJ_73PjMp%7J4GBTZ?zmcX3{Z2+MgOz6}auz9<6~X>jAJkF;gPHF#6!^ z?L(8DXEDZ`Q{j;@95Hswov&c5$?cd}C`eQ_9Ue808RzbkQm79^b*))$R-=H=v)YF& z-7l)Q94vahI&d_0)5pe8yp8Je{P(BOH*AkN3=^~c^5O_P^1K8n zE!8hZ%M(M_MCzc_XO{ttIds5v~Aj2(OSIoMGT5xk$Z7@klw5Q zlWMjEr<#-*+DcTA)_sm|bvP@4+KRDsQ03jd!4#j89Nv6#pK?fKWZt03zm`rDxyjV3nDnH0De1V2R;J>@E zQM53XnbZunbf@5g0@79Keui7OtWJ{YB$wZ85t4I+Jcil0L3TU44b`gM25?)oYe=eN z42W9Kzu<0#C^PF=%8^df$UjZ2S7U4|rC>i0OmyEeo(?yTXj39VH{tyid<%G$rwtKp zHtCE2-@G}n)`aG`O-wp~zuOj0=k?q(Jc0wxsoDm{8qeq*g0^S9s(_1DZ>9UbdLU z13}B!J3AOO(gU{9VzVAS2W%V#cU1XO;)}!t@P7Qt1LD5RNw7fhoXXL-lir>R!%L%-ok#0lXOiezYegR% zrGHsC95<(Nw&t69>G>ySTd_e;_kqc|j!HW_@{7;7vMCLW=gLAN1+!JQAN=7<;M2Xp zCf9~x37*caKXW*dwZfJSPXwq_G>Dh-9)_TQ5d_Sn5`#Xa)#=tmQt76$*TX03Qffci zdqm_U&V=OJKUeKhj6HDuZJg81GQqF(@}anr>WZ^0I!?3jJxzjZ4!7=wF z*$dQRwh3dYd=Z&uRw79JG7#@?xSC2pLaYEv_tlAqvYW^FZvO@$Skh{jZ2yT#-hK%COo3xj z;P!MYYAFX9;|iU4%^~8etSMYo&Z9w2QBfOZ#zk z9{lqO!0**@Bs$%Wsr@+2GMuaaxT!+MM3g5;9CHpx!F^{oEdCHCuuY>_10T{mc1+~& zBA-hEupDh7)BQ#8jb_slONJv|Pbc3gfgZWk4agYH_5cRzf8In}6f*b4if6A|v-w1< zE$ufI(>v@y3zvf{beRvQ?eeVFiViyH)8C-2=1^|5p`@(|9B;MhgmZLl`7o3Wd*U8A zh6O@MdVq3-*^uX!$Me3nXt~3-NW?gOWd=_-A(n-9MYyFde-%0Ob<_3s9?f*5Crw(R zif?>uVhoR|_j4{90Z8Ofw5Hv}gP1JwZnzy^j&@`~LZL2ZS~j1Ng$bQFl2bVtZ+1;? zY6n~HOD%Wa2o_?Ct1u7bzd?x^c0@l0epz_pLoh7*{KSV3RRGJ1cdN=1Xb`*m1YRuG zcy8wBI^5LJ)=}P!D0wsZab2Doc&Sir1=smZjuPXz3(*>FFndiA29ctKmFH<4DuJP1 zCp~QaBJ=htY1hneEzLCf?xNh1I!2VazPoLCDLvP?{J?v)0{aBt8~fMgEP%Se!NR~5 z2Ea;O*pm9iUpu+wele6Fv4iMM5>~BKs`9i+^YGbZn|;w0aI#KadDhw07OTIsE?-v( z5@?E4+LboxqJQ?A(gcTAWFmf5yY~AlA^F^GcmDgk09Y^4LSxJ$+ks!dE`qda=zMSV ziuSk?!lwO7aU@H4PrrAK&%pt)Qeok9=7VbOONQRMeJeiu6@|NH(M+y#2Ex;NfXmPi z|LEz^d*bi!ueCM}0y{EMg|@Yv5!9xA`8kGYh86+t>b!h!2gb8Ahpe9VeXpEzK45bn z@K5F!iKEwShr5T{Y6^w8Hpj|rxx+u_oF=17Wf2y9TZ4oiHTO&SWPaIm5CNj-3!3_a z2|mA1*RZBYN6Zm64qJ@F?VzRX$p03ljKDIKAaX!VLJ5MT->>qPEOGn}m2`AXamdPK zjvT^Wjg>IS$gC>8P+bn%%uo(+G$s{2gMkrJ1ecJzE@zT+;$XI-;M{m#nh(_G5JZZV zdWtVdioleYMpX&Z*KQ*LZBH#^8(}PRUxe!Kb|4Tln^4?E(SSyvXSaa8PnlBC zCn_KO-M0Fy->L3Iv)s!|Z#9bgoS#EvJJ$4~MRa_H&8z0T7mPR;rp61S3WZ!nFd+!9 znB{+PN+{SPL6c>O4li1W3r|&bpQ;n)38CNnz49-AB1|^eQw~=AnLO#HNb6@Ia8Y4 zKN#;Nz|n%buyxh!YX(&^+s-m-|8>M|6@lBfXPp0hSh#(>H2-3uig`N<9PRUqoBICj z-}#(;;%#PCQym$WFwk(j2qRlOBEtb?Rb(i#Znv%47#la9u0K~CgvL^`U|Gu3s|Yyr z3D#M??jcj8e-!^J^d^yYHG%%I6lvx6(|mg;R0ELrIT^jRYElubstXJAp$Ieo%gCri z7Y*0Ll_ez8eTr=$AZ*(q746#F9#9=~Yz#kkRs|1McMGZ{6>fz1ps8M9^0SPmJO%gW zwG4B3AL9(Z*;*q}s|Xq;X6Aaf)HB@Aqf4I_O196?ad+&an2Z?Qz;0Jz{YFMc4f5h1 zetyS^nq2YOS)EtAK%pR47PU}h^Ay{SyqWX&>(l)hC?a{aql06zLynP$U_u9G1rc*E zF_sY7h@l)sypbH0N)55i!x>c{CODN87-i`YPOmx?^*b;Y-8>k0Ka#0RXf|3K6Ingj zhCD{?n=+F?KB}Ix4|!nN)J^6!nVV~tNt5Utntzf!<_dQ^o#@&vUg)qOv{tHcH!TD3 z7wbTPy*`0Jb7InO>fucghbjS%7}p_fF}=69+I3{(j-1mZ7x0LFYjH(9n(=F_?AzKD z&lW#kSft?XW7m(-+_R--8`rl^7(=FmpxK2LjTZ_sCIk7k%9055I=6@QH{`q?xQRux zohO->4A|dp02_11zSXPm6?(@tvb^hebMy->(;)*p2bgOtw#)jo_t0MW|24hGKH{K_ zrBVk}_%6ZAmO>x_!vaq8Mz9D50)3T>DdlC3UuAli?W|QMm)|?oNv7qWpc5T z%ht_Oyp>=NvoS31|>{q9|ZaMcT zm`N^HpTE570&i}E$ukyZ6xjcL{I2L2ro#H;#APa43U%cZ^wuN6YRAYRnlY)?1B-kK zZ8I}DqGC5WhKMeVodq;!D2H~%DQ#SZ<({C`M6DPKG0gzxEIYM1>Qu>&RIq{S4D%wC zz1_UR0A7Nm0iU32n^na9LX(r3*^`^AdA;qV=FMtYI_h-Cn}c>hGkz-o z(7v^uBBb!;#D@Q~#Vq}NKNMF<%ZX->O@3pV*J)On)v#8m1hL?OoZgjL@kAW}VHHm; zrbnJJSx?jVIUWz^fi zZ8=enll;U(5H zQYrDXP8GZwGmN|L2n;ih)f&f{m(a@7-8eb88}S6?aZCPpTx0d0i2)0%Id%$iYjs!z zoJz3kpj^RV5lfdJ8O52vbVBYkU2PE%(RN~Cq^8v}kxgfu=edP*a$Lfgy*2=`C`wW_YP%)D&LuZ%zngxftBL{Jx6lT3~?ALJ&@L%V;Oz8vgr z9G*H6E~qtn!}C1pIi_L%Z*u=o3tP|Y^u{Q--C5kNnikGk^M|@>c1^}T&GZ}5U{hnR z8hpbq!Ph<@kk;f%qB-#1rmDAoysD(8QB7fe*!ugY)=&B2&wS|8w{TNss+S`U+1P1R zHDQ^U=s143VVH0NKXP&KPU|V{T4J;Xyz6vIi(6*Xv=Rg#;-EX?PrWJ}eFb}B5A^$7 zL#9me6*0FLdI(p>FGr8d6>flTV-P32RUo+A(J)<%cv(XT9V)4+-5ayB1$oHNV+#?J znSEM`V=;(oWLh*;fYuY8bM4ag-yw}kU*@l$yN=(pRane669-iIrh^6m?2c6fhJRFd6T5{)2#G!E#q`B#r;aN24?htNaXY%!vi|>#=pXd!zg~03@ zNU9{qNK%8K|I8=VCzFvy3I-Ir1G;#jmA3ds34T3l?CgD@)VDZ zL2|^y`t>E4QOB}Xr&Cfr3ka4YLGFVsb@+=C%=i2y+hl&wLrP5h6$UohO-F)9AmCqv zwMH^~S$~;R^EzDl)UQ-Ngd)l1v!eRq(H~n=ED+x$*?dD)pag3ivB~ax!|%u|Lp{

S`$NArdE?=lB|(eRJ=llv?8PQ8R+WJp|8>Q@~i2y_SsY}{##XnTBlKEq8<5ni`eLbwoex^)+sMvjZ+ zNC0H~1pkJN!Dy6uPTS*0Q7bKZXBp^c_a0~}UrFK`nQ%_iJEO0T# z$*?2JEm>0+kjQ0G<0posa@ZvbereJ)i{XFsDm5swJ5CB9Xs|Qf>amEh#Ru!H2h8np zTtf3yG3Zw9!Z48WbE&uCsym5X9v8lW`8>>^=kVpojDooxpHGr!jKxHcuM{dgMdHFW zYndH?L>p^Mp8l4V&Gs7@=>iU66hHA4(hk>bB)NVbt)k|05|g}M1SmWexR3FTCMEET ztIl0hVAJZjtR7#bAy2K&M0$7^d3)ubc4^jrLl)`OMrDIL6kQY`x#dYm`Unfp^zPBh zo)r&D%|&%Bc#$H}RTx@XCZn@RTJ6?SxSLmVT~uLHFHt-?p;VM0@GJE;Tog{2tv(o? z{`v;1>p1FgW8{mq$rh(3h~6V?aFp(^>*J)})m+Z*mP_D9|#x;Pd^@wr}jI87U!ZaelgQzo|#)M3cXtZ_W{ExruVNpTD`knPcH66$B~am{^#}=bMEW2~?l^xa)(F zRUe-c$M&LmwLK!+ZF6feepMSuoVW~=-F zXleF;7F&}RlOgxo!|7cH75LD=gl+4!VV-u&DNNdq|2(^D-^jU&IZ zYUC6P0&D45q)1{G@<1m}*bEFQfgAYqRH|T*5Y~|R-aQ^0Gk&SWMB#}X)+8O zX=ik$%Cp%6s)A=sw8}SF`v0-$8Y~wejiSgR&Gm07EwPKA;Z5y&j(T&*5%)rH4)UU* zkFWa4ghP>%u0~_Rs;}i#!qN~Tw0>C6GX!%9makRoY;u1dc!9CBk9RPG$pSEIwe?Ss z2J(UDI`VXetCag2KAZ7|B<9NS)17F_&nM}zKVSKPYb*@UpQGxre4nrkiq%K4YqOjl zEaNCDn`SW)Z%~Z+6YEB-g!oUqupE25{=(8xGG*iakl;(Gv(l*5E>wk(2dbe@+i+>= zvL4Y8C@mf5+NED9>bUuVG9~9+LJGZ<(X|jz4b#mHUzFnfeo zhFyo=Lp&s`SqglK!VNyihMkJ7(4a21^1wdVOyVMui!~&&= z&_A&uu^(V=ESPVL_>2wEJLGp@8Mxo^gZy{#C;8;piJrF7$yws(E&@)QL9RDyt^*|p zC3^lMNJ0FavFUxEp-ROYt0VOYDu#O~KIh-w1k)9J-3kdNS?h8JstB#2v2O;I336Ha zcodZbS`+67RNdNkwtzH{a=yicG=Q5YX@FzZau1jXK3KC`CC1F{?X8UCnmVFU&6JN0 zoU8_z;5t;-@0(-EAP{9hoS%{gu|DnlK8YJlAVY?`8i$HbymzM3jiJEhn*zba<9*w> zL@R921bSlZkEE4bUjrBW346f3zt&#Wn$oS|qWYwHq7+QRrcoTc?(_FbcY%IYHrTE| zFEL(sr2l9&mH!10+Lq56wYNn%>5HgWGk4M^A2g9|m?kJl;NS#CnvQ_k_|ctw|3wFQ zB%yKcQa+!nggy&JCdtV*aiZ_Nqk)7MZOJ|!zI9#2dqdTBgi-8H|CI`c`9=k$5dOo(CB(QWLYcg4wgqd8rJddvKg5odmpwT%>EgVvK@y~5e->7qH}@~H zO%nT@U=Sw_xZe+kXfT6$OT2s?nj^X{`Bn<6-&qav6_APDAx=4}=N7~j_Y1g0k}-Fm zs#OC)u=XOu0OW+bbZ4A}9iYRZiIe;wm79H!;Q>Fm;6f`UlSBnAeN$Z!F!UDKj<;5| zINu0grLzklrizE~xQ{ZF1OJP?xBiQ=Yu|+xK|quc=~56-y1Nt!K|rJ%K|or%!4Z|A zJEWy+2+@_Ac)u6?V(FVQDeft($G>U>D4NznHN#NLe-CM zJ0N9<nFM^z4X>I9PW?bPVsK>p}RA!eS5qx&eKvB)bvnONZR0e z1-j%!-}>4hLlgH!j~oIk=Pv1-I4fB zL{iP|QVIG;^A;luT%5r5<$j@Rp57zy6P0TI={3VOUxLhBVV*!2$zuZk^35%#XUYn0 zJ7e{h7-oCKXb_x4x6OS>%J#w!VFwpMO(7{1m!3zJq}Gekfnv>KEyDro`Vrl3oW>W| zHSg-(%Ma#PkJHgt`wd)2nLRDDKi81R;L%u_h2M@P>Jrjyeq)AHwV19L6zm@knms9x z^W5MJ=H&EQ&x6JxX$<_|9YyVtiR6roSHPBXsQy)-_ZbKa=v_izar%mh~QA%-4qJm%e7; z4ojd$ql%$kOEOt$+emP?e9?lOz>nmMX03O699MZ-#&Q@**UJDq&`CU=)3o_SkD^}+ zHBTk@o7wM=rlbew_+<`w}Ph3ziXqtmpfV6O+`?>%q432JTX}OmlpXqk{bXi$4c>ejX zmn`!<>Zx8cV8&g(#gdMksX#9>jz7UwE^Cb&hq1%8N-Csw42_VY_-{ZyI#X4>BHlTmiA5ts!+k9ERsNc86E7Wy~C7W@NL#9sA+RJ*O$j)y*?Zdl%_FR zKDjRIwSxWDvK-UV*Vf-%1C&CdzQXVt+%n8tyJ$8-FF6A ztAd-kc`&X=)GEjLA~o;Lnrv2UaOoc$-gj&-R1OqiQkCyVVp^3Ey>s+J$OXh)dID&N zy83kO3HdyScIZGnqxWHO#c6wxZ{4yAl@@@0K=HcS+A>gWi1zT~eA#P>wG9FD`7hsu z^7d7!Y#Wh3Ji#=iAB`CW3c*)547bcd^k!tTUOae`B zCz`K52j#|=I0Z*vE=pHFnCEM#MRCP!_-Z$&7yJ?(FKnuLxVkc=4%1e1cihpPpQ#H0 zZpEuiZ~{5o&g8+j&@wT!%X!v9)p*rxhTciPKfg5Fz4~_0HNt+@$a~_p@ypod12^9! z2bzO1`Fr(~m(N*P9`UxA1()BA8S&F5o$Zl%SJ#g|ju^ozXDp78aj#B*&V7Q=_#}hQ zVERJoscK{4TrCx3j)n$>!U~Fg&;wOxy1fX(u24@1?oJk>D50FU*B9%&4h$tsHHQa4%a{g z-~8)FW(57uD1vofeHsX$*1Y~SgTjNW-<^`Di5yRp>wgVt<5<>rP^oIwi5A!_Ey|&* zwup>O-yYjBmR*#nlte`!B$@=kGCG{FZ-W4h4TKM-4Tz$^+*phb95lg}U6<(F;IlQ9 z`1mBhsoBNVDzOL-R7N*&((XV624nh^yA+c0yT_dvs-fi{xyvhJ4CcJQvoTvzuhMSG ztTFNI7pg;v3pR(PqJ@;xfxinsL>oZD8KI*FTUe*HN%j zQK6x`UI%_?PSS-VwFMOq6%G?4?$HU_?v0qT5B#g2Cf9!X1nuVr7lv7o4UST z^H^DKdvW2s=P>*f43^k{YYdEBc^Hc_#WIwD1T-?L)l%5hynT zodu}S>|IoloIcf|TOoD9LbVk$#hYk-BUuyyX1qn>6jf<$(KIW*&lP7$|MSV1{O3p^ z%6HJ8>x-A8R7`N9UsC<0H}P|viIVf_3k|2jvGj;%ghdT%t2+MI!=0$|%s<%%%Y~QJ zkw2IEqb_MY)JNm}DZwbfaBG*VbAsRcpE6urGrxN~DQ&HV#lP(On~VQc0N}+~!4;K@ ze~U_(jr))alTRG@rFf!-4jSs}I-^I$8a#HnIajVeWDo5I_j>2q@G%$QVC6Tdx;yTa zikM+h9Dn(_Bd>N3&17SxDvVqZ$to8R8Z`7F)AoyUYvfbuk4y z{whoMXG!O%P6=<|M9K}q_<;QFyiT%*9!y0ORDut*Q&}}Jox}LPVy(Tcb@o1=3tBQcobD| zvV!>vx6u2=cG_Rh2 z678DRxZ0-M-zu!#fN2*}UW53#e&pAepup!M!o|mX-Q3cvcuty+m#r{s)^q16oiQD% z-mK{V0gdL%Lv^l64(CLUN zDtR1j!c6PK*w8)b;kdlwZucJUqT`)8NwI50PqIIMqC_R4EBfcs!2N7!Y7tBw7JpPJ{e(e#gl8?&vF`yDX5iSr zDisND(k?emn*G%2HJmS_Q4Nan?Yps!rFIN6ww|%DL;(u@gOgjq`@*fFd~eTPPt7AO z8JLppGP2x<=7CAE9jM9`&|dcfG-jw=m?(Mam0PI6X||K^2|*1b7cV`;Akh)M>-mps zMAlWtKF$|xQ^H$)>_AnI*Y5&|I#+&nbP!_t963{q_o+6(;&u~r{Y$1N;3rI6@H1Yk z-6p_EGeXph)QaJ3mY#kYIKgiYpdz|W!~*?%G>`q{XXMwXUq|^PC9%TX5uzptL8K@A zroTRWTXZWWa@J$whgPZieKIcBjaJa=$M55b zZS3wQ<83r_AtuAS>N4kgiMJq3_m=&0{lqWn%jLU*C^ z>&3?utHs#ruQsdJBftr_T+7NCsr?M55YCFw=|mLIjqh*Kc-7u}#k$qHHvDi1so>PV zIb8ua%|Gi?YEYTjEvkT`eQC^Ainm zwIfWb=sOcn(9kVd!H!^lN^98oAHPX7dS5Rd7kS#%ozkV)v~TD*_t$xh*?Rk&M9?8i zN;Wzu*nT9Hd&U2ZMhhyYKF!W0ffwo~KY-*OuXc3d+y#Rx3!debez|w8F7eNwht?In1y_VcYD6sHXfEMb#`oo z&hj^&m_*APn)tGNEqU0THD8K9c|VDp;H+mnkyIIKXDp*pA#kusxtYA6rRVA9Y^0B? zK7s7Pl}9?)waXBXU1$kwmBCflj4rM#%e zIxmS`M)HdvmYm8Y*JlCod~S-zku`)>N1Hu-JZOUEm*xKM5>aawE2S6u$>GcXVal0= z$j)p3$jbUZ(b4x8Ea5lJ5n6Ynw{;1HoYo;q)-77oJ^^)+X8K>W-Fv>xZcTQCQY1tS z&y1C9UA!@jMzeLB>oIQhI?-Hl5Rv_S>o!^scpaWqsdHr)aYR+^+@s}lu9ICm^lJ+d`>@{W%4PULY0*LI zgwtL18~mRk@|)TxczynX_yQc(Wd|`6^#xE(^cO(1&fsUk0sFSSNi)P;3ce)2C%66bo()zhvvIG~Oyg5HaF;;_crkhepN%W~_!C<SW1O)qHK9B{l2kvA zst{N2q}LUF5ntS2HTk|4=5Y`aB35aGoz!5oQ?65Qn&7l_(41*pcNlVSg1!9NA3g+6 zoX>ab>T?GAuXJ~TnmDRTpyj7uu_=C*NJ2kR=+T-#4dEZn?I}lC7QQ$+r19i-hG(vQ zn}T1DPpIb=pM}eaz)qG*YHryN?bMXnJYQ&V6ycly_-^^BG1YYHi#toHJa_VSboe{< zr{h8?gc%gC`(uq~V3p5UdG_&vMCpJ;souLNqoHpy?FA4f)3AFC9d1rvYae^0)H??n zB%d^vw3||#=E1j$DsAe7#@O>;&U{#Uu=I5)1ol!xd)iMDw?GBWaxF$%b${6@*Ef1= z(#aty)r`{nZ4hZ8u{sg*!EuI?oBzRp;!Vx6n$n<1EVvl?1Yu3u55oMg@gMJffZ)|% z_SyA@`-z_0!1AOoYo2|LI zw`g54En>e|ylLILu3WDeq%K;ac3i~P!+_^8eUpDL{jBpl9tAPGcrzxw6ZLwM%PgOw z_)10>Hw`ZkH2%kAK-LaflKgK$*a*7Xo5fG}@!G;=C}-&jD%pGM4ktCl4#UqTG3SS( z+>OuinnS%8c6M+UUTbu>$N3!97iCQ|CWvi>+c%0nC2}Zo->O*gmG3kzn#&j8VnHI^ z*I!(+?$}SvH*D~-2kW^^H&`weIV{MCFAbjAUHJGU?Hg}Ves4f2bp$wqXiDNFT8Y$6 zwCl^$Q1+VvzeT|TclWVc?Sz{Zw1vj&jnnvK(%zowWbbu|wTr-F*qtSQ@pBui`V~{_ zMrTHLO}{B_H-ByZibPo|erLx_Nw}MzwWUgaesq`{e+$C9pT*`aU8OKx}8R0TlL~<8xszVZP=?8_4sK91oBxT z6#Z$jd)vxya7vo`3tk9M$*TdGc|x}}7MK}YwdpXs;pLjHS6s-<^69; z-p>wttJN#aGQ=AOu2%3CyIOnTcArc_?qK3V)04gTx~X^1t^tIZTMf56nTH6ReGUn2 z?iLCYf8?sJ?VZU=ND9WMM<8n(t~T&AyiaC->AMVQxc%OeH#kcaSXzUJiUexXNdS}` zzgKp`e?ERPHwCo!Eg57fMAZJb`V`@WUN)Ckp1sWX2NdK8&yoD43GoX>tH!<<>kW(f zu|3uz4=wq^=vWi49S0g6`(-lCxq1DgD`O`4y~Oldk150p%x#q^GJ8MDqtS}KsDf<@ zM|vvZ%?-b{sYXFo{hP(LPW+w`^|aCX+R90*NCDQqu**FUIC1NDTx&$TUNE>-dQ6WY zW0`l@thVV10-tn_ku_5>x8o!`s4mCLYhPjlc^&tW9Ki7TBdE!_DH|vxd zPMhsGfqh>@5FKvrZbX3?#$+c6-1QJ%!%iF5?os1lQ(|) znYKR}aJLiLTR7@|6-L-&pisV4#!FJQHh;OaOp`<{ez`)%>DAH8>+{p>MDB4cw!lrb zOlN|@<*%|thc`w2f296e0DfQr8qVE#0ijlB`h@VpYcp%`e0Q~aY9_<)qh8z-GSjZ3 zvbga19#Lp=_`^VU&lR1e?+G?q8)vXhNcwO=erO$XCt5F{Jg=ehuq3j<#lrKCCER?C zUc()>GyHCB#K$#4i#haOl3Tyq{;G?YYo`8=r(uiGQcSOD$yJ5R=HY5zAb0!)(7J{8;2r5HE*NANWz*d>Pwh`@mfKP)wgr< zypU&X_hGC5mH+f)&f~O9atS9bPq<;u1$k#bO{1RGrrP>|JhbP`&UmCC-=*yj5!=`L zj^?rr|CF=YiKXQc@A<5J*csQ1O}&&SVkVB@t&_SJIielEKw-Rb~hmZjQ>F(?$_ zv*b{69FriL>(a0j+_V#!-Nrs}rjoedDc-r`GCP%^;@X#vCLc@L$aGDqqvR!zzyW%p z`VttshpnlE!0!1r!TTFI8ctx5bc|(k)^42zX4y)41}AB2(uKaN$1!F`_4`RQ0X_zv zQ%tq-F7ZOEU9In~e^j=u1Fn5gO|7fH@FkEf7%!jeS<_p55_T1DfW`lz- z6%#r-`ak1Om$jeq^d_SLMUXHo2k4zoe}E3Q!=v#SNr1ej zx#8&-JWYwt!yAo#<^ouqz)23>VwY;CDNOZal_D!U;%bAvA8PBl78U1wDyp=8@%i>0 zfas^eAo}`s(%jEFc`we^osGk3dd}_-eQb7SLS;u;?XLe+=~`Q>!x|rbE-%jx8lU}H zF)6p{XvFdc?u?CfuRF&pJjE0O5(9fFU6-XkyUr+cPRo<+IMKB~npL0P!IPs&>$RO&(FJCd@yv+=#xwJ~q!||eIs>Hc>yAd_rOFi(>uHzI;6&~U*=xa{ z4qXtX;JW+;>B#XSl~axBiJrnb2AgW9gNTf7cS6QC>e}5$Zfoo)+{(o2O%NAntKQB# z>uhAx=DIw}vn;aR+OEwL2q6H535lu_O|prUj5v zi+*qrqN{p7+h~BVq3flmVk*j0i&*LiQN&J4Qc=jSUtG9z6719wYJEbV7z*BqKFtzl zX1tQQLvpirP_^BizjTma$ZU@}cXNH&i92IWb(#HP?B;U!hpF}s{<#=xk?5Orz(%H& z46C4_*Ss<`onE{F3inzHUZnjieUx`%jx;nwFKc@0E*|-)=4NDo0it3Aw`6TsxP3Lj zX11TLiWoct%Tab=d2zdK*pj+c z*Gi)RX9WxNesagqK9NY3$1v@Sr*az~m)zhZY41N)SY_A5$01>P(?fUB4*JgMkYB_< zE~Jw3S$zy5t9PD$Z5xHwt#{!~zy|~q&-w{@2d_hKLo(W9x3BXWggGupf?z*5jaPf) z#Fl>2%RfBKx`ij67*h7Z4%BD8e{u1N0hy>>^--BcPG+8mj^@q?r|VuSX)>P)X~{Av zwPiN#*3vL0+qq6hFDQb4dj73 z=YReI`Tn{4+dTIF_v71W(Zpd*c}IKel>hrr|ML%!eL4L<5BSfg5}CkDViFY*lKHQv z|MQ=qs6_O?-}%p{Z_RnyYkRXipBk@(Vz6rwDa7~K$?jyZ-Q$~nftOb4O9XwMuXa+)O2*;gMvwg z*ygf~Cxr-FC*(UX27J`$B;4E~e_c?{7p&T!&3w z{ROOxi1Lvht;B*I+UfP09lW49mfKc=yCRuz->-F;>#ODX0!H%7e;!vRWjIs^Wp0dm zsF5J0dj=^>U+}fAE(k1uG+oCQHAjkk1CmQ30+K6e%qM(YECgu}R6h+O5*J%ZgpQ~v z`1#a}8YQz7>SR3p zlR)YGW!t2q{$Dx@B3Ok$EYgXm-Ox)m%U!o5m=l_0$E&(+$aoU`2e=)B=(o9x<3F!I z0v`BV!-YMlr1vAvkFO5dBDRdLjV7Rt^+IERs`A~|oEZM9#^4xQAVq1RcX{lx+T1** zo0%-?MMNYVck&nSWO#rWHWSA&JAsc7gV9aFYQ%kVvXVm&T4y;a6HGqN*WLN6q0TbsBhi*Wc2AEp!~+{YC*X6OGtJViTYRpsU%gNz(^MnF zz6PGu7}^#MrQMMM-FH~&=GyVmP$GWqS!?d#B{9K-xBSo3UZ zZ8twj1eY0TY#c;w|Msvb8hY|m4(=VpBR{%#3I#eTM-q_@RP}0Y$+_#>Sp$~C*h$~P zme8>tv3)Yrjz?a$-oyK~w|Doxzw6j+i|-@q+h|Ux?e5a$Akk|S40l-RLIlN)X8U3O zo)-@Y%*4ePCp=`{2v_n>d{X}_v$qjVD=Dnc<9CBh7K(R+bVfleT(0SUf%b#g{)dnE z;+n301jlQt40vr9#(0(tanqh$lu_a6eA&uC-R!qtn@&|8{I0Y76s_HOBzT=#PJ1`h z{YcYeYUguQ!S95&F*dP-jvj`&R7Ieky;n2oJe7l|v z*pB^;iSywS-O1U}XbYJBkXMwmrxDNrP2=a6E+xY9TSI zCED*9bnsQ#$Ak`ej$Jhr`_> z;P8O2tYGV&%|mnlM6#L$0}c#`mo4v)_0(e!me-X=MLC{PYsAU z0U8M3;M+}zkGz2$3BOUBZo8&UK0eJmk`@O-FMbIuG10H8$Xk$UY~7PwXrS0+viaqm zyE0aX@ld^y;{*0d^1q6o}ZZYEz#ARuk=t~7%oWvFsLi`1;CXx_-)BwN@iBM63rhTwyUc#z#MuN2l zk+D2kd7POc`<YHR^_=>I5>^yw=2} zT4q?%SyT2XIWn;UAM2mX>HZ|l$Ro7A0TxYsA}-vixptUMaztndXX5EUz`gmjxG#TtW~Q$87yZ{A zUKfx@aHmg&dK698K~c&y>uAvi*C#A7v{|bWdrUuC;Vm^?zBfl8wy`}cP{sAna()3w zAP|>LXkpQwOx6#X6I*oCC|}bq1Tut(VZ}klFh$tuB~qo)bP~g29wk$7dK#?>)pJ-! zd-YY)ddJ@@zu`Szd(p_^Y{Q|8GGf60Q#Bl%&W-b+;7=#3x0ZV17zjRA0tCZ7%?|+% zP|L7oo?xI_z$j@>n8M`d)p5rNts?xn^$)K%ZKB9sD<9pYe?=A3v<{n@Na36*M`#zm z`nw>YRksJ^fmZ!&+IxVyMbJKj!SjB0eM-9-TRQLSC@42>NY&wX|LJSIe{E$y&V7R- zFE7$k$;-kOIdBB)zQ8!r?A1lxg2dmuPfBdpr9^uoP{OUFRs^-)G@$eLacyIF_U}5b zA?`C6DxLk;QwA}?1?8PU`>Vp8+8AaOoxlUv$gAn_9Y8U*;u#+q%9B9o3%WeQF2JF$ zR_F=Dr&tyP24t3B7XEXA9}nuGU61sC-udV|A$MHCXWJRA>kIbk1$_8T?w^DJfh{2l zA;AKxSDV)de3o);80M8NBYZ(;E;UI>|J(Sp5onGk3v_1wfDaXkPS_IxnI9&o{LX>wFnujx!p z9o*$dEzyD&+>J=cumT#oHVcQVW8268bn?1&EI07@EX+ZnfWkY@;=>N{e(fEV{Zj*J z7R6e!zo|)Z72E)gD`U*UHm4&)nQ2~v^-6*A_#-tGFCL_Z{C*yO97{+$ecWSgo33rS z1l@r@Ea}UqwMSD#Wii0J$8{h3;PV`20YWLo;`uZUnF<}!kqMe+@`~gA)Hg5^V3vHm zee{0JR@-isG5PSTYT9GOU;*kF?t)|BC4H**R3h~b+BwN|={v6i%)-s4b`RIzx?jEX zW2LtD#*gG(F4}eeeV00Im{@J&;Q+ye54+I;&9I*u^CXMOdKFM6{1S(}7lQVY(TUmZ zE=Zxipqe!}tiG!&m{#A>!?NhlHc+6CX+VJpIgdqd7<^66|YUW=k_#Re2B z3eom;yF28q9S4n?<+p8desX_}+8`@QS81NDfZ$@hZ5EjZf5FtsU0j7s46&GpS_rMu zHU2}b>_QUGwL;TmyK@KY;|Qp)qSlS~DT;5Wp=c`==^RMOy+qUS65PRx^LFcV%Gn$q zpXV`}nUJzdiXp+JGKkgRLe<**rDAt9fE^1ydOvDTa5#dgQg4oO43M^`tI_oyeJ!d@ z*O#p-upS1U(bdlaf4!FvFskhp1jZtEODs4;SLGdbsVVU)uD3Shffl2NchVx&zrqOL;; zaZDK6$Z530>V9p{4!}#I7Qo#!>#jRsCmM$Hz9{>1{qAbUy@SKMvaF7S{uiIm`?jW| z--Z9UMsg41xOo?+kqR>LtYh0NF6V2j`?+GPdu3%sV>>Y^Qi+jbJeDRZ$h_#9eg%|Y z^hnm6pa3{PZ&RBVI0^i+sUXP*=N*btPB{Aw^0fW(y!DFmwGWa~oY{L*_Wse})Lk^- zXJV(U$y|M0f+7Os_#bV7myjU6; z(u&-o+WT7n4puOcrKQ!Gt)*qoFZmBK9(`drecCp)1^C?OkGqe(^f)KexvQ< z>E1@=W3l6ed+F8&_}~t2A`1Ex0329w<%|$K9+W~06#=l@z_NJ4y-9PlP);t7YgN{0Yx2Y0L7RhEhdZ+bJ9iMPhDbd+^QooEJlkD>1mpXIa0#6qIc<8u9-`t_q zkMB=0i}~xbh6DW#zALW*a5PQg!sH@=U0U}D0{wQFH`$zgYJOEnFq1(QTOnKi>u%`o z`BwcG)CI-jQ8DaKBA7@?3_%9QxjAqT%$7Plpd{Y!E{iITW*yk>mw%!&H9jN0xZYTP za1WfsEl3QA$CiH`dyS31E(Fmv*kor9i1YRm{E0_NUb4?=9=N0N>WvUf`&eV*^Mqa57ei57MkEQEg+rIg3zhwp<)jtEq5Z@_y4=A zJVuV|8lDj*dYFv>J!^Vxw)V9S;`8|F+OALe4LJqP+=XQo8rZ$|V^Hpe^A@}U!bVcH z6HDMDFTb}c_LiZo<`Rr7v`(%#qb_s)!5I*MlGQY0v7z%)YeZsI&DPb4US+n1&_Mz8 z!9mb6afJbb%5LBrthQvVv{y|9+Y?7n!P`+|`4!ZK+%6#M$%^mt-otC36C|soATjwmkcUu!r&kio*Dn zzgXjl?ChBe8a}?*D*QEr30U>3t$su=3Lky~1;DXOibwg>nvd+J%xKweWG_q{y{AYe zJEg3gb?JVT?>3lpG6|vJWWBzr-rQMPQG4zxa+8%nS4*|p^|B-vZtSc%#U1Z}jN)nC z!js`y(`6R!Ib;hYtv&3fb`l3-U}6RKWaH0}AgGYRuR2ZRpZ6LCeF;S7^Qm<>thlrrFG zTZLQ}J*r=CzW>LuGy)8o_>QnBcw-C}%NvX#_6v!&XoC>Vx+;&i<5QwWhf5TtrP4N| zqIQ8%C>3Gj;3qO1pn%M}T3A{Nl@AND2a9uztxR)8qkojSRETe$?WWz0!K*NSr007J zLJYWUIsQa0D)W)pRCY+)@8#AeS;>0(cF1K}shClOp1yRLaWX+v-018=%8yw9$jmWQ zf~~`QrikKozVLv#HEXu|9lR7$yN_~B3RbQCzJf7sc+!c#6uIQfo3+P6YWa+g_+Ub{ zhahH?x&l;zmC+e&2213%;f*8#(%r1h3GOv~NAJK|(Ntl!F}xT2Bn(08_)bLAH(*;J zXc+c?_J8|8t5%L2FE61O4x2Q~-_4C9vacT-t$#gfx9=IC?Kl6!)sF3vMSGMR5{q(D z$w772nCqTn5@10%%LYftlX&2+Sy0Q;)WCs%?2gF?wEAE>s#h+>6$KiP-&#Y?x#?_> zdUWQzE4@)=@j5#6@Vv9&fLYnCD2*L34^j7B4CJR#u;j;|M5P)6bb`oY7> z8E*NzDSn8Q?>zy@B!LWKeELoJ70re`@~-?_XiO@0>)&7ACi0F()6geY;Ghe3Ll z8c^}`Sk)AB?@%S>KoTo&-L@Ne2&qUO_ng;40CdE~X0F^}=eOht_(e|eEnbk`&O5)g z3E}`4*u4q!Il*Jy^yp42SH%3aV|^rXk*2rjl1;T&;?+m` zt*w>!S5F(v%qZ*B+r$h)CWTnxTOVq9Sas^wC1G35;pQE)cl|1MulnDBra|(O@AyeC8Q%$_NF2RZg&w^3jppJ!P-OBk-6(H+U>9TH#$ z^&7xb8e6fw^@s5BTV+Tc(fKzTXw}8m2A;nZ(ar~q8s1MI+b;YvrnJmW$EBa=@_Jt1 zbCe@NX^I`>8y-NWwT!Q0WY6uQL)6Fg^JpatG0Qvs34|Mkj|+X)JOtMIp(A`&dc&U( zO4*w5nR9_-)JZ6SAeaSOnhFZvOwe3XXzb?mX|oI_e#t*_SoGc)S<&UUY&FaJFwRZ> z&Gj-<5BG2Nl&tW4)~nycU&oSs6ooOfo~l=tmk7V2^t5Q3Bpy%L%-!IHzv1P8kB(@- zrVcT2<=bZvP*N_NzGQ?JN>QqSqO@bmo`SXG2M#ML#b#WP#`-YqT=3v^0T+Raf^%ap zYEbTX!Gn}!X9GETJk(1agC+FI&r&*mH6>Pc%ipOjU(vI1@sw%P-!L;rJ{fy=)=FTm z(OIfJl5MR|W!L1Q?OAMMR#-a9h&R2GuBgkAr;!!-~GG5 z@y(=g^c_y&{Cqg!7sj_~O^N2gnGnGz5nIput83eyc@V42qc1lhvXQ4L!=)4DOH&|* z3gBeR*~N2y#k^ulaR=JQ3wHD0VgC4MpO*0G*jzQ*T2FcQGxVJE>eMbSl;pX~a4olc zc`WkT?%=b5$T`-sw))7;cw93#J$(Un)h}pq{KHpBNU)Gbtxtw~X<^J=*H%1$f#<`B zc#qoVCj>HCLS`uM;oifrCZ>-Z-(G%}Ai?hS;8=ts0;||qAFO|$OVbuDqvHnxENge2 zALBp{i}QHVqQVQQ_Gso>3)iu%@|ttUp=D(vtlSgH&p6ongoO5x6e-tp&miR{wK@&Q*H*d9t@=-u>Vk`J z)SxyZ)p47K^WzS&UavU{!O0=Io}vSV+P_#h`f}XP=Ev$%18H`}pBYu+NpBxOc($0l z^j7$6-P`actQD+#>VE!qcz4Z>y6)e=6(r(IZ2`$;91LQ1Xw^Xv0rFh4?Mh1zYj82_ z5>FNzrZ*DN>ie`z`^^q0LwyR-iX8dXbVw~ae9%P3Z=^*Cxq9Dv0}mjr2PMX}hXdv- z2hEZ`CL4m0e_OI)_Z2mKfkeI{+CkA@!BY1 zyVG$TW=T`!XTHw&vqAJ})tvIWbxzfblaw4YN4#jf5J+_Upe=Uhw|eSw#7EGnm(-u& ztUrpnoN++e-``=P1S;G%2k7o0>s-BwyDq_IxtNN@)P|h86OoNGhJ9Ro||!-_NY@W2)BI=L3*aNmMnD_U$b%$$~%Bkxb#*rt1%lop9Fu%>u=&-)K= z=bMh8Qs`pDF@EcbXHX`RSVAbDC3-t~6vincZe&^w2F99_VtY5P9G91^@_+Cqo9 z4%-70D5P%4?5*6z$8&Kt9WWAu0Ru&43ckD`rUkpCCXDlxP9MDV&Al6_&I-A?Ls4GV zkuCo6ARI|bR;was@c^bSe*9g6|K9SPK204%U(UtAudix1hK55eHlrVHdzXfhzDn2H zdF-wd9z`>G`Fb}~M-FH8ed3qOKDmg9?o~?xI-vZ31Q7`pw}2!au;0Yl;#Gy0ipJ(Y zwON==^4jhQ=0;n_vnYHFhO^R_JBN@8)IFRV!A6t1$Kok42CGRcA?Ua^$2Qczd)5>k zgI3{D>=)!edALL{)6h^r{-seC>9=;O!962A5afD+NN|&0L)FpHqe>M7S%joe_7AJq z=h@;fB^llGOen?%9v_Sv?HcnHhz}U)UeG-o80?lw{>fp~>V9Ovj;;C{c$LpzIBCf} z)18*pT=_5-wAELzxlFp!c3n{vIJsm@Alc#ci?Ofq(N7nwTV-1rXHSb$HYS*DOiio)xQvK~YKoiE6Ms>Q&*U@O1MSKF6k ztH~o%sC%glu6_V+kPYhPJ7}kR!#SaugB~-Wm!#SIn%2JLEU}9`Da5mOdCQvaZm7kS zNm86dC%Qc>k4#WGIzm-GM75F$uGsjbFHi0@3oIVZ&Fx6c0IG>dwKypvtM5kijl8>k zA?U)tWEJdiUx#rKW20Ww)$y=@;| zpi5hYMQA+_2Wp%?646%2VmBHS{8i(~7EI~=F2RmLEE-{|I#*{Ut;SZ&raUI!i`!uJ zLHnX^jghWGNwy(+kOwWeGf0>uQ5nRtGpH>a!0;p z(oZyH|2Rj-VJO=+oxm>tkyXKJWqEw>I70G|&j;rLSq<@F-8Z6)xu&zDnm3ipd|pYm zW=gN+lS$OX?~3Y{G!2#z2xljq9UN5NZdJcZ9NxV?#G$ph(K<}ic1eL6-~8xbLoToW z6e7HhriNm17g!sp0vsWxup5cq@{*gwp(D&?7}bt{poWCu!XS^NWn|RCG>;LiZ#dj0 z)-$P5$kx6402Ldy&fk53voM+?bmy z4-&K`-fKO&-PFS4P)ugsw4hogYAq0EHi)9C>$E@$Y~)ryQ4YWaTHvab?r9QKUM&13 zr!IdYd%vXx<9mh>i(q(kEXIl+fy^5V&+Exk^C=_bkzedM71}v6SVYA_efpWv_;N=$ zf3W6-Q$td$v*cJeNf&mkwE;!RmLKhRn2vXyQpjGs?W?OL&?!}U3P;!(wb>x&E+;%d zR{^>Os{CjKGGdKlH?Itv6QTKy$MI&UrJYLeY0w2LB>Cp~zMb5Rhv@AHA1B?)+3)4*>pL^0jo=dugM|27#~T? zh6ES=IQgEVEJ?t_F8{(Oxzhc^AJpf~E!WRXI>YRG8uZqY2uTgN#b)S7~cK@4EbeJxC9oBHTo6 zK=ZKE-UvBG@@iR+;xE-h`O74@HDRb=CJ#h}j+yaSA*h-&wRtdKhAX5zfpwoUIYQr< z+{x+ST}N{|Id3(!Pwmmo3p%>HAs;EL83vXbX#`lpGtsqKwd3c?7XCP9`1plVJ+H1i z+R`;(V$6(rnw7L^i)24S5CU$?ecEX;{1sa(wacS%jx{m!(l)_C17&JtKKbh z0!5CofX2{%SH?$aPqD;2>vp_tCYe@>8eM*?> zNz$qJ(9T6|I>rv@N}dr}i}Q}%^vK&>PLB&e29chu(q*I>4@zOOfs9;2YI9IBB8Mb) z)tt-(zZ&1pMVVbxErJ9u$ZP~nUY(VxauAsz{#Scf9tdUr#_cTCIBKVoqsW?6OksYK zaepaTk(JKBT8md)xz+xY2bkB_8YcdA^Gj<- zV-%3a?wJC)AbBXNp?!7T@nE)*Rp)wzS2VV77O(PgENv$%8K#H}=Q(fB>&mN?f9kq5 z)6g)B`^XRfdMvuC#h~nsP#|n!0YT_IzfBhmg^g44!}S2u9?CKSAiHfuI(cseD;_Zx zK?Zk2Sl39k?0)tCgrxWmwFT}xZk3(IoaiMNCm+4 zAioDt-bXDM>Pbttvpa)CVMswhI2HWQhaflv1!3y!UI=ba!cVGKlWjUJ5$%)hhZmSo zH~mh_^-y&<>Hajwpur_`gF|qo_9;6^dHZA zcKhrBJK{-gTwxr)kU%0xr%%QwQpv4me+;_sh<}K6kR+96=-P-owXvzK# z*%aB9q=AXvsvjMyJuV?VI))j*pZS=EBOs)V364Sfg!ekZaWe|LzSJ4!t*3^(yNMC& z>iTwnVQANUiK{s~RCUB#gdH%ZB>U0``y{P&udTS}^t}f7>K9nr!0eiqkay)))Vo*DRdrApKW&pHei%=)aSRtDX--@# z?#`GQkw}HpEiI7%HuW7CbwEx+U@<~NM>%sD0Qu-EPO^)CW7eYkLTJwo_k^$q9xDo@ z?#~4ehg<;stu-z)sOuFgTy!f94ya}H>o==?qBgzKgf8|uq?AOKO@H;=eCOj`(Wz}{!c7IQ9uW$z_PjW{UA<^?%&j0YLhHcW=Gkw zeWhbrH4VYH6d^*7&Z=FU22(S+R`cX4-b*A7Y7}4F=0jK|!NbbneL`xwq-0A218Ng@ z-R&Wd`I4R`h|KCbsE}b!r6bb7#%T2fJg+@^I z34&Y4wL6D52?O%6N7>2XsNzx;mmpg|^{Va%QK6NOy*iryO}QHFbd%ce`gL_1lJb`V zq@keaV~8RQxR|<|sG6f{?m)Z$TAbxqG2)^hPG~4`Q}S`xcIz3HN6)w7Y_zySB?myuDp?L<<>5#F@_nhTvA> z%9WSC4eiiRNz|_Xf*Z@~`(8~87LwvtMCBTL@UAyRs$uo>6;KUBT7$dpNyEqb^m<5! z=GVE7+=e>T4=XH*i}g$HT^Oz>dLQceJR*A)uB|ZVfFeY!QEMTdgT+ZO3zcDq9Dfq1Ad$Enl zOP%{P+{iya#)fF$#yFNDgw8<=rKSgx*AoT*>Idr}DA$w8JE;7?&KJvJI%7()V~ooY+&Br{_h6Ru>4Y}@kV0eR_LnfM{8Q? z14O{ZT-G76%ILLA#%|jNeT_N|*z5k9_5)0-pteID*aEPPm6Sh6F*QtASee*-%XoGg zKOZA&ov>tgj$_Hb)2hK`%;4{ny{Nl*v>tv60q{(m@ zf?VjQ9kOJhFNcZ(CVm^9=0gODN`&}qD?^W+z|D|@dom#xxTOA+Q%9Bj?+Njg4c5}YBeD6ub?T(Rn)Q+5Y{y*llAsJ{vqw@Xapo(g8$mJ1 zb^H}%P@daW+qbCVxtMU%J{ENJIdqbqvsU2yLYMw-?moVr9m;19<1JOsWqYSY&9Jj> zkbAR3%>?tyT=}hel(;qoRM~$dGXuTFbVE!ur~1N4x4`78U$71-Ytn082yc^)Okck0XsuV%@E|MKK(uX}m^S8=MSICLR z8aEs%JJ$Fx&*S6#=qUDm-`8XAu~B>R9l@>nHhg(%wt=WA@C(AhVg)Ce5I7DGV=Bns zw>QGaCd6Cn$5Enpmdj`yup=o2#}JDJKcfwUV%C}+M_-}0 z`)%do_?MD4M_BM)@r37@%5!Abco>j)OZAV>ck6-fbKY%+Nc`{7(lud{+4@sQ|NSdE1`35; zh(clM;bXy-zkwmD@Sih}74;oaC_*yif2UB1$rn&4dX$o!w3b`)^0<|ow#EL=j}&ah zoKp)l_wPzcp%eZ5u9}icYe|{h5Ac8X>>0a1BYOyuB`#i!9Y@&!#qIqC|c7I+=b3?A!6y!?z zbpi%c3)YwJc2d>LoEwY;Cm_xFK3FX#yA_Wp|yrG2^w9CN1TRV9OYhN*7 zMqQ&KmywG4k2H_`W$^LOr)ZJJMzNiIk4L~j9}#boyo?Wz*VDnOZZuF`|LUlGq6I#( z4A@QA5;{Fk>z@bVN^!sqXa(69VamBDD{vBl0rV_l*Vh)9G3SFyfnA1_@zUoj+r7XX z2yCPACzUSl)9jNI2Ekse{yWoYIfB@&=`IY39lCIH-nT0bbN>zu(E8(d&mZtGs3=gw z)^oJ6H1P)Pm=!Nm2a!fu+M!fr;M-Q%|LZgODpmhVaT&BH>We8q4Zd>J$zY&Atxo?V zM8r+dYbqri=~)+HPP$MNL{ubxWY0>LjX4@DxIy32R)4MeEM`Zhk+4Fqs)&}>2$&M( z33JYdsd0uVx4y(o;Swx^&+Z>jcXF`&1Ptl;*-ZZtp`SPC>oag$ySPQnU}}D7n2saj zDKk~9&WY}c!lA`v7PY(m(#kwp5fj`Zy@U5fcR>}SSoOvrGn_Ww{Ih4(Pn3KI4w5~r z%r|+2TNJV1<%*{H>4va=uNikrPw~VH3vccE%Snzf7TF!F$fDC3&>E19! z=nifnW=UOOAS?v`BSwBW0`}+zYZ1~IdW_UD7X}(MLx0BNo(y0C17sk&DDx7dDt>V= z$j|RHbXI)!%HlAmO%RNs`#*9_*M~>?TxcSrX%JtKcoP=LBl2!4e(%Jx(^cX7h3dn5 z7Kr8h3Bq`92qQXg^>Cc*nHmHi(`_TTO7#3h@W=(NDQiWC+xKHJg6pLQ;bX;Wf04~T zf3m1S5S;Tc-3603LMOsjh0|D!GBLb(A(iuFXRyqir~j2Ce<1u@{;tREy??A)N)(Pi z(e1!q5!qGVQ~0{=kBQ^72I0vR@-Rj0$fbIQZTPwnf>Ao(DYN@S1nnnZQzBnqyPzr| zeFk%uQiL$v{$-I^J>&Z)D*9f50ec|(^(|j+etnFm$)SbQdIK6Mf1;7;I`9am#atYY zg5`-Hbp~(zpmbD7-UT`QoJ(+j?yuMWCexc3tMq#YvZL7Ch>XQZniCwA7WWOl>*Cp3 zClgS>1J{a2s)gv){(GS;E2Hh^8|{--#=?}9+Bz3WQj}vbTK*mpww!$vqN`9i_9v0$i}4zA@rrk3U&}G<^Hnl>ZMl%ZU)afn!N@`1N1^m;*-8 z8}owiZ(o%8iINh7Mm^lYZn~(NtU&@gB?@vgco}<#@^Zq7f7J4m!MEX374sZOnx*SvIl`E~1n9rQw+xc8(!BBBc|TOaLdd+?wilBP&!BiEV3ew5AG0 z4jukX*H1J~1JwMW=wFRw$ANIl+oy!1`>#ea!uM4({|b`)39KPyDlB0^_|3_b5-_0a z{|J(v4n|N=kbOz0^8RE7a|nL4h(@NVov6zTP;${y-mA6$1{yx(f;RfUwrvh#+UXdT z?6!%cL7>3~vdGw1#^kiIJQy8*jYz613=^-HFTjis|5uK}h!{pcW2C(E3|3rKUs#fS z=zuwCdIT}J;%2q6v7ewFMR2(3qF$UItG}N3OgYe<-q@I>$fwLFr`E?Fh;kB1u~nB! z?rY*e+{F%@g;aL`0!UKrU)zSmNBPVwTw=ngTp(;=Pt{4IA@(0HNlzR^T2EK~_wI?8 zyg@F5^2M)xmGDBF5wj(1*wS9Wh|PpAqcKL`@Zs#%sK8DCN0Ru+Gq*t{y+lq_G6a_X zIO~5@vQU_S!S50Uxh`(tn-iT%g3XklQJ=g}tnY$Ag<+6Z?}C%a_22Ua8b!(gb57jd zBRB&iGo^2Dh7CtJ$XiZCTLO0TtJ>>c2j|%$P4@1fT;Y%Jf-vV^|CBwj&^3rf8&3_a zIs@%_ID^4`enj7*X;4v}9YUXyx2JfL@zs+=7bfDm7CVTsV*8f1k5`ZXO6vD74SuNd zK5)_RKSkmGGgh~#xLN$l#K(Ir&P#)5F5#so!r%|{@a%dpUZXQx(tNhlfXd z;>z?i<3s-RE5RgmYKo-0!KP^v-ho|MXzwvTf~qebYZ1h$x28_1z+OLOk~aE$q|J*c zBKX|bd*WJ50j>@64hDQH5u)$5o=%pB`-tE^HMp-fZ>*?4`r^q3_hAj1d3X<-`v39P zdZ5`mA={>^H`yo*BRWoEn~pp~p!i*J>r-};#P9G>C?t|C6E8`31RA#AYU7N?c)&q9 zhQM(%aqElVxsT;ez-{4Mk)qQm8JIQvUPjyXanB0D_iUp0D82CPY%8zo@?0aMN~Z(~ z@5(}Z)MEu$Gu2=~DRTBsoa-ZJ#4Yenp>juxEINLC4h{;xBxHLzh}19haR>V{{!+vD zQD4UY7}uaQLm z_Hqvf+;!Xk(vAUtgfN(D9$rwW+LiLl@mv^-;|9qHexxOD8;!&`60J}fe4@MJ?0T(l zI%D$AW4s0W9;}~qNxA`C+!5J2Mm5sEEVdG(^e!$*b3_EO_BgHn{GOA#Opo$g^jL4E z+T7R(41YLYSz4%%dLJo+|6#;Cc{?5Z1l**h^lG}0qNJQ_{_czxF`=R&@5pCxz$pZ) zv9zn1W$&bg6nss>_)RGyG=2t09v%xPd;VE`l@oOnfD>>jq>btB7y4o&i1AK-iC4SrKnP9UWZM-M3+ZEJ%@guDkHG~~U#uI-zb}@+beTxVB32~}2d+t;cIOudI za+#b*Cjy}!4&XX5);fP;fW9P{Df z;o;>im^vO?WD~Rs^WqCM5HaJz>bHcGlyt})b(U+q4DglF5=ytln ztFB6L?geVAT%!2tthfO`8iNQK7#QNO7y%svpZ1Q9;^y=*%x81H=lGAE;KRW@-{Ygd z``b&SWvc-s62n!lc7haA;p7w)LBYYnK|%2U3UYEyEiFsi9)z`O_Lz^da{J^luYy9$ z6{E_nmGOfoc(fO8Jf5n5a(cAnzUI;tl56FVEJ-^H`>?tXHW}xKFM?>;6O9W<@bU4_ zo;^!UEaAFhsIQ-p$NcBdpHrC6knb=!sAwjI2x@@`139;2WT$l6+uPNWZ`l9c?G7TO zI`TTs=6QANEyxN!r}2mlk442jcdCyLoH}1!`*5f1(}I)r*&x!z&mL$aB_YgL%*@P5-@VT3J^Z#~!~O+iq@<)|WSSjU z1^BGGlRdWioxQIL2@SQhSb=O?BI)AYXcV&hZz>=kPdB$4A|k}p{MH+@ZIO~k}XiFP@|NF4}Xz+24uI^Eb zLdb3S)cJVp_Zt}+!qHl&7SuY+D`}(zC{^&YYQT5r!0{d7YwiGcP(TCFVqY31X>Br&X0!x^AvJa;~w zh3)mGOW*lqbNk+(eh-R79K?`R%8hKp6`08dbp?vxai~oYwp)j+EhzHmo7`$to~N*RNlqXOL`&-haeqXKn2QoZLIjY;&vVnbv3~P=ucWtXl2; z{rz2CzjF&}HMWT|zu9jue&c|HOyuWaV32m9RFq{16e*+~cuF?k@3^7;m=-ccI2Q1% z2C(5V*|ygmZEXpB7VZ8xgj)6l_>YY=G`^PG&%9MldYeD=W#DT=0N%mY!e%p-$%SzF z5q$)Sb3z2Vepdcv&zXE_nU1@6@8Xisdj0BU7?F-?{QUXe^6Axa zV`=34i;9X^RN|gf3vgbEz&rX4z#17w1&K#I^XFWwHNn4yoMXy2uHh67DZ<9XBe^8V zEf^>ICBv|}xw$`EJx$#6Q%YK@!{Wd@kdfU;(M=ap{F@AcUxDtT6>C#d5^d)^dqR-p z@rsFgZT;%g*Viu!V84CqR%fBvXBk;p0ARM$?Xg^-A>V5}%a-Y%p*1x4Tvx{C(|l8t zYJTGdkt)wGT)Ly*O!GUjh>d>2`fF=P)srRUFntd9{Qa?Di(G7MR)>4*KYsiu3PAaO z1gmC{eR{aRQ~*VItUzz%jL%={DzMal$F&~=}p$M_LFtM}qmaFUT*q9-V zlb@4g-57YrYvZZI;k@Lr`~E_@9gZnoh5JY z^L!4B*YHnsES`Hsjyxtr-%G*baXbFI+mkHJBpQ^+%)+Aj>S{(wi5ASs8_;mob7vU> zZ5weW7Pwq>@$G?~-=h|IPl%9#^6*NLJTAjWT3UK(s31N?#v5@V)_sg49H!Y@9)Cg8 zeGb%sXbxeyEoJsSP=!Kg~dh2R^2n?w=k2e)oLU#34v7la_w(Dm{^pGrHL zWo&dsOvM>PxX9hSDSmvoS>?JKM}v)I zEJcO1C9)75W`dm@0HD!e=fvge7J%p08r*^az-?Im7!Dhe)k4psft)@-I(t(AB*w>P zckfR3NFIX^$+*`Nv9Rs&knO`0-rBvp;Jb+~3C6rSWndwg1eTWa;sv8<$e^2thwb;0 zg`e>zFtbkmBLg($V1Ns|KfvVDF^7@p7uDRc%WnpPcb90|OcUM4|qtjt!4~JG@TY8^tMryqe zV0))I%3k>V-5!G7WbRc=3yX>hS@+ggn)LTYFC7R`UAk0dGr~8*Vfzlm;=RAMFjnCR z@b{9S%`lv%uI^A{V`AS0-?TKFSx#s(PZY8PEl60V z_szLewzBr)Guy3KYjBp}B+5i0j~1OOx3;!mu@ECyM$35l_`VJ@JY*IVI|P8|4u@fm zC;j2E(i!CjkKXRz>ob0KIrYFKV5?u|Gj9d&9#qrSGcxigD^dddv?~OW=39s3`9@XP z>VcoU0R^-RUn_vv4*>@3V|#bk_uzM#LL{wGmtao+!uQgL^D8U04nNyr0k2-Y0!Z1^ z)z$U({zG#Jj(vT7MVbi7izWb_S!w#Sg&~>zMAx>rDTMRE@ua4vPEUT?n0=`Z)P;z! zaOmYli2L=L*U~lI-Q5W)^h-cVM?XEP^4MNXva20=ubpe)Q@S!nZBPp3bcuv3_f0jpz8QBmN1JH|+?Z|ezDb&PkJ*YLb zt*xy(9cyso=wQ{P%0<-{myInOVkcs6yJL=n-tFBD4Q3Dm0ObmMY*`l=*W~TR@;J`6 zM*lt7h5W1od^CQQK8Z}Ws2gWSiQ!z;>XXs1u&|Dv9xB0nrI)M#P$>jgRw1$CzuSZ# zO@_m3nxPFi_AA{0ENZ^(C7a~I^7SO!z2o&rU$9y;aEzcgrQ~^rzinP z)gETH%jV%_^v7ynfUFv(9{UO@f?UKUVF&Y>FX1=Us-FY|eAYGbX4xQ$^YQU%w3Pll z;d|_zb$d>G4zQ6ij15MQWm!>Po@ZRM584mDkmBl!4xozK<0H?|Q|L?NGOcB!@!Rx1 z#YjY+W?*F3vdQb!r6an?CpTN3v^ZY1`&#K`V7RE`+}X%;nQ>q#JIflgRv8j;@s;yB|Qg8m5PwOxs$-h&kHtn+F3g1Dd zF#{m)^(}Qp#kH-i7(VJ!@ZY!c@a#2>fql4n{*dw@FONHV##Xko>RNtSWF(a!A@$4D z)Y^M3#2i^B-rL`VCfsD(f7Lmii?26CIBmM^i)*xEQ5vCQ8 zyf-K)G%XAfCN&6?qFBF-H;N<(o!s8896f`Dg@vu#duL&!IJ;24S_?Ps+J&=|UYp^2 z74SIN=Sz(m+X7eUlnu>>viqa+;>S;iEdJQkD&zdhmPHkXmo8XV( zHwcWDU5TLyu`w}CDjcRyz%t*wc@vs;@FSQGT$}FU*rFRab6_!Hu@N+)kY_dZ1T`bn zl4!FBX_@XjAzHD7wPV^E1sBpOAr0G`cWOMgi+dzSD;%xXv+UNs>6%bbQa(#~Gqkic z@MH7L1Nrv;08n|O66@%_if^-1Q)>&^X%bt#vi|dNadF@~?FRGo{pTC+9^z4*FQk=o z-os`Q6aS=8Q#sa(y7}0}#l^{qyqX!1LK2_Fvw{M<&AG0d-G8eV`m;NTP-F7?`XhiP zn|uBqZuU^P75_?u*s>hTmI@R@!BmB)%W^vDd;GK#`cq5NS_;zkZze0qM>zZ@Z``<{ zD16~6Bjeq%a{G~yk!gj~5A65Weti9^(I6Xq_9CD2qE>?}Poc;50|kXXy1l=LhuCTT z0mw=54+i8&@Yd<+vnikQWm|f^M@V($?1igR!n`y%F_w^uPX}MoFOoY%6P8z0R8&}Dru3^2g{`xvJukZf-`&shg230PPv?+M+U>!A@ z^U;X9+*<2}kf4?-roV;`Qxay1mdOFm3?I%x;Aa=ZHu^c7m`XB)sS2BsA_yvgReH|f zLn%9g-L3CxA!!|$f`71q4Gp^-t?2 zPS*((0+BMkEYj^k8h689LR_@Y(1k!sI%usjIXRiP?$7~zConFlf{zk`AoB32Tt@q$ z<+E-d9>iI8zG85@`@7V3+yfFJ|KLB$LWCP4Av+mUP^u!5115uL}c zjIs%jhu}AWl_<(OB?tt_#Rjs2?WG|guNq`O+=WB&XN!x8IfN|PKe!Q#TqdO6gS1pj z$Lt1WA~dw5drpV4nJeVv13fi0H3jiWHASQpU=$?tNx+bN3BSZ^SY9vSX)P}&7dRD4 zBEA(h6*~A81V&6Ff=|nNbO{?dXe>DBiBvzgtWeoShJ>mrBu-dl7s`2g9l{p(+PMlq zd(#1>BP#gGCLuCX9Z0KXYrmh2OiVcHT6PRTtpG(rE(Qun0QCB0IPjY;#v||WjbEK= zOXR=5(MZVKs&@MhxDqzCWIZ^00P=TAAAHMFhy=U=DNs94Ks@4NVw{|u=6D|yhcO@6`+`#?phpB& zgX^LZary<~P7-*?DoXQMMM+5sQaMJp%F0UMFK^GvEuBApKMM$*AQhjmkRk99%t7%V z`gSKD2!>d&7)OM<%F&wLqo z9x?)2Vq1&H9&1lE;U|Q&ro3mztWJ&!oEbi0^`w zoxweyN2Kfp2L~ksy_Au>QL0uto~TuDlCOjv-!79o0Py;IFnR3a>gww3Oe5j7m!0NA zO-pMlxOv_*Bo0y%x4V$J;;5I1tk(r@IT_<;1GPR(up~VkvYHUn_<|Fv662tb5ZJgx zgKhyOytUA;5`V=Tr1-teuI}-VM!?DK#5kgiwf93LTY46Ocw0BfOw(dYji8 zc4BUPK<7&hLFf*^Bl+}j2nd3kt*x!YkVH;31dNZ3NgON}L$DnQP4}KA%y@5d%_C*c z1S<&r2MR}L1_KH?($WK!#p5s0o3upGczbyP$;&Jn;txBl0q~k4;tWE*efMtW@{Qgi zASAm4D5gMu>X{hx5XHl#o7Lal30~mT|JbyvS{O?6r-s zpDdJU4D})6tb986bnf*FXYZ8R{_e|a0d~s4!NI)c$=liadBRk;AtTo_sn&$k1;!K< z6lYRH5}_KnuSX)|H<0(jvCbUS;qXgW7Y{po4iM`I2c)eX8ywsMdRb-BL76{OZ_u=w zQew~Kw`b7t6eAr#YouS2KtGwme-NHIlOX9^yG&0Io0KF91QF z9!Vb-WCFc=A`+cXOM3iE(jn*0dGiPcEk&S7si@*1uU;Mgm<8-@Q89Z=TAB$I56W!E zIiW17UNA(M`U`5JZkap-xw<_K4bro64Ury*m($bqx&8A;zY;JZ5pD;?%z@M331=3+ zhPTk5BNJI7c*_ZTBrM!!7}|&9+Vhcy#zu|Fepw)a_g$oPcV-}7n-oStEdoi zr+*^HlsvEuqt))kb#=$5NyO+y!(`mu+-@b`_*h=9=R%qj+h9s6_R)5{(x2^n2#}nu z_T)0iKo3B$VwhqQ6uGD7D+C(2NB zE2cP3kpafoOdt=Bp*ce{^vzF0??4&h8#ivHh-^b%4Nj0+#3^U_#xt_>=lN{MZmiGa zNu6$@JCl=;RF6}zj6In_0N&Y*2A)^Z5Bgz^-(oD=2VoD0Ny^KYf$k8w_vP%P>cmEa z?i5iWV5tEUj!38TP1{Wk++rX<+PWl9Jl~nY*#gW` zod4PJhYXzto~e54s|rvDT^${SgoFo>aKd^Xmi3HQAFNa%{Gz6m0AiqScW>X0o(la$ ze-v$`tE<~Ub{i@?1C&eB?9xsS4VdCTicnZsnCSA2wG`J0VOW`^QiKzKsT{UZj+(%YcRz*dH7dS>J-z8kPs;sEEKhqUl$Hl=hQgR=fNYSSt zM}~YhB>7cB0>@rG?j1!XrE_8*0b2XBWxfUP2T_?l9C63z)vgD8`35|?>*@roakA2R zDV9r@kB@I>b+QhSVlbW0@W_b1iwM`=s_*d~V`E4PwbCKBGPYa{|1xX-jm|SEF_F`a z@x-el|R)`Pn%p`JCPEuglBJa04`X zP>>qpJBt{3RWGi}n#qRLftATXB7F-Q*9^1$#^0ON9sTOdf+_}P`??g%xIAta!B zNhJm&34T}Zfrog3~Hb)EiJw~BUVs!jG5v* zx=mw{3$hrwaDYP_H|0&B`xIIS(ZS#s0r_w+h4>e%v5AsQUVB zb_uc6KIdm+Qy8?)X$GR_nWht78?KYfayQtJ(!ZPRt3C zPJgyWJ_H0mfMrlar=IxH+PHIa`5q48o7b<+tq4U1i-6JMF(@Iuo+}TdQc+VQGz>xN z9YaHIH^u>LsAB_dO)0$I6iNo^1_17J!X+}A68f$cPa#Q?WpB*tJJEv=Btc(EQ^eF|Xnu#~ZG%0zF zx!tTWk(^wrV7|eU>k^;2A~WZvOF}|bE%$A~X=P;vL~@s0W(?X{atv-k z4A9fAJx8qE3t`BtI0kVoDSMyK29yXH68`m7>yN{AN87yXvdzAl z2>Z42e4BotJBfvXo5f)>eeK>ZAi!&;^{8mFl$4a45oB3;dAD4!i99yi*qTXDFC5e^-mKadI2#Be01 zJ1xg0KwvlJC}qIfXlbuF7^;@qjA+c>SSNXU28~A3i~8dNvo5*bL^eGSl_>gOSs zT4&@9`L3kw`mzpa9jV*-{&0F; zL_|dSk9@iyI8PQ>^eZGp6hn8JlsAM~Hit2YhH??P(O^$!l7Q{xinj6z0d&MD>Mz)p za6Q}S@BZ}s{{Fu0aG~_!*l6$4HVBBDlk>df_wjL~+;|6mP=us=;`pi?8%kgzF0Jzkm=>Y41u9vfxXA zZV0l=m$@zWp$p-4=gmiGe0xWTk4gwJl+V6jdW22~e-kFgFm8JFa5L>#Ysyo>XMce$ zdIoY4c86p|DqiEWL`1PEGD(PG?R`@ix_I^}s2j)Z=swhH36IA2tIR$>4Zkd`(QZ9} z8$>DuSq=5v&mM;DoCI7VYUrI%oNY=^PlrCeXUT2~9yLeMzd$Cu4qY~+!fJ)!)=gZn zA1w}kNXk1+qO79ArkcpSJ9`1T1)+NY+=hmZ9~6Ui2md=bHIa;gN*0C4>6K_|>s?uz4gjb6%W!YfHPf61m!DfTfh&juP@E?&IoKR=-b zjYCkgkW*V8DlmZ(N^|FX2xYINh4g@g{JK;BeQIuQ2bwtA5{(TEAfXt5ICaLySX@}x z9ZC$w#>R}n6Q)o%gIxdo>3YNsg>2LFugbX@xcF266np8pQi13+nHax-z&73So`TD# z*=*yEj*c|9>CnSNuV`5yf^M4?BiPnvFbxhy*Vx?x+6I6fi8?R!8A36~`em_~ZCitP z?80e81tlbmJIf(^90!Rytm>oyD9pK?#f&Qjda+KGhi69eoOSa^>YT5dtjb(>3YX6> z081^;FEZJy>)pP64YHcsRodtygTR3*;Xz`zijuea5CI3Z6|5kN#cb7`644^5La-diPD%xl{t_+EW@A1Lpr0;OfZ6=75kOe@3xrDa_ zWU`L7HU<16Hdb3lXJV}%3UT!O`PAGdwO){pynDyjlL~EY-ZSAsNDCW4QDBDe>{>KK zw--|3hDvYjkbE?o+4twKe$-r39T9+LOQppC)e(Mxh(7;cji$c@KC@) z0tPFUVQ8WQ&L@9)J@Wbm3fF;4F*a>4Sc;4jpm(qu$R2n`PG0`IhYnP85C3c`Jiibf z!~EmC8I+;`gt|wQfke0*E(az6VY)XYJ+3S-{{@a&;%-w2WNzT1b^+3yAtt`UUcSjy zz{SZ4N4p04z++rp4tk8VM_;-9y%7#H*BIZkNdP7_6*_1iPR4r! z^*coYQUV^kE8-UIF*TmM?F6J3E+Cy2ut{e){7*OD@=8h`LzBkQR=+y9=nqHDxeK6f zKrT@TucvyhoD(Ky^oBA6l=VA1I$qMul0XQDE-s{Xc$*Fyw~!7qh#n5k&X0f}hsqu_ z46w7aL(jmKE8VTFii(OkKQ;Q^f+;MmtU&tmAWS9%StHHHM%WwDOnHRGgR{GE7FYjN zr)4pw|8Cds)M@a;313nGVs^@gLXHQ2*2W;?$Ljv#Aqp|XJ(bZ}uH*08P!%+{s z3Mgu%+&(KWsV0{RG>nG_-rOUE#;-pn$NTZifI7%9Q?Tfm0!x7%kzG@5b;$&v1yl`rbx&|Ou$gMv{l9NecES8@ zqr5w{E6{rCm*@pBZDL{q(--s$w6M*b;0*HVTX2Hb2socbDB}Z{2jnc|Gp+*nzshCz zLv0dTNy*^@ToV-)8!M}EwcE98*KRv()h!Hu7=?Ba7N7ipfPkc=(UD@S=E$cPpniV? z8fcoss4VdMVgw!zLd8VRg+LD)j4B~_%4(>#J?Fx?Kn)4-`CnKX6-g^JJuW$WewJzQntBEO6Oom~g5bVR#-5n`@-X`4!D#hVe5%Xq?h-SA-*u6vbLgT4+tz{=M*Vaw#yeW1s{{wkk^qq<7VG*AtL z*o~FL3k}~Mj(++L#T5&lO*5vG0dl@35vL(9GI939BB1xKvb?;NI1`eFZ%7>tniA=S zJ_CixjO%xSw|cD+P#VCYX9ADDZ-G07)FuX+I^-Ej;AMg*OVBt|&gY*9O^b!#PnOBw zBi`3_xX`Rf^B3h6Lv~RtIixKRx@$Q_gE--+mLYut3n>byhnE3d!nf%k8$ns?cti^U zW&l(>doLW~_rro3R#6;meMq22?do_$gC3Mu zBB>^r(>g2)8V`0L4_dRrAQ^GXlE)T(^0Gcii=v{UPMyYWCB_=fB>m2T3n3K z4L{)4UD#d@nJYgusDLy6R$yY{5|wn}+TEtkgzF%*8;*0G!a(&v__BcZHRu_^#lr*A zR3Fp6)=T@57Teas4i!A`*#UYjM@t`4u{n)@0S8@%^q{76#+&#ci~-Oh_Fp3De4z^k zU?y~)(L=le>OlgA1`iHhk?<~!XOjnMd2IUT{gFRE0kt-#0_p?ue51C#E>|IRzC;N8k!~t|F zIyxHGpZvn4@ID1ZJ&&aiWys9l+uB5jcfnKt{Q0vKI&z?=qP-g{0}(Nx93WOet@KYH zvmP5kgA6o;I6`+7z~t6$tTu2A<}J4e1EieY|G=B3d7WKd!0$bRz8gBPwI{5+U%+_x zp^Xa)QTtFd#uU&Z1iD^bV`5QUK99@D|VW@NnIXF%cgFLaAS&<8+};NjW~C>%Dwy}n)n zJ==Nu#mkGVE@QMoy~dy$586j1fo-zZ0f~dWz7-Z0LO&F=eIZ@PMP&M!&@;6P5diql z?lehBcntx(TAP}=BgFPU(_y?CnwqZ5!`FbFSDjD_xdRCY(x#}Pp#fMVGk=sD0z@t7 zWll~G@c-(G{Gnv_k5A_lAukyD;dC2z-|FUG8F>3~nZCCO*l3_{y`Yf@lGF}hgfEkm zJ3%WiQmm@51d5r2UiNigW!RnHL8Dne4I9asQxaoCA>$6J3RJfoXXq( zym>adM4J$oq@t(MHH`N!-(KUl%S&@lWNuxa_*r`KFMLfG&`=0C72bFocvlR(n127m z9&Mo#v?@A0~N*R0;~?uJdkOUy#r1^F|BB*%Su zAB&;))a2&Po9E7*gA5a?F9H&Q^!r&@*dvjTph6IoSD>XDV%}=is)UeG8H9(A#)Z$@ z%-f;r2ZdsFb#)aLE~wr^6DlA}PEIHwu)cg(Sh%(?Ig&1Y8gh^nHQhQNZ^%3(kAuR( zRDj5(p`n4&KGM4gKo$H7oNuUQK0j^%12p~tsRMWx#HXUJP9<0gM!rZ6gV5XHfM9UIat|hJ#qE+%4|uO%--KX;ynq8BFCwBAnpV^zC?t5m)470< zfuw=sSOT+v<`ggopYWO?D*ts8uke`#>GU{E>+aBaMgHK5y}t+WPO!PSGLP(=P`+$4 z|GMA=g7&=a$$xPD&;pv?){MU^X{f<3~BlwPQ2`f0oUX>o9c_vm|>2{Pg!2yq^z&Lt+&95HnzTCjPlUK+`kRgaXX^Z^62l6T^ z0J8yB82lSfih4))$s1?&iR^*Y5SI&avf8S7qgddVCVI&UGI0MQ*TVmee(79^H*YCF7C}k0u57LGrUg-@B0ft@!RwvyyCBJ zj5N{14`;wzkcki~Nb662`~$hE6pDQG^1y_`;xX_0>75Ef!wYs;jhG)@_%6jT5R!bj z!PEddmOk-Jm>1sCKf%&JF1bCQfZh_)CIHVwQy6K$E08?EXNI^!$GDIE8_au>kbe$f z!QS0G0v3APfaya`9hbTCO6sIJUv5dcbo%pU+n^uMn-f0bWbnmuUbvd~;1N~%gGz_K zCR@<2FE~HcA1}%Dzw(O?Uue{L7y62{FNcApkDdXoam8_-&+4t=7o4uw8uJd_$&RU$ zn+LVVTv%;us(Ll<64&ueRk6)>#7JZ~>kj(A{RxiLG&zOpy&?TdyeA;4z4Py%Vk!wG zZyc1=47S+>+-8v7W2~>Ir-)n%_~(+)%2?gw1(!uG6pDHvWgkU7@BTRala_}9E|=`L z_Eue?-!voN*M{5=f)65SFI-N`4_EC8SN--S`{7J~X%8*IHoK4KPWz9(2bd8U@UPFg z7hd`6E&lmi``XmojE44BQ;Twgkx%a4nzb88RG)tPnvGtsbNAi((bPFMJ6@4AL&9n~ z$7(f~c68UKQYXoCAf_(fzue9JaB}GF4zbXYFZ|TaJEy&s_**dTgzyobba~9+&&lui zn>XCId-Kzd_Dqqf7g_Ngw>LGZCM8`3wkdAjo;}R%c=6$ec5c_h=IO=7<-MQlLwKKT z6}|CMQr_5RasHAdajeISnG}R8ABJ4&4(5&qbm8Sy1yW0nflbrS!`v_(ZhxYsDqrvE z@bF6>8gy9jUZwP_GzUqN_PV*R&wg*MBppn8JaWZMPLIE-`F39VPkfY)P37-9f`^NH zB$ZWOwOptuB0ACNgpcpOOvnDfoS?xa^%-69*6!BCCK{yVddaPP+Te zU!JQEb^o2|*CqL_3`?zlaHg>{S?pz(70H#k$$k=FI@-Lmwv(^+*>!Gm2`+Cb=wdUV zqRvUbddY~ai=NuLS@dPGW16^{!=nSES_$v_Vr zM&|-iQdh9e1kX#5v`Y@MYjGX@oVhb(H-7284zk@sK1mDyOOFnIWNt+Ix0X>v($M^A zizI$si-j_^@V`p(;b2+%k3s~5{nl+_fsdk^0TZG)9_UA@>PTU_f|=quYZMf^u$ zhoDy4d+%4$ z{p+~7r*;y+z$eX9sKuW_g}+jfohe%Uac%D5T3;FKS|15bsAx;5xIIpj z=d29i75dj5KV0rPK6El;*rt&Z7ZDXTrXJZJ|0^oATcF}ih^l`fLit+$hf$UL>OgS( z@m|>__0+uEj2LZdTL=9N-d1u88e@ zl~OO`kN|y^esxhF9|y$v@!(++34Fz8Fn+y+Wm_193MUQJe-RY*>^3_J&FX*kUJ>c{ zFYM$fb{6SZHA`hHDPl~78GoM3obvlh7RbUtn4ypSeFNLZR5nlqSP48lTj%aYX&2AJ$oxe_igUSh`KdVfsK`oyFul|z-X0*v{SisPQF8-wYifS-9Dp8Si zLs(xCGe}7Y{j6`R%rj(^^l#V<$HCmp49G;E&INKSQGOLfhEc+o(V-{2PlH@9!Dh&1 zB)pGVj6Z4Mz>m4TfJv{tw8^wOR>F7jupy~aXJi&x3H58Xmnw-bz(UDm>0e71MOko1 z$dGtDrdM?!bERW5JY*!)M|K@WBdtg#*40STZQ{vIICBj)(Hc+x`o6gt`?vZ1+Iz?? z!qSQ_+Zr(&WWOk_sM6ZVhup``C9O!<)|iLLBPNyp^-o*X&QuXceM-v)n1r5OS~01$ zkr5F~h!W{nouWcCA^?A~KxTSEGCsI$8col9QGZws*``+lJ@YmFVGZPO5UvJ(QDG=@ zyB>?Q;*-|K(yMTPy0L#$V|0)+GI_e0f0X}=pbpG+4s3=XR>HbgnAUIZe4shK8znU? zs+Z9}$|kVAvAa8h$`x5LUe-YtWHAoh_dYJ zo!zJ_tGr)%p66V@>w4e!ob!jV*X%tr_sm`9-uZlDp6IB7$(YDMAP`tXT}2NBx`F_K z2)sy$fS%OR(iq?$si(TBHwZ*dbNNRAdjEj|1R~RQQC5EP#2MlP@pguIvTG};xEr=d13A>(BT*%F&yS%qasWqc-=T6f;?YREv z5h3%pkI`2X5<*_nKINx~C7U8%zMYrw>Qi)VKYk(blk2aR*u{PV31pPFcq9bZgi(n(*FSdV0evLFN7H{rd%XVw943dbq|e zo-LyJ@mJ;1;-D|j za)Ck|HIltRAS)G4L4*Dpg+3AxNabTF@0W+n2OSLj?L@aauFZCkpV~--D{*#rDp4zu zJqx+@!iJ|TOzB?a;1?EN8=;?yEMo0Xog?3RQVMn&Hc-lWQvIkP!A-EP8yygh=ho>} zK8-4(5%Ya7HTa57L#v=XFLj*Bncn%>rE=Y;>H1tMt4{ie@z}tI+Isr>)dMI6IFj~N zU$oOb#!Loc1}8=+LuH2cXU6e3#y$gKNs+CLwRcqSAciKqb-Y2eN&RH0nyGhFnR$f_ zic3D1pi0OM_YDUO5{s?$VHK)|qWVk4q(9S24NJ0~Z0R%WI~B_mMU^-eK@1e~;ihLX zM5bNZUAoHoPd`>!FSYctliM@a`0?L%1(!zphKhIJts0yTddb_IamLadCs$IOE2S)| zDQaA!x1ZvuK)jUUh5O*6L%MdaFnu2$i@J&7S>$2PTrHK)X(Ygudh)B1CTWQBB(<)jZQ1WQ~Cm~)#|plu$7 zyBXOCtB`DMNFmCz#O}oXF(;wam55$xL*;jhUYre_c^sgM&u(ve{?T-MSW!2s0_u0uw_s z%No`4ta7ej&E?I7*9#kU-s+TQ|8na3^1JSPU2#3*mz60ZWJR5O9n99rj^3%hr=n~3 zZR=ZD6DW4(1%?GSkFP)hLDrVF!k`1=u#cc08h6| zmVV~AniIWKqxY-*=(rfIumQnzdBIHP-nnnB%bGriUX}|1V~1IpHJP0|MaarsiCvf7 zsM(w!VmUn7rlQ^>UEh@FpRSB5kmsZdyQ0hBy2`qtPPJI-H z`6KxkIZN_OvXZF#C{ybnlI`{1>IZbYAlcRtXysszi)R-B7o(uU5H13zt1+PuL(Q+? zaREWM+Y%I{kq$@I(>o7ee{6h6`!F%AJZz<-{I>JA?KkDOkJmDWl7?I;Bc8z5e~l2^ zuG+?R!6~>Sq9TkV6%st7O_)YS(#4^pv&!CRl|L$JDyU2+5nZWD0ZnmU`4YkBvNMuR zVoeIYf{vy?CQPzSG~BdqNeS{+NO-s*(5E~5QHxoN52t! z@JpvDYDeolNWng&<}IRo&9z4Z;yZB9uHduQuQ#zaO{Y!TD`*PB)BCnE@-gqgM+6c0?&E^~2`BBr4d?Wb* zlXJ0iqw~f>a$P~Bmazbf$!crabE#@sFMlN2674mXIc}_?1hUO3(@N4;(^1o8RU=nuj2n#KS4vyEZ~AP?p1&Q}?Q8zf{Jx^m!nJWX zptUy8@pywdTXJabpw<63-NmnoY$>_9*8Kp;anJD~nr;sMg8OV}pm`d~y<6U*+hTp7 zxbtvYc`j-~!Tfx73Nsu0ydC;+e{@#um?+}a@OjcJR!><98vQi}>N z&Nfa9m4}}V-_52!&pRKepr;dp<0iHyhek6-bJO?I-?q626`XChZ!uOPdpmns5#Rkp zMXU~t@H-vQSttwU6PikQIfy;@-i7l?)uH}KA^t7n+qV~lS2Olc?L`HUK)uOsudeqP z1Pb5+fkIw^KqnW#{|ykxR~Q7^v;l#nGe97ENV0X0DhR}zrlIoCz;9-IZpRnd+Z4Ib zXLZ7sAJ$IGP@(wb+Gjpt!-qv=Du(QhSH@_gD-?aMh4BgNhgR{8oP;i1=h%9cf*o3e zmG`8!4o`=IsM}@tUkLB79vvA0S}5+KUR;*Nir8yFO9E8IAW#QA(6HmK04>qRfceDLN>>o@2UyJ^~#r~<`U)}y^v29G^&zHEtOv&QxEmghR zeYE86Rgln&z`y|wP{@Z@kmctZ<@mKEyi;pm+him4Y1i3WZGQGRDF`H-Em>?xaimN!wCSjL*`}D00G1BLVJ!4m97EL%Oeiq7EZ)0J=d5_ z7Q6#)E#Bq;taP&oC+~L0CCMaXTg)I>M$q*mg+UO(ys$w~uw=SV!2xekeB>r3ypkFO znui($UAX4@S=j`}(}4Fcu6$#lwFW()phcf5K|J~Z>ndWo?%jX`RwY3Ys&oQ|ZBH2M z!wrdPUrVd88mr3KA^1jVf2nJ8rBN3@3D=bRANDjUB0#k#U-Y7+4VWScQt|}1{r=7{ z)EUu{tljMgILwnTH=?A!@;XI#!CLd7cHgePxfUr6YPZ!a!=;_R4K6sfUcGwhV9zsp zas^Lia$ZmZy2NNQZ(_BSC&r_!#x%#EVEq_hs#A!WMtnX8*xnOn`rPCfgJLJcCg79k zKJ68!j4su&M)LHiA~A#fi{Ceg(2cNbm$nasICdNtx&<#{EazK;R$lUII0+J(o5hw0 z{p;J89rdX@+LT%3NpsQ256(qTj3XarF|uAd_RUWz=}39zD62TGP-Bl~qmHl1Xs;f? z-wCa$%C1;(BMU-gmazCFbD%3FFFco$M#Gq>xmtv>wV6pn(x@;62~wv~W&zC$a~T9B zzOD%?M=sG-jTy{<#tX98+zrGAB62v=aiaLL$brb#)gxW0d zdlYaD#4npnt%%GkZpFV#5#V~@eA#iID(T7=coT ziBCCpmH!P*7rgiKj_>tb`h5<-{EFDtN=E-cG>24$@A4Yp!y)r=_Y6P$wSG^9FDJfg zp%fU#j!XNvcoXcIAQ zIgw3@Iw{g1Z8mUSHxT!iqdrLs<>G|CQR<0;G}*h$&hPudD$-ctYlx z+h=St<3N2+HJXH{cA*}CM<`+kUp@Nbx)NN5dFQr@vGisJ1aGu7wzfWYjY79b9ay_? z&M|Cj3T>FcBgwQK^c{A&&U)NI`8>62lAv%SrJnk?gIXS`9pHYW*tcqk4fs5LYvO_wE*#02gf3);`W09A~dBm(|~v@@tWn23-29mdVNayII$h z#M+DjhM2rXa^UO=PgBr6+|u-Ah~_tqUOB4DzSU_yVs;tGNxdnD3D;qPxg^}C`QH>4b8 zgQILw5U0>6zPj5Lzr{WQIKuS3@H}(fi?N74D>K4VqmPbdpJtRxTMvyQ)VuZopyMa~TEI+fka+336qrepQHHEZ_V5 zg7WDDUIbv&Ipdv9h++HjtP8^;bzE_zCM0$ZUT#~JoZUwZ1VeTQQ@C&De=_Nd_Y>6J_OAJyxc8oUM5 zlieQ`T!t7*v+-W0F+%jstR~Qhw=_MXPQUqUMgkR1jb@cDy;h$*R;r~6?dq2#kjAcH z$lAqB(stQj^P(8H+9cPl+LeJ4Og?kDPt{t$!VLmx@cB#Etc7Vm*ZNg)hkPfspZRKF z-f83yb~|k+B2ZNBBL0g`muKhz;Zg0RunI?Aqr zDHAtfluX(&F3p`W&#PU0FUiRG39vUXL$mc8f9?&7-v$Pff)*@l3;_kzea&^rcV{I) zpzf$xj4dx%-y3F>LFUQ55x2;yCOz@ww$OAhuz)_0`9tQnMCV~CFyG2a?Ba}ZkEjqv zA0DuK({0xOBp2;eQ#7}xuFUm|+sfza--~FP5IyH9K22&o5pBDhiFeBRHYu9g_8g<9 zeAtZK54LVR!}sY6qoYfN0LuXJ$d5xob8R1VYr)2zEIdw1e2&rV;-||rCOROW7LtBA zK@a4LXcD3Ncua8R=`mgUNfk$ytm9{Y(IkYD_a%XTCIq@ z+LTbw;htr@j7@7oVG)YfwDGz@z$w*tT7bSVp(_!new*gj(=zq?lsOZN$bXGjO?X|m zdo^HWle`HpM}A|+!NGpA%<&4{VL+595}wcBoKNL_HQz`Xq>UEa6?;aT zPRh^uC7Ekix-B)*zjZ6?0)J-vB&(BR|B4lVEiET0!mqrlud;&U!QD8RGl!G}=;(I6 z?{Kf#>Ec!Dpiu5p<_>u`9MjQDxy3pi2hoCCHsuq-PEfv!QgI#e-JpfOpe&#=Ixpjx zNldG>uOtfQr!Az3d8a9@KUMJEHQVrSJv2axzT-K64SVGWaQU^vdFlNsNm~`)7Xbwt zw#95L)z1_ROu`{4DDu(k>KD9h1KrX{=rWMOs{GkHU1#O&g~y2>S(tjx}jQTw@TKd<(BKp=1bFdSopHJS$Jy*b*1Iv!Ib zIxN^;Fn3|#NqCND-MRxbj7c|dlw~_j5>1{2EyD<_hmt6K8!|u07LxWe)5F(Thvqu7 zWcc)#uv6b&KKcxqwNun9leQ^jf_IpC$A)@pQX!Bb556DZhA5QhEY5osAzhfMzEP$q zRD5KPC_(;&ph-ANOGiKv3wGI5f@Ga|)d_x-;DBJX;e5+TOeu@4d1_>FY(;$H0$(Bn zyObIS1oC(tIJ{hel#8hW{6mP$F-B`b@SYX%HvjgnGQM+P7}^0_wGB>}wF}|QNw=3? zOSy8L2fI=ivF8`MQ;?(F1u4jtW?HIpGp=#XAswKZE3aE~MQd)D{C>gQ@Hq#rYML3B zj#NyT#p}=bIFk3s2~}2lv+o$kfB1g!CQ|vQ2bZW^+J_;d)U)Ahn2 z1q*AxBP&lYx-d!kZ`IB($|E(OznwpxRsF)2UTxaX7;+~1O#9-6W@tmo{odo)5qxGb zyb?aSYcZ2%bmGFCGAwJyC7p zQ^Lw&7vMdUR{Xej(|4uTOUC!y_{&hGmD*53@D9 z7S&9=k#Zx5&8NVxa9## zT34;2d;~VgcZSFv8bW%s9fY1-U%Ep>1Lo_iVpoq$q%NordE^iz_lMO^d_tHeZg}fF zU1sP{JB-C!VU3{Duypv49C6V&X3?IPG?%B;whSe)Ua9UI2JLL+x<8RQ@|J15_0AMq zz6|xPP?nc$GWR%^UOcYm+Usz88#lQ8|$kzU} z1z*C14HaoSA^Jxcgn!^Vx*_Umv)ZeXhS>E-obgj8w3WPy1@R+VSn$bfEN#Hr^_L$o zP#;nRA^J&M1I|yP?}i^+KkKlZ8YzPD8ro3GI_u|R$bSJ7Zj~XeCZt=9c>VI zyX!&YhTjp3&EWK^nT98Dhf}CLF$Lndd~OYK6yvSZF3{Ea zWwe^2RbRs?B1nxk-Q@@kiOn@;f+soS$Vd?)nSMCtHPZ0Usd$s@#9p~?f1-!G-Xj}v zBQoMMM=`eR?%mWN>Hy^^)H{=;8U~)k-*Wd+@It?m55rP}`JV{7e>rEZdt}5L+En7m zk~G$VpD}aI_z~WNu@ipnepsJrT%}p< z-uqve!R(#>!|33B6NghK2XXC>>1T1XB0r{n%3a?!51rpy2yM~8+8*{iz)8#sMhhR9 zi33yA8)bO4x@w>;l$$Z46~4z8YD~7WH*OWiM53s(hON4=-I%7pg+EfM&BqC1r+>`6 zr(2cs_HjDP!SN>stcq!C*Kj-6^MvQ8+Ind48u6pA90@FQ}vE&Xwh2Btt@F8wJVr{ zLd>(Ja}-ay6QZMD1Yx6p)a8i`_8wsOT(507p4_XK{^alq+1v|ZoX2m78DvQdPHZb< zYDeo}5h%^N2~_R2b${TGf<7Ig4oO80XaCX9KVDq8dN2~&iCgM%2bYTes%GArBzAMN zpCO(C-UN=0f7(a6J2vbTxY5r{_3?(m*l~BCz3mY3tm2R~8t3xOW{wUfBl!@HmNl$4 zcXQxri+coV=cxr&QBd$cX{+9QE#5Y<)9h#+Kb_pk=NY4V=aG!x zS(M#VSnNuxE97#_!zzDAkh2HtPoMHL<|V!V_Sx)Z@j~GsgUq~GlYc`$=Yi(S36zOU zz<_!V6(O4bK%QWkEkFQu3q!lQlF0E1#I|o>$Hz3cEbvTJP)=oi?xmuDbk0_En=%~s z9jF$+ncFi2D90<*I(zCnk2w2`Q?}~A+IbnO1o`wkO6njsn03oa+dC}?Yq?)bU<&Mh zBUvdDHS@8IDhsHiM&^C zjR+9=CCNqC^;#(k<=z*dU3`{Yb<+@?4`jE&@w?|)X1l?C0w8XPk& z)lTLrLkfOJF$>U~3a*FTy%i*I)#NP>8t|-P=fZ1%{Wc;^@$gJrqw4pjN^Q(Y=CEAG z=HY3o*8RD8SN{%}_Nk0JjT}ZX0Z1kF$yqN#EWAwV7z3I~jtW?Tr;{6JI)CT95T{Hq z%v*Cv_Kdp9FyOC}3*AmwmtMfE$fV!Rm3%v&xd&?yJX;JJpr_|lG&}hLe%0xlyvoRi zKJIQ~PFWD!$H=VIVbNnkI=wjgZT=2#J!ayUOal2IW6GAy;#*oDccKR)2WlATW4F@B zMbI#fRsoB2xYuXd(pM|WU(*Jc=Xj!g!-VvzMsN!5h`Z6=Y-8(bpObx3H>wVUfUDht z?IVvN3`XeNyB4ZS-;OX_k=l+P;_i@S*kU(wHK`N1M$dZQ8@u-4#+YA|P|)UySyG1R zO8xtL;{kVf6T^>TT$!|vyXdccJ#rH6ckm+dmdo)T<%PjBR^FxbF00bt8hvJ@5qg~K znq$P$9_%=T6^2P{V8nQ5_G=XpA|k4dW;}ng9Nz*>4gV7o4Be3yK|{|)7rjb;mwqK* z5rsN*ab2Mr65oB&<}Py>qt6^sazKNX0B#SF7@s8`3xrq-z9HH;G|_uA;m~NTHt?RV z4~|^B9QjLWO!v5v{fWva?}f=l`P`1!!kUDJLGklSa+(5BAFNdHcqovVz9#47=zflM zeFI;)^0AWKk7=I4oZbZ9_)%KqdAL)uhXqOYC^O}*-V)Vgmn*0?=1w5)ALdZZ{IZCp zD7NnEsrM=-Mq8biBsnF8TcdNKf!hizPVk?_c=O3U88+7))*nb-VS)#hs>j-O1O9k2 z1P^gknwAVBGk5@=I5=6Ea_l?%YI-~PcZYE@!jCfKc9h&t0wv5Y8gc&=Umn@-x-MnH z2Tn!jRD4nfQI6*h7LOK;HU&nqv+%{Y9Y9%%z%1T(BYA(jo)jIB%S6p1zhlht`t&0~ z);OADsIp{GGlB1G>Zgpvo0Hq=!s8$p^sjI$uJ2p&4y<^KeZOPyQhGvmvko9 zpGbp0Z5v#EFeG=;+8fc+fb1-k+6uDojT^tbs znIkY~LlX`h5hcQCf>yq=6s~)pqBY#Qtz+^|3eK&imvW~qWk~p5sU2a*WH2@r{|K^; z*(;3NnqE9f(wvwqnaO;H9dvn(`Bl&2c$$-R{FzIEW5tZX2QvvT0E*g9i;d%T7G@Hs%B_55QI*n8cb=x7Uu( z9KQ^@0CB8UD6G}$=4k%z8@vSryu8{Ey6CRGoyTu7@6%Wd$sQHGTa(;LaOXpM)$o1V z>77|OB5UsFa`UZz=ibv4Z8J(xP78TdYxrLD-t{2s(HfZ*K2-CkkV%D8=k+u3Cc1HY zvmp$UIRXvTiJy>?Zze5DOq)|4Uz@0owwWNv;zd|X+QB5KgXCs2v=FP@S?U3Wp8M=; z&+e>h9QZ@b#q84Jca1;o)Ft^g(ajR~;PQWybJuS37PZ>mjoyGIYMzpvG*CGC`fZ0j zi;P%v;w&=kHE{hk-jI6mh4h3dh%1vPfFJ#{?n9|eBz9}xR7P@BMYyzUf#p2K@rO(5 zv9?0$=}=yG8D&zn-|f3mvD0VS7}c>VyxW6ELh$tuUQ8|P4*SWE`I>(ttii)TrIQ-P zsMG&7dC-l|XbCpi>(9On8)--g>~c6UX#D&-77}gsr z4o<-DEH-{%%>5e*J!B<=d_OvsK3dDCrA4PVi8Q4NNWak6-69m+JhJ@9iV%aDWXpa?mVFq+0w{Kx z=*qGS6jllu>@CmA9cuDrIwU{Mo4>$iA@){d9ZoTe5wzv~S+8>PHZ#q!Lbb7?!wZg(%$2Dp1t_;Q*?&S$D)4-fU#w1q6hIpq13#Qh{W z#5oZqQ{F2=pWoQ{>JC#3A+>F#U%xdDpQmp70N?^-i2Eh-3Dc1~dzL>=HfFNZt>|k5 zhk6cf1ia`t9{grIHk&C4>7BJ$@)-NT=j}SJEhUeklbewfvFN8WNOri%y$w7nP9cXz)M?{uNK_9f|{5bwmiPz&{-hMULBl=d-9 z9>@*EcXl*CeJgV4__otq}Qmv;U?_<{mHt8iX zfwOm5vuhg9qYlE9iJkJp-eE-!m?EzRVS_j(BdLaIsPJgU$m29~KJ~ugJ5O}P&i$;J zESLMAp9jUAz;sh|7s!F4?phyI)3taBC4P__hEEz5$?}tptbJ-y((`Qb_74Zqy0N^` z+S48alJAS@KQ)(zlaP&dY=me#cZ>B{IS_^j<=@_01H6qko>sC#T@ED8J&M`ON*>s^ zQBTv~fCoOE6RZ-bB}s|j3Quq;z8}fzuGw~v6oDt6-;Wl|@NjBVB0}w4ExP{zlTILW z!#;4h{N}+qi@8ANZ$zW<2b@%+wiZ~Kv`->+&=2jfnl-%0ha^OwF^@Eozt5SCU%(Tf z8ijE>T?{B{Jl2GS0XZ4cS9AYCCAj{{2xdI*cBb>`Z-mwf3+k;h?xA#6c6`Un@?N~4 z=s9aFCg?_x^{+SC>VF2Vjd+9YN&65P5;EWgiS2A&L=F$XlI6E39mt3xO;A^L6NH~> z?p7CsyF|NSE52e&b1Ct7Q2f+t?1U4SaHyE$%8+xM-pfc6)KpWxGgu#kyLIaBsiVw> zk^Dp~)+yd(RP)k=Kcw1+WlsLB_wYdAn{6w055OE~cif=E4@@#pKTYPF{362g7u=)Yl_w8%M?EQU~oGdKW0j+7t&xJ-Hr~6v37x zHpPsH-L_!zeSViIxCK+k0V@+*qr-@uKA-TKUSKWl$)l_GUwgK(+jX~Gnf2Oni4{Z;?<0pX7Nd^RX zKa0NpK6WjPHl67N{`)mS9aY&04Z+Nx?6r2@Tk-DZpmJms*iw#s5?zm_ zCWM>2)lN)5!wYOT2OS6|aSeZ;WjSpGH;!m?B&xL5|D^T>UerX-XKW@V^7LS6U7)OM z9H`7TvDenw-x0Ay%O79d#wm>rsvj@tPRi@pZ{5pJ<0!^0)*=#bZQ7AU)8W6Y>V>Y6 z{q#_)Ks8oe!0)slHD&5~mgklr_-Z%{8s`Cx4^}0A)j|mR`WcxV8O8HSOjdF~t zGPZ|75|>d2_WAY^C$i^Fs6K{h3v=({%MxODi!xZeHZt$m2(Fx9bldlCUn&+qXYOE0 z2OwBNYw94j`-Tlw;Z89hE>V4Kgj4I&FU=&L{I%qB_V^(O0F~>Y_cvj7^S*=B_{LVP z{%>UC%9j#n0O*pRYjkt;Uhf_Nz*Xv?r1;dQ4W$;i^4G_~yqQ(4W5S~fmx%728mw#X zsPOe*cZL9Z(rkd#0e~>C@nhd_h#M>dkI3Nw#iA_9ht><=XSl)jWCxavD#k}{ z`Y6C|kQ=pg0Fb69123X2lXsUFV{g_YURO6MOz}x*xykfK00AhPnHGKV-h~16rW&A7 z9Oa;Y&8R3J$~tA`Q_1SgGyj``ArnWTR4GOwg0146Mi?>iwn;^y>^;~(phdMFsAn$D ziki8rYSHxIPM`OzYtey+UkW?nzZX_^@JZXKvgFAYX)Ek^{Tzkz|~qL&W!+nAOMf&kE5_eszs9yACJ|unHV=AEdDz z(eBv?ctMz1o4bdW{1JD;5e`tQ4OyECJvqPt{`JQ|z%N-w-3eG?;dRrf2^K zN^eXCY-ptfz_g42?kr=-DD+jX!1&aAScfZ%=STIZ7T6F4P9*M5h!p~SJ7;g)J7bd* z=6$j4Tc4o;j{7s$8-Q40HOj0a09Hfn|@+N{V!sH zC&`cIn61XKtb&hYPedSGXT@ty>+1lt|FDf?{Sqi7L<1}#4&=LA0pR`S3bol)?K+{w z!{l>-ZE(qriPdxT#kn=?=ybg%+)Ansc zzZn413b0?t&O1|CL=O^B>ljuqfHMIY?++6ob<<-Zs-U;>kHmjyB|zP8eU)we#qy5f zf4X{YGE3Y04hC&91?qvU!;Z6?d=CSrV8``3Z`0Q!)LvN3eM7o7&;orO^dg%8rK5)j zpo$S%Z<{$WT~fkG5Yaa-8Dk;yt|jr$6rLk4>11I-l#||!(e?m>@f<^ zUOyt!uwxMd{kQhSaW+sofH`yiU;L4-OQDmTaj0OX=KgymFn`MY;LeV_nat_xVD3e~ z%2;Ygg&QaAP0sJC@_g4){r-Q_N1zTjbzJFH`IgQgufy<1v%qiwkRWd}%Kdr&)C_XL zTo3fH<5pKn7wYO4zB2kZ(=3f3;{Z>+w1SgBrW6blg`OrsmT+1+GoYR@?(S>;Km#ls zGQG|LcXNFWa;oNrBp*Q+|M@oKX4t9P(NZMWMwXWoC`7~xV8Da{;C(-Ok)}1WWD^SZ zCWT%ypuiK094D4!{yZDu18l%u3>+zXUM4lC1hQRpbOmtudqc?11gOURIM>?cev7`w zRz7QHP}vRuPoT23*woqn!{G2Q&)qc5qq&T|dxkNz)-D<13##W}-Dt z1;G zk~YgP34D)i{2f8N?Ipjh*cOE}P+Bg?2MV0a>5jQ11W&VhQBt0gg4o`cM4*oltzyvx zYI*IP6QHr?(e^9o5zsko{~BZaT*HZ}7ZgR-Vr{{IX$%Uj7U{iY;32MH4aS^~bIN@M zu@xjOmw^hvg${Q%zMXmhpq|zEv)bv=S3vf!+b82^vY7^kOMJHtLlX%QxJu4EFZ=~~ zoBuWHvB9T{A@UY4Hela?H7?1L48(x)mmvV04zOk5BM<>Vb4fY7j1Zvtm*C}y%isZ; z|E1VJ=KSww`-j*+m;S5WKNkJ}i2XyuzqkU0mng2ufl4I7=cj*%<=tfC>Dj-Y2xp@vY`3gM zWY_pOOLwndY~�o{usSBR|TKal)yzKy!3ncJ0 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 literal 0 HcmV?d00001 From 305f55c2706cd3e6362f6de7810d04b290bb524a Mon Sep 17 00:00:00 2001 From: bglynn Date: Thu, 25 Jan 2024 12:12:41 -0800 Subject: [PATCH 04/20] * Network overview and Reference pages --- .../Istio/{Overview.mdx => index.mdx} | 0 .../Kafka/{Overview.mdx => index.mdx} | 0 docs/features/Networking/Reference/README.mdx | 160 +++++++++++++++++- docs/features/Networking/index.mdx | 44 +++++ docs/features/Postgres/Overview.mdx | 4 - docs/features/README.mdx | 5 +- docs/features/aws-iam/Reference.mdx | 2 +- .../aws-iam/{Overview.mdx => index.mdx} | 0 .../Examples/_category_.json | 0 .../Examples/postgres.mdx | 0 .../{Postgres => postgresql}/Reference.mdx | 0 .../{Postgres => postgresql}/_category_.json | 0 .../Overview.mdx => postgresql/index.mdx} | 0 docs/getting-started/README.mdx | 10 +- .../configuration/intents-operator/README.mdx | 2 +- docusaurus.config.js | 5 + src/css/custom.css | 8 + 17 files changed, 225 insertions(+), 15 deletions(-) rename docs/features/Istio/{Overview.mdx => index.mdx} (100%) rename docs/features/Kafka/{Overview.mdx => index.mdx} (100%) create mode 100644 docs/features/Networking/index.mdx delete mode 100644 docs/features/Postgres/Overview.mdx rename docs/features/aws-iam/{Overview.mdx => index.mdx} (100%) rename docs/features/{Postgres => postgresql}/Examples/_category_.json (100%) rename docs/features/{Postgres => postgresql}/Examples/postgres.mdx (100%) rename docs/features/{Postgres => postgresql}/Reference.mdx (100%) rename docs/features/{Postgres => postgresql}/_category_.json (100%) rename docs/features/{Networking/Overview.mdx => postgresql/index.mdx} (100%) diff --git a/docs/features/Istio/Overview.mdx b/docs/features/Istio/index.mdx similarity index 100% rename from docs/features/Istio/Overview.mdx rename to docs/features/Istio/index.mdx diff --git a/docs/features/Kafka/Overview.mdx b/docs/features/Kafka/index.mdx similarity index 100% rename from docs/features/Kafka/Overview.mdx rename to docs/features/Kafka/index.mdx diff --git a/docs/features/Networking/Reference/README.mdx b/docs/features/Networking/Reference/README.mdx index 626ea0452..f7ad43bcd 100644 --- a/docs/features/Networking/Reference/README.mdx +++ b/docs/features/Networking/Reference/README.mdx @@ -1,4 +1,162 @@ --- sidebar_position: 3 title: Reference ---- \ No newline at end of file +hide_table_of_contents: true +--- + +## Client Intents + +**Example ClientIntent (yaml)** +``` +apiVersion: k8s.otterize.com/v1alpha3 +kind: ClientIntents +metadata: + name: client-server-access + namespace: otterize-example +spec: + service: + name: client #The name of the service initiating the connection + calls: + - name: server #The name of the service recieving the connection. Multiple names can be provided +``` + + +## Helm Chart Options + +| Key | Description | Default | +|-----------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------|---------| +| `global.deployment.networkMapper` | Whether or not to deploy network-mapper. | `true` | +| `operator.autoCreateNetworkPoliciesForExternalTraffic` | (deprecated, use `allowExternalTraffic` instead) Automatically allow external traffic, if a new ClientIntents resource would result in blocking external (internet) traffic and there is an Ingress/Service resource indicating external traffic is expected. | `true` | +| `operator.autoCreateNetworkPoliciesForExternalTrafficDisableIntentsRequirement` | (deprecated, use `allowExternalTraffic` instead) **experimental** - If `autoCreateNetworkPoliciesForExternalTraffic` is enabled, do not require ClientIntents resources - simply create network policies based off of the existence of an Ingress/Service resource. | `false` | + +## Network mapper parameters +All configurable parameters of the network mapper can be configured under the alias `networkMapper`. +Further information about network mapper parameters can be found [in the network mapper's chart](https://github.com/otterize/helm-charts/tree/main/network-mapper). + + +## CLI: Network mapper + +All `otterize network-mapper` commands share a set of optional flags which will not be repeated in the documentation +for each command. + +#### Common options + +| Name | Default | Description | +|-------------------------|---------------------------|-----------------------------------------------------------------| +| `--mapper-namespace` | `otterize-system` | Specifies the namespace where the mapper service was installed. | +| `--mapper-service-name` | `otterize-network-mapper` | Specifies the name of the mapper service as it was installed. | +| `--mapper-service-name` | `otterize-service-port` | Specifies the port on which the mapper service is listening. | + + +`otterize network-mapper reset` + +Resets the network mapper by deleting all map information built up so far in memory. + +`otterize network-mapper list [-n ,,...]` + +Return the network map built by the network mapper since it started, or since it was reset, +as a list of clients and the servers they call. + +#### Options + +| Name | Default | Description | +|------------------------|---------|-------------------------------------------------------------| +| `-n` or `--namespaces` | | Include only clients in these namespaces (comma-separated). | + +#### Returns + +Here's a partial output from `otterize network-mapper list -n otterize-ecom-demo`: + +```shell +cartservice in namespace otterize-ecom-demo calls: + - redis-cart +checkoutservice in namespace otterize-ecom-demo calls: + - cartservice + - currencyservice + - emailservice + - paymentservice + - productcatalogservice + - shippingservice +frontend in namespace otterize-ecom-demo calls: + - adservice + - cartservice + - checkoutservice + - currencyservice + - productcatalogservice + - recommendationservice + - shippingservice +loadgenerator in namespace otterize-ecom-demo calls: + - frontend +recommendationservice in namespace otterize-ecom-demo calls: + - productcatalogservice +``` + +`otterize network-mapper visualize [--format=png | --format=jpg] [-n ,,...] -o ` +Return the network map built by the network mapper since it started, or since it was reset, +as an image. + +Uses GraphViz (specifically go-graphviz) to generate the image. + +#### Options + +| Name | Default | Description | +|-------------------------|---------|-----------------------------------------------------------------------------------------| +| `--format` | `png` | Image output format: "png" or "jpg". | +| `-n` or `--namespaces` | | Include only clients in these namespaces (comma-separated). | +| `-o` or `--output-path` | | Filename for the image. | +| `--exclude-labels` | | A list of labels that would exclude services from list/export. example: "include=false" | +| `--exclude-services` | | A list of service to exclude from list/export. example: "service1,service2" | + +#### Returns + +Here's the image generated by running `otterize network-mapper visualize -n otterize-ecom-demo -o otterize-ecom-demo.png`: +![graph](https://user-images.githubusercontent.com/29180932/221423644-df8fbba2-dca1-4c56-baeb-f0d0afc55eb1.png) + +`otterize network-mapper export [--format] [-n ,,...] [-o ] [--output-type ]` + +Return the network map built by the network mapper since it started, or since it was reset, +as YAML [client intents file(s)](/reference/intents-and-intents-files/#intents-file-formats) or as JSON file(s). + +#### Options + +| Name | Default | Description | +|------------------------|---------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `--format` | `yaml` | Specifies the format for the export: either `yaml` or `json`. | +| `-n` or `--namespaces` | | Export only clients in these namespaces (comma-separated). | +| `-o` or `--output` | `STDOUT` | Filename or directory for redirecting the output. | +| `--output-type` | `single-file` | Whether the output should be written as a single file (`single-file`) or as multiple files in a directory (`dir`). Requires the `-o` or `--output` to point to a directory. | +| `--server` | | Export only intents for clients that call this server. The server name must be specified with both service name and namespace, in the format `.`. Example: `cartservice.otterize-ecom-demo`. | +| `--exclude-labels` | | A list of labels that would exclude services from list/export. Example: `include=false` would exclude any service labeled with `include=false` from being included in list/export. | +| `--exclude-services` | | A list of services to exclude from list/export. Example: `service1,service2`. | + +#### Returns + +Here's a partial output from `otterize network-mapper export -n otterize-ecom-demo`: + +```shell +apiVersion: k8s.otterize.com/v1alpha3 +kind: ClientIntents +metadata: + name: cartservice + namespace: otterize-ecom-demo +spec: + service: + name: cartservice + calls: + - name: redis-cart + type: http +--- +apiVersion: k8s.otterize.com/v1alpha3 +kind: ClientIntents +metadata: + name: checkoutservice + namespace: otterize-ecom-demo +spec: + service: + name: checkoutservice + calls: + - name: cartservice + type: http + - name: currencyservice + type: http +``` \ No newline at end of file diff --git a/docs/features/Networking/index.mdx b/docs/features/Networking/index.mdx new file mode 100644 index 000000000..79d3ae993 --- /dev/null +++ b/docs/features/Networking/index.mdx @@ -0,0 +1,44 @@ +--- +sidebar_position: 1 +title: Networking +--- +import DocsLinkCard from "@site/src/components/LinkCard"; + +export const network_access_tutorials = [ + { + title: 'Create and manage network policies', + description: 'Create Kubernetes network policies using IBAC', + url: '/features/Networking/Examples/k8s-network-policies' + }, + { + title: 'Protecting a service with network policies', + description: 'An example on how to secure a single service', + url: '/features/Networking/Examples/protect-1-service-network-policies' + }, + { + title: 'AWS EKS network policies with the VPC CNI', + description: 'Leverage AWS VPC CNI to apply network policies in EKS', + url: '/features/Networking/Examples/aws-eks-cni-mini' + } +]; + +### Overview + +You can use Otterize to understand, visualize, and manage access for Kubernetes networks. Upon installation, Otterize inspects network traffic and builds an in-memory network map of connections. The network map can then be exported or viewed in various ways to understand the connections within your networks. With IBAC-based policies, Otterize becomes a control plane for your K8s networks. Mapped network traffic can autogenerate declarative intent-based access policies to create least privileged pod-to-pod access easily. + +### Visualizing + +After installation, Otterize collects network traffic data in memory, creating a graph of relationships between pod-to-pod and pod-to-public internet traffic. Once the graph is in place, the data can be exported or viewed in various ways. Otterize Cloud users can see and interact with the graph structures within the Otterize application. OSS users can use the CLI tool to export the data into JSON, list the relationship, or generate IBAC policies reflecting the existing traffic. + +To learn more about Visualizing, check out [Visualizing a Kubernetes Network](/features/Networking/Examples/k8s-network-mapper) + + +### Access Control + +By default, Kubernetes pods allow all egress and ingress traffic. Kubernetes [NetworkPolicies](/reference/terminology#network-policies) provide `policyTypes` to restrict egress or ingress traffic, providing a more secure and compliant environment. Utilizing the in-memory tariff map, Otterize can automatically generate IBAC policies to reflect the current traffic flow within a cluster. Once the IBAC policies are submitted, Otterize will generate and apply the corresponding NetworkPolicies to your namespaces. + +Further details are available within the [Network Policies Deep Dive](/features/Networking/Reference/Network-Policies-Deep-Dive) + +View the tutorials below to learn more about how to get started + + diff --git a/docs/features/Postgres/Overview.mdx b/docs/features/Postgres/Overview.mdx deleted file mode 100644 index 7e4dcc2d8..000000000 --- a/docs/features/Postgres/Overview.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -sidebar_position: 1 -title: Overview ---- \ No newline at end of file diff --git a/docs/features/README.mdx b/docs/features/README.mdx index 1513e9df8..e6bf58974 100644 --- a/docs/features/README.mdx +++ b/docs/features/README.mdx @@ -14,6 +14,7 @@ import { export default function FeatureCards() { const category = useCurrentSidebarCategory(); const features = category.items; + console.log(JSON.stringify(features)); return (

Features

@@ -26,8 +27,7 @@ export default function FeatureCards() { {features.map((feature) => (
- {feature.items && feature.items[0] && feature.items[0].href && - + ))}
diff --git a/docs/features/aws-iam/Reference.mdx b/docs/features/aws-iam/Reference.mdx index bfc777d18..62a8acd22 100644 --- a/docs/features/aws-iam/Reference.mdx +++ b/docs/features/aws-iam/Reference.mdx @@ -9,7 +9,7 @@ title: Reference | credentials-operator.otterize.com/create-aws-role | boolean | By setting to **true** the credential operator will create an unique AWS Role for the associated pod | **ClientIntents** (YAML) -| key | sub-ley | type | type | Description | +| key | sub-key | type | type | Description | |-------------|------------|-------|--------|--------------------------------------------------------------| | **service** | name | value | string | The name of the pod that will be granted access | | **calls** | name | list | ARN | The AWS ARN or ARN wildcard that references the resource(s) for the authorization. See [ARN Formats - Amazon QuickSight](https://docs.aws.amazon.com/quicksight/latest/APIReference/qs-arn-format.html) for more information | diff --git a/docs/features/aws-iam/Overview.mdx b/docs/features/aws-iam/index.mdx similarity index 100% rename from docs/features/aws-iam/Overview.mdx rename to docs/features/aws-iam/index.mdx diff --git a/docs/features/Postgres/Examples/_category_.json b/docs/features/postgresql/Examples/_category_.json similarity index 100% rename from docs/features/Postgres/Examples/_category_.json rename to docs/features/postgresql/Examples/_category_.json diff --git a/docs/features/Postgres/Examples/postgres.mdx b/docs/features/postgresql/Examples/postgres.mdx similarity index 100% rename from docs/features/Postgres/Examples/postgres.mdx rename to docs/features/postgresql/Examples/postgres.mdx diff --git a/docs/features/Postgres/Reference.mdx b/docs/features/postgresql/Reference.mdx similarity index 100% rename from docs/features/Postgres/Reference.mdx rename to docs/features/postgresql/Reference.mdx diff --git a/docs/features/Postgres/_category_.json b/docs/features/postgresql/_category_.json similarity index 100% rename from docs/features/Postgres/_category_.json rename to docs/features/postgresql/_category_.json diff --git a/docs/features/Networking/Overview.mdx b/docs/features/postgresql/index.mdx similarity index 100% rename from docs/features/Networking/Overview.mdx rename to docs/features/postgresql/index.mdx diff --git a/docs/getting-started/README.mdx b/docs/getting-started/README.mdx index 480851c46..5436707d2 100644 --- a/docs/getting-started/README.mdx +++ b/docs/getting-started/README.mdx @@ -21,27 +21,27 @@ export const features = [ { title: 'Network Policies', icon: '/img/icons/networking.png', - url: '/features/Networking/Overview' + url: '/features/networking/' }, { title: 'AWS IAM', icon: '/img/icons/aws.png', - url: '/features/aws-iam/Overview' + url: '/features/aws-iam/' }, { title: 'Kafka', icon: '/img/icons/kafka.png', - url: '/features/kafka/Overview' + url: '/features/kafka/' }, { title: 'PostgreSQL', icon: '/img/icons/postgresql.png', - url: '/features/postgresql/Overview' + url: '/features/postgresql/' }, { title: 'Istio', icon: '/img/icons/istio.png', - url: '/features/istio/Overview' + url: '/features/istio/' }, ]; diff --git a/docs/reference/configuration/intents-operator/README.mdx b/docs/reference/configuration/intents-operator/README.mdx index d8543be88..61e64358a 100644 --- a/docs/reference/configuration/intents-operator/README.mdx +++ b/docs/reference/configuration/intents-operator/README.mdx @@ -78,7 +78,7 @@ it is attempting to read, so the end result is that the topic ACLs determine act ### PostgreSQL users & access The intents operator automatically creates, and updates credentials in PostgreSQL databases according to the declared intents. It works together with the Otterize credentials operator to easily enable secure access to PostgreSQL from client pods, all in your Kubernetes cluster. -Try the [Just-in-time PostgreSQL users & access](https://docs.otterize.com/quickstart/access-control/postgresql) tutorial to learn more. +Try the [Just-in-time PostgreSQL users & access](/features/postgresql/Examples/postgresql) tutorial to learn more. ### Istio AuthorizationPolicy The intents operator automatically creates, updates and deletes Istio authorization policies, automatically looks up service accounts for client pods and labels server pods, to reflect precisely the client-to-server calls declared in client intents files. diff --git a/docusaurus.config.js b/docusaurus.config.js index e5dfddc06..b99c0badf 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -415,6 +415,11 @@ const config = { theme: lightCodeTheme, darkTheme: darkCodeTheme, }, + docs: { + sidebar: { + autoCollapseCategories: true, + }, + }, colorMode: { defaultMode: "light", disableSwitch: true, diff --git a/src/css/custom.css b/src/css/custom.css index 7232bddbf..5a1341d3b 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -23,6 +23,14 @@ --ifm-h1-font-size: 2.5rem; --ifm-code-border-radius: 5px; --docusaurus-highlighted-code-line-bg: rgba(255, 255, 255, 0.2); + --docusaurus-details-decoration-color: #4d3df7; + --ifm-alert-border-color: #4d3df7; + --ifm-alert-background-color-highlight: #4d3df7; + --ifm-alert-background-color: #e9e9ec; + --ifm-color-info-contrast-background: #f5f5f8; + --ifm-alert-padding-vertical: 8px; + --ifm-color-info-dark: #4d3df7; + --ifm-alert-border-radius: 2px; --ifm-navbar-height: 5rem; --ifm-menu-color: #333; From 0ef28f327a217afd75cd48551b8d48b93d7446e9 Mon Sep 17 00:00:00 2001 From: bglynn Date: Mon, 29 Jan 2024 09:58:50 -0800 Subject: [PATCH 05/20] * Kafka Overview / Reference * PosgreSQL Overview / Reference * Istio Overview / Reference --- docs/features/Istio/Reference.mdx | 34 +- docs/features/Istio/index.mdx | 99 +- docs/features/Kafka/Reference.mdx | 50 +- docs/features/Kafka/index.mdx | 130 +- docs/features/Networking/Reference/README.mdx | 26 +- docs/features/Networking/index.mdx | 29 +- docs/features/README.mdx | 2 +- docs/features/aws-iam/Reference.mdx | 35 +- docs/features/aws-iam/index.mdx | 2 +- docs/features/postgresql/Reference.mdx | 30 +- docs/features/postgresql/index.mdx | 98 +- package.json | 3 +- src/css/custom.css | 5 +- yarn.lock | 2337 +++++++++++++---- 14 files changed, 2270 insertions(+), 610 deletions(-) diff --git a/docs/features/Istio/Reference.mdx b/docs/features/Istio/Reference.mdx index 626ea0452..4adb25e10 100644 --- a/docs/features/Istio/Reference.mdx +++ b/docs/features/Istio/Reference.mdx @@ -1,4 +1,36 @@ --- sidebar_position: 3 title: Reference ---- \ No newline at end of file +--- + +### Client Intents (YAML) + +```yaml +apiVersion: k8s.otterize.com/v1alpha3 +kind: ClientIntents +metadata: + name: client + namespace: otterize-tutorial-istio +spec: + service: + name: client + calls: + - name: nginx + type: http + HTTPResources: + - path: /client-path + methods: [ GET ] +``` + + +### Helm Chart Options + +| Key | Description | Default | +|---------------------------------|-----------------------------------------|--------------------------------| +| `istiowatcher.enable` | Enable Istio watcher deployment (beta). | `false` | +| `istiowatcher.image.repository` | Istio watcher image repository. | `otterize` | +| `istiowatcher.image.image` | Istio watcher image. | `network-mapper-istio-watcher` | +| `istiowatcher.image.tag` | Istio watcher image tag. | `latest` | +| `istiowatcher.pullPolicy` | Istio watcher pull policy. | `(none)` | +| `istiowatcher.pullSecrets` | Istio watcher pull secrets. | `(none)` | +| `istiowatcher.resources` | Resources override. | `(none)` | diff --git a/docs/features/Istio/index.mdx b/docs/features/Istio/index.mdx index 7e4dcc2d8..a07d425d9 100644 --- a/docs/features/Istio/index.mdx +++ b/docs/features/Istio/index.mdx @@ -1,4 +1,99 @@ --- sidebar_position: 1 -title: Overview ---- \ No newline at end of file +title: Istio | Overview +hide_title: true +--- + +import DocsLinkCard from "@site/src/components/LinkCard"; + +export const istio_tutorials = [ + { + title: 'Istio AuthorizationPolicy automation', + description: 'Generate AuthorizationPolicy docs from existing connections', + url: '/features/istio/examples/k8s-istio-authorization-policies' + }, + { + title: 'Istio HTTP-level access mapping', + description: 'View the HTTP methods being used across services', + url: '/features/istio/examples/k8s-istio-water' + } +]; + + + +# Istio + +Otterize can map and secure access with Istio HTTP connections across your Kubernetes services. + +### About + +When enabling Istio support, Otterize's network mapping tool can determine which Kubernetes services are connected and which HTTP methods are being used. This graph of connections can then be leveraged to automate IBAC based access policies that result in Istio AuthorizationPolicy(s). + +### How does it work + +1. First, the cluster must have [Otterize installed](/overview/installation). With Istio support enabled by setting the following flag: + +```bash +--set networkMapper.istiowatcher.enable=true +``` + +2. To monitor connections and HTTP methods, we need to enable connection telemetry data within Istio. This can be enabled with the following YAML: + +```yaml +apiVersion: telemetry.istio.io/v1alpha1 +kind: Telemetry +metadata: + name: mesh-default + namespace: istio-system +spec: + # Configure access logging for Istio services + accessLogging: + # Define the access logging provider, in this case, Envoy + - providers: + - name: envoy + metrics: + # Configure metrics collection for Istio services using Prometheus + - providers: + - name: prometheus + # Customize metric tag overrides + overrides: + - tagOverrides: + # Map the "request_method" metric tag to "request.method" value + request_method: + value: request.method + # Map the "request_path" metric tag to "request.path" value + request_path: + value: request.path + +``` + +Once installed, Otterize will query Envoy sidecars for known connections and building an in-memory map of the relationships. After the map is built your can then view those relationships. + +**To Manage Access** + +You simply need to define and apply your intent based access control ([IBAC](/overview/intent-based-access-control)) policies for your services. + +```yaml + +apiVersion: k8s.otterize.com/v1alpha3 +kind: ClientIntents +metadata: + name: client + namespace: otterize-tutorial-istio +spec: + service: + name: client + calls: + - name: server-abc + type: http + HTTPResources: + - path: /client-path + methods: [ GET ] + +``` + +### Tutorials + +For further details about mapping, or access automation, view the tutorials below: + + diff --git a/docs/features/Kafka/Reference.mdx b/docs/features/Kafka/Reference.mdx index 626ea0452..8bbbbdb09 100644 --- a/docs/features/Kafka/Reference.mdx +++ b/docs/features/Kafka/Reference.mdx @@ -1,4 +1,52 @@ --- sidebar_position: 3 title: Reference ---- \ No newline at end of file +--- + +### KafkaServerConfig (YAML) + +```yaml +apiVersion: k8s.otterize.com/v1alpha3 +kind: KafkaServerConfig +metadata: + name: kafkaserverconfig + namespace: kafka +spec: + service: + name: kafka #name of the Kafka service broker + addr: kafka.kafka:9092 +``` + +### ClientIntents (YAML) + +```yaml +apiVersion: k8s.otterize.com/v1alpha3 +kind: ClientIntents +metadata: + name: client + namespace: otterize-tutorial-kafka-mtls +spec: + service: + name: client # The service requiring access to a topic + calls: + - name: kafka.kafka # name of the Kafka service broker + type: kafka + kafkaTopics: + - name: mytopic # Topic name + operations: [ produce,describe,consume ] # ACL Operations like alter, delete, all, etc + - name: transactions # Multiple topics can be added + operations: [ produce,describe,consume ] +``` + +### Helm Chart Options + +| Key | Description | Default | +|---------------------------------|-------------------------------------------------------------|--------------------------------| +| `kafkawatcher.enable` | Enable Kafka watcher deployment (beta). | `false` | +| `kafkawatcher.image.repository` | Kafka watcher image repository. | `otterize` | +| `kafkawatcher.image.image` | Kafka watcher image. | `network-mapper-kafka-watcher` | +| `kafkawatcher.image.tag` | Kafka watcher image tag. | `latest` | +| `kafkawatcher.pullPolicy` | Kafka watcher pull policy. | `(none)` | +| `kafkawatcher.pullSecrets` | Kafka watcher pull secrets. | `(none)` | +| `kafkawatcher.resources` | Resources override. | `(none)` | +| `kafkawatcher.kafkaServers` | Kafka servers to watch, specified as `pod.namespace` items. | `(none)` | diff --git a/docs/features/Kafka/index.mdx b/docs/features/Kafka/index.mdx index 7e4dcc2d8..233c9b134 100644 --- a/docs/features/Kafka/index.mdx +++ b/docs/features/Kafka/index.mdx @@ -1,4 +1,130 @@ --- sidebar_position: 1 -title: Overview ---- \ No newline at end of file +title: Kafka +hide_table_of_contents: true +hide_title: true +--- + +import DocsLinkCard from "@site/src/components/LinkCard"; + +export const kafka_tutorials = [ + { + title: 'Kafka topic-level access mapping', + description: 'View Kafka network connections', + url: '/features/Kafka/Examples/k8s-kafka-mapping' + }, + { + title: 'Kafka access automation using Otterize Cloud mTLS', + description: 'Manage access to Kafka topics with Otterize Cloud mTLS', + url: '/features/Kafka/Examples/k8s-kafka-mtls' + }, + { + title: 'Kafka access automation using cert-manager mTLS', + description: 'Manage access to Kafka topics with a cert-manager', + url: '/features/Kafka/Examples/k8s-kafka-mtls-cert-manager' + } +]; + +# Kafka + +Otterize can map and secure access to Kafka Topics from your Kubernetes clusters. + +### About + +By enabling Kafka support, Otterize's network mapping tool can determine which Kubernetes services are connecting to topics and the determine their access privileges. This graph of connections can then be leveraged to automate IBAC based access policies that result in Kakfa ACLs. + +### How does it work + +1. First, the cluster must have [Otterize installed](/overview/installation). With Kakfa support enabled by setting the following flags: + +```bash +--set kafkawatcher.enable=true \ +--set kafkawatcher.kafkaServers={"kafka-0.kafka"} +``` + +Once installed, Otterize will map Kafka connections allowing you to view those relationships, but to manage access we need to: + +2. Configure Otterize to manage Kafka access with a `KafkaServerConfig`. See the example yaml below. + +```bash +kubectl apply -f ${ABSOLUTE_URL}/code-examples/kafka-mtls/kafkaserverconfig.yaml +``` + +```yaml +apiVersion: k8s.otterize.com/v1alpha3 +kind: KafkaServerConfig +metadata: + name: kafkaserverconfig + namespace: kafka +spec: + service: + name: kafka #name of the Kafka service broker + addr: kafka.kafka:9092 +``` + + +3. Once that is complete, the Kafka broker and it's clients require mTLS credentials, which they can receive from Otterize or through a [cert-manager](/features/Kafka/Examples/k8s-kafka-mtls-cert-manager). This requires a annotation to inform Otterize to generate the credentials and volume mount to store them. To orchestrate this, see the example deployment below: + +```yaml +spec: + template: + metadata: + annotations: + # 1. Generate credentials as a secret called "client-credentials-secret": + credentials-operator.otterize.com/tls-secret-name: client-credentials-secret + ... + spec: + volumes: + # 2. Create a volume containing this secret: + - name: otterize-credentials + secret: + secretName: client-credentials-secret + ... + containers: + - name: client + ... + volumeMounts: + # 3. Mount volume into container + - name: otterize-credentials + mountPath: /var/otterize/credentials + readOnly: true +``` + +4. Once the Kafka clients are deployed with the mTLS credentials they should be able to access their associated topics as there's no active enforcement enabled. By applying IBAC ClientIntents we can declare access for our Services. See an example of a Kafka policy. + +```yaml +apiVersion: k8s.otterize.com/v1alpha3 +kind: ClientIntents +metadata: + name: client + namespace: otterize-tutorial-kafka-mtls +spec: + service: + name: client + calls: + - name: kafka.kafka + type: kafka + kafkaTopics: + - name: mytopic + operations: [ produce,describe,consume ] + - name: transactions + operations: [ produce,describe,consume ] +--- +apiVersion: k8s.otterize.com/v1alpha3 +kind: ClientIntents +metadata: + name: kafka + namespace: kafka +spec: + service: + name: kafka + calls: + - name: kafka + - name: kafka-zookeeper +``` +### Tutorials + +For further details about mapping, or access automation, view the tutorials below: + + + diff --git a/docs/features/Networking/Reference/README.mdx b/docs/features/Networking/Reference/README.mdx index f7ad43bcd..4c7ae3fd0 100644 --- a/docs/features/Networking/Reference/README.mdx +++ b/docs/features/Networking/Reference/README.mdx @@ -4,10 +4,9 @@ title: Reference hide_table_of_contents: true --- -## Client Intents +### Client Intents (YAML) -**Example ClientIntent (yaml)** -``` +```yaml apiVersion: k8s.otterize.com/v1alpha3 kind: ClientIntents metadata: @@ -21,7 +20,7 @@ spec: ``` -## Helm Chart Options +### Helm Chart Options | Key | Description | Default | |-----------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------|---------| @@ -29,29 +28,22 @@ spec: | `operator.autoCreateNetworkPoliciesForExternalTraffic` | (deprecated, use `allowExternalTraffic` instead) Automatically allow external traffic, if a new ClientIntents resource would result in blocking external (internet) traffic and there is an Ingress/Service resource indicating external traffic is expected. | `true` | | `operator.autoCreateNetworkPoliciesForExternalTrafficDisableIntentsRequirement` | (deprecated, use `allowExternalTraffic` instead) **experimental** - If `autoCreateNetworkPoliciesForExternalTraffic` is enabled, do not require ClientIntents resources - simply create network policies based off of the existence of an Ingress/Service resource. | `false` | -## Network mapper parameters +### Network mapper parameters All configurable parameters of the network mapper can be configured under the alias `networkMapper`. Further information about network mapper parameters can be found [in the network mapper's chart](https://github.com/otterize/helm-charts/tree/main/network-mapper). -## CLI: Network mapper +### CLI: Network mapper commands All `otterize network-mapper` commands share a set of optional flags which will not be repeated in the documentation for each command. -#### Common options - -| Name | Default | Description | -|-------------------------|---------------------------|-----------------------------------------------------------------| -| `--mapper-namespace` | `otterize-system` | Specifies the namespace where the mapper service was installed. | -| `--mapper-service-name` | `otterize-network-mapper` | Specifies the name of the mapper service as it was installed. | -| `--mapper-service-name` | `otterize-service-port` | Specifies the port on which the mapper service is listening. | - - `otterize network-mapper reset` Resets the network mapper by deleting all map information built up so far in memory. +--- + `otterize network-mapper list [-n ,,...]` Return the network map built by the network mapper since it started, or since it was reset, @@ -90,7 +82,7 @@ loadgenerator in namespace otterize-ecom-demo calls: recommendationservice in namespace otterize-ecom-demo calls: - productcatalogservice ``` - +--- `otterize network-mapper visualize [--format=png | --format=jpg] [-n ,,...] -o ` Return the network map built by the network mapper since it started, or since it was reset, as an image. @@ -112,6 +104,8 @@ Uses GraphViz (specifically go-graphviz) to generate the image. Here's the image generated by running `otterize network-mapper visualize -n otterize-ecom-demo -o otterize-ecom-demo.png`: ![graph](https://user-images.githubusercontent.com/29180932/221423644-df8fbba2-dca1-4c56-baeb-f0d0afc55eb1.png) +--- + `otterize network-mapper export [--format] [-n ,,...] [-o ] [--output-type ]` Return the network map built by the network mapper since it started, or since it was reset, diff --git a/docs/features/Networking/index.mdx b/docs/features/Networking/index.mdx index 79d3ae993..7dcc80a9b 100644 --- a/docs/features/Networking/index.mdx +++ b/docs/features/Networking/index.mdx @@ -1,6 +1,7 @@ --- sidebar_position: 1 title: Networking +hide_title: true --- import DocsLinkCard from "@site/src/components/LinkCard"; @@ -22,8 +23,9 @@ export const network_access_tutorials = [ } ]; -### Overview +# Networking +### About You can use Otterize to understand, visualize, and manage access for Kubernetes networks. Upon installation, Otterize inspects network traffic and builds an in-memory network map of connections. The network map can then be exported or viewed in various ways to understand the connections within your networks. With IBAC-based policies, Otterize becomes a control plane for your K8s networks. Mapped network traffic can autogenerate declarative intent-based access policies to create least privileged pod-to-pod access easily. ### Visualizing @@ -39,6 +41,27 @@ By default, Kubernetes pods allow all egress and ingress traffic. Kubernetes [Ne Further details are available within the [Network Policies Deep Dive](/features/Networking/Reference/Network-Policies-Deep-Dive) -View the tutorials below to learn more about how to get started +```yaml - +apiVersion: k8s.otterize.com/v1alpha3 +kind: ClientIntents +metadata: + name: client + namespace: otterize-tutorial-istio +spec: + service: + name: client + calls: + - name: nginx + type: http + HTTPResources: + - path: /client-path + methods: [ GET ] + +``` + +### Tutorials + +View the tutorials below to learn more about how to get started: + + diff --git a/docs/features/README.mdx b/docs/features/README.mdx index e6bf58974..28c41d948 100644 --- a/docs/features/README.mdx +++ b/docs/features/README.mdx @@ -26,7 +26,7 @@ export default function FeatureCards() {
{features.map((feature) => (
+ className="tw-col-span-1 tw-flex tw-flex-col tw-divide-y tw-divide-gray-200 tw-rounded-lg tw-border tw-border-solid tw-border-primary-500 tw-bg-white tw-text-center tw-border-1 tw-border-primary-400 tw-border-solid hover:tw-border-primary-600 hover:tw-shadow-md">
+ diff --git a/package.json b/package.json index d1c852a70..d2beb76e9 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,8 @@ "heroicons": "^2.1.1", "prism-react-renderer": "^1.3.5", "react": "^17.0.2", - "react-dom": "^17.0.2" + "react-dom": "^17.0.2", + "vercel": "^33.4.0" }, "devDependencies": { "@docusaurus/module-type-aliases": "^2.4.3", diff --git a/src/css/custom.css b/src/css/custom.css index 5a1341d3b..403a55a7b 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -18,7 +18,7 @@ --ifm-color-primary-lighter: #377fad; --ifm-color-primary-lightest: #408fc2; --ifm-code-font-size: 85%; - --ifm-font-size-base: 0.9rem; + --ifm-font-size-base: 0.85rem; --ifm-font-weight-base: 400; --ifm-h1-font-size: 2.5rem; --ifm-code-border-radius: 5px; @@ -33,7 +33,8 @@ --ifm-alert-border-radius: 2px; --ifm-navbar-height: 5rem; - --ifm-menu-color: #333; + --ifm-menu-color: rgb(28, 30, 33); + --ifm-footer-background-color: white; --ifm-footer-color: white; diff --git a/yarn.lock b/yarn.lock index 199721d77..dd4fda918 100644 --- a/yarn.lock +++ b/yarn.lock @@ -84,7 +84,7 @@ "@algolia/requester-common" "4.20.0" "@algolia/transporter" "4.20.0" -"@algolia/client-search@4.20.0": +"@algolia/client-search@>= 4.9.1 < 6", "@algolia/client-search@4.20.0": version "4.20.0" resolved "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.20.0.tgz" integrity sha512-zgwqnMvhWLdpzKTpd3sGmMlr4c+iS7eyyLGiaO51zDZWGMkpgoNVmltkzdBwxOVXz0RsFMznIxB9zuarUv4TZg== @@ -145,26 +145,47 @@ "@ampproject/remapping@^2.2.0": version "2.2.1" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz" integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== dependencies: "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.8.3": - version "7.22.13" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" - integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.8.3": + version "7.23.5" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz" + integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== dependencies: - "@babel/highlight" "^7.22.13" + "@babel/highlight" "^7.23.4" chalk "^2.4.2" -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9", "@babel/compat-data@^7.23.2": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.2.tgz#6a12ced93455827037bfb5ed8492820d60fc32cc" - integrity sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ== +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9", "@babel/compat-data@^7.23.2", "@babel/compat-data@^7.23.5": + version "7.23.5" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz" + integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== + +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.0.0-0 || ^8.0.0-0 <8.0.0", "@babel/core@^7.12.0", "@babel/core@^7.13.0", "@babel/core@^7.18.6", "@babel/core@^7.19.6", "@babel/core@^7.4.0 || ^8.0.0-0 <8.0.0": + version "7.23.9" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz" + integrity sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.6" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helpers" "^7.23.9" + "@babel/parser" "^7.23.9" + "@babel/template" "^7.23.9" + "@babel/traverse" "^7.23.9" + "@babel/types" "^7.23.9" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" -"@babel/core@7.12.9": +"@babel/core@^7.11.6", "@babel/core@7.12.9": version "7.12.9" resolved "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz" integrity sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ== @@ -186,65 +207,44 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@^7.18.6", "@babel/core@^7.19.6": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.2.tgz#ed10df0d580fff67c5f3ee70fd22e2e4c90a9f94" - integrity sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" - "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-module-transforms" "^7.23.0" - "@babel/helpers" "^7.23.2" - "@babel/parser" "^7.23.0" - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.2" - "@babel/types" "^7.23.0" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - -"@babel/generator@^7.12.5", "@babel/generator@^7.18.7", "@babel/generator@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" - integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== +"@babel/generator@^7.12.5", "@babel/generator@^7.18.7", "@babel/generator@^7.23.6": + version "7.23.6" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz" + integrity sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw== dependencies: - "@babel/types" "^7.23.0" + "@babel/types" "^7.23.6" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" "@babel/helper-annotate-as-pure@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" + resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz" integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== dependencies: "@babel/types" "^7.22.5" "@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" + resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz" integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== dependencies: "@babel/types" "^7.22.15" -"@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52" - integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== +"@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.23.6": + version "7.23.6" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz" + integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== dependencies: - "@babel/compat-data" "^7.22.9" - "@babel/helper-validator-option" "^7.22.15" - browserslist "^4.21.9" + "@babel/compat-data" "^7.23.5" + "@babel/helper-validator-option" "^7.23.5" + browserslist "^4.22.2" lru-cache "^5.1.1" semver "^6.3.1" "@babel/helper-create-class-features-plugin@^7.22.11", "@babel/helper-create-class-features-plugin@^7.22.15", "@babel/helper-create-class-features-plugin@^7.22.5": version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz#97a61b385e57fe458496fad19f8e63b63c867de4" + resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz" integrity sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" @@ -259,7 +259,7 @@ "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" + resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz" integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" @@ -268,7 +268,7 @@ "@babel/helper-define-polyfill-provider@^0.4.3": version "0.4.3" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz#a71c10f7146d809f4a256c373f462d9bba8cf6ba" + resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz" integrity sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug== dependencies: "@babel/helper-compilation-targets" "^7.22.6" @@ -279,12 +279,12 @@ "@babel/helper-environment-visitor@^7.22.20", "@babel/helper-environment-visitor@^7.22.5": version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz" integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== "@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz" integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== dependencies: "@babel/template" "^7.22.15" @@ -292,29 +292,29 @@ "@babel/helper-hoist-variables@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz" integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== dependencies: "@babel/types" "^7.22.5" "@babel/helper-member-expression-to-functions@^7.22.15": version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" + resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz" integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== dependencies: "@babel/types" "^7.23.0" "@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.22.5": version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz" integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== dependencies: "@babel/types" "^7.22.15" -"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz#3ec246457f6c842c0aee62a01f60739906f7047e" - integrity sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw== +"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.23.0", "@babel/helper-module-transforms@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz" + integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== dependencies: "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-module-imports" "^7.22.15" @@ -324,24 +324,24 @@ "@babel/helper-optimise-call-expression@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" + resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz" integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== dependencies: "@babel/types" "^7.22.5" +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + "@babel/helper-plugin-utils@7.10.4": version "7.10.4" resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz" integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" - integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== - "@babel/helper-remap-async-to-generator@^7.22.20", "@babel/helper-remap-async-to-generator@^7.22.5": version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" + resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz" integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" @@ -350,7 +350,7 @@ "@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9": version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz#e37d367123ca98fe455a9887734ed2e16eb7a793" + resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz" integrity sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw== dependencies: "@babel/helper-environment-visitor" "^7.22.20" @@ -359,82 +359,82 @@ "@babel/helper-simple-access@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz" integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== dependencies: "@babel/types" "^7.22.5" "@babel/helper-skip-transparent-expression-wrappers@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" + resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz" integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== dependencies: "@babel/types" "^7.22.5" "@babel/helper-split-export-declaration@^7.22.6": version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz" integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== dependencies: "@babel/types" "^7.22.5" -"@babel/helper-string-parser@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" - integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== +"@babel/helper-string-parser@^7.23.4": + version "7.23.4" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz" + integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== "@babel/helper-validator-identifier@^7.22.20": version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz" integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== -"@babel/helper-validator-option@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040" - integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== +"@babel/helper-validator-option@^7.22.15", "@babel/helper-validator-option@^7.23.5": + version "7.23.5" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz" + integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== "@babel/helper-wrap-function@^7.22.20": version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569" + resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz" integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw== dependencies: "@babel/helper-function-name" "^7.22.5" "@babel/template" "^7.22.15" "@babel/types" "^7.22.19" -"@babel/helpers@^7.12.5", "@babel/helpers@^7.23.2": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.2.tgz#2832549a6e37d484286e15ba36a5330483cac767" - integrity sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ== +"@babel/helpers@^7.12.5", "@babel/helpers@^7.23.9": + version "7.23.9" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz" + integrity sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ== dependencies: - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.2" - "@babel/types" "^7.23.0" + "@babel/template" "^7.23.9" + "@babel/traverse" "^7.23.9" + "@babel/types" "^7.23.9" -"@babel/highlight@^7.22.13": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" - integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== +"@babel/highlight@^7.23.4": + version "7.23.4" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz" + integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== dependencies: "@babel/helper-validator-identifier" "^7.22.20" chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.12.7", "@babel/parser@^7.18.8", "@babel/parser@^7.22.15", "@babel/parser@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" - integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== +"@babel/parser@^7.12.7", "@babel/parser@^7.18.8", "@babel/parser@^7.23.9": + version "7.23.9" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz" + integrity sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.15": version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz#02dc8a03f613ed5fdc29fb2f728397c78146c962" + 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.22.15.tgz" integrity sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.15": version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz#2aeb91d337d4e1a1e7ce85b76a37f5301781200f" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz" integrity sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -452,7 +452,7 @@ "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": version "7.21.0-placeholder-for-preset-env.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" + 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== "@babel/plugin-syntax-async-generators@^7.8.4": @@ -492,21 +492,21 @@ "@babel/plugin-syntax-import-assertions@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz#07d252e2aa0bc6125567f742cd58619cb14dce98" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz" integrity sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-import-attributes@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz#ab840248d834410b829f569f5262b9e517555ecb" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz" integrity sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-import-meta@^7.10.4": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== dependencies: "@babel/helper-plugin-utils" "^7.10.4" @@ -518,6 +518,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-jsx@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz" + integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-jsx@7.12.1": version "7.12.1" resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz" @@ -525,13 +532,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-jsx@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" - integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" @@ -553,7 +553,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-object-rest-spread@7.8.3", "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": +"@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3", "@babel/plugin-syntax-object-rest-spread@7.8.3": 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== @@ -590,14 +590,14 @@ "@babel/plugin-syntax-typescript@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz#aac8d383b062c5072c647a31ef990c1d0af90272" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz" integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" + 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== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.18.6" @@ -605,14 +605,14 @@ "@babel/plugin-transform-arrow-functions@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz#e5ba566d0c58a5b2ba2a8b795450641950b71958" + resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz" integrity sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-async-generator-functions@^7.23.2": version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz#054afe290d64c6f576f371ccc321772c8ea87ebb" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz" integrity sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ== dependencies: "@babel/helper-environment-visitor" "^7.22.20" @@ -622,7 +622,7 @@ "@babel/plugin-transform-async-to-generator@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz#c7a85f44e46f8952f6d27fe57c2ed3cc084c3775" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz" integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ== dependencies: "@babel/helper-module-imports" "^7.22.5" @@ -631,21 +631,21 @@ "@babel/plugin-transform-block-scoped-functions@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz#27978075bfaeb9fa586d3cb63a3d30c1de580024" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz" integrity sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-block-scoping@^7.23.0": version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz#8744d02c6c264d82e1a4bc5d2d501fd8aff6f022" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz" integrity sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-class-properties@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz#97a56e31ad8c9dc06a0b3710ce7803d5a48cca77" + resolved "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz" integrity sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ== dependencies: "@babel/helper-create-class-features-plugin" "^7.22.5" @@ -653,7 +653,7 @@ "@babel/plugin-transform-class-static-block@^7.22.11": version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz#dc8cc6e498f55692ac6b4b89e56d87cec766c974" + resolved "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz" integrity sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g== dependencies: "@babel/helper-create-class-features-plugin" "^7.22.11" @@ -662,7 +662,7 @@ "@babel/plugin-transform-classes@^7.22.15": version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz#aaf4753aee262a232bbc95451b4bdf9599c65a0b" + resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz" integrity sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" @@ -677,7 +677,7 @@ "@babel/plugin-transform-computed-properties@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz#cd1e994bf9f316bd1c2dafcd02063ec261bb3869" + resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz" integrity sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -685,14 +685,14 @@ "@babel/plugin-transform-destructuring@^7.23.0": version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz#6447aa686be48b32eaf65a73e0e2c0bd010a266c" + resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz" integrity sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-dotall-regex@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz#dbb4f0e45766eb544e193fb00e65a1dd3b2a4165" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz" integrity sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.22.5" @@ -700,14 +700,14 @@ "@babel/plugin-transform-duplicate-keys@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz#b6e6428d9416f5f0bba19c70d1e6e7e0b88ab285" + resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz" integrity sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-dynamic-import@^7.22.11": version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz#2c7722d2a5c01839eaf31518c6ff96d408e447aa" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz" integrity sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -715,7 +715,7 @@ "@babel/plugin-transform-exponentiation-operator@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz#402432ad544a1f9a480da865fda26be653e48f6a" + resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz" integrity sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g== dependencies: "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5" @@ -723,7 +723,7 @@ "@babel/plugin-transform-export-namespace-from@^7.22.11": version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz#b3c84c8f19880b6c7440108f8929caf6056db26c" + resolved "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz" integrity sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -731,14 +731,14 @@ "@babel/plugin-transform-for-of@^7.22.15": version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz#f64b4ccc3a4f131a996388fae7680b472b306b29" + resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz" integrity sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-function-name@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz#935189af68b01898e0d6d99658db6b164205c143" + resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz" integrity sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg== dependencies: "@babel/helper-compilation-targets" "^7.22.5" @@ -747,7 +747,7 @@ "@babel/plugin-transform-json-strings@^7.22.11": version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz#689a34e1eed1928a40954e37f74509f48af67835" + resolved "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz" integrity sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -755,14 +755,14 @@ "@babel/plugin-transform-literals@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz#e9341f4b5a167952576e23db8d435849b1dd7920" + resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz" integrity sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-logical-assignment-operators@^7.22.11": version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz#24c522a61688bde045b7d9bc3c2597a4d948fc9c" + resolved "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz" integrity sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -770,14 +770,14 @@ "@babel/plugin-transform-member-expression-literals@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz#4fcc9050eded981a468347dd374539ed3e058def" + resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz" integrity sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-modules-amd@^7.23.0": version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz#05b2bc43373faa6d30ca89214731f76f966f3b88" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz" integrity sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw== dependencies: "@babel/helper-module-transforms" "^7.23.0" @@ -785,7 +785,7 @@ "@babel/plugin-transform-modules-commonjs@^7.23.0": version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz#b3dba4757133b2762c00f4f94590cf6d52602481" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz" integrity sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ== dependencies: "@babel/helper-module-transforms" "^7.23.0" @@ -794,7 +794,7 @@ "@babel/plugin-transform-modules-systemjs@^7.23.0": version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz#77591e126f3ff4132a40595a6cccd00a6b60d160" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz" integrity sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg== dependencies: "@babel/helper-hoist-variables" "^7.22.5" @@ -804,7 +804,7 @@ "@babel/plugin-transform-modules-umd@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz#4694ae40a87b1745e3775b6a7fe96400315d4f98" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz" integrity sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ== dependencies: "@babel/helper-module-transforms" "^7.22.5" @@ -812,7 +812,7 @@ "@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" + resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz" integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.22.5" @@ -820,14 +820,14 @@ "@babel/plugin-transform-new-target@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz#1b248acea54ce44ea06dfd37247ba089fcf9758d" + resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz" integrity sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-nullish-coalescing-operator@^7.22.11": version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz#debef6c8ba795f5ac67cd861a81b744c5d38d9fc" + resolved "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz" integrity sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -835,7 +835,7 @@ "@babel/plugin-transform-numeric-separator@^7.22.11": version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz#498d77dc45a6c6db74bb829c02a01c1d719cbfbd" + resolved "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz" integrity sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -843,7 +843,7 @@ "@babel/plugin-transform-object-rest-spread@^7.22.15": version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz#21a95db166be59b91cde48775310c0df6e1da56f" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz" integrity sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q== dependencies: "@babel/compat-data" "^7.22.9" @@ -854,7 +854,7 @@ "@babel/plugin-transform-object-super@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz#794a8d2fcb5d0835af722173c1a9d704f44e218c" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz" integrity sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -862,7 +862,7 @@ "@babel/plugin-transform-optional-catch-binding@^7.22.11": version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz#461cc4f578a127bb055527b3e77404cad38c08e0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz" integrity sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -870,7 +870,7 @@ "@babel/plugin-transform-optional-chaining@^7.22.15", "@babel/plugin-transform-optional-chaining@^7.23.0": version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz#73ff5fc1cf98f542f09f29c0631647d8ad0be158" + resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz" integrity sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -879,14 +879,14 @@ "@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.22.15": version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz#719ca82a01d177af358df64a514d64c2e3edb114" + resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz" integrity sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-private-methods@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz#21c8af791f76674420a147ae62e9935d790f8722" + resolved "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz" integrity sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA== dependencies: "@babel/helper-create-class-features-plugin" "^7.22.5" @@ -894,7 +894,7 @@ "@babel/plugin-transform-private-property-in-object@^7.22.11": version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz#ad45c4fc440e9cb84c718ed0906d96cf40f9a4e1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz" integrity sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" @@ -904,35 +904,35 @@ "@babel/plugin-transform-property-literals@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz#b5ddabd73a4f7f26cd0e20f5db48290b88732766" + resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz" integrity sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-react-constant-elements@^7.18.12": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.22.5.tgz#6dfa7c1c37f7d7279e417ceddf5a04abb8bb9c29" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.22.5.tgz" integrity sha512-BF5SXoO+nX3h5OhlN78XbbDrBOffv+AxPP2ENaJOVqjWCgBDeOY3WcaUcddutGSfoap+5NEQ/q/4I3WZIvgkXA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-react-display-name@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz#3c4326f9fce31c7968d6cb9debcaf32d9e279a2b" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz" integrity sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-react-jsx-development@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz#e716b6edbef972a92165cd69d92f1255f7e73e87" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz" integrity sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A== dependencies: "@babel/plugin-transform-react-jsx" "^7.22.5" "@babel/plugin-transform-react-jsx@^7.22.15", "@babel/plugin-transform-react-jsx@^7.22.5": version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz#7e6266d88705d7c49f11c98db8b9464531289cd6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz" integrity sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" @@ -943,7 +943,7 @@ "@babel/plugin-transform-react-pure-annotations@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz#1f58363eef6626d6fa517b95ac66fe94685e32c0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz" integrity sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" @@ -951,7 +951,7 @@ "@babel/plugin-transform-regenerator@^7.22.10": version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz#8ceef3bd7375c4db7652878b0241b2be5d0c3cca" + resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz" integrity sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -959,14 +959,14 @@ "@babel/plugin-transform-reserved-words@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz#832cd35b81c287c4bcd09ce03e22199641f964fb" + resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz" integrity sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-runtime@^7.18.6": version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.2.tgz#c956a3f8d1aa50816ff6c30c6288d66635c12990" + resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.2.tgz" integrity sha512-XOntj6icgzMS58jPVtQpiuF6ZFWxQiJavISGx5KGjRj+3gqZr8+N6Kx+N9BApWzgS+DOjIZfXXj0ZesenOWDyA== dependencies: "@babel/helper-module-imports" "^7.22.15" @@ -978,14 +978,14 @@ "@babel/plugin-transform-shorthand-properties@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz#6e277654be82b5559fc4b9f58088507c24f0c624" + resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz" integrity sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-spread@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz#6487fd29f229c95e284ba6c98d65eafb893fea6b" + resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz" integrity sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -993,28 +993,28 @@ "@babel/plugin-transform-sticky-regex@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz#295aba1595bfc8197abd02eae5fc288c0deb26aa" + resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz" integrity sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-template-literals@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz#8f38cf291e5f7a8e60e9f733193f0bcc10909bff" + resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz" integrity sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-typeof-symbol@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz#5e2ba478da4b603af8673ff7c54f75a97b716b34" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz" integrity sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-typescript@^7.22.15": version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.15.tgz#15adef906451d86349eb4b8764865c960eb54127" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.15.tgz" integrity sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" @@ -1024,14 +1024,14 @@ "@babel/plugin-transform-unicode-escapes@^7.22.10": version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz#c723f380f40a2b2f57a62df24c9005834c8616d9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz" integrity sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-unicode-property-regex@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz#098898f74d5c1e86660dc112057b2d11227f1c81" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz" integrity sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.22.5" @@ -1039,7 +1039,7 @@ "@babel/plugin-transform-unicode-regex@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz#ce7e7bb3ef208c4ff67e02a22816656256d7a183" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz" integrity sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.22.5" @@ -1047,7 +1047,7 @@ "@babel/plugin-transform-unicode-sets-regex@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz#77788060e511b708ffc7d42fdfbc5b37c3004e91" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz" integrity sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.22.5" @@ -1055,7 +1055,7 @@ "@babel/preset-env@^7.18.6", "@babel/preset-env@^7.19.4": version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.23.2.tgz#1f22be0ff0e121113260337dbc3e58fafce8d059" + resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.2.tgz" integrity sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ== dependencies: "@babel/compat-data" "^7.23.2" @@ -1141,7 +1141,7 @@ "@babel/preset-modules@0.1.6-no-external-plugins": version "0.1.6-no-external-plugins" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" + 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== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -1150,7 +1150,7 @@ "@babel/preset-react@^7.18.6": version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.22.15.tgz#9a776892b648e13cc8ca2edf5ed1264eea6b6afc" + resolved "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.22.15.tgz" integrity sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -1162,7 +1162,7 @@ "@babel/preset-typescript@^7.18.6": version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.23.2.tgz#c8de488130b7081f7e1482936ad3de5b018beef4" + resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.2.tgz" integrity sha512-u4UJc1XsS1GhIGteM8rnGiIvf9rJpiVgMEeCnwlLA7WJPC+jcXWJAGxYmeqs5hOZD8BbAfnV5ezBOxQbb4OUxA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -1173,12 +1173,12 @@ "@babel/regjsgen@^0.8.0": version "0.8.0" - resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + resolved "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime-corejs3@^7.18.6": version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.23.2.tgz#a5cd9d8b408fb946b2f074b21ea40c04e516795c" + resolved "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.23.2.tgz" integrity sha512-54cIh74Z1rp4oIjsHjqN+WM4fMyCBYe+LpZ9jWm51CZ1fbH3SkAzQD/3XLoNkjbJ7YEmjobLXyvQrFypRHOrXw== dependencies: core-js-pure "^3.30.2" @@ -1191,37 +1191,37 @@ dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.12.7", "@babel/template@^7.22.15", "@babel/template@^7.22.5": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" - integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== +"@babel/template@^7.12.7", "@babel/template@^7.22.15", "@babel/template@^7.22.5", "@babel/template@^7.23.9": + version "7.23.9" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz" + integrity sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA== dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/parser" "^7.22.15" - "@babel/types" "^7.22.15" + "@babel/code-frame" "^7.23.5" + "@babel/parser" "^7.23.9" + "@babel/types" "^7.23.9" -"@babel/traverse@^7.12.9", "@babel/traverse@^7.18.8", "@babel/traverse@^7.23.2": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" - integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== +"@babel/traverse@^7.12.9", "@babel/traverse@^7.18.8", "@babel/traverse@^7.23.9": + version "7.23.9" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz" + integrity sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg== dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.6" "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-function-name" "^7.23.0" "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.0" - "@babel/types" "^7.23.0" - debug "^4.1.0" + "@babel/parser" "^7.23.9" + "@babel/types" "^7.23.9" + debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.12.7", "@babel/types@^7.20.0", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.4.4": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" - integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== +"@babel/types@^7.12.7", "@babel/types@^7.20.0", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.6", "@babel/types@^7.23.9", "@babel/types@^7.4.4": + version "7.23.9" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz" + integrity sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q== dependencies: - "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-string-parser" "^7.23.4" "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" @@ -1230,9 +1230,16 @@ resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + "@discoveryjs/json-ext@0.5.7": version "0.5.7" - resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" + resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== "@docsearch/css@3.5.2": @@ -1250,7 +1257,7 @@ "@docsearch/css" "3.5.2" algoliasearch "^4.19.1" -"@docusaurus/core@2.4.3", "@docusaurus/core@^2.0.0-beta.5", "@docusaurus/core@^2.4.3": +"@docusaurus/core@^2.0.0-beta.5", "@docusaurus/core@^2.4.3", "@docusaurus/core@2.4.3": version "2.4.3" resolved "https://registry.npmjs.org/@docusaurus/core/-/core-2.4.3.tgz" integrity sha512-dWH5P7cgeNSIg9ufReX6gaCl/TmrGKD38Orbwuz05WPhAQtFXHd5B8Qym1TiXfvUNvwoYKkAJOJuGe8ou0Z7PA== @@ -1368,7 +1375,7 @@ url-loader "^4.1.1" webpack "^5.73.0" -"@docusaurus/module-type-aliases@2.4.3", "@docusaurus/module-type-aliases@^2.4.3": +"@docusaurus/module-type-aliases@^2.4.3", "@docusaurus/module-type-aliases@2.4.3": version "2.4.3" resolved "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.4.3.tgz" integrity sha512-cwkBkt1UCiduuvEAo7XZY01dJfRn7UR/75mBgOdb1hKknhrabJZ8YH+7savd/y9kLExPyrhe0QwdS9GuzsRRIA== @@ -1477,7 +1484,7 @@ "@docusaurus/utils-validation" "2.4.3" tslib "^2.4.0" -"@docusaurus/plugin-google-gtag@2.4.3", "@docusaurus/plugin-google-gtag@^2.4.3": +"@docusaurus/plugin-google-gtag@^2.4.3", "@docusaurus/plugin-google-gtag@2.4.3": version "2.4.3" resolved "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.4.3.tgz" integrity sha512-5FMg0rT7sDy4i9AGsvJC71MQrqQZwgLNdDetLEGDHLfSHLvJhQbTCUGbGXknUgWXQJckcV/AILYeJy+HhxeIFA== @@ -1531,7 +1538,7 @@ "@docusaurus/theme-search-algolia" "2.4.3" "@docusaurus/types" "2.4.3" -"@docusaurus/react-loadable@5.5.2", "react-loadable@npm:@docusaurus/react-loadable@5.5.2": +"@docusaurus/react-loadable@5.5.2": version "5.5.2" resolved "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz" integrity sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ== @@ -1592,7 +1599,7 @@ use-sync-external-store "^1.2.0" utility-types "^3.10.0" -"@docusaurus/theme-search-algolia@2.4.3", "@docusaurus/theme-search-algolia@^2.4.3": +"@docusaurus/theme-search-algolia@^2.4.3", "@docusaurus/theme-search-algolia@2.4.3": version "2.4.3" resolved "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.4.3.tgz" integrity sha512-jziq4f6YVUB5hZOB85ELATwnxBz/RmSLD3ksGQOLDPKVzat4pmI8tddNWtriPpxR04BNT+ZfpPUMFkNFetSW1Q== @@ -1622,7 +1629,7 @@ fs-extra "^10.1.0" tslib "^2.4.0" -"@docusaurus/types@2.4.3", "@docusaurus/types@^2.0.0-beta.5": +"@docusaurus/types@*", "@docusaurus/types@^2.0.0-beta.5", "@docusaurus/types@2.4.3": version "2.4.3" resolved "https://registry.npmjs.org/@docusaurus/types/-/types-2.4.3.tgz" integrity sha512-W6zNLGQqfrp/EoPD0bhb9n7OobP+RHpmvVzpA+Z/IuU3Q63njJM24hmT0GYboovWcDtFmnIJC9wcyx4RVPQscw== @@ -1654,7 +1661,7 @@ js-yaml "^4.1.0" tslib "^2.4.0" -"@docusaurus/utils@2.4.3", "@docusaurus/utils@^2.0.0-beta.5": +"@docusaurus/utils@^2.0.0-beta.5", "@docusaurus/utils@2.4.3": version "2.4.3" resolved "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.4.3.tgz" integrity sha512-fKcXsjrD86Smxv8Pt0TBFqYieZZCPh4cbf9oszUq/AMhZn3ujwpKaVYZACPX8mmjtYx0JOgNx52CREBfiGQB4A== @@ -1676,6 +1683,45 @@ url-loader "^4.1.1" webpack "^5.73.0" +"@edge-runtime/cookies@3.4.1": + version "3.4.1" + resolved "https://registry.npmjs.org/@edge-runtime/cookies/-/cookies-3.4.1.tgz" + integrity sha512-z27BvgPxI73CgSlxU/NAUf1Q/shnqi6cobHEowf6VuLdSjGR3NjI2Y5dZUIBbK2zOJVZbXcHsVzJjz8LklteFQ== + +"@edge-runtime/format@2.2.0": + version "2.2.0" + resolved "https://registry.npmjs.org/@edge-runtime/format/-/format-2.2.0.tgz" + integrity sha512-gPrS6AVw/qJJL0vcxMXv4kFXCU3ZTCD1uuJpwX15YxHV8BgU9OG5v9LrkkXcr96PBT/9epypfNJMhlWADuEziw== + +"@edge-runtime/node-utils@2.2.1": + version "2.2.1" + resolved "https://registry.npmjs.org/@edge-runtime/node-utils/-/node-utils-2.2.1.tgz" + integrity sha512-RUl/439BHKshkhSGFRlZ1kzy68wL4mn8VNKDSZr3p0tciyZ33Mjfpl+vofqnHqXRmDI6nLnZpfJvhY3D88o0pA== + dependencies: + "@edge-runtime/cookies" "3.4.1" + +"@edge-runtime/ponyfill@2.4.1": + version "2.4.1" + resolved "https://registry.npmjs.org/@edge-runtime/ponyfill/-/ponyfill-2.4.1.tgz" + integrity sha512-ZbR/EViY3gg2rmEAQTKPa6mXl4aR1/+cFcQe4r1segCjEbTAxT6PWu40odbu/KlZKSysEb2O/BWIC2lJgSJOMQ== + +"@edge-runtime/primitives@4.0.5": + version "4.0.5" + resolved "https://registry.npmjs.org/@edge-runtime/primitives/-/primitives-4.0.5.tgz" + integrity sha512-t7QiN5d/KpXgCvIfSt6Nm9Hj3WVdNgc5CpOD73jasY+9EvTI7Ngdj5cXvjcHrPcmYWJZMySPgeEeoL/1N/Llag== + +"@edge-runtime/vm@3.1.7": + version "3.1.7" + resolved "https://registry.npmjs.org/@edge-runtime/vm/-/vm-3.1.7.tgz" + integrity sha512-hUMFbDQ/nZN+1TLMi6iMO1QFz9RSV8yGG8S42WFPFma1d7VSNE0eMdJUmwjmtav22/iQkzHMmu6oTSfAvRGS8g== + dependencies: + "@edge-runtime/primitives" "4.0.5" + +"@fastify/busboy@^2.0.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz" + integrity sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA== + "@hapi/hoek@^9.0.0": version "9.3.0" resolved "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz" @@ -1690,14 +1736,14 @@ "@jest/schemas@^29.6.3": version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz" integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== dependencies: "@sinclair/typebox" "^0.27.8" "@jest/types@^29.6.3": version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + resolved "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz" integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== dependencies: "@jest/schemas" "^29.6.3" @@ -1709,16 +1755,16 @@ "@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz" integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== dependencies: "@jridgewell/set-array" "^1.0.1" "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/resolve-uri@^3.1.0": +"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz" integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== "@jridgewell/set-array@^1.0.1": @@ -1728,7 +1774,7 @@ "@jridgewell/source-map@^0.3.3": version "0.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91" + resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz" integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== dependencies: "@jridgewell/gen-mapping" "^0.3.0" @@ -1736,22 +1782,45 @@ "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": version "0.3.20" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz" integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@leichtgewicht/ip-codec@^2.0.1": 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== +"@mapbox/node-pre-gyp@^1.0.5": + version "1.0.11" + resolved "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz" + integrity sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ== + dependencies: + detect-libc "^2.0.0" + https-proxy-agent "^5.0.0" + make-dir "^3.1.0" + node-fetch "^2.6.7" + nopt "^5.0.0" + npmlog "^5.0.1" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.11" + "@mdx-js/mdx@^1.6.22": version "1.6.22" resolved "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz" @@ -1795,7 +1864,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -1813,6 +1882,14 @@ resolved "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz" integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== +"@rollup/pluginutils@^4.0.0": + version "4.2.1" + resolved "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz" + integrity sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ== + dependencies: + estree-walker "^2.0.1" + picomatch "^2.2.2" + "@sideway/address@^4.1.3": version "4.1.4" resolved "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz" @@ -1822,7 +1899,7 @@ "@sideway/formula@^3.0.1": version "3.0.1" - resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" + resolved "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz" integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== "@sideway/pinpoint@^2.0.0": @@ -1832,9 +1909,14 @@ "@sinclair/typebox@^0.27.8": version "0.27.8" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz" integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== +"@sinclair/typebox@0.25.24": + version "0.25.24" + resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz" + integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== + "@sindresorhus/is@^0.14.0": version "0.14.0" resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz" @@ -1851,47 +1933,47 @@ "@svgr/babel-plugin-add-jsx-attribute@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz#74a5d648bd0347bda99d82409d87b8ca80b9a1ba" + 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== "@svgr/babel-plugin-remove-jsx-attribute@*": version "8.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz#69177f7937233caca3a1afb051906698f2f59186" + 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== "@svgr/babel-plugin-remove-jsx-empty-expression@*": version "8.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz#c2c48104cfd7dcd557f373b70a56e9e3bdae1d44" + 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== "@svgr/babel-plugin-replace-jsx-attribute-value@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz#fb9d22ea26d2bc5e0a44b763d4c46d5d3f596c60" + 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== "@svgr/babel-plugin-svg-dynamic-title@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz#01b2024a2b53ffaa5efceaa0bf3e1d5a4c520ce4" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz" integrity sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw== "@svgr/babel-plugin-svg-em-dimensions@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz#dd3fa9f5b24eb4f93bcf121c3d40ff5facecb217" + 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== "@svgr/babel-plugin-transform-react-native-svg@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz#1d8e945a03df65b601551097d8f5e34351d3d305" + 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== "@svgr/babel-plugin-transform-svg-component@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz#48620b9e590e25ff95a80f811544218d27f8a250" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz" integrity sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ== "@svgr/babel-preset@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-6.5.1.tgz#b90de7979c8843c5c580c7e2ec71f024b49eb828" + 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" @@ -1903,9 +1985,9 @@ "@svgr/babel-plugin-transform-react-native-svg" "^6.5.1" "@svgr/babel-plugin-transform-svg-component" "^6.5.1" -"@svgr/core@^6.5.1": +"@svgr/core@*", "@svgr/core@^6.0.0", "@svgr/core@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/core/-/core-6.5.1.tgz#d3e8aa9dbe3fbd747f9ee4282c1c77a27410488a" + resolved "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz" integrity sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw== dependencies: "@babel/core" "^7.19.6" @@ -1916,7 +1998,7 @@ "@svgr/hast-util-to-babel-ast@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz#81800bd09b5bcdb968bf6ee7c863d2288fdb80d2" + 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" @@ -1924,7 +2006,7 @@ "@svgr/plugin-jsx@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz#0e30d1878e771ca753c94e69581c7971542a7072" + 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" @@ -1934,7 +2016,7 @@ "@svgr/plugin-svgo@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz#0f91910e988fc0b842f88e0960c2862e022abe84" + resolved "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz" integrity sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ== dependencies: cosmiconfig "^7.0.1" @@ -1943,7 +2025,7 @@ "@svgr/webpack@^6.2.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-6.5.1.tgz#ecf027814fc1cb2decc29dc92f39c3cf691e40e8" + resolved "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.5.1.tgz" integrity sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA== dependencies: "@babel/core" "^7.19.6" @@ -1962,16 +2044,51 @@ dependencies: defer-to-connect "^1.0.1" +"@tootallnate/once@2.0.0": + version "2.0.0" + resolved "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + "@trysound/sax@0.2.0": version "0.2.0" resolved "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz" integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== +"@ts-morph/common@~0.11.0": + version "0.11.1" + resolved "https://registry.npmjs.org/@ts-morph/common/-/common-0.11.1.tgz" + integrity sha512-7hWZS0NRpEsNV8vWJzg7FEz6V8MaLNeJOmwmghqUXTpzk16V1LLZhdo+4QvE/+zv4cVci0OviuJFnqhEfoV3+g== + dependencies: + fast-glob "^3.2.7" + minimatch "^3.0.4" + mkdirp "^1.0.4" + path-browserify "^1.0.1" + "@tsconfig/docusaurus@^1.0.5": version "1.0.7" - resolved "https://registry.yarnpkg.com/@tsconfig/docusaurus/-/docusaurus-1.0.7.tgz#a3ee3c8109b3fec091e3d61a61834e563aeee3c3" + resolved "https://registry.npmjs.org/@tsconfig/docusaurus/-/docusaurus-1.0.7.tgz" integrity sha512-ffTXxGIP/IRMCjuzHd6M4/HdIrw1bMfC7Bv8hMkTadnePkpe0lG0oDSdbRpSDZb2rQMAgpbWiR10BvxvNYwYrg== +"@tsconfig/node10@^1.0.7": + version "1.0.9" + resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + "@types/body-parser@*": version "1.19.2" resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz" @@ -1989,7 +2106,7 @@ "@types/connect-history-api-fallback@^1.3.5": version "1.5.3" - resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.3.tgz#7793aa2160cef7db0ce5fe2b8aab621200f1a470" + resolved "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.3.tgz" integrity sha512-6mfQ6iNvhSKCZJoY6sIG3m0pKkdUcweVNOLuBBKvoWGzl2yRxOJcYOTRyLKt3nxXvBLJWa6QkW//tgbIwJehmA== dependencies: "@types/express-serve-static-core" "*" @@ -2012,7 +2129,7 @@ "@types/eslint@*": version "8.44.7" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.7.tgz#430b3cc96db70c81f405e6a08aebdb13869198f5" + resolved "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.7.tgz" integrity sha512-f5ORu2hcBbKei97U73mf+l9t4zTGl74IqZ0GQk4oVea/VS8tQZYkUveSYojk+frraAVYId0V2WC9O4PTNru2FQ== dependencies: "@types/estree" "*" @@ -2020,12 +2137,12 @@ "@types/estree@*", "@types/estree@^1.0.0": version "1.0.5" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz" integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": version "4.17.41" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz#5077defa630c2e8d28aa9ffc2c01c157c305bef6" + resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz" integrity sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA== dependencies: "@types/node" "*" @@ -2035,7 +2152,7 @@ "@types/express@*", "@types/express@^4.17.13": version "4.17.21" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" + resolved "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz" integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== dependencies: "@types/body-parser" "*" @@ -2062,38 +2179,38 @@ "@types/http-errors@*": version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" + resolved "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz" integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== "@types/http-proxy@^1.17.8": version "1.17.14" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.14.tgz#57f8ccaa1c1c3780644f8a94f9c6b5000b5e2eec" + resolved "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz" integrity sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w== dependencies: "@types/node" "*" "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" + 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== "@types/istanbul-lib-report@*": version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" + 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== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^3.0.0": version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" + resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz" integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== dependencies: "@types/istanbul-lib-report" "*" -"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": +"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.6", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/mdast@^3.0.0": @@ -2110,19 +2227,19 @@ "@types/mime@^1": version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" + resolved "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz" integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== "@types/node-forge@^1.3.0": version "1.3.9" - resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.9.tgz#0fe4a7ba69c0b173f56e6de65d0eae2c1dd4bbfe" + resolved "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.9.tgz" integrity sha512-meK88cx/sTalPSLSoCzkiUB4VPIFHmxtXm5FaaqRDqBX2i/Sy8bJ4odsan0b20RBjPh06dAQ+OTTdnyQyhJZyQ== dependencies: "@types/node" "*" "@types/node@*": version "20.9.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.9.0.tgz#bfcdc230583aeb891cf51e73cfdaacdd8deae298" + resolved "https://registry.npmjs.org/@types/node/-/node-20.9.0.tgz" integrity sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw== dependencies: undici-types "~5.26.4" @@ -2132,6 +2249,11 @@ resolved "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz" integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== +"@types/node@14.18.33": + version "14.18.33" + resolved "https://registry.npmjs.org/@types/node/-/node-14.18.33.tgz" + integrity sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg== + "@types/parse-json@^4.0.0": version "4.0.0" resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz" @@ -2159,7 +2281,7 @@ "@types/react-router-config@*", "@types/react-router-config@^5.0.6": version "5.0.10" - resolved "https://registry.yarnpkg.com/@types/react-router-config/-/react-router-config-5.0.10.tgz#1f7537b8d23ad6bb8e7609268fdd89b8b2de1eaf" + resolved "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.10.tgz" integrity sha512-Wn6c/tXdEgi9adCMtDwx8Q2vGty6TsPTc/wCQQ9kAlye8UqFxj0vGFWWuhywNfkwqth+SOgJxQTLTZukrqDQmQ== dependencies: "@types/history" "^4.7.11" @@ -2177,15 +2299,15 @@ "@types/react-router@*", "@types/react-router@^5.1.0": version "5.1.20" - resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.20.tgz#88eccaa122a82405ef3efbcaaa5dcdd9f021387c" + resolved "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz" integrity sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q== dependencies: "@types/history" "^4.7.11" "@types/react" "*" -"@types/react@*": +"@types/react@*", "@types/react@>= 16.8.0 < 19.0.0": version "18.2.37" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.37.tgz#0f03af69e463c0f19a356c2660dbca5d19c44cae" + resolved "https://registry.npmjs.org/@types/react/-/react-18.2.37.tgz" integrity sha512-RGAYMi2bhRgEXT3f4B92WTohopH6bIXw05FuGlmJEnv/omEn190+QYEIYxIAuIBdKgboYYdVved2p1AxZVQnaw== dependencies: "@types/prop-types" "*" @@ -2206,12 +2328,12 @@ "@types/scheduler@*": version "0.16.6" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.6.tgz#eb26db6780c513de59bee0b869ef289ad3068711" + resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.6.tgz" integrity sha512-Vlktnchmkylvc9SnwwwozTv04L/e1NykF5vgoQ0XTmI8DD+wxfjQuHuvHS3p0r2jz2x2ghPs2h1FVeDirIteWA== "@types/send@*": version "0.17.4" - resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" + resolved "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz" integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== dependencies: "@types/mime" "^1" @@ -2226,7 +2348,7 @@ "@types/serve-static@*", "@types/serve-static@^1.13.10": version "1.15.5" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.5.tgz#15e67500ec40789a1e8c9defc2d32a896f05b033" + resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz" integrity sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ== dependencies: "@types/http-errors" "*" @@ -2247,26 +2369,199 @@ "@types/ws@^8.5.5": version "8.5.9" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.9.tgz#384c489f99c83225a53f01ebc3eddf3b8e202a8c" + resolved "https://registry.npmjs.org/@types/ws/-/ws-8.5.9.tgz" integrity sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg== dependencies: "@types/node" "*" "@types/yargs-parser@*": version "21.0.3" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz" integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== "@types/yargs@^17.0.8": version "17.0.31" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.31.tgz#8fd0089803fd55d8a285895a18b88cb71a99683c" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz" integrity sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg== dependencies: "@types/yargs-parser" "*" -"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": +"@vercel/build-utils@7.5.1": + version "7.5.1" + resolved "https://registry.npmjs.org/@vercel/build-utils/-/build-utils-7.5.1.tgz" + integrity sha512-RyTG951QZQgYn0JL5OoObsCppxHSQApZAqn82GCpAyuQPW7clqcjq7aY7KLD7esHbs0zdzL0KeDEBkGBKaTcTg== + +"@vercel/error-utils@2.0.2": + version "2.0.2" + resolved "https://registry.npmjs.org/@vercel/error-utils/-/error-utils-2.0.2.tgz" + integrity sha512-Sj0LFafGpYr6pfCqrQ82X6ukRl5qpmVrHM/191kNYFqkkB9YkjlMAj6QcEsvCG259x4QZ7Tya++0AB85NDPbKQ== + +"@vercel/fun@1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@vercel/fun/-/fun-1.1.0.tgz" + integrity sha512-SpuPAo+MlAYMtcMcC0plx7Tv4Mp7SQhJJj1iIENlOnABL24kxHpL09XLQMGzZIzIW7upR8c3edwgfpRtp+dhVw== + dependencies: + "@tootallnate/once" "2.0.0" + async-listen "1.2.0" + debug "4.1.1" + execa "3.2.0" + fs-extra "8.1.0" + generic-pool "3.4.2" + micro "9.3.5-canary.3" + ms "2.1.1" + node-fetch "2.6.7" + path-match "1.2.4" + promisepipe "3.0.0" + semver "7.3.5" + stat-mode "0.3.0" + stream-to-promise "2.2.0" + tar "4.4.18" + tree-kill "1.2.2" + uid-promise "1.0.0" + uuid "3.3.2" + xdg-app-paths "5.1.0" + yauzl-promise "2.1.3" + +"@vercel/gatsby-plugin-vercel-analytics@1.0.11": + version "1.0.11" + resolved "https://registry.npmjs.org/@vercel/gatsby-plugin-vercel-analytics/-/gatsby-plugin-vercel-analytics-1.0.11.tgz" + integrity sha512-iTEA0vY6RBPuEzkwUTVzSHDATo1aF6bdLLspI68mQ/BTbi5UQEGjpjyzdKOVcSYApDtFU6M6vypZ1t4vIEnHvw== + dependencies: + web-vitals "0.2.4" + +"@vercel/gatsby-plugin-vercel-builder@2.0.16": + version "2.0.16" + resolved "https://registry.npmjs.org/@vercel/gatsby-plugin-vercel-builder/-/gatsby-plugin-vercel-builder-2.0.16.tgz" + integrity sha512-szRvR8UiCyH8J4xqz3hwDa0XOE4fTxoPawYDBMNHrx91QFEHAtUBC3KcGhApGmVd7ik0WYP7lqokmv9ngygBlA== + dependencies: + "@sinclair/typebox" "0.25.24" + "@vercel/build-utils" "7.5.1" + "@vercel/routing-utils" "3.1.0" + esbuild "0.14.47" + etag "1.8.1" + fs-extra "11.1.0" + +"@vercel/go@3.0.5": + version "3.0.5" + resolved "https://registry.npmjs.org/@vercel/go/-/go-3.0.5.tgz" + integrity sha512-+kEDI+hop3e8BuKisaEozxfzT6GBbp0OMBcgi0tlD5ZTmhGmpwi3vgK5mBQlB+RBXj7qlqDLW/uV2F1Y03FLcQ== + +"@vercel/hydrogen@1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@vercel/hydrogen/-/hydrogen-1.0.2.tgz" + integrity sha512-/Q2MKk1GfOuZAnkE9jQexjtUQqanbY65R+xtJWd9yKIgwcfRI1hxiNH3uXyVM5AvLoY+fxxULkSuxDtUKpkJpQ== + dependencies: + "@vercel/static-config" "3.0.0" + ts-morph "12.0.0" + +"@vercel/next@4.1.0": + version "4.1.0" + resolved "https://registry.npmjs.org/@vercel/next/-/next-4.1.0.tgz" + integrity sha512-5RsyprRts6POFor2JWNNA8kYQ9R0A5a27VaBESFsPi9YIhytsx6cOdrxWusIF6SM+y+kLA0gvi1yA6uixaP8Cg== + dependencies: + "@vercel/nft" "0.26.2" + +"@vercel/nft@0.26.2": + version "0.26.2" + resolved "https://registry.npmjs.org/@vercel/nft/-/nft-0.26.2.tgz" + integrity sha512-bxe2iShmKZi7476xYamyKvhhKwQ6JPEtQ2FSq1AjMUH2buMd8LQMkdoHinTqZYc+1sMTh3G0ARdjzNvV1FEisA== + dependencies: + "@mapbox/node-pre-gyp" "^1.0.5" + "@rollup/pluginutils" "^4.0.0" + acorn "^8.6.0" + acorn-import-attributes "^1.9.2" + async-sema "^3.1.1" + bindings "^1.4.0" + estree-walker "2.0.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + micromatch "^4.0.2" + node-gyp-build "^4.2.2" + resolve-from "^5.0.0" + +"@vercel/node@3.0.17": + version "3.0.17" + resolved "https://registry.npmjs.org/@vercel/node/-/node-3.0.17.tgz" + integrity sha512-HgIDxVAG/cEGLcSYdatGwk/zraN2aDP3ZQxy0I9eFsG8+rgC5eh3mFpNYEcBDkikpMr1jW/zpesf43s/A77/GQ== + dependencies: + "@edge-runtime/node-utils" "2.2.1" + "@edge-runtime/primitives" "4.0.5" + "@edge-runtime/vm" "3.1.7" + "@types/node" "14.18.33" + "@vercel/build-utils" "7.5.1" + "@vercel/error-utils" "2.0.2" + "@vercel/nft" "0.26.2" + "@vercel/static-config" "3.0.0" + async-listen "3.0.0" + edge-runtime "2.5.7" + esbuild "0.14.47" + etag "1.8.1" + node-fetch "2.6.9" + path-to-regexp "6.2.1" + ts-morph "12.0.0" + ts-node "10.9.1" + typescript "4.9.5" + undici "5.26.5" + +"@vercel/python@4.1.1": + version "4.1.1" + resolved "https://registry.npmjs.org/@vercel/python/-/python-4.1.1.tgz" + integrity sha512-EbAdKOZ0hPd5b59tLt7R3RQK1azNvuZTrCFRAVHNjqcIHNCmrSvjag5zBGn7Memkk8qWb3+CgBw9K/3LJKei0w== + +"@vercel/redwood@2.0.6": + version "2.0.6" + resolved "https://registry.npmjs.org/@vercel/redwood/-/redwood-2.0.6.tgz" + integrity sha512-bH8z/0peYlEdFGxyPWwOScTV75eb47H8IK9u0EZ3LtC7hKwiqEkQIRg2CtyH5FmILlGN9nRxEB5XWsboigHByw== + dependencies: + "@vercel/nft" "0.26.2" + "@vercel/routing-utils" "3.1.0" + semver "6.3.1" + +"@vercel/remix-builder@2.0.18": + version "2.0.18" + resolved "https://registry.npmjs.org/@vercel/remix-builder/-/remix-builder-2.0.18.tgz" + integrity sha512-dSi/FQ3jjEl6q9Hpzwkiikq7CwO309TS1bkcuORbsd55HloDeirvQurxoGOqWN+4O6Acuy568YI33A7LAz9/lw== + dependencies: + "@vercel/nft" "0.26.2" + "@vercel/static-config" "3.0.0" + ts-morph "12.0.0" + +"@vercel/routing-utils@3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@vercel/routing-utils/-/routing-utils-3.1.0.tgz" + integrity sha512-Ci5xTjVTJY/JLZXpCXpLehMft97i9fH34nu9PGav6DtwkVUF6TOPX86U0W0niQjMZ5n6/ZP0BwcJK2LOozKaGw== + dependencies: + path-to-regexp "6.1.0" + optionalDependencies: + ajv "^6.0.0" + +"@vercel/ruby@2.0.5": + version "2.0.5" + resolved "https://registry.npmjs.org/@vercel/ruby/-/ruby-2.0.5.tgz" + integrity sha512-Gfm8HDech41vf+EPleRzgoJUnDTJerKgckMm4KX0JT860gV9XBMSOWYH7eMWHmMza104+HRCWL7wT6OlpftF2Q== + +"@vercel/static-build@2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@vercel/static-build/-/static-build-2.1.0.tgz" + integrity sha512-mSP3UNckqr3aqTx8fAbUiM/5E4llgJeUWFf1/RgUUqt5T5QnxZ2n10HagHSZ/fHCx1bT+J8jdty8Aq7v+vJt2Q== + dependencies: + "@vercel/gatsby-plugin-vercel-analytics" "1.0.11" + "@vercel/gatsby-plugin-vercel-builder" "2.0.16" + "@vercel/static-config" "3.0.0" + ts-morph "12.0.0" + +"@vercel/static-config@3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@vercel/static-config/-/static-config-3.0.0.tgz" + integrity sha512-2qtvcBJ1bGY0dYGYh3iM7yGKkk971FujLEDXzuW5wcZsPr1GSEjO/w2iSr3qve6nDDtBImsGoDEnus5FI4+fIw== + dependencies: + ajv "8.6.3" + json-schema-to-ts "1.6.4" + ts-morph "12.0.0" + +"@webassemblyjs/ast@^1.11.5", "@webassemblyjs/ast@1.11.6": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.6.tgz#db046555d3c413f8966ca50a95176a0e2c642e24" + resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz" integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== dependencies: "@webassemblyjs/helper-numbers" "1.11.6" @@ -2274,22 +2569,22 @@ "@webassemblyjs/floating-point-hex-parser@1.11.6": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" + resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz" integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== "@webassemblyjs/helper-api-error@1.11.6": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz" integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== "@webassemblyjs/helper-buffer@1.11.6": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz#b66d73c43e296fd5e88006f18524feb0f2c7c093" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz" integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA== "@webassemblyjs/helper-numbers@1.11.6": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz" integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== dependencies: "@webassemblyjs/floating-point-hex-parser" "1.11.6" @@ -2298,12 +2593,12 @@ "@webassemblyjs/helper-wasm-bytecode@1.11.6": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz" integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== "@webassemblyjs/helper-wasm-section@1.11.6": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz#ff97f3863c55ee7f580fd5c41a381e9def4aa577" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz" integrity sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g== dependencies: "@webassemblyjs/ast" "1.11.6" @@ -2313,26 +2608,26 @@ "@webassemblyjs/ieee754@1.11.6": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" + resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz" integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== dependencies: "@xtuc/ieee754" "^1.2.0" "@webassemblyjs/leb128@1.11.6": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" + resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz" integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== dependencies: "@xtuc/long" "4.2.2" "@webassemblyjs/utf8@1.11.6": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" + resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz" integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== "@webassemblyjs/wasm-edit@^1.11.5": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz#c72fa8220524c9b416249f3d94c2958dfe70ceab" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz" integrity sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw== dependencies: "@webassemblyjs/ast" "1.11.6" @@ -2346,7 +2641,7 @@ "@webassemblyjs/wasm-gen@1.11.6": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz#fb5283e0e8b4551cc4e9c3c0d7184a65faf7c268" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz" integrity sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA== dependencies: "@webassemblyjs/ast" "1.11.6" @@ -2357,7 +2652,7 @@ "@webassemblyjs/wasm-opt@1.11.6": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz#d9a22d651248422ca498b09aa3232a81041487c2" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz" integrity sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g== dependencies: "@webassemblyjs/ast" "1.11.6" @@ -2365,9 +2660,9 @@ "@webassemblyjs/wasm-gen" "1.11.6" "@webassemblyjs/wasm-parser" "1.11.6" -"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": +"@webassemblyjs/wasm-parser@^1.11.5", "@webassemblyjs/wasm-parser@1.11.6": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz#bb85378c527df824004812bbdb784eea539174a1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz" integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== dependencies: "@webassemblyjs/ast" "1.11.6" @@ -2379,7 +2674,7 @@ "@webassemblyjs/wast-printer@1.11.6": version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz#a7bf8dd7e362aeb1668ff43f35cb849f188eff20" + resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz" integrity sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A== dependencies: "@webassemblyjs/ast" "1.11.6" @@ -2395,6 +2690,11 @@ resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== +abbrev@1: + version "1.1.1" + resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: version "1.3.8" resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" @@ -2405,24 +2705,36 @@ accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: acorn-import-assertions@^1.9.0: version "1.9.0" - resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" + resolved "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz" integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== -acorn-walk@^8.0.0: +acorn-import-attributes@^1.9.2: + version "1.9.2" + resolved "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.2.tgz" + integrity sha512-O+nfJwNolEA771IYJaiLWK1UAwjNsQmZbTRqqwBYxCgVQTmpFEMvBw6LOIQV0Me339L5UMVYFyRohGnGlQDdIQ== + +acorn-walk@^8.0.0, acorn-walk@^8.1.1: version "8.2.0" resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn@^8.0.4, acorn@^8.7.1, acorn@^8.8.2: +acorn@^8, acorn@^8.0.4, acorn@^8.4.1, acorn@^8.6.0, acorn@^8.7.1, acorn@^8.8.2: version "8.11.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz" integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== address@^1.0.1, address@^1.1.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" + resolved "https://registry.npmjs.org/address/-/address-1.2.2.tgz" integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== +agent-base@6: + version "6.0.2" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + aggregate-error@^3.0.0: version "3.1.0" resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" @@ -2445,12 +2757,12 @@ ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: ajv-keywords@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" + 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" -ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: +ajv@^6.0.0, ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: version "6.12.6" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -2460,9 +2772,9 @@ ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.9.0: +ajv@^8.0.0, ajv@^8.8.2, ajv@^8.9.0: version "8.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== dependencies: fast-deep-equal "^3.1.1" @@ -2470,6 +2782,16 @@ ajv@^8.0.0, ajv@^8.9.0: require-from-string "^2.0.2" uri-js "^4.2.2" +ajv@8.6.3: + version "8.6.3" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz" + integrity sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + algoliasearch-helper@^3.10.0: version "3.15.0" resolved "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.15.0.tgz" @@ -2477,7 +2799,7 @@ algoliasearch-helper@^3.10.0: dependencies: "@algolia/events" "^4.0.1" -algoliasearch@^4.13.1, algoliasearch@^4.19.1: +algoliasearch@^4.13.1, algoliasearch@^4.19.1, "algoliasearch@>= 3.1 < 6", "algoliasearch@>= 4.9.1 < 6": version "4.20.0" resolved "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.20.0.tgz" integrity sha512-y+UHEjnOItoNy0bYO+WWmLWBlPwDjKHW6mNHrPi0NkuhpQOOEbrkwQH/wgKFDLh7qlKjzoKeiRtlpewDPDG23g== @@ -2535,27 +2857,50 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: ansi-styles@^6.1.0: version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== -any-promise@^1.0.0: +any-promise@^1.0.0, any-promise@^1.1.0, any-promise@~1.3.0: version "1.3.0" resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz" integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== -anymatch@~3.1.2: +anymatch@~3.1.1, anymatch@~3.1.2: version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + 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" +"aproba@^1.0.3 || ^2.0.0": + version "2.0.0" + resolved "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + +are-we-there-yet@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz" + integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + arg@^5.0.0, arg@^5.0.2: version "5.0.2" resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== +arg@4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/arg/-/arg-4.1.0.tgz" + integrity sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg== + argparse@^1.0.7: version "1.0.10" resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" @@ -2568,16 +2913,16 @@ argparse@^2.0.1: resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - array-flatten@^2.1.2: version "2.1.2" resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + array-union@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" @@ -2588,6 +2933,26 @@ asap@~2.0.3: resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== +async-listen@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/async-listen/-/async-listen-1.2.0.tgz" + integrity sha512-CcEtRh/oc9Jc4uWeUwdpG/+Mb2YUHKmdaTf0gUr7Wa+bfp4xx70HOb3RuSTJMvqKNB1TkdTfjLdrcz2X4rkkZA== + +async-listen@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/async-listen/-/async-listen-3.0.0.tgz" + integrity sha512-V+SsTpDqkrWTimiotsyl33ePSjA5/KrithwupuvJ6ztsqPvGv6ge4OredFhPffVXiLN/QUWvE0XcqJaYgt6fOg== + +async-listen@3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/async-listen/-/async-listen-3.0.1.tgz" + integrity sha512-cWMaNwUJnf37C/S5TfCkk/15MwbPRwVYALA2jtjkbHjCmAPiDXyNJy2q3p1KAZzDLHAWyarUWSujUoHR4pEgrA== + +async-sema@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/async-sema/-/async-sema-3.1.1.tgz" + integrity sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg== + at-least-node@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" @@ -2614,7 +2979,7 @@ axios@^0.25.0: babel-loader@^8.2.5: version "8.3.0" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.3.0.tgz#124936e841ba4fe8176786d6ff28add1f134d6a8" + resolved "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz" integrity sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q== dependencies: find-cache-dir "^3.3.1" @@ -2646,7 +3011,7 @@ babel-plugin-extract-import-names@1.6.22: babel-plugin-polyfill-corejs2@^0.4.6: version "0.4.6" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz#b2df0251d8e99f229a8e60fc4efa9a68b41c8313" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz" integrity sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q== dependencies: "@babel/compat-data" "^7.22.6" @@ -2655,7 +3020,7 @@ babel-plugin-polyfill-corejs2@^0.4.6: babel-plugin-polyfill-corejs3@^0.8.5: version "0.8.6" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz#25c2d20002da91fe328ff89095c85a391d6856cf" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz" integrity sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ== dependencies: "@babel/helper-define-polyfill-provider" "^0.4.3" @@ -2663,7 +3028,7 @@ babel-plugin-polyfill-corejs3@^0.8.5: babel-plugin-polyfill-regenerator@^0.5.3: version "0.5.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz#d4c49e4b44614607c13fb769bcd85c72bb26a4a5" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz" integrity sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw== dependencies: "@babel/helper-define-polyfill-provider" "^0.4.3" @@ -2698,9 +3063,16 @@ binary-extensions@^2.0.0: resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== +bindings@^1.4.0: + version "1.5.0" + resolved "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + body-parser@1.20.1: version "1.20.1" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz" integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== dependencies: bytes "3.1.2" @@ -2718,7 +3090,7 @@ body-parser@1.20.1: bonjour-service@^1.0.11: version "1.1.1" - resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.1.1.tgz#960948fa0e0153f5d26743ab15baf8e33752c135" + resolved "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz" integrity sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg== dependencies: array-flatten "^2.1.2" @@ -2774,16 +3146,21 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.21.9, browserslist@^4.22.1: - version "4.22.1" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz" - integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ== +browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.22.1, browserslist@^4.22.2, "browserslist@>= 4.21.0": + version "4.22.3" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz" + integrity sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A== dependencies: - caniuse-lite "^1.0.30001541" - electron-to-chromium "^1.4.535" - node-releases "^2.0.13" + caniuse-lite "^1.0.30001580" + electron-to-chromium "^1.4.648" + node-releases "^2.0.14" update-browserslist-db "^1.0.13" +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" @@ -2794,6 +3171,11 @@ bytes@3.0.0: resolved "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz" integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + bytes@3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" @@ -2833,7 +3215,7 @@ camel-case@^4.1.2: pascal-case "^3.1.2" tslib "^2.0.3" -camelcase-css@2.0.1, camelcase-css@^2.0.1: +camelcase-css@^2.0.1, camelcase-css@2.0.1: 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== @@ -2853,10 +3235,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001538, caniuse-lite@^1.0.30001541: - version "1.0.30001559" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001559.tgz" - integrity sha512-cPiMKZgqgkg5LY3/ntGeLFUpi6tzddBNS58A4tnTgQw1zON7u2sZMU7SzOeVH4tj20++9ggL+V6FDOFMTaFFYA== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001538, caniuse-lite@^1.0.30001580: + version "1.0.30001581" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001581.tgz" + integrity sha512-whlTkwhqV2tUmP3oYhtNfaWGYHDdS3JYFQBKXxcUR9qqPWsRhFHhoISO2Xnl/g0xyKzht9mI1LZpiNWfMzHixQ== ccount@^1.0.0: version "1.1.0" @@ -2865,7 +3247,7 @@ ccount@^1.0.0: chalk@^2.4.2: version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + 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" @@ -2935,6 +3317,31 @@ chokidar@^3.4.2, chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" +chokidar@3.3.1: + version "3.3.1" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz" + integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.3.0" + optionalDependencies: + fsevents "~2.1.2" + +chownr@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + chrome-trace-event@^1.0.2: version "1.0.3" resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz" @@ -2947,12 +3354,12 @@ ci-info@^2.0.0: ci-info@^3.2.0: version "3.9.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== clean-css@^5.2.2, clean-css@^5.3.0: version "5.3.2" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.2.tgz#70ecc7d4d4114921f5d298349ff86a31a9975224" + resolved "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz" integrity sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww== dependencies: source-map "~0.6.0" @@ -2974,7 +3381,7 @@ cli-boxes@^3.0.0: cli-table3@^0.6.2: version "0.6.3" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2" + resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz" integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== dependencies: string-width "^4.2.0" @@ -3002,6 +3409,11 @@ clsx@^1.2.1: resolved "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz" integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== +code-block-writer@^10.1.1: + version "10.1.1" + resolved "https://registry.npmjs.org/code-block-writer/-/code-block-writer-10.1.1.tgz" + integrity sha512-67ueh2IRGst/51p0n6FvPrnRjAGHY5F8xdjkgrYE7DDzpJe6qA07RYQ9VcoUeo5ATOjSOiWpSL3SWBRRbempMw== + collapse-white-space@^1.0.2: version "1.0.6" resolved "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz" @@ -3021,15 +3433,20 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + color-name@1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-support@^1.1.2: + version "1.1.3" + resolved "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== colord@^2.9.1: version "2.9.3" @@ -3038,12 +3455,12 @@ colord@^2.9.1: colorette@^2.0.10: version "2.0.20" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== combine-promises@^1.1.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/combine-promises/-/combine-promises-1.2.0.tgz#5f2e68451862acf85761ded4d9e2af7769c2ca6a" + resolved "https://registry.npmjs.org/combine-promises/-/combine-promises-1.2.0.tgz" integrity sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ== comma-separated-tokens@^1.0.0: @@ -3128,6 +3545,11 @@ consola@^2.15.3: resolved "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz" integrity sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw== +console-control-strings@^1.0.0, console-control-strings@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz" + integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== + content-disposition@0.5.2: version "0.5.2" resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz" @@ -3142,17 +3564,27 @@ content-disposition@0.5.4: content-type@~1.0.4: version "1.0.5" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== +content-type@1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-hrtime@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-3.0.0.tgz" + integrity sha512-7V+KqSvMiHp8yWDuwfww06XleMWVVB9b9tURBx+G7UTADuo5hYPuowKloz4OzOqbPezxgo+fdQ1522WzPG4OeA== + convert-source-map@^1.7.0: version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== convert-source-map@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== cookie-signature@1.0.6: @@ -3184,19 +3616,19 @@ copy-webpack-plugin@^11.0.0: core-js-compat@^3.31.0, core-js-compat@^3.33.1: version "3.33.2" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.33.2.tgz#3ea4563bfd015ad4e4b52442865b02c62aba5085" + resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.2.tgz" integrity sha512-axfo+wxFVxnqf8RvxTzoAlzW4gRoacrHeoFlc9n0x50+7BEyZL/Rt3hicaED1/CEd7I6tPCPVUYcJwCMO5XUYw== dependencies: browserslist "^4.22.1" core-js-pure@^3.30.2: version "3.33.2" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.33.2.tgz#644830db2507ef84d068a70980ccd99c275f5fa6" + resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.33.2.tgz" integrity sha512-a8zeCdyVk7uF2elKIGz67AjcXOxjRbwOLz8SbklEso1V+2DoW4OkAMZN9S9GBgvZIaqQi/OemFX4OiSoQEmg1Q== core-js@^3.23.3: version "3.33.2" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.33.2.tgz#312bbf6996a3a517c04c99b9909cdd27138d1ceb" + resolved "https://registry.npmjs.org/core-js/-/core-js-3.33.2.tgz" integrity sha512-XeBzWI6QL3nJQiHmdzbAOiMYqjrb7hwU7A39Qhvd/POSa/t9E1AeZyEZx3fNvp/vtM8zXwhoL0FsiS0hD0pruQ== core-util-is@~1.0.0: @@ -3217,7 +3649,7 @@ cosmiconfig@^6.0.0: cosmiconfig@^7.0.1: version "7.1.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz" integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== dependencies: "@types/parse-json" "^4.0.0" @@ -3228,7 +3660,7 @@ cosmiconfig@^7.0.1: cosmiconfig@^8.2.0: version "8.3.6" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz" integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== dependencies: import-fresh "^3.3.0" @@ -3236,6 +3668,11 @@ cosmiconfig@^8.2.0: parse-json "^5.2.0" path-type "^4.0.0" +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + cross-fetch@^3.1.5: version "3.1.8" resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz" @@ -3243,7 +3680,7 @@ cross-fetch@^3.1.5: dependencies: node-fetch "^2.6.12" -cross-spawn@^7.0.3: +cross-spawn@^7.0.0, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -3264,7 +3701,7 @@ css-declaration-sorter@^6.3.1: css-loader@^6.7.1: version "6.8.1" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.8.1.tgz#0f8f52699f60f5e679eab4ec0fcd68b8e8a50a88" + resolved "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz" integrity sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g== dependencies: icss-utils "^5.1.0" @@ -3278,7 +3715,7 @@ css-loader@^6.7.1: css-minimizer-webpack-plugin@^4.0.0: version "4.2.2" - resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz#79f6199eb5adf1ff7ba57f105e3752d15211eb35" + resolved "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz" integrity sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA== dependencies: cssnano "^5.1.8" @@ -3382,7 +3819,7 @@ cssnano-utils@^3.1.0: cssnano@^5.1.12, cssnano@^5.1.8: version "5.1.15" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.15.tgz#ded66b5480d5127fcb44dac12ea5a983755136bf" + resolved "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz" integrity sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw== dependencies: cssnano-preset-default "^5.2.14" @@ -3398,23 +3835,51 @@ csso@^4.2.0: csstype@^3.0.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz" integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== -debug@2.6.9, debug@^2.6.0: +debug@^2.6.0, debug@2.6.9: 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" -debug@4, debug@^4.1.0, debug@^4.1.1: +debug@^4.1.0: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@^4.1.1: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@^4.3.1: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@4: version "4.3.4" resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" +debug@4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + decompress-response@^3.3.0: version "3.3.0" resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz" @@ -3429,7 +3894,7 @@ deep-extend@^0.6.0: deepmerge@^4.2.2: version "4.3.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== default-gateway@^6.0.3: @@ -3446,7 +3911,7 @@ defer-to-connect@^1.0.1: define-data-property@^1.0.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" + resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz" integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== dependencies: get-intrinsic "^1.2.1" @@ -3460,7 +3925,7 @@ define-lazy-prop@^2.0.0: define-properties@^1.1.4: version "1.2.1" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz" integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== dependencies: define-data-property "^1.0.1" @@ -3481,16 +3946,21 @@ del@^6.1.1: rimraf "^3.0.2" slash "^3.0.0" -depd@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== depd@~1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== +depd@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + destroy@1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" @@ -3503,6 +3973,11 @@ detab@2.0.4: dependencies: repeat-string "^1.5.4" +detect-libc@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz" + integrity sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw== + detect-node@^2.0.4: version "2.1.0" resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz" @@ -3518,7 +3993,7 @@ detect-port-alt@^1.1.6: detect-port@^1.3.0: version "1.5.1" - resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.5.1.tgz#451ca9b6eaf20451acb0799b8ab40dff7718727b" + resolved "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz" integrity sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ== dependencies: address "^1.0.1" @@ -3529,6 +4004,11 @@ didyoumean@^1.2.2: resolved "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz" integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" @@ -3548,7 +4028,7 @@ dns-equal@^1.0.0: dns-packet@^5.2.2: version "5.6.1" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.1.tgz#ae888ad425a9d1478a0674256ab866de1012cf2f" + resolved "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz" integrity sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw== dependencies: "@leichtgewicht/ip-codec" "^2.0.1" @@ -3613,7 +4093,16 @@ domhandler@^5.0.2, domhandler@^5.0.3: dependencies: domelementtype "^2.3.0" -domutils@^2.5.2, domutils@^2.8.0: +domutils@^2.5.2: + 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" + +domutils@^2.8.0: version "2.8.0" resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz" integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== @@ -3646,30 +4135,45 @@ dot-prop@^5.2.0: dependencies: is-obj "^2.0.0" -duplexer3@^0.1.4: - version "0.1.5" - resolved "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz" - integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== - duplexer@^0.1.2: version "0.1.2" resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== +duplexer3@^0.1.4: + version "0.1.5" + resolved "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz" + integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== + eastasianwidth@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== +edge-runtime@2.5.7: + version "2.5.7" + resolved "https://registry.npmjs.org/edge-runtime/-/edge-runtime-2.5.7.tgz" + integrity sha512-gA4qSVP0sNwJlkdQ2nahDPASlSl8twUd17o+JolPa1EtXpLTGzIpOETvodgJwXIxa+zaD8bnAXCdsWrx2PhlVQ== + dependencies: + "@edge-runtime/format" "2.2.0" + "@edge-runtime/ponyfill" "2.4.1" + "@edge-runtime/vm" "3.1.7" + async-listen "3.0.1" + mri "1.2.0" + picocolors "1.0.0" + pretty-ms "7.0.1" + signal-exit "4.0.2" + time-span "4.0.0" + ee-first@1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -electron-to-chromium@^1.4.535: - version "1.4.572" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.572.tgz" - integrity sha512-RlFobl4D3ieetbnR+2EpxdzFl9h0RAJkPK3pfiwMug2nhBin2ZCsGIAJWdpNniLz43sgXam/CgipOmvTA+rUiA== +electron-to-chromium@^1.4.648: + version "1.4.648" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.648.tgz" + integrity sha512-EmFMarXeqJp9cUKu/QEciEApn0S/xRcpZWuAm32U7NgoZCimjsilKXHRO9saeEW55eHZagIDg6XTUOv32w9pjg== emoji-regex@^8.0.0: version "8.0.0" @@ -3703,9 +4207,16 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" +end-of-stream@~1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.1.0.tgz" + integrity sha512-EoulkdKF/1xa92q25PbjuDcgJ9RDHYU2Rs3SCIvs2/dSQ3BpmxneNHmA/M7fe60M3PrV7nNGTTNbkK62l6vXiQ== + dependencies: + once "~1.3.0" + enhanced-resolve@^5.15.0: version "5.15.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz" integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== dependencies: graceful-fs "^4.2.4" @@ -3718,7 +4229,7 @@ entities@^2.0.0: entities@^4.2.0, entities@^4.4.0: version "4.5.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== error-ex@^1.3.1: @@ -3730,9 +4241,40 @@ error-ex@^1.3.1: es-module-lexer@^1.2.1: version "1.3.1" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.1.tgz#c1b0dd5ada807a3b3155315911f364dc4e909db1" + resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz" integrity sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q== +esbuild-darwin-arm64@0.14.47: + version "0.14.47" + resolved "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.47.tgz" + integrity sha512-seCmearlQyvdvM/noz1L9+qblC5vcBrhUaOoLEDDoLInF/VQ9IkobGiLlyTPYP5dW1YD4LXhtBgOyevoIHGGnw== + +esbuild@0.14.47: + version "0.14.47" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.14.47.tgz" + integrity sha512-wI4ZiIfFxpkuxB8ju4MHrGwGLyp1+awEHAHVpx6w7a+1pmYIq8T9FGEVVwFo0iFierDoMj++Xq69GXWYn2EiwA== + optionalDependencies: + esbuild-android-64 "0.14.47" + esbuild-android-arm64 "0.14.47" + esbuild-darwin-64 "0.14.47" + esbuild-darwin-arm64 "0.14.47" + esbuild-freebsd-64 "0.14.47" + esbuild-freebsd-arm64 "0.14.47" + esbuild-linux-32 "0.14.47" + esbuild-linux-64 "0.14.47" + esbuild-linux-arm "0.14.47" + esbuild-linux-arm64 "0.14.47" + esbuild-linux-mips64le "0.14.47" + esbuild-linux-ppc64le "0.14.47" + esbuild-linux-riscv64 "0.14.47" + esbuild-linux-s390x "0.14.47" + esbuild-netbsd-64 "0.14.47" + esbuild-openbsd-64 "0.14.47" + esbuild-sunos-64 "0.14.47" + esbuild-windows-32 "0.14.47" + esbuild-windows-64 "0.14.47" + esbuild-windows-arm64 "0.14.47" + escalade@^3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" @@ -3788,6 +4330,11 @@ estraverse@^5.2.0: resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== +estree-walker@^2.0.1, estree-walker@2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" @@ -3798,7 +4345,7 @@ eta@^2.0.0: resolved "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz" integrity sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g== -etag@~1.8.1: +etag@~1.8.1, etag@1.8.1: version "1.8.1" resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== @@ -3816,6 +4363,11 @@ eventemitter3@^4.0.0: resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== +events-intercept@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/events-intercept/-/events-intercept-2.0.0.tgz" + integrity sha512-blk1va0zol9QOrdZt0rFXo5KMkNPVSp92Eju/Qz8THwKWKRKeE0T8Br/1aW6+Edkyq9xHYgYxn2QtOnUKPUp+Q== + events@^3.2.0: version "3.3.0" resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" @@ -3836,9 +4388,25 @@ execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" +execa@3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/execa/-/execa-3.2.0.tgz" + integrity sha512-kJJfVbI/lZE1PZYDI5VPxp8zXPO9rtxOkhpZ0jMKha56AI9y2gGVC6bkukStQf0ka5Rh15BA5m7cCCH4jmHqkw== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + p-finally "^2.0.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + express@^4.17.3: version "4.18.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + resolved "https://registry.npmjs.org/express/-/express-4.18.2.tgz" integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== dependencies: accepts "~1.3.8" @@ -3890,7 +4458,7 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@^3.2.11, fast-glob@^3.2.9, fast-glob@^3.3.0: +fast-glob@^3.2.11, fast-glob@^3.2.7, fast-glob@^3.2.9, fast-glob@^3.3.0: version "3.3.2" resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz" integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== @@ -3915,7 +4483,7 @@ fast-url-parser@1.1.3: fastq@^1.6.0: version "1.15.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz" integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== dependencies: reusify "^1.0.4" @@ -3952,6 +4520,13 @@ fbjs@^3.0.0, fbjs@^3.0.1: setimmediate "^1.0.5" ua-parser-js "^1.0.35" +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz" + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== + dependencies: + pend "~1.2.0" + feed@^4.2.2: version "4.2.2" resolved "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz" @@ -3959,7 +4534,7 @@ feed@^4.2.2: dependencies: xml-js "^1.6.11" -file-loader@^6.2.0: +file-loader@*, file-loader@^6.2.0: version "6.2.0" resolved "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz" integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== @@ -3967,6 +4542,11 @@ file-loader@^6.2.0: loader-utils "^2.0.0" schema-utils "^3.0.0" +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + filesize@^8.0.6: version "8.0.7" resolved "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz" @@ -4026,7 +4606,7 @@ find-up@^5.0.0: flat@^5.0.2: version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== flux@^4.0.1: @@ -4044,7 +4624,7 @@ follow-redirects@^1.0.0, follow-redirects@^1.14.7: fork-ts-checker-webpack-plugin@^6.5.0: version "6.5.3" - resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz#eda2eff6e22476a2688d10661688c47f611b37f3" + 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== dependencies: "@babel/code-frame" "^7.8.3" @@ -4095,9 +4675,41 @@ fs-extra@^9.0.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs-extra@11.1.0: + version "11.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz" + integrity sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@8.1.0: + version "8.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-minipass@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz" + integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== + dependencies: + minipass "^2.6.0" + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + fs-monkey@^1.0.4: version "1.0.5" - resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.5.tgz#fe450175f0db0d7ea758102e1d84096acb925788" + resolved "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz" integrity sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew== fs.realpath@^1.0.0: @@ -4105,9 +4717,14 @@ fs.realpath@^1.0.0: resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== +fsevents@~2.1.2: + version "2.1.3" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz" + integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== + fsevents@~2.3.2: version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== function-bind@^1.1.1, function-bind@^1.1.2: @@ -4115,6 +4732,26 @@ function-bind@^1.1.1, function-bind@^1.1.2: resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== +gauge@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz" + integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.2" + console-control-strings "^1.0.0" + has-unicode "^2.0.1" + object-assign "^4.1.1" + signal-exit "^3.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.2" + +generic-pool@3.4.2: + version "3.4.2" + resolved "https://registry.npmjs.org/generic-pool/-/generic-pool-3.4.2.tgz" + integrity sha512-H7cUpwCQSiJmAHM4c/aFu6fUfrhWXW1ncyh8ftxEPMu6AiYkHw9K8br720TGPZJbk5eOH2bynjZD1yPvdDAmag== + gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" @@ -4122,7 +4759,7 @@ gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.1: version "1.2.2" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz" integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== dependencies: function-bind "^1.1.2" @@ -4142,6 +4779,13 @@ get-stream@^4.1.0: dependencies: pump "^3.0.0" +get-stream@^5.0.0: + version "5.2.0" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + get-stream@^5.1.0: version "5.2.0" resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" @@ -4156,17 +4800,24 @@ get-stream@^6.0.0: github-slugger@^1.4.0: version "1.5.0" - resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.5.0.tgz#17891bbc73232051474d68bd867a34625c955f7d" + resolved "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz" integrity sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw== -glob-parent@^5.1.2, glob-parent@~5.1.2: +glob-parent@^5.1.2, glob-parent@~5.1.0, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" -glob-parent@^6.0.1, glob-parent@^6.0.2: +glob-parent@^6.0.1: + 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" + +glob-parent@^6.0.2: version "6.0.2" resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== @@ -4178,33 +4829,33 @@ glob-to-regexp@^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== -glob@7.1.6: - version "7.1.6" - resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== +glob@^7.0.0, glob@^7.1.3, glob@^7.1.6: + 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.0.4" + minimatch "^3.1.1" once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.1.3, glob@^7.1.6: - version "7.2.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== +glob@7.1.6: + version "7.1.6" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.1.1" + minimatch "^3.0.4" once "^1.3.0" path-is-absolute "^1.0.0" global-dirs@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.1.tgz#0c488971f066baceda21447aecb1a8b911d22485" + resolved "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz" integrity sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA== dependencies: ini "2.0.0" @@ -4244,7 +4895,7 @@ globby@^11.0.1, globby@^11.0.4, globby@^11.1.0: globby@^13.1.1: version "13.2.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592" + resolved "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz" integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w== dependencies: dir-glob "^3.0.1" @@ -4255,7 +4906,7 @@ globby@^13.1.1: gopd@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== dependencies: get-intrinsic "^1.1.3" @@ -4279,7 +4930,7 @@ got@^9.6.0: graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== gray-matter@^4.0.3: @@ -4323,7 +4974,7 @@ has-property-descriptors@^1.0.0: has-proto@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz" integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== has-symbols@^1.0.3: @@ -4331,6 +4982,11 @@ has-symbols@^1.0.3: resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== +has-unicode@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz" + integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== + has-yarn@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz" @@ -4418,7 +5074,7 @@ he@^1.2.0: heroicons@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/heroicons/-/heroicons-2.1.1.tgz#b574c2d87bc504bf7f4fefacc20960c5672b0202" + resolved "https://registry.npmjs.org/heroicons/-/heroicons-2.1.1.tgz" integrity sha512-54kHbrxsTyAJJU7z07XN1OrVBX8ogN/tbclP8Doxk0X4IQmR6LEhLzJBkFK9Yc814NoXG6ZJBh9Bi/qvauzjfA== history@^4.9.0: @@ -4452,7 +5108,7 @@ hpack.js@^2.1.6: html-entities@^2.3.2: version "2.4.0" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.4.0.tgz#edd0cee70402584c8c76cc2c0556db09d1f45061" + resolved "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz" integrity sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ== html-minifier-terser@^6.0.2, html-minifier-terser@^6.1.0: @@ -4470,7 +5126,7 @@ html-minifier-terser@^6.0.2, html-minifier-terser@^6.1.0: html-tags@^3.2.0: version "3.3.1" - resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.3.1.tgz#a04026a18c882e4bba8a01a3d39cfe465d40b5ce" + resolved "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz" integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ== html-void-elements@^1.0.0: @@ -4480,7 +5136,7 @@ html-void-elements@^1.0.0: html-webpack-plugin@^5.5.0: version "5.5.3" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.5.3.tgz#72270f4a78e222b5825b296e5e3e1328ad525a3e" + resolved "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.3.tgz" integrity sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg== dependencies: "@types/html-minifier-terser" "^6.0.0" @@ -4511,7 +5167,7 @@ htmlparser2@^8.0.1: http-cache-semantics@^4.0.0: version "4.1.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz" integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== http-deceiver@^1.2.7: @@ -4519,16 +5175,13 @@ http-deceiver@^1.2.7: resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz" integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== +http-errors@~1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.4.0.tgz" + integrity sha512-oLjPqve1tuOl5aRhv8GK5eHpqP1C9fb+Ol+XTLjKfLltE44zdDbEdjPSbU7Ch5rSNsVFqZn97SrMmZLdu1/YMw== dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" + inherits "2.0.1" + statuses ">= 1.2.1 < 2" http-errors@~1.6.2: version "1.6.3" @@ -4540,6 +5193,28 @@ http-errors@~1.6.2: setprototypeof "1.1.0" statuses ">= 1.4.0 < 2" +http-errors@1.7.3: + version "1.7.3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@2.0.0: + 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" + http-parser-js@>=0.5.1: version "0.5.8" resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz" @@ -4565,6 +5240,19 @@ http-proxy@^1.18.1: follow-redirects "^1.0.0" requires-port "^1.0.0" +https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + human-signals@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" @@ -4584,7 +5272,7 @@ icss-utils@^5.0.0, icss-utils@^5.1.0: ignore@^5.2.0, ignore@^5.2.4: version "5.2.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== image-size@^1.0.1: @@ -4596,7 +5284,7 @@ image-size@^1.0.1: immer@^9.0.7: version "9.0.21" - resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176" + resolved "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz" integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA== import-fresh@^3.1.0, import-fresh@^3.2.1, import-fresh@^3.3.0: @@ -4635,26 +5323,31 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: +inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3, inherits@2, inherits@2.0.4: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + integrity sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA== + inherits@2.0.3: version "2.0.3" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== -ini@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz" - integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== - ini@^1.3.5, ini@~1.3.0: version "1.3.8" resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== +ini@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + inline-style-parser@0.1.1: version "0.1.1" resolved "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz" @@ -4672,17 +5365,17 @@ invariant@^2.2.4: dependencies: loose-envify "^1.0.0" +ipaddr.js@^2.0.1: + version "2.1.0" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz" + integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ== + ipaddr.js@1.9.1: 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== -ipaddr.js@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.1.0.tgz#2119bc447ff8c257753b196fc5f1ce08a4cdf39f" - integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ== - -is-alphabetical@1.0.4, is-alphabetical@^1.0.0: +is-alphabetical@^1.0.0, is-alphabetical@1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz" integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== @@ -4820,7 +5513,7 @@ is-plain-object@^2.0.4: is-plain-object@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz" integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== is-regexp@^1.0.0: @@ -4865,16 +5558,16 @@ is-yarn-global@^0.3.0: resolved "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz" integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== - isarray@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" @@ -4887,7 +5580,7 @@ isobject@^3.0.1: jest-util@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz" integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== dependencies: "@jest/types" "^29.6.3" @@ -4908,7 +5601,7 @@ jest-worker@^27.4.5: jest-worker@^29.1.2: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz" integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== dependencies: "@types/node" "*" @@ -4918,12 +5611,12 @@ jest-worker@^29.1.2: jiti@^1.18.2, jiti@^1.19.1: version "1.21.0" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" + resolved "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz" integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== joi@^17.6.0: version "17.11.0" - resolved "https://registry.yarnpkg.com/joi/-/joi-17.11.0.tgz#aa9da753578ec7720e6f0ca2c7046996ed04fc1a" + resolved "https://registry.npmjs.org/joi/-/joi-17.11.0.tgz" integrity sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ== dependencies: "@hapi/hoek" "^9.0.0" @@ -4972,6 +5665,14 @@ json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^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== +json-schema-to-ts@1.6.4: + version "1.6.4" + resolved "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-1.6.4.tgz" + integrity sha512-pR4yQ9DHz6itqswtHCm26mw45FSNfQ9rEQjosaZErhn5J3J2sIViQiz8rDaezjKAhFGpmsoczYVBgGHzFw/stA== + dependencies: + "@types/json-schema" "^7.0.6" + ts-toolbelt "^6.15.5" + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" @@ -4984,9 +5685,16 @@ json-schema-traverse@^1.0.0: json5@^2.1.2, json5@^2.2.3: version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" + jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" @@ -5022,7 +5730,7 @@ latest-version@^5.1.0: launch-editor@^2.6.0: version "2.6.1" - resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.1.tgz#f259c9ef95cbc9425620bbbd14b468fcdb4ffe3c" + resolved "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz" integrity sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw== dependencies: picocolors "^1.0.0" @@ -5050,7 +5758,7 @@ loader-runner@^4.2.0: loader-utils@^2.0.0: version "2.0.4" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz" integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== dependencies: big.js "^5.2.2" @@ -5059,7 +5767,7 @@ loader-utils@^2.0.0: loader-utils@^3.2.0: version "3.2.1" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.2.1.tgz#4fb104b599daafd82ef3e1a41fb9265f87e1f576" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz" integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== locate-path@^3.0.0: @@ -5096,12 +5804,12 @@ lodash.debounce@^4.0.8: lodash.escape@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-4.0.1.tgz#c9044690c21e04294beaa517712fded1fa88de98" + resolved "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz" integrity sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw== lodash.flatten@^4.4.0: version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + resolved "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz" integrity sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g== lodash.flow@^3.3.0: @@ -5111,7 +5819,7 @@ lodash.flow@^3.3.0: lodash.invokemap@^4.6.0: version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.invokemap/-/lodash.invokemap-4.6.0.tgz#1748cda5d8b0ef8369c4eb3ec54c21feba1f2d62" + resolved "https://registry.npmjs.org/lodash.invokemap/-/lodash.invokemap-4.6.0.tgz" integrity sha512-CfkycNtMqgUlfjfdh2BhKO/ZXrP8ePOX5lEU/g0R3ItJcnuxWDwokMGKx1hWcfOikmyOVx6X9IwWnDGlgKl61w== lodash.memoize@^4.1.2: @@ -5121,17 +5829,17 @@ lodash.memoize@^4.1.2: lodash.pullall@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.pullall/-/lodash.pullall-4.2.0.tgz#9d98b8518b7c965b0fae4099bd9fb7df8bbf38ba" + resolved "https://registry.npmjs.org/lodash.pullall/-/lodash.pullall-4.2.0.tgz" integrity sha512-VhqxBKH0ZxPpLhiu68YD1KnHmbhQJQctcipvmFnqIBDYzcIHzf3Zpu0tpeOKtR4x76p9yohc506eGdOjTmyIBg== -lodash.uniq@4.5.0, lodash.uniq@^4.5.0: +lodash.uniq@^4.5.0, lodash.uniq@4.5.0: version "4.5.0" resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== lodash.uniqby@^4.7.0: version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" + resolved "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz" integrity sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww== lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21: @@ -5165,7 +5873,7 @@ lowercase-keys@^2.0.0: lru-cache@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: yallist "^3.0.2" @@ -5184,6 +5892,11 @@ make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: dependencies: semver "^6.0.0" +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + markdown-escapes@^1.0.0: version "1.0.4" resolved "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz" @@ -5239,7 +5952,7 @@ media-typer@0.3.0: memfs@^3.1.2, memfs@^3.4.3: version "3.6.0" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.6.0.tgz#d7a2110f86f79dd950a8b6df6d57bc984aa185f6" + resolved "https://registry.npmjs.org/memfs/-/memfs-3.6.0.tgz" integrity sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ== dependencies: fs-monkey "^1.0.4" @@ -5264,6 +5977,15 @@ methods@~1.1.2: resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== +micro@9.3.5-canary.3: + version "9.3.5-canary.3" + resolved "https://registry.npmjs.org/micro/-/micro-9.3.5-canary.3.tgz" + integrity sha512-viYIo9PefV+w9dvoIBh1gI44Mvx1BOk67B4BpC2QK77qdY0xZF0Q+vWLt/BII6cLkIc8rLmSIcJaB/OrXXKe1g== + dependencies: + arg "4.1.0" + content-type "1.0.4" + raw-body "2.4.1" + micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: version "4.0.5" resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" @@ -5272,7 +5994,7 @@ micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: braces "^3.0.2" picomatch "^2.3.1" -mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": +"mime-db@>= 1.43.0 < 2", mime-db@1.52.0: version "1.52.0" resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== @@ -5282,19 +6004,26 @@ mime-db@~1.33.0: resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz" integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== -mime-types@2.1.18, mime-types@~2.1.17: +mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.24, mime-types@~2.1.34: + 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" + +mime-types@~2.1.17: 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== dependencies: mime-db "~1.33.0" -mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== +mime-types@2.1.18: + 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== dependencies: - mime-db "1.52.0" + mime-db "~1.33.0" mime@1.6.0: version "1.6.0" @@ -5313,7 +6042,7 @@ mimic-response@^1.0.0, mimic-response@^1.0.1: mini-css-extract-plugin@^2.6.1: version "2.7.6" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz#282a3d38863fddcd2e0c220aaed5b90bc156564d" + resolved "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz" integrity sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw== dependencies: schema-utils "^4.0.0" @@ -5323,23 +6052,85 @@ minimalistic-assert@^1.0.0: resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimatch@3.1.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1: +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" -minimist@^1.2.0, minimist@^1.2.5: +minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== +minipass@^2.6.0, minipass@^2.9.0: + version "2.9.0" + resolved "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz" + integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minipass@^3.0.0: + version "3.3.6" + resolved "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + +minizlib@^1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz" + integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== + dependencies: + minipass "^2.9.0" + +minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mkdirp@^0.5.5: + version "0.5.6" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +mkdirp@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mri@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz" + integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== + mrmime@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz" integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== +ms@^2.1.1, ms@2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + ms@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" @@ -5402,22 +6193,48 @@ node-emoji@^1.10.0: dependencies: lodash "^4.17.21" -node-fetch@^2.6.12: +node-fetch@^2.6.12, node-fetch@^2.6.7: 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== dependencies: whatwg-url "^5.0.0" +node-fetch@2.6.7: + version "2.6.7" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + +node-fetch@2.6.9: + version "2.6.9" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz" + integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg== + dependencies: + whatwg-url "^5.0.0" + node-forge@^1: version "1.3.1" resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz" integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== -node-releases@^2.0.13: - version "2.0.13" - resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz" - integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== +node-gyp-build@^4.2.2: + version "4.8.0" + resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.0.tgz" + integrity sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og== + +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== + +nopt@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz" + integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== + dependencies: + abbrev "1" normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" @@ -5439,13 +6256,23 @@ normalize-url@^6.0.1: resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz" integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== -npm-run-path@^4.0.1: +npm-run-path@^4.0.0, npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: path-key "^3.0.0" +npmlog@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz" + integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== + dependencies: + are-we-there-yet "^2.0.0" + console-control-strings "^1.1.0" + gauge "^3.0.0" + set-blocking "^2.0.0" + nprogress@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz" @@ -5512,7 +6339,14 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -onetime@^5.1.2: +once@~1.3.0: + version "1.3.3" + resolved "https://registry.npmjs.org/once/-/once-1.3.3.tgz" + integrity sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w== + dependencies: + wrappy "1" + +onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== @@ -5521,7 +6355,7 @@ onetime@^5.1.2: open@^8.0.9, open@^8.4.0: version "8.4.2" - resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + 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" @@ -5533,11 +6367,21 @@ opener@^1.5.2: resolved "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz" integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== +os-paths@^4.0.1: + version "4.4.0" + resolved "https://registry.npmjs.org/os-paths/-/os-paths-4.4.0.tgz" + integrity sha512-wrAwOeXp1RRMFfQY8Sy7VaGVmPocaLwSFOYCGKSyo8qmJ+/yaafCl5BCA1IQZWqFSRBrKDYFeR9d/VyQzfH/jg== + p-cancelable@^1.0.0: version "1.1.0" resolved "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz" integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== +p-finally@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz" + integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== + p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" @@ -5640,6 +6484,11 @@ parse-json@^5.0.0, parse-json@^5.2.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" +parse-ms@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz" + integrity sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA== + parse-numeric-range@^1.3.0: version "1.3.0" resolved "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz" @@ -5678,6 +6527,11 @@ pascal-case@^3.1.2: no-case "^3.0.4" tslib "^2.0.3" +path-browserify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== + path-exists@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" @@ -5703,11 +6557,33 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== +path-match@1.2.4: + version "1.2.4" + resolved "https://registry.npmjs.org/path-match/-/path-match-1.2.4.tgz" + integrity sha512-UWlehEdqu36jmh4h5CWJ7tARp1OEVKGHKm6+dg9qMq5RKUTV5WJrGgaZ3dN2m7WFAXDbjlHzvJvL/IUpy84Ktw== + dependencies: + http-errors "~1.4.0" + path-to-regexp "^1.0.0" + path-parse@^1.0.7: version "1.0.7" resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-to-regexp@^1.0.0: + version "1.8.0" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + dependencies: + isarray "0.0.1" + +path-to-regexp@^1.7.0: + version "1.8.0" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + dependencies: + isarray "0.0.1" + path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" @@ -5718,12 +6594,15 @@ path-to-regexp@2.2.1: resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz" integrity sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ== -path-to-regexp@^1.7.0: - version "1.8.0" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz" - integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== - dependencies: - isarray "0.0.1" +path-to-regexp@6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.1.0.tgz" + integrity sha512-h9DqehX3zZZDCEm+xbfU0ZmwCGFCAAraPJWMXJ4+v32NjZJilVg3k1TcKsRgIb8IQ/izZSaydDc1OhJCZvs2Dw== + +path-to-regexp@6.2.1: + version "6.2.1" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz" + integrity sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw== path-type@^4.0.0: version "4.0.0" @@ -5738,12 +6617,17 @@ path@^0.12.7: process "^0.11.1" util "^0.10.3" -picocolors@^1.0.0: +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz" + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== + +picocolors@^1.0.0, picocolors@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: +picomatch@^2.0.4, picomatch@^2.0.7, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== @@ -5851,7 +6735,7 @@ postcss-load-config@^4.0.1: postcss-loader@^7.0.0: version "7.3.3" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-7.3.3.tgz#6da03e71a918ef49df1bb4be4c80401df8e249dd" + resolved "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.3.tgz" integrity sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA== dependencies: cosmiconfig "^8.2.0" @@ -5923,7 +6807,7 @@ postcss-modules-extract-imports@^3.0.0: postcss-modules-local-by-default@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz#b08eb4f083050708998ba2c6061b50c2870ca524" + resolved "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz" integrity sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA== dependencies: icss-utils "^5.0.0" @@ -6084,7 +6968,7 @@ postcss-zindex@^5.1.0: resolved "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-5.1.0.tgz" integrity sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A== -postcss@^8.3.11, postcss@^8.4.14, postcss@^8.4.17, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.31: +"postcss@^7.0.0 || ^8.0.1", postcss@^8.0.0, postcss@^8.0.9, postcss@^8.1.0, postcss@^8.2.14, postcss@^8.2.15, postcss@^8.2.2, postcss@^8.3.11, postcss@^8.4.14, postcss@^8.4.16, postcss@^8.4.17, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.31, postcss@>=8.0.9: version "8.4.31" resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz" integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== @@ -6106,6 +6990,13 @@ pretty-error@^4.0.0: lodash "^4.17.20" renderkid "^3.0.0" +pretty-ms@7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz" + integrity sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q== + dependencies: + parse-ms "^2.1.0" + pretty-time@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz" @@ -6138,6 +7029,11 @@ promise@^7.1.1: dependencies: asap "~2.0.3" +promisepipe@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/promisepipe/-/promisepipe-3.0.0.tgz" + integrity sha512-V6TbZDJ/ZswevgkDNpGt/YqNCiZP9ASfgU+p83uJE6NrGtvSGoOcHLiDCqkMs2+yg7F5qHdLV8d0aS8O26G/KA== + prompts@^2.4.2: version "2.4.2" resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" @@ -6185,7 +7081,7 @@ punycode@^1.3.2: punycode@^2.1.0: version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== pupa@^2.1.1: @@ -6202,7 +7098,7 @@ pure-color@^1.2.0: qs@6.11.0: version "6.11.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz" integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== dependencies: side-channel "^1.0.4" @@ -6226,15 +7122,25 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + range-parser@1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz" integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A== -range-parser@^1.2.1, range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== +raw-body@2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz" + integrity sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA== + dependencies: + bytes "3.1.0" + http-errors "1.7.3" + iconv-lite "0.4.24" + unpipe "1.0.0" raw-body@2.5.1: version "2.5.1" @@ -6246,7 +7152,7 @@ raw-body@2.5.1: iconv-lite "0.4.24" unpipe "1.0.0" -rc@1.2.8, rc@^1.2.8: +rc@^1.2.8, rc@1.2.8: version "1.2.8" resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -6296,7 +7202,7 @@ react-dev-utils@^12.0.1: strip-ansi "^6.0.1" text-table "^0.2.0" -react-dom@^17.0.2: +react-dom@*, "react-dom@^16.6.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.8.4 || ^17.0.0", "react-dom@^17.0.0 || ^16.3.0 || ^15.5.4", react-dom@^17.0.2, "react-dom@>= 16.8.0 < 19.0.0": version "17.0.2" resolved "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz" integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== @@ -6312,7 +7218,7 @@ react-error-overlay@^6.0.11: react-fast-compare@^3.2.0: version "3.2.2" - resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.2.tgz#929a97a532304ce9fee4bcae44234f1ce2c21d49" + resolved "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz" integrity sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ== react-helmet-async@*, react-helmet-async@^1.3.0: @@ -6353,6 +7259,14 @@ react-loadable-ssr-addon-v5-slorber@^1.0.1: dependencies: "@babel/runtime" "^7.10.3" +react-loadable@*, "react-loadable@npm:@docusaurus/react-loadable@5.5.2": + 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" + react-router-config@^5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz" @@ -6362,7 +7276,7 @@ react-router-config@^5.1.1: react-router-dom@^5.3.3: version "5.3.4" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.3.4.tgz#2ed62ffd88cae6db134445f4a0c0ae8b91d2e5e6" + resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz" integrity sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ== dependencies: "@babel/runtime" "^7.12.13" @@ -6373,9 +7287,9 @@ react-router-dom@^5.3.3: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react-router@5.3.4, react-router@^5.3.3: +react-router@^5.3.3, react-router@>=5, react-router@5.3.4: version "5.3.4" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.3.4.tgz#8ca252d70fcc37841e31473c7a151cf777887bb5" + resolved "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz" integrity sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA== dependencies: "@babel/runtime" "^7.12.13" @@ -6397,7 +7311,7 @@ react-textarea-autosize@^8.3.2: use-composed-ref "^1.3.0" use-latest "^1.2.1" -react@^17.0.2: +react@*, "react@^15.0.2 || ^16.0.0 || ^17.0.0", "react@^16.13.1 || ^17.0.0", "react@^16.6.0 || ^17.0.0 || ^18.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^16.8.4 || ^17.0.0", "react@^17.0.0 || ^16.3.0 || ^15.5.4", react@^17.0.2, "react@>= 16.8.0 < 19.0.0", react@>=0.14.9, react@>=15, react@17.0.2: 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== @@ -6414,7 +7328,7 @@ read-cache@^1.0.0: readable-stream@^2.0.1: version "2.3.8" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" @@ -6425,15 +7339,22 @@ readable-stream@^2.0.1: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.0.6: +readable-stream@^3.0.6, readable-stream@^3.6.0: version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" util-deprecate "^1.0.1" +readdirp@~3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz" + integrity sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ== + dependencies: + picomatch "^2.0.7" + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" @@ -6455,14 +7376,14 @@ rechoir@^0.6.2: recursive-readdir@^2.2.2: version "2.2.3" - resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz#e726f328c0d69153bcabd5c322d3195252379372" + resolved "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz" integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== dependencies: minimatch "^3.0.5" regenerate-unicode-properties@^10.1.0: version "10.1.1" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" + resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz" integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== dependencies: regenerate "^1.4.2" @@ -6479,14 +7400,14 @@ regenerator-runtime@^0.14.0: regenerator-transform@^0.15.2: version "0.15.2" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz" integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== dependencies: "@babel/runtime" "^7.8.4" regexpu-core@^5.3.1: version "5.3.2" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz" integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== dependencies: "@babel/regjsgen" "^0.8.0" @@ -6512,7 +7433,7 @@ registry-url@^5.0.0: regjsparser@^0.9.1: version "0.9.1" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz" integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== dependencies: jsesc "~0.5.0" @@ -6615,6 +7536,11 @@ resolve-from@^4.0.0: resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + resolve-pathname@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz" @@ -6677,17 +7603,27 @@ run-parallel@^1.1.9: rxjs@^7.5.4: version "7.8.1" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz" integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== dependencies: tslib "^2.1.0" -safe-buffer@5.1.2, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@>=5.1.0, safe-buffer@~5.1.0, safe-buffer@~5.1.1, safe-buffer@5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@5.2.1, safe-buffer@~5.2.0: +safe-buffer@^5.2.1: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@5.2.1: version "5.2.1" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -6710,15 +7646,6 @@ scheduler@^0.20.2: loose-envify "^1.1.0" object-assign "^4.1.1" -schema-utils@2.7.0: - version "2.7.0" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz" - integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== - dependencies: - "@types/json-schema" "^7.0.4" - ajv "^6.12.2" - ajv-keywords "^3.4.1" - schema-utils@^2.6.5: version "2.7.1" resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz" @@ -6728,9 +7655,27 @@ schema-utils@^2.6.5: ajv "^6.12.4" ajv-keywords "^3.5.2" -schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: +schema-utils@^3.0.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^3.1.1: + 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== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^3.2.0: + 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== dependencies: "@types/json-schema" "^7.0.8" @@ -6739,7 +7684,7 @@ schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: schema-utils@^4.0.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.2.0.tgz#70d7c93e153a273a805801882ebd3bff20d89c8b" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz" integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== dependencies: "@types/json-schema" "^7.0.9" @@ -6747,6 +7692,20 @@ schema-utils@^4.0.0: ajv-formats "^2.1.1" ajv-keywords "^5.1.0" +schema-utils@2.7.0: + version "2.7.0" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz" + integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== + dependencies: + "@types/json-schema" "^7.0.4" + ajv "^6.12.2" + ajv-keywords "^3.4.1" + +"search-insights@>= 1 < 3": + version "2.13.0" + resolved "https://registry.npmjs.org/search-insights/-/search-insights-2.13.0.tgz" + integrity sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw== + section-matter@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz" @@ -6762,7 +7721,7 @@ select-hose@^2.0.0: selfsigned@^2.1.1: version "2.4.1" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.4.1.tgz#560d90565442a3ed35b674034cec4e95dceb4ae0" + resolved "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz" integrity sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q== dependencies: "@types/node-forge" "^1.3.0" @@ -6780,18 +7739,53 @@ semver@^5.4.1: resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@^6.0.0, semver@^6.2.0, semver@^6.3.0, semver@^6.3.1: +semver@^6.0.0, semver@^6.2.0, semver@^6.3.0, semver@^6.3.1, semver@6.3.1: version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.2, semver@^7.3.4, semver@^7.3.7, semver@^7.3.8: +semver@^7.3.2: + 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" + +semver@^7.3.4: + 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" + +semver@^7.3.5: version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + 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" +semver@^7.3.7: + 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" + +semver@^7.3.8: + 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" + +semver@7.3.5: + 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" + send@0.18.0: version "0.18.0" resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz" @@ -6813,14 +7807,14 @@ send@0.18.0: serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz" integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== dependencies: randombytes "^2.1.0" serve-handler@^6.1.3: version "6.1.5" - resolved "https://registry.yarnpkg.com/serve-handler/-/serve-handler-6.1.5.tgz#a4a0964f5c55c7e37a02a633232b6f0d6f068375" + resolved "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz" integrity sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg== dependencies: bytes "3.0.0" @@ -6855,6 +7849,11 @@ serve-static@1.15.0: parseurl "~1.3.3" send "0.18.0" +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" @@ -6865,6 +7864,11 @@ setprototypeof@1.1.0: resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz" integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + setprototypeof@1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" @@ -6896,7 +7900,7 @@ shebang-regex@^3.0.0: shell-quote@^1.7.3, shell-quote@^1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" + resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz" integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== shelljs@^0.8.5: @@ -6917,14 +7921,19 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@^3.0.2, signal-exit@^3.0.3: +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.7" resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +signal-exit@4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz" + integrity sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q== + sirv@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/sirv/-/sirv-2.0.3.tgz#ca5868b87205a74bef62a469ed0296abceccd446" + resolved "https://registry.npmjs.org/sirv/-/sirv-2.0.3.tgz" integrity sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA== dependencies: "@polka/url" "^1.0.0-next.20" @@ -7031,43 +8040,56 @@ stable@^0.1.8: resolved "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz" integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== +stat-mode@0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/stat-mode/-/stat-mode-0.3.0.tgz" + integrity sha512-QjMLR0A3WwFY2aZdV0okfFEJB5TRjkggXZjxP3A1RsWsNHNu3YPv8btmtc6iCFZ0Rul3FE93OYogvhOUClU+ng== + state-toggle@^1.0.0: version "1.0.3" resolved "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz" integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== +"statuses@>= 1.2.1 < 2": + version "1.5.0" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== "statuses@>= 1.4.0 < 2": version "1.5.0" resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== +"statuses@>= 1.5.0 < 2": + version "1.5.0" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + std-env@^3.0.1: version "3.4.3" - resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.4.3.tgz#326f11db518db751c83fd58574f449b7c3060910" + resolved "https://registry.npmjs.org/std-env/-/std-env-3.4.3.tgz" integrity sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q== -string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2: - version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== +stream-to-array@~2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/stream-to-array/-/stream-to-array-2.3.0.tgz" + integrity sha512-UsZtOYEn4tWU2RGLOXr/o/xjRBftZRlG3dEWoaHr8j4GuypJ3isitGbVyjQKAuMu+xbiop8q224TjiZWc4XTZA== dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" + any-promise "^1.1.0" -string-width@^5.0.1: - version "5.1.2" - resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== +stream-to-promise@2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/stream-to-promise/-/stream-to-promise-2.2.0.tgz" + integrity sha512-HAGUASw8NT0k8JvIVutB2Y/9iBk7gpgEyAudXwNJmZERdMITGdajOa4VJfD/kNiA3TppQpTP4J+CtcHwdzKBAw== dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" + any-promise "~1.3.0" + end-of-stream "~1.1.0" + stream-to-array "~2.3.0" string_decoder@^1.1.1: version "1.3.0" @@ -7083,6 +8105,24 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: + 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" + +string-width@^5.0.1: + version "5.1.2" + resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + stringify-object@^3.3.0: version "3.3.0" resolved "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz" @@ -7101,7 +8141,7 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: strip-ansi@^7.0.1: version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: ansi-regex "^6.0.1" @@ -7126,7 +8166,7 @@ strip-json-comments@~2.0.1: resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== -style-to-object@0.3.0, style-to-object@^0.3.0: +style-to-object@^0.3.0, style-to-object@0.3.0: version "0.3.0" resolved "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz" integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== @@ -7236,9 +8276,34 @@ tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== +tar@^6.1.11: + version "6.2.0" + resolved "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz" + integrity sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^5.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +tar@4.4.18: + version "4.4.18" + resolved "https://registry.npmjs.org/tar/-/tar-4.4.18.tgz" + integrity sha512-ZuOtqqmkV9RE1+4odd+MhBpibmCxNP6PJhH/h2OqNuotTX7/XHPZQJv2pKvWMplFH9SIZZhitehh6vBH6LO8Pg== + dependencies: + chownr "^1.1.4" + fs-minipass "^1.2.7" + minipass "^2.9.0" + minizlib "^1.3.3" + mkdirp "^0.5.5" + safe-buffer "^5.2.1" + yallist "^3.1.1" + terser-webpack-plugin@^5.3.3, terser-webpack-plugin@^5.3.7: version "5.3.9" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz#832536999c51b46d468067f9e37662a3b96adfe1" + resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz" integrity sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA== dependencies: "@jridgewell/trace-mapping" "^0.3.17" @@ -7249,7 +8314,7 @@ terser-webpack-plugin@^5.3.3, terser-webpack-plugin@^5.3.7: terser@^5.10.0, terser@^5.16.8: version "5.24.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.24.0.tgz#4ae50302977bca4831ccc7b4fef63a3c04228364" + resolved "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz" integrity sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw== dependencies: "@jridgewell/source-map" "^0.3.3" @@ -7281,9 +8346,16 @@ thunky@^1.0.2: resolved "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz" integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== +time-span@4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/time-span/-/time-span-4.0.0.tgz" + integrity sha512-MyqZCTGLDZ77u4k+jqg4UlrzPTPZ49NDlaekU6uuFaJLzPIN1woaRXCbGeqOfxwc3Y37ZROGAJ614Rdv7Olt+g== + dependencies: + convert-hrtime "^3.0.0" + tiny-invariant@^1.0.2: version "1.3.1" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" + resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz" integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== tiny-warning@^1.0.0: @@ -7308,6 +8380,11 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + toidentifier@1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" @@ -7315,7 +8392,7 @@ toidentifier@1.0.1: totalist@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8" + resolved "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz" integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== tr46@~0.0.3: @@ -7323,6 +8400,11 @@ tr46@~0.0.3: resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +tree-kill@1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + trim-trailing-lines@^1.0.0: version "1.1.4" resolved "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz" @@ -7343,9 +8425,41 @@ ts-interface-checker@^0.1.9: resolved "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== +ts-morph@12.0.0: + version "12.0.0" + resolved "https://registry.npmjs.org/ts-morph/-/ts-morph-12.0.0.tgz" + integrity sha512-VHC8XgU2fFW7yO1f/b3mxKDje1vmyzFXHWzOYmKEkCEwcLjDtbdLgBQviqj4ZwP4MJkQtRo6Ha2I29lq/B+VxA== + dependencies: + "@ts-morph/common" "~0.11.0" + code-block-writer "^10.1.1" + +ts-node@>=9.0.0, ts-node@10.9.1: + version "10.9.1" + resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +ts-toolbelt@^6.15.5: + version "6.15.5" + resolved "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-6.15.5.tgz" + integrity sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A== + tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0: version "2.6.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== type-fest@^0.20.2: @@ -7355,7 +8469,7 @@ type-fest@^0.20.2: type-fest@^2.5.0: version "2.19.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz" integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== type-is@~1.6.18: @@ -7373,9 +8487,9 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typescript@^4.7.4: +typescript@^4.7.4, "typescript@>= 2.7", typescript@>=2.7, typescript@>=4.9.5, typescript@4.9.5: version "4.9.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz" integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== ua-parser-js@^1.0.35: @@ -7383,11 +8497,23 @@ ua-parser-js@^1.0.35: resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.37.tgz" integrity sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ== +uid-promise@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/uid-promise/-/uid-promise-1.0.0.tgz" + integrity sha512-R8375j0qwXyIu/7R0tjdF06/sElHqbmdmWC9M2qQHpEVbvE4I5+38KJI7LUUmQMp7NVq4tKHiBMkT0NFM453Ig== + undici-types@~5.26.4: version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== +undici@5.26.5: + version "5.26.5" + resolved "https://registry.npmjs.org/undici/-/undici-5.26.5.tgz" + integrity sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw== + dependencies: + "@fastify/busboy" "^2.0.0" + unherit@^1.0.4: version "1.1.3" resolved "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz" @@ -7411,18 +8537,18 @@ unicode-match-property-ecmascript@^2.0.0: unicode-match-property-value-ecmascript@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + 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== unicode-property-aliases-ecmascript@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + 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== -unified@9.2.0: - version "9.2.0" - resolved "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz" - integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg== +unified@^9.2.2: + 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" extend "^3.0.0" @@ -7431,10 +8557,10 @@ unified@9.2.0: trough "^1.0.0" vfile "^4.0.0" -unified@^9.2.2: - version "9.2.2" - resolved "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz" - integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== +unified@9.2.0: + version "9.2.0" + resolved "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz" + integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg== dependencies: bail "^1.0.0" extend "^3.0.0" @@ -7450,7 +8576,7 @@ unique-string@^2.0.0: dependencies: crypto-random-string "^2.0.0" -unist-builder@2.0.3, unist-builder@^2.0.0: +unist-builder@^2.0.0, unist-builder@2.0.3: version "2.0.3" resolved "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz" integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== @@ -7499,7 +8625,7 @@ unist-util-visit-parents@^3.0.0: "@types/unist" "^2.0.0" unist-util-is "^4.0.0" -unist-util-visit@2.0.3, unist-util-visit@^2.0.0, unist-util-visit@^2.0.3: +unist-util-visit@^2.0.0, unist-util-visit@^2.0.3, unist-util-visit@2.0.3: 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== @@ -7508,12 +8634,17 @@ unist-util-visit@2.0.3, unist-util-visit@^2.0.0, unist-util-visit@^2.0.3: unist-util-is "^4.0.0" unist-util-visit-parents "^3.0.0" +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + universalify@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== -unpipe@1.0.0, unpipe@~1.0.0: +unpipe@~1.0.0, unpipe@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== @@ -7623,6 +8754,16 @@ uuid@^8.3.2: resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +uuid@3.3.2: + version "3.3.2" + resolved "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz" + integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + value-equal@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz" @@ -7633,6 +8774,24 @@ vary@~1.1.2: resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== +vercel@^33.4.0: + version "33.4.0" + resolved "https://registry.npmjs.org/vercel/-/vercel-33.4.0.tgz" + integrity sha512-uB8XcTvARBsJtXCbhm/+F3qtV/FQXYYxx6jyUMfMU8izmOmWUlcSOmARbctL4vZ3Izj4ku+P4S25aDQFNmhGYQ== + dependencies: + "@vercel/build-utils" "7.5.1" + "@vercel/fun" "1.1.0" + "@vercel/go" "3.0.5" + "@vercel/hydrogen" "1.0.2" + "@vercel/next" "4.1.0" + "@vercel/node" "3.0.17" + "@vercel/python" "4.1.1" + "@vercel/redwood" "2.0.6" + "@vercel/remix-builder" "2.0.18" + "@vercel/ruby" "2.0.5" + "@vercel/static-build" "2.1.0" + chokidar "3.3.1" + vfile-location@^3.0.0, vfile-location@^3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz" @@ -7687,6 +8846,11 @@ web-namespaces@^1.0.0: resolved "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz" integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== +web-vitals@0.2.4: + version "0.2.4" + resolved "https://registry.npmjs.org/web-vitals/-/web-vitals-0.2.4.tgz" + integrity sha512-6BjspCO9VriYy12z356nL6JBS0GYeEcA457YyRzD+dD6XYCQ75NKhcOHUMHentOE7OcVCIXXDvOm0jKFfQG2Gg== + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" @@ -7694,7 +8858,7 @@ webidl-conversions@^3.0.0: webpack-bundle-analyzer@^4.5.0: version "4.9.1" - resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.9.1.tgz#d00bbf3f17500c10985084f22f1a2bf45cb2f09d" + resolved "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.9.1.tgz" integrity sha512-jnd6EoYrf9yMxCyYDPj8eutJvtjQNp8PHmni/e/ulydHBWhT5J3menXt3HEkScsu9YqMAcG4CfFjs3rj5pVU1w== dependencies: "@discoveryjs/json-ext" "0.5.7" @@ -7728,7 +8892,7 @@ webpack-dev-middleware@^5.3.1: webpack-dev-server@^4.9.3: version "4.15.1" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz#8944b29c12760b3a45bdaa70799b17cb91b03df7" + resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz" integrity sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA== dependencies: "@types/bonjour" "^3.5.9" @@ -7764,7 +8928,7 @@ webpack-dev-server@^4.9.3: webpack-merge@^5.8.0: version "5.10.0" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.10.0.tgz#a3ad5d773241e9c682803abf628d4cd62b8a4177" + resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz" integrity sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA== dependencies: clone-deep "^4.0.1" @@ -7776,9 +8940,9 @@ webpack-sources@^3.2.2, webpack-sources@^3.2.3: resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== -webpack@^5.73.0: +"webpack@^4.0.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", webpack@^5.0.0, webpack@^5.1.0, webpack@^5.20.0, webpack@^5.73.0, "webpack@>= 4", webpack@>=2, "webpack@>=4.41.1 || 5.x", "webpack@3 || 4 || 5": version "5.89.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.89.0.tgz#56b8bf9a34356e93a6625770006490bf3a7f32dc" + resolved "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz" integrity sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw== dependencies: "@types/eslint-scope" "^3.7.3" @@ -7816,7 +8980,7 @@ webpackbar@^5.0.2: pretty-time "^1.1.0" std-env "^3.0.1" -websocket-driver@>=0.5.1, websocket-driver@^0.7.4: +websocket-driver@^0.7.4, websocket-driver@>=0.5.1: version "0.7.4" resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== @@ -7852,6 +9016,13 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +wide-align@^1.1.2: + version "1.1.5" + resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + widest-line@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz" @@ -7868,7 +9039,7 @@ widest-line@^4.0.1: wildcard@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" + resolved "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz" integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== wrap-ansi@^7.0.0: @@ -7882,7 +9053,7 @@ wrap-ansi@^7.0.0: wrap-ansi@^8.0.1: version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== dependencies: ansi-styles "^6.1.0" @@ -7911,14 +9082,28 @@ ws@^7.3.1: ws@^8.13.0: version "8.14.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.2.tgz#6c249a806eb2db7a20d26d51e7709eab7b2e6c7f" + resolved "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz" integrity sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g== +xdg-app-paths@5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/xdg-app-paths/-/xdg-app-paths-5.1.0.tgz" + integrity sha512-RAQ3WkPf4KTU1A8RtFx3gWywzVKe00tfOPFfl2NDGqbIFENQO4kqAJp7mhQjNj/33W5x5hiWWUdyfPq/5SU3QA== + dependencies: + xdg-portable "^7.0.0" + xdg-basedir@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz" integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== +xdg-portable@^7.0.0: + version "7.3.0" + resolved "https://registry.npmjs.org/xdg-portable/-/xdg-portable-7.3.0.tgz" + integrity sha512-sqMMuL1rc0FmMBOzCpd0yuy9trqF2yTTVe+E9ogwCSWQCdDEtQUwrZPT6AxqtsFGRNxycgncbP/xmOOSPw5ZUw== + dependencies: + os-paths "^4.0.1" + xml-js@^1.6.11: version "1.6.11" resolved "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz" @@ -7931,9 +9116,9 @@ xtend@^4.0.0, xtend@^4.0.1: resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== -yallist@^3.0.2: +yallist@^3.0.0, yallist@^3.0.2, yallist@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yallist@^4.0.0: @@ -7951,6 +9136,34 @@ yaml@^2.1.1: resolved "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz" integrity sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA== +yauzl-clone@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/yauzl-clone/-/yauzl-clone-1.0.4.tgz" + integrity sha512-igM2RRCf3k8TvZoxR2oguuw4z1xasOnA31joCqHIyLkeWrvAc2Jgay5ISQ2ZplinkoGaJ6orCz56Ey456c5ESA== + dependencies: + events-intercept "^2.0.0" + +yauzl-promise@2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/yauzl-promise/-/yauzl-promise-2.1.3.tgz" + integrity sha512-A1pf6fzh6eYkK0L4Qp7g9jzJSDrM6nN0bOn5T0IbY4Yo3w+YkWlHFkJP7mzknMXjqusHFHlKsK2N+4OLsK2MRA== + dependencies: + yauzl "^2.9.1" + yauzl-clone "^1.0.4" + +yauzl@^2.9.1: + version "2.10.0" + resolved "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz" + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" From a6abf5d88377ded9d48e689ed81c6511a9825740 Mon Sep 17 00:00:00 2001 From: bglynn Date: Tue, 30 Jan 2024 08:44:03 -0800 Subject: [PATCH 06/20] "/Examples" -> "/tutorials" --- docs/features/aws-iam/index.mdx | 4 +-- .../tutorials}/_category_.json | 2 +- .../{Examples => tutorials}/aws-iam-eks.mdx | 0 docs/features/{Istio => istio}/Reference.mdx | 0 .../features/{Istio => istio}/_category_.json | 0 docs/features/{Istio => istio}/index.mdx | 0 .../tutorials}/_category_.json | 2 +- .../k8s-istio-authorization-policies.mdx | 0 .../tutorials}/k8s-istio-watcher.mdx | 0 docs/features/{Kafka => kafka}/Reference.mdx | 0 .../features/{Kafka => kafka}/_category_.json | 0 docs/features/{Kafka => kafka}/index.mdx | 10 +++--- .../tutorials}/_category_.json | 2 +- .../tutorials}/k8s-kafka-mapping.mdx | 0 .../k8s-kafka-mtls-cert-manager.mdx | 0 .../tutorials}/k8s-kafka-mtls.mdx | 0 .../Reference/Network-Policies-Deep-Dive.mdx | 0 .../Reference/README.mdx | 0 .../_category_.json | 0 .../{Networking => networking}/index.mdx | 15 ++++++--- .../tutorials}/_category_.json | 2 +- .../tutorials}/aws-eks-cni-mini.mdx | 0 .../tutorials}/k8s-network-mapper.mdx | 0 .../tutorials}/k8s-network-policies.mdx | 0 .../protect-1-service-network-policies.mdx | 0 .../postgresql/Examples/_category_.json | 5 --- docs/features/postgresql/index.mdx | 2 +- .../postgresql/tutorials/_category_.json | 5 +++ .../{Examples => tutorials}/postgres.mdx | 0 docs/getting-started/README.mdx | 17 +++++----- docs/overview/README.mdx | 4 --- docs/overview/index.mdx | 31 +++++++++++++++++++ docs/overview/installation/README.mdx | 2 +- .../configuration/intents-operator/README.mdx | 2 +- docusaurus.config.js | 20 ++++++------ 35 files changed, 79 insertions(+), 46 deletions(-) rename docs/features/{Istio/Examples => aws-iam/tutorials}/_category_.json (63%) rename docs/features/aws-iam/{Examples => tutorials}/aws-iam-eks.mdx (100%) rename docs/features/{Istio => istio}/Reference.mdx (100%) rename docs/features/{Istio => istio}/_category_.json (100%) rename docs/features/{Istio => istio}/index.mdx (100%) rename docs/features/{Kafka/Examples => istio/tutorials}/_category_.json (63%) rename docs/features/{Istio/Examples => istio/tutorials}/k8s-istio-authorization-policies.mdx (100%) rename docs/features/{Istio/Examples => istio/tutorials}/k8s-istio-watcher.mdx (100%) rename docs/features/{Kafka => kafka}/Reference.mdx (100%) rename docs/features/{Kafka => kafka}/_category_.json (100%) rename docs/features/{Kafka => kafka}/index.mdx (88%) rename docs/features/{aws-iam/Examples => kafka/tutorials}/_category_.json (63%) rename docs/features/{Kafka/Examples => kafka/tutorials}/k8s-kafka-mapping.mdx (100%) rename docs/features/{Kafka/Examples => kafka/tutorials}/k8s-kafka-mtls-cert-manager.mdx (100%) rename docs/features/{Kafka/Examples => kafka/tutorials}/k8s-kafka-mtls.mdx (100%) rename docs/features/{Networking => networking}/Reference/Network-Policies-Deep-Dive.mdx (100%) rename docs/features/{Networking => networking}/Reference/README.mdx (100%) rename docs/features/{Networking => networking}/_category_.json (100%) rename docs/features/{Networking => networking}/index.mdx (84%) rename docs/features/{Networking/Examples => networking/tutorials}/_category_.json (63%) rename docs/features/{Networking/Examples => networking/tutorials}/aws-eks-cni-mini.mdx (100%) rename docs/features/{Networking/Examples => networking/tutorials}/k8s-network-mapper.mdx (100%) rename docs/features/{Networking/Examples => networking/tutorials}/k8s-network-policies.mdx (100%) rename docs/features/{Networking/Examples => networking/tutorials}/protect-1-service-network-policies.mdx (100%) delete mode 100644 docs/features/postgresql/Examples/_category_.json create mode 100644 docs/features/postgresql/tutorials/_category_.json rename docs/features/postgresql/{Examples => tutorials}/postgres.mdx (100%) delete mode 100644 docs/overview/README.mdx create mode 100644 docs/overview/index.mdx diff --git a/docs/features/aws-iam/index.mdx b/docs/features/aws-iam/index.mdx index b701f699b..aa44f0a4c 100644 --- a/docs/features/aws-iam/index.mdx +++ b/docs/features/aws-iam/index.mdx @@ -1,6 +1,6 @@ --- sidebar_position: 1 -title: AWS IAM +title: AWS IAM | Overview hide_table_of_contents: true hide_title: true --- @@ -15,7 +15,7 @@ In many workloads, EKS clusters must access external cloud resources such as dat ### How does it work -To follow along with a full example, take a look at [Automate AWS IAM for EKS](/features/aws-iam/Examples/aws-iam-eks) +To follow along with a full example, take a look at [Automate AWS IAM for EKS](/features/aws-iam/tutorials/aws-iam-eks) 1. First, the EKS cluster must have [Otterize installed](/overview/installation). 2. We must label the pod with `credentials-operator.otterize.com/create-aws-role: "true"` diff --git a/docs/features/Istio/Examples/_category_.json b/docs/features/aws-iam/tutorials/_category_.json similarity index 63% rename from docs/features/Istio/Examples/_category_.json rename to docs/features/aws-iam/tutorials/_category_.json index bbac434cd..bdfe77bf2 100644 --- a/docs/features/Istio/Examples/_category_.json +++ b/docs/features/aws-iam/tutorials/_category_.json @@ -1,5 +1,5 @@ { - "label": "Examples", + "label": "Tutorials", "position": 2, "collapsed": false } diff --git a/docs/features/aws-iam/Examples/aws-iam-eks.mdx b/docs/features/aws-iam/tutorials/aws-iam-eks.mdx similarity index 100% rename from docs/features/aws-iam/Examples/aws-iam-eks.mdx rename to docs/features/aws-iam/tutorials/aws-iam-eks.mdx diff --git a/docs/features/Istio/Reference.mdx b/docs/features/istio/Reference.mdx similarity index 100% rename from docs/features/Istio/Reference.mdx rename to docs/features/istio/Reference.mdx diff --git a/docs/features/Istio/_category_.json b/docs/features/istio/_category_.json similarity index 100% rename from docs/features/Istio/_category_.json rename to docs/features/istio/_category_.json diff --git a/docs/features/Istio/index.mdx b/docs/features/istio/index.mdx similarity index 100% rename from docs/features/Istio/index.mdx rename to docs/features/istio/index.mdx diff --git a/docs/features/Kafka/Examples/_category_.json b/docs/features/istio/tutorials/_category_.json similarity index 63% rename from docs/features/Kafka/Examples/_category_.json rename to docs/features/istio/tutorials/_category_.json index bbac434cd..bdfe77bf2 100644 --- a/docs/features/Kafka/Examples/_category_.json +++ b/docs/features/istio/tutorials/_category_.json @@ -1,5 +1,5 @@ { - "label": "Examples", + "label": "Tutorials", "position": 2, "collapsed": false } diff --git a/docs/features/Istio/Examples/k8s-istio-authorization-policies.mdx b/docs/features/istio/tutorials/k8s-istio-authorization-policies.mdx similarity index 100% rename from docs/features/Istio/Examples/k8s-istio-authorization-policies.mdx rename to docs/features/istio/tutorials/k8s-istio-authorization-policies.mdx diff --git a/docs/features/Istio/Examples/k8s-istio-watcher.mdx b/docs/features/istio/tutorials/k8s-istio-watcher.mdx similarity index 100% rename from docs/features/Istio/Examples/k8s-istio-watcher.mdx rename to docs/features/istio/tutorials/k8s-istio-watcher.mdx diff --git a/docs/features/Kafka/Reference.mdx b/docs/features/kafka/Reference.mdx similarity index 100% rename from docs/features/Kafka/Reference.mdx rename to docs/features/kafka/Reference.mdx diff --git a/docs/features/Kafka/_category_.json b/docs/features/kafka/_category_.json similarity index 100% rename from docs/features/Kafka/_category_.json rename to docs/features/kafka/_category_.json diff --git a/docs/features/Kafka/index.mdx b/docs/features/kafka/index.mdx similarity index 88% rename from docs/features/Kafka/index.mdx rename to docs/features/kafka/index.mdx index 233c9b134..46a1caf45 100644 --- a/docs/features/Kafka/index.mdx +++ b/docs/features/kafka/index.mdx @@ -1,6 +1,6 @@ --- sidebar_position: 1 -title: Kafka +title: Kafka | Overview hide_table_of_contents: true hide_title: true --- @@ -11,17 +11,17 @@ export const kafka_tutorials = [ { title: 'Kafka topic-level access mapping', description: 'View Kafka network connections', - url: '/features/Kafka/Examples/k8s-kafka-mapping' + url: '/features/Kafka/tutorials/k8s-kafka-mapping' }, { title: 'Kafka access automation using Otterize Cloud mTLS', description: 'Manage access to Kafka topics with Otterize Cloud mTLS', - url: '/features/Kafka/Examples/k8s-kafka-mtls' + url: '/features/Kafka/tutorials/k8s-kafka-mtls' }, { title: 'Kafka access automation using cert-manager mTLS', description: 'Manage access to Kafka topics with a cert-manager', - url: '/features/Kafka/Examples/k8s-kafka-mtls-cert-manager' + url: '/features/Kafka/tutorials/k8s-kafka-mtls-cert-manager' } ]; @@ -63,7 +63,7 @@ spec: ``` -3. Once that is complete, the Kafka broker and it's clients require mTLS credentials, which they can receive from Otterize or through a [cert-manager](/features/Kafka/Examples/k8s-kafka-mtls-cert-manager). This requires a annotation to inform Otterize to generate the credentials and volume mount to store them. To orchestrate this, see the example deployment below: +3. Once that is complete, the Kafka broker and it's clients require mTLS credentials, which they can receive from Otterize or through a [cert-manager](/features/Kafka/tutorials/k8s-kafka-mtls-cert-manager). This requires a annotation to inform Otterize to generate the credentials and volume mount to store them. To orchestrate this, see the example deployment below: ```yaml spec: diff --git a/docs/features/aws-iam/Examples/_category_.json b/docs/features/kafka/tutorials/_category_.json similarity index 63% rename from docs/features/aws-iam/Examples/_category_.json rename to docs/features/kafka/tutorials/_category_.json index bbac434cd..bdfe77bf2 100644 --- a/docs/features/aws-iam/Examples/_category_.json +++ b/docs/features/kafka/tutorials/_category_.json @@ -1,5 +1,5 @@ { - "label": "Examples", + "label": "Tutorials", "position": 2, "collapsed": false } diff --git a/docs/features/Kafka/Examples/k8s-kafka-mapping.mdx b/docs/features/kafka/tutorials/k8s-kafka-mapping.mdx similarity index 100% rename from docs/features/Kafka/Examples/k8s-kafka-mapping.mdx rename to docs/features/kafka/tutorials/k8s-kafka-mapping.mdx diff --git a/docs/features/Kafka/Examples/k8s-kafka-mtls-cert-manager.mdx b/docs/features/kafka/tutorials/k8s-kafka-mtls-cert-manager.mdx similarity index 100% rename from docs/features/Kafka/Examples/k8s-kafka-mtls-cert-manager.mdx rename to docs/features/kafka/tutorials/k8s-kafka-mtls-cert-manager.mdx diff --git a/docs/features/Kafka/Examples/k8s-kafka-mtls.mdx b/docs/features/kafka/tutorials/k8s-kafka-mtls.mdx similarity index 100% rename from docs/features/Kafka/Examples/k8s-kafka-mtls.mdx rename to docs/features/kafka/tutorials/k8s-kafka-mtls.mdx diff --git a/docs/features/Networking/Reference/Network-Policies-Deep-Dive.mdx b/docs/features/networking/Reference/Network-Policies-Deep-Dive.mdx similarity index 100% rename from docs/features/Networking/Reference/Network-Policies-Deep-Dive.mdx rename to docs/features/networking/Reference/Network-Policies-Deep-Dive.mdx diff --git a/docs/features/Networking/Reference/README.mdx b/docs/features/networking/Reference/README.mdx similarity index 100% rename from docs/features/Networking/Reference/README.mdx rename to docs/features/networking/Reference/README.mdx diff --git a/docs/features/Networking/_category_.json b/docs/features/networking/_category_.json similarity index 100% rename from docs/features/Networking/_category_.json rename to docs/features/networking/_category_.json diff --git a/docs/features/Networking/index.mdx b/docs/features/networking/index.mdx similarity index 84% rename from docs/features/Networking/index.mdx rename to docs/features/networking/index.mdx index 7dcc80a9b..21522b9b9 100644 --- a/docs/features/Networking/index.mdx +++ b/docs/features/networking/index.mdx @@ -1,25 +1,30 @@ --- sidebar_position: 1 -title: Networking +title: Networking | Overview hide_title: true --- import DocsLinkCard from "@site/src/components/LinkCard"; export const network_access_tutorials = [ { + title: 'Visualizing a Kubernetes Network', + description: 'Map network traffic in a cluster and view the connections', + url: '/features/Networking/tutorials/k8s-network-mapper' + }, +{ title: 'Create and manage network policies', description: 'Create Kubernetes network policies using IBAC', - url: '/features/Networking/Examples/k8s-network-policies' + url: '/features/Networking/tutorials/k8s-network-policies' }, { title: 'Protecting a service with network policies', description: 'An example on how to secure a single service', - url: '/features/Networking/Examples/protect-1-service-network-policies' + url: '/features/Networking/tutorials/protect-1-service-network-policies' }, { title: 'AWS EKS network policies with the VPC CNI', description: 'Leverage AWS VPC CNI to apply network policies in EKS', - url: '/features/Networking/Examples/aws-eks-cni-mini' + url: '/features/Networking/tutorials/aws-eks-cni-mini' } ]; @@ -32,7 +37,7 @@ You can use Otterize to understand, visualize, and manage access for Kubernetes After installation, Otterize collects network traffic data in memory, creating a graph of relationships between pod-to-pod and pod-to-public internet traffic. Once the graph is in place, the data can be exported or viewed in various ways. Otterize Cloud users can see and interact with the graph structures within the Otterize application. OSS users can use the CLI tool to export the data into JSON, list the relationship, or generate IBAC policies reflecting the existing traffic. -To learn more about Visualizing, check out [Visualizing a Kubernetes Network](/features/Networking/Examples/k8s-network-mapper) +To learn more about Visualizing, check out [Visualizing a Kubernetes Network](/features/Networking/tutorials/k8s-network-mapper) ### Access Control diff --git a/docs/features/Networking/Examples/_category_.json b/docs/features/networking/tutorials/_category_.json similarity index 63% rename from docs/features/Networking/Examples/_category_.json rename to docs/features/networking/tutorials/_category_.json index bbac434cd..bdfe77bf2 100644 --- a/docs/features/Networking/Examples/_category_.json +++ b/docs/features/networking/tutorials/_category_.json @@ -1,5 +1,5 @@ { - "label": "Examples", + "label": "Tutorials", "position": 2, "collapsed": false } diff --git a/docs/features/Networking/Examples/aws-eks-cni-mini.mdx b/docs/features/networking/tutorials/aws-eks-cni-mini.mdx similarity index 100% rename from docs/features/Networking/Examples/aws-eks-cni-mini.mdx rename to docs/features/networking/tutorials/aws-eks-cni-mini.mdx diff --git a/docs/features/Networking/Examples/k8s-network-mapper.mdx b/docs/features/networking/tutorials/k8s-network-mapper.mdx similarity index 100% rename from docs/features/Networking/Examples/k8s-network-mapper.mdx rename to docs/features/networking/tutorials/k8s-network-mapper.mdx diff --git a/docs/features/Networking/Examples/k8s-network-policies.mdx b/docs/features/networking/tutorials/k8s-network-policies.mdx similarity index 100% rename from docs/features/Networking/Examples/k8s-network-policies.mdx rename to docs/features/networking/tutorials/k8s-network-policies.mdx diff --git a/docs/features/Networking/Examples/protect-1-service-network-policies.mdx b/docs/features/networking/tutorials/protect-1-service-network-policies.mdx similarity index 100% rename from docs/features/Networking/Examples/protect-1-service-network-policies.mdx rename to docs/features/networking/tutorials/protect-1-service-network-policies.mdx diff --git a/docs/features/postgresql/Examples/_category_.json b/docs/features/postgresql/Examples/_category_.json deleted file mode 100644 index bbac434cd..000000000 --- a/docs/features/postgresql/Examples/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "Examples", - "position": 2, - "collapsed": false -} diff --git a/docs/features/postgresql/index.mdx b/docs/features/postgresql/index.mdx index fe872752f..76ff7b306 100644 --- a/docs/features/postgresql/index.mdx +++ b/docs/features/postgresql/index.mdx @@ -1,6 +1,6 @@ --- sidebar_position: 1 -title: PostgreSQL +title: PostgreSQL | Overview hide_title: true --- diff --git a/docs/features/postgresql/tutorials/_category_.json b/docs/features/postgresql/tutorials/_category_.json new file mode 100644 index 000000000..bdfe77bf2 --- /dev/null +++ b/docs/features/postgresql/tutorials/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Tutorials", + "position": 2, + "collapsed": false +} diff --git a/docs/features/postgresql/Examples/postgres.mdx b/docs/features/postgresql/tutorials/postgres.mdx similarity index 100% rename from docs/features/postgresql/Examples/postgres.mdx rename to docs/features/postgresql/tutorials/postgres.mdx diff --git a/docs/getting-started/README.mdx b/docs/getting-started/README.mdx index 5436707d2..39db62b50 100644 --- a/docs/getting-started/README.mdx +++ b/docs/getting-started/README.mdx @@ -9,6 +9,7 @@ export const introduction = [ { title: 'What is Otterize', description: 'Learn how Otterize helps visualize and manages your authorization', + url: `/overview/intro` }, { title: 'Intent-Based Access Control', @@ -49,22 +50,22 @@ export const tutorials_access = [ { title: 'Create and manage network policies', description: 'Create Kubernetes network policies using IBAC', - url: '/features/Networking/Examples/k8s-network-policies' + url: '/features/networking/tutorials/k8s-network-policies' }, { title: 'Network policies on AWS EKS', description: 'Jump start network policies using AWS EKS and VPC CNI', - url: '/features/Networking/Examples/aws-eks-cni-mini' + url: '/features/networking/tutorials/aws-eks-cni-mini' }, { title: 'Create and manage Istio authorization policies', description: 'Using Istio and IBAC to secure your K8s cluster', - url: '/features/Istio/Examples/k8s-istio-authorization-policies' + url: '/features/istio/tutorials/k8s-istio-authorization-policies' }, { title: 'Configure secure access for Kafka using Otterize Cloud mTLS', description: 'Declaring and applying intents to easily secure access to Kafka', - url: '/features/Kafka/Examples/k8s-kafka-mtls-cert-manager' + url: '/features/kafka/tutorials/k8s-kafka-mtls-cert-manager' } ]; @@ -72,23 +73,23 @@ export const tutorials_visualization = [ { title: 'Network mapping a Kubernetes cluster', description: 'Map pod-to-pod traffic within your K8s cluster', - url: '/features/Networking/Examples/k8s-network-mapper' + url: '/features/networking/tutorials/k8s-network-mapper' }, { title: 'Istio HTTP-level access mapping', description: 'The network mapper allows you to map pod-to-pod Istio traffic', - url: '/features/Istio/Examples/k8s-istio-watcher' + url: '/features/istio/tutorials/k8s-istio-watcher' }, { title: 'Kafka topic-level access mapping', description: 'View topic-level access to Kafka servers within your Kubernetes cluster', - url: 'features/Kafka/Examples/k8s-kafka-mapping' + url: 'features/kafka/tutorials/k8s-kafka-mapping' } ]; export const editions = [ { - title: 'Community Edition', + title: 'Open Source', description: 'Our open source edition focuses on a single Kubernetes cluster. ', url: '/overview/otterize-oss' }, diff --git a/docs/overview/README.mdx b/docs/overview/README.mdx deleted file mode 100644 index 7e4dcc2d8..000000000 --- a/docs/overview/README.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -sidebar_position: 1 -title: Overview ---- \ No newline at end of file diff --git a/docs/overview/index.mdx b/docs/overview/index.mdx new file mode 100644 index 000000000..00f5204dc --- /dev/null +++ b/docs/overview/index.mdx @@ -0,0 +1,31 @@ +--- +sidebar_position: 1 +title: Intro +hide_title: true +--- + +# Overview + +Otterize is a declarative and zero-trust approach to access management that empowers you to streamline workload IAM while ensuring maximum security. + +## How does Otterize work? + +Otterize integrates into your Kubernetes clusters using a Helm chart that deploys some core [open-source components](https://github.com/otterize/), including the network mapper, intents-operator, and credential-operator. These components work in tandem to identify and secure access. Learn more about these components below. + +### Network mapper + +The network mapper is a zero-config open-source tool that provides insights into your network traffic without modifying your code or adding additional layers. Once Otterize is installed, the network monitor will automatically inspect pod traffic, including tariff from pod-to-pod, pod-to-public internet egress, Istio Envoy sidecar, pod-to-Kafka topics, and more to follow. This data is then collected in an in-memory database for various uses, including exporting and viewing. + +For more information, visit the [network mapper repository](https://github.com/otterize/network-mapper#about) + +### Credential operator + +Once Otterize is installed into a cluster, it [resolves a service name](https://github.com/otterize/credentials-operator#service-name-resolution-and-automatic-pod-labeling) for each pod and registers it with either Otterize Cloud or a SPIRE server. Once registered, pods can use the credential operator to generate various secrets/credentials for mTLS or credential-based access to services like PostgreSQL, Kafka, or other connections. + +For more information, visit the [credential operator repository](https://github.com/otterize/credentials-operator#about) + +### Intents operator + +The Otterize intents operator is a tool to network and service access policy creation straightforward. The intents operator uses a declarative policy syntax called Intent-Based Access Control (IBAC) to connect services. IBAC policies allow you to specify a caller and the type of access they should be provided. The intents operator then generates and applies the appropriate service-specific policy (IAM, ACL, NetworkPolicy, etc) to enable that defined access. + +For more information, visit the [intents operator repository](https://github.com/otterize/intents-operator#about) diff --git a/docs/overview/installation/README.mdx b/docs/overview/installation/README.mdx index 503ea7a3b..8c41a55dc 100644 --- a/docs/overview/installation/README.mdx +++ b/docs/overview/installation/README.mdx @@ -1,5 +1,5 @@ --- -sidebar_position: 1 +sidebar_position: 2 title: Installation --- import Tabs from '@theme/Tabs'; diff --git a/docs/reference/configuration/intents-operator/README.mdx b/docs/reference/configuration/intents-operator/README.mdx index 61e64358a..69279eac3 100644 --- a/docs/reference/configuration/intents-operator/README.mdx +++ b/docs/reference/configuration/intents-operator/README.mdx @@ -78,7 +78,7 @@ it is attempting to read, so the end result is that the topic ACLs determine act ### PostgreSQL users & access The intents operator automatically creates, and updates credentials in PostgreSQL databases according to the declared intents. It works together with the Otterize credentials operator to easily enable secure access to PostgreSQL from client pods, all in your Kubernetes cluster. -Try the [Just-in-time PostgreSQL users & access](/features/postgresql/Examples/postgresql) tutorial to learn more. +Try the [Just-in-time PostgreSQL users & access](/features/postgresql/tutorials/postgresql) tutorial to learn more. ### Istio AuthorizationPolicy The intents operator automatically creates, updates and deletes Istio authorization policies, automatically looks up service accounts for client pods and labels server pods, to reflect precisely the client-to-server calls declared in client intents files. diff --git a/docusaurus.config.js b/docusaurus.config.js index b99c0badf..700a12307 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -150,7 +150,7 @@ const config = { }, { from: ['/reference/access-controls/network-policies'], - to: '/features/Networking/Reference/Network-Policies-Deep-Dive' + to: '/features/networking/Reference/Network-Policies-Deep-Dive' }, { from: ['/shadow-vs-active-enforcement'], @@ -184,39 +184,39 @@ const config = { }, { from: ['/guides/protect-1-service-network-policies'], - to: '/features/Networking/Examples/protect-1-service-network-policies' + to: '/features/networking/tutorials/protect-1-service-network-policies' }, { from: ['/quick-tutorials/k8s-kafka-mtls', '/quickstart/access-control/k8s-kafka-mtls'], - to: '/features/Kafka/Examples/k8s-kafka-mtls', + to: '/features/kafka/tutorials/k8s-kafka-mtls', }, { from: ['/quick-tutorials/aws-eks-cni-mini','/quickstart/access-control/aws-eks-cni-mini'], - to: '/features/Networking/Examples/aws-eks-cni-mini', + to: '/features/networking/tutorials/aws-eks-cni-mini', }, { from: ['/quick-tutorials/k8s-kafka-mtls-cert-manager', '/quickstart/access-control/k8s-kafka-mtls-cert-manager'], - to: '/features/Kafka/Examples/k8s-kafka-mtls-cert-manager', + to: '/features/kafka/tutorials/k8s-kafka-mtls-cert-manager', }, { from: ['/quick-tutorials/k8s-istio-watcher', '/quickstart/visualization/k8s-istio-watcher'], - to: '/features/Istio/Examples/k8s-istio-watcher', + to: '/features/istio/tutorials/k8s-istio-watcher', }, { from: ['/quick-visual-tutorials/visual-ibac-istio-authorization-policies','/quickstart/access-control/k8s-istio-authorization-policies', '/quickstart/k8s-istio-authorization-policies'], - to: '/features/Istio/Examples/k8s-istio-authorization-policies', + to: '/features/istio/tutorials/k8s-istio-authorization-policies', }, { from: ['/quick-visual-tutorials/visual-ibac-kafka-k8s'], - to: '/features/Kafka/Examples/k8s-kafka-mapping', + to: '/features/kafka/tutorials/k8s-kafka-mapping', }, { from: ['/quick-visual-tutorials/visual-ibac-network-policies', '/quick-tutorials/k8s-network-policies', '/quickstart/access-control/k8s-network-policies'], - to: '/features/Networking/Examples/k8s-network-policies', + to: '/features/networking/tutorials/k8s-network-policies', }, { from: ['/quick-visual-tutorials/visual-k8s-cluster-mapping', '/quickstart/visualization/k8s-network-mapper', '/quick-tutorials/k8s-network-mapper'], - to: '/features/Networking/Examples/k8s-network-mapper', + to: '/features/networking/tutorials/k8s-network-mapper', }, // Redirect from multiple old paths to the new path // { From ed435f9d00d9b961e741ec030e0b8df3a2e6391e Mon Sep 17 00:00:00 2001 From: bglynn Date: Tue, 30 Jan 2024 13:34:45 -0800 Subject: [PATCH 07/20] * Added a smaller more value-add IBAC page. * Updates to tutorials * Removed Otterize Cloud / Object model and added items to the terminology instead * Removed logos with names --- docs/features/README.mdx | 2 +- docs/features/aws-iam/index.mdx | 4 +- .../aws-iam/{Reference.mdx => reference.mdx} | 6 +- .../aws-iam/tutorials/aws-iam-eks.mdx | 6 +- docs/features/istio/_category_.json | 2 +- .../istio/{Reference.mdx => reference.mdx} | 6 +- .../k8s-istio-authorization-policies.mdx | 49 ++---- .../istio/tutorials/k8s-istio-watcher.mdx | 71 ++------ docs/features/kafka/_category_.json | 2 +- .../kafka/{Reference.mdx => reference.mdx} | 26 ++- .../kafka/tutorials/k8s-kafka-mapping.mdx | 62 +------ .../tutorials/k8s-kafka-mtls-cert-manager.mdx | 77 +++----- .../kafka/tutorials/k8s-kafka-mtls.mdx | 50 ++---- docs/features/networking/index.mdx | 4 +- .../Network-Policies-Deep-Dive.mdx | 0 .../{Reference => reference}/README.mdx | 19 +- .../networking/tutorials/aws-eks-cni-mini.mdx | 45 +---- .../tutorials/k8s-network-mapper.mdx | 75 ++------ .../tutorials/k8s-network-policies.mdx | 47 +---- .../protect-1-service-network-policies.mdx | 165 ++++++++---------- docs/features/postgresql/_category_.json | 2 +- .../{Reference.mdx => reference.mdx} | 2 +- docs/getting-started/README.mdx | 12 +- docs/getting-started/_category_.json | 2 +- docs/overview/intent-based-access-control.mdx | 95 +++------- docs/overview/otterize-cloud/object-model.mdx | 44 ----- docs/overview/otterize-oss/README.mdx | 14 -- docs/reference/terminology/README.mdx | 12 ++ docusaurus.config.js | 4 +- src/components/LinkCard/index.js | 2 +- static/img/icons/Postgresql-no-word-mark.svg | 22 +++ static/img/icons/istio-no-word-mark.svg | 1 + static/img/icons/kafka-no-word-mark.svg | 16 ++ 33 files changed, 308 insertions(+), 638 deletions(-) rename docs/features/aws-iam/{Reference.mdx => reference.mdx} (94%) rename docs/features/istio/{Reference.mdx => reference.mdx} (89%) rename docs/features/kafka/{Reference.mdx => reference.mdx} (74%) rename docs/features/networking/{Reference => reference}/Network-Policies-Deep-Dive.mdx (100%) rename docs/features/networking/{Reference => reference}/README.mdx (93%) rename docs/features/postgresql/{Reference.mdx => reference.mdx} (95%) delete mode 100644 docs/overview/otterize-cloud/object-model.mdx create mode 100644 static/img/icons/Postgresql-no-word-mark.svg create mode 100644 static/img/icons/istio-no-word-mark.svg create mode 100644 static/img/icons/kafka-no-word-mark.svg diff --git a/docs/features/README.mdx b/docs/features/README.mdx index 28c41d948..e017bc711 100644 --- a/docs/features/README.mdx +++ b/docs/features/README.mdx @@ -17,7 +17,7 @@ export default function FeatureCards() { console.log(JSON.stringify(features)); return (
-

Features

+

Features

Otterize makes it easy to create and visualize authorization for your Kubernetes clusters across a variety of diff --git a/docs/features/aws-iam/index.mdx b/docs/features/aws-iam/index.mdx index aa44f0a4c..7d4bd288f 100644 --- a/docs/features/aws-iam/index.mdx +++ b/docs/features/aws-iam/index.mdx @@ -20,7 +20,7 @@ To follow along with a full example, take a look at [Automate AWS IAM for EKS](/ 1. First, the EKS cluster must have [Otterize installed](/overview/installation). 2. We must label the pod with `credentials-operator.otterize.com/create-aws-role: "true"` 3. Once that is complete, Otterize’s credential operator will create a role and an `AssumeRolePolicy` bound to ServiceAccount. -4. At this point, the role does not have the ability to perform any actions. We will need to create a ClientIntents YAML for the access the service requires and apply it to our cluster. Below is an example of a ClientIntents file for accessing an S3 bucket. View the [reference](/features/aws-iam/Reference) to learn more about the AWS IAM Client Intent syntax. +4. At this point, the role does not have the ability to perform any actions. We will need to create a ClientIntents YAML for the access the service requires and apply it to our cluster. Below is an example of a ClientIntents file for accessing an S3 bucket. View the [reference](/features/aws-iam/reference) to learn more about the AWS IAM Client Intent syntax. 5. Once the intent is applied, a new policy will be attached to the service’s role with the appropriate access. ```yaml @@ -39,7 +39,7 @@ spec: - "s3:GetObject" ``` -### Coming Soon +### Coming soon Building least-privilege access can be difficult. Many actions have dependent actions, or services can require a lot of access to perform their functions. To help reduce this burden, Otterize will provide automated ClientIntents based on the actions your service actually requires by detecting the calls being made and converting them into the necessary YAML syntax. diff --git a/docs/features/aws-iam/Reference.mdx b/docs/features/aws-iam/reference.mdx similarity index 94% rename from docs/features/aws-iam/Reference.mdx rename to docs/features/aws-iam/reference.mdx index 6ad10583d..04ead9d00 100644 --- a/docs/features/aws-iam/Reference.mdx +++ b/docs/features/aws-iam/reference.mdx @@ -3,7 +3,7 @@ sidebar_position: 3 title: Reference --- -### ClientIntents Example (YAML) +### ClientIntents example (YAML) ```yaml apiVersion: k8s.otterize.com/v1alpha3 @@ -36,10 +36,12 @@ spec: | `credentials-operator.otterize.com/create-aws-role` | By setting to **true** the credential operator will create an unique AWS Role for the associated pod | `false` | -### Helm Chart Options +### Helm Chart options | Key | Description | Default | |------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------| | `global.aws.enabled` | Enable or disable AWS integration | `false` | | `global.aws.eksClusterNameOverride` | EKS cluster name (overrides auto-detection) | `(none)` | | `aws.roleARN` | ARN of the AWS role the operator will use to access AWS. By defeault, Otterize will create a unique role for each service an annotate the service with the role's ARN. | `(none)` | + +View the [helm chart reference](/reference/configuration/otterize-chart) for all other options \ No newline at end of file diff --git a/docs/features/aws-iam/tutorials/aws-iam-eks.mdx b/docs/features/aws-iam/tutorials/aws-iam-eks.mdx index 94b8fd774..3c7565501 100644 --- a/docs/features/aws-iam/tutorials/aws-iam-eks.mdx +++ b/docs/features/aws-iam/tutorials/aws-iam-eks.mdx @@ -21,7 +21,7 @@ In this tutorial, we will: ## Prerequisites Already have Otterize deployed with the IAM integration configured on your cluster? [Skip to the tutorial.](#tutorial) -#### 1. Create an AWS EKS cluster +### 1. Create an AWS EKS cluster Before you start, you'll need an AWS EKS cluster. Any cluster will do; there are no special requirements or setup.

@@ -86,7 +86,7 @@ Don't forget to configure your kubeconfig for your cluster. If using the example aws eks update-kubeconfig --region us-west-2 --name otterize-iam-eks-tutorial ``` -#### 2. Deploy Otterize for AWS IAM +### 2. Deploy Otterize for AWS IAM To deploy Otterize, head over to [Otterize Cloud](https://app.otterize.com) and: 1. Create a Kubernetes cluster on the [Clusters page](https://app.otterize.com/clusters), and follow the instructions. *Make sure to enable enforcement mode for this tutorial.* If you already have a Kubernetes cluster connected, skip this step. @@ -324,7 +324,7 @@ aws s3 ls $BUCKET_NAME 2023-11-17 20:42:55 19 testfile.3.txt ``` -## What's next? +### What's next? Try out some of the other quick tutorials to learn about how to use ClientIntents to manage network policies, Istio policies, PostgreSQL access, and more. You can use a single ClientIntents resource to specify all the access required for a pod. diff --git a/docs/features/istio/_category_.json b/docs/features/istio/_category_.json index 1768d992d..5807d8821 100644 --- a/docs/features/istio/_category_.json +++ b/docs/features/istio/_category_.json @@ -3,6 +3,6 @@ "position": 4, "collapsed": true, "customProps": { - "image": "/img/icons/istio.png" + "image": "/img/icons/istio-no-word-mark.svg" } } diff --git a/docs/features/istio/Reference.mdx b/docs/features/istio/reference.mdx similarity index 89% rename from docs/features/istio/Reference.mdx rename to docs/features/istio/reference.mdx index 4adb25e10..69131cd88 100644 --- a/docs/features/istio/Reference.mdx +++ b/docs/features/istio/reference.mdx @@ -3,7 +3,7 @@ sidebar_position: 3 title: Reference --- -### Client Intents (YAML) +### ClientIntents example (YAML) ```yaml apiVersion: k8s.otterize.com/v1alpha3 @@ -23,7 +23,7 @@ spec: ``` -### Helm Chart Options +### Helm Chart options | Key | Description | Default | |---------------------------------|-----------------------------------------|--------------------------------| @@ -34,3 +34,5 @@ spec: | `istiowatcher.pullPolicy` | Istio watcher pull policy. | `(none)` | | `istiowatcher.pullSecrets` | Istio watcher pull secrets. | `(none)` | | `istiowatcher.resources` | Resources override. | `(none)` | + +View the [helm chart reference](/reference/configuration/otterize-chart) for all other options \ No newline at end of file diff --git a/docs/features/istio/tutorials/k8s-istio-authorization-policies.mdx b/docs/features/istio/tutorials/k8s-istio-authorization-policies.mdx index 4f26a65ef..a265c6520 100644 --- a/docs/features/istio/tutorials/k8s-istio-authorization-policies.mdx +++ b/docs/features/istio/tutorials/k8s-istio-authorization-policies.mdx @@ -24,44 +24,13 @@ In this tutorial, we will: ## Prerequisites -
-Prepare a Kubernetes cluster - -Before you start, you'll need a Kubernetes cluster. Having a cluster with a [CNI](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/) that supports [NetworkPolicies](https://kubernetes.io/docs/concepts/services-networking/network-policies/) isn't required for this tutorial, but is recommended so that your cluster works with other tutorials. - -{@include: ../../../_common/cluster-setup.md} - -
- -You can now install (or reinstall) Otterize in your cluster, and optionally connect to Otterize Cloud. Connecting to Cloud lets you: +Already have Otterize deployed with Istio configured on your cluster? Skip to the [tutorial](#tutorial). -1. See what's happening visually in your browser, through the "access graph"; +### 1. Deploy Otterize +To deploy Otterize, head over to [Otterize Cloud](https://app.otterize.com) and create a Kubernetes cluster on the [Clusters page](https://app.otterize.com/clusters), and follow the instructions. If you already have a Kubernetes cluster connected, skip this step. -So either forego browser visualization and: - -
-Install Otterize in your cluster, without Otterize Cloud - -{@include: ../../../_common/install-otterize-istio-enabled.md} - -
-Or choose to include browser visualization and: - -
-Install Otterize in your cluster, with Otterize Cloud - -#### Create an Otterize Cloud account - -{@include: ../../../_common/create-account.md} - -#### Install Otterize OSS, connected to Otterize Cloud - -{@include: ../../../_common/install-otterize-from-cloud-with-istio-enforcement.md} - -
- -## Install and configure Istio +### 2. Install and configure Istio
Install Istio in the cluster via Helm @@ -91,7 +60,9 @@ e.g. in the access graph, but we can also use that information to automatically enforce them with Istio authorization policies. ::: -## Deploy the two clients and the server +## Tutorial + +### Deploy the two clients and the server Deploy a simple example consisting of `client` and `other-client` calling `nginx` over HTTP: @@ -99,7 +70,7 @@ Deploy a simple example consisting of `client` and `other-client` calling `nginx kubectl apply -n otterize-tutorial-istio -f ${ABSOLUTE_URL}/code-examples/istio-authorization-policies/all.yaml ``` -## Apply intents +### Apply intents We will now declare that the **client** intends to call the **server** at a particular HTTP path using a specific HTTP method. @@ -250,7 +221,7 @@ It's now clear what happened: Otterize did its job of both protecting the server _and_ allowing intended access. ::: -## What did we accomplish? +### What did we accomplish? - Controlling access through Istio authorization policies no longer means touching authorization policies at all. @@ -284,7 +255,7 @@ all the appropriate configuration was managed automatically behind the scenes. Try to create an intents file yourself for **client-other**, and apply it to allow this other client to call the server. ::: -## What's next +### What's next - Get started with the [Otterize network mapper for Istio](/quickstart/visualization/k8s-istio-watcher) to help you bootstrap intents files with HTTP resources for use in [intent-based access control (IBAC)](/intent-based-access-control). diff --git a/docs/features/istio/tutorials/k8s-istio-watcher.mdx b/docs/features/istio/tutorials/k8s-istio-watcher.mdx index 422daa522..d72e8495e 100644 --- a/docs/features/istio/tutorials/k8s-istio-watcher.mdx +++ b/docs/features/istio/tutorials/k8s-istio-watcher.mdx @@ -18,68 +18,19 @@ In this tutorial, we will: ## Prerequisites -
-Prepare a Kubernetes cluster - -Before you start, you'll need a Kubernetes cluster. Having a cluster with a [CNI](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/) that supports [NetworkPolicies](https://kubernetes.io/docs/concepts/services-networking/network-policies/) isn't required for this tutorial, but is recommended so that your cluster works with other tutorials. - -{@include: ../../../_common/cluster-setup.md} - -
+Already have Otterize deployed with Istio configured on your cluster? Skip to the [tutorial](#tutorial). -You can now install Otterize in your cluster, and optionally connect to Otterize Cloud. Connecting to Cloud lets you: +### 1. Deploy Otterize +To deploy Otterize, head over to [Otterize Cloud](https://app.otterize.com) and create a Kubernetes cluster on the [Clusters page](https://app.otterize.com/clusters), and follow the instructions. If you already have a Kubernetes cluster connected, skip this step. -1. See what's happening visually in your browser, through the "access graph"; -So either forego browser visualization and: - -
-Install the Otterize network mapper in your cluster with the Istio watcher component enabled, and without Otterize Cloud - -{@include: ../../../_common/install-otterize-istio-watcher.md} - -
- -Or choose to include browser visualization and: - -
-Install Otterize in your cluster, with Otterize Cloud - -#### Create an Otterize Cloud account - -{@include: ../../../_common/create-account.md} - -#### Install Otterize OSS, connected to Otterize Cloud - -{@include: ../../../_common/install-otterize-from-cloud-with-enforcement-with-istiowatcher.md} - -
- -Finally, you'll need to install the Otterize CLI (if you haven't already) to interact with the network mapper: - -
-Install the Otterize CLI - -{@include: ../../../_common/install-otterize-cli.md} - -
- -## Install and configure Istio +### 2. Install and configure Istio
Install Istio in the cluster via Helm {@include: ../../../_common/install-istio.md} -
-
-Create a namespace for our demo application and label it for Istio injection - -```shell -kubectl create namespace otterize-tutorial-istio-mapping -kubectl label namespace otterize-tutorial-istio-mapping istio-injection=enabled -``` -
Add HTTP methods and request paths to Istio exported metrics @@ -103,16 +54,20 @@ e.g. in the access graph, but we can also use that information to automatically enforce them with Istio authorization policies. ::: -## Deploy demo to simulate traffic +## Tutorial + +### Deploy demo to simulate traffic -Let's add services and traffic to the cluster and see how the network mapper builds the map. +Let's create a namespace with istio enabled, and add services and traffic to the cluster and see how the network mapper builds the map. Deploy the following simple example — `client`, `client2` and `nginx`, communicating over HTTP: ```shell +kubectl create namespace otterize-tutorial-istio-mapping +kubectl label namespace otterize-tutorial-istio-mapping istio-injection=enabled kubectl apply -n otterize-tutorial-istio-mapping -f ${ABSOLUTE_URL}/code-examples/network-mapper/istio.yaml ``` -## Map the cluster +### Map the cluster The Istio watcher component of the network mapper starts querying Envoy sidecars for HTTP connections and builds an in-memory network map as soon as it's installed. The Otterize CLI allows you to interact with the network mapper to @@ -144,7 +99,7 @@ The access graph reveals several types of information and insights, such as: 3. Filtering the map to include recently-seen traffic, since some date in the past. That way you can eliminate calls that are no longer relevant, without having to reset the network mapper and start building a new map. 4. Showing more specifics about access, if the intents operator is also connected: understand which services are protected or would be protected, and which client calls are being blocked or would be blocked. We'll see more of that in the Istio AuthorizationPolicy tutorial. -## What's next +### What's next The network mapper is a great way to bootstrap IBAC. It generates client intents files that reflect the current topology of your services; those can then be used by each client team to grant them easy @@ -157,7 +112,7 @@ Where to go next? - If you haven't already, see the [automate network policies tutorial](/quickstart/access-control/k8s-network-policies). - Or go to the next tutorial to [automate secure access for Kafka](/quickstart/access-control/k8s-kafka-mtls). -### Teardown +## Teardown To remove Istio and the deployed examples run: diff --git a/docs/features/kafka/_category_.json b/docs/features/kafka/_category_.json index 671f785b5..f48b40857 100644 --- a/docs/features/kafka/_category_.json +++ b/docs/features/kafka/_category_.json @@ -3,7 +3,7 @@ "position": 3, "collapsed": true, "customProps": { - "image": "/img/icons/kafka.png", + "image": "/img/icons/kafka-no-word-mark.svg", "cloud-only": "true" } } diff --git a/docs/features/kafka/Reference.mdx b/docs/features/kafka/reference.mdx similarity index 74% rename from docs/features/kafka/Reference.mdx rename to docs/features/kafka/reference.mdx index 8bbbbdb09..42fce1a56 100644 --- a/docs/features/kafka/Reference.mdx +++ b/docs/features/kafka/reference.mdx @@ -3,7 +3,7 @@ sidebar_position: 3 title: Reference --- -### KafkaServerConfig (YAML) +### KafkaServerConfig example (YAML) ```yaml apiVersion: k8s.otterize.com/v1alpha3 @@ -13,11 +13,12 @@ metadata: namespace: kafka spec: service: - name: kafka #name of the Kafka service broker + # name of the Kafka service broker + name: kafka addr: kafka.kafka:9092 ``` -### ClientIntents (YAML) +### ClientIntents example (YAML) ```yaml apiVersion: k8s.otterize.com/v1alpha3 @@ -27,18 +28,23 @@ metadata: namespace: otterize-tutorial-kafka-mtls spec: service: - name: client # The service requiring access to a topic + # The service requiring access to a topic + name: client calls: - - name: kafka.kafka # name of the Kafka service broker + # name of the Kafka service broker + - name: kafka.kafka type: kafka kafkaTopics: - - name: mytopic # Topic name - operations: [ produce,describe,consume ] # ACL Operations like alter, delete, all, etc - - name: transactions # Multiple topics can be added + # Topic name + - name: mytopic + # ACL Operations including alter, delete, all, etc + operations: [ produce,describe,consume ] + # Multiple topics can be added + - name: transactions operations: [ produce,describe,consume ] ``` -### Helm Chart Options +### Helm Chart options | Key | Description | Default | |---------------------------------|-------------------------------------------------------------|--------------------------------| @@ -50,3 +56,5 @@ spec: | `kafkawatcher.pullSecrets` | Kafka watcher pull secrets. | `(none)` | | `kafkawatcher.resources` | Resources override. | `(none)` | | `kafkawatcher.kafkaServers` | Kafka servers to watch, specified as `pod.namespace` items. | `(none)` | + +View the [helm chart reference](/reference/configuration/otterize-chart) for all other options \ No newline at end of file diff --git a/docs/features/kafka/tutorials/k8s-kafka-mapping.mdx b/docs/features/kafka/tutorials/k8s-kafka-mapping.mdx index 56ad8433f..0276ff82e 100644 --- a/docs/features/kafka/tutorials/k8s-kafka-mapping.mdx +++ b/docs/features/kafka/tutorials/k8s-kafka-mapping.mdx @@ -19,58 +19,12 @@ We will **not** be doing any access control in this demo, just purely mapping cl ## Prerequisites -
-Prepare a Kubernetes cluster - -Before you start, you'll need a Kubernetes cluster. Having a cluster with a [CNI](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/) that supports [NetworkPolicies](https://kubernetes.io/docs/concepts/services-networking/network-policies/) isn't required for this tutorial, but is recommended so that your cluster works with other tutorials. - -{@include: ../../../_common/cluster-setup.md} - -
- -You can now install Otterize in your cluster, and optionally connect to Otterize Cloud. Connecting to Cloud lets you -see what's happening visually in your browser, through the "access graph". - -So either forego browser visualization and: - -
-Install Otterize in your cluster with the Kafka watcher component enabled, without Otterize Cloud - -``` -helm repo add otterize https://helm.otterize.com -helm repo update -helm install otterize otterize/network-mapper -n otterize-system --create-namespace \ ---set kafkawatcher.enable=true \ ---set kafkawatcher.kafkaServers={"kafka-0.kafka"} -``` - -
+Already have Otterize & a Kafka broker deployed on your cluster? Skip to the [tutorial](#tutorial). -Or choose to include browser visualization and: +### 1. Deploy Otterize +To deploy Otterize, head over to [Otterize Cloud](https://app.otterize.com) and create a Kubernetes cluster on the [Clusters page](https://app.otterize.com/clusters), and follow the instructions. If you already have a Kubernetes cluster connected, skip this step. -
-Install Otterize in your cluster, with Otterize Cloud - -#### Create an Otterize Cloud account - -{@include: ../../../_common/create-account.md} - -#### Install Otterize OSS, connected to Otterize Cloud - -{@include: ../../../_common/install-otterize-from-cloud-with-shadow-mode-and-kafka-watcher.md} - -
- -Finally, you'll need to install the Otterize CLI (if you haven't already) to interact with the network mapper: - -
-Install the Otterize CLI - -{@include: ../../../_common/install-otterize-cli.md} - -
- -## Install Kafka +### 2. Install Kafka We will deploy a Kafka broker using Bitnami's [Helm chart](https://github.com/bitnami/charts/tree/master/bitnami/kafka). In the chart we will configure Kafka to: @@ -96,7 +50,9 @@ helm install --create-namespace -n kafka \ -f ${ABSOLUTE_URL}/code-examples/kafka-mapping/helm/values.yaml kafka bitnami/kafka --version 21.4.4 ``` -## Deploy demo to simulate traffic +## Tutorial + +### Deploy demo to simulate traffic Let's add a few services that will access our Kafka server, and see how the network mapper builds the access map: @@ -142,7 +98,7 @@ Only the arrows between the clients and the Kafka are green, because we've selec Clicking on a specific arrow between a client and the broker reveals which topic and operations are being accessed. -## What did we accomplish? +### What did we accomplish? Enabling the Kafka watcher component of the network mapper shows which clients connect to running Kafka servers, the topics they access, and the operations they undertake on those topics. @@ -152,7 +108,7 @@ You can consume this information in various ways: - [Via the CLI](/reference/cli): from the network mapper directly or the cloud. - [Via the API](https://app.otterize.com/api/rest/v1beta). -## What's next +### What's next - Try our [secure access for Kafka](/quickstart/access-control/k8s-kafka-mtls) tutorial diff --git a/docs/features/kafka/tutorials/k8s-kafka-mtls-cert-manager.mdx b/docs/features/kafka/tutorials/k8s-kafka-mtls-cert-manager.mdx index 8bd74c7dd..1a4d1b13f 100644 --- a/docs/features/kafka/tutorials/k8s-kafka-mtls-cert-manager.mdx +++ b/docs/features/kafka/tutorials/k8s-kafka-mtls-cert-manager.mdx @@ -22,20 +22,9 @@ In this tutorial, we will: ## Prerequisites -### Prepare a Kubernetes cluster +### 1.Install cert-manager and configure a CA issuer -
-Expand for cluster setup instructions - -Before you start, you'll need a Kubernetes cluster. - -{@include: ../../../_common/cluster-setup.md} - -
- -### Install cert-manager and configure a CA issuer - -#### Install cert-manager +##### Install cert-manager Use the following command or [follow cert-manager's installation guide for different setups](https://cert-manager.io/docs/installation/): @@ -43,7 +32,7 @@ Use the following command or [follow cert-manager's installation guide for diffe kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.0/cert-manager.yaml ``` -#### Set up a CA (Certificate Authority) `ClusterIssuer` +##### Set up a CA (Certificate Authority) `ClusterIssuer` :::caution This tutorial uses the built-in and easy-to-setup `CA` Issuer type so that the tutorial is easy to run, but you should not use this issuer as-is in production. Instead, consider using one of the other issuers, such as a Venafi or Vault issuer. [Read more about CA issuers in the cert-manager documentation](https://cert-manager.io/docs/configuration/ca/). @@ -61,50 +50,26 @@ kubectl apply -f ${ABSOLUTE_URL}/code-examples/kafka-mtls-cert-manager/clusteris You may have to wait for `cert-manager` to start successfully before you are able to deploy the `ClusterIssuer`. -### Install Otterize - -You can now install Otterize in your cluster, and connect to Otterize Cloud. Connecting to Cloud lets you: - -1. See what's happening visually in your browser, through the "access graph"; -2. Generate certificates using the Otterize Cloud hosted service. If you prefer to generate certificates in-cluster, you can [follow the tutorial for cert-manager](/quickstart/access-control/k8s-kafka-mtls-cert-manager). - - - - - -{@include: ../../../_common/install-otterize-from-cloud-with-shadow-mode-and-kafka-watcher-and-cert-manager.md} - -#### Configure the access graph in Otterize Cloud to only show Kafka authorization status +### 2. Install Otterize -You want to make sure that under **Istio Policies** _Use in access graph_ is turned off and that under **Network Policies** _Use in access graph_ is also turned off. +Already have Otterize & a Kafka broker deployed on your cluster? Skip to the [tutorial](#tutorial). -Keep _Use in access graph_ **on** under **Kafka ACLs** so that the access graph only shows the authorization status for Kafka ACLs. +#### Deploy Otterize +To deploy Otterize, head over to [Otterize Cloud](https://app.otterize.com) and create a Kubernetes cluster on the [Clusters page](https://app.otterize.com/clusters), and follow the instructions. If you already have a Kubernetes cluster connected, skip this step. -![Make sure access graph is configured correctly](/img/quick-tutorials/k8s-kafka-mtls-cert-mgr//cloud-settings.png) - - - - -To install without connecting to Otterize Cloud and no access graph, run the following command: - -```shell -helm repo add otterize https://helm.otterize.com -helm repo update - -helm upgrade --install otterize otterize/otterize-kubernetes -n otterize-system --create-namespace \ ---set intentsOperator.operator.mode=defaultShadow \ ---set global.deployment.credentialsOperator=true \ ---set global.certificateProvider=cert-manager \ ---set credentialsOperator.certManager.issuerName=ca-issuer \ +##### Note: +* Under mTLS and Kafka support choose **cert-manager**. +* Copy the Helm command and add the following flags: +```bash --set intentsOperator.operator.enableNetworkPolicyCreation=false \ --set networkMapper.kafkawatcher.enable=true \ --set networkMapper.kafkawatcher.kafkaServers={"kafka-0.kafka"} ``` - - +Note that enforcement is disabled, we will enable it later. The configuration tab should look like this: + -## Install Kafka +### 3. Install Kafka We will deploy a Kafka broker using Bitnami's [Helm chart](https://github.com/bitnami/charts/tree/master/bitnami/kafka). In the chart we will configure Kafka to: @@ -135,7 +100,7 @@ helm install --create-namespace -n kafka \ You can watch for all pods to be `Ready` using `kubectl get pods -n kafka -w`. -## Configure Otterize to manage Kafka access +### 4. Configure Otterize to manage Kafka access In our simple example, we'll call the Kafka broker service simply "kafka". Let's tell Otterize how to connect to the Kafka broker by applying an Otterize `KafkaServerConfig`, naming it `kafka`. The name will be the name we later use to declare `ClientIntents`. @@ -148,7 +113,9 @@ kubectl apply -f ${ABSOLUTE_URL}/code-examples/kafka-mtls-cert-manager/kafkaserv {@include: ../../../../static/code-examples/kafka-mtls-cert-manager/kafkaserverconfig.yaml} ``` -## Deploy clients +## Tutorial + +### Deploy Clients Our simple example consists of two client pods: @@ -337,7 +304,7 @@ You can now browse to your account at [https://app.otterize.com](https://app.ott The access graph shows, through its green and orange lines linking the services, that no clients are currently blocked because we haven't enabled any sort of enforcement yet. The orange lines indicate that, since we have not declared any intents for these clients, they _would_ be blocked if we were to turn enforcement on. -## Apply intents +### Apply intents :::tip @@ -373,7 +340,7 @@ We can see what happened: 2. Calls from **[client-other]** are not declared (orange line). 3. Looking at the Kafka service, we can see that **[client]** has specific access configured (via Kafka ACLs) to perform `all` operations on the `mytopic` topic. -## Turn on protection +### Turn on protection At this point, we haven't actually protected our Kafka broker. From everything we've done so far, we can see, however, that if we were to turn on protection, the `client-other` would lose access to the broker. @@ -408,7 +375,7 @@ And if you look back at your access graph, you'll see that the Kafka broker is n ![Clients blocked](/img/quick-tutorials/k8s-kafka-mtls-cert-mgr//clients-blocked.png) -## What did we accomplish? +### What did we accomplish? - Controlling Kafka access no longer means touching ACLs, issuing and managing and distributing certs, establishing trust, etc. @@ -454,7 +421,7 @@ This was achieved by using the built-in Kafka ACL mechanism, which the intents o
-## What's next +### What's next - [Learn more about credentials-operator works with cert-manager](/reference/configuration/credentials-operator#cert-manager). - [Enable the credentials-operator `CertificateRequest` auto-approver](/reference/configuration/credentials-operator/helm-chart#cert-manager-parameters) for production deployments of cert-manager where the default auto-approver is disabled. diff --git a/docs/features/kafka/tutorials/k8s-kafka-mtls.mdx b/docs/features/kafka/tutorials/k8s-kafka-mtls.mdx index f06e2d51d..61e86ff89 100644 --- a/docs/features/kafka/tutorials/k8s-kafka-mtls.mdx +++ b/docs/features/kafka/tutorials/k8s-kafka-mtls.mdx @@ -21,36 +21,23 @@ In this tutorial, we will: ## Prerequisites -### Prepare a Kubernetes cluster +Already have Otterize & a Kafka broker deployed on your cluster? Skip to the [tutorial](#tutorial). -
-Expand for cluster setup instructions - -Before you start, you'll need a Kubernetes cluster. - -{@include: ../../../_common/cluster-setup.md} - -
- -### Install Otterize - -You can now install Otterize in your cluster, and connect to Otterize Cloud. Connecting to Cloud lets you: +### 1. Deploy Otterize +To deploy Otterize, head over to [Otterize Cloud](https://app.otterize.com) and create a Kubernetes cluster on the [Clusters page](https://app.otterize.com/clusters), and follow the instructions. If you already have a Kubernetes cluster connected, skip this step. -1. See what's happening visually in your browser, through the "access graph". -2. Generate certificates using the Otterize Cloud hosted service. If you prefer to generate certificates in-cluster, you can [follow the tutorial for cert-manager](/quickstart/access-control/k8s-kafka-mtls-cert-manager). - -#### Install Otterize OSS, connected to Otterize Cloud -{@include: ../../../_common/install-otterize-from-cloud-with-shadow-mode-and-kafka-watcher.md} - -#### Configure the access graph in Otterize Cloud to only show Kafka authorization status - -You want to make sure that under **Istio Policies** _Use in access graph_ is turned off and that under **Network Policies** _Use in access graph_ is also turned off. - -Keep _Use in access graph_ **on** under **Kafka ACLs** so that the access graph only shows the authorization status for Kafka ACLs. +##### Note: +* Under mTLS and Kafka support choose **Otterize Cloud**. +* Copy the Helm command and add the following flags: +```bash +--set intentsOperator.operator.enableNetworkPolicyCreation=false \ +--set networkMapper.kafkawatcher.enable=true \ +--set networkMapper.kafkawatcher.kafkaServers={"kafka-0.kafka"} +``` -![Make sure access graph is configured correctly](/img/quick-tutorials/k8s-kafka-mtls//cloud-settings.png) +Note that enforcement is disabled, we will enable it later. The configuration tab should look like this: -## Install Kafka +### 2. Install Kafka We will deploy a Kafka broker using Bitnami's [Helm chart](https://github.com/bitnami/charts/tree/master/bitnami/kafka). In the chart we will configure Kafka to: @@ -81,7 +68,7 @@ helm install --create-namespace -n kafka \ You can watch for all pods to be `Ready` using `kubectl get pods -n kafka -w`. -## Configure Otterize to manage Kafka access +### 3. Configure Otterize to manage Kafka access In our simple example, we'll call the Kafka broker service simply "kafka". Let's tell Otterize how to connect to the Kafka broker by applying an Otterize `KafkaServerConfig`, naming it `kafka`. The name will be the name we later use to declare `ClientIntents`. @@ -93,8 +80,9 @@ kubectl apply -f ${ABSOLUTE_URL}/code-examples/kafka-mtls/kafkaserverconfig.yaml ```yaml {@include: ../../../../static/code-examples/kafka-mtls/kafkaserverconfig.yaml} ``` +## Tutorial -## Deploy clients +### Deploy clients Our simple example consists of two client pods: @@ -248,7 +236,7 @@ You can now browse to your account at [https://app.otterize.com](https://app.ott The access graph shows, through its green and orange lines linking the services, that no clients are currently blocked because we haven't enabled any sort of enforcement yet. The orange lines indicate that, since we have not declared any intents for these clients, they _would_ be blocked if we were to turn enforcement on. -## Apply intents +### Apply intents :::tip @@ -286,7 +274,7 @@ We can see what happened: Also, the access graph shows information about the mTLS certificates (credentials) distributed to the various services, as long as [Cloud-managed credentials](/security#cryptographic-credentials) are being used. -## Turn on protection +### Turn on protection At this point, we haven't actually protected our Kafka broker. From everything we've done so far, we can see, however, that if we were to turn on protection, the `client-other` would lose access to the broker. @@ -321,7 +309,7 @@ And if you look back at your access graph, you'll see that the Kafka broker is n ![Clients blocked](/img/quick-tutorials/k8s-kafka-mtls/clients-blocked.png) -## What did we accomplish? +### What did we accomplish? - Controlling Kafka access no longer means touching ACLs, issuing and managing and distributing certs, establishing trust, etc. diff --git a/docs/features/networking/index.mdx b/docs/features/networking/index.mdx index 21522b9b9..9d76470ba 100644 --- a/docs/features/networking/index.mdx +++ b/docs/features/networking/index.mdx @@ -33,14 +33,14 @@ export const network_access_tutorials = [ ### About You can use Otterize to understand, visualize, and manage access for Kubernetes networks. Upon installation, Otterize inspects network traffic and builds an in-memory network map of connections. The network map can then be exported or viewed in various ways to understand the connections within your networks. With IBAC-based policies, Otterize becomes a control plane for your K8s networks. Mapped network traffic can autogenerate declarative intent-based access policies to create least privileged pod-to-pod access easily. -### Visualizing +### Mapping & visualizing After installation, Otterize collects network traffic data in memory, creating a graph of relationships between pod-to-pod and pod-to-public internet traffic. Once the graph is in place, the data can be exported or viewed in various ways. Otterize Cloud users can see and interact with the graph structures within the Otterize application. OSS users can use the CLI tool to export the data into JSON, list the relationship, or generate IBAC policies reflecting the existing traffic. To learn more about Visualizing, check out [Visualizing a Kubernetes Network](/features/Networking/tutorials/k8s-network-mapper) -### Access Control +### Access control By default, Kubernetes pods allow all egress and ingress traffic. Kubernetes [NetworkPolicies](/reference/terminology#network-policies) provide `policyTypes` to restrict egress or ingress traffic, providing a more secure and compliant environment. Utilizing the in-memory tariff map, Otterize can automatically generate IBAC policies to reflect the current traffic flow within a cluster. Once the IBAC policies are submitted, Otterize will generate and apply the corresponding NetworkPolicies to your namespaces. diff --git a/docs/features/networking/Reference/Network-Policies-Deep-Dive.mdx b/docs/features/networking/reference/Network-Policies-Deep-Dive.mdx similarity index 100% rename from docs/features/networking/Reference/Network-Policies-Deep-Dive.mdx rename to docs/features/networking/reference/Network-Policies-Deep-Dive.mdx diff --git a/docs/features/networking/Reference/README.mdx b/docs/features/networking/reference/README.mdx similarity index 93% rename from docs/features/networking/Reference/README.mdx rename to docs/features/networking/reference/README.mdx index 4c7ae3fd0..3b239324d 100644 --- a/docs/features/networking/Reference/README.mdx +++ b/docs/features/networking/reference/README.mdx @@ -4,7 +4,7 @@ title: Reference hide_table_of_contents: true --- -### Client Intents (YAML) +### ClientIntents example (YAML) ```yaml apiVersion: k8s.otterize.com/v1alpha3 @@ -14,13 +14,22 @@ metadata: namespace: otterize-example spec: service: - name: client #The name of the service initiating the connection + # The name of the service initiating the connection + name: client calls: - - name: server #The name of the service recieving the connection. Multiple names can be provided + # The name of the service receiving the connection. Multiple names can be provided + - name: server + # multiple services can be added + - name: orderservice + # Optional granular rules can be added like the HTTPResources options below. + type: http + HTTPResources: + - path: /orders/* + methods: [ get, post ] ``` -### Helm Chart Options +### Helm Chart options | Key | Description | Default | |-----------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------|---------| @@ -28,6 +37,8 @@ spec: | `operator.autoCreateNetworkPoliciesForExternalTraffic` | (deprecated, use `allowExternalTraffic` instead) Automatically allow external traffic, if a new ClientIntents resource would result in blocking external (internet) traffic and there is an Ingress/Service resource indicating external traffic is expected. | `true` | | `operator.autoCreateNetworkPoliciesForExternalTrafficDisableIntentsRequirement` | (deprecated, use `allowExternalTraffic` instead) **experimental** - If `autoCreateNetworkPoliciesForExternalTraffic` is enabled, do not require ClientIntents resources - simply create network policies based off of the existence of an Ingress/Service resource. | `false` | +View the [helm chart reference](/reference/configuration/otterize-chart) for all other options + ### Network mapper parameters All configurable parameters of the network mapper can be configured under the alias `networkMapper`. Further information about network mapper parameters can be found [in the network mapper's chart](https://github.com/otterize/helm-charts/tree/main/network-mapper). diff --git a/docs/features/networking/tutorials/aws-eks-cni-mini.mdx b/docs/features/networking/tutorials/aws-eks-cni-mini.mdx index 9e6ea6e55..5743fb857 100644 --- a/docs/features/networking/tutorials/aws-eks-cni-mini.mdx +++ b/docs/features/networking/tutorials/aws-eks-cni-mini.mdx @@ -17,7 +17,9 @@ This tutorial will walk you through deploying an AWS EKS cluster with the AWS VP - The [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html). - The [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/) command-line tool. -## Step one: Create an AWS EKS cluster with the AWS VPC CNI plugin +## Tutorial + +### Step one: Create an AWS EKS cluster with the AWS VPC CNI plugin Before you start, you'll need an AWS Kubernetes cluster. Having a cluster with a [CNI](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/) that supports [NetworkPolicies](https://kubernetes.io/docs/concepts/services-networking/network-policies/) is required for this tutorial. @@ -75,44 +77,11 @@ eksctl create cluster -f cluster-config.yaml Once your AWS EKS has finished deploying the control pane and node group, the next step is deploying Otterize as well as a couple of clients and a server to see how they are affected by network policies. -## Step two: Install the Otterize agents +### Step two: Install the Otterize agents ### Install Otterize on your cluster -You can now install Otterize in your cluster, and optionally connect to Otterize Cloud. Connecting to Cloud lets you see what's happening visually in your browser, through the "access graph". - -So either forego browser visualization and: - -
-Install Otterize in your cluster, without Otterize Cloud - -{@include: ../../../_common/install-otterize.md} - -
- -Or choose to include browser visualization and: - -
-Install Otterize in your cluster, with Otterize Cloud - -#### Create an Otterize Cloud account - -{@include: ../../../_common/create-account.md} - -#### Install Otterize OSS, connected to Otterize Cloud - -{@include: ../../../_common/install-otterize-from-cloud.md} - -
- -Finally, you'll need to install the Otterize CLI (if you haven't already) to interact with the network mapper: - -
-Install the Otterize CLI - -{@include: ../../../_common/install-otterize-cli.md} - -
+To deploy Otterize, head over to [Otterize Cloud](https://app.otterize.com) and create a Kubernetes cluster on the [Clusters page](https://app.otterize.com/clusters), and follow the instructions. ### Deploy a server and two clients @@ -126,7 +95,7 @@ Once you have that installed and running your Otterize access graph should look ![Access Graph](/img/quick-tutorials/aws-eks-mini/access-graph.png) -## Step three: Create an intent +### Step three: Create an intent Now that you have Otterize installed, the next step is to create an intent which will enable access to the server from the client. If you enable protection on the server without declaring an intent, the client will be blocked. @@ -185,7 +154,7 @@ And you should see your access graph showing the service as protected: ![Protected Service](/img/quick-tutorials/aws-eks-mini/protected.png) -## What's next +### What's next Have a look at the [guide on how to deploy protection to a larger, more complex application one step at a time](/guides/protect-1-service-network-policies). diff --git a/docs/features/networking/tutorials/k8s-network-mapper.mdx b/docs/features/networking/tutorials/k8s-network-mapper.mdx index 7c3db3339..b462db79e 100644 --- a/docs/features/networking/tutorials/k8s-network-mapper.mdx +++ b/docs/features/networking/tutorials/k8s-network-mapper.mdx @@ -8,7 +8,7 @@ import Tabs from "@theme/Tabs"; import TabItem from "@theme/TabItem"; import styles from "/src/css/styles.module.css"; -The network mapper allows you to map network traffic for your K8s cluster. Once mapped you can export it as an image, json, list, or view it within Otterize Cloud. +The network mapper allows you to map pod-to-pod traffic within your K8s cluster. In this tutorial, we will: @@ -17,54 +17,14 @@ In this tutorial, we will: ## Prerequisites -
-Prepare a Kubernetes cluster +### Install Otterize on your cluster +To deploy Otterize, head over to [Otterize Cloud](https://app.otterize.com) and create a Kubernetes cluster on the [Clusters page](https://app.otterize.com/clusters), and follow the instructions. -Before you start, you'll need a Kubernetes cluster. Having a cluster with a [CNI](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/) that supports [NetworkPolicies](https://kubernetes.io/docs/concepts/services-networking/network-policies/) isn't required for this tutorial, but is recommended so that your cluster works with other tutorials. +We will also need the [Otterize CLI](/overview/installation#install-the-otterize-cli). -{@include: ../../../_common/cluster-setup.md} +## Tutorial -
- -You can now install Otterize in your cluster (if it's not already installed), and optionally connect to Otterize Cloud. Connecting to Cloud lets you: - -1. See what's happening visually in your browser, through the "access graph"; -2. View pod public internet egress traffic. - -So either forego browser visualization and: - -
-Install Otterize in your cluster, without Otterize Cloud - -{@include: ../../../_common/install-otterize.md} - -
- -Or choose to include browser visualization and: - -
-Install Otterize in your cluster, with Otterize Cloud - -#### Create an Otterize Cloud account - -{@include: ../../../_common/create-account.md} - -#### Install Otterize OSS, connected to Otterize Cloud - -{@include: ../../../_common/install-otterize-from-cloud-with-enforcement.md} - -
- -Finally, you'll need to install the Otterize CLI (if you haven't already) to interact with the network mapper: - -
-Install the Otterize CLI - -{@include: ../../../_common/install-otterize-cli.md} - -
- -## Deploy demo to simulate traffic +### Deploy demo to simulate traffic Let's add services and traffic to the cluster and see how the network mapper builds the map. Deploy the following simple example — `client`, `client2` and `server`, communicating over HTTP: @@ -73,16 +33,7 @@ Deploy the following simple example — `client`, `client2` and `server`, co kubectl apply -n otterize-tutorial-mapper -f ${ABSOLUTE_URL}/code-examples/network-mapper/all.yaml ``` -
-Expand to see the deployment YAML - -```yaml -{@include: ../../../static/code-examples/network-mapper/all.yaml} -``` - -
- -## Map the cluster +### Map the cluster The network mapper starts to sniff traffic and build an in-memory network map as soon as it's installed. The Otterize CLI allows you to interact with the network mapper to grab a snapshot of current mapped traffic, @@ -103,17 +54,17 @@ If you've attached Otterize OSS to Otterize Cloud, you can now also see the [acc The access graph reveals several types of information and insights, such as: 1. Seeing the network map for different clusters, seeing the subset of the map for a given namespace, or even — according to how you've mapped namespaces to environments — seeing the subset of the map for a specific environment. -2. Viewing the public internet egress traffic for each pod, including the DNS name and the IPs associated with each outbound request. -3. Filtering the map to include recently-seen traffic, since some date in the past. That way you can eliminate calls that are no longer relevant, without having to reset the network mapper and start building a new map. -4. If the intents operator is also connected, the access graph now reveals more specifics about access: understand which services are protected or would be protected, and which client calls are being blocked or would be blocked. We'll see more of that in the next couple of tutorials. +2. Filtering the map to include recently-seen traffic, since some date in the past. That way you can eliminate calls that are no longer relevant, without having to reset the network mapper and start building a new map. +3. If the intents operator is also connected, the access graph now reveals more specifics about access: understand which services are protected or would be protected, and which client calls are being blocked or would be blocked. We'll see more of that in the next couple of tutorials + +Note, for example, that the `client` → `server` arrow is yellow. Clicking on it shows: -Note, for example, that the `client` → `server` arrow is yellow. Clicking on it shows the automatically generated intents for both the client pod to the server pod and the egress of the client to the public internet. If we take a closer look, the ClientIntent YAML specifies that the `client` can call the `server` on the internal network, and it can reach the IP Address `142.250.189.174`. We can see from the comment that this IP belongs to google.com. Client to server edge info -## What's next +### What's next The network mapper is a great way to bootstrap IBAC. It generates client intents files that reflect the current topology of your services; those can then be used by each client team to grant them easy @@ -125,7 +76,7 @@ Where to go next? - If you haven't already, see the [automate network policies tutorial](/quickstart/access-control/k8s-network-policies). - Or go to the next tutorial to [automate secure access for Kafka](/quickstart/access-control/k8s-kafka-mtls). -### Teardown +## Teardown To remove the deployed examples run: diff --git a/docs/features/networking/tutorials/k8s-network-policies.mdx b/docs/features/networking/tutorials/k8s-network-policies.mdx index 3686dc23f..714d508a9 100644 --- a/docs/features/networking/tutorials/k8s-network-policies.mdx +++ b/docs/features/networking/tutorials/k8s-network-policies.mdx @@ -23,45 +23,14 @@ In this tutorial, we will: ## Prerequisites -
-Prepare a Kubernetes cluster that supports network policies - -Before you start, you'll need a Kubernetes cluster with a [CNI](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/) that supports [NetworkPolicies](https://kubernetes.io/docs/concepts/services-networking/network-policies/). - -{@include: ../../../_common/cluster-setup.md} - -
- -You can now install (or reinstall) Otterize in your cluster, and optionally connect to Otterize Cloud. Connecting to Cloud lets you: - -1. See what's happening visually in your browser, through the "access graph"; -2. Avoid using SPIRE (which can be installed with Otterize) for issuing certificates, as Otterize Cloud provides a certificate service. - -So either forego browser visualization and: - -
-Install Otterize in your cluster, without Otterize Cloud +### Install Otterize on your cluster +To deploy Otterize, head over to [Otterize Cloud](https://app.otterize.com) and create a Kubernetes cluster on the [Clusters page](https://app.otterize.com/clusters), and follow the instructions. -{@include: ../../../_common/install-otterize.md} +We will also need the [Otterize CLI](/overview/installation#install-the-otterize-cli). -
- -Or choose to include browser visualization and: - -
-Install Otterize in your cluster, with Otterize Cloud - -#### Create an Otterize Cloud account - -{@include: ../../../_common/create-account.md} - -#### Install Otterize OSS, connected to Otterize Cloud - -{@include: ../../../_common/install-otterize-from-cloud-with-enforcement.md} - -
+## Tutorial -## Deploy the server and the two clients +### Deploy the server and the two clients Our simple example consists of three pods: an HTTP server and two clients that call it. @@ -176,7 +145,7 @@ If you've attached Otterize OSS to Otterize Cloud, you can now browse to your ac ![Access graph](/img/quick-tutorials/network-policies/base.png) -## Apply intents +### Apply intents We will now declare that the **client** intends to call the **server**. @@ -269,7 +238,7 @@ It's now clear what happened: Otterize did its job of both protecting the server _and_ allowing intended access. ::: -## What did we accomplish? +### What did we accomplish? - Controlling access through network policies no longer means touching network policies at all. @@ -304,7 +273,7 @@ Further information about network policies and Otterize can be found Try to create an intents file yourself for **client-other**, and apply it to allow this other client to call the server. ::: -## What's next +### What's next - Get started with the [Otterize network mapper](/quickstart/visualization/k8s-network-mapper) to help you bootstrap intents files for use in [intent-based access control (IBAC)](/intent-based-access-control). diff --git a/docs/features/networking/tutorials/protect-1-service-network-policies.mdx b/docs/features/networking/tutorials/protect-1-service-network-policies.mdx index d43d3b445..ab317035b 100644 --- a/docs/features/networking/tutorials/protect-1-service-network-policies.mdx +++ b/docs/features/networking/tutorials/protect-1-service-network-policies.mdx @@ -26,16 +26,13 @@ Note: all the capabilities of IBAC are within Otterize OSS, while the access gra ## Prerequisites -
-Prepare a cluster +### Install Otterize on your cluster +To deploy Otterize, head over to [Otterize Cloud](https://app.otterize.com) and create a Kubernetes cluster on the [Clusters page](https://app.otterize.com/clusters), and follow the instructions. -Before you start, you'll need a Kubernetes cluster. +We will also need the [Otterize CLI](/overview/installation#install-the-otterize-cli). -{@include: ../../../_common/cluster-setup.md} -
- -
-Deploy the demo set of services +## Tutorial +### Deploy the demo set of services To deploy these into your cluster: ```bash @@ -43,88 +40,64 @@ kubectl create namespace otterize-ecom-demo kubectl apply -n otterize-ecom-demo -f ${ABSOLUTE_URL}/code-examples/shadow-mode/ecom-demo.yaml ```
-Optional: check that the demo was deployed. - -To see all the pods in the demo: -```bash -kubectl get pods -n otterize-ecom-demo -``` -The pods should all be ready and running: -```bash -NAME READY STATUS RESTARTS AGE -adservice-65494cbb9d-5lrv6 1/1 Running 0 115s -cartservice-6d84fc45bb-hdtwn 1/1 Running 0 115s -checkoutservice-5599486df-dvj9n 1/1 Running 3 (79s ago) 115s -currencyservice-6d64686d74-lxb7x 1/1 Running 0 115s -emailservice-7c6cbfbbd7-xjxlt 1/1 Running 0 115s -frontend-f9448d7d4-6dmnr 1/1 Running 0 115s -kafka-0 1/1 Running 2 (83s ago) 115s -loadgenerator-7f6987f59-bchgm 1/1 Running 0 114s -orderservice-7ffdbf6df-wzzfd 1/1 Running 0 115s -otterize-ecom-demo-zookeeper-0 1/1 Running 0 115s -paymentservice-86855d78db-zjjfn 1/1 Running 0 115s -productcatalogservice-5944c7f666-2rjc6 1/1 Running 0 115s -recommendationservice-6c8d848498-zm2rm 1/1 Running 0 114s -redis-cart-6b79c5b497-xpms2 1/1 Running 0 115s -shippingservice-85694cb9bd-v54xp 1/1 Running 0 114s -``` - -You can now browse the web app of this demo, if you wish: - - - - -To get the externally-accessible URL where your demo front end is available, run: -```bash -kubectl get service -n otterize-ecom-demo frontend-external | awk '{print $4}' -``` -The result should be similar to (if running on AWS EKS): -``` -a11843075fd254f8099a986467098647-1889474685.us-east-1.elb.amazonaws.com -``` -Go ahead and browse to the URL above to "shop" and get a feel for the demo's behavior. -(The URL might take some time to populate across DNS servers. Note that we are accessing an HTTP and not an HTTPS website.) - - - -To get the externally-accessible URL where your demo front end is available, run: -``` -kubectl port-forward -n otterize-ecom-demo service/frontend-external 8080:80 & -``` -The demo is now accessible at: -``` -http://localhost:8080 -``` -Go ahead and browse to the URL above to "shop" and get a feel for the demo's behavior. - - -
- -
- -
-Create an Otterize Cloud account - -{@include: ../../../_common/create-account.md} - + Optional: check that the demo was deployed. + + To see all the pods in the demo: + ```bash + kubectl get pods -n otterize-ecom-demo + ``` + The pods should all be ready and running: + ```bash + NAME READY STATUS RESTARTS AGE + adservice-65494cbb9d-5lrv6 1/1 Running 0 115s + cartservice-6d84fc45bb-hdtwn 1/1 Running 0 115s + checkoutservice-5599486df-dvj9n 1/1 Running 3 (79s ago) 115s + currencyservice-6d64686d74-lxb7x 1/1 Running 0 115s + emailservice-7c6cbfbbd7-xjxlt 1/1 Running 0 115s + frontend-f9448d7d4-6dmnr 1/1 Running 0 115s + kafka-0 1/1 Running 2 (83s ago) 115s + loadgenerator-7f6987f59-bchgm 1/1 Running 0 114s + orderservice-7ffdbf6df-wzzfd 1/1 Running 0 115s + otterize-ecom-demo-zookeeper-0 1/1 Running 0 115s + paymentservice-86855d78db-zjjfn 1/1 Running 0 115s + productcatalogservice-5944c7f666-2rjc6 1/1 Running 0 115s + recommendationservice-6c8d848498-zm2rm 1/1 Running 0 114s + redis-cart-6b79c5b497-xpms2 1/1 Running 0 115s + shippingservice-85694cb9bd-v54xp 1/1 Running 0 114s + ``` + + You can now browse the web app of this demo, if you wish: + + + + + To get the externally-accessible URL where your demo front end is available, run: + ```bash + kubectl get service -n otterize-ecom-demo frontend-external | awk '{print $4}' + ``` + The result should be similar to (if running on AWS EKS): + ``` + a11843075fd254f8099a986467098647-1889474685.us-east-1.elb.amazonaws.com + ``` + Go ahead and browse to the URL above to "shop" and get a feel for the demo's behavior. + (The URL might take some time to populate across DNS servers. Note that we are accessing an HTTP and not an HTTPS website.) + + + + To get the externally-accessible URL where your demo front end is available, run: + ``` + kubectl port-forward -n otterize-ecom-demo service/frontend-external 8080:80 & + ``` + The demo is now accessible at: + ``` + http://localhost:8080 + ``` + Go ahead and browse to the URL above to "shop" and get a feel for the demo's behavior. + +
-
-Install Otterize OSS - -{@include: ../../../_common/install-otterize-from-cloud.md} - -
- -
-Install the Otterize CLI - -{@include: ../../../_common/install-otterize-cli.md} - -
- - -## Seeing the access graph +### Seeing the access graph In the Otterize Cloud UI, your [cluster](https://app.otterize.com/clusters) should now show all 3 Otterize OSS operators — the network mapper, intents operator, and credentials operator — as connected, with a green status. @@ -159,7 +132,7 @@ Otterize can configure several access control mechanisms, such as Istio authoriz Access graph - access controls panel -## Choose one service to protect +### Choose one service to protect Now let's prepare to protect just one service, but remain in shadow mode: no actual network policies, yet. We'll verify no intended access would be blocked before turning on the network policy protection. @@ -199,7 +172,7 @@ We see that:
-## Declare client intents +### Declare client intents The graph visually tells us we'll need to declare all 3 of those clients' intents: 1. `frontend` → `productcatalogservice`. @@ -297,7 +270,7 @@ And you can verify the `productcatalogservice` would not block *any* of its disc The server is still yellow because it's unprotected — let's fix that. -## Protect the `productcatalogservice` +### Protect the `productcatalogservice` Now that we've verified no intended clients would be blocked, we can safely protect the server. @@ -325,22 +298,22 @@ Sure enough, the `productcatalogservice` is -## Ready for production +### Ready for production -### Will load balancers, ingress, and other external traffic be affected? +#### Will load balancers, ingress, and other external traffic be affected? The intents operator automatically detects resources of kind `Service` (with type `LoadBalancer` or `NodePort`), or of kind `Ingress`, and creates network policies to allow external traffic to relevant pods. You do not need to configure anything to get this to work. [Learn more here.](/reference/configuration/intents-operator#handling-external-traffic) -### Will admission webhook controllers, e.g. policy validators like Kyverno, be affected? +#### Will admission webhook controllers, e.g. policy validators like Kyverno, be affected? Since you are not placing a global default-deny policy that would affect controllers in your cluster, only default-deny network policies on individual pods, Otterize will not affect calls to admission webhook controllers and they will continue functioning as before. -### Working with Otterize in CI/CD +#### Working with Otterize in CI/CD We recommend placing the `ClientIntents` and `ProtectedService` resource YAMLs alongside the services that own them, in their respective Git repositories: - The `ProtectedService` YAMLs alongside the servers they are protecting, e.g. in the Helm chart belonging to the server. - `ClientIntents` YAMLs, whether they were generated from the network mapper or created and maintained by the client developer teams, alongside each client, e.g. in the Helm chart belonging to the client. -## In summary +### In summary So what have we learned? You can gradually roll out IBAC and drive towards zero trust, service by service, in a safe, predictable, and quick way, by following 4 simple steps: diff --git a/docs/features/postgresql/_category_.json b/docs/features/postgresql/_category_.json index 02b31b4a4..94a4efd26 100644 --- a/docs/features/postgresql/_category_.json +++ b/docs/features/postgresql/_category_.json @@ -3,6 +3,6 @@ "position": 5, "collapsed": true, "customProps": { - "image": "/img/icons/postgresql.png" + "image": "/img/icons/postgresql-no-word-mark.svg" } } diff --git a/docs/features/postgresql/Reference.mdx b/docs/features/postgresql/reference.mdx similarity index 95% rename from docs/features/postgresql/Reference.mdx rename to docs/features/postgresql/reference.mdx index 56e95b209..61f63b245 100644 --- a/docs/features/postgresql/Reference.mdx +++ b/docs/features/postgresql/reference.mdx @@ -3,7 +3,7 @@ sidebar_position: 3 title: Reference --- -### ClientIntents Example (YAML) +### ClientIntents example (YAML) ```yaml apiVersion: k8s.otterize.com/v1alpha3 diff --git a/docs/getting-started/README.mdx b/docs/getting-started/README.mdx index 39db62b50..ea1b7ea11 100644 --- a/docs/getting-started/README.mdx +++ b/docs/getting-started/README.mdx @@ -20,7 +20,7 @@ export const introduction = [ export const features = [ { - title: 'Network Policies', + title: 'Network mapping & access control', icon: '/img/icons/networking.png', url: '/features/networking/' }, @@ -31,17 +31,17 @@ export const features = [ }, { title: 'Kafka', - icon: '/img/icons/kafka.png', + icon: '/img/icons/kafka-no-word-mark.svg', url: '/features/kafka/' }, { title: 'PostgreSQL', - icon: '/img/icons/postgresql.png', + icon: '/img/icons/postgresql-no-word-mark.svg', url: '/features/postgresql/' }, { title: 'Istio', - icon: '/img/icons/istio.png', + icon: '/img/icons/istio-no-word-mark.svg', url: '/features/istio/' }, ]; @@ -122,11 +122,11 @@ Otterize makes it easy to create and visualize authorization for your Kubernetes ### Tutorials -#### Learn more about access control +#### How to manage access control -#### See how to visualize access +#### How to visualize access diff --git a/docs/getting-started/_category_.json b/docs/getting-started/_category_.json index 594203d97..012adff4f 100644 --- a/docs/getting-started/_category_.json +++ b/docs/getting-started/_category_.json @@ -1,4 +1,4 @@ { "collapsed": true, - "label": "Getting Started" + "label": "Getting started" } \ No newline at end of file diff --git a/docs/overview/intent-based-access-control.mdx b/docs/overview/intent-based-access-control.mdx index ade9e2477..2bbdf41fc 100644 --- a/docs/overview/intent-based-access-control.mdx +++ b/docs/overview/intent-based-access-control.mdx @@ -3,85 +3,40 @@ sidebar_position: 2 title: Intent-Based Access Control (IBAC) --- -Intent-based access control is, not surprisingly, centered around declaring intents — specifically, declaring **client** intents - to call servers. +## Why intent based access? -The mechanism to declare client intents is with **client intents files**, or just "intents files" for short. -This is a natural approach for agile, cloud-native organizations and initiatives: +We developers are working hard to make the world’s services functional, reliable, performant, and of course secure, all while maximizing velocity. In practice, achieving successful zero-trust security requires enabling stringent access policies on the service we are developing and within the other technologies and services we utilize. -- Intents files are **declarative**; -- Specifically, intents files declare **what** needs to happen (service A needs to access service B to do operation C) -without specifying, or needing to know, **how** to accomplish this; -- Intents files align with **rapid, distributed development** because they only require the knowledge that -client developers already have &mdash no need for the target server developers or admins to keep track of who needs to access them; -- The declarative approach thrives in **cloud-native infrastructures** where there are existing APIs to configure access control automatically. +Services may need network access, database access, cloud resource access, and more to achieve the desired functionality. In a zero-trust environment, access must be granted by the data teams, cloud teams, and other teams managing dependent services. This results in a large degree of friction and a lack of a cohesive picture of the access rights needed for each service to function properly. -## Intents within intents files +We believe that each service should define the access it needs to function. This intent-based access control (IBAC) should be easily understood, easily reviewed, and capable of being statically analyzed. -An intent is a declaration by a specific client to call a specific server, optionally specifying more granular - information about the call (e.g. the resource path and method for HTTP, the topic name and operation for Kafka). - In other words, an intent is a tuple of client, server, and optional granular call information. - If any of those changes, that's logically a different intent, though the intents file format allows some - shorthand ways of aggregating intents that only differ by HTTP method or Kafka operation. See the example below. +## Enter client intents - An client's intents file specifies *all* the intents of that client, in one YAML file. Why is that important? - Because as the client's needs change, the intents file should change with it, and any intents no longer needed - should be removed from the file. When this updated file is applied, the corresponding access is also removed, - i.e. the network policies or the Kafka ACLs that were previously in place due to those intents are now gone. - In this way, access controls always reflect all of, and only, the latest intended access. +A client intents file is simply a list of calls to servers a client intends to make. Coupled with a mechanism for resolving service names, the list of client intents can be translated to different authorization mechanisms, such as network policies, cloud IAM, databases, etc. -## Intents file formats +In other words, developers declare what their service intends to access, and that can then be converted to a network policy and the associated set of pod labels. -Client intents files are independent of the infrastructure on which IBAC is deployed — indeed, they abstract away -any tie-ins with infrastructures and implementations of access control. - -As an example, let's look at the core of a client intents file for a service called `checkoutservice`. -It declares that it will call the `emailservice`, the `orderservice`, and the `ecomm-events` Kafka service. -It also provides more granular information for some of the calls: +Here’s an example of a client intents file (as a Kubernetes custom resource YAML) for a service named **client** that has network access to another service named **auth-server** and has access to **production-db’s** **metrics** database: ```yaml -{@include: ../../static/resources/example-intents.yaml} -``` - -You can actually create and use such "plain" or "vanilla" intents files without any other metadata. Currently, Otterize only supports processing client intents via the Otterize OSS intents operator for Kubernetes, so you'll need to run the plain intents files through the Otterize CLI (`otterize intents convert`) to convert them into Kubernetes custom resource YAML files. - -Within the context of a Kubernetes cluster, it's very natural to format intents files from the beginning as -Kubernetes custom resources. These files are applied (`kubectl apply`) to the Kubernetes API, which validates - them against a `ClientIntents` custom resource definition (CRD) and then hands them over to the Otterize intents - operator, as expected of a Kubernetes ecosystem extension. - The two formats are trivially related: the "plain" intents file contents are simply embedded in the `spec` - section of the custom resource format. - -Here is the same client intents file, now formatted as a Kubernetes custom resource YAML, -so it can be applied directly via `kubectl apply`: -```yaml -{@include: ../../static/resources/example-intents-resource-highlighted.yaml} +apiVersion: k8s.otterize.com/v1alpha2 +kind: ClientIntents +metadata: + name: client-intents + +spec: + service: + name: client + calls: + - name: auth-server + - name: production-db + type: database + databaseResources: + - databaseName: metrics ``` -## Intents file specification - -The core of a client intents file has 2 root-level fields (keys, in YAML): -- `service` (required): describes the client service that intends to make the calls in this file. - - `name` (required): specifies the name of the client service. - -- `calls` (required): describes the (server) services which the client intends to call.
- Its value is a list of key-value pairs, each describing a server service to be called. (The combination of client service, server service, and optionally any more granular information about the call forms an intent.)
- Each item in the list has the following fields: - - `name` (required): specifies the name of the server service.
- The name can include the namespace of the server service, if different from the client service, separated by a dot ("."): `server-name.server-namespace`. - - `type` (optional, case-insensitive): specifies the type of call to be made to the server.
- If present, the values can currently be `http` or `kafka`.
- The Otterize intents operator will manage network policies for all intents, regardless of type (including if no type is specified); it will *also* manage Kafka ACLs if the `type` is `kafka`; and in the future it will *also* manage HTTP access controls if the `type` is `http`. - - - `kafkaTopics` (optional; only allowed if `type` is `kafka`): Specifies the list of Kafka topics to be called.
- Each item in the list has the following fields: - - `name` (required): specifies the name of the topic. - - `operations` (required): specifies the list of intended operations on that topic.
- Allowed values are: `consume`, `produce`, `create`, `alter`, `delete`, `describe`, `cluster_action`, `describe_configs`, `alter_configs`, `idempotent_write`, and `all`. - - - `HTTPResources` (optional; only allowed if `type` is `http`): Specifies the list of HTTP resources to be called.
- Each item in the list has the following fields: - - `path` (required): specifies the HTTP path of the resource. - - `methods` (required): specifies the list of intended operations on that topic.
- Allowed values are: `get`, `post`, `put`, `patch`, `delete`, `options`, `trace`, and `connect`. +## How do intents work? +When intents are created for a client, the intents operator automatically creates, updates, and deletes the corresponding policies and automatically labels client and server pods to reflect precisely the client-to-server calls declared in client intents files. For instance, for a NetworkPolicy, a single policy is created per server, and pod labels are dynamically updated for clients when their intents are updated +Service names are resolved by recursively getting the owner of a pod until the original owner is found, usually a Deployment, StatefulSet, or other such resource. The name of that resource is used unless the pod has a service-name annotation, in which case the value of that annotation is used instead. diff --git a/docs/overview/otterize-cloud/object-model.mdx b/docs/overview/otterize-cloud/object-model.mdx deleted file mode 100644 index f9dad7fab..000000000 --- a/docs/overview/otterize-cloud/object-model.mdx +++ /dev/null @@ -1,44 +0,0 @@ ---- -sidebar_position: 1 -title: Object model ---- -In Otterize Cloud, as across all of the Otterize product, the central object is the **intent**. Intent-based access control (IBAC) bases the authorization model of a server on the set of calls its clients declare they intend to make, granting them access to make declared calls, while blocking undeclared calls. - -## Intents - -An **intent** is a declaration that service A (the client service) intends to call service B (the server service), often with more granular information about the type of call (e.g. "HTTP" or "Kafka") and other details of the call (e.g. which HTTP resources and methods, or which Kafka topics and operations). - -The intent is expressed within a file, specifically a Kubernetes custom resource YAML declaration, that is then created in a specific Kubernetes cluster and namespace via `kubectl apply`. All the intents from a given client should appear in a single client intents YAML file, which then represents the overall intents of that service to be a client of other services. - -The declared intents applied in this way to a cluster are processed by the **Otterize intents operator** running in the cluster, which -- if configured to enforce intents -- manages Kubernetes network policies and Kafka ACLs according to those intents. When the intents operator is integrated with Otterize Cloud, it also reports those intents to the Cloud, to build an overall model of service-to-service access called the **access graph**. - -The declared intents form the basis of IBAC. But to controllably and confidently roll out IBAC to a working cluster, it's important to compare the declared access to the actual access (or attempted access) happening in the cluster. To that end, the **Otterize network mapper** detects attempted access automatically, and generates **discovered intents**: these reflect the intentions of services to call one another based on discovering the actual call attempts themselves. In other words, discovered intents form a network map of services actually calling each other, while declared intents reflect explicit declarations of services to call each other. When the network mapper is integrated with Otterize Cloud, the access graph in the Cloud will includes both discovered and declared intents, and will yield many more insights. - -Currently, Otterize only supports intents within a cluster (i.e. client and service are within the same cluster), not across clusters. - -## Services - -While declared and discovered intents are the edges of the access graph, **services** are its nodes. A service may be a client of other services, a server to other services, or both. (Note the difference between a "Kubernetes service" which is a specific construct used to make a pod callable by other pods, and an Otterize service that's the more general concept, in the sense of a microservice or a workload.) - -In Otterize Cloud, services are _inferred_ from the intents reported to the Cloud by the intents operator and the network mapper: whenever an intent is reported, it carries the information about the client and server of that intent. The intents operator adds more information when the service is identified as a Kafka service (the **Kafka server config**), and the credentials operator, when integrated, adds yet more information about any **certificates** issued to that service. - -A service name is unique within a namespace in a cluster, but not in general unique across the cluster or across clusters. - -{@include: _environments_and_namespaces.mdx} -## Clusters - -When a Kubernetes cluster is connected to Otterize Cloud, it is represented in the Cloud by a **cluster** object. You'll name it when you add it in the UI or through the API/CLI, or when you create the integration directly (in the UI or API/CLI). - -The Otterize operators -- intents operator, network mapper, and/or credentials operator -- running in your cluster will inform the Cloud about the intents, services, and credentials within this cluster, and will also convey their configuration (e.g. shadow or enforcement mode) within this cluster. Thus the cluster object in Otterize Cloud contains a lot of useful information about your Kubernetes cluster -- information used to deliver insights when you view your cluster in through the lens of the access graph. - -Note that, while a cluster and its namespaces and services could be in a single environment, and an environment could contain multiple clusters, many other combinations are possible. For example, a cluster could contain namespaces in multiple environments. Or, environments may contain some namespaces in one cluster and other namespaces in another cluster. Use whatever mappings make sense for your situation. - -Cluster names must be unique within an organization. - -## Integrations - -Otterize Cloud currently supports two types of integrations: **Kubernetes integrations** and **generic integrations**. In the future, many other types of integrations will be added, allowing Otterize Cloud to work seamlessly with all your infrastructures and systems. - -A Kubernetes integration is used to connect a Kubernetes cluster with Otterize Cloud via any or all of the Otterize operators: the intents operator, the network mapper, and the credentials operator. When a Kubernetes-type integration is created, it is always linked to an Otterize Cloud cluster object. It contains the credentials needed by the operators running in the Kubernetes cluster to communicate with the Cloud on behalf of that cluster, i.e., it ties together the physical Kubernetes cluster with its representation in Otterize Cloud. The integration also determines the environment to which namespaces in that clusters will be associated by default. The name of a Kubernetes integration is derived from the name of the cluster; since cluster names are unique per organization, so are Kubernetes-type integration names. - -A generic integration is used to connect generically an external system to Otterize Cloud. It provides that system credentials to access the Otterize API/CLI, in a way that doesn't involve any specific Otterize user. That makes it ideal for building automations on top of the Otterize API. For example, new clusters provisioned for the development team could be automatically connected to Otterize Cloud, or a CI/CD system could automatically look in the access graph for services that would be blocked or intents that were not declared and applied and fail the build. The name of the integration should reflect the way it will be used. The names of generic-type integrations must be unique within an organization. diff --git a/docs/overview/otterize-oss/README.mdx b/docs/overview/otterize-oss/README.mdx index 5436c09dd..9397ada18 100644 --- a/docs/overview/otterize-oss/README.mdx +++ b/docs/overview/otterize-oss/README.mdx @@ -30,17 +30,3 @@ To get started with Otterize OSS, see the tutorials for [network policies](/quic Components in Otterize OSS collect usage information — counts of events like `INTENTS_APPLIED`, `NETWORK_POLICY_CREATED`, `KAFKA_ACL_DELETED`, etc. — and can report those back to the Otterize team. This is entirely optional and does not affect the functionality of Otterize OSS, but it does help the team at Otterize understand what the community finds useful and hence how to improve it. (Of course, direct feedback through the [Otterize Community Slack](https://joinslack.otterize.com/) is very much appreciated too.) For more information, including what is sent and how to turn it off or on, see [the usage telemetry documentation](/otterize-oss/usage-telemetry). -## Roadmap - -The near-term roadmap for Otterize OSS currently includes: -- [[Done](https://github.com/otterize/otterize-cli/releases/tag/v0.1.17)] Adding **network map visualization** capabilities to the Otterize CLI, so you can get network map images from the network mapper. - -- [[Done](https://github.com/otterize/network-mapper/releases/tag/v0.1.16)] Adding a **Kafka watcher** to supply more detailed information to the network mapper about calls to any Kafka server: which clients are performing which operations against which topics. This complements the current map built up in the network mapper, which only records which clients called which servers, without any more granular information about those calls. With this new capability, users can bootstrap client intents that contain granular Kafka access intent information, and Otterize Cloud can display topic-level shadow mode information and insights also for Kafka servers and their clients. - -- [[Done](https://github.com/otterize/intents-operator/releases/tag/v0.1.20)] Adding support for Istio service mesh access controls. This includes: - - Pod-to-pod access controls (akin to the current network policies support). - - Granular HTTP-level (path and method) access controls (akin to the current Kafka topic-level access control support). - - [Adding HTTP-level (path and method) intent information to the network mapper](https://github.com/otterize/network-mapper/releases/tag/v0.1.16), and to the information optionally sent to Otterize Cloud to support [shadow mode](/shadow-vs-active-enforcement) in the access graph. - - - diff --git a/docs/reference/terminology/README.mdx b/docs/reference/terminology/README.mdx index 41a1b82a9..1178da535 100644 --- a/docs/reference/terminology/README.mdx +++ b/docs/reference/terminology/README.mdx @@ -17,6 +17,9 @@ The [Otterize CLI](/reference/cli) is a command-line utility used to control and ### Intent (or client intent) Otterize intents are a way to declare that one service intends to call another service. Otterize uses them to apply authorization rules to enable the calls to go through, and block any unintended calls. An *intent* refers to a client declaring a particular call to a server; *all* a given client's intents to the servers it intends to call are collected in a single *client intents file*. [Learn more about intents](/reference/intents-and-intents-files). +### Integrations +Otterize Cloud supports two types of integrations: Kubernetes integrations and generic integrations. Kubernetes integrations connect a Kubernetes cluster to Otterize Cloud, allowing communication with the Otterize operators. Generic integrations connect external systems to Otterize Cloud, providing API/CLI access credentials. These integrations are named based on their usage and must have unique names within an organization. + ## Identity ### PKI @@ -57,3 +60,12 @@ A Kubernetes custom resource refers to a resource that is not present in the bas ### CNI (Container Network Interface) CNI is a CNCF project that provides libraries for implementing plugins for configuring network interfaces in Linux containers, and is used by Kubernetes to provide pods running in a cluster with network connectivity. Examples of CNI plugins are Calico, Cilium, the AWS VPC CNI plugin. [Read more about Kubernetes CNI plugins here](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/). + +### Services +Services represent the nodes in the access graph. They can be client services, server services, or both, and they are associated with specific namespaces within a Kubernetes cluster. Otterize Cloud infers services from reported intents and provides additional information for Kafka services and certificates. Service names must be unique within a namespace, but not necessarily across the entire cluster or multiple clusters. + +### Namespaces and Environments +Namespaces are used to group related services within a Kubernetes cluster and can be mapped to different environments (e.g., dev, staging, production). Intents can be cross-namespace and cross-environment, and Otterize Cloud associates namespaces with their respective environments. Environment names must be unique within an organization. + +### Clusters +A Kubernetes cluster connected to Otterize Cloud is represented by a cluster object in the cloud. This object contains information about the cluster's intents, services, credentials, and configuration. Multiple clusters and namespaces can belong to a single environment, or environments can span multiple clusters, depending on the organization's needs. Cluster names must be unique within an organization. \ No newline at end of file diff --git a/docusaurus.config.js b/docusaurus.config.js index 700a12307..2228bf7d1 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -150,7 +150,7 @@ const config = { }, { from: ['/reference/access-controls/network-policies'], - to: '/features/networking/Reference/Network-Policies-Deep-Dive' + to: '/features/networking/reference/Network-Policies-Deep-Dive' }, { from: ['/shadow-vs-active-enforcement'], @@ -180,7 +180,7 @@ const config = { }, { from: ['/otterize-cloud/object-model'], - to: '/overview/otterize-cloud/object-model' + to: '/reference/terminology' }, { from: ['/guides/protect-1-service-network-policies'], diff --git a/src/components/LinkCard/index.js b/src/components/LinkCard/index.js index 414c2df27..d4b6be9ab 100644 --- a/src/components/LinkCard/index.js +++ b/src/components/LinkCard/index.js @@ -16,7 +16,7 @@ export default function DocsLinkCard({items, colSize}) { > {item.icon &&
- +
}
diff --git a/static/img/icons/Postgresql-no-word-mark.svg b/static/img/icons/Postgresql-no-word-mark.svg new file mode 100644 index 000000000..d98e3659c --- /dev/null +++ b/static/img/icons/Postgresql-no-word-mark.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/img/icons/istio-no-word-mark.svg b/static/img/icons/istio-no-word-mark.svg new file mode 100644 index 000000000..e3e82f9b1 --- /dev/null +++ b/static/img/icons/istio-no-word-mark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/icons/kafka-no-word-mark.svg b/static/img/icons/kafka-no-word-mark.svg new file mode 100644 index 000000000..e373aefc3 --- /dev/null +++ b/static/img/icons/kafka-no-word-mark.svg @@ -0,0 +1,16 @@ + + + + + + image/svg+xml + + + + + + + + + + From e7ccbc8e7dc658e66cde2aec6d8f82819a17ea45 Mon Sep 17 00:00:00 2001 From: bglynn Date: Tue, 30 Jan 2024 13:38:07 -0800 Subject: [PATCH 08/20] link updates. --- docs/features/networking/tutorials/aws-eks-cni-mini.mdx | 2 +- docs/reference/cli/README.mdx | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/features/networking/tutorials/aws-eks-cni-mini.mdx b/docs/features/networking/tutorials/aws-eks-cni-mini.mdx index 5743fb857..56177fe59 100644 --- a/docs/features/networking/tutorials/aws-eks-cni-mini.mdx +++ b/docs/features/networking/tutorials/aws-eks-cni-mini.mdx @@ -13,7 +13,7 @@ This tutorial will walk you through deploying an AWS EKS cluster with the AWS VP ## Prerequisites - An EKS cluster with the AWS VPC CNI add-on installed and with the new built-in network policy support enabled. See [Installing the AWS VPC CNI add-on](https://docs.aws.amazon.com/eks/latest/userguide/pod-networking.html) for more information, or follow the instructions below. -- The [Otterize CLI](/installation#install-the-otterize-cli). +- The [Otterize CLI](/overview/installation#install-the-otterize-cli). - The [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html). - The [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/) command-line tool. diff --git a/docs/reference/cli/README.mdx b/docs/reference/cli/README.mdx index 79fe6fe0f..3c648230f 100644 --- a/docs/reference/cli/README.mdx +++ b/docs/reference/cli/README.mdx @@ -4,14 +4,14 @@ title: CLI --- The Otterize command line interface (CLI) offers the following capabilities: -- [Interact with](#network-mapper) the [Otterize network mapper](/quickstart/visualization/k8s-network-mapper) running in a Kubernetes cluster. +- [Interact with](#network-mapper) the [Otterize network mapper](/features/networking/tutorials/k8s-network-mapper) running in a Kubernetes cluster. - [Transform](#otterize-intents-convert--f-path) [intents files](/reference/intents-and-intents-files/#intents-file-formats) from plain YAML format to Kubernetes custom resource YAML format. - Interact with the Otterize Cloud, through its REST API. This CLI is open-source software. To see its source or build it yourself, see [https://github.com/otterize/otterize-cli](https://github.com/otterize/otterize-cli). -The CLI is available as an installable binary as documented in this [guide](/installation#install-the-otterize-cli). +The CLI is available as an installable binary as documented in this [guide](/overview/installation#install-the-otterize-cli). The following are the commands offered by the Otterize CLI. @@ -38,7 +38,7 @@ To **disable** sending usage information: If the `telemetry` flag is omitted or set to `true`, telemetry will be enabled: usage information will be reported. -For more information see the [Usage telemetry Documentation](/otterize-oss/usage-telemetry) +For more information see the [Usage telemetry Documentation](/overview/otterize-oss/usage-telemetry) ## Global options From 856b0369424e514210542940385ff63deab766eb Mon Sep 17 00:00:00 2001 From: bglynn Date: Tue, 30 Jan 2024 16:15:15 -0800 Subject: [PATCH 09/20] more git issue fixes safari image issue caps matter in vercel? --- .../configuration/intents-operator/README.mdx | 2 +- docusaurus.config.js | 12 +++--------- src/components/LinkCard/index.js | 2 +- 3 files changed, 5 insertions(+), 11 deletions(-) diff --git a/docs/reference/configuration/intents-operator/README.mdx b/docs/reference/configuration/intents-operator/README.mdx index 69279eac3..c980d1fba 100644 --- a/docs/reference/configuration/intents-operator/README.mdx +++ b/docs/reference/configuration/intents-operator/README.mdx @@ -78,7 +78,7 @@ it is attempting to read, so the end result is that the topic ACLs determine act ### PostgreSQL users & access The intents operator automatically creates, and updates credentials in PostgreSQL databases according to the declared intents. It works together with the Otterize credentials operator to easily enable secure access to PostgreSQL from client pods, all in your Kubernetes cluster. -Try the [Just-in-time PostgreSQL users & access](/features/postgresql/tutorials/postgresql) tutorial to learn more. +Try the [Just-in-time PostgreSQL users & access](/features/postgresql/tutorials/postgres) tutorial to learn more. ### Istio AuthorizationPolicy The intents operator automatically creates, updates and deletes Istio authorization policies, automatically looks up service accounts for client pods and labels server pods, to reflect precisely the client-to-server calls declared in client intents files. diff --git a/docusaurus.config.js b/docusaurus.config.js index 2228bf7d1..81a744b3f 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -159,16 +159,10 @@ const config = { { from: ['/otterize-cloud'], to: '/overview/otterize-cloud' - from: '/quick-tutorials', - to: '/', - }, - { - from: '/quick-tutorials/k8s-mtls', - to: '/quickstart/access-control/k8s-kafka-mtls-cert-manager', }, { - from: '/getting-started/oss-installation', - to: '/installation', + from: '/quick-tutorials', + to: '/', }, { from: ['/otterize-oss/usage-telemetry'], @@ -195,7 +189,7 @@ const config = { to: '/features/networking/tutorials/aws-eks-cni-mini', }, { - from: ['/quick-tutorials/k8s-kafka-mtls-cert-manager', '/quickstart/access-control/k8s-kafka-mtls-cert-manager'], + from: ['/quick-tutorials/k8s-kafka-mtls-cert-manager', '/quickstart/access-control/k8s-kafka-mtls-cert-manager', '/quick-tutorials/k8s-mtls'], to: '/features/kafka/tutorials/k8s-kafka-mtls-cert-manager', }, { diff --git a/src/components/LinkCard/index.js b/src/components/LinkCard/index.js index d4b6be9ab..76a11f4b9 100644 --- a/src/components/LinkCard/index.js +++ b/src/components/LinkCard/index.js @@ -16,7 +16,7 @@ export default function DocsLinkCard({items, colSize}) { > {item.icon &&
- +
}
From f8e2bae3f87dd47e6650ad35f1669fe69dabc731 Mon Sep 17 00:00:00 2001 From: bglynn Date: Wed, 31 Jan 2024 16:58:10 -0800 Subject: [PATCH 10/20] Another merge issue. --- docs/features/networking/_category_.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/networking/_category_.json b/docs/features/networking/_category_.json index d8135a87a..8c9fb3844 100644 --- a/docs/features/networking/_category_.json +++ b/docs/features/networking/_category_.json @@ -1,5 +1,5 @@ { - "label": "Networking", + "label": "Network Policies", "position": 1, "collapsed": true, "customProps": { From 63ce824c66cf67560c974c88a205c355228072a1 Mon Sep 17 00:00:00 2001 From: Ori Shoshan Date: Sun, 4 Feb 2024 19:57:22 +0100 Subject: [PATCH 11/20] first pass --- .../k8s-istio-authorization-policies.mdx | 2 +- .../_category_.json | 2 +- .../index.mdx | 5 +- .../reference/Network-Policies-Deep-Dive.mdx | 0 .../reference/README.mdx | 0 .../tutorials/_category_.json | 0 .../tutorials/aws-eks-cni-mini.mdx | 0 .../tutorials/k8s-network-mapper.mdx | 0 .../tutorials/k8s-network-policies.mdx | 0 .../protect-1-service-network-policies.mdx | 0 docs/getting-started/README.mdx | 115 +-- docs/overview/index.mdx | 35 +- .../credentials-operator/README.mdx | 27 +- yarn.lock | 929 +++++++++--------- 14 files changed, 509 insertions(+), 606 deletions(-) rename docs/features/{networking => network-mapping-network-policies}/_category_.json (68%) rename docs/features/{networking => network-mapping-network-policies}/index.mdx (98%) rename docs/features/{networking => network-mapping-network-policies}/reference/Network-Policies-Deep-Dive.mdx (100%) rename docs/features/{networking => network-mapping-network-policies}/reference/README.mdx (100%) rename docs/features/{networking => network-mapping-network-policies}/tutorials/_category_.json (100%) rename docs/features/{networking => network-mapping-network-policies}/tutorials/aws-eks-cni-mini.mdx (100%) rename docs/features/{networking => network-mapping-network-policies}/tutorials/k8s-network-mapper.mdx (100%) rename docs/features/{networking => network-mapping-network-policies}/tutorials/k8s-network-policies.mdx (100%) rename docs/features/{networking => network-mapping-network-policies}/tutorials/protect-1-service-network-policies.mdx (100%) diff --git a/docs/features/istio/tutorials/k8s-istio-authorization-policies.mdx b/docs/features/istio/tutorials/k8s-istio-authorization-policies.mdx index a265c6520..46205e0ef 100644 --- a/docs/features/istio/tutorials/k8s-istio-authorization-policies.mdx +++ b/docs/features/istio/tutorials/k8s-istio-authorization-policies.mdx @@ -166,7 +166,7 @@ kubectl apply -f ${ABSOLUTE_URL}/code-examples/istio-authorization-policies/inte ``` :::tip -Client intents are the cornerstone of [intent-based access control (IBAC)](/intent-based-access-control). +Client intents are the cornerstone of [intent-based access control (IBAC)](/overview/intent-based-access-control). ::: 2. You should quickly see in the **[other-client]** terminal that it times out when calling the server, as expected since it didn't declare its intents: diff --git a/docs/features/networking/_category_.json b/docs/features/network-mapping-network-policies/_category_.json similarity index 68% rename from docs/features/networking/_category_.json rename to docs/features/network-mapping-network-policies/_category_.json index 8c9fb3844..c0f24a86c 100644 --- a/docs/features/networking/_category_.json +++ b/docs/features/network-mapping-network-policies/_category_.json @@ -1,5 +1,5 @@ { - "label": "Network Policies", + "label": "Network mapping & network policies", "position": 1, "collapsed": true, "customProps": { diff --git a/docs/features/networking/index.mdx b/docs/features/network-mapping-network-policies/index.mdx similarity index 98% rename from docs/features/networking/index.mdx rename to docs/features/network-mapping-network-policies/index.mdx index 9d76470ba..55297923d 100644 --- a/docs/features/networking/index.mdx +++ b/docs/features/network-mapping-network-policies/index.mdx @@ -1,7 +1,6 @@ --- sidebar_position: 1 -title: Networking | Overview -hide_title: true +title: Network mapping & network policies --- import DocsLinkCard from "@site/src/components/LinkCard"; @@ -28,8 +27,6 @@ export const network_access_tutorials = [ } ]; -# Networking - ### About You can use Otterize to understand, visualize, and manage access for Kubernetes networks. Upon installation, Otterize inspects network traffic and builds an in-memory network map of connections. The network map can then be exported or viewed in various ways to understand the connections within your networks. With IBAC-based policies, Otterize becomes a control plane for your K8s networks. Mapped network traffic can autogenerate declarative intent-based access policies to create least privileged pod-to-pod access easily. diff --git a/docs/features/networking/reference/Network-Policies-Deep-Dive.mdx b/docs/features/network-mapping-network-policies/reference/Network-Policies-Deep-Dive.mdx similarity index 100% rename from docs/features/networking/reference/Network-Policies-Deep-Dive.mdx rename to docs/features/network-mapping-network-policies/reference/Network-Policies-Deep-Dive.mdx diff --git a/docs/features/networking/reference/README.mdx b/docs/features/network-mapping-network-policies/reference/README.mdx similarity index 100% rename from docs/features/networking/reference/README.mdx rename to docs/features/network-mapping-network-policies/reference/README.mdx diff --git a/docs/features/networking/tutorials/_category_.json b/docs/features/network-mapping-network-policies/tutorials/_category_.json similarity index 100% rename from docs/features/networking/tutorials/_category_.json rename to docs/features/network-mapping-network-policies/tutorials/_category_.json diff --git a/docs/features/networking/tutorials/aws-eks-cni-mini.mdx b/docs/features/network-mapping-network-policies/tutorials/aws-eks-cni-mini.mdx similarity index 100% rename from docs/features/networking/tutorials/aws-eks-cni-mini.mdx rename to docs/features/network-mapping-network-policies/tutorials/aws-eks-cni-mini.mdx diff --git a/docs/features/networking/tutorials/k8s-network-mapper.mdx b/docs/features/network-mapping-network-policies/tutorials/k8s-network-mapper.mdx similarity index 100% rename from docs/features/networking/tutorials/k8s-network-mapper.mdx rename to docs/features/network-mapping-network-policies/tutorials/k8s-network-mapper.mdx diff --git a/docs/features/networking/tutorials/k8s-network-policies.mdx b/docs/features/network-mapping-network-policies/tutorials/k8s-network-policies.mdx similarity index 100% rename from docs/features/networking/tutorials/k8s-network-policies.mdx rename to docs/features/network-mapping-network-policies/tutorials/k8s-network-policies.mdx diff --git a/docs/features/networking/tutorials/protect-1-service-network-policies.mdx b/docs/features/network-mapping-network-policies/tutorials/protect-1-service-network-policies.mdx similarity index 100% rename from docs/features/networking/tutorials/protect-1-service-network-policies.mdx rename to docs/features/network-mapping-network-policies/tutorials/protect-1-service-network-policies.mdx diff --git a/docs/getting-started/README.mdx b/docs/getting-started/README.mdx index ea1b7ea11..6d01004b3 100644 --- a/docs/getting-started/README.mdx +++ b/docs/getting-started/README.mdx @@ -8,21 +8,21 @@ hide_title: true export const introduction = [ { title: 'What is Otterize', - description: 'Learn how Otterize helps visualize and manages your authorization', - url: `/overview/intro` + description: 'Learn about how Otterize works and the function of the different Kubernetes operators', + url: `/overview` }, { title: 'Intent-Based Access Control', - description: 'Dive into declarative access.', + description: 'Learn how to use IBAC, with YAML examples.', url: '/overview/intent-based-access-control' }, ]; export const features = [ { - title: 'Network mapping & access control', + title: 'Network mapping & network policies', icon: '/img/icons/networking.png', - url: '/features/networking/' + url: '/features/network-mapping-network-policies/' }, { title: 'AWS IAM', @@ -87,115 +87,38 @@ export const tutorials_visualization = [ } ]; -export const editions = [ - { - title: 'Open Source', - description: 'Our open source edition focuses on a single Kubernetes cluster. ', - url: '/overview/otterize-oss' - }, - { - title: 'Cloud', - description: 'Visualize all your clusters, automate policies, and more', - url: '/overview/otterize-cloud' - } -]; - - import DocsLinkCard from "@site/src/components/LinkCard"; -Otterize is a platform that allows you to visualize, and build secure access for Kubernetes workloads. -Secure access is managed through declarative intent-based access control ([IBAC](/intent-based-access-control)) providing an easy understood and centralized approach to auth. +Otterize is a platform for automating workload IAM (access control) for workloads on Kubernetes. +Each workload declares what it needs in order to function, and a Kubernetes operator figures out the policies that need to be created. This concept is called [Intent-Based Access Control (IBAC)](/overview/intent-based-access-control). + +For each kind of supported IAM mechanism (such as Kubernetes Network Policies, AWS IAM policies), Otterize can automatically learn the required ClientIntents. -The platform is composed of **Otterize OSS**, which is tailored for a single Kubernetes cluster, and **Otterize Cloud**, which adds visibility and operationalization across Kubernetes clusters and non-Kubernetes infrastructures. +Otterize is composed of [three open-source and standalone components (the intents operator, credentials operator and network mapper)](/overview) you deploy on your cluster, as part of a single Helm chart, which handle enforcement, and Otterize Cloud, which supplements them with additional features. +Learn about how Otterize works by reading below, or jump into one of the tutorials below to see how it works hand-on. ### Introduction -### Features +### Features & tutorials -Otterize makes it easy to create and visualize authorization for your Kubernetes clusters across a variety of services. Explore each below. +Otterize makes it easy to automate and visualize workload IAM for your Kubernetes clusters across a variety of platforms. Explore each to learn how it works, and see its quickstart tutorials. ### Tutorials -#### How to manage access control +#### Automating workload IAM +:::danger +TODO +Add icons to the tutorials, same as the icons we have above. +::: -#### How to visualize access +#### Visualizing network traffic and data access - -### Editions - - - - -[//]: # () -[//]: # (## Let's go! 🚀) - -[//]: # (Dive right in with simple demos to manage access control:) - -[//]: # (* [Create and manage network policies](/quickstart/access-control/k8s-network-policies).) - -[//]: # (* [Network policies on AWS EKS with the VPC CNI](/quickstart/access-control/aws-eks-cni-mini).) - -[//]: # (* [Create and manage Istio authorization policies](/quickstart/access-control/k8s-istio-authorization-policies).) - -[//]: # (* [Configure secure access for Kafka using Otterize Cloud mTLS](/quickstart/access-control/k8s-kafka-mtls), or [using cert-manager mTLS](/quickstart/access-control/k8s-kafka-mtls-cert-manager).) - -[//]: # () -[//]: # (Or visualize communication in your cluster:) - -[//]: # (* [Network mapping a Kubernetes cluster](/quickstart/visualization/k8s-network-mapper).) - -[//]: # (* [Istio HTTP-level access mapping](/quickstart/visualization/k8s-istio-watcher).) - -[//]: # (* [Kafka topic-level access mapping](/quickstart/visualization/k8s-network-mapper).) - -[//]: # () -[//]: # (## Components) - -[//]: # () -[//]: # (### Otterize OSS) - -[//]: # (The Otterize OSS components are standalone open-source projects that implement intent-based access control (IBAC) for a single Kubernetes cluster. This same set of components is used to integrate with Otterize Cloud.) - -[//]: # (- The [Otterize intents operator](/reference/configuration/intents-operator) translates ClientIntents resources to access controls: currently, network policies for pod-to-pod access, and ACLs for in-cluster Kafka client access. [See it in GitHub](https://github.com/otterize/intents-operator)) - -[//]: # (- The [Otterize credentials operator](/reference/configuration/credentials-operator) integrates with SPIFFE/SPIRE to handle pod identities and manage certificates. [See it in GitHub](https://github.com/otterize/credentials-operator)) - -[//]: # (- The [Otterize network mapper](/reference/configuration/network-mapper) sniffs pod-to-pod traffic and builds a network map, which is useful on its own and may also be exported as client intents files for bootstrapping IBAC. [See it in GitHub](https://github.com/otterize/network-mapper)) - -[//]: # () -[//]: # () -[//]: # (### Otterize CLI) - -[//]: # () -[//]: # (The [Otterize CLI](/reference/cli) is used to control the network mapper or output its data, convert non-Kubernetes client) - -[//]: # (intents files (if needed) to Kubernetes custom resource YAMLs, interface with the Otterize Cloud.) - -[//]: # () -[//]: # (## Open source and Cloud) - -[//]: # () -[//]: # (### Otterize OSS) - -[//]: # () -[//]: # (Otterize OSS is a standalone open-source implementation of intent-based access control (IBAC) for a single Kubernetes cluster. As well as being open source, Otterize OSS is completely free, licensed under the Apache 2.0 license and does not require Otterize Cloud.) - -[//]: # () -[//]: # (### Otterize Cloud) - -[//]: # () -[//]: # (Otterize Cloud adds unified visibility and operationalization,) - -[//]: # (and spans multiple Kubernetes clusters as well as (coming soon) non-Kubernetes infrastructures.) - -[//]: # () -[//]: # (Read more in our [product page](https://otterize.com/product).) \ No newline at end of file diff --git a/docs/overview/index.mdx b/docs/overview/index.mdx index 00f5204dc..d495cf554 100644 --- a/docs/overview/index.mdx +++ b/docs/overview/index.mdx @@ -10,22 +10,45 @@ Otterize is a declarative and zero-trust approach to access management that empo ## How does Otterize work? -Otterize integrates into your Kubernetes clusters using a Helm chart that deploys some core [open-source components](https://github.com/otterize/), including the network mapper, intents-operator, and credential-operator. These components work in tandem to identify and secure access. Learn more about these components below. +Otterize is deployed to Kubernetes using a Helm chart that deploys the core open-source components: the [network mapper](https://github.com/otterize/network-mapper), [intents-operator](https://github.com/otterize/intents-operator), and [credentials-operator](https://github.com/otterize/credentials-operator). These components each have a stand-alone function (mapping access, provisioning policies and provisioning credentials, respectively), but together they can automate workload IAM. ### Network mapper -The network mapper is a zero-config open-source tool that provides insights into your network traffic without modifying your code or adding additional layers. Once Otterize is installed, the network monitor will automatically inspect pod traffic, including tariff from pod-to-pod, pod-to-public internet egress, Istio Envoy sidecar, pod-to-Kafka topics, and more to follow. This data is then collected in an in-memory database for various uses, including exporting and viewing. +The network mapper is a zero-config open-source tool that provides insights into your workload traffic without modifying your code or adding additional layers. Once Otterize is installed, the network monitor will automatically inspect pod traffic metadata to create a map of accesses, including: +* Pod-to-pod traffic +* Internet egress traffic +* Pod-to-pod traffic including the URL and HTTP method, when an Istio sidecar is available +* Kafka topics +* PostgreSQL databases and tables +* AWS resources -For more information, visit the [network mapper repository](https://github.com/otterize/network-mapper#about) +Out of the box, only pod-to-pod, Internet egress traffic and Istio traffic is collected. To enable the rest, see the tutorials. -### Credential operator +This information can then be viewed as a graph, exported textually, or used to automatically generate ClientIntents, a resource used with the intents operator. -Once Otterize is installed into a cluster, it [resolves a service name](https://github.com/otterize/credentials-operator#service-name-resolution-and-automatic-pod-labeling) for each pod and registers it with either Otterize Cloud or a SPIRE server. Once registered, pods can use the credential operator to generate various secrets/credentials for mTLS or credential-based access to services like PostgreSQL, Kafka, or other connections. +:::danger +TODO +Let's keep people in the docs if they're here, don't send them away to the repo. The repo should be standalone for some basic explanations, then refer to the docs. +::: +For more information, visit the [network mapper reference page](/reference/configuration/network-mapper). +### Credentials operator + +The credentials operator handles the provisioning just-in-time credentials for workloads to authenticate. It can issue mTLS credentials or database username + passwords as Kubernetes Secrets, or create AWS IAM roles. To learn about each of these, check the respective tutorials. + +:::danger +TODO +Let's keep people in the docs if they're here, don't send them away to the repo. The repo should be standalone for some basic explanations, then refer to the docs. (see network mapper) +::: For more information, visit the [credential operator repository](https://github.com/otterize/credentials-operator#about) ### Intents operator -The Otterize intents operator is a tool to network and service access policy creation straightforward. The intents operator uses a declarative policy syntax called Intent-Based Access Control (IBAC) to connect services. IBAC policies allow you to specify a caller and the type of access they should be provided. The intents operator then generates and applies the appropriate service-specific policy (IAM, ACL, NetworkPolicy, etc) to enable that defined access. +The intents operator handles the provisioning of just-in-time policies based on the declared ClientIntents of workloads within a cluster. It can manage network policies, Istio authorization policies, AWS IAM policies, PostgreSQL GRANTs, and Kafka ACLs. To learn about each of these, visit the respective tutorial. +The intents operator does not implement its own policies, but instead configures your existing infrastructure's policies to allow the access required by each workload. This means that it does not ever see your data. +:::danger +TODO +Let's keep people in the docs if they're here, don't send them away to the repo. The repo should be standalone for some basic explanations, then refer to the docs. (see network mapper) +::: For more information, visit the [intents operator repository](https://github.com/otterize/intents-operator#about) diff --git a/docs/reference/configuration/credentials-operator/README.mdx b/docs/reference/configuration/credentials-operator/README.mdx index 8efd28c35..2c0a1f329 100644 --- a/docs/reference/configuration/credentials-operator/README.mdx +++ b/docs/reference/configuration/credentials-operator/README.mdx @@ -3,7 +3,7 @@ sidebar_position: 3 title: Credentials operator --- -The Otterize credentials operator automatically resolves pods to dev-friendly service names and provisions credentials (certificates) for the services from cert-manager, Otterize Cloud or SPIRE as Kubernetes Secrets. +The credentials operator provisions just-in-time credentials for workloads running on Kubernetes. These credentials come in the form of Kubernetes Secrets (mTLS certificates, database username + passwords), or AWS IAM roles. ## Deploying the credentials operator To deploy the operator, [use the Helm chart](/reference/configuration/credentials-operator/helm-chart). @@ -11,34 +11,41 @@ To deploy the operator, [use the Helm chart](/reference/configuration/credential To deploy with Otterize Cloud as the certificate provider, we recommend you [follow the instructions in Otterize Cloud](https://app.otterize.com/). To deploy with cert-manager as the certificate provider, you must also [configure the Issuer name and whether it should look for a ClusterIssuer or an Issuer (namespace-scoped)](/reference/configuration/credentials-operator/helm-chart#cert-manager-parameters). -## Acquiring mTLS credentials using the credentials operator -The credentials operator is controlled using annotations placed on pods. To have it provision credentials and place them in Secrets, you must specify `credentials-operator.otterize.com/tls-secret-name`. +## Provisioning AWS IAM roles using the credentials operator +The credentials operator is controlled using annotations placed on pods. To have it provision an AWS IAM role, you must specify the pod annotation `credentials-operator.otterize.com/create-aws-role`, with the value being `true`. Once you do so, the credentials operator will provision an AWS IAM role, and automatically bind it with the Kubernetes ServiceAccount of the pod by setting the EKS role ARN annotation on the ServiceAccount and the appropriate Trust Relationship on the AWS IAM role. -## How does the credentials operator provision credentials? +## Provisioning mTLS certificates using the credentials operator +The credentials operator is controlled using annotations placed on pods. To have it provision certificates and place them in Secrets, you must specify the pod annotation `credentials-operator.otterize.com/tls-secret-name`, with the value being the name of the secret. Once you do so, the credentials operator will provision a certificate for the pod, using Otterize Cloud, cert-manager or SPIRE, depending how you've deployed it. + +## Provisioning database username + password using the credentials operator +The credentials operator is controlled using annotations placed on pods. To have it provision database username + password and place them in Secrets, you must specify the pod annotation `credentials-operator.otterize.com/user-password-secret-name`, with the value being the name of the secret. Once you do so, the credentials operator will provision a username and password for the pod. + + +### How does the credentials operator provision certificates? The credentials operator performs two steps in order to issue certificates. -### Step 1: SPIRE entry registration +#### Step 1: SPIRE entry registration This step only happens if the operator is configured to use SPIRE for certificate generation. Once the operator [resolves the service name](#service-name-resolution-and-automatic-pod-labeling) for a pod, it labels the pod so that SPIRE can find it, and registers an entry with the SPIRE server for that label. -### Step 2: Certificate generation +#### Step 2: Certificate generation The operator consults the annotation `credentials-operator.otterize.com/tls-secret-name`. If that annotation exists, the operator creates a secret named after the value of the label. That secret contains X.509 credentials within, provided by cert-manager, Otterize Cloud or SPIRE, depending on how the credentials operator is configured. -#### cert-manager +##### cert-manager The operator creates a cert-manager [`Certificate`](https://cert-manager.io/docs/usage/certificate/) resource, which will create a Kubernetes Secret with the name specified by the value of the annotation `credentials-operator.otterize.com/tls-secret-name`. The common name and DNS names in the certificate are values that represent the identity of the service, as resolved by the [service identity resolution algorithm](#3-service-name-resolution-and-automatic-pod-labeling), i.e. `servicename.namespace`. The operator will use a [`ClusterIssuer`](https://cert-manager.io/docs/concepts/issuer/) or an [`Issuer`](https://cert-manager.io/docs/concepts/issuer/) to create the Certificate resource, which it expects to find in the same namespace as the `Pod` with the annotation. The `Issuer` is configured at deploy time, using the [Helm chart](/reference/configuration/credentials-operator/helm-chart). In the event that the default approver controller in `cert-manager` is [disabled](https://cert-manager.io/docs/concepts/certificaterequest/#approver-controller), the credentials operator can auto-approve its own [`CertificateRequests`](https://cert-manager.io/docs/concepts/certificaterequest/). Enable this capability by [configuring the Helm chart `autoApprove` flag](/reference/configuration/credentials-operator/helm-chart#cert-manager-parameters). -#### Otterize Cloud +##### Otterize Cloud The operator requests certificates from Otterize Cloud, which internally manages them in Hashicorp Vault. The certificates are then placed within a Kubernetes Secret named with the value of the annotation `credentials-operator.otterize.com/tls-secret-name`. -#### SPIRE +##### SPIRE Once the operator has registered the pod with SPIRE, which happens automatically for a pod that has the `credentials-operator.otterize.com/tls-secret-name` annotation upon pod startup. The credentials operator then acquires the SVID and certificates for the CA chain and places them within a Kubernetes Secret. The SVID and DNS names in the certificate is the identity of the service, as resolved by the [service identity resolution algorithm](#3-service-name-resolution-and-automatic-pod-labeling), i.e. `servicename.namespace`. ## SPIRE workload registrar -When using SPIRE, the operator registers every pod with the SPIRE server (even those without annotations). +When deployed with a SPIRE server, the operator registers every pod with the SPIRE server (even those without annotations). Alongside the credentials operator, you could use SPIRE agents and the SPIRE SDK to work with the same SPIRE server. To learn more, check out the documentation for [SPIRE](https://spiffe.io/docs/latest/spire-about/spire-concepts/). Note that to use the credentials operator, you do not need to work directly with SPIRE or SPIRE agents, and can do everything completely using annotations and Kubernetes Secrets. diff --git a/yarn.lock b/yarn.lock index dd4fda918..9bb583314 100644 --- a/yarn.lock +++ b/yarn.lock @@ -84,7 +84,7 @@ "@algolia/requester-common" "4.20.0" "@algolia/transporter" "4.20.0" -"@algolia/client-search@>= 4.9.1 < 6", "@algolia/client-search@4.20.0": +"@algolia/client-search@4.20.0": version "4.20.0" resolved "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.20.0.tgz" integrity sha512-zgwqnMvhWLdpzKTpd3sGmMlr4c+iS7eyyLGiaO51zDZWGMkpgoNVmltkzdBwxOVXz0RsFMznIxB9zuarUv4TZg== @@ -164,28 +164,7 @@ resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz" integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== -"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.0.0-0 || ^8.0.0-0 <8.0.0", "@babel/core@^7.12.0", "@babel/core@^7.13.0", "@babel/core@^7.18.6", "@babel/core@^7.19.6", "@babel/core@^7.4.0 || ^8.0.0-0 <8.0.0": - version "7.23.9" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz" - integrity sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.23.5" - "@babel/generator" "^7.23.6" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helpers" "^7.23.9" - "@babel/parser" "^7.23.9" - "@babel/template" "^7.23.9" - "@babel/traverse" "^7.23.9" - "@babel/types" "^7.23.9" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - -"@babel/core@^7.11.6", "@babel/core@7.12.9": +"@babel/core@7.12.9": version "7.12.9" resolved "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz" integrity sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ== @@ -207,6 +186,27 @@ semver "^5.4.1" source-map "^0.5.0" +"@babel/core@^7.18.6", "@babel/core@^7.19.6": + version "7.23.9" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz" + integrity sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.6" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helpers" "^7.23.9" + "@babel/parser" "^7.23.9" + "@babel/template" "^7.23.9" + "@babel/traverse" "^7.23.9" + "@babel/types" "^7.23.9" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + "@babel/generator@^7.12.5", "@babel/generator@^7.18.7", "@babel/generator@^7.23.6": version "7.23.6" resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz" @@ -329,16 +329,16 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz" - integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== - "@babel/helper-plugin-utils@7.10.4": version "7.10.4" resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz" integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + "@babel/helper-remap-async-to-generator@^7.22.20", "@babel/helper-remap-async-to-generator@^7.22.5": version "7.22.20" resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz" @@ -518,13 +518,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz" - integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-jsx@7.12.1": version "7.12.1" resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz" @@ -532,6 +525,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-syntax-jsx@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz" + integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" @@ -553,7 +553,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3", "@babel/plugin-syntax-object-rest-spread@7.8.3": +"@babel/plugin-syntax-object-rest-spread@7.8.3", "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": 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== @@ -1257,7 +1257,7 @@ "@docsearch/css" "3.5.2" algoliasearch "^4.19.1" -"@docusaurus/core@^2.0.0-beta.5", "@docusaurus/core@^2.4.3", "@docusaurus/core@2.4.3": +"@docusaurus/core@2.4.3", "@docusaurus/core@^2.0.0-beta.5", "@docusaurus/core@^2.4.3": version "2.4.3" resolved "https://registry.npmjs.org/@docusaurus/core/-/core-2.4.3.tgz" integrity sha512-dWH5P7cgeNSIg9ufReX6gaCl/TmrGKD38Orbwuz05WPhAQtFXHd5B8Qym1TiXfvUNvwoYKkAJOJuGe8ou0Z7PA== @@ -1375,7 +1375,7 @@ url-loader "^4.1.1" webpack "^5.73.0" -"@docusaurus/module-type-aliases@^2.4.3", "@docusaurus/module-type-aliases@2.4.3": +"@docusaurus/module-type-aliases@2.4.3", "@docusaurus/module-type-aliases@^2.4.3": version "2.4.3" resolved "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.4.3.tgz" integrity sha512-cwkBkt1UCiduuvEAo7XZY01dJfRn7UR/75mBgOdb1hKknhrabJZ8YH+7savd/y9kLExPyrhe0QwdS9GuzsRRIA== @@ -1484,7 +1484,7 @@ "@docusaurus/utils-validation" "2.4.3" tslib "^2.4.0" -"@docusaurus/plugin-google-gtag@^2.4.3", "@docusaurus/plugin-google-gtag@2.4.3": +"@docusaurus/plugin-google-gtag@2.4.3", "@docusaurus/plugin-google-gtag@^2.4.3": version "2.4.3" resolved "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.4.3.tgz" integrity sha512-5FMg0rT7sDy4i9AGsvJC71MQrqQZwgLNdDetLEGDHLfSHLvJhQbTCUGbGXknUgWXQJckcV/AILYeJy+HhxeIFA== @@ -1538,7 +1538,7 @@ "@docusaurus/theme-search-algolia" "2.4.3" "@docusaurus/types" "2.4.3" -"@docusaurus/react-loadable@5.5.2": +"@docusaurus/react-loadable@5.5.2", "react-loadable@npm:@docusaurus/react-loadable@5.5.2": version "5.5.2" resolved "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz" integrity sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ== @@ -1599,7 +1599,7 @@ use-sync-external-store "^1.2.0" utility-types "^3.10.0" -"@docusaurus/theme-search-algolia@^2.4.3", "@docusaurus/theme-search-algolia@2.4.3": +"@docusaurus/theme-search-algolia@2.4.3", "@docusaurus/theme-search-algolia@^2.4.3": version "2.4.3" resolved "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.4.3.tgz" integrity sha512-jziq4f6YVUB5hZOB85ELATwnxBz/RmSLD3ksGQOLDPKVzat4pmI8tddNWtriPpxR04BNT+ZfpPUMFkNFetSW1Q== @@ -1629,7 +1629,7 @@ fs-extra "^10.1.0" tslib "^2.4.0" -"@docusaurus/types@*", "@docusaurus/types@^2.0.0-beta.5", "@docusaurus/types@2.4.3": +"@docusaurus/types@2.4.3", "@docusaurus/types@^2.0.0-beta.5": version "2.4.3" resolved "https://registry.npmjs.org/@docusaurus/types/-/types-2.4.3.tgz" integrity sha512-W6zNLGQqfrp/EoPD0bhb9n7OobP+RHpmvVzpA+Z/IuU3Q63njJM24hmT0GYboovWcDtFmnIJC9wcyx4RVPQscw== @@ -1661,7 +1661,7 @@ js-yaml "^4.1.0" tslib "^2.4.0" -"@docusaurus/utils@^2.0.0-beta.5", "@docusaurus/utils@2.4.3": +"@docusaurus/utils@2.4.3", "@docusaurus/utils@^2.0.0-beta.5": version "2.4.3" resolved "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.4.3.tgz" integrity sha512-fKcXsjrD86Smxv8Pt0TBFqYieZZCPh4cbf9oszUq/AMhZn3ujwpKaVYZACPX8mmjtYx0JOgNx52CREBfiGQB4A== @@ -1785,14 +1785,6 @@ resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.20" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz" - integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - "@jridgewell/trace-mapping@0.3.9": version "0.3.9" resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" @@ -1801,6 +1793,14 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.20" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz" + integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + "@leichtgewicht/ip-codec@^2.0.1": version "2.0.4" resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz" @@ -1864,7 +1864,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -1907,16 +1907,16 @@ resolved "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz" integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== -"@sinclair/typebox@^0.27.8": - version "0.27.8" - resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz" - integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== - "@sinclair/typebox@0.25.24": version "0.25.24" resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz" integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + "@sindresorhus/is@^0.14.0": version "0.14.0" resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz" @@ -1985,7 +1985,7 @@ "@svgr/babel-plugin-transform-react-native-svg" "^6.5.1" "@svgr/babel-plugin-transform-svg-component" "^6.5.1" -"@svgr/core@*", "@svgr/core@^6.0.0", "@svgr/core@^6.5.1": +"@svgr/core@^6.5.1": version "6.5.1" resolved "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz" integrity sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw== @@ -2244,16 +2244,16 @@ dependencies: undici-types "~5.26.4" -"@types/node@^17.0.5": - version "17.0.45" - resolved "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz" - integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== - "@types/node@14.18.33": version "14.18.33" resolved "https://registry.npmjs.org/@types/node/-/node-14.18.33.tgz" integrity sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg== +"@types/node@^17.0.5": + version "17.0.45" + resolved "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz" + integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== + "@types/parse-json@^4.0.0": version "4.0.0" resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz" @@ -2305,7 +2305,7 @@ "@types/history" "^4.7.11" "@types/react" "*" -"@types/react@*", "@types/react@>= 16.8.0 < 19.0.0": +"@types/react@*": version "18.2.37" resolved "https://registry.npmjs.org/@types/react/-/react-18.2.37.tgz" integrity sha512-RGAYMi2bhRgEXT3f4B92WTohopH6bIXw05FuGlmJEnv/omEn190+QYEIYxIAuIBdKgboYYdVved2p1AxZVQnaw== @@ -2559,7 +2559,7 @@ json-schema-to-ts "1.6.4" ts-morph "12.0.0" -"@webassemblyjs/ast@^1.11.5", "@webassemblyjs/ast@1.11.6": +"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": version "1.11.6" resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz" integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== @@ -2660,7 +2660,7 @@ "@webassemblyjs/wasm-gen" "1.11.6" "@webassemblyjs/wasm-parser" "1.11.6" -"@webassemblyjs/wasm-parser@^1.11.5", "@webassemblyjs/wasm-parser@1.11.6": +"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": version "1.11.6" resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz" integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== @@ -2718,7 +2718,7 @@ acorn-walk@^8.0.0, acorn-walk@^8.1.1: resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn@^8, acorn@^8.0.4, acorn@^8.4.1, acorn@^8.6.0, acorn@^8.7.1, acorn@^8.8.2: +acorn@^8.0.4, acorn@^8.4.1, acorn@^8.6.0, acorn@^8.7.1, acorn@^8.8.2: version "8.11.2" resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz" integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== @@ -2762,7 +2762,17 @@ ajv-keywords@^5.1.0: dependencies: fast-deep-equal "^3.1.3" -ajv@^6.0.0, ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: +ajv@8.6.3: + version "8.6.3" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz" + integrity sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ajv@^6.0.0, ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: version "6.12.6" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -2772,7 +2782,7 @@ ajv@^6.0.0, ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.8.2, ajv@^8.9.0: +ajv@^8.0.0, ajv@^8.9.0: version "8.12.0" resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== @@ -2782,16 +2792,6 @@ ajv@^8.0.0, ajv@^8.8.2, ajv@^8.9.0: require-from-string "^2.0.2" uri-js "^4.2.2" -ajv@8.6.3: - version "8.6.3" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz" - integrity sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - algoliasearch-helper@^3.10.0: version "3.15.0" resolved "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.15.0.tgz" @@ -2799,7 +2799,7 @@ algoliasearch-helper@^3.10.0: dependencies: "@algolia/events" "^4.0.1" -algoliasearch@^4.13.1, algoliasearch@^4.19.1, "algoliasearch@>= 3.1 < 6", "algoliasearch@>= 4.9.1 < 6": +algoliasearch@^4.13.1, algoliasearch@^4.19.1: version "4.20.0" resolved "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.20.0.tgz" integrity sha512-y+UHEjnOItoNy0bYO+WWmLWBlPwDjKHW6mNHrPi0NkuhpQOOEbrkwQH/wgKFDLh7qlKjzoKeiRtlpewDPDG23g== @@ -2886,6 +2886,11 @@ are-we-there-yet@^2.0.0: delegates "^1.0.0" readable-stream "^3.6.0" +arg@4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/arg/-/arg-4.1.0.tgz" + integrity sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg== + arg@^4.1.0: version "4.1.3" resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" @@ -2896,11 +2901,6 @@ arg@^5.0.0, arg@^5.0.2: resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== -arg@4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/arg/-/arg-4.1.0.tgz" - integrity sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg== - argparse@^1.0.7: version "1.0.10" resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" @@ -2913,16 +2913,16 @@ argparse@^2.0.1: resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -array-flatten@^2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz" - integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== - array-flatten@1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== +array-flatten@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + array-union@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" @@ -3146,7 +3146,7 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.22.1, browserslist@^4.22.2, "browserslist@>= 4.21.0": +browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.22.1, browserslist@^4.22.2: version "4.22.3" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz" integrity sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A== @@ -3215,7 +3215,7 @@ camel-case@^4.1.2: pascal-case "^3.1.2" tslib "^2.0.3" -camelcase-css@^2.0.1, camelcase-css@2.0.1: +camelcase-css@2.0.1, camelcase-css@^2.0.1: 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== @@ -3302,21 +3302,6 @@ cheerio@^1.0.0-rc.12: parse5 "^7.0.0" parse5-htmlparser2-tree-adapter "^7.0.0" -chokidar@^3.4.2, chokidar@^3.5.3: - version "3.5.3" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - 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" - optionalDependencies: - fsevents "~2.3.2" - chokidar@3.3.1: version "3.3.1" resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz" @@ -3332,6 +3317,21 @@ chokidar@3.3.1: optionalDependencies: fsevents "~2.1.2" +chokidar@^3.4.2, chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + 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" + optionalDependencies: + fsevents "~2.3.2" + chownr@^1.1.4: version "1.1.4" resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz" @@ -3433,16 +3433,16 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - color-name@1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + color-support@^1.1.2: version "1.1.3" resolved "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz" @@ -3562,16 +3562,16 @@ content-disposition@0.5.4: dependencies: safe-buffer "5.2.1" -content-type@~1.0.4: - version "1.0.5" - resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" - integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== - content-type@1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== +content-type@~1.0.4: + version "1.0.5" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + convert-hrtime@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-3.0.0.tgz" @@ -3838,35 +3838,14 @@ csstype@^3.0.2: resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz" integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== -debug@^2.6.0, debug@2.6.9: +debug@2.6.9, debug@^2.6.0: 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" -debug@^4.1.0: - version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@^4.1.1: - version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@^4.3.1: - version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@4: +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: version "4.3.4" resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -3951,16 +3930,16 @@ delegates@^1.0.0: resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" - integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== - depd@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + destroy@1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" @@ -4093,16 +4072,7 @@ domhandler@^5.0.2, domhandler@^5.0.3: dependencies: domelementtype "^2.3.0" -domutils@^2.5.2: - 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" - -domutils@^2.8.0: +domutils@^2.5.2, domutils@^2.8.0: version "2.8.0" resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz" integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== @@ -4135,16 +4105,16 @@ dot-prop@^5.2.0: dependencies: is-obj "^2.0.0" -duplexer@^0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz" - integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== - duplexer3@^0.1.4: version "0.1.5" resolved "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz" integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== +duplexer@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + eastasianwidth@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" @@ -4244,26 +4214,121 @@ es-module-lexer@^1.2.1: resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz" integrity sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q== +esbuild-android-64@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.47.tgz#ef95b42c67bcf4268c869153fa3ad1466c4cea6b" + integrity sha512-R13Bd9+tqLVFndncMHssZrPWe6/0Kpv2/dt4aA69soX4PRxlzsVpCvoJeFE8sOEoeVEiBkI0myjlkDodXlHa0g== + +esbuild-android-arm64@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.47.tgz#4ebd7ce9fb250b4695faa3ee46fd3b0754ecd9e6" + integrity sha512-OkwOjj7ts4lBp/TL6hdd8HftIzOy/pdtbrNA4+0oVWgGG64HrdVzAF5gxtJufAPOsEjkyh1oIYvKAUinKKQRSQ== + +esbuild-darwin-64@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.47.tgz#e0da6c244f497192f951807f003f6a423ed23188" + integrity sha512-R6oaW0y5/u6Eccti/TS6c/2c1xYTb1izwK3gajJwi4vIfNs1s8B1dQzI1UiC9T61YovOQVuePDcfqHLT3mUZJA== + esbuild-darwin-arm64@0.14.47: version "0.14.47" resolved "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.47.tgz" integrity sha512-seCmearlQyvdvM/noz1L9+qblC5vcBrhUaOoLEDDoLInF/VQ9IkobGiLlyTPYP5dW1YD4LXhtBgOyevoIHGGnw== -esbuild@0.14.47: +esbuild-freebsd-64@0.14.47: version "0.14.47" - resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.14.47.tgz" - integrity sha512-wI4ZiIfFxpkuxB8ju4MHrGwGLyp1+awEHAHVpx6w7a+1pmYIq8T9FGEVVwFo0iFierDoMj++Xq69GXWYn2EiwA== - optionalDependencies: - esbuild-android-64 "0.14.47" - esbuild-android-arm64 "0.14.47" - esbuild-darwin-64 "0.14.47" - esbuild-darwin-arm64 "0.14.47" - esbuild-freebsd-64 "0.14.47" - esbuild-freebsd-arm64 "0.14.47" - esbuild-linux-32 "0.14.47" - esbuild-linux-64 "0.14.47" - esbuild-linux-arm "0.14.47" - esbuild-linux-arm64 "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.47.tgz#8da6a14c095b29c01fc8087a16cb7906debc2d67" + integrity sha512-ZH8K2Q8/Ux5kXXvQMDsJcxvkIwut69KVrYQhza/ptkW50DC089bCVrJZZ3sKzIoOx+YPTrmsZvqeZERjyYrlvQ== + +esbuild-freebsd-arm64@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.47.tgz#ad31f9c92817ff8f33fd253af7ab5122dc1b83f6" + integrity sha512-ZJMQAJQsIOhn3XTm7MPQfCzEu5b9STNC+s90zMWe2afy9EwnHV7Ov7ohEMv2lyWlc2pjqLW8QJnz2r0KZmeAEQ== + +esbuild-linux-32@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.47.tgz#de085e4db2e692ea30c71208ccc23fdcf5196c58" + integrity sha512-FxZOCKoEDPRYvq300lsWCTv1kcHgiiZfNrPtEhFAiqD7QZaXrad8LxyJ8fXGcWzIFzRiYZVtB3ttvITBvAFhKw== + +esbuild-linux-64@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.47.tgz#2a9321bbccb01f01b04cebfcfccbabeba3658ba1" + integrity sha512-nFNOk9vWVfvWYF9YNYksZptgQAdstnDCMtR6m42l5Wfugbzu11VpMCY9XrD4yFxvPo9zmzcoUL/88y0lfJZJJw== + +esbuild-linux-arm64@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.47.tgz#b9da7b6fc4b0ca7a13363a0c5b7bb927e4bc535a" + integrity sha512-ywfme6HVrhWcevzmsufjd4iT3PxTfCX9HOdxA7Hd+/ZM23Y9nXeb+vG6AyA6jgq/JovkcqRHcL9XwRNpWG6XRw== + +esbuild-linux-arm@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.47.tgz#56fec2a09b9561c337059d4af53625142aded853" + integrity sha512-ZGE1Bqg/gPRXrBpgpvH81tQHpiaGxa8c9Rx/XOylkIl2ypLuOcawXEAo8ls+5DFCcRGt/o3sV+PzpAFZobOsmA== + +esbuild-linux-mips64le@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.47.tgz#9db21561f8f22ed79ef2aedb7bbef082b46cf823" + integrity sha512-mg3D8YndZ1LvUiEdDYR3OsmeyAew4MA/dvaEJxvyygahWmpv1SlEEnhEZlhPokjsUMfRagzsEF/d/2XF+kTQGg== + +esbuild-linux-ppc64le@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.47.tgz#dc3a3da321222b11e96e50efafec9d2de408198b" + integrity sha512-WER+f3+szmnZiWoK6AsrTKGoJoErG2LlauSmk73LEZFQ/iWC+KhhDsOkn1xBUpzXWsxN9THmQFltLoaFEH8F8w== + +esbuild-linux-riscv64@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.47.tgz#9bd6dcd3dca6c0357084ecd06e1d2d4bf105335f" + integrity sha512-1fI6bP3A3rvI9BsaaXbMoaOjLE3lVkJtLxsgLHqlBhLlBVY7UqffWBvkrX/9zfPhhVMd9ZRFiaqXnB1T7BsL2g== + +esbuild-linux-s390x@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.47.tgz#a458af939b52f2cd32fc561410d441a51f69d41f" + integrity sha512-eZrWzy0xFAhki1CWRGnhsHVz7IlSKX6yT2tj2Eg8lhAwlRE5E96Hsb0M1mPSE1dHGpt1QVwwVivXIAacF/G6mw== + +esbuild-netbsd-64@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.47.tgz#6388e785d7e7e4420cb01348d7483ab511b16aa8" + integrity sha512-Qjdjr+KQQVH5Q2Q1r6HBYswFTToPpss3gqCiSw2Fpq/ua8+eXSQyAMG+UvULPqXceOwpnPo4smyZyHdlkcPppQ== + +esbuild-openbsd-64@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.47.tgz#309af806db561aa886c445344d1aacab850dbdc5" + integrity sha512-QpgN8ofL7B9z8g5zZqJE+eFvD1LehRlxr25PBkjyyasakm4599iroUpaj96rdqRlO2ShuyqwJdr+oNqWwTUmQw== + +esbuild-sunos-64@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.47.tgz#3f19612dcdb89ba6c65283a7ff6e16f8afbf8aaa" + integrity sha512-uOeSgLUwukLioAJOiGYm3kNl+1wJjgJA8R671GYgcPgCx7QR73zfvYqXFFcIO93/nBdIbt5hd8RItqbbf3HtAQ== + +esbuild-windows-32@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.47.tgz#a92d279c8458d5dc319abcfeb30aa49e8f2e6f7f" + integrity sha512-H0fWsLTp2WBfKLBgwYT4OTfFly4Im/8B5f3ojDv1Kx//kiubVY0IQunP2Koc/fr/0wI7hj3IiBDbSrmKlrNgLQ== + +esbuild-windows-64@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.47.tgz#2564c3fcf0c23d701edb71af8c52d3be4cec5f8a" + integrity sha512-/Pk5jIEH34T68r8PweKRi77W49KwanZ8X6lr3vDAtOlH5EumPE4pBHqkCUdELanvsT14yMXLQ/C/8XPi1pAtkQ== + +esbuild-windows-arm64@0.14.47: + version "0.14.47" + resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.47.tgz#86d9db1a22d83360f726ac5fba41c2f625db6878" + integrity sha512-HFSW2lnp62fl86/qPQlqw6asIwCnEsEoNIL1h2uVMgakddf+vUuMcCbtUY1i8sst7KkgHrVKCJQB33YhhOweCQ== + +esbuild@0.14.47: + version "0.14.47" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.14.47.tgz" + integrity sha512-wI4ZiIfFxpkuxB8ju4MHrGwGLyp1+awEHAHVpx6w7a+1pmYIq8T9FGEVVwFo0iFierDoMj++Xq69GXWYn2EiwA== + optionalDependencies: + esbuild-android-64 "0.14.47" + esbuild-android-arm64 "0.14.47" + esbuild-darwin-64 "0.14.47" + esbuild-darwin-arm64 "0.14.47" + esbuild-freebsd-64 "0.14.47" + esbuild-freebsd-arm64 "0.14.47" + esbuild-linux-32 "0.14.47" + esbuild-linux-64 "0.14.47" + esbuild-linux-arm "0.14.47" + esbuild-linux-arm64 "0.14.47" esbuild-linux-mips64le "0.14.47" esbuild-linux-ppc64le "0.14.47" esbuild-linux-riscv64 "0.14.47" @@ -4330,7 +4395,7 @@ estraverse@^5.2.0: resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== -estree-walker@^2.0.1, estree-walker@2.0.2: +estree-walker@2.0.2, estree-walker@^2.0.1: version "2.0.2" resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz" integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== @@ -4345,7 +4410,7 @@ eta@^2.0.0: resolved "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz" integrity sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g== -etag@~1.8.1, etag@1.8.1: +etag@1.8.1, etag@~1.8.1: version "1.8.1" resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== @@ -4373,21 +4438,6 @@ events@^3.2.0: resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -execa@^5.0.0: - 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" - execa@3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/execa/-/execa-3.2.0.tgz" @@ -4404,6 +4454,21 @@ execa@3.2.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" +execa@^5.0.0: + 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" + express@^4.17.3: version "4.18.2" resolved "https://registry.npmjs.org/express/-/express-4.18.2.tgz" @@ -4534,7 +4599,7 @@ feed@^4.2.2: dependencies: xml-js "^1.6.11" -file-loader@*, file-loader@^6.2.0: +file-loader@^6.2.0: version "6.2.0" resolved "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz" integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== @@ -4656,6 +4721,24 @@ fresh@0.5.2: resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== +fs-extra@11.1.0: + version "11.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz" + integrity sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@8.1.0: + version "8.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-extra@^10.0.0, fs-extra@^10.1.0: version "10.1.0" resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz" @@ -4675,24 +4758,6 @@ fs-extra@^9.0.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@11.1.0: - version "11.1.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz" - integrity sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-extra@8.1.0: - version "8.1.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - fs-minipass@^1.2.7: version "1.2.7" resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz" @@ -4779,14 +4844,7 @@ get-stream@^4.1.0: dependencies: pump "^3.0.0" -get-stream@^5.0.0: - version "5.2.0" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - -get-stream@^5.1.0: +get-stream@^5.0.0, get-stream@^5.1.0: version "5.2.0" resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== @@ -4810,14 +4868,7 @@ glob-parent@^5.1.2, glob-parent@~5.1.0, glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" -glob-parent@^6.0.1: - 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" - -glob-parent@^6.0.2: +glob-parent@^6.0.1, glob-parent@^6.0.2: version "6.0.2" resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== @@ -4829,27 +4880,27 @@ glob-to-regexp@^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== -glob@^7.0.0, glob@^7.1.3, glob@^7.1.6: - version "7.2.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== +glob@7.1.6: + version "7.1.6" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.1.1" + minimatch "^3.0.4" once "^1.3.0" path-is-absolute "^1.0.0" -glob@7.1.6: - version "7.1.6" - resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== +glob@^7.0.0, glob@^7.1.3, glob@^7.1.6: + 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.0.4" + minimatch "^3.1.1" once "^1.3.0" path-is-absolute "^1.0.0" @@ -5175,24 +5226,6 @@ http-deceiver@^1.2.7: resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz" integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== -http-errors@~1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.4.0.tgz" - integrity sha512-oLjPqve1tuOl5aRhv8GK5eHpqP1C9fb+Ol+XTLjKfLltE44zdDbEdjPSbU7Ch5rSNsVFqZn97SrMmZLdu1/YMw== - dependencies: - inherits "2.0.1" - statuses ">= 1.2.1 < 2" - -http-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" - integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - http-errors@1.7.3: version "1.7.3" resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz" @@ -5215,6 +5248,24 @@ http-errors@2.0.0: statuses "2.0.1" toidentifier "1.0.1" +http-errors@~1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.4.0.tgz" + integrity sha512-oLjPqve1tuOl5aRhv8GK5eHpqP1C9fb+Ol+XTLjKfLltE44zdDbEdjPSbU7Ch5rSNsVFqZn97SrMmZLdu1/YMw== + dependencies: + inherits "2.0.1" + statuses ">= 1.2.1 < 2" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + http-parser-js@>=0.5.1: version "0.5.8" resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz" @@ -5323,7 +5374,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3, inherits@2, inherits@2.0.4: +inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -5338,16 +5389,16 @@ inherits@2.0.3: resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== -ini@^1.3.5, ini@~1.3.0: - version "1.3.8" - resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - ini@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz" integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== +ini@^1.3.5, ini@~1.3.0: + version "1.3.8" + resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + inline-style-parser@0.1.1: version "0.1.1" resolved "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz" @@ -5365,17 +5416,17 @@ invariant@^2.2.4: dependencies: loose-envify "^1.0.0" -ipaddr.js@^2.0.1: - version "2.1.0" - resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz" - integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ== - ipaddr.js@1.9.1: 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== -is-alphabetical@^1.0.0, is-alphabetical@1.0.4: +ipaddr.js@^2.0.1: + version "2.1.0" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz" + integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ== + +is-alphabetical@1.0.4, is-alphabetical@^1.0.0: version "1.0.4" resolved "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz" integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== @@ -5558,16 +5609,16 @@ is-yarn-global@^0.3.0: resolved "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz" integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - isarray@0.0.1: version "0.0.1" resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" @@ -5832,7 +5883,7 @@ lodash.pullall@^4.2.0: resolved "https://registry.npmjs.org/lodash.pullall/-/lodash.pullall-4.2.0.tgz" integrity sha512-VhqxBKH0ZxPpLhiu68YD1KnHmbhQJQctcipvmFnqIBDYzcIHzf3Zpu0tpeOKtR4x76p9yohc506eGdOjTmyIBg== -lodash.uniq@^4.5.0, lodash.uniq@4.5.0: +lodash.uniq@4.5.0, lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== @@ -5994,7 +6045,7 @@ micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: braces "^3.0.2" picomatch "^2.3.1" -"mime-db@>= 1.43.0 < 2", mime-db@1.52.0: +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": version "1.52.0" resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== @@ -6004,26 +6055,19 @@ mime-db@~1.33.0: resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz" integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== -mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.24, mime-types@~2.1.34: - 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" - -mime-types@~2.1.17: +mime-types@2.1.18, mime-types@~2.1.17: 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== dependencies: mime-db "~1.33.0" -mime-types@2.1.18: - 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== +mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.24, mime-types@~2.1.34: + 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.33.0" + mime-db "1.52.0" mime@1.6.0: version "1.6.0" @@ -6052,7 +6096,7 @@ minimalistic-assert@^1.0.0: resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@3.1.2: +minimatch@3.1.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1: version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -6106,12 +6150,7 @@ mkdirp@^0.5.5: dependencies: minimist "^1.2.6" -mkdirp@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -mkdirp@^1.0.4: +mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== @@ -6126,16 +6165,16 @@ mrmime@^1.0.0: resolved "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz" integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== -ms@^2.1.1, ms@2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== - ms@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== +ms@2.1.1, ms@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + ms@2.1.2: version "2.1.2" resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" @@ -6193,13 +6232,6 @@ node-emoji@^1.10.0: dependencies: lodash "^4.17.21" -node-fetch@^2.6.12, node-fetch@^2.6.7: - 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== - dependencies: - whatwg-url "^5.0.0" - node-fetch@2.6.7: version "2.6.7" resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" @@ -6214,6 +6246,13 @@ node-fetch@2.6.9: dependencies: whatwg-url "^5.0.0" +node-fetch@^2.6.12, node-fetch@^2.6.7: + 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== + dependencies: + whatwg-url "^5.0.0" + node-forge@^1: version "1.3.1" resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz" @@ -6570,20 +6609,6 @@ path-parse@^1.0.7: resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-to-regexp@^1.0.0: - version "1.8.0" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz" - integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== - dependencies: - isarray "0.0.1" - -path-to-regexp@^1.7.0: - version "1.8.0" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz" - integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== - dependencies: - isarray "0.0.1" - path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" @@ -6604,6 +6629,13 @@ path-to-regexp@6.2.1: resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz" integrity sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw== +path-to-regexp@^1.0.0, path-to-regexp@^1.7.0: + version "1.8.0" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + dependencies: + isarray "0.0.1" + path-type@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" @@ -6622,7 +6654,7 @@ pend@~1.2.0: resolved "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz" integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== -picocolors@^1.0.0, picocolors@1.0.0: +picocolors@1.0.0, picocolors@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== @@ -6968,7 +7000,7 @@ postcss-zindex@^5.1.0: resolved "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-5.1.0.tgz" integrity sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A== -"postcss@^7.0.0 || ^8.0.1", postcss@^8.0.0, postcss@^8.0.9, postcss@^8.1.0, postcss@^8.2.14, postcss@^8.2.15, postcss@^8.2.2, postcss@^8.3.11, postcss@^8.4.14, postcss@^8.4.16, postcss@^8.4.17, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.31, postcss@>=8.0.9: +postcss@^8.3.11, postcss@^8.4.14, postcss@^8.4.17, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.31: version "8.4.31" resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz" integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== @@ -7122,16 +7154,16 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" -range-parser@^1.2.1, range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - range-parser@1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz" integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A== +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + raw-body@2.4.1: version "2.4.1" resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz" @@ -7152,7 +7184,7 @@ raw-body@2.5.1: iconv-lite "0.4.24" unpipe "1.0.0" -rc@^1.2.8, rc@1.2.8: +rc@1.2.8, rc@^1.2.8: version "1.2.8" resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -7202,7 +7234,7 @@ react-dev-utils@^12.0.1: strip-ansi "^6.0.1" text-table "^0.2.0" -react-dom@*, "react-dom@^16.6.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.8.4 || ^17.0.0", "react-dom@^17.0.0 || ^16.3.0 || ^15.5.4", react-dom@^17.0.2, "react-dom@>= 16.8.0 < 19.0.0": +react-dom@^17.0.2: version "17.0.2" resolved "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz" integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== @@ -7259,14 +7291,6 @@ react-loadable-ssr-addon-v5-slorber@^1.0.1: dependencies: "@babel/runtime" "^7.10.3" -react-loadable@*, "react-loadable@npm:@docusaurus/react-loadable@5.5.2": - 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" - react-router-config@^5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz" @@ -7287,7 +7311,7 @@ react-router-dom@^5.3.3: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react-router@^5.3.3, react-router@>=5, react-router@5.3.4: +react-router@5.3.4, react-router@^5.3.3: version "5.3.4" resolved "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz" integrity sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA== @@ -7311,7 +7335,7 @@ react-textarea-autosize@^8.3.2: use-composed-ref "^1.3.0" use-latest "^1.2.1" -react@*, "react@^15.0.2 || ^16.0.0 || ^17.0.0", "react@^16.13.1 || ^17.0.0", "react@^16.6.0 || ^17.0.0 || ^18.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^16.8.4 || ^17.0.0", "react@^17.0.0 || ^16.3.0 || ^15.5.4", react@^17.0.2, "react@>= 16.8.0 < 19.0.0", react@>=0.14.9, react@>=15, react@17.0.2: +react@^17.0.2: 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== @@ -7608,22 +7632,12 @@ rxjs@^7.5.4: dependencies: tslib "^2.1.0" -safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@>=5.1.0, safe-buffer@~5.1.0, safe-buffer@~5.1.1, safe-buffer@5.1.2: +safe-buffer@5.1.2, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@^5.2.1: - version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@5.2.1: +safe-buffer@5.2.1, safe-buffer@^5.2.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -7646,6 +7660,15 @@ scheduler@^0.20.2: loose-envify "^1.1.0" object-assign "^4.1.1" +schema-utils@2.7.0: + version "2.7.0" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz" + integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== + dependencies: + "@types/json-schema" "^7.0.4" + ajv "^6.12.2" + ajv-keywords "^3.4.1" + schema-utils@^2.6.5: version "2.7.1" resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz" @@ -7655,25 +7678,7 @@ schema-utils@^2.6.5: ajv "^6.12.4" ajv-keywords "^3.5.2" -schema-utils@^3.0.0: - 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== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -schema-utils@^3.1.1: - 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== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -schema-utils@^3.2.0: +schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: 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== @@ -7692,20 +7697,6 @@ schema-utils@^4.0.0: ajv-formats "^2.1.1" ajv-keywords "^5.1.0" -schema-utils@2.7.0: - version "2.7.0" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz" - integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== - dependencies: - "@types/json-schema" "^7.0.4" - ajv "^6.12.2" - ajv-keywords "^3.4.1" - -"search-insights@>= 1 < 3": - version "2.13.0" - resolved "https://registry.npmjs.org/search-insights/-/search-insights-2.13.0.tgz" - integrity sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw== - section-matter@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz" @@ -7734,58 +7725,30 @@ semver-diff@^3.1.1: dependencies: semver "^6.3.0" -semver@^5.4.1: - version "5.7.2" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== - -semver@^6.0.0, semver@^6.2.0, semver@^6.3.0, semver@^6.3.1, semver@6.3.1: +semver@6.3.1, semver@^6.0.0, semver@^6.2.0, semver@^6.3.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.2: - 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" - -semver@^7.3.4: - 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" - -semver@^7.3.5: - version "7.5.4" - resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== +semver@7.3.5: + 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" -semver@^7.3.7: - 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" +semver@^5.4.1: + version "5.7.2" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@^7.3.8: +semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8: 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" -semver@7.3.5: - 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" - send@0.18.0: version "0.18.0" resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz" @@ -7921,16 +7884,16 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: - version "3.0.7" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - signal-exit@4.0.2: version "4.0.2" resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz" integrity sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q== +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: + version "3.0.7" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + sirv@^2.0.3: version "2.0.3" resolved "https://registry.npmjs.org/sirv/-/sirv-2.0.3.tgz" @@ -8050,26 +8013,16 @@ state-toggle@^1.0.0: resolved "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz" integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== -"statuses@>= 1.2.1 < 2": - version "1.5.0" - resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" - integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== - -"statuses@>= 1.4.0 < 2": - version "1.5.0" - resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" - integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== - -"statuses@>= 1.5.0 < 2": - version "1.5.0" - resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" - integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== - statuses@2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== +"statuses@>= 1.2.1 < 2", "statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2": + version "1.5.0" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + std-env@^3.0.1: version "3.4.3" resolved "https://registry.npmjs.org/std-env/-/std-env-3.4.3.tgz" @@ -8091,20 +8044,6 @@ stream-to-promise@2.2.0: end-of-stream "~1.1.0" stream-to-array "~2.3.0" -string_decoder@^1.1.1: - 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== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - 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" - "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" @@ -8123,6 +8062,20 @@ string-width@^5.0.1: emoji-regex "^9.2.2" strip-ansi "^7.0.1" +string_decoder@^1.1.1: + 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== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + 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" + stringify-object@^3.3.0: version "3.3.0" resolved "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz" @@ -8166,7 +8119,7 @@ strip-json-comments@~2.0.1: resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== -style-to-object@^0.3.0, style-to-object@0.3.0: +style-to-object@0.3.0, style-to-object@^0.3.0: version "0.3.0" resolved "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz" integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== @@ -8276,18 +8229,6 @@ tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== -tar@^6.1.11: - version "6.2.0" - resolved "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz" - integrity sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ== - dependencies: - chownr "^2.0.0" - fs-minipass "^2.0.0" - minipass "^5.0.0" - minizlib "^2.1.1" - mkdirp "^1.0.3" - yallist "^4.0.0" - tar@4.4.18: version "4.4.18" resolved "https://registry.npmjs.org/tar/-/tar-4.4.18.tgz" @@ -8301,6 +8242,18 @@ tar@4.4.18: safe-buffer "^5.2.1" yallist "^3.1.1" +tar@^6.1.11: + version "6.2.0" + resolved "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz" + integrity sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^5.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + terser-webpack-plugin@^5.3.3, terser-webpack-plugin@^5.3.7: version "5.3.9" resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz" @@ -8433,7 +8386,7 @@ ts-morph@12.0.0: "@ts-morph/common" "~0.11.0" code-block-writer "^10.1.1" -ts-node@>=9.0.0, ts-node@10.9.1: +ts-node@10.9.1: version "10.9.1" resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz" integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== @@ -8487,7 +8440,7 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typescript@^4.7.4, "typescript@>= 2.7", typescript@>=2.7, typescript@>=4.9.5, typescript@4.9.5: +typescript@4.9.5, typescript@^4.7.4: version "4.9.5" resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz" integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== @@ -8545,10 +8498,10 @@ unicode-property-aliases-ecmascript@^2.0.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== -unified@^9.2.2: - version "9.2.2" - resolved "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz" - integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== +unified@9.2.0: + version "9.2.0" + resolved "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz" + integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg== dependencies: bail "^1.0.0" extend "^3.0.0" @@ -8557,10 +8510,10 @@ unified@^9.2.2: trough "^1.0.0" vfile "^4.0.0" -unified@9.2.0: - version "9.2.0" - resolved "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz" - integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg== +unified@^9.2.2: + 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" extend "^3.0.0" @@ -8576,7 +8529,7 @@ unique-string@^2.0.0: dependencies: crypto-random-string "^2.0.0" -unist-builder@^2.0.0, unist-builder@2.0.3: +unist-builder@2.0.3, unist-builder@^2.0.0: version "2.0.3" resolved "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz" integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== @@ -8625,7 +8578,7 @@ unist-util-visit-parents@^3.0.0: "@types/unist" "^2.0.0" unist-util-is "^4.0.0" -unist-util-visit@^2.0.0, unist-util-visit@^2.0.3, unist-util-visit@2.0.3: +unist-util-visit@2.0.3, unist-util-visit@^2.0.0, unist-util-visit@^2.0.3: 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== @@ -8644,7 +8597,7 @@ universalify@^2.0.0: resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== -unpipe@~1.0.0, unpipe@1.0.0: +unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== @@ -8749,16 +8702,16 @@ utils-merge@1.0.1: resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - uuid@3.3.2: version "3.3.2" resolved "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz" integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + v8-compile-cache-lib@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" @@ -8940,7 +8893,7 @@ webpack-sources@^3.2.2, webpack-sources@^3.2.3: resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== -"webpack@^4.0.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", webpack@^5.0.0, webpack@^5.1.0, webpack@^5.20.0, webpack@^5.73.0, "webpack@>= 4", webpack@>=2, "webpack@>=4.41.1 || 5.x", "webpack@3 || 4 || 5": +webpack@^5.73.0: version "5.89.0" resolved "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz" integrity sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw== @@ -8980,7 +8933,7 @@ webpackbar@^5.0.2: pretty-time "^1.1.0" std-env "^3.0.1" -websocket-driver@^0.7.4, websocket-driver@>=0.5.1: +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: version "0.7.4" resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== From 44cc1f61e845e527f5dee3f47fc87982a1908d7d Mon Sep 17 00:00:00 2001 From: bglynn Date: Mon, 5 Feb 2024 10:28:42 -0800 Subject: [PATCH 12/20] PR Comments. --- docs/getting-started/README.mdx | 11 +++++++---- docs/overview/index.mdx | 16 ++-------------- 2 files changed, 9 insertions(+), 18 deletions(-) diff --git a/docs/getting-started/README.mdx b/docs/getting-started/README.mdx index 6d01004b3..b41620b7a 100644 --- a/docs/getting-started/README.mdx +++ b/docs/getting-started/README.mdx @@ -49,21 +49,25 @@ export const features = [ export const tutorials_access = [ { title: 'Create and manage network policies', + icon: '/img/icons/networking.png', description: 'Create Kubernetes network policies using IBAC', url: '/features/networking/tutorials/k8s-network-policies' }, { title: 'Network policies on AWS EKS', + icon: '/img/icons/networking.png', description: 'Jump start network policies using AWS EKS and VPC CNI', url: '/features/networking/tutorials/aws-eks-cni-mini' }, { title: 'Create and manage Istio authorization policies', + icon: '/img/icons/istio-no-word-mark.svg', description: 'Using Istio and IBAC to secure your K8s cluster', url: '/features/istio/tutorials/k8s-istio-authorization-policies' }, { title: 'Configure secure access for Kafka using Otterize Cloud mTLS', + icon: '/img/icons/kafka-no-word-mark.svg', description: 'Declaring and applying intents to easily secure access to Kafka', url: '/features/kafka/tutorials/k8s-kafka-mtls-cert-manager' } @@ -72,16 +76,19 @@ export const tutorials_access = [ export const tutorials_visualization = [ { title: 'Network mapping a Kubernetes cluster', + icon: '/img/icons/networking.png', description: 'Map pod-to-pod traffic within your K8s cluster', url: '/features/networking/tutorials/k8s-network-mapper' }, { title: 'Istio HTTP-level access mapping', + icon: '/img/icons/istio-no-word-mark.svg', description: 'The network mapper allows you to map pod-to-pod Istio traffic', url: '/features/istio/tutorials/k8s-istio-watcher' }, { title: 'Kafka topic-level access mapping', + icon: '/img/icons/kafka-no-word-mark.svg', description: 'View topic-level access to Kafka servers within your Kubernetes cluster', url: 'features/kafka/tutorials/k8s-kafka-mapping' } @@ -112,10 +119,6 @@ Otterize makes it easy to automate and visualize workload IAM for your Kubernete ### Tutorials #### Automating workload IAM -:::danger -TODO -Add icons to the tutorials, same as the icons we have above. -::: diff --git a/docs/overview/index.mdx b/docs/overview/index.mdx index d495cf554..918680aa0 100644 --- a/docs/overview/index.mdx +++ b/docs/overview/index.mdx @@ -26,29 +26,17 @@ Out of the box, only pod-to-pod, Internet egress traffic and Istio traffic is co This information can then be viewed as a graph, exported textually, or used to automatically generate ClientIntents, a resource used with the intents operator. -:::danger -TODO -Let's keep people in the docs if they're here, don't send them away to the repo. The repo should be standalone for some basic explanations, then refer to the docs. -::: For more information, visit the [network mapper reference page](/reference/configuration/network-mapper). ### Credentials operator The credentials operator handles the provisioning just-in-time credentials for workloads to authenticate. It can issue mTLS credentials or database username + passwords as Kubernetes Secrets, or create AWS IAM roles. To learn about each of these, check the respective tutorials. -:::danger -TODO -Let's keep people in the docs if they're here, don't send them away to the repo. The repo should be standalone for some basic explanations, then refer to the docs. (see network mapper) -::: -For more information, visit the [credential operator repository](https://github.com/otterize/credentials-operator#about) +For more information, visit the [credential operator reference page](/reference/configuration/credentials-operator) ### Intents operator The intents operator handles the provisioning of just-in-time policies based on the declared ClientIntents of workloads within a cluster. It can manage network policies, Istio authorization policies, AWS IAM policies, PostgreSQL GRANTs, and Kafka ACLs. To learn about each of these, visit the respective tutorial. The intents operator does not implement its own policies, but instead configures your existing infrastructure's policies to allow the access required by each workload. This means that it does not ever see your data. -:::danger -TODO -Let's keep people in the docs if they're here, don't send them away to the repo. The repo should be standalone for some basic explanations, then refer to the docs. (see network mapper) -::: -For more information, visit the [intents operator repository](https://github.com/otterize/intents-operator#about) +For more information, visit the [intents operator reference page](reference/configuration/intents-operator) From eaf566a1b4a15e1c1e73a01de0fd49558ed40e52 Mon Sep 17 00:00:00 2001 From: bglynn Date: Tue, 6 Feb 2024 13:34:53 -0800 Subject: [PATCH 13/20] initial draft. --- .../k8s-egress-access-control-tutorial.mdx | 138 ++++++++++++++++++ .../egress-access-control/all.yaml | 57 ++++++++ .../intents-no-external-api.yaml | 21 +++ .../egress-access-control/intents.yaml | 25 ++++ 4 files changed, 241 insertions(+) create mode 100644 docs/features/network-mapping-network-policies/tutorials/k8s-egress-access-control-tutorial.mdx create mode 100644 static/code-examples/egress-access-control/all.yaml create mode 100644 static/code-examples/egress-access-control/intents-no-external-api.yaml create mode 100644 static/code-examples/egress-access-control/intents.yaml diff --git a/docs/features/network-mapping-network-policies/tutorials/k8s-egress-access-control-tutorial.mdx b/docs/features/network-mapping-network-policies/tutorials/k8s-egress-access-control-tutorial.mdx new file mode 100644 index 000000000..5bb4c75bc --- /dev/null +++ b/docs/features/network-mapping-network-policies/tutorials/k8s-egress-access-control-tutorial.mdx @@ -0,0 +1,138 @@ +--- +sidebar_position: 5 +title: Egress Policy Automation +image: /img/visualization/k8s-network-mapper/social.png +--- +Let’s learn how Otterize automates egress access control with network policies + +In this tutorial, we will: + +- Deploy an example cluster consisting of an example frontend for a quiz game and a server with an external dependency to retrieve questions. +- Declare our network intents for each pod, including public internet and internal network egress rules. +- See that a network policy was autogenerated to allow just that and block the (undeclared) calls from the other client. + +## Prerequisites + +### Prepare a Kubernetes cluster + +For this tutorial, we will need a cluster with a network plugin like Calio or Cilium to enforce our policies. If you already have that enable, you can skip to the next step. +
+ Prepare a Kubernetes cluster with Minikube & Calico + + For this tutorial you'll need a local Kubernetes cluster. Having a cluster with a [CNI](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/) that supports [NetworkPolicies](https://kubernetes.io/docs/concepts/services-networking/network-policies/) isn't required for this tutorial, but is recommended so that your cluster works with other tutorials. + + If you don't have the Minikube CLI, first [install it](https://minikube.sigs.k8s.io/docs/start/). + + Then start your Minikube cluster with Calico, in order to enforce network policies. + + ```shell + minikube start --cpus=4 --memory 4096 --disk-size 32g --cni=calico + ``` + +
+ + +### Install Otterize on your cluster +To deploy Otterize, head over to [Otterize Cloud](https://app.otterize.com/), and to integrate your cluster, navigate to the [Clusters page](https://app.otterize.com/clusters) and follow the instructions, but be sure to add the flag below. + +**Note:** Egress policy creation is off by default. We must add the following flag when installing Otterize to enable egress policy creation. +```bash +--set intentsOperator.operator.enableEgressNetworkPolicyCreation=true +``` + +## Tutorial + +### Deploy the cluster + +This will set up the namespace we will use for our tutorial and deploy the cluster containing our front and backend pods. Upon deployment, our cluster will have no network policies in place. + +```yaml +kubectl create namespace otterize-tutorial-egress +kubectl apply -n otterize-tutorial-egress -f ${ABSOLUTE_URL}/code-examples/network-egress/all.yaml +``` + +### About Network Policies + +By default, in Kubernetes, pods are non-isolated. Meaning they accept traffic from any source and can send traffic to any source. When you introduce policies, either ingress or egress pods become isolated. Any connection not explicitly allowed will be rejected. When an ingress policy type is introduced, any traffic that doesn’t match a rule will be rejected. Similarly, when an egress policy type is introduced, any traffic that doesn’t match a rule will not be allowed out of the pod. + +Problems can arise when introducing egress policies on services that rely on external communications, which are not immediately considered. This might be DNS, time, package repositories, logging, telemetry, cloud provider, authentication, or other external core dependencies that might not be related to the direct functionality of the pod. + +Otterize helps elevate these issues by capturing and mapping the ingress and egress connections used by your pods and then providing suggested policies to maintain your witnessed tariff. You can also enable [shadow enforcement](/reference/shadow-vs-active-enforcement) to see which connections would be blocked without committing to active enforcement. + +### Defining our intents + +We aim to secure the network in our example cluster by introducing the appropriate egress policies for each pod. + +* Frontend - Needs to retrieve questions from our backend. This will result in an egress policy on our frontend and an ingress policy on our backend. +* Backend - Needs to be able to accept our frontend request and communicate to an external API. This will create an ingress policy for our frontend and an egress policy for the external API. + +As previously mentioned, the pods will be non-isolated by default, and everything will work. Can you open up the logs on the frontend to see the questions: + +```bash +kubectl logs -f -n otterize-tutorial-egress-access deploy/frontend +``` + +### Applying our intents + +Given this is a serious quiz, we want to lock down our pods to ensure that no outside inference can occur. + +To enforce the strict communication rules for our services, we will use the following ClientIntents yaml. + +```yaml +apiVersion: k8s.otterize.com/v1alpha3 +kind: ClientIntents +metadata: + name: frontend + namespace: otterize-tutorial-egress-access +spec: + service: + name: frontend + calls: + - name: backend +--- +apiVersion: k8s.otterize.com/v1alpha3 +kind: ClientIntents +metadata: + name: backend + namespace: otterize-tutorial-egress-access +spec: + service: + name: backend + calls: + - type: internet + internet: + ips: + - 173.236.198.186 # IP address of our external API + - name: frontend +``` + +To apply those intents, run the following command: + +```bash +kubectl apply -f ${ABSOLUTE_URL}/code-examples/network-egress/intents.yaml +``` + +Our services are now secure, but to ensure they are being enforced, let’s remove our intent to call our external API. + +```bash +kubectl apply -f ${ABSOLUTE_URL}/code-examples/network-egress/intents-no-external-api.yaml +``` + +Now, if we check our frontend logs, we can see that we are no longer receiving questions. + +```bash +kubectl logs -f -n otterize-tutorial-egress-access deploy/frontend +``` + +We can resolve this by reapplying our previous intents.yaml file. + +## Teardown + +To remove the deployed examples, run: + +```*bash* +kubectl delete namespace otterize-tutorial-egress-access +``` + + + diff --git a/static/code-examples/egress-access-control/all.yaml b/static/code-examples/egress-access-control/all.yaml new file mode 100644 index 000000000..16c59de4f --- /dev/null +++ b/static/code-examples/egress-access-control/all.yaml @@ -0,0 +1,57 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: otterize-tutorial-egress-access +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: frontend + namespace: otterize-tutorial-egress-access +spec: + selector: + matchLabels: + app: frontend + template: + metadata: + labels: + app: frontend + spec: + containers: + - name: frontend + imagePullPolicy: Always + image: 'brianglynn/frontend' +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: backend + namespace: otterize-tutorial-egress-access +spec: + selector: + matchLabels: + app: backend + template: + metadata: + labels: + app: backend + spec: + containers: + - name: backend + imagePullPolicy: Always + image: 'brianglynn/backend' + ports: + - containerPort: 8080 +--- +apiVersion: v1 +kind: Service +metadata: + name: backend + namespace: otterize-tutorial-egress-access +spec: + selector: + app: backend + ports: + - protocol: TCP + port: 8080 + targetPort: 8080 \ No newline at end of file diff --git a/static/code-examples/egress-access-control/intents-no-external-api.yaml b/static/code-examples/egress-access-control/intents-no-external-api.yaml new file mode 100644 index 000000000..179dceb65 --- /dev/null +++ b/static/code-examples/egress-access-control/intents-no-external-api.yaml @@ -0,0 +1,21 @@ +apiVersion: k8s.otterize.com/v1alpha3 +kind: ClientIntents +metadata: + name: frontend + namespace: otterize-tutorial-egress-access +spec: + service: + name: frontend + calls: + - name: backend +--- +apiVersion: k8s.otterize.com/v1alpha3 +kind: ClientIntents +metadata: + name: backend + namespace: otterize-tutorial-egress-access +spec: + service: + name: backend + calls: + - name: frontend \ No newline at end of file diff --git a/static/code-examples/egress-access-control/intents.yaml b/static/code-examples/egress-access-control/intents.yaml new file mode 100644 index 000000000..dce8faa3d --- /dev/null +++ b/static/code-examples/egress-access-control/intents.yaml @@ -0,0 +1,25 @@ +apiVersion: k8s.otterize.com/v1alpha3 +kind: ClientIntents +metadata: + name: frontend + namespace: otterize-tutorial-egress-access +spec: + service: + name: frontend + calls: + - name: backend +--- +apiVersion: k8s.otterize.com/v1alpha3 +kind: ClientIntents +metadata: + name: backend + namespace: otterize-tutorial-egress-access +spec: + service: + name: backend + calls: + - type: internet + internet: + ips: + - 173.236.198.186 # IP address of our external aPI + - name: frontend \ No newline at end of file From 95119f9fde796f00f13bec620d7c7a695bb60cd5 Mon Sep 17 00:00:00 2001 From: bglynn Date: Thu, 8 Feb 2024 11:05:27 -0800 Subject: [PATCH 14/20] initial draft and updated policies --- .../k8s-egress-access-control-tutorial.mdx | 98 +++++++++---------- .../default-deny-policy.yaml | 14 +++ .../egress-access-control/intents.yaml | 2 +- 3 files changed, 64 insertions(+), 50 deletions(-) create mode 100644 static/code-examples/egress-access-control/default-deny-policy.yaml diff --git a/docs/features/network-mapping-network-policies/tutorials/k8s-egress-access-control-tutorial.mdx b/docs/features/network-mapping-network-policies/tutorials/k8s-egress-access-control-tutorial.mdx index 5bb4c75bc..d31f52846 100644 --- a/docs/features/network-mapping-network-policies/tutorials/k8s-egress-access-control-tutorial.mdx +++ b/docs/features/network-mapping-network-policies/tutorials/k8s-egress-access-control-tutorial.mdx @@ -7,33 +7,13 @@ Let’s learn how Otterize automates egress access control with network policies In this tutorial, we will: -- Deploy an example cluster consisting of an example frontend for a quiz game and a server with an external dependency to retrieve questions. +- Deploy an example cluster consisting of an example frontend for a personal advice application and a server with an external dependency to retrieve wisdom. - Declare our network intents for each pod, including public internet and internal network egress rules. - See that a network policy was autogenerated to allow just that and block the (undeclared) calls from the other client. ## Prerequisites - -### Prepare a Kubernetes cluster - -For this tutorial, we will need a cluster with a network plugin like Calio or Cilium to enforce our policies. If you already have that enable, you can skip to the next step. -
- Prepare a Kubernetes cluster with Minikube & Calico - - For this tutorial you'll need a local Kubernetes cluster. Having a cluster with a [CNI](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/) that supports [NetworkPolicies](https://kubernetes.io/docs/concepts/services-networking/network-policies/) isn't required for this tutorial, but is recommended so that your cluster works with other tutorials. - - If you don't have the Minikube CLI, first [install it](https://minikube.sigs.k8s.io/docs/start/). - - Then start your Minikube cluster with Calico, in order to enforce network policies. - - ```shell - minikube start --cpus=4 --memory 4096 --disk-size 32g --cni=calico - ``` - -
- - ### Install Otterize on your cluster -To deploy Otterize, head over to [Otterize Cloud](https://app.otterize.com/), and to integrate your cluster, navigate to the [Clusters page](https://app.otterize.com/clusters) and follow the instructions, but be sure to add the flag below. +To deploy Otterize, head over to [Otterize Cloud](https://app.otterize.com/), and to integrate your cluster, navigate to the [Clusters page](https://app.otterize.com/clusters) and follow the instructions, but be sure to add the flag below. **Note:** Egress policy creation is off by default. We must add the following flag when installing Otterize to enable egress policy creation. ```bash @@ -41,7 +21,6 @@ To deploy Otterize, head over to [Otterize Cloud](https://app.otterize.com/), a ``` ## Tutorial - ### Deploy the cluster This will set up the namespace we will use for our tutorial and deploy the cluster containing our front and backend pods. Upon deployment, our cluster will have no network policies in place. @@ -53,7 +32,7 @@ kubectl apply -n otterize-tutorial-egress -f ${ABSOLUTE_URL}/code-examples/netwo ### About Network Policies -By default, in Kubernetes, pods are non-isolated. Meaning they accept traffic from any source and can send traffic to any source. When you introduce policies, either ingress or egress pods become isolated. Any connection not explicitly allowed will be rejected. When an ingress policy type is introduced, any traffic that doesn’t match a rule will be rejected. Similarly, when an egress policy type is introduced, any traffic that doesn’t match a rule will not be allowed out of the pod. +By default, in Kubernetes, pods are non-isolated. Meaning they accept traffic from any source and can send traffic to any source. When you introduce policies, either ingress or egress pods become isolated. Any connection not explicitly allowed will be rejected. When an ingress policy type is introduced, any traffic that does not match a rule will be rejected. Similarly, when an egress policy type is introduced, any traffic that does not match a rule will not be allowed out of the pod. Problems can arise when introducing egress policies on services that rely on external communications, which are not immediately considered. This might be DNS, time, package repositories, logging, telemetry, cloud provider, authentication, or other external core dependencies that might not be related to the direct functionality of the pod. @@ -61,12 +40,12 @@ Otterize helps elevate these issues by capturing and mapping the ingress and egr ### Defining our intents -We aim to secure the network in our example cluster by introducing the appropriate egress policies for each pod. +We aim to secure the network in our example cluster by introducing a default deny policy for our entire network and policies for each pod’s appropriate ingress and egress needs. -* Frontend - Needs to retrieve questions from our backend. This will result in an egress policy on our frontend and an ingress policy on our backend. +* Frontend - Needs to retrieve advice from our backend. This will result in an egress policy on our frontend and an ingress policy on our backend. * Backend - Needs to be able to accept our frontend request and communicate to an external API. This will create an ingress policy for our frontend and an egress policy for the external API. -As previously mentioned, the pods will be non-isolated by default, and everything will work. Can you open up the logs on the frontend to see the questions: +As previously mentioned, the pods will be non-isolated by default, and everything will work. Can you open up the logs on the frontend to see the free advice flowing: ```bash kubectl logs -f -n otterize-tutorial-egress-access deploy/frontend @@ -74,9 +53,44 @@ kubectl logs -f -n otterize-tutorial-egress-access deploy/frontend ### Applying our intents -Given this is a serious quiz, we want to lock down our pods to ensure that no outside inference can occur. +Given that this is a serious advice application, we want to lock down our pods to ensure no outside inference can occur. + +To enforce the strict communication rules for our services, we will start by applying a default deny policy, ensuring that only explicitly defined connections are allowed. You’ll see that we are allowing UDP on port 53 to support any DNS lookups we need. + +```bash +kubectl apply -n otterize-tutorial-egress-access -f ${ABSOLUTE_URL}/code-examples/egress-access-control/default-deny-policy.yaml +``` + +*Default Deny Policy* +```yaml +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: default-deny-ingress +spec: + podSelector: {} + policyTypes: + - Egress + - Ingress + egress: + - ports: + - protocol: UDP + port: 53 + +``` + + +You can now see in the logs that the pods are isolated from each other and the public internet: + +```bash +kubectl logs -f -n otterize-tutorial-egress-access deploy/frontend +``` -To enforce the strict communication rules for our services, we will use the following ClientIntents yaml. +Now that we have secured our broader network, we will apply the following ClientIntents to enable traffic for our services. + +```bash +kubectl apply -n otterize-tutorial-egress-access -f ${ABSOLUTE_URL}/code-examples/egress-access-control/intents.yaml +``` ```yaml apiVersion: k8s.otterize.com/v1alpha3 @@ -102,29 +116,11 @@ spec: - type: internet internet: ips: - - 173.236.198.186 # IP address of our external API + - 185.53.57.80 # IP address of our external API - name: frontend ``` -To apply those intents, run the following command: - -```bash -kubectl apply -f ${ABSOLUTE_URL}/code-examples/network-egress/intents.yaml -``` - -Our services are now secure, but to ensure they are being enforced, let’s remove our intent to call our external API. - -```bash -kubectl apply -f ${ABSOLUTE_URL}/code-examples/network-egress/intents-no-external-api.yaml -``` - -Now, if we check our frontend logs, we can see that we are no longer receiving questions. - -```bash -kubectl logs -f -n otterize-tutorial-egress-access deploy/frontend -``` - -We can resolve this by reapplying our previous intents.yaml file. +Now, our network and our services are only able to open connections to those internal and external resources that are explicitly needed. ## Teardown @@ -136,3 +132,7 @@ kubectl delete namespace otterize-tutorial-egress-access + + + + diff --git a/static/code-examples/egress-access-control/default-deny-policy.yaml b/static/code-examples/egress-access-control/default-deny-policy.yaml new file mode 100644 index 000000000..a75e315a9 --- /dev/null +++ b/static/code-examples/egress-access-control/default-deny-policy.yaml @@ -0,0 +1,14 @@ +--- +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: default-deny-ingress +spec: + podSelector: {} + policyTypes: + - Egress + - Ingress + egress: + - ports: + - protocol: UDP + port: 53 \ No newline at end of file diff --git a/static/code-examples/egress-access-control/intents.yaml b/static/code-examples/egress-access-control/intents.yaml index dce8faa3d..b77e53134 100644 --- a/static/code-examples/egress-access-control/intents.yaml +++ b/static/code-examples/egress-access-control/intents.yaml @@ -21,5 +21,5 @@ spec: - type: internet internet: ips: - - 173.236.198.186 # IP address of our external aPI + - 185.53.57.80 # IP address of our external aPI - name: frontend \ No newline at end of file From f44723e1221c0e439979163026d25bc95b77fb2e Mon Sep 17 00:00:00 2001 From: bglynn Date: Thu, 8 Feb 2024 11:33:36 -0800 Subject: [PATCH 15/20] some images --- .../k8s-egress-access-control-tutorial.mdx | 7 ++++++- .../cluster-intents-applied.png | Bin 0 -> 137815 bytes .../egress-access-control/social.png | Bin 0 -> 77070 bytes 3 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 static/img/quick-tutorials/egress-access-control/cluster-intents-applied.png create mode 100644 static/img/quick-tutorials/egress-access-control/social.png diff --git a/docs/features/network-mapping-network-policies/tutorials/k8s-egress-access-control-tutorial.mdx b/docs/features/network-mapping-network-policies/tutorials/k8s-egress-access-control-tutorial.mdx index d31f52846..869cf5620 100644 --- a/docs/features/network-mapping-network-policies/tutorials/k8s-egress-access-control-tutorial.mdx +++ b/docs/features/network-mapping-network-policies/tutorials/k8s-egress-access-control-tutorial.mdx @@ -1,7 +1,7 @@ --- sidebar_position: 5 title: Egress Policy Automation -image: /img/visualization/k8s-network-mapper/social.png +image: /img/quick-tutorials/egress-access-control/social.png --- Let’s learn how Otterize automates egress access control with network policies @@ -122,6 +122,11 @@ spec: Now, our network and our services are only able to open connections to those internal and external resources that are explicitly needed. +The protected network can be seen on Otterize Cloud: + + + + ## Teardown To remove the deployed examples, run: diff --git a/static/img/quick-tutorials/egress-access-control/cluster-intents-applied.png b/static/img/quick-tutorials/egress-access-control/cluster-intents-applied.png new file mode 100644 index 0000000000000000000000000000000000000000..384f81aaa4ee58709ac795468d794161a1ae87e2 GIT binary patch literal 137815 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
b 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 z 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

{gv&d6(?xlUH(6N?;5o0 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

+View Updated ClientIntent Description +```yaml +Name: backend +Namespace: otterize-tutorial-egress-access +Labels: none +Annotations: none +API Version: k8s.otterize.com/v1alpha3 +Kind: ClientIntents +Metadata: + Creation Timestamp: 2024-03-08T18:53:40Z + Finalizers: + intents.otterize.com/client-intents-finalizer + Generation: 2 + Resource Version: 2122 + UID: c93d8cc4-2a8f-404e-b06c-1935176f1dc8 +Spec: + Calls: + Internet: + Domains: + api.adviceslip.com + Type: internet + Name: frontend + Service: + Name: backend +Status: + Observed Generation: 2 + Resolved I Ps: + Dns: api.adviceslip.com + Ips: + 185.53.57.80 + Up To Date: true +``` +
+It is observed that Otterize identifies the IP addresses associated with the domain and incorporates them into a newly established section within the `status` block. This action informs the [Intent Operator](/reference/configuration/intents-operator) to dynamically adjust the network policies in response to the detection of new IP addresses originating from the specified domain name. For services that utilize dynamic IP addresses, each discovered IP address is systematically added to the network policy. Further details on DNS intents can be explored in the [Reference](/features/network-mapping-network-policies/reference#clientintents-with-dns). +## Teardown +To remove the deployed examples, run the following: +```bash +kubectl delete namespace otterize-tutorial-egress-access +``` diff --git a/package.json b/package.json index d2beb76e9..d3580b773 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "prism-react-renderer": "^1.3.5", "react": "^17.0.2", "react-dom": "^17.0.2", - "vercel": "^33.4.0" + "vercel": "^33.5.4" }, "devDependencies": { "@docusaurus/module-type-aliases": "^2.4.3", diff --git a/static/code-examples/egress-access-control/dns-enabled-npol.yaml b/static/code-examples/egress-access-control/dns-enabled-npol.yaml new file mode 100644 index 000000000..1a7728bd2 --- /dev/null +++ b/static/code-examples/egress-access-control/dns-enabled-npol.yaml @@ -0,0 +1,22 @@ +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: allow-dns-access +spec: + egress: + - ports: + - port: 53 + protocol: UDP + to: + - namespaceSelector: + matchLabels: + kubernetes.io/metadata.name: kube-system + podSelector: + matchLabels: + k8s-app: kube-dns + podSelector: + matchExpressions: + - key: intents.otterize.com/service + operator: Exists + policyTypes: + - Egress \ No newline at end of file diff --git a/static/code-examples/egress-access-control/domain-intents.yaml b/static/code-examples/egress-access-control/domain-intents.yaml new file mode 100644 index 000000000..d29e36b54 --- /dev/null +++ b/static/code-examples/egress-access-control/domain-intents.yaml @@ -0,0 +1,26 @@ +apiVersion: k8s.otterize.com/v1alpha3 +kind: ClientIntents +metadata: + name: frontend + namespace: otterize-tutorial-egress-access +spec: + service: + name: frontend + calls: + - name: backend +--- +apiVersion: k8s.otterize.com/v1alpha3 +kind: ClientIntents +metadata: + name: backend + namespace: otterize-tutorial-egress-access +spec: + service: + name: backend + calls: + - type: internet + internet: + domains: + # Domain name for our advice service + - api.adviceslip.com + - name: frontend \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 9bb583314..c3f23b18a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -84,7 +84,7 @@ "@algolia/requester-common" "4.20.0" "@algolia/transporter" "4.20.0" -"@algolia/client-search@4.20.0": +"@algolia/client-search@>= 4.9.1 < 6", "@algolia/client-search@4.20.0": version "4.20.0" resolved "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.20.0.tgz" integrity sha512-zgwqnMvhWLdpzKTpd3sGmMlr4c+iS7eyyLGiaO51zDZWGMkpgoNVmltkzdBwxOVXz0RsFMznIxB9zuarUv4TZg== @@ -164,7 +164,28 @@ resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz" integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== -"@babel/core@7.12.9": +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.0.0-0 || ^8.0.0-0 <8.0.0", "@babel/core@^7.12.0", "@babel/core@^7.13.0", "@babel/core@^7.18.6", "@babel/core@^7.19.6", "@babel/core@^7.4.0 || ^8.0.0-0 <8.0.0": + version "7.24.0" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.24.0.tgz" + integrity sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.6" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helpers" "^7.24.0" + "@babel/parser" "^7.24.0" + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.0" + "@babel/types" "^7.24.0" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/core@^7.11.6", "@babel/core@7.12.9": version "7.12.9" resolved "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz" integrity sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ== @@ -186,27 +207,6 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@^7.18.6", "@babel/core@^7.19.6": - version "7.23.9" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz" - integrity sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.23.5" - "@babel/generator" "^7.23.6" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helpers" "^7.23.9" - "@babel/parser" "^7.23.9" - "@babel/template" "^7.23.9" - "@babel/traverse" "^7.23.9" - "@babel/types" "^7.23.9" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - "@babel/generator@^7.12.5", "@babel/generator@^7.18.7", "@babel/generator@^7.23.6": version "7.23.6" resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz" @@ -329,16 +329,16 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-plugin-utils@7.10.4": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz" - integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== - "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.22.5" resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz" integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== +"@babel/helper-plugin-utils@7.10.4": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz" + integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== + "@babel/helper-remap-async-to-generator@^7.22.20", "@babel/helper-remap-async-to-generator@^7.22.5": version "7.22.20" resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz" @@ -402,14 +402,14 @@ "@babel/template" "^7.22.15" "@babel/types" "^7.22.19" -"@babel/helpers@^7.12.5", "@babel/helpers@^7.23.9": - version "7.23.9" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz" - integrity sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ== +"@babel/helpers@^7.12.5", "@babel/helpers@^7.24.0": + version "7.24.0" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.0.tgz" + integrity sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA== dependencies: - "@babel/template" "^7.23.9" - "@babel/traverse" "^7.23.9" - "@babel/types" "^7.23.9" + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.0" + "@babel/types" "^7.24.0" "@babel/highlight@^7.23.4": version "7.23.4" @@ -420,10 +420,10 @@ chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.12.7", "@babel/parser@^7.18.8", "@babel/parser@^7.23.9": - version "7.23.9" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz" - integrity sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA== +"@babel/parser@^7.12.7", "@babel/parser@^7.18.8", "@babel/parser@^7.24.0": + version "7.24.0" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz" + integrity sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.15": version "7.22.15" @@ -518,13 +518,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@7.12.1": - 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== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-jsx@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz" @@ -532,6 +525,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" +"@babel/plugin-syntax-jsx@7.12.1": + 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== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" @@ -553,7 +553,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-object-rest-spread@7.8.3", "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": +"@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3", "@babel/plugin-syntax-object-rest-spread@7.8.3": 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== @@ -1191,19 +1191,19 @@ dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.12.7", "@babel/template@^7.22.15", "@babel/template@^7.22.5", "@babel/template@^7.23.9": - version "7.23.9" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz" - integrity sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA== +"@babel/template@^7.12.7", "@babel/template@^7.22.15", "@babel/template@^7.22.5", "@babel/template@^7.24.0": + version "7.24.0" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz" + integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== dependencies: "@babel/code-frame" "^7.23.5" - "@babel/parser" "^7.23.9" - "@babel/types" "^7.23.9" + "@babel/parser" "^7.24.0" + "@babel/types" "^7.24.0" -"@babel/traverse@^7.12.9", "@babel/traverse@^7.18.8", "@babel/traverse@^7.23.9": - version "7.23.9" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz" - integrity sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg== +"@babel/traverse@^7.12.9", "@babel/traverse@^7.18.8", "@babel/traverse@^7.24.0": + version "7.24.0" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.0.tgz" + integrity sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw== dependencies: "@babel/code-frame" "^7.23.5" "@babel/generator" "^7.23.6" @@ -1211,15 +1211,15 @@ "@babel/helper-function-name" "^7.23.0" "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.9" - "@babel/types" "^7.23.9" + "@babel/parser" "^7.24.0" + "@babel/types" "^7.24.0" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.12.7", "@babel/types@^7.20.0", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.6", "@babel/types@^7.23.9", "@babel/types@^7.4.4": - version "7.23.9" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz" - integrity sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q== +"@babel/types@^7.12.7", "@babel/types@^7.20.0", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.6", "@babel/types@^7.24.0", "@babel/types@^7.4.4": + version "7.24.0" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz" + integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w== dependencies: "@babel/helper-string-parser" "^7.23.4" "@babel/helper-validator-identifier" "^7.22.20" @@ -1257,7 +1257,7 @@ "@docsearch/css" "3.5.2" algoliasearch "^4.19.1" -"@docusaurus/core@2.4.3", "@docusaurus/core@^2.0.0-beta.5", "@docusaurus/core@^2.4.3": +"@docusaurus/core@^2.0.0-beta.5", "@docusaurus/core@^2.4.3", "@docusaurus/core@2.4.3": version "2.4.3" resolved "https://registry.npmjs.org/@docusaurus/core/-/core-2.4.3.tgz" integrity sha512-dWH5P7cgeNSIg9ufReX6gaCl/TmrGKD38Orbwuz05WPhAQtFXHd5B8Qym1TiXfvUNvwoYKkAJOJuGe8ou0Z7PA== @@ -1375,7 +1375,7 @@ url-loader "^4.1.1" webpack "^5.73.0" -"@docusaurus/module-type-aliases@2.4.3", "@docusaurus/module-type-aliases@^2.4.3": +"@docusaurus/module-type-aliases@^2.4.3", "@docusaurus/module-type-aliases@2.4.3": version "2.4.3" resolved "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.4.3.tgz" integrity sha512-cwkBkt1UCiduuvEAo7XZY01dJfRn7UR/75mBgOdb1hKknhrabJZ8YH+7savd/y9kLExPyrhe0QwdS9GuzsRRIA== @@ -1484,7 +1484,7 @@ "@docusaurus/utils-validation" "2.4.3" tslib "^2.4.0" -"@docusaurus/plugin-google-gtag@2.4.3", "@docusaurus/plugin-google-gtag@^2.4.3": +"@docusaurus/plugin-google-gtag@^2.4.3", "@docusaurus/plugin-google-gtag@2.4.3": version "2.4.3" resolved "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.4.3.tgz" integrity sha512-5FMg0rT7sDy4i9AGsvJC71MQrqQZwgLNdDetLEGDHLfSHLvJhQbTCUGbGXknUgWXQJckcV/AILYeJy+HhxeIFA== @@ -1538,7 +1538,7 @@ "@docusaurus/theme-search-algolia" "2.4.3" "@docusaurus/types" "2.4.3" -"@docusaurus/react-loadable@5.5.2", "react-loadable@npm:@docusaurus/react-loadable@5.5.2": +"@docusaurus/react-loadable@5.5.2": version "5.5.2" resolved "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz" integrity sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ== @@ -1599,7 +1599,7 @@ use-sync-external-store "^1.2.0" utility-types "^3.10.0" -"@docusaurus/theme-search-algolia@2.4.3", "@docusaurus/theme-search-algolia@^2.4.3": +"@docusaurus/theme-search-algolia@^2.4.3", "@docusaurus/theme-search-algolia@2.4.3": version "2.4.3" resolved "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.4.3.tgz" integrity sha512-jziq4f6YVUB5hZOB85ELATwnxBz/RmSLD3ksGQOLDPKVzat4pmI8tddNWtriPpxR04BNT+ZfpPUMFkNFetSW1Q== @@ -1629,7 +1629,7 @@ fs-extra "^10.1.0" tslib "^2.4.0" -"@docusaurus/types@2.4.3", "@docusaurus/types@^2.0.0-beta.5": +"@docusaurus/types@*", "@docusaurus/types@^2.0.0-beta.5", "@docusaurus/types@2.4.3": version "2.4.3" resolved "https://registry.npmjs.org/@docusaurus/types/-/types-2.4.3.tgz" integrity sha512-W6zNLGQqfrp/EoPD0bhb9n7OobP+RHpmvVzpA+Z/IuU3Q63njJM24hmT0GYboovWcDtFmnIJC9wcyx4RVPQscw== @@ -1661,7 +1661,7 @@ js-yaml "^4.1.0" tslib "^2.4.0" -"@docusaurus/utils@2.4.3", "@docusaurus/utils@^2.0.0-beta.5": +"@docusaurus/utils@^2.0.0-beta.5", "@docusaurus/utils@2.4.3": version "2.4.3" resolved "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.4.3.tgz" integrity sha512-fKcXsjrD86Smxv8Pt0TBFqYieZZCPh4cbf9oszUq/AMhZn3ujwpKaVYZACPX8mmjtYx0JOgNx52CREBfiGQB4A== @@ -1683,44 +1683,37 @@ url-loader "^4.1.1" webpack "^5.73.0" -"@edge-runtime/cookies@3.4.1": - version "3.4.1" - resolved "https://registry.npmjs.org/@edge-runtime/cookies/-/cookies-3.4.1.tgz" - integrity sha512-z27BvgPxI73CgSlxU/NAUf1Q/shnqi6cobHEowf6VuLdSjGR3NjI2Y5dZUIBbK2zOJVZbXcHsVzJjz8LklteFQ== - -"@edge-runtime/format@2.2.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@edge-runtime/format/-/format-2.2.0.tgz" - integrity sha512-gPrS6AVw/qJJL0vcxMXv4kFXCU3ZTCD1uuJpwX15YxHV8BgU9OG5v9LrkkXcr96PBT/9epypfNJMhlWADuEziw== - -"@edge-runtime/node-utils@2.2.1": +"@edge-runtime/format@2.2.1": version "2.2.1" - resolved "https://registry.npmjs.org/@edge-runtime/node-utils/-/node-utils-2.2.1.tgz" - integrity sha512-RUl/439BHKshkhSGFRlZ1kzy68wL4mn8VNKDSZr3p0tciyZ33Mjfpl+vofqnHqXRmDI6nLnZpfJvhY3D88o0pA== - dependencies: - "@edge-runtime/cookies" "3.4.1" + resolved "https://registry.npmjs.org/@edge-runtime/format/-/format-2.2.1.tgz" + integrity sha512-JQTRVuiusQLNNLe2W9tnzBlV/GvSVcozLl4XZHk5swnRZ/v6jp8TqR8P7sqmJsQqblDZ3EztcWmLDbhRje/+8g== -"@edge-runtime/ponyfill@2.4.1": - version "2.4.1" - resolved "https://registry.npmjs.org/@edge-runtime/ponyfill/-/ponyfill-2.4.1.tgz" - integrity sha512-ZbR/EViY3gg2rmEAQTKPa6mXl4aR1/+cFcQe4r1segCjEbTAxT6PWu40odbu/KlZKSysEb2O/BWIC2lJgSJOMQ== +"@edge-runtime/node-utils@2.3.0": + version "2.3.0" + resolved "https://registry.npmjs.org/@edge-runtime/node-utils/-/node-utils-2.3.0.tgz" + integrity sha512-uUtx8BFoO1hNxtHjp3eqVPC/mWImGb2exOfGjMLUoipuWgjej+f4o/VP4bUI8U40gu7Teogd5VTeZUkGvJSPOQ== -"@edge-runtime/primitives@4.0.5": - version "4.0.5" - resolved "https://registry.npmjs.org/@edge-runtime/primitives/-/primitives-4.0.5.tgz" - integrity sha512-t7QiN5d/KpXgCvIfSt6Nm9Hj3WVdNgc5CpOD73jasY+9EvTI7Ngdj5cXvjcHrPcmYWJZMySPgeEeoL/1N/Llag== +"@edge-runtime/ponyfill@2.4.2": + version "2.4.2" + resolved "https://registry.npmjs.org/@edge-runtime/ponyfill/-/ponyfill-2.4.2.tgz" + integrity sha512-oN17GjFr69chu6sDLvXxdhg0Qe8EZviGSuqzR9qOiKh4MhFYGdBBcqRNzdmYeAdeRzOW2mM9yil4RftUQ7sUOA== -"@edge-runtime/vm@3.1.7": - version "3.1.7" - resolved "https://registry.npmjs.org/@edge-runtime/vm/-/vm-3.1.7.tgz" - integrity sha512-hUMFbDQ/nZN+1TLMi6iMO1QFz9RSV8yGG8S42WFPFma1d7VSNE0eMdJUmwjmtav22/iQkzHMmu6oTSfAvRGS8g== +"@edge-runtime/primitives@4.1.0": + version "4.1.0" + resolved "https://registry.npmjs.org/@edge-runtime/primitives/-/primitives-4.1.0.tgz" + integrity sha512-Vw0lbJ2lvRUqc7/soqygUX216Xb8T3WBZ987oywz6aJqRxcwSVWwr9e+Nqo2m9bxobA9mdbWNNoRY6S9eko1EQ== + +"@edge-runtime/vm@3.2.0": + version "3.2.0" + resolved "https://registry.npmjs.org/@edge-runtime/vm/-/vm-3.2.0.tgz" + integrity sha512-0dEVyRLM/lG4gp1R/Ik5bfPl/1wX00xFwd5KcNH602tzBa09oF7pbTKETEhR1GjZ75K6OJnYFu8II2dyMhONMw== dependencies: - "@edge-runtime/primitives" "4.0.5" + "@edge-runtime/primitives" "4.1.0" "@fastify/busboy@^2.0.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz" - integrity sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA== + version "2.1.1" + resolved "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz" + integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA== "@hapi/hoek@^9.0.0": version "9.3.0" @@ -1785,14 +1778,6 @@ resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": version "0.3.20" resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz" @@ -1801,6 +1786,14 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@leichtgewicht/ip-codec@^2.0.1": version "2.0.4" resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz" @@ -1864,7 +1857,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -1907,16 +1900,16 @@ resolved "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz" integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== -"@sinclair/typebox@0.25.24": - version "0.25.24" - resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz" - integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== - "@sinclair/typebox@^0.27.8": version "0.27.8" resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz" integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== +"@sinclair/typebox@0.25.24": + version "0.25.24" + resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz" + integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== + "@sindresorhus/is@^0.14.0": version "0.14.0" resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz" @@ -1985,7 +1978,7 @@ "@svgr/babel-plugin-transform-react-native-svg" "^6.5.1" "@svgr/babel-plugin-transform-svg-component" "^6.5.1" -"@svgr/core@^6.5.1": +"@svgr/core@*", "@svgr/core@^6.0.0", "@svgr/core@^6.5.1": version "6.5.1" resolved "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz" integrity sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw== @@ -2244,16 +2237,16 @@ dependencies: undici-types "~5.26.4" -"@types/node@14.18.33": - version "14.18.33" - resolved "https://registry.npmjs.org/@types/node/-/node-14.18.33.tgz" - integrity sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg== - "@types/node@^17.0.5": version "17.0.45" resolved "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz" integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== +"@types/node@14.18.33": + version "14.18.33" + resolved "https://registry.npmjs.org/@types/node/-/node-14.18.33.tgz" + integrity sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg== + "@types/parse-json@^4.0.0": version "4.0.0" resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz" @@ -2305,7 +2298,7 @@ "@types/history" "^4.7.11" "@types/react" "*" -"@types/react@*": +"@types/react@*", "@types/react@>= 16.8.0 < 19.0.0": version "18.2.37" resolved "https://registry.npmjs.org/@types/react/-/react-18.2.37.tgz" integrity sha512-RGAYMi2bhRgEXT3f4B92WTohopH6bIXw05FuGlmJEnv/omEn190+QYEIYxIAuIBdKgboYYdVved2p1AxZVQnaw== @@ -2386,10 +2379,10 @@ dependencies: "@types/yargs-parser" "*" -"@vercel/build-utils@7.5.1": - version "7.5.1" - resolved "https://registry.npmjs.org/@vercel/build-utils/-/build-utils-7.5.1.tgz" - integrity sha512-RyTG951QZQgYn0JL5OoObsCppxHSQApZAqn82GCpAyuQPW7clqcjq7aY7KLD7esHbs0zdzL0KeDEBkGBKaTcTg== +"@vercel/build-utils@7.7.1": + version "7.7.1" + resolved "https://registry.npmjs.org/@vercel/build-utils/-/build-utils-7.7.1.tgz" + integrity sha512-TUO2sJiKHwF1CBZl9fP/Wof+IAMJ9QQEKU+RHzjNBedJmV/HolYIOAgW+jguQM7pOLz4cKbwcoPt+QltdHJ8Lw== "@vercel/error-utils@2.0.2": version "2.0.2" @@ -2429,13 +2422,13 @@ dependencies: web-vitals "0.2.4" -"@vercel/gatsby-plugin-vercel-builder@2.0.16": - version "2.0.16" - resolved "https://registry.npmjs.org/@vercel/gatsby-plugin-vercel-builder/-/gatsby-plugin-vercel-builder-2.0.16.tgz" - integrity sha512-szRvR8UiCyH8J4xqz3hwDa0XOE4fTxoPawYDBMNHrx91QFEHAtUBC3KcGhApGmVd7ik0WYP7lqokmv9ngygBlA== +"@vercel/gatsby-plugin-vercel-builder@2.0.19": + version "2.0.19" + resolved "https://registry.npmjs.org/@vercel/gatsby-plugin-vercel-builder/-/gatsby-plugin-vercel-builder-2.0.19.tgz" + integrity sha512-umxtjPkQ7c2MSw69kkBc4nWbq/kiaaWpCy+NjbQetfVD38XTURm6joJzG9bnOeZuejN4PBDpTaXMBPtaZVmDVg== dependencies: "@sinclair/typebox" "0.25.24" - "@vercel/build-utils" "7.5.1" + "@vercel/build-utils" "7.7.1" "@vercel/routing-utils" "3.1.0" esbuild "0.14.47" etag "1.8.1" @@ -2454,17 +2447,17 @@ "@vercel/static-config" "3.0.0" ts-morph "12.0.0" -"@vercel/next@4.1.0": - version "4.1.0" - resolved "https://registry.npmjs.org/@vercel/next/-/next-4.1.0.tgz" - integrity sha512-5RsyprRts6POFor2JWNNA8kYQ9R0A5a27VaBESFsPi9YIhytsx6cOdrxWusIF6SM+y+kLA0gvi1yA6uixaP8Cg== +"@vercel/next@4.1.4": + version "4.1.4" + resolved "https://registry.npmjs.org/@vercel/next/-/next-4.1.4.tgz" + integrity sha512-yUiE+bN9QZhoTh8gnNdynbQPg+LxK3D+Aqqe+67fUVrdKKovbyLyZywEfSGxawMcFEOPDHAxLhBRbhqT0vUc/g== dependencies: - "@vercel/nft" "0.26.2" + "@vercel/nft" "0.26.4" -"@vercel/nft@0.26.2": - version "0.26.2" - resolved "https://registry.npmjs.org/@vercel/nft/-/nft-0.26.2.tgz" - integrity sha512-bxe2iShmKZi7476xYamyKvhhKwQ6JPEtQ2FSq1AjMUH2buMd8LQMkdoHinTqZYc+1sMTh3G0ARdjzNvV1FEisA== +"@vercel/nft@0.26.4": + version "0.26.4" + resolved "https://registry.npmjs.org/@vercel/nft/-/nft-0.26.4.tgz" + integrity sha512-j4jCOOXke2t8cHZCIxu1dzKLHLcFmYzC3yqAK6MfZznOL1QIJKd0xcFsXK3zcqzU7ScsE2zWkiMMNHGMHgp+FA== dependencies: "@mapbox/node-pre-gyp" "^1.0.5" "@rollup/pluginutils" "^4.0.0" @@ -2479,21 +2472,23 @@ node-gyp-build "^4.2.2" resolve-from "^5.0.0" -"@vercel/node@3.0.17": - version "3.0.17" - resolved "https://registry.npmjs.org/@vercel/node/-/node-3.0.17.tgz" - integrity sha512-HgIDxVAG/cEGLcSYdatGwk/zraN2aDP3ZQxy0I9eFsG8+rgC5eh3mFpNYEcBDkikpMr1jW/zpesf43s/A77/GQ== +"@vercel/node@3.0.21": + version "3.0.21" + resolved "https://registry.npmjs.org/@vercel/node/-/node-3.0.21.tgz" + integrity sha512-Ie/1yC2rPYv5NkYqwTF2tWlwArjEPLwFwZ6Z2OMTxNaqivAkvODweAtrlLvilVESFDzdhkO50MCl5ettAZjIWA== dependencies: - "@edge-runtime/node-utils" "2.2.1" - "@edge-runtime/primitives" "4.0.5" - "@edge-runtime/vm" "3.1.7" + "@edge-runtime/node-utils" "2.3.0" + "@edge-runtime/primitives" "4.1.0" + "@edge-runtime/vm" "3.2.0" "@types/node" "14.18.33" - "@vercel/build-utils" "7.5.1" + "@vercel/build-utils" "7.7.1" "@vercel/error-utils" "2.0.2" - "@vercel/nft" "0.26.2" + "@vercel/nft" "0.26.4" "@vercel/static-config" "3.0.0" async-listen "3.0.0" - edge-runtime "2.5.7" + cjs-module-lexer "1.2.3" + edge-runtime "2.5.9" + es-module-lexer "1.4.1" esbuild "0.14.47" etag "1.8.1" node-fetch "2.6.9" @@ -2508,21 +2503,22 @@ resolved "https://registry.npmjs.org/@vercel/python/-/python-4.1.1.tgz" integrity sha512-EbAdKOZ0hPd5b59tLt7R3RQK1azNvuZTrCFRAVHNjqcIHNCmrSvjag5zBGn7Memkk8qWb3+CgBw9K/3LJKei0w== -"@vercel/redwood@2.0.6": - version "2.0.6" - resolved "https://registry.npmjs.org/@vercel/redwood/-/redwood-2.0.6.tgz" - integrity sha512-bH8z/0peYlEdFGxyPWwOScTV75eb47H8IK9u0EZ3LtC7hKwiqEkQIRg2CtyH5FmILlGN9nRxEB5XWsboigHByw== +"@vercel/redwood@2.0.8": + version "2.0.8" + resolved "https://registry.npmjs.org/@vercel/redwood/-/redwood-2.0.8.tgz" + integrity sha512-hAu7SYXDt+W7kscjtQ5NsuNflXH+QB5/xAdA6FRSS/e41lG6Xq6pqLMDobqq4BR7E2PpppVDw2DUx9KzPNoeEw== dependencies: - "@vercel/nft" "0.26.2" + "@vercel/nft" "0.26.4" "@vercel/routing-utils" "3.1.0" semver "6.3.1" -"@vercel/remix-builder@2.0.18": - version "2.0.18" - resolved "https://registry.npmjs.org/@vercel/remix-builder/-/remix-builder-2.0.18.tgz" - integrity sha512-dSi/FQ3jjEl6q9Hpzwkiikq7CwO309TS1bkcuORbsd55HloDeirvQurxoGOqWN+4O6Acuy568YI33A7LAz9/lw== +"@vercel/remix-builder@2.1.1": + version "2.1.1" + resolved "https://registry.npmjs.org/@vercel/remix-builder/-/remix-builder-2.1.1.tgz" + integrity sha512-T2MAZeA9qjlulTlp2eTVn2yfgL3HJOmRIY19vqbXJ2zUVAq2zc0JrL2k4w0wLsSiJju3U0KPWwLpA1LlGjAo0g== dependencies: - "@vercel/nft" "0.26.2" + "@vercel/error-utils" "2.0.2" + "@vercel/nft" "0.26.4" "@vercel/static-config" "3.0.0" ts-morph "12.0.0" @@ -2540,13 +2536,13 @@ resolved "https://registry.npmjs.org/@vercel/ruby/-/ruby-2.0.5.tgz" integrity sha512-Gfm8HDech41vf+EPleRzgoJUnDTJerKgckMm4KX0JT860gV9XBMSOWYH7eMWHmMza104+HRCWL7wT6OlpftF2Q== -"@vercel/static-build@2.1.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@vercel/static-build/-/static-build-2.1.0.tgz" - integrity sha512-mSP3UNckqr3aqTx8fAbUiM/5E4llgJeUWFf1/RgUUqt5T5QnxZ2n10HagHSZ/fHCx1bT+J8jdty8Aq7v+vJt2Q== +"@vercel/static-build@2.4.1": + version "2.4.1" + resolved "https://registry.npmjs.org/@vercel/static-build/-/static-build-2.4.1.tgz" + integrity sha512-F4vE5v0lM85PZ99JPi15W9UyzgQp8ABOBLaCLPM6deeuvBi2ZwPuEbrsl9OJv159NohSNcphMDQry1BdhGqiOQ== dependencies: "@vercel/gatsby-plugin-vercel-analytics" "1.0.11" - "@vercel/gatsby-plugin-vercel-builder" "2.0.16" + "@vercel/gatsby-plugin-vercel-builder" "2.0.19" "@vercel/static-config" "3.0.0" ts-morph "12.0.0" @@ -2559,7 +2555,7 @@ json-schema-to-ts "1.6.4" ts-morph "12.0.0" -"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": +"@webassemblyjs/ast@^1.11.5", "@webassemblyjs/ast@1.11.6": version "1.11.6" resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz" integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== @@ -2660,7 +2656,7 @@ "@webassemblyjs/wasm-gen" "1.11.6" "@webassemblyjs/wasm-parser" "1.11.6" -"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": +"@webassemblyjs/wasm-parser@^1.11.5", "@webassemblyjs/wasm-parser@1.11.6": version "1.11.6" resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz" integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== @@ -2718,7 +2714,7 @@ acorn-walk@^8.0.0, acorn-walk@^8.1.1: resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn@^8.0.4, acorn@^8.4.1, acorn@^8.6.0, acorn@^8.7.1, acorn@^8.8.2: +acorn@^8, acorn@^8.0.4, acorn@^8.4.1, acorn@^8.6.0, acorn@^8.7.1, acorn@^8.8.2: version "8.11.2" resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz" integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== @@ -2762,17 +2758,7 @@ ajv-keywords@^5.1.0: dependencies: fast-deep-equal "^3.1.3" -ajv@8.6.3: - version "8.6.3" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz" - integrity sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -ajv@^6.0.0, ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: +ajv@^6.0.0, ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: version "6.12.6" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -2782,7 +2768,7 @@ ajv@^6.0.0, ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.9.0: +ajv@^8.0.0, ajv@^8.8.2, ajv@^8.9.0: version "8.12.0" resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== @@ -2792,6 +2778,16 @@ ajv@^8.0.0, ajv@^8.9.0: require-from-string "^2.0.2" uri-js "^4.2.2" +ajv@8.6.3: + version "8.6.3" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz" + integrity sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + algoliasearch-helper@^3.10.0: version "3.15.0" resolved "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.15.0.tgz" @@ -2799,7 +2795,7 @@ algoliasearch-helper@^3.10.0: dependencies: "@algolia/events" "^4.0.1" -algoliasearch@^4.13.1, algoliasearch@^4.19.1: +algoliasearch@^4.13.1, algoliasearch@^4.19.1, "algoliasearch@>= 3.1 < 6", "algoliasearch@>= 4.9.1 < 6": version "4.20.0" resolved "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.20.0.tgz" integrity sha512-y+UHEjnOItoNy0bYO+WWmLWBlPwDjKHW6mNHrPi0NkuhpQOOEbrkwQH/wgKFDLh7qlKjzoKeiRtlpewDPDG23g== @@ -2886,11 +2882,6 @@ are-we-there-yet@^2.0.0: delegates "^1.0.0" readable-stream "^3.6.0" -arg@4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/arg/-/arg-4.1.0.tgz" - integrity sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg== - arg@^4.1.0: version "4.1.3" resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" @@ -2901,6 +2892,11 @@ arg@^5.0.0, arg@^5.0.2: resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== +arg@4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/arg/-/arg-4.1.0.tgz" + integrity sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg== + argparse@^1.0.7: version "1.0.10" resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" @@ -2913,16 +2909,16 @@ argparse@^2.0.1: resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - array-flatten@^2.1.2: version "2.1.2" resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + array-union@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" @@ -3146,7 +3142,7 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.22.1, browserslist@^4.22.2: +browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.22.1, browserslist@^4.22.2, "browserslist@>= 4.21.0": version "4.22.3" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz" integrity sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A== @@ -3215,7 +3211,7 @@ camel-case@^4.1.2: pascal-case "^3.1.2" tslib "^2.0.3" -camelcase-css@2.0.1, camelcase-css@^2.0.1: +camelcase-css@^2.0.1, camelcase-css@2.0.1: 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== @@ -3302,21 +3298,6 @@ cheerio@^1.0.0-rc.12: parse5 "^7.0.0" parse5-htmlparser2-tree-adapter "^7.0.0" -chokidar@3.3.1: - version "3.3.1" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz" - integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg== - dependencies: - anymatch "~3.1.1" - braces "~3.0.2" - glob-parent "~5.1.0" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.3.0" - optionalDependencies: - fsevents "~2.1.2" - chokidar@^3.4.2, chokidar@^3.5.3: version "3.5.3" resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" @@ -3332,6 +3313,21 @@ chokidar@^3.4.2, chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" +chokidar@3.3.1: + version "3.3.1" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz" + integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.3.0" + optionalDependencies: + fsevents "~2.1.2" + chownr@^1.1.4: version "1.1.4" resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz" @@ -3357,6 +3353,11 @@ ci-info@^3.2.0: resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== +cjs-module-lexer@1.2.3: + version "1.2.3" + resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz" + integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== + clean-css@^5.2.2, clean-css@^5.3.0: version "5.3.2" resolved "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz" @@ -3433,16 +3434,16 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - color-name@~1.1.4: version "1.1.4" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + color-support@^1.1.2: version "1.1.3" resolved "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz" @@ -3562,16 +3563,16 @@ content-disposition@0.5.4: dependencies: safe-buffer "5.2.1" -content-type@1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== - content-type@~1.0.4: version "1.0.5" resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== +content-type@1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + convert-hrtime@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-3.0.0.tgz" @@ -3838,20 +3839,27 @@ csstype@^3.0.2: resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz" integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== -debug@2.6.9, debug@^2.6.0: +debug@^2.6.0: 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" -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: +debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@4: version "4.3.4" resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" +debug@2.6.9: + 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" + debug@4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz" @@ -3930,16 +3938,16 @@ delegates@^1.0.0: resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== -depd@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - depd@~1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== +depd@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + destroy@1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" @@ -4072,7 +4080,16 @@ domhandler@^5.0.2, domhandler@^5.0.3: dependencies: domelementtype "^2.3.0" -domutils@^2.5.2, domutils@^2.8.0: +domutils@^2.5.2: + 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" + +domutils@^2.8.0: version "2.8.0" resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz" integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== @@ -4105,29 +4122,29 @@ dot-prop@^5.2.0: dependencies: is-obj "^2.0.0" -duplexer3@^0.1.4: - version "0.1.5" - resolved "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz" - integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== - duplexer@^0.1.2: version "0.1.2" resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== +duplexer3@^0.1.4: + version "0.1.5" + resolved "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz" + integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== + eastasianwidth@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== -edge-runtime@2.5.7: - version "2.5.7" - resolved "https://registry.npmjs.org/edge-runtime/-/edge-runtime-2.5.7.tgz" - integrity sha512-gA4qSVP0sNwJlkdQ2nahDPASlSl8twUd17o+JolPa1EtXpLTGzIpOETvodgJwXIxa+zaD8bnAXCdsWrx2PhlVQ== +edge-runtime@2.5.9: + version "2.5.9" + resolved "https://registry.npmjs.org/edge-runtime/-/edge-runtime-2.5.9.tgz" + integrity sha512-pk+k0oK0PVXdlT4oRp4lwh+unuKB7Ng4iZ2HB+EZ7QCEQizX360Rp/F4aRpgpRgdP2ufB35N+1KppHmYjqIGSg== dependencies: - "@edge-runtime/format" "2.2.0" - "@edge-runtime/ponyfill" "2.4.1" - "@edge-runtime/vm" "3.1.7" + "@edge-runtime/format" "2.2.1" + "@edge-runtime/ponyfill" "2.4.2" + "@edge-runtime/vm" "3.2.0" async-listen "3.0.1" mri "1.2.0" picocolors "1.0.0" @@ -4209,112 +4226,17 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-module-lexer@^1.2.1: - version "1.3.1" - resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz" - integrity sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q== - -esbuild-android-64@0.14.47: - version "0.14.47" - resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.47.tgz#ef95b42c67bcf4268c869153fa3ad1466c4cea6b" - integrity sha512-R13Bd9+tqLVFndncMHssZrPWe6/0Kpv2/dt4aA69soX4PRxlzsVpCvoJeFE8sOEoeVEiBkI0myjlkDodXlHa0g== - -esbuild-android-arm64@0.14.47: - version "0.14.47" - resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.47.tgz#4ebd7ce9fb250b4695faa3ee46fd3b0754ecd9e6" - integrity sha512-OkwOjj7ts4lBp/TL6hdd8HftIzOy/pdtbrNA4+0oVWgGG64HrdVzAF5gxtJufAPOsEjkyh1oIYvKAUinKKQRSQ== - -esbuild-darwin-64@0.14.47: - version "0.14.47" - resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.47.tgz#e0da6c244f497192f951807f003f6a423ed23188" - integrity sha512-R6oaW0y5/u6Eccti/TS6c/2c1xYTb1izwK3gajJwi4vIfNs1s8B1dQzI1UiC9T61YovOQVuePDcfqHLT3mUZJA== +es-module-lexer@^1.2.1, es-module-lexer@1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz" + integrity sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w== esbuild-darwin-arm64@0.14.47: version "0.14.47" resolved "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.47.tgz" integrity sha512-seCmearlQyvdvM/noz1L9+qblC5vcBrhUaOoLEDDoLInF/VQ9IkobGiLlyTPYP5dW1YD4LXhtBgOyevoIHGGnw== -esbuild-freebsd-64@0.14.47: - version "0.14.47" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.47.tgz#8da6a14c095b29c01fc8087a16cb7906debc2d67" - integrity sha512-ZH8K2Q8/Ux5kXXvQMDsJcxvkIwut69KVrYQhza/ptkW50DC089bCVrJZZ3sKzIoOx+YPTrmsZvqeZERjyYrlvQ== - -esbuild-freebsd-arm64@0.14.47: - version "0.14.47" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.47.tgz#ad31f9c92817ff8f33fd253af7ab5122dc1b83f6" - integrity sha512-ZJMQAJQsIOhn3XTm7MPQfCzEu5b9STNC+s90zMWe2afy9EwnHV7Ov7ohEMv2lyWlc2pjqLW8QJnz2r0KZmeAEQ== - -esbuild-linux-32@0.14.47: - version "0.14.47" - resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.47.tgz#de085e4db2e692ea30c71208ccc23fdcf5196c58" - integrity sha512-FxZOCKoEDPRYvq300lsWCTv1kcHgiiZfNrPtEhFAiqD7QZaXrad8LxyJ8fXGcWzIFzRiYZVtB3ttvITBvAFhKw== - -esbuild-linux-64@0.14.47: - version "0.14.47" - resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.47.tgz#2a9321bbccb01f01b04cebfcfccbabeba3658ba1" - integrity sha512-nFNOk9vWVfvWYF9YNYksZptgQAdstnDCMtR6m42l5Wfugbzu11VpMCY9XrD4yFxvPo9zmzcoUL/88y0lfJZJJw== - -esbuild-linux-arm64@0.14.47: - version "0.14.47" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.47.tgz#b9da7b6fc4b0ca7a13363a0c5b7bb927e4bc535a" - integrity sha512-ywfme6HVrhWcevzmsufjd4iT3PxTfCX9HOdxA7Hd+/ZM23Y9nXeb+vG6AyA6jgq/JovkcqRHcL9XwRNpWG6XRw== - -esbuild-linux-arm@0.14.47: - version "0.14.47" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.47.tgz#56fec2a09b9561c337059d4af53625142aded853" - integrity sha512-ZGE1Bqg/gPRXrBpgpvH81tQHpiaGxa8c9Rx/XOylkIl2ypLuOcawXEAo8ls+5DFCcRGt/o3sV+PzpAFZobOsmA== - -esbuild-linux-mips64le@0.14.47: - version "0.14.47" - resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.47.tgz#9db21561f8f22ed79ef2aedb7bbef082b46cf823" - integrity sha512-mg3D8YndZ1LvUiEdDYR3OsmeyAew4MA/dvaEJxvyygahWmpv1SlEEnhEZlhPokjsUMfRagzsEF/d/2XF+kTQGg== - -esbuild-linux-ppc64le@0.14.47: - version "0.14.47" - resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.47.tgz#dc3a3da321222b11e96e50efafec9d2de408198b" - integrity sha512-WER+f3+szmnZiWoK6AsrTKGoJoErG2LlauSmk73LEZFQ/iWC+KhhDsOkn1xBUpzXWsxN9THmQFltLoaFEH8F8w== - -esbuild-linux-riscv64@0.14.47: - version "0.14.47" - resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.47.tgz#9bd6dcd3dca6c0357084ecd06e1d2d4bf105335f" - integrity sha512-1fI6bP3A3rvI9BsaaXbMoaOjLE3lVkJtLxsgLHqlBhLlBVY7UqffWBvkrX/9zfPhhVMd9ZRFiaqXnB1T7BsL2g== - -esbuild-linux-s390x@0.14.47: - version "0.14.47" - resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.47.tgz#a458af939b52f2cd32fc561410d441a51f69d41f" - integrity sha512-eZrWzy0xFAhki1CWRGnhsHVz7IlSKX6yT2tj2Eg8lhAwlRE5E96Hsb0M1mPSE1dHGpt1QVwwVivXIAacF/G6mw== - -esbuild-netbsd-64@0.14.47: - version "0.14.47" - resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.47.tgz#6388e785d7e7e4420cb01348d7483ab511b16aa8" - integrity sha512-Qjdjr+KQQVH5Q2Q1r6HBYswFTToPpss3gqCiSw2Fpq/ua8+eXSQyAMG+UvULPqXceOwpnPo4smyZyHdlkcPppQ== - -esbuild-openbsd-64@0.14.47: - version "0.14.47" - resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.47.tgz#309af806db561aa886c445344d1aacab850dbdc5" - integrity sha512-QpgN8ofL7B9z8g5zZqJE+eFvD1LehRlxr25PBkjyyasakm4599iroUpaj96rdqRlO2ShuyqwJdr+oNqWwTUmQw== - -esbuild-sunos-64@0.14.47: - version "0.14.47" - resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.47.tgz#3f19612dcdb89ba6c65283a7ff6e16f8afbf8aaa" - integrity sha512-uOeSgLUwukLioAJOiGYm3kNl+1wJjgJA8R671GYgcPgCx7QR73zfvYqXFFcIO93/nBdIbt5hd8RItqbbf3HtAQ== - -esbuild-windows-32@0.14.47: - version "0.14.47" - resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.47.tgz#a92d279c8458d5dc319abcfeb30aa49e8f2e6f7f" - integrity sha512-H0fWsLTp2WBfKLBgwYT4OTfFly4Im/8B5f3ojDv1Kx//kiubVY0IQunP2Koc/fr/0wI7hj3IiBDbSrmKlrNgLQ== - -esbuild-windows-64@0.14.47: - version "0.14.47" - resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.47.tgz#2564c3fcf0c23d701edb71af8c52d3be4cec5f8a" - integrity sha512-/Pk5jIEH34T68r8PweKRi77W49KwanZ8X6lr3vDAtOlH5EumPE4pBHqkCUdELanvsT14yMXLQ/C/8XPi1pAtkQ== - -esbuild-windows-arm64@0.14.47: - version "0.14.47" - resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.47.tgz#86d9db1a22d83360f726ac5fba41c2f625db6878" - integrity sha512-HFSW2lnp62fl86/qPQlqw6asIwCnEsEoNIL1h2uVMgakddf+vUuMcCbtUY1i8sst7KkgHrVKCJQB33YhhOweCQ== - -esbuild@0.14.47: +esbuild@0.14.47: version "0.14.47" resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.14.47.tgz" integrity sha512-wI4ZiIfFxpkuxB8ju4MHrGwGLyp1+awEHAHVpx6w7a+1pmYIq8T9FGEVVwFo0iFierDoMj++Xq69GXWYn2EiwA== @@ -4395,7 +4317,7 @@ estraverse@^5.2.0: resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== -estree-walker@2.0.2, estree-walker@^2.0.1: +estree-walker@^2.0.1, estree-walker@2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz" integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== @@ -4410,7 +4332,7 @@ eta@^2.0.0: resolved "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz" integrity sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g== -etag@1.8.1, etag@~1.8.1: +etag@~1.8.1, etag@1.8.1: version "1.8.1" resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== @@ -4438,6 +4360,21 @@ events@^3.2.0: resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== +execa@^5.0.0: + 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" + execa@3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/execa/-/execa-3.2.0.tgz" @@ -4454,21 +4391,6 @@ execa@3.2.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" -execa@^5.0.0: - 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" - express@^4.17.3: version "4.18.2" resolved "https://registry.npmjs.org/express/-/express-4.18.2.tgz" @@ -4599,7 +4521,7 @@ feed@^4.2.2: dependencies: xml-js "^1.6.11" -file-loader@^6.2.0: +file-loader@*, file-loader@^6.2.0: version "6.2.0" resolved "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz" integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== @@ -4684,7 +4606,7 @@ flux@^4.0.1: follow-redirects@^1.0.0, follow-redirects@^1.14.7: version "1.15.4" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.4.tgz#cdc7d308bf6493126b17ea2191ea0ccf3e535adf" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz" integrity sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw== fork-ts-checker-webpack-plugin@^6.5.0: @@ -4721,24 +4643,6 @@ fresh@0.5.2: resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== -fs-extra@11.1.0: - version "11.1.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz" - integrity sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-extra@8.1.0: - version "8.1.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - fs-extra@^10.0.0, fs-extra@^10.1.0: version "10.1.0" resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz" @@ -4758,6 +4662,24 @@ fs-extra@^9.0.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs-extra@11.1.0: + version "11.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz" + integrity sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@8.1.0: + version "8.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-minipass@^1.2.7: version "1.2.7" resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz" @@ -4868,7 +4790,14 @@ glob-parent@^5.1.2, glob-parent@~5.1.0, glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" -glob-parent@^6.0.1, glob-parent@^6.0.2: +glob-parent@^6.0.1: + 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" + +glob-parent@^6.0.2: version "6.0.2" resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== @@ -4880,27 +4809,27 @@ glob-to-regexp@^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== -glob@7.1.6: - version "7.1.6" - resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== +glob@^7.0.0, glob@^7.1.3, glob@^7.1.6: + 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.0.4" + minimatch "^3.1.1" once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.1.3, glob@^7.1.6: - version "7.2.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== +glob@7.1.6: + version "7.1.6" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.1.1" + minimatch "^3.0.4" once "^1.3.0" path-is-absolute "^1.0.0" @@ -5226,6 +5155,24 @@ http-deceiver@^1.2.7: resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz" integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== +http-errors@~1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.4.0.tgz" + integrity sha512-oLjPqve1tuOl5aRhv8GK5eHpqP1C9fb+Ol+XTLjKfLltE44zdDbEdjPSbU7Ch5rSNsVFqZn97SrMmZLdu1/YMw== + dependencies: + inherits "2.0.1" + statuses ">= 1.2.1 < 2" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + http-errors@1.7.3: version "1.7.3" resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz" @@ -5248,24 +5195,6 @@ http-errors@2.0.0: statuses "2.0.1" toidentifier "1.0.1" -http-errors@~1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.4.0.tgz" - integrity sha512-oLjPqve1tuOl5aRhv8GK5eHpqP1C9fb+Ol+XTLjKfLltE44zdDbEdjPSbU7Ch5rSNsVFqZn97SrMmZLdu1/YMw== - dependencies: - inherits "2.0.1" - statuses ">= 1.2.1 < 2" - -http-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" - integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - http-parser-js@>=0.5.1: version "0.5.8" resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz" @@ -5374,7 +5303,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: +inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3, inherits@2, inherits@2.0.4: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -5389,16 +5318,16 @@ inherits@2.0.3: resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== -ini@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz" - integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== - ini@^1.3.5, ini@~1.3.0: version "1.3.8" resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== +ini@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + inline-style-parser@0.1.1: version "0.1.1" resolved "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz" @@ -5416,17 +5345,17 @@ invariant@^2.2.4: dependencies: loose-envify "^1.0.0" -ipaddr.js@1.9.1: - 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== - ipaddr.js@^2.0.1: version "2.1.0" resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz" integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ== -is-alphabetical@1.0.4, is-alphabetical@^1.0.0: +ipaddr.js@1.9.1: + 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== + +is-alphabetical@^1.0.0, is-alphabetical@1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz" integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== @@ -5609,16 +5538,16 @@ is-yarn-global@^0.3.0: resolved "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz" integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== - isarray@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" @@ -5883,7 +5812,7 @@ lodash.pullall@^4.2.0: resolved "https://registry.npmjs.org/lodash.pullall/-/lodash.pullall-4.2.0.tgz" integrity sha512-VhqxBKH0ZxPpLhiu68YD1KnHmbhQJQctcipvmFnqIBDYzcIHzf3Zpu0tpeOKtR4x76p9yohc506eGdOjTmyIBg== -lodash.uniq@4.5.0, lodash.uniq@^4.5.0: +lodash.uniq@^4.5.0, lodash.uniq@4.5.0: version "4.5.0" resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== @@ -6045,7 +5974,7 @@ micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: braces "^3.0.2" picomatch "^2.3.1" -mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": +"mime-db@>= 1.43.0 < 2", mime-db@1.52.0: version "1.52.0" resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== @@ -6055,19 +5984,26 @@ mime-db@~1.33.0: resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz" integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== -mime-types@2.1.18, mime-types@~2.1.17: +mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.24, mime-types@~2.1.34: + 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" + +mime-types@~2.1.17: 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== dependencies: mime-db "~1.33.0" -mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== +mime-types@2.1.18: + 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== dependencies: - mime-db "1.52.0" + mime-db "~1.33.0" mime@1.6.0: version "1.6.0" @@ -6096,7 +6032,7 @@ minimalistic-assert@^1.0.0: resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimatch@3.1.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1: +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -6165,16 +6101,16 @@ mrmime@^1.0.0: resolved "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz" integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== +ms@^2.1.1, ms@2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + ms@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== -ms@2.1.1, ms@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== - ms@2.1.2: version "2.1.2" resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" @@ -6232,6 +6168,13 @@ node-emoji@^1.10.0: dependencies: lodash "^4.17.21" +node-fetch@^2.6.12, node-fetch@^2.6.7: + 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== + dependencies: + whatwg-url "^5.0.0" + node-fetch@2.6.7: version "2.6.7" resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" @@ -6246,13 +6189,6 @@ node-fetch@2.6.9: dependencies: whatwg-url "^5.0.0" -node-fetch@^2.6.12, node-fetch@^2.6.7: - 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== - dependencies: - whatwg-url "^5.0.0" - node-forge@^1: version "1.3.1" resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz" @@ -6609,6 +6545,13 @@ path-parse@^1.0.7: resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-to-regexp@^1.0.0, path-to-regexp@^1.7.0: + version "1.8.0" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + dependencies: + isarray "0.0.1" + path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" @@ -6629,13 +6572,6 @@ path-to-regexp@6.2.1: resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz" integrity sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw== -path-to-regexp@^1.0.0, path-to-regexp@^1.7.0: - version "1.8.0" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz" - integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== - dependencies: - isarray "0.0.1" - path-type@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" @@ -6654,7 +6590,7 @@ pend@~1.2.0: resolved "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz" integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== -picocolors@1.0.0, picocolors@^1.0.0: +picocolors@^1.0.0, picocolors@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== @@ -7000,7 +6936,7 @@ postcss-zindex@^5.1.0: resolved "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-5.1.0.tgz" integrity sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A== -postcss@^8.3.11, postcss@^8.4.14, postcss@^8.4.17, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.31: +"postcss@^7.0.0 || ^8.0.1", postcss@^8.0.0, postcss@^8.0.9, postcss@^8.1.0, postcss@^8.2.14, postcss@^8.2.15, postcss@^8.2.2, postcss@^8.3.11, postcss@^8.4.14, postcss@^8.4.16, postcss@^8.4.17, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.31, postcss@>=8.0.9: version "8.4.31" resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz" integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== @@ -7154,16 +7090,16 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" -range-parser@1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz" - integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A== - range-parser@^1.2.1, range-parser@~1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== +range-parser@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz" + integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A== + raw-body@2.4.1: version "2.4.1" resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz" @@ -7184,7 +7120,7 @@ raw-body@2.5.1: iconv-lite "0.4.24" unpipe "1.0.0" -rc@1.2.8, rc@^1.2.8: +rc@^1.2.8, rc@1.2.8: version "1.2.8" resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -7234,7 +7170,7 @@ react-dev-utils@^12.0.1: strip-ansi "^6.0.1" text-table "^0.2.0" -react-dom@^17.0.2: +react-dom@*, "react-dom@^16.6.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.8.4 || ^17.0.0", "react-dom@^17.0.0 || ^16.3.0 || ^15.5.4", react-dom@^17.0.2, "react-dom@>= 16.8.0 < 19.0.0": version "17.0.2" resolved "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz" integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== @@ -7291,6 +7227,14 @@ react-loadable-ssr-addon-v5-slorber@^1.0.1: dependencies: "@babel/runtime" "^7.10.3" +react-loadable@*, "react-loadable@npm:@docusaurus/react-loadable@5.5.2": + 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" + react-router-config@^5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz" @@ -7311,7 +7255,7 @@ react-router-dom@^5.3.3: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react-router@5.3.4, react-router@^5.3.3: +react-router@^5.3.3, react-router@>=5, react-router@5.3.4: version "5.3.4" resolved "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz" integrity sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA== @@ -7335,7 +7279,7 @@ react-textarea-autosize@^8.3.2: use-composed-ref "^1.3.0" use-latest "^1.2.1" -react@^17.0.2: +react@*, "react@^15.0.2 || ^16.0.0 || ^17.0.0", "react@^16.13.1 || ^17.0.0", "react@^16.6.0 || ^17.0.0 || ^18.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^16.8.4 || ^17.0.0", "react@^17.0.0 || ^16.3.0 || ^15.5.4", react@^17.0.2, "react@>= 16.8.0 < 19.0.0", react@>=0.14.9, react@>=15, react@17.0.2: 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== @@ -7632,12 +7576,22 @@ rxjs@^7.5.4: dependencies: tslib "^2.1.0" -safe-buffer@5.1.2, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@>=5.1.0, safe-buffer@~5.1.0, safe-buffer@~5.1.1, safe-buffer@5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@5.2.1, safe-buffer@^5.2.1, safe-buffer@~5.2.0: +safe-buffer@^5.2.1: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@5.2.1: version "5.2.1" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -7660,15 +7614,6 @@ scheduler@^0.20.2: loose-envify "^1.1.0" object-assign "^4.1.1" -schema-utils@2.7.0: - version "2.7.0" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz" - integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== - dependencies: - "@types/json-schema" "^7.0.4" - ajv "^6.12.2" - ajv-keywords "^3.4.1" - schema-utils@^2.6.5: version "2.7.1" resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz" @@ -7678,7 +7623,25 @@ schema-utils@^2.6.5: ajv "^6.12.4" ajv-keywords "^3.5.2" -schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: +schema-utils@^3.0.0: + 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== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^3.1.1: + 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== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^3.2.0: 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== @@ -7697,6 +7660,20 @@ schema-utils@^4.0.0: ajv-formats "^2.1.1" ajv-keywords "^5.1.0" +schema-utils@2.7.0: + version "2.7.0" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz" + integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== + dependencies: + "@types/json-schema" "^7.0.4" + ajv "^6.12.2" + ajv-keywords "^3.4.1" + +"search-insights@>= 1 < 3": + version "2.13.0" + resolved "https://registry.npmjs.org/search-insights/-/search-insights-2.13.0.tgz" + integrity sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw== + section-matter@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz" @@ -7725,30 +7702,58 @@ semver-diff@^3.1.1: dependencies: semver "^6.3.0" -semver@6.3.1, semver@^6.0.0, semver@^6.2.0, semver@^6.3.0, semver@^6.3.1: +semver@^5.4.1: + version "5.7.2" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + +semver@^6.0.0, semver@^6.2.0, semver@^6.3.0, semver@^6.3.1, semver@6.3.1: version "6.3.1" resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@7.3.5: - version "7.3.5" - resolved "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== +semver@^7.3.2: + 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" -semver@^5.4.1: - version "5.7.2" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== +semver@^7.3.4: + 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" + +semver@^7.3.5: + version "7.6.0" + resolved "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== + dependencies: + lru-cache "^6.0.0" -semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8: +semver@^7.3.7: 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" +semver@^7.3.8: + 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" + +semver@7.3.5: + 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" + send@0.18.0: version "0.18.0" resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz" @@ -7884,16 +7889,16 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz" - integrity sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q== - signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.7" resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +signal-exit@4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz" + integrity sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q== + sirv@^2.0.3: version "2.0.3" resolved "https://registry.npmjs.org/sirv/-/sirv-2.0.3.tgz" @@ -8013,16 +8018,26 @@ state-toggle@^1.0.0: resolved "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz" integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== +"statuses@>= 1.2.1 < 2": + version "1.5.0" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== -"statuses@>= 1.2.1 < 2", "statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2": +"statuses@>= 1.4.0 < 2": version "1.5.0" resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== +"statuses@>= 1.5.0 < 2": + version "1.5.0" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + std-env@^3.0.1: version "3.4.3" resolved "https://registry.npmjs.org/std-env/-/std-env-3.4.3.tgz" @@ -8044,6 +8059,20 @@ stream-to-promise@2.2.0: end-of-stream "~1.1.0" stream-to-array "~2.3.0" +string_decoder@^1.1.1: + 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== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + 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" + "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" @@ -8062,20 +8091,6 @@ string-width@^5.0.1: emoji-regex "^9.2.2" strip-ansi "^7.0.1" -string_decoder@^1.1.1: - 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== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - 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" - stringify-object@^3.3.0: version "3.3.0" resolved "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz" @@ -8119,7 +8134,7 @@ strip-json-comments@~2.0.1: resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== -style-to-object@0.3.0, style-to-object@^0.3.0: +style-to-object@^0.3.0, style-to-object@0.3.0: version "0.3.0" resolved "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz" integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== @@ -8229,6 +8244,18 @@ tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== +tar@^6.1.11: + version "6.2.0" + resolved "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz" + integrity sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^5.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + tar@4.4.18: version "4.4.18" resolved "https://registry.npmjs.org/tar/-/tar-4.4.18.tgz" @@ -8242,18 +8269,6 @@ tar@4.4.18: safe-buffer "^5.2.1" yallist "^3.1.1" -tar@^6.1.11: - version "6.2.0" - resolved "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz" - integrity sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ== - dependencies: - chownr "^2.0.0" - fs-minipass "^2.0.0" - minipass "^5.0.0" - minizlib "^2.1.1" - mkdirp "^1.0.3" - yallist "^4.0.0" - terser-webpack-plugin@^5.3.3, terser-webpack-plugin@^5.3.7: version "5.3.9" resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz" @@ -8386,7 +8401,7 @@ ts-morph@12.0.0: "@ts-morph/common" "~0.11.0" code-block-writer "^10.1.1" -ts-node@10.9.1: +ts-node@>=9.0.0, ts-node@10.9.1: version "10.9.1" resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz" integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== @@ -8440,7 +8455,7 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typescript@4.9.5, typescript@^4.7.4: +typescript@^4.7.4, "typescript@>= 2.7", typescript@>=2.7, typescript@>=4.9.5, typescript@4.9.5: version "4.9.5" resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz" integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== @@ -8498,10 +8513,10 @@ unicode-property-aliases-ecmascript@^2.0.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== -unified@9.2.0: - version "9.2.0" - resolved "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz" - integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg== +unified@^9.2.2: + 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" extend "^3.0.0" @@ -8510,10 +8525,10 @@ unified@9.2.0: trough "^1.0.0" vfile "^4.0.0" -unified@^9.2.2: - version "9.2.2" - resolved "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz" - integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== +unified@9.2.0: + version "9.2.0" + resolved "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz" + integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg== dependencies: bail "^1.0.0" extend "^3.0.0" @@ -8529,7 +8544,7 @@ unique-string@^2.0.0: dependencies: crypto-random-string "^2.0.0" -unist-builder@2.0.3, unist-builder@^2.0.0: +unist-builder@^2.0.0, unist-builder@2.0.3: version "2.0.3" resolved "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz" integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== @@ -8578,7 +8593,7 @@ unist-util-visit-parents@^3.0.0: "@types/unist" "^2.0.0" unist-util-is "^4.0.0" -unist-util-visit@2.0.3, unist-util-visit@^2.0.0, unist-util-visit@^2.0.3: +unist-util-visit@^2.0.0, unist-util-visit@^2.0.3, unist-util-visit@2.0.3: 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== @@ -8597,7 +8612,7 @@ universalify@^2.0.0: resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== -unpipe@1.0.0, unpipe@~1.0.0: +unpipe@~1.0.0, unpipe@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== @@ -8702,16 +8717,16 @@ utils-merge@1.0.1: resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== -uuid@3.3.2: - version "3.3.2" - resolved "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz" - integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== - uuid@^8.3.2: version "8.3.2" resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +uuid@3.3.2: + version "3.3.2" + resolved "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz" + integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== + v8-compile-cache-lib@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" @@ -8727,22 +8742,22 @@ vary@~1.1.2: resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== -vercel@^33.4.0: - version "33.4.0" - resolved "https://registry.npmjs.org/vercel/-/vercel-33.4.0.tgz" - integrity sha512-uB8XcTvARBsJtXCbhm/+F3qtV/FQXYYxx6jyUMfMU8izmOmWUlcSOmARbctL4vZ3Izj4ku+P4S25aDQFNmhGYQ== +vercel@^33.5.4: + version "33.5.4" + resolved "https://registry.npmjs.org/vercel/-/vercel-33.5.4.tgz" + integrity sha512-eLxW4N1VJUDcl0pUXZ3Yd/GaEXyq/S+D7l4yrHof+a2lMAq3EntMD6wLzovMPHFtYRnpXKJA/2aYehXchWsQcw== dependencies: - "@vercel/build-utils" "7.5.1" + "@vercel/build-utils" "7.7.1" "@vercel/fun" "1.1.0" "@vercel/go" "3.0.5" "@vercel/hydrogen" "1.0.2" - "@vercel/next" "4.1.0" - "@vercel/node" "3.0.17" + "@vercel/next" "4.1.4" + "@vercel/node" "3.0.21" "@vercel/python" "4.1.1" - "@vercel/redwood" "2.0.6" - "@vercel/remix-builder" "2.0.18" + "@vercel/redwood" "2.0.8" + "@vercel/remix-builder" "2.1.1" "@vercel/ruby" "2.0.5" - "@vercel/static-build" "2.1.0" + "@vercel/static-build" "2.4.1" chokidar "3.3.1" vfile-location@^3.0.0, vfile-location@^3.2.0: @@ -8893,7 +8908,7 @@ webpack-sources@^3.2.2, webpack-sources@^3.2.3: resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== -webpack@^5.73.0: +"webpack@^4.0.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", webpack@^5.0.0, webpack@^5.1.0, webpack@^5.20.0, webpack@^5.73.0, "webpack@>= 4", webpack@>=2, "webpack@>=4.41.1 || 5.x", "webpack@3 || 4 || 5": version "5.89.0" resolved "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz" integrity sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw== @@ -8933,7 +8948,7 @@ webpackbar@^5.0.2: pretty-time "^1.1.0" std-env "^3.0.1" -websocket-driver@>=0.5.1, websocket-driver@^0.7.4: +websocket-driver@^0.7.4, websocket-driver@>=0.5.1: version "0.7.4" resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== @@ -9069,7 +9084,17 @@ xtend@^4.0.0, xtend@^4.0.1: resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== -yallist@^3.0.0, yallist@^3.0.2, yallist@^3.1.1: +yallist@^3.0.0: + version "3.1.1" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== From 6058405f17b69d9dc969e3e9fb672057121a2738 Mon Sep 17 00:00:00 2001 From: Ori Shoshan Date: Thu, 14 Mar 2024 16:15:48 +0100 Subject: [PATCH 20/20] fixups --- .../network-mapping-network-policies/reference/README.mdx | 4 ++-- .../tutorials/k8s-egress-access-control-tutorial.mdx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/features/network-mapping-network-policies/reference/README.mdx b/docs/features/network-mapping-network-policies/reference/README.mdx index 3c1eb4759..dacfa4710 100644 --- a/docs/features/network-mapping-network-policies/reference/README.mdx +++ b/docs/features/network-mapping-network-policies/reference/README.mdx @@ -32,10 +32,10 @@ spec: When a ClientIntent is specified utilizing DNS identifiers, such as domain names, it initiates a sequence of operations to integrate the relevant IP addresses into the respective NetworkPolicies. -1. The NetworkMapper incorporates a DNS cache layer, which identifies and archives all resolved DNS records alongside their corresponding IPv4 and IPv6 IP addresses. +1. The Network Mapper incorporates a DNS cache layer, which identifies and archives all resolved DNS records alongside their corresponding IPv4 and IPv6 IP addresses. 2. Without a ClientIntent associated with the given domain or its related IP addresses, Otterize will propose a policy tailored to the observed traffic. 3. Upon the application of a ClientIntent with a domain name present in the cache, the NetworkMapper dynamically updates the intent’s `status` section at one-second intervals with any newly identified IP addresses. It is important to note that Otterize retains all previously identified IP addresses to ensure backward compatibility. -4. The IntentOperator reviews changes within the `status` section and amends the associated NetworkPolicy to include these newly discovered IP addresses. +4. The Intents Operator reviews changes within the `status` section and amends the associated NetworkPolicy to include these newly discovered IP addresses. diff --git a/docs/features/network-mapping-network-policies/tutorials/k8s-egress-access-control-tutorial.mdx b/docs/features/network-mapping-network-policies/tutorials/k8s-egress-access-control-tutorial.mdx index cfb011039..390793a85 100644 --- a/docs/features/network-mapping-network-policies/tutorials/k8s-egress-access-control-tutorial.mdx +++ b/docs/features/network-mapping-network-policies/tutorials/k8s-egress-access-control-tutorial.mdx @@ -1,6 +1,6 @@ --- sidebar_position: 5 -title: Egress Network Policy Automation +title: Egress NetworkPolicy Automation image: /img/quick-tutorials/egress-access-control/social.png ---

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 literal 0 HcmV?d00001 From 4a2836c3b7fea68d0548f5599775f0f7765539e2 Mon Sep 17 00:00:00 2001 From: bglynn Date: Thu, 8 Feb 2024 11:40:01 -0800 Subject: [PATCH 16/20] word changes --- .../tutorials/k8s-egress-access-control-tutorial.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/network-mapping-network-policies/tutorials/k8s-egress-access-control-tutorial.mdx b/docs/features/network-mapping-network-policies/tutorials/k8s-egress-access-control-tutorial.mdx index 869cf5620..de9ffb06a 100644 --- a/docs/features/network-mapping-network-policies/tutorials/k8s-egress-access-control-tutorial.mdx +++ b/docs/features/network-mapping-network-policies/tutorials/k8s-egress-access-control-tutorial.mdx @@ -34,7 +34,7 @@ kubectl apply -n otterize-tutorial-egress -f ${ABSOLUTE_URL}/code-examples/netwo By default, in Kubernetes, pods are non-isolated. Meaning they accept traffic from any source and can send traffic to any source. When you introduce policies, either ingress or egress pods become isolated. Any connection not explicitly allowed will be rejected. When an ingress policy type is introduced, any traffic that does not match a rule will be rejected. Similarly, when an egress policy type is introduced, any traffic that does not match a rule will not be allowed out of the pod. -Problems can arise when introducing egress policies on services that rely on external communications, which are not immediately considered. This might be DNS, time, package repositories, logging, telemetry, cloud provider, authentication, or other external core dependencies that might not be related to the direct functionality of the pod. +Stringent policies can be essential in certain sectors, such as healthcare, finance, and government. Implementing egress policies is crucial in minimizing attack surfaces by concealing services or restricting the exposure of any compromised services. However, challenges may emerge when egress policies are applied to services dependent on external communications that were not initially accounted for. These external communications could include DNS, time synchronization, package repositories, logging, telemetry, cloud services, authentication, or other critical external dependencies that, while not directly related to a pod's primary functionality, are vital for its operation. Otterize helps elevate these issues by capturing and mapping the ingress and egress connections used by your pods and then providing suggested policies to maintain your witnessed tariff. You can also enable [shadow enforcement](/reference/shadow-vs-active-enforcement) to see which connections would be blocked without committing to active enforcement. From dd6daec3e99a1c9647303e27970b83c72db9c86d Mon Sep 17 00:00:00 2001 From: Ori Shoshan Date: Wed, 21 Feb 2024 23:09:03 +0100 Subject: [PATCH 17/20] Add TODOs and small changes --- .../k8s-egress-access-control-tutorial.mdx | 63 ++++++------------- .../default-deny-policy.yaml | 2 +- 2 files changed, 21 insertions(+), 44 deletions(-) diff --git a/docs/features/network-mapping-network-policies/tutorials/k8s-egress-access-control-tutorial.mdx b/docs/features/network-mapping-network-policies/tutorials/k8s-egress-access-control-tutorial.mdx index de9ffb06a..b0f8e1b3a 100644 --- a/docs/features/network-mapping-network-policies/tutorials/k8s-egress-access-control-tutorial.mdx +++ b/docs/features/network-mapping-network-policies/tutorials/k8s-egress-access-control-tutorial.mdx @@ -1,14 +1,14 @@ --- sidebar_position: 5 -title: Egress Policy Automation +title: Egress Network Policy Automation image: /img/quick-tutorials/egress-access-control/social.png --- -Let’s learn how Otterize automates egress access control with network policies +Let’s learn how Otterize automates egress access control with network policies. In this tutorial, we will: - Deploy an example cluster consisting of an example frontend for a personal advice application and a server with an external dependency to retrieve wisdom. -- Declare our network intents for each pod, including public internet and internal network egress rules. +- Declare ClientIntents for each service, including public internet and internal network egress intents. - See that a network policy was autogenerated to allow just that and block the (undeclared) calls from the other client. ## Prerequisites @@ -45,17 +45,24 @@ We aim to secure the network in our example cluster by introducing a default den * Frontend - Needs to retrieve advice from our backend. This will result in an egress policy on our frontend and an ingress policy on our backend. * Backend - Needs to be able to accept our frontend request and communicate to an external API. This will create an ingress policy for our frontend and an egress policy for the external API. -As previously mentioned, the pods will be non-isolated by default, and everything will work. Can you open up the logs on the frontend to see the free advice flowing: +As previously mentioned, the pods will be non-isolated by default, and everything will work. Check the logs for the frontend service to see the free advice flowing: ```bash kubectl logs -f -n otterize-tutorial-egress-access deploy/frontend ``` +:::danger +TODO Please add an example output here, and a screenshot of the resulting network map. +::: + ### Applying our intents Given that this is a serious advice application, we want to lock down our pods to ensure no outside inference can occur. To enforce the strict communication rules for our services, we will start by applying a default deny policy, ensuring that only explicitly defined connections are allowed. You’ll see that we are allowing UDP on port 53 to support any DNS lookups we need. +:::danger +TODO Please explain why it's important to allow DNS lookups (what would happen if we didn't). +::: ```bash kubectl apply -n otterize-tutorial-egress-access -f ${ABSOLUTE_URL}/code-examples/egress-access-control/default-deny-policy.yaml @@ -63,20 +70,7 @@ kubectl apply -n otterize-tutorial-egress-access -f ${ABSOLUTE_URL}/code-example *Default Deny Policy* ```yaml -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - name: default-deny-ingress -spec: - podSelector: {} - policyTypes: - - Egress - - Ingress - egress: - - ports: - - protocol: UDP - port: 53 - +{@include: ../../../../static/code-examples/egress-access-control/default-deny-policy.yaml} ``` @@ -92,36 +86,19 @@ Now that we have secured our broader network, we will apply the following Client kubectl apply -n otterize-tutorial-egress-access -f ${ABSOLUTE_URL}/code-examples/egress-access-control/intents.yaml ``` +:::danger +TODO Please note the use of @include here to make sure the yaml showing below and the link lead to the same file. +::: ```yaml -apiVersion: k8s.otterize.com/v1alpha3 -kind: ClientIntents -metadata: - name: frontend - namespace: otterize-tutorial-egress-access -spec: - service: - name: frontend - calls: - - name: backend ---- -apiVersion: k8s.otterize.com/v1alpha3 -kind: ClientIntents -metadata: - name: backend - namespace: otterize-tutorial-egress-access -spec: - service: - name: backend - calls: - - type: internet - internet: - ips: - - 185.53.57.80 # IP address of our external API - - name: frontend +{@include: ../../../../static/code-examples/egress-access-control/intents.yaml} ``` Now, our network and our services are only able to open connections to those internal and external resources that are explicitly needed. +:::danger +TODO Please show the resulting network policies here, and explain how they work (e.g. why the rules that are there result in traffic being allowed). +::: + The protected network can be seen on Otterize Cloud: diff --git a/static/code-examples/egress-access-control/default-deny-policy.yaml b/static/code-examples/egress-access-control/default-deny-policy.yaml index a75e315a9..a24890287 100644 --- a/static/code-examples/egress-access-control/default-deny-policy.yaml +++ b/static/code-examples/egress-access-control/default-deny-policy.yaml @@ -2,7 +2,7 @@ apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: - name: default-deny-ingress + name: default-deny spec: podSelector: {} policyTypes: From 31686aa3ed3e079126035da010623e291b160634 Mon Sep 17 00:00:00 2001 From: bglynn Date: Sun, 25 Feb 2024 13:52:34 -0800 Subject: [PATCH 18/20] PR Comments Updated docker containers --- .../k8s-egress-access-control-tutorial.mdx | 178 ++++++++++++++++-- .../egress-access-control/all.yaml | 6 +- .../unprotected-network-egress-tutorial.png | Bin 0 -> 75967 bytes 3 files changed, 163 insertions(+), 21 deletions(-) create mode 100644 static/img/quick-tutorials/egress-access-control/unprotected-network-egress-tutorial.png diff --git a/docs/features/network-mapping-network-policies/tutorials/k8s-egress-access-control-tutorial.mdx b/docs/features/network-mapping-network-policies/tutorials/k8s-egress-access-control-tutorial.mdx index b0f8e1b3a..9234a51bd 100644 --- a/docs/features/network-mapping-network-policies/tutorials/k8s-egress-access-control-tutorial.mdx +++ b/docs/features/network-mapping-network-policies/tutorials/k8s-egress-access-control-tutorial.mdx @@ -3,6 +3,10 @@ sidebar_position: 5 title: Egress Network Policy Automation image: /img/quick-tutorials/egress-access-control/social.png --- + +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; + Let’s learn how Otterize automates egress access control with network policies. In this tutorial, we will: @@ -13,7 +17,7 @@ In this tutorial, we will: ## Prerequisites ### Install Otterize on your cluster -To deploy Otterize, head over to [Otterize Cloud](https://app.otterize.com/), and to integrate your cluster, navigate to the [Clusters page](https://app.otterize.com/clusters) and follow the instructions, but be sure to add the flag below. +To deploy Otterize, head over to [Otterize Cloud](https://app.otterize.com/), and to integrate your cluster, navigate to the [Integrations page](https://app.otterize.com/integrations) and follow the instructions, but be sure to add the flag below. **Note:** Egress policy creation is off by default. We must add the following flag when installing Otterize to enable egress policy creation. ```bash @@ -26,8 +30,8 @@ To deploy Otterize, head over to [Otterize Cloud](https://app.otterize.com/), an This will set up the namespace we will use for our tutorial and deploy the cluster containing our front and backend pods. Upon deployment, our cluster will have no network policies in place. ```yaml -kubectl create namespace otterize-tutorial-egress -kubectl apply -n otterize-tutorial-egress -f ${ABSOLUTE_URL}/code-examples/network-egress/all.yaml +kubectl create namespace otterize-tutorial-egress-access +kubectl apply -n otterize-tutorial-egress-access -f ${ABSOLUTE_URL}/code-examples/egress-access-control/all.yaml ``` ### About Network Policies @@ -50,19 +54,26 @@ As previously mentioned, the pods will be non-isolated by default, and everythin ```bash kubectl logs -f -n otterize-tutorial-egress-access deploy/frontend ``` +Example log output: +``` +The answer to all your problems is to: +The sun always shines above the clouds. + +The answer to all your problems is to: +Stop procrastinating. + +The answer to all your problems is to: +Don't feed Mogwais after midnight. +``` +View of our non-isolated cluster within Otterize Cloud + -:::danger -TODO Please add an example output here, and a screenshot of the resulting network map. -::: ### Applying our intents Given that this is a serious advice application, we want to lock down our pods to ensure no outside inference can occur. -To enforce the strict communication rules for our services, we will start by applying a default deny policy, ensuring that only explicitly defined connections are allowed. You’ll see that we are allowing UDP on port 53 to support any DNS lookups we need. -:::danger -TODO Please explain why it's important to allow DNS lookups (what would happen if we didn't). -::: +To enforce the strict communication rules for our services, we will start by applying a default deny policy, ensuring that only explicitly defined connections are allowed. You’ll see that we are allowing UDP on port 53 to support any DNS lookups we need. Without DNS support, our pods could not resolve their cluster names (*frontend*, *backend*) to their internal IP addresses nor resolve the domain names used by our external advise API service. ```bash kubectl apply -n otterize-tutorial-egress-access -f ${ABSOLUTE_URL}/code-examples/egress-access-control/default-deny-policy.yaml @@ -73,12 +84,18 @@ kubectl apply -n otterize-tutorial-egress-access -f ${ABSOLUTE_URL}/code-example {@include: ../../../../static/code-examples/egress-access-control/default-deny-policy.yaml} ``` - You can now see in the logs that the pods are isolated from each other and the public internet: ```bash kubectl logs -f -n otterize-tutorial-egress-access deploy/frontend ``` +Example log output from *frontend* pod: +``` +Unable to connect to the backend +Unable to connect to the backend +Unable to connect to the backend +``` + Now that we have secured our broader network, we will apply the following ClientIntents to enable traffic for our services. @@ -86,18 +103,143 @@ Now that we have secured our broader network, we will apply the following Client kubectl apply -n otterize-tutorial-egress-access -f ${ABSOLUTE_URL}/code-examples/egress-access-control/intents.yaml ``` -:::danger -TODO Please note the use of @include here to make sure the yaml showing below and the link lead to the same file. -::: ```yaml {@include: ../../../../static/code-examples/egress-access-control/intents.yaml} ``` -Now, our network and our services are only able to open connections to those internal and external resources that are explicitly needed. +Now, our network and our services are only able to open connections to those internal and external resources that are explicitly needed. Below, we can inspect the five different NetworkPolicies generated by Otterize and look at the annotations to see how these policies match their applied pods and designated traffic rules. + + + + +```yaml +Name: access-to-backend-from-otterize-tutorial-egress-access +Namespace: otterize-tutorial-egress-access +Created on: 2024-02-25 12:20:52 -0800 PST +Labels: intents.otterize.com/network-policy=backend-otterize-tutorial-eg-00531a +Annotations: none +Spec: + # Selector specifying pods to which the policy applies. In this case, it targets pod labeled as backend. + # Otterize automatically adds these labels, ensuring they persist across deployments and multiple instances. + PodSelector: intents.otterize.com/server=backend-otterize-tutorial-eg-00531a + Allowing ingress traffic: + # Specifies that the policy allows traffic to any port on the selected pods. + To Port: any (traffic allowed to all ports) + From: + # Specifying the namespace for our pod selector + NamespaceSelector: kubernetes.io/metadata.name=otterize-tutorial-egress-access + # Further refines the allowed sources of ingress to only those pods with the Otterize managed label + PodSelector: intents.otterize.com/access-backend-otterize-tutorial-eg-00531a=true + Not affecting egress traffic + # Specifies that this policy only applies to incoming traffic to the selected pods. + Policy Types: Ingress +``` + + + +```yaml +Name: access-to-frontend-from-otterize-tutorial-egress-access +Namespace: otterize-tutorial-egress-access +Created on: 2024-02-25 12:20:52 -0800 PST +Labels: intents.otterize.com/network-policy=frontend-otterize-tutorial-eg-2bb536 +Annotations: none +Spec: + # This label identifies the NetworkPolicy as relating to the frontend pod + # Otterize automatically adds these labels, ensuring they persist across deployments and multiple instances. + PodSelector: intents.otterize.com/server=frontend-otterize-tutorial-eg-2bb536 + Allowing ingress traffic: + # Specifies that the policy permits traffic to any port on the selected pods + To Port: any (traffic allowed to all ports) + From: + # Specifying the namespace for our pod selector + NamespaceSelector: kubernetes.io/metadata.name=otterize-tutorial-egress-access + # Further refines the allowed sources of ingress to only those pods with the Otterize managed label + PodSelector: intents.otterize.com/access-frontend-otterize-tutorial-eg-2bb536=true + Not affecting egress traffic + # Specifies that this policy only applies to incoming traffic to the selected pods. + Policy Types: Ingress +``` + + + +```yaml +Name: egress-to-backend.otterize-tutorial-egress-access-from-frontend +Namespace: otterize-tutorial-egress-access +Created on: 2024-02-25 12:20:52 -0800 PST +Labels: intents.otterize.com/egress-network-policy=frontend-otterize-tutorial-eg-2bb536 + intents.otterize.com/egress-network-policy-target=backend-otterize-tutorial-eg-00531a +Annotations: none +Spec: + # This selector targets the pods to which the policy applies. Here, it specifically targets pods labeled as "client" of the "frontend" + # Otterize automatically adds these labels, ensuring they persist across deployments and multiple instances. + PodSelector: intents.otterize.com/client=frontend-otterize-tutorial-eg-2bb536 + Not affecting ingress traffic + Allowing egress traffic: + # Specifies that the policy allows egress traffic to any port + To Port: any (traffic allowed to all ports) + To: + # Specifying the namespace for our pod selector + NamespaceSelector: kubernetes.io/metadata.name=otterize-tutorial-egress-access + # Further refines the allowed sources of egress to only those pods with the Otterize managed label + PodSelector: intents.otterize.com/server=backend-otterize-tutorial-eg-00531a + # Specifies that this policy only applies to outbound traffic to the selected pods. + Policy Types: Egress +``` + + -:::danger -TODO Please show the resulting network policies here, and explain how they work (e.g. why the rules that are there result in traffic being allowed). -::: +```yaml +Name: egress-to-frontend.otterize-tutorial-egress-access-from-backend +Namespace: otterize-tutorial-egress-access +Created on: 2024-02-25 12:20:52 -0800 PST +Labels: intents.otterize.com/egress-network-policy=backend-otterize-tutorial-eg-00531a + intents.otterize.com/egress-network-policy-target=frontend-otterize-tutorial-eg-2bb536 +Annotations: none +Spec: + # This selector targets the pods to which the policy applies. Here, it specifically targets pods labeled as "client" of the "backend" + # Otterize automatically adds these labels, ensuring they persist across deployments and multiple instances. + PodSelector: intents.otterize.com/client=backend-otterize-tutorial-eg-00531a + Not affecting ingress traffic + Allowing egress traffic: + # Specifies that the policy allows egress traffic to any port + To Port: any (traffic allowed to all ports) + To: + # Specifying the namespace for our pod selector + NamespaceSelector: kubernetes.io/metadata.name=otterize-tutorial-egress-access + # Further refines the allowed sources of egress to only those pods with the Otterize managed label + PodSelector: intents.otterize.com/server=frontend-otterize-tutorial-eg-2bb536 + # Specifies that this policy only applies to outbound traffic to the selected pods. + Policy Types: Egress + +``` + + + +```yaml +Name: egress-to-internet-from-backend +Namespace: otterize-tutorial-egress-access +Created on: 2024-02-25 12:20:52 -0800 PST +Labels: intents.otterize.com/egress-internet-network-policy=backend-otterize-tutorial-eg-00531a +Annotations: none +Spec: + # This selector targets the pods to which the policy applies. Here, it specifically targets pods labeled as "client" of the "backend" + # Otterize automatically adds these labels, ensuring they persist across deployments and multiple instances. + PodSelector: intents.otterize.com/client=backend-otterize-tutorial-eg-00531a + Not affecting ingress traffic + Allowing egress traffic: + # Specifies that the policy allows egress traffic to any port + To Port: any (traffic allowed to all ports) + To: + # Specifies the IP address range to which the policy allows egress traffic. Here, a /32 CIDR notation indicates a single IP address, suggesting this policy targets the IP address associated with our advise API + IPBlock: + CIDR: 185.53.57.80/32 + # The 'Except' field allows specifying IP addresses within the defined CIDR range that we should exclude, but it is empty in this case. + Except: + # Specifies that this policy only applies to outbound traffic to the selected pods. + Policy Types: Egress +``` + + The protected network can be seen on Otterize Cloud: diff --git a/static/code-examples/egress-access-control/all.yaml b/static/code-examples/egress-access-control/all.yaml index 16c59de4f..6d2bcca67 100644 --- a/static/code-examples/egress-access-control/all.yaml +++ b/static/code-examples/egress-access-control/all.yaml @@ -20,7 +20,7 @@ spec: containers: - name: frontend imagePullPolicy: Always - image: 'brianglynn/frontend' + image: 'otterize/egress-tutorial-frontend' --- apiVersion: apps/v1 kind: Deployment @@ -39,7 +39,7 @@ spec: containers: - name: backend imagePullPolicy: Always - image: 'brianglynn/backend' + image: 'otterize/egress-tutorial-backend' ports: - containerPort: 8080 --- @@ -47,7 +47,7 @@ apiVersion: v1 kind: Service metadata: name: backend - namespace: otterize-tutorial-egress-access + namespace: otterize-tutorial-egress-access spec: selector: app: backend diff --git a/static/img/quick-tutorials/egress-access-control/unprotected-network-egress-tutorial.png b/static/img/quick-tutorials/egress-access-control/unprotected-network-egress-tutorial.png new file mode 100644 index 0000000000000000000000000000000000000000..7a2bc2986fb41da589ec28670073d6e8d01c8357 GIT binary patch literal 75967 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 literal 0 HcmV?d00001 From 77d757cd634ad0e9a838761039634a66a806f50c Mon Sep 17 00:00:00 2001 From: bglynn Date: Fri, 8 Mar 2024 13:52:05 -0800 Subject: [PATCH 19/20] Updating the egress tutorial to include a domain name clientintent example --- .../reference/README.mdx | 24 +- .../k8s-egress-access-control-tutorial.mdx | 64 +- package.json | 2 +- .../dns-enabled-npol.yaml | 22 + .../egress-access-control/domain-intents.yaml | 26 + yarn.lock | 1125 +++++++++-------- 6 files changed, 702 insertions(+), 561 deletions(-) create mode 100644 static/code-examples/egress-access-control/dns-enabled-npol.yaml create mode 100644 static/code-examples/egress-access-control/domain-intents.yaml diff --git a/docs/features/network-mapping-network-policies/reference/README.mdx b/docs/features/network-mapping-network-policies/reference/README.mdx index b81897009..3d604ac72 100644 --- a/docs/features/network-mapping-network-policies/reference/README.mdx +++ b/docs/features/network-mapping-network-policies/reference/README.mdx @@ -1,10 +1,10 @@ --- sidebar_position: 3 title: Reference -hide_table_of_contents: true +hide_table_of_contents: false --- -### ClientIntents example (YAML) +## ClientIntents example (YAML) ```yaml apiVersion: k8s.otterize.com/v1alpha3 @@ -28,8 +28,22 @@ spec: methods: [ get, post ] ``` +#### ClientIntents and DNS values -### Helm Chart options +When a ClientIntent is specified utilizing DNS identifiers, such as domain names, it initiates a sequence of operations to integrate the relevant IP addresses into the respective NetworkPolicies. + +1. The NetworkMapper incorporates a DNS cache layer, which identifies and archives all resolved DNS records alongside their corresponding IPv4 and IPv6 IP addresses. +2. Without a ClientIntent associated with the given domain or its related IP addresses, Otterize will propose a policy tailored to the observed traffic. +3. Upon the application of a ClientIntent with a domain name present in the cache, the NetworkMapper dynamically updates the intent’s `status` section at one-second intervals with any newly identified IP addresses. It is important to note that Otterize retains all previously identified IP addresses to ensure backward compatibility. +4. The IntentOperator reviews changes within the `status` section and amends the associated NetworkPolicy to include these newly discovered IP addresses. + + + + + + + +## Helm Chart options | Key | Description | Default | |-----------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------|---------| @@ -39,12 +53,12 @@ spec: View the [Helm chart reference](/reference/configuration/otterize-chart) for all other options -### Network mapper parameters +## Network mapper parameters All configurable parameters of the network mapper can be configured under the alias `networkMapper`. Further information about network mapper parameters can be found [in the network mapper's chart](https://github.com/otterize/helm-charts/tree/main/network-mapper). -### CLI: Network mapper commands +## CLI: Network mapper commands All `otterize network-mapper` commands share a set of optional flags which will not be repeated in the documentation for each command. diff --git a/docs/features/network-mapping-network-policies/tutorials/k8s-egress-access-control-tutorial.mdx b/docs/features/network-mapping-network-policies/tutorials/k8s-egress-access-control-tutorial.mdx index 9234a51bd..cfb011039 100644 --- a/docs/features/network-mapping-network-policies/tutorials/k8s-egress-access-control-tutorial.mdx +++ b/docs/features/network-mapping-network-policies/tutorials/k8s-egress-access-control-tutorial.mdx @@ -14,12 +14,14 @@ In this tutorial, we will: - Deploy an example cluster consisting of an example frontend for a personal advice application and a server with an external dependency to retrieve wisdom. - Declare ClientIntents for each service, including public internet and internal network egress intents. - See that a network policy was autogenerated to allow just that and block the (undeclared) calls from the other client. +- Revise our intent to use DNS records to tie our network policies to domain names. ## Prerequisites ### Install Otterize on your cluster To deploy Otterize, head over to [Otterize Cloud](https://app.otterize.com/), and to integrate your cluster, navigate to the [Integrations page](https://app.otterize.com/integrations) and follow the instructions, but be sure to add the flag below. **Note:** Egress policy creation is off by default. We must add the following flag when installing Otterize to enable egress policy creation. + ```bash --set intentsOperator.operator.enableEgressNetworkPolicyCreation=true ``` @@ -65,10 +67,10 @@ Stop procrastinating. The answer to all your problems is to: Don't feed Mogwais after midnight. ``` + View of our non-isolated cluster within Otterize Cloud - ### Applying our intents Given that this is a serious advice application, we want to lock down our pods to ensure no outside inference can occur. @@ -244,19 +246,71 @@ Spec: The protected network can be seen on Otterize Cloud: +### Using DNS and domain names in ClientIntents +In the preceding example, a static IP address was employed for the definitions of our intents. Typically, in practical scenarios, a domain name precedes an external service rather than a static IP address. The inherent absence of a direct method to handle NetworkPolicies via domain names presents a considerable challenge in devising policy configurations for services characterized by dynamic IP addresses. However, the capability of ClientIntents to incorporate domain names, DNS records, and static IP addresses offers a flexible solution to this challenge. Below is an enhanced version of a ClientIntent that leverages a domain name. -## Teardown +```yaml +{@include: ../../../../static/code-examples/egress-access-control/domain-intents.yaml} +``` -To remove the deployed examples, run: +In the above YAML file, we have replaced the IP address with our service’s domain name. -```*bash* -kubectl delete namespace otterize-tutorial-egress-access +Otterize will now track the resolved IP addresses for `api.adviceslip.com` and add them to NetworkPolicies within your clusters. Let’s deploy the revised intent with the command below: + +```bash +kubectl apply -n otterize-tutorial-egress-access -f ${ABSOLUTE_URL}/code-examples/egress-access-control/domain-intents.yaml +``` + +After the updated definition takes effect, with the command below we can view the policy again to find some additions. + +```bash +kubectl describe clientintents -n otterize-tutorial-egress-access backend --show-events=false ``` +