diff --git a/.gitignore b/.gitignore
index a4e6b621f..0af2c504b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -39,7 +39,7 @@ examples/cloud-operations/adfs/ansible/vars/vars.yaml
examples/cloud-operations/adfs/ansible/gssh.sh
examples/cloud-operations/multi-cluster-mesh-gke-fleet-api/ansible/vars.yaml
examples/cloud-operations/multi-cluster-mesh-gke-fleet-api/ansible/gssh.sh
-blueprints/cloud-operations/network-dashboard/cloud-function.zip
+blueprints/cloud-operations/network-quota-monitoring/cloud-function.zip
blueprints/apigee/bigquery-analytics/bundle-export.zip
blueprints/apigee/bigquery-analytics/bundle-gcs2bq.zip
blueprints/apigee/bigquery-analytics/apiproxy.zip
diff --git a/blueprints/README.md b/blueprints/README.md
index b9851bde9..5d5a5d02a 100644
--- a/blueprints/README.md
+++ b/blueprints/README.md
@@ -5,11 +5,11 @@ This section provides **[networking blueprints](./networking/)** that implement
Currently available blueprints:
- **apigee** - [Apigee Hybrid on GKE](./apigee/hybrid-gke/), [Apigee X analytics in BigQuery](./apigee/bigquery-analytics), [Apigee network patterns](./apigee/network-patterns/)
-- **cloud operations** - [Active Directory Federation Services](./cloud-operations/adfs), [Cloud Asset Inventory feeds for resource change tracking and remediation](./cloud-operations/asset-inventory-feed-remediation), [Fine-grained Cloud DNS IAM via Service Directory](./cloud-operations/dns-fine-grained-iam), [Cloud DNS & Shared VPC design](./cloud-operations/dns-shared-vpc), [Delegated Role Grants](./cloud-operations/iam-delegated-role-grants), [Networking Dashboard](./cloud-operations/network-dashboard), [Managing on-prem service account keys by uploading public keys](./cloud-operations/onprem-sa-key-management), [Compute Image builder with Hashicorp Packer](./cloud-operations/packer-image-builder), [Packer example](./cloud-operations/packer-image-builder/packer), [Compute Engine quota monitoring](./cloud-operations/quota-monitoring), [Scheduled Cloud Asset Inventory Export to Bigquery](./cloud-operations/scheduled-asset-inventory-export-bq), [Configuring workload identity federation with Terraform Cloud/Enterprise workflows](./cloud-operations/terraform-cloud-dynamic-credentials), [TCP healthcheck and restart for unmanaged GCE instances](./cloud-operations/unmanaged-instances-healthcheck), [Migrate for Compute Engine (v5) blueprints](./cloud-operations/vm-migration), [Configuring workload identity federation to access Google Cloud resources from apps running on Azure](./cloud-operations/workload-identity-federation)
+- **cloud operations** - [Active Directory Federation Services](./cloud-operations/adfs), [Cloud Asset Inventory feeds for resource change tracking and remediation](./cloud-operations/asset-inventory-feed-remediation), [Fine-grained Cloud DNS IAM via Service Directory](./cloud-operations/dns-fine-grained-iam), [Cloud DNS & Shared VPC design](./cloud-operations/dns-shared-vpc), [Delegated Role Grants](./cloud-operations/iam-delegated-role-grants), [Network Quota Monitoring](./cloud-operations/network-quota-monitoring), [Managing on-prem service account keys by uploading public keys](./cloud-operations/onprem-sa-key-management), [Compute Image builder with Hashicorp Packer](./cloud-operations/packer-image-builder), [Packer example](./cloud-operations/packer-image-builder/packer), [Compute Engine quota monitoring](./cloud-operations/compute-quota-monitoring), [Scheduled Cloud Asset Inventory Export to Bigquery](./cloud-operations/scheduled-asset-inventory-export-bq), [Configuring workload identity federation with Terraform Cloud/Enterprise workflows](./cloud-operations/terraform-cloud-dynamic-credentials), [TCP healthcheck and restart for unmanaged GCE instances](./cloud-operations/unmanaged-instances-healthcheck), [Migrate for Compute Engine (v5) blueprints](./cloud-operations/vm-migration), [Configuring workload identity federation to access Google Cloud resources from apps running on Azure](./cloud-operations/workload-identity-federation)
- **data solutions** - [GCE and GCS CMEK via centralized Cloud KMS](./data-solutions/cmek-via-centralized-kms), [Cloud Composer version 2 private instance, supporting Shared VPC and external CMEK key](./data-solutions/composer-2), [Cloud SQL instance with multi-region read replicas](./data-solutions/cloudsql-multiregion), [Data Platform](./data-solutions/data-platform-foundations), [Minimal Data Platform](./data-solutions/data-platform-minimal), [Spinning up a foundation data pipeline on Google Cloud using Cloud Storage, Dataflow and BigQuery](./data-solutions/gcs-to-bq-with-least-privileges), [#SQL Server Always On Groups blueprint](./data-solutions/sqlserver-alwayson), [Data Playground](./data-solutions/data-playground), [MLOps with Vertex AI](./data-solutions/vertex-mlops), [Shielded Folder](./data-solutions/shielded-folder), [BigQuery ML and Vertex AI Pipeline](./data-solutions/bq-ml)
- **factories** - [The why and the how of Resource Factories](./factories), [Google Cloud Identity Group Factory](./factories/cloud-identity-group-factory), [Google Cloud BQ Factory](./factories/bigquery-factory), [Google Cloud VPC Firewall Factory](./factories/net-vpc-firewall-yaml), [Minimal Project Factory](./factories/project-factory)
- **GKE** - [Binary Authorization Pipeline Blueprint](./gke/binauthz), [Storage API](./gke/binauthz/image), [Multi-cluster mesh on GKE (fleet API)](./gke/multi-cluster-mesh-gke-fleet-api), [GKE Multitenant Blueprint](./gke/multitenant-fleet), [Shared VPC with GKE support](./networking/shared-vpc-gke/), [GKE Autopilot](./gke/autopilot)
-- **networking** - [Calling a private Cloud Function from On-premises](./networking/private-cloud-function-from-onprem), [Decentralized firewall management](./networking/decentralized-firewall), [Decentralized firewall validator](./networking/decentralized-firewall/validator), [HA VPN over Interconnect](./networking/ha-vpn-over-interconnect/), [GLB and multi-regional daisy-chaining through hybrid NEGs](./networking/glb-hybrid-neg-internal), [Hybrid connectivity to on-premise services through PSC](./networking/psc-hybrid), [HTTP Load Balancer with Cloud Armor](./networking/glb-and-armor), [Hub and Spoke via VPN](./networking/hub-and-spoke-vpn), [Hub and Spoke via VPC Peering](./networking/hub-and-spoke-peering), [Internal Load Balancer as Next Hop](./networking/ilb-next-hop), On-prem DNS and Google Private Access, [PSC Producer](./networking/psc-hybrid/psc-producer), [PSC Consumer](./networking/psc-hybrid/psc-consumer), [Shared VPC with optional GKE cluster](./networking/shared-vpc-gke)
+- **networking** - [Calling a private Cloud Function from On-premises](./networking/private-cloud-function-from-onprem), [Decentralized firewall management](./networking/decentralized-firewall), [Decentralized firewall validator](./networking/decentralized-firewall/validator), [HA VPN over Interconnect](./networking/ha-vpn-over-interconnect/), [GLB and multi-regional daisy-chaining through hybrid NEGs](./networking/glb-hybrid-neg-internal), [Hybrid connectivity to on-premise services through PSC](./networking/psc-hybrid), [HTTP Load Balancer with Cloud Armor](./networking/glb-and-armor), [Hub and Spoke via VPN](./networking/hub-and-spoke-vpn), [Hub and Spoke via VPC Peering](./networking/hub-and-spoke-peering), [Internal Load Balancer as Next Hop](./networking/ilb-next-hop), On-prem DNS and Google Private Access, [PSC Producer](./networking/psc-hybrid/psc-producer), [PSC Consumer](./networking/psc-hybrid/psc-consumer), [Shared VPC with optional GKE cluster](./networking/shared-vpc-gke), [VPC Connectivity Lab](./networking/vpc-connectivity-lab/)
- **serverless** - [Cloud Run series](./serverless/cloud-run-explore)
- **third party solutions** - [OpenShift on GCP user-provisioned infrastructure](./third-party-solutions/openshift), [Wordpress deployment on Cloud Run](./third-party-solutions/wordpress/cloudrun)
diff --git a/blueprints/cloud-operations/README.md b/blueprints/cloud-operations/README.md
index 99013624e..9ee59b99b 100644
--- a/blueprints/cloud-operations/README.md
+++ b/blueprints/cloud-operations/README.md
@@ -16,6 +16,12 @@ The blueprint's feed tracks changes to Google Compute instances, and the Cloud F
+## Compute Engine quota monitoring
+
+
This [blueprint](./compute-quota-monitoring) shows a practical way of collecting and monitoring [Compute Engine resource quotas](https://cloud.google.com/compute/quotas) via Cloud Monitoring metrics as an alternative to the recently released [built-in quota metrics](https://cloud.google.com/monitoring/alerts/using-quota-metrics). A simple alert on quota thresholds is also part of the blueprint.
+
+
+
## Granular Cloud DNS IAM via Service Directory
This [blueprint](./dns-fine-grained-iam) shows how to leverage [Service Directory](https://cloud.google.com/blog/products/networking/introducing-service-directory) and Cloud DNS Service Directory private zones, to implement fine-grained IAM controls on DNS. The blueprint creates a Service Directory namespace, a Cloud DNS private zone that uses it as its authoritative source, service accounts with different levels of permissions, and VMs to test them.
@@ -34,9 +40,9 @@ The blueprint's feed tracks changes to Google Compute instances, and the Cloud F
-## Network Dashboard
+## Network Quota Monitoring
-
This [blueprint](./network-dashboard/) provides an end-to-end solution to gather some GCP Networking quotas and limits (that cannot be seen in the GCP console today) and display them in a dashboard. The goal is to allow for better visibility of these limits, facilitating capacity planning and avoiding hitting these limits..
+
This [blueprint](./network-quota-monitoring) provides an end-to-end solution to gather some GCP Networking quotas and limits (that cannot be seen in the GCP console today) and display them in a dashboard. The goal is to allow for better visibility of these limits, facilitating capacity planning and avoiding hitting these limits.
@@ -52,12 +58,6 @@ This [blueprint](./onprem-sa-key-management) shows how to manage IAM Service Acc
-## Compute Engine quota monitoring
-
-
This [blueprint](./quota-monitoring) shows a practical way of collecting and monitoring [Compute Engine resource quotas](https://cloud.google.com/compute/quotas) via Cloud Monitoring metrics as an alternative to the recently released [built-in quota metrics](https://cloud.google.com/monitoring/alerts/using-quota-metrics). A simple alert on quota thresholds is also part of the blueprint.
-
-
-
## Scheduled Cloud Asset Inventory Export to Bigquery
This [blueprint](./scheduled-asset-inventory-export-bq) shows how to leverage the [Cloud Asset Inventory Exporting to Bigquery](https://cloud.google.com/asset-inventory/docs/exporting-to-bigquery) feature, to keep track of your organization's assets over time storing information in Bigquery. Data stored in Bigquery can then be used for different purposes like dashboarding or analysis.
diff --git a/blueprints/cloud-operations/quota-monitoring/README.md b/blueprints/cloud-operations/compute-quota-monitoring/README.md
similarity index 98%
rename from blueprints/cloud-operations/quota-monitoring/README.md
rename to blueprints/cloud-operations/compute-quota-monitoring/README.md
index 26a702e82..2c69bda14 100644
--- a/blueprints/cloud-operations/quota-monitoring/README.md
+++ b/blueprints/cloud-operations/compute-quota-monitoring/README.md
@@ -72,7 +72,7 @@ Clone this repository or [open it in cloud shell](https://ssh.cloud.google.com/c
```hcl
module "test" {
- source = "./fabric/blueprints/cloud-operations/quota-monitoring"
+ source = "./fabric/blueprints/cloud-operations/compute-quota-monitoring"
name = "name"
project_id = "test"
project_create_config = {
diff --git a/blueprints/cloud-operations/quota-monitoring/backend.tf.sample b/blueprints/cloud-operations/compute-quota-monitoring/backend.tf.sample
similarity index 100%
rename from blueprints/cloud-operations/quota-monitoring/backend.tf.sample
rename to blueprints/cloud-operations/compute-quota-monitoring/backend.tf.sample
diff --git a/blueprints/cloud-operations/quota-monitoring/cloud-shell-readme.txt b/blueprints/cloud-operations/compute-quota-monitoring/cloud-shell-readme.txt
similarity index 100%
rename from blueprints/cloud-operations/quota-monitoring/cloud-shell-readme.txt
rename to blueprints/cloud-operations/compute-quota-monitoring/cloud-shell-readme.txt
diff --git a/blueprints/cloud-operations/quota-monitoring/diagram.png b/blueprints/cloud-operations/compute-quota-monitoring/diagram.png
similarity index 100%
rename from blueprints/cloud-operations/quota-monitoring/diagram.png
rename to blueprints/cloud-operations/compute-quota-monitoring/diagram.png
diff --git a/blueprints/cloud-operations/quota-monitoring/explorer.png b/blueprints/cloud-operations/compute-quota-monitoring/explorer.png
similarity index 100%
rename from blueprints/cloud-operations/quota-monitoring/explorer.png
rename to blueprints/cloud-operations/compute-quota-monitoring/explorer.png
diff --git a/blueprints/cloud-operations/quota-monitoring/main.tf b/blueprints/cloud-operations/compute-quota-monitoring/main.tf
similarity index 100%
rename from blueprints/cloud-operations/quota-monitoring/main.tf
rename to blueprints/cloud-operations/compute-quota-monitoring/main.tf
diff --git a/blueprints/cloud-operations/quota-monitoring/outputs.tf b/blueprints/cloud-operations/compute-quota-monitoring/outputs.tf
similarity index 100%
rename from blueprints/cloud-operations/quota-monitoring/outputs.tf
rename to blueprints/cloud-operations/compute-quota-monitoring/outputs.tf
diff --git a/blueprints/cloud-operations/quota-monitoring/src/main.py b/blueprints/cloud-operations/compute-quota-monitoring/src/main.py
similarity index 100%
rename from blueprints/cloud-operations/quota-monitoring/src/main.py
rename to blueprints/cloud-operations/compute-quota-monitoring/src/main.py
diff --git a/blueprints/cloud-operations/quota-monitoring/src/requirements.txt b/blueprints/cloud-operations/compute-quota-monitoring/src/requirements.txt
similarity index 100%
rename from blueprints/cloud-operations/quota-monitoring/src/requirements.txt
rename to blueprints/cloud-operations/compute-quota-monitoring/src/requirements.txt
diff --git a/blueprints/cloud-operations/quota-monitoring/tools/descriptors.py b/blueprints/cloud-operations/compute-quota-monitoring/tools/descriptors.py
similarity index 100%
rename from blueprints/cloud-operations/quota-monitoring/tools/descriptors.py
rename to blueprints/cloud-operations/compute-quota-monitoring/tools/descriptors.py
diff --git a/blueprints/cloud-operations/quota-monitoring/variables.tf b/blueprints/cloud-operations/compute-quota-monitoring/variables.tf
similarity index 100%
rename from blueprints/cloud-operations/quota-monitoring/variables.tf
rename to blueprints/cloud-operations/compute-quota-monitoring/variables.tf
diff --git a/blueprints/cloud-operations/network-dashboard/LICENSE b/blueprints/cloud-operations/network-quota-monitoring/LICENSE
similarity index 100%
rename from blueprints/cloud-operations/network-dashboard/LICENSE
rename to blueprints/cloud-operations/network-quota-monitoring/LICENSE
diff --git a/blueprints/cloud-operations/network-dashboard/README.md b/blueprints/cloud-operations/network-quota-monitoring/README.md
similarity index 99%
rename from blueprints/cloud-operations/network-dashboard/README.md
rename to blueprints/cloud-operations/network-quota-monitoring/README.md
index fd7a68211..166f30920 100644
--- a/blueprints/cloud-operations/network-dashboard/README.md
+++ b/blueprints/cloud-operations/network-quota-monitoring/README.md
@@ -1,4 +1,4 @@
-# Network Dashboard and Discovery Tool
+# Network Quota Monitoring
This repository provides an end-to-end solution to gather some GCP networking quotas, limits, and their corresponding usage, store them in Cloud Operations timeseries which can displayed in one or more dashboards or wired to alerts.
diff --git a/blueprints/cloud-operations/network-dashboard/dashboards/quotas-utilization.json b/blueprints/cloud-operations/network-quota-monitoring/dashboards/quotas-utilization.json
similarity index 100%
rename from blueprints/cloud-operations/network-dashboard/dashboards/quotas-utilization.json
rename to blueprints/cloud-operations/network-quota-monitoring/dashboards/quotas-utilization.json
diff --git a/blueprints/cloud-operations/network-dashboard/deploy-cloud-function/README.md b/blueprints/cloud-operations/network-quota-monitoring/deploy-cloud-function/README.md
similarity index 96%
rename from blueprints/cloud-operations/network-dashboard/deploy-cloud-function/README.md
rename to blueprints/cloud-operations/network-quota-monitoring/deploy-cloud-function/README.md
index 1e917f883..2ebb1f6d0 100644
--- a/blueprints/cloud-operations/network-dashboard/deploy-cloud-function/README.md
+++ b/blueprints/cloud-operations/network-quota-monitoring/deploy-cloud-function/README.md
@@ -1,4 +1,4 @@
-# Network Dashboard Discovery via Cloud Function
+# Network Quota Monitoring via Cloud Function
This simple Terraform setup allows deploying the [discovery tool for the Network Dashboard](../src/) to a Cloud Function, triggered by a schedule via PubSub.
@@ -53,7 +53,7 @@ tf output -raw troubleshooting_payload
## Monitoring dashboard
-A monitoring dashboard can be optionally be deployed int he same project by setting the `dashboard_json_path` variable to the path of a dashboard JSON file. A sample dashboard is in included, and can be deployed with this variable configuration:
+A monitoring dashboard can be optionally be deployed int the same project by setting the `dashboard_json_path` variable to the path of a dashboard JSON file. A sample dashboard is in included, and can be deployed with this variable configuration:
```tfvars
dashboard_json_path = "../dashboards/quotas-utilization.json"
diff --git a/blueprints/cloud-operations/network-dashboard/deploy-cloud-function/diagram-scope.png b/blueprints/cloud-operations/network-quota-monitoring/deploy-cloud-function/diagram-scope.png
similarity index 100%
rename from blueprints/cloud-operations/network-dashboard/deploy-cloud-function/diagram-scope.png
rename to blueprints/cloud-operations/network-quota-monitoring/deploy-cloud-function/diagram-scope.png
diff --git a/blueprints/cloud-operations/network-dashboard/deploy-cloud-function/diagram.png b/blueprints/cloud-operations/network-quota-monitoring/deploy-cloud-function/diagram.png
similarity index 100%
rename from blueprints/cloud-operations/network-dashboard/deploy-cloud-function/diagram.png
rename to blueprints/cloud-operations/network-quota-monitoring/deploy-cloud-function/diagram.png
diff --git a/blueprints/cloud-operations/network-dashboard/deploy-cloud-function/main.tf b/blueprints/cloud-operations/network-quota-monitoring/deploy-cloud-function/main.tf
similarity index 99%
rename from blueprints/cloud-operations/network-dashboard/deploy-cloud-function/main.tf
rename to blueprints/cloud-operations/network-quota-monitoring/deploy-cloud-function/main.tf
index dd59847bf..b30bb1fa7 100644
--- a/blueprints/cloud-operations/network-dashboard/deploy-cloud-function/main.tf
+++ b/blueprints/cloud-operations/network-quota-monitoring/deploy-cloud-function/main.tf
@@ -1,5 +1,5 @@
/**
- * Copyright 2022 Google LLC
+ * Copyright 2023 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/blueprints/cloud-operations/network-dashboard/deploy-cloud-function/outputs.tf b/blueprints/cloud-operations/network-quota-monitoring/deploy-cloud-function/outputs.tf
similarity index 100%
rename from blueprints/cloud-operations/network-dashboard/deploy-cloud-function/outputs.tf
rename to blueprints/cloud-operations/network-quota-monitoring/deploy-cloud-function/outputs.tf
diff --git a/blueprints/cloud-operations/network-dashboard/deploy-cloud-function/variables.tf b/blueprints/cloud-operations/network-quota-monitoring/deploy-cloud-function/variables.tf
similarity index 100%
rename from blueprints/cloud-operations/network-dashboard/deploy-cloud-function/variables.tf
rename to blueprints/cloud-operations/network-quota-monitoring/deploy-cloud-function/variables.tf
diff --git a/blueprints/cloud-operations/network-dashboard/metric.png b/blueprints/cloud-operations/network-quota-monitoring/metric.png
similarity index 100%
rename from blueprints/cloud-operations/network-dashboard/metric.png
rename to blueprints/cloud-operations/network-quota-monitoring/metric.png
diff --git a/blueprints/cloud-operations/network-dashboard/src/README.md b/blueprints/cloud-operations/network-quota-monitoring/src/README.md
similarity index 98%
rename from blueprints/cloud-operations/network-dashboard/src/README.md
rename to blueprints/cloud-operations/network-quota-monitoring/src/README.md
index cad11020f..60db38e14 100644
--- a/blueprints/cloud-operations/network-dashboard/src/README.md
+++ b/blueprints/cloud-operations/network-quota-monitoring/src/README.md
@@ -1,8 +1,8 @@
-# Network Dashboard Discovery Tool
+# Network Quota Monitoring Tool
This tool constitutes the discovery and data gathering side of the Network Dashboard, and can be used in combination with the related [Terraform deployment examples](../), or packaged in different ways including standalone manual use.
-- [Network Dashboard Discovery Tool](#network-dashboard-discovery-tool)
+- [Network Quota Monitoring Tool](#network-dashboard-discovery-tool)
- [Quick Usage Example](#quick-usage-example)
- [High Level Architecture and Plugin Design](#high-level-architecture-and-plugin-design)
- [Debugging and Troubleshooting](#debugging-and-troubleshooting)
diff --git a/blueprints/cloud-operations/network-dashboard/src/custom-quotas.sample b/blueprints/cloud-operations/network-quota-monitoring/src/custom-quotas.sample
similarity index 100%
rename from blueprints/cloud-operations/network-dashboard/src/custom-quotas.sample
rename to blueprints/cloud-operations/network-quota-monitoring/src/custom-quotas.sample
diff --git a/blueprints/cloud-operations/network-dashboard/src/main.py b/blueprints/cloud-operations/network-quota-monitoring/src/main.py
similarity index 100%
rename from blueprints/cloud-operations/network-dashboard/src/main.py
rename to blueprints/cloud-operations/network-quota-monitoring/src/main.py
diff --git a/blueprints/cloud-operations/network-dashboard/src/plugins/__init__.py b/blueprints/cloud-operations/network-quota-monitoring/src/plugins/__init__.py
similarity index 100%
rename from blueprints/cloud-operations/network-dashboard/src/plugins/__init__.py
rename to blueprints/cloud-operations/network-quota-monitoring/src/plugins/__init__.py
diff --git a/blueprints/cloud-operations/network-dashboard/src/plugins/core-discover-cai-nodes.py b/blueprints/cloud-operations/network-quota-monitoring/src/plugins/core-discover-cai-nodes.py
similarity index 100%
rename from blueprints/cloud-operations/network-dashboard/src/plugins/core-discover-cai-nodes.py
rename to blueprints/cloud-operations/network-quota-monitoring/src/plugins/core-discover-cai-nodes.py
diff --git a/blueprints/cloud-operations/network-dashboard/src/plugins/discover-cai.py b/blueprints/cloud-operations/network-quota-monitoring/src/plugins/discover-cai.py
similarity index 100%
rename from blueprints/cloud-operations/network-dashboard/src/plugins/discover-cai.py
rename to blueprints/cloud-operations/network-quota-monitoring/src/plugins/discover-cai.py
diff --git a/blueprints/cloud-operations/network-dashboard/src/plugins/discover-compute-quota.py b/blueprints/cloud-operations/network-quota-monitoring/src/plugins/discover-compute-quota.py
similarity index 100%
rename from blueprints/cloud-operations/network-dashboard/src/plugins/discover-compute-quota.py
rename to blueprints/cloud-operations/network-quota-monitoring/src/plugins/discover-compute-quota.py
diff --git a/blueprints/cloud-operations/network-dashboard/src/plugins/discover-compute-routerstatus.py b/blueprints/cloud-operations/network-quota-monitoring/src/plugins/discover-compute-routerstatus.py
similarity index 100%
rename from blueprints/cloud-operations/network-dashboard/src/plugins/discover-compute-routerstatus.py
rename to blueprints/cloud-operations/network-quota-monitoring/src/plugins/discover-compute-routerstatus.py
diff --git a/blueprints/cloud-operations/network-dashboard/src/plugins/discover-group-networks.py b/blueprints/cloud-operations/network-quota-monitoring/src/plugins/discover-group-networks.py
similarity index 100%
rename from blueprints/cloud-operations/network-dashboard/src/plugins/discover-group-networks.py
rename to blueprints/cloud-operations/network-quota-monitoring/src/plugins/discover-group-networks.py
diff --git a/blueprints/cloud-operations/network-dashboard/src/plugins/discover-metric-descriptors.py b/blueprints/cloud-operations/network-quota-monitoring/src/plugins/discover-metric-descriptors.py
similarity index 100%
rename from blueprints/cloud-operations/network-dashboard/src/plugins/discover-metric-descriptors.py
rename to blueprints/cloud-operations/network-quota-monitoring/src/plugins/discover-metric-descriptors.py
diff --git a/blueprints/cloud-operations/network-dashboard/src/plugins/monitoring.py b/blueprints/cloud-operations/network-quota-monitoring/src/plugins/monitoring.py
similarity index 100%
rename from blueprints/cloud-operations/network-dashboard/src/plugins/monitoring.py
rename to blueprints/cloud-operations/network-quota-monitoring/src/plugins/monitoring.py
diff --git a/blueprints/cloud-operations/network-dashboard/src/plugins/series-firewall-policies.py b/blueprints/cloud-operations/network-quota-monitoring/src/plugins/series-firewall-policies.py
similarity index 100%
rename from blueprints/cloud-operations/network-dashboard/src/plugins/series-firewall-policies.py
rename to blueprints/cloud-operations/network-quota-monitoring/src/plugins/series-firewall-policies.py
diff --git a/blueprints/cloud-operations/network-dashboard/src/plugins/series-firewall-rules.py b/blueprints/cloud-operations/network-quota-monitoring/src/plugins/series-firewall-rules.py
similarity index 100%
rename from blueprints/cloud-operations/network-dashboard/src/plugins/series-firewall-rules.py
rename to blueprints/cloud-operations/network-quota-monitoring/src/plugins/series-firewall-rules.py
diff --git a/blueprints/cloud-operations/network-dashboard/src/plugins/series-networks.py b/blueprints/cloud-operations/network-quota-monitoring/src/plugins/series-networks.py
similarity index 100%
rename from blueprints/cloud-operations/network-dashboard/src/plugins/series-networks.py
rename to blueprints/cloud-operations/network-quota-monitoring/src/plugins/series-networks.py
diff --git a/blueprints/cloud-operations/network-dashboard/src/plugins/series-peering-groups.py b/blueprints/cloud-operations/network-quota-monitoring/src/plugins/series-peering-groups.py
similarity index 100%
rename from blueprints/cloud-operations/network-dashboard/src/plugins/series-peering-groups.py
rename to blueprints/cloud-operations/network-quota-monitoring/src/plugins/series-peering-groups.py
diff --git a/blueprints/cloud-operations/network-dashboard/src/plugins/series-psa.py b/blueprints/cloud-operations/network-quota-monitoring/src/plugins/series-psa.py
similarity index 100%
rename from blueprints/cloud-operations/network-dashboard/src/plugins/series-psa.py
rename to blueprints/cloud-operations/network-quota-monitoring/src/plugins/series-psa.py
diff --git a/blueprints/cloud-operations/network-dashboard/src/plugins/series-routes.py b/blueprints/cloud-operations/network-quota-monitoring/src/plugins/series-routes.py
similarity index 100%
rename from blueprints/cloud-operations/network-dashboard/src/plugins/series-routes.py
rename to blueprints/cloud-operations/network-quota-monitoring/src/plugins/series-routes.py
diff --git a/blueprints/cloud-operations/network-dashboard/src/plugins/series-subnets.py b/blueprints/cloud-operations/network-quota-monitoring/src/plugins/series-subnets.py
similarity index 100%
rename from blueprints/cloud-operations/network-dashboard/src/plugins/series-subnets.py
rename to blueprints/cloud-operations/network-quota-monitoring/src/plugins/series-subnets.py
diff --git a/blueprints/cloud-operations/network-dashboard/src/plugins/utils.py b/blueprints/cloud-operations/network-quota-monitoring/src/plugins/utils.py
similarity index 100%
rename from blueprints/cloud-operations/network-dashboard/src/plugins/utils.py
rename to blueprints/cloud-operations/network-quota-monitoring/src/plugins/utils.py
diff --git a/blueprints/cloud-operations/network-dashboard/src/requirements.txt b/blueprints/cloud-operations/network-quota-monitoring/src/requirements.txt
similarity index 100%
rename from blueprints/cloud-operations/network-dashboard/src/requirements.txt
rename to blueprints/cloud-operations/network-quota-monitoring/src/requirements.txt
diff --git a/blueprints/cloud-operations/network-dashboard/src/tools/remove-descriptors.py b/blueprints/cloud-operations/network-quota-monitoring/src/tools/remove-descriptors.py
similarity index 100%
rename from blueprints/cloud-operations/network-dashboard/src/tools/remove-descriptors.py
rename to blueprints/cloud-operations/network-quota-monitoring/src/tools/remove-descriptors.py
diff --git a/blueprints/networking/README.md b/blueprints/networking/README.md
index 9dca3f97f..8a4c40a08 100644
--- a/blueprints/networking/README.md
+++ b/blueprints/networking/README.md
@@ -96,3 +96,9 @@ It is meant to be used as a starting point for most Shared VPC configurations, a
It is meant to be used as a starting point for users that want to explore PSC to reduce some of the complexity in their network setup.
+
+### VPC Connectivity Lab
+
+
This [blueprint](./vpc-connectivity-lab/) creates a networking playground showing a number of different VPC connectivity options (peering, HA VPN, NVA), along with PBR routing.
+
+
diff --git a/blueprints/networking/vpc-connectivity-lab/README.md b/blueprints/networking/vpc-connectivity-lab/README.md
new file mode 100644
index 000000000..65a23433f
--- /dev/null
+++ b/blueprints/networking/vpc-connectivity-lab/README.md
@@ -0,0 +1,112 @@
+# VPC Connectivity Lab
+
+This blueprint creates a networking playground showing a number of different VPC connectivity options:
+
+* Hub and spoke via HA VPN
+* Hub and spoke via VPC peering
+* Interconnecting two networks via a network virtual appliance (aka NVA)
+
+On top of that, this blueprint implements Policy Based Routing (aka PBR) to show how to force all traffic within a VPC to be funneled through an internal network passthrough load balancer, to implement an Intrusion Prevention System (IPS). PBR is enabled in the `hub` VPC, matching all traffic originating from within that VPC.
+
+The blueprint has been purposefully kept simple to show how to use and wire VPCs together, and so that it can be used as a basis for experimentation.
+
+This is the high level diagram of this blueprint:
+
+
+
+## Prerequisites
+
+This blueprint is contained within a single project to keep complexity to a minimum, even though in a real world scenario each spoke would probably use a separate project.
+
+The blueprint can either create a new project or consume an existing one.
+If the variable `var.project_create_config` is populated, the blueprint will create a new project named `var.project_id`, otherwise the blueprint will use an existing project with the same id.
+
+## Testing reachability
+
+After running terraform, and in case `var.test_vms` is set to true (as it is by default), a set of ping commands will be printed to check the reachability of all VMs. The blueprint is configured to ensure that all VMs can ping each other - so you can simply SSH to each one, and run the generated ping commands, e.g.:
+
+```bash
+ping -c 1 ext.example
+ping -c 1 hub-a.example
+ping -c 1 hub-b.example
+ping -c 1 spoke-peering-a.example
+ping -c 1 spoke-peering-b.example
+ping -c 1 spoke-vpn-a.example
+ping -c 1 spoke-vpn-b.example
+```
+
+## Testing IPS/NVA
+
+Per blueprint setup, not all traffic will flow through the deployed test NVAs.
+You should expect the following flows to be routed through them:
+
+* `ext` to {`hub`, `peering-a`, `peering-b`, `vpn-a`, `vpn-b`}
+* `peering-a` to {`ext`, `peering-b`}
+* `peering-b` to {`ext`, `peering-a`}
+* `vpn-a` to {`ext`}
+* `vpn-b` to {`ext`}
+
+Additional PBR routes could be configured to force all traffic coming from `vpn-{a,b}` to go through the NVA - however traffic coming from `peering-{a,b}` can NOT be subjected to PBR routes, due to product constrains.
+
+In order to see the actual traffic flow, you'll want to manually stop one of the NVA instances (to force all traffic to be sent through a single VM), SSH to the active NVA instance and run the following commands:
+
+```bash
+# Setting the toolbox up might take a while since we're using cheap instances :)
+$ toolbox
+
+# Once inside the toolbox
+$ tcpdump -i any icmp -n
+
+```
+
+
+
+## Files
+
+| name | description | modules | resources |
+|---|---|---|---|
+| [dns-hub.tf](./dns-hub.tf) | DNS setup. | dns | |
+| [main.tf](./main.tf) | Project setup. | project | |
+| [nva.tf](./nva.tf) | None | compute-vm · simple-nva | google_compute_instance_group |
+| [outputs.tf](./outputs.tf) | Module outputs. | | |
+| [test-resources.tf](./test-resources.tf) | None | | |
+| [variables.tf](./variables.tf) | Module variables. | | |
+| [vpc-ext.tf](./vpc-ext.tf) | External VPC. | net-address · net-cloudnat · net-lb-int · net-vpc · net-vpc-firewall | google_compute_route |
+| [vpc-hub.tf](./vpc-hub.tf) | Internal Hub VPC. | net-address · net-lb-int · net-vpc · net-vpc-firewall · net-vpc-peering · net-vpn-ha | google_compute_route |
+| [vpc-peering-a.tf](./vpc-peering-a.tf) | None | net-vpc · net-vpc-firewall | |
+| [vpc-peering-b.tf](./vpc-peering-b.tf) | None | net-vpc · net-vpc-firewall | |
+| [vpc-vpn-a.tf](./vpc-vpn-a.tf) | None | net-vpc · net-vpc-firewall · net-vpn-ha | |
+| [vpc-vpn-b.tf](./vpc-vpn-b.tf) | None | net-vpc · net-vpc-firewall · net-vpn-ha | |
+
+## Variables
+
+| name | description | type | required | default |
+|---|---|:---:|:---:|:---:|
+| [prefix](variables.tf#L37) | Prefix used for resource names. | string | ✓ | |
+| [ip_ranges](variables.tf#L17) | Subnet/Routes IP CIDR ranges. | map(string) | | {…} |
+| [project_create_config](variables.tf#L46) | Populate with billing account id to trigger project creation. | object({…}) | | null |
+| [project_id](variables.tf#L55) | Project id for all resources. | string | | "net-test-02" |
+| [region](variables.tf#L61) | Region used to deploy resources. | string | | "europe-west8" |
+| [test_vms](variables.tf#L67) | Enable the creation of test resources. | bool | | true |
+
+## Outputs
+
+| name | description | sensitive |
+|---|---|:---:|
+| [ping_commands](outputs.tf#L17) | Ping commands that can be run to check VPC reachability. | |
+
+## Test
+
+```hcl
+module "test" {
+ source = "./fabric/blueprints/networking/vpc-connectivity-lab"
+ project_create_config = {
+ billing_account_id = "123456-123456-123456"
+ parent_id = "folders/123456789"
+ }
+ project_id = "net-test-04"
+ prefix = "fast-sr0-sbox"
+}
+
+# tftest modules=35 resources=131
+```
diff --git a/blueprints/networking/vpc-connectivity-lab/diagram.excalidraw b/blueprints/networking/vpc-connectivity-lab/diagram.excalidraw
new file mode 100644
index 000000000..552a89e27
--- /dev/null
+++ b/blueprints/networking/vpc-connectivity-lab/diagram.excalidraw
@@ -0,0 +1,10273 @@
+{
+ "type": "excalidraw",
+ "version": 2,
+ "source": "https://excalidraw.com",
+ "elements": [
+ {
+ "type": "rectangle",
+ "version": 1474,
+ "versionNonce": 993286653,
+ "isDeleted": false,
+ "id": "cahWk0DfRyLp3s9pu85Vu",
+ "fillStyle": "cross-hatch",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 591.3435324885941,
+ "y": 2133.8481850351664,
+ "strokeColor": "#e03131",
+ "backgroundColor": "transparent",
+ "width": 286.50895203755545,
+ "height": 171.5890064842986,
+ "seed": 1448890547,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": {
+ "type": 3
+ },
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "mEbRfBq_UxBkFfnzBVD8J"
+ }
+ ],
+ "updated": 1703059826403,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "text",
+ "version": 1595,
+ "versionNonce": 653398621,
+ "isDeleted": false,
+ "id": "mEbRfBq_UxBkFfnzBVD8J",
+ "fillStyle": "cross-hatch",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 705.3011335073718,
+ "y": 2138.8481850351664,
+ "strokeColor": "#e03131",
+ "backgroundColor": "transparent",
+ "width": 58.59375,
+ "height": 24,
+ "seed": 43369043,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059826403,
+ "link": null,
+ "locked": false,
+ "fontSize": 20,
+ "fontFamily": 3,
+ "text": "vpn-a",
+ "textAlign": "center",
+ "verticalAlign": "top",
+ "containerId": "cahWk0DfRyLp3s9pu85Vu",
+ "originalText": "vpn-a",
+ "lineHeight": 1.2,
+ "baseline": 20
+ },
+ {
+ "type": "rectangle",
+ "version": 334,
+ "versionNonce": 680708413,
+ "isDeleted": false,
+ "id": "sMxH-PbI_QSEQto-RSJfS",
+ "fillStyle": "cross-hatch",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 977.9102295540138,
+ "y": 2179.0506945532093,
+ "strokeColor": "#e03131",
+ "backgroundColor": "transparent",
+ "width": 500.7625481814538,
+ "height": 241.47267475061153,
+ "seed": 36452571,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": {
+ "type": 3
+ },
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "TFEIVsBkEraMp6OuJ9S5-"
+ }
+ ],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "text",
+ "version": 350,
+ "versionNonce": 1975989523,
+ "isDeleted": false,
+ "id": "TFEIVsBkEraMp6OuJ9S5-",
+ "fillStyle": "cross-hatch",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1210.7133786447407,
+ "y": 2391.523369303821,
+ "strokeColor": "#e03131",
+ "backgroundColor": "transparent",
+ "width": 35.15625,
+ "height": 24,
+ "seed": 797336955,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false,
+ "fontSize": 20,
+ "fontFamily": 3,
+ "text": "hub",
+ "textAlign": "center",
+ "verticalAlign": "bottom",
+ "containerId": "sMxH-PbI_QSEQto-RSJfS",
+ "originalText": "hub",
+ "lineHeight": 1.2,
+ "baseline": 20
+ },
+ {
+ "type": "rectangle",
+ "version": 73,
+ "versionNonce": 356555165,
+ "isDeleted": false,
+ "id": "1-QRU78HgoxTvr0WL26Uk",
+ "fillStyle": "cross-hatch",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1049.8478307866228,
+ "y": 1826.7579824875347,
+ "strokeColor": "#e03131",
+ "backgroundColor": "transparent",
+ "width": 428.2689117627317,
+ "height": 241.47267475061153,
+ "seed": 1687481685,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": {
+ "type": 3
+ },
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "mAhUhit4uyfdsnbtz912o"
+ }
+ ],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "text",
+ "version": 77,
+ "versionNonce": 447727293,
+ "isDeleted": false,
+ "id": "mAhUhit4uyfdsnbtz912o",
+ "fillStyle": "cross-hatch",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1246.4041616679888,
+ "y": 1831.7579824875347,
+ "strokeColor": "#e03131",
+ "backgroundColor": "transparent",
+ "width": 35.15625,
+ "height": 24,
+ "seed": 446633909,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059873984,
+ "link": null,
+ "locked": false,
+ "fontSize": 20,
+ "fontFamily": 3,
+ "text": "ext",
+ "textAlign": "center",
+ "verticalAlign": "top",
+ "containerId": "1-QRU78HgoxTvr0WL26Uk",
+ "originalText": "ext",
+ "lineHeight": 1.2,
+ "baseline": 20
+ },
+ {
+ "type": "rectangle",
+ "version": 581,
+ "versionNonce": 1620401661,
+ "isDeleted": false,
+ "id": "ulFqvrwsF1010MSpVl-Ju",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1220.7733537370266,
+ "y": 2120.70798455941,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 730076277,
+ "groupIds": [
+ "61O8NBAMlU2DbQDANQ9CE"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 573,
+ "versionNonce": 611667027,
+ "isDeleted": false,
+ "id": "LKd7jsHVFYsPgOxdaj5Ic",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1220.7206338029127,
+ "y": 2127.997539362958,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1129561557,
+ "groupIds": [
+ "61O8NBAMlU2DbQDANQ9CE"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 601,
+ "versionNonce": 26383965,
+ "isDeleted": false,
+ "id": "RceqAUwCxvcwe-gPJTMsL",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1228.6479473771885,
+ "y": 2105.46996815895,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 170343221,
+ "groupIds": [
+ "61O8NBAMlU2DbQDANQ9CE"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 644,
+ "versionNonce": 122571251,
+ "isDeleted": false,
+ "id": "dcxeJEcJpWfh1S_zE-HkZ",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1236.011223864305,
+ "y": 2105.5577821087854,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 409210005,
+ "groupIds": [
+ "61O8NBAMlU2DbQDANQ9CE"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 651,
+ "versionNonce": 319406781,
+ "isDeleted": false,
+ "id": "J8ov2tUZgd9AswumW2a8l",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1243.1946613238354,
+ "y": 2105.550156656867,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1572844021,
+ "groupIds": [
+ "61O8NBAMlU2DbQDANQ9CE"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 659,
+ "versionNonce": 1299616659,
+ "isDeleted": false,
+ "id": "pca_v9tY7ULNoILF0qAla",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1228.521605841157,
+ "y": 2135.598032457822,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 926919509,
+ "groupIds": [
+ "61O8NBAMlU2DbQDANQ9CE"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 701,
+ "versionNonce": 1503421213,
+ "isDeleted": false,
+ "id": "gS3O7hoIIUAzV4yU4vhG4",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1235.8848823282733,
+ "y": 2135.701351364916,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1161394357,
+ "groupIds": [
+ "61O8NBAMlU2DbQDANQ9CE"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 708,
+ "versionNonce": 1730455859,
+ "isDeleted": false,
+ "id": "jTzRLjc6Z7ckVoBMARrGl",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1243.0683197878031,
+ "y": 2135.693725912997,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 22190613,
+ "groupIds": [
+ "61O8NBAMlU2DbQDANQ9CE"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 590,
+ "versionNonce": 163313533,
+ "isDeleted": false,
+ "id": "GKiCEDtmA0WgByAKKbced",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1250.6850338086579,
+ "y": 2113.4390605295825,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 343969653,
+ "groupIds": [
+ "61O8NBAMlU2DbQDANQ9CE"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 633,
+ "versionNonce": 2042563283,
+ "isDeleted": false,
+ "id": "bSV94723G3QMVUlPvj-P7",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1250.8197129160455,
+ "y": 2120.946634548106,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1829296341,
+ "groupIds": [
+ "61O8NBAMlU2DbQDANQ9CE"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 625,
+ "versionNonce": 1302986717,
+ "isDeleted": false,
+ "id": "GF0MTQZKL4_jxJJMjFjsH",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1250.7669929819315,
+ "y": 2128.236189351654,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 343995957,
+ "groupIds": [
+ "61O8NBAMlU2DbQDANQ9CE"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 537,
+ "versionNonce": 970733683,
+ "isDeleted": false,
+ "id": "a1G_0E19JJcoZD5Ds5rxh",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1220.638674629639,
+ "y": 2113.2004105408864,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1171154837,
+ "groupIds": [
+ "61O8NBAMlU2DbQDANQ9CE"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 794,
+ "versionNonce": 192412733,
+ "isDeleted": false,
+ "id": "HxaiwcWdh4cwTb69crlWA",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1226.4246527550144,
+ "y": 2109.8613065582117,
+ "strokeColor": "#669df6",
+ "backgroundColor": "#aecbfa",
+ "width": 25.68701803825022,
+ "height": 25.322961410864238,
+ "seed": 1126608117,
+ "groupIds": [
+ "6Zi_lqyczctHujtPwlH4B",
+ "61O8NBAMlU2DbQDANQ9CE"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 671,
+ "versionNonce": 88257043,
+ "isDeleted": false,
+ "id": "cpFi4xdlR0GV4tgYkFAdT",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1230.0152397922686,
+ "y": 2113.2538656902034,
+ "strokeColor": "#669df6",
+ "backgroundColor": "white",
+ "width": 18.415416343106916,
+ "height": 18.197540514342283,
+ "seed": 1812940373,
+ "groupIds": [
+ "6Zi_lqyczctHujtPwlH4B",
+ "61O8NBAMlU2DbQDANQ9CE"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "line",
+ "version": 642,
+ "versionNonce": 1795648669,
+ "isDeleted": false,
+ "id": "8qzgBsPJ6SYYBhRlsfeMO",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1233.6699878375741,
+ "y": 2128.035757070686,
+ "strokeColor": "#669df6",
+ "backgroundColor": "#aecbfa",
+ "width": 11.005694271511862,
+ "height": 10.941584275697766,
+ "seed": 324907957,
+ "groupIds": [
+ "0H22kCusqFZQqiDr5BuQj",
+ "61O8NBAMlU2DbQDANQ9CE"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -0.11767292537006607,
+ -10.939877113695731
+ ],
+ [
+ 10.888021346141796,
+ -10.941584275697766
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 647,
+ "versionNonce": 1021900723,
+ "isDeleted": false,
+ "id": "ZNpnv9f8ZVMM7ARue-U-M",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1239.144956753726,
+ "y": 2122.5233920954324,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 5.716009503705499,
+ "height": 10.677776743237455,
+ "seed": 355955989,
+ "groupIds": [
+ "0H22kCusqFZQqiDr5BuQj",
+ "61O8NBAMlU2DbQDANQ9CE"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 5.459069112195784,
+ 5.178594135612063
+ ],
+ [
+ 5.716009503705499,
+ -5.499182607625391
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 736,
+ "versionNonce": 470405373,
+ "isDeleted": false,
+ "id": "-FwRjQ0LBeWL-hoDerwCZ",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1236.1697944215234,
+ "y": 2125.2153527000996,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 5.716009503705499,
+ "height": 10.677776743237455,
+ "seed": 756157045,
+ "groupIds": [
+ "0H22kCusqFZQqiDr5BuQj",
+ "61O8NBAMlU2DbQDANQ9CE"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 5.459069112195784,
+ 5.178594135612063
+ ],
+ [
+ 5.716009503705499,
+ -5.499182607625391
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "rectangle",
+ "version": 588,
+ "versionNonce": 1593149779,
+ "isDeleted": false,
+ "id": "4CbiKzm7dBjhNPsATQ60e",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1268.1406514423054,
+ "y": 2120.7056555624717,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1257969237,
+ "groupIds": [
+ "DARAabG91VF7nU0g1plJZ"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 580,
+ "versionNonce": 1543547229,
+ "isDeleted": false,
+ "id": "QKjIaK7jGnVfDprP224Z9",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1268.0879315081918,
+ "y": 2127.9952103660194,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1146061749,
+ "groupIds": [
+ "DARAabG91VF7nU0g1plJZ"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 608,
+ "versionNonce": 1623123699,
+ "isDeleted": false,
+ "id": "N4cqEXe-TDisCmE7HaHKJ",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1276.0152450824673,
+ "y": 2105.467639162011,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1735345429,
+ "groupIds": [
+ "DARAabG91VF7nU0g1plJZ"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 651,
+ "versionNonce": 1010660797,
+ "isDeleted": false,
+ "id": "DZqFncr1xxN8js8-sgZGA",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1283.378521569584,
+ "y": 2105.5554531118473,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 131062389,
+ "groupIds": [
+ "DARAabG91VF7nU0g1plJZ"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 658,
+ "versionNonce": 1221300371,
+ "isDeleted": false,
+ "id": "lSySREJaGvY1NAOfaStX2",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1290.5619590291142,
+ "y": 2105.5478276599283,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1849082837,
+ "groupIds": [
+ "DARAabG91VF7nU0g1plJZ"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 666,
+ "versionNonce": 669103645,
+ "isDeleted": false,
+ "id": "yI37jQFIe9zURV2YL9A1-",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1275.888903546436,
+ "y": 2135.595703460883,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 783909173,
+ "groupIds": [
+ "DARAabG91VF7nU0g1plJZ"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 708,
+ "versionNonce": 147981875,
+ "isDeleted": false,
+ "id": "2rPA35AE-zcjwXSVyLYNI",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1283.2521800335523,
+ "y": 2135.6990223679772,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1052611221,
+ "groupIds": [
+ "DARAabG91VF7nU0g1plJZ"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 715,
+ "versionNonce": 702474877,
+ "isDeleted": false,
+ "id": "90pvFErQINNDNn9GAT17p",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1290.435617493082,
+ "y": 2135.6913969160582,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1257797621,
+ "groupIds": [
+ "DARAabG91VF7nU0g1plJZ"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 597,
+ "versionNonce": 397985747,
+ "isDeleted": false,
+ "id": "sCf3v9qI4K-HC59lsbYJ_",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1298.052331513937,
+ "y": 2113.436731532644,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1299165525,
+ "groupIds": [
+ "DARAabG91VF7nU0g1plJZ"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 640,
+ "versionNonce": 1928762077,
+ "isDeleted": false,
+ "id": "h9QHTQFEef4-B6zPQtR27",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1298.1870106213244,
+ "y": 2120.944305551168,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1668857525,
+ "groupIds": [
+ "DARAabG91VF7nU0g1plJZ"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 632,
+ "versionNonce": 1268143475,
+ "isDeleted": false,
+ "id": "k1_zh9sbSKwX7JloIZF7B",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1298.1342906872103,
+ "y": 2128.2338603547155,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1673076757,
+ "groupIds": [
+ "DARAabG91VF7nU0g1plJZ"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 544,
+ "versionNonce": 532295485,
+ "isDeleted": false,
+ "id": "21wqjd7Qp2m-AEDWcNz0o",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1268.0059723349175,
+ "y": 2113.198081543948,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 874927477,
+ "groupIds": [
+ "DARAabG91VF7nU0g1plJZ"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 801,
+ "versionNonce": 1940991763,
+ "isDeleted": false,
+ "id": "-r4eYRrqBelUo0ebtvOKE",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1273.791950460293,
+ "y": 2109.858977561273,
+ "strokeColor": "#669df6",
+ "backgroundColor": "#aecbfa",
+ "width": 25.68701803825022,
+ "height": 25.322961410864238,
+ "seed": 1610997461,
+ "groupIds": [
+ "fKcRaBnu_vTCV1A9vOoaY",
+ "DARAabG91VF7nU0g1plJZ"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 678,
+ "versionNonce": 1049313181,
+ "isDeleted": false,
+ "id": "Gb094F0BredxzthmT3qex",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1277.3825374975474,
+ "y": 2113.2515366932644,
+ "strokeColor": "#669df6",
+ "backgroundColor": "white",
+ "width": 18.415416343106916,
+ "height": 18.197540514342283,
+ "seed": 1844263989,
+ "groupIds": [
+ "fKcRaBnu_vTCV1A9vOoaY",
+ "DARAabG91VF7nU0g1plJZ"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "line",
+ "version": 649,
+ "versionNonce": 847238323,
+ "isDeleted": false,
+ "id": "OAZ6YAAfZmEbmQ7Hn7yEO",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1281.037285542853,
+ "y": 2128.0334280737475,
+ "strokeColor": "#669df6",
+ "backgroundColor": "#aecbfa",
+ "width": 11.005694271511862,
+ "height": 10.941584275697766,
+ "seed": 1975643541,
+ "groupIds": [
+ "Z0_I8SkiEzSxjQYw3byEx",
+ "DARAabG91VF7nU0g1plJZ"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -0.11767292537006607,
+ -10.939877113695731
+ ],
+ [
+ 10.888021346141796,
+ -10.941584275697766
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 654,
+ "versionNonce": 362497021,
+ "isDeleted": false,
+ "id": "0AgZeIxIrHLgm8iuc7klu",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1286.5122544590047,
+ "y": 2122.5210630984934,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 5.716009503705499,
+ "height": 10.677776743237455,
+ "seed": 1991865077,
+ "groupIds": [
+ "Z0_I8SkiEzSxjQYw3byEx",
+ "DARAabG91VF7nU0g1plJZ"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 5.459069112195784,
+ 5.178594135612063
+ ],
+ [
+ 5.716009503705499,
+ -5.499182607625391
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 743,
+ "versionNonce": 396936787,
+ "isDeleted": false,
+ "id": "OZ19-WP8D88y0J85UbolC",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1283.537092126802,
+ "y": 2125.213023703161,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 5.716009503705499,
+ "height": 10.677776743237455,
+ "seed": 1834568789,
+ "groupIds": [
+ "Z0_I8SkiEzSxjQYw3byEx",
+ "DARAabG91VF7nU0g1plJZ"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 5.459069112195784,
+ 5.178594135612063
+ ],
+ [
+ 5.716009503705499,
+ -5.499182607625391
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "rectangle",
+ "version": 707,
+ "versionNonce": 686537821,
+ "isDeleted": false,
+ "id": "xehcbIJ2W4wT3XRoiBe-0",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1258.9918682354003,
+ "y": 2014.2583684275285,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 2.795822937921211,
+ "height": 8.814334379301076,
+ "seed": 94541723,
+ "groupIds": [
+ "JOc29hhcxbWKwFBm5DwnR"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 648,
+ "versionNonce": 2046985203,
+ "isDeleted": false,
+ "id": "J3gLgEfGS-YFIwKeRMwnZ",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1251.0695469790999,
+ "y": 2007.7846878726143,
+ "strokeColor": "#669df6",
+ "backgroundColor": "#aecbfa",
+ "width": 9.182521437781132,
+ "height": 7.752121356930334,
+ "seed": 440593467,
+ "groupIds": [
+ "JOc29hhcxbWKwFBm5DwnR"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 697,
+ "versionNonce": 5122237,
+ "isDeleted": false,
+ "id": "Rj-PhRU5XOIOh6Khitji0",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1260.3320962255789,
+ "y": 2007.6562353545257,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 9.182521437781132,
+ "height": 7.752121356930334,
+ "seed": 758099163,
+ "groupIds": [
+ "JOc29hhcxbWKwFBm5DwnR"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "line",
+ "version": 974,
+ "versionNonce": 294882707,
+ "isDeleted": false,
+ "id": "qcDu59Y1GI6wESZTKGwe_",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1248.016683104638,
+ "y": 2031.0527516368559,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 24.90241619165637,
+ "height": 11.329739262259444,
+ "seed": 301685115,
+ "groupIds": [
+ "JOc29hhcxbWKwFBm5DwnR"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -0.03435663667088932,
+ -9.116492863370489
+ ],
+ [
+ 24.688829304665873,
+ -9.050824126229084
+ ],
+ [
+ 24.868059554985482,
+ 1.441051264022695
+ ],
+ [
+ 21.525409128484323,
+ 1.356323667686184
+ ],
+ [
+ 21.6345117885427,
+ -6.073449205346171
+ ],
+ [
+ 13.817932625107664,
+ -5.930011811754959
+ ],
+ [
+ 14.026982433485095,
+ 2.2132463988889555
+ ],
+ [
+ 10.949960750177553,
+ 1.766391090785731
+ ],
+ [
+ 10.876697882143608,
+ -6.003099454683841
+ ],
+ [
+ 2.9292756295436786,
+ -6.051064198174598
+ ],
+ [
+ 3.0517329458235207,
+ 0.8317873156856564
+ ],
+ [
+ 0.232511198337186,
+ 0.5821416052893031
+ ]
+ ]
+ },
+ {
+ "type": "rectangle",
+ "version": 814,
+ "versionNonce": 761530653,
+ "isDeleted": false,
+ "id": "_b_2UqAAqfTScWWs1RJZL",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1244.9847300450635,
+ "y": 2029.7514514925117,
+ "strokeColor": "#669df6",
+ "backgroundColor": "#aecbfa",
+ "width": 4.501270111362706,
+ "height": 8.998810431203477,
+ "seed": 99119643,
+ "groupIds": [
+ "JOc29hhcxbWKwFBm5DwnR"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 856,
+ "versionNonce": 1368548147,
+ "isDeleted": false,
+ "id": "RyHdKGWvFvM-4w_BQc7rF",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1249.657282696623,
+ "y": 2029.6803601641716,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 4.501270111362706,
+ "height": 8.998810431203477,
+ "seed": 2045343419,
+ "groupIds": [
+ "JOc29hhcxbWKwFBm5DwnR"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 860,
+ "versionNonce": 295624061,
+ "isDeleted": false,
+ "id": "rDPRfPuvAc9ao4rfaCfTM",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1255.6865470143166,
+ "y": 2029.8375871477276,
+ "strokeColor": "#669df6",
+ "backgroundColor": "#aecbfa",
+ "width": 4.501270111362706,
+ "height": 8.998810431203477,
+ "seed": 480307035,
+ "groupIds": [
+ "JOc29hhcxbWKwFBm5DwnR"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 902,
+ "versionNonce": 40207571,
+ "isDeleted": false,
+ "id": "Kyxkus5_BkLZtsVV0dBWh",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1260.3590996658763,
+ "y": 2029.7664958193889,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 4.501270111362706,
+ "height": 8.998810431203477,
+ "seed": 610354171,
+ "groupIds": [
+ "JOc29hhcxbWKwFBm5DwnR"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 870,
+ "versionNonce": 1681925597,
+ "isDeleted": false,
+ "id": "ffIBmmWXuuZovS5eNzCrd",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1266.7057467131513,
+ "y": 2029.7011744034373,
+ "strokeColor": "#669df6",
+ "backgroundColor": "#aecbfa",
+ "width": 4.501270111362706,
+ "height": 8.998810431203477,
+ "seed": 1496124571,
+ "groupIds": [
+ "JOc29hhcxbWKwFBm5DwnR"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 912,
+ "versionNonce": 463696499,
+ "isDeleted": false,
+ "id": "GKjaKaJEw1G7_ei7RnJVO",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1271.3782993647112,
+ "y": 2029.6300830750986,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 4.501270111362706,
+ "height": 8.998810431203477,
+ "seed": 1589035323,
+ "groupIds": [
+ "JOc29hhcxbWKwFBm5DwnR"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "ellipse",
+ "version": 140,
+ "versionNonce": 2019123773,
+ "isDeleted": false,
+ "id": "OIR3Ta5PCIVYWGK1e4DpR",
+ "fillStyle": "cross-hatch",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1241.4756395027064,
+ "y": 2048.610141724072,
+ "strokeColor": "#e03131",
+ "backgroundColor": "transparent",
+ "width": 13.421696578844598,
+ "height": 13.421696578844598,
+ "seed": 641969749,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "ellipse",
+ "version": 220,
+ "versionNonce": 1578282003,
+ "isDeleted": false,
+ "id": "BCa-6wAh4ZM4nawU0tmOc",
+ "fillStyle": "cross-hatch",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1267.902175717202,
+ "y": 2048.558034606172,
+ "strokeColor": "#e03131",
+ "backgroundColor": "transparent",
+ "width": 13.421696578844598,
+ "height": 13.421696578844598,
+ "seed": 1772286171,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "line",
+ "version": 48,
+ "versionNonce": 1120670365,
+ "isDeleted": false,
+ "id": "n3os2eKjVoygNHhxw7ubQ",
+ "fillStyle": "cross-hatch",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1239.4791141432052,
+ "y": 2103.001745371031,
+ "strokeColor": "#1971c2",
+ "backgroundColor": "transparent",
+ "width": 8.00529879723058,
+ "height": 39.86194519278706,
+ "seed": 558465691,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 8.00529879723058,
+ -39.86194519278706
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 182,
+ "versionNonce": 766095795,
+ "isDeleted": false,
+ "id": "TTKyfQSiuMrBx_gomWKmL",
+ "fillStyle": "cross-hatch",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1285.890220146151,
+ "y": 2104.525528627971,
+ "strokeColor": "#1971c2",
+ "backgroundColor": "transparent",
+ "width": 9.71112128845266,
+ "height": 42.05592910432688,
+ "seed": 1683934715,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -9.71112128845266,
+ -42.05592910432688
+ ]
+ ]
+ },
+ {
+ "type": "rectangle",
+ "version": 854,
+ "versionNonce": 541701885,
+ "isDeleted": false,
+ "id": "DRgwZ776eCzrTlEj7KDx5",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 6.283185307179586,
+ "x": 1261.636264176028,
+ "y": 2223.229547780751,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 2.795822937921211,
+ "height": 8.814334379301076,
+ "seed": 1513372085,
+ "groupIds": [
+ "oMbWO03pcIbqnXEv89t8Q"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 795,
+ "versionNonce": 730792787,
+ "isDeleted": false,
+ "id": "s2L98ZBU2fd8QcyaBFAAe",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 6.283185307179586,
+ "x": 1253.7139429197275,
+ "y": 2216.7558672258374,
+ "strokeColor": "#669df6",
+ "backgroundColor": "#aecbfa",
+ "width": 9.182521437781132,
+ "height": 7.752121356930334,
+ "seed": 189610773,
+ "groupIds": [
+ "oMbWO03pcIbqnXEv89t8Q"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 844,
+ "versionNonce": 1532219229,
+ "isDeleted": false,
+ "id": "mqbEHMUFsi17-ty65R26N",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 6.283185307179586,
+ "x": 1262.9764921662056,
+ "y": 2216.6274147077484,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 9.182521437781132,
+ "height": 7.752121356930334,
+ "seed": 679415925,
+ "groupIds": [
+ "oMbWO03pcIbqnXEv89t8Q"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "line",
+ "version": 1121,
+ "versionNonce": 270082291,
+ "isDeleted": false,
+ "id": "Q9Y5mfq0JVHplG-OEI_dD",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 6.283185307179586,
+ "x": 1250.6610790452648,
+ "y": 2240.023930990078,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 24.90241619165637,
+ "height": 11.329739262259444,
+ "seed": 1603221973,
+ "groupIds": [
+ "oMbWO03pcIbqnXEv89t8Q"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -0.03435663667088932,
+ -9.116492863370489
+ ],
+ [
+ 24.688829304665873,
+ -9.050824126229084
+ ],
+ [
+ 24.868059554985482,
+ 1.441051264022695
+ ],
+ [
+ 21.525409128484323,
+ 1.356323667686184
+ ],
+ [
+ 21.6345117885427,
+ -6.073449205346171
+ ],
+ [
+ 13.817932625107664,
+ -5.930011811754959
+ ],
+ [
+ 14.026982433485095,
+ 2.2132463988889555
+ ],
+ [
+ 10.949960750177553,
+ 1.766391090785731
+ ],
+ [
+ 10.876697882143608,
+ -6.003099454683841
+ ],
+ [
+ 2.9292756295436786,
+ -6.051064198174598
+ ],
+ [
+ 3.0517329458235207,
+ 0.8317873156856564
+ ],
+ [
+ 0.232511198337186,
+ 0.5821416052893031
+ ]
+ ]
+ },
+ {
+ "type": "rectangle",
+ "version": 961,
+ "versionNonce": 1916525501,
+ "isDeleted": false,
+ "id": "W_SihJ9z4KefZywFWQHae",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 6.283185307179586,
+ "x": 1247.6291259856907,
+ "y": 2238.722630845733,
+ "strokeColor": "#669df6",
+ "backgroundColor": "#aecbfa",
+ "width": 4.501270111362706,
+ "height": 8.998810431203477,
+ "seed": 160642869,
+ "groupIds": [
+ "oMbWO03pcIbqnXEv89t8Q"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1003,
+ "versionNonce": 1154386579,
+ "isDeleted": false,
+ "id": "ejOxTuR_HJ14QMGcviqh_",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 6.283185307179586,
+ "x": 1252.3016786372507,
+ "y": 2238.6515395173947,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 4.501270111362706,
+ "height": 8.998810431203477,
+ "seed": 1089505429,
+ "groupIds": [
+ "oMbWO03pcIbqnXEv89t8Q"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1007,
+ "versionNonce": 488856605,
+ "isDeleted": false,
+ "id": "Ge27YncKRlLs0_xbDTAMy",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 6.283185307179586,
+ "x": 1258.330942954944,
+ "y": 2238.8087665009502,
+ "strokeColor": "#669df6",
+ "backgroundColor": "#aecbfa",
+ "width": 4.501270111362706,
+ "height": 8.998810431203477,
+ "seed": 928820725,
+ "groupIds": [
+ "oMbWO03pcIbqnXEv89t8Q"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1051,
+ "versionNonce": 1046855731,
+ "isDeleted": false,
+ "id": "Uqs84c0PfNm7HwUXprk8s",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 6.283185307179586,
+ "x": 1263.003495606504,
+ "y": 2238.7376751726115,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 4.501270111362706,
+ "height": 8.998810431203477,
+ "seed": 1272784725,
+ "groupIds": [
+ "oMbWO03pcIbqnXEv89t8Q"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1017,
+ "versionNonce": 335270013,
+ "isDeleted": false,
+ "id": "04ejsABk5G1nMv2szrfCm",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 6.283185307179586,
+ "x": 1269.3501426537784,
+ "y": 2238.672353756659,
+ "strokeColor": "#669df6",
+ "backgroundColor": "#aecbfa",
+ "width": 4.501270111362706,
+ "height": 8.998810431203477,
+ "seed": 1623684277,
+ "groupIds": [
+ "oMbWO03pcIbqnXEv89t8Q"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1059,
+ "versionNonce": 382026195,
+ "isDeleted": false,
+ "id": "6l9NYQdgs5ByBWGJamiXC",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 6.283185307179586,
+ "x": 1274.022695305339,
+ "y": 2238.6012624283208,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 4.501270111362706,
+ "height": 8.998810431203477,
+ "seed": 1908479509,
+ "groupIds": [
+ "oMbWO03pcIbqnXEv89t8Q"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "ellipse",
+ "version": 253,
+ "versionNonce": 344373469,
+ "isDeleted": false,
+ "id": "OAnmHUXtnOP18jKAZh7Wd",
+ "fillStyle": "cross-hatch",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 3.141592653589793,
+ "x": 1269.45170932271,
+ "y": 2188.9818449779305,
+ "strokeColor": "#e03131",
+ "backgroundColor": "transparent",
+ "width": 13.421696578844598,
+ "height": 13.421696578844598,
+ "seed": 1774160757,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "ellipse",
+ "version": 333,
+ "versionNonce": 1728286579,
+ "isDeleted": false,
+ "id": "lndLr0y5axsSNFoJ7IwwY",
+ "fillStyle": "cross-hatch",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 3.141592653589793,
+ "x": 1243.0251731082144,
+ "y": 2189.0339520958305,
+ "strokeColor": "#e03131",
+ "backgroundColor": "transparent",
+ "width": 13.421696578844598,
+ "height": 13.421696578844598,
+ "seed": 956847317,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "line",
+ "version": 161,
+ "versionNonce": 676697405,
+ "isDeleted": false,
+ "id": "m-zFu_1iQQFRbTQO_f5CJ",
+ "fillStyle": "cross-hatch",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 3.141592653589793,
+ "x": 1277.5113843928068,
+ "y": 2188.1362469634523,
+ "strokeColor": "#1971c2",
+ "backgroundColor": "transparent",
+ "width": 8.00529879723058,
+ "height": 39.86194519278706,
+ "seed": 724628021,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 8.00529879723058,
+ -39.86194519278706
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 295,
+ "versionNonce": 1634150675,
+ "isDeleted": false,
+ "id": "n7dO4vq13K_etYjYSqehS",
+ "fillStyle": "cross-hatch",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 3.141592653589793,
+ "x": 1248.0025349064144,
+ "y": 2189.2090102094853,
+ "strokeColor": "#1971c2",
+ "backgroundColor": "transparent",
+ "width": 9.71112128845266,
+ "height": 42.05592910432688,
+ "seed": 2099176341,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -9.71112128845266,
+ -42.05592910432688
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 1069,
+ "versionNonce": 717874589,
+ "isDeleted": false,
+ "id": "9dR33WzB0LAC0g0Z378LT",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1033.7577135441386,
+ "y": 2264.6078127555065,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 15.896024939498195,
+ "height": 12.807449434576053,
+ "seed": 1418037851,
+ "groupIds": [
+ "PNDNhDwb11_-FkRDWjZB_"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 7.940775652730609,
+ 7.836427741431539
+ ],
+ [
+ 3.129717769098604,
+ 8.044191549716741
+ ],
+ [
+ 3.3503310394194927,
+ 12.793832431341501
+ ],
+ [
+ -3.230375314901173,
+ 12.807449434576053
+ ],
+ [
+ -3.110447002568436,
+ 7.99620309216759
+ ],
+ [
+ -7.9552492867675895,
+ 8.09930374901842
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 1154,
+ "versionNonce": 728141491,
+ "isDeleted": false,
+ "id": "SwA_xGZekdRxmwljUaVmI",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 3.141592653589793,
+ "x": 1033.5034682281148,
+ "y": 2283.507380212156,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 15.896024939498197,
+ "height": 12.807449434576053,
+ "seed": 1572439803,
+ "groupIds": [
+ "PNDNhDwb11_-FkRDWjZB_"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -7.9407756527306095,
+ 7.836427741431539
+ ],
+ [
+ -3.129717769098604,
+ 8.044191549716741
+ ],
+ [
+ -3.3503310394194914,
+ 12.793832431341501
+ ],
+ [
+ 3.230375314901172,
+ 12.807449434576053
+ ],
+ [
+ 3.1104470025684363,
+ 7.99620309216759
+ ],
+ [
+ 7.955249286767588,
+ 8.09930374901842
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 1238,
+ "versionNonce": 253045245,
+ "isDeleted": false,
+ "id": "hogqj6-vrgPnxE5qbiUjI",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 4.71238898038469,
+ "x": 1043.1298125779804,
+ "y": 2274.2330362679654,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 15.896024939498195,
+ "height": 12.807449434576053,
+ "seed": 1686433691,
+ "groupIds": [
+ "PNDNhDwb11_-FkRDWjZB_"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -7.9407756527306095,
+ 7.836427741431539
+ ],
+ [
+ -3.129717769098604,
+ 8.044191549716741
+ ],
+ [
+ -3.3503310394194914,
+ 12.793832431341501
+ ],
+ [
+ 3.230375314901172,
+ 12.807449434576053
+ ],
+ [
+ 3.1104470025684363,
+ 7.99620309216759
+ ],
+ [
+ 7.955249286767588,
+ 8.09930374901842
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 1310,
+ "versionNonce": 2007515219,
+ "isDeleted": false,
+ "id": "FNvv4HKIJeTe_-IYuAT5G",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1024.1202072738672,
+ "y": 2274.3207326836023,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 15.896024939498195,
+ "height": 12.807449434576053,
+ "seed": 454706235,
+ "groupIds": [
+ "PNDNhDwb11_-FkRDWjZB_"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -7.9407756527306095,
+ 7.836427741431539
+ ],
+ [
+ -3.129717769098604,
+ 8.044191549716741
+ ],
+ [
+ -3.3503310394194914,
+ 12.793832431341501
+ ],
+ [
+ 3.230375314901172,
+ 12.807449434576053
+ ],
+ [
+ 3.1104470025684363,
+ 7.99620309216759
+ ],
+ [
+ 7.955249286767588,
+ 8.09930374901842
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 803,
+ "versionNonce": 1715003997,
+ "isDeleted": false,
+ "id": "HHOumUP5HlzJkMbNFZp18",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1011.0669587965249,
+ "y": 2241.462011170073,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 13.709532316968268,
+ "height": 13.891881189304865,
+ "seed": 1780115541,
+ "groupIds": [
+ "EN0IAcsyrBL9jO3lxMe9J"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0.05157250871858333,
+ 5.337183467876706
+ ],
+ [
+ -12.103991954322073,
+ 5.292187876055851
+ ],
+ [
+ -11.93736250588609,
+ 6.9588971209408905
+ ],
+ [
+ 0.08328391343613158,
+ 6.831468467275338
+ ],
+ [
+ 0.08101813593913357,
+ 13.218311281604404
+ ],
+ [
+ 1.6055403626461942,
+ 13.261230700739738
+ ],
+ [
+ 1.4974324392689604,
+ -0.630650488565126
+ ],
+ [
+ 0.051918537499509206,
+ -0.4099220472977767
+ ]
+ ]
+ },
+ {
+ "type": "rectangle",
+ "version": 664,
+ "versionNonce": 1610792435,
+ "isDeleted": false,
+ "id": "-ogSvUwnzLJL5Meh3QVUm",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1009.3579857627833,
+ "y": 2236.701784637444,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 5.207202259436818,
+ "height": 5.207202259436818,
+ "seed": 666146229,
+ "groupIds": [
+ "EN0IAcsyrBL9jO3lxMe9J"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 708,
+ "versionNonce": 621186749,
+ "isDeleted": false,
+ "id": "cadGkHwd3vEhuTvjzSt1D",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1009.3131584452324,
+ "y": 2253.3296999921254,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 5.207202259436818,
+ "height": 5.207202259436818,
+ "seed": 6428437,
+ "groupIds": [
+ "EN0IAcsyrBL9jO3lxMe9J"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 730,
+ "versionNonce": 2138867603,
+ "isDeleted": false,
+ "id": "28al62_EfJEP44Ph8DtDO",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 994.8735551717771,
+ "y": 2244.9665991177126,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 5.207202259436818,
+ "height": 5.207202259436818,
+ "seed": 1587047541,
+ "groupIds": [
+ "EN0IAcsyrBL9jO3lxMe9J"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "ellipse",
+ "version": 846,
+ "versionNonce": 706719517,
+ "isDeleted": false,
+ "id": "DzW5k76C1tFiADx6K6_yo",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1003.4156038822205,
+ "y": 2245.2748515100125,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 4.799876613026025,
+ "height": 4.799876613026024,
+ "seed": 1109202389,
+ "groupIds": [
+ "p-aK87dOsoY330TYimoxO",
+ "EN0IAcsyrBL9jO3lxMe9J"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "ellipse",
+ "version": 791,
+ "versionNonce": 1280056627,
+ "isDeleted": false,
+ "id": "DA5sI7Rnp23lB936V0z1p",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1004.2799138601949,
+ "y": 2246.139161487987,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "white",
+ "width": 3.071256657077243,
+ "height": 3.0712566570772424,
+ "seed": 369464117,
+ "groupIds": [
+ "p-aK87dOsoY330TYimoxO",
+ "EN0IAcsyrBL9jO3lxMe9J"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "line",
+ "version": 890,
+ "versionNonce": 66438013,
+ "isDeleted": false,
+ "id": "1H82co6OXhRAt8blDS6xe",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1011.3281177270871,
+ "y": 2301.7008532232776,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 13.709532316968268,
+ "height": 13.891881189304865,
+ "seed": 404843899,
+ "groupIds": [
+ "OutwEMO533lUjTMN6DMhP"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0.05157250871858333,
+ 5.337183467876706
+ ],
+ [
+ -12.103991954322073,
+ 5.292187876055851
+ ],
+ [
+ -11.93736250588609,
+ 6.9588971209408905
+ ],
+ [
+ 0.08328391343613158,
+ 6.831468467275338
+ ],
+ [
+ 0.08101813593913357,
+ 13.218311281604404
+ ],
+ [
+ 1.6055403626461942,
+ 13.261230700739738
+ ],
+ [
+ 1.4974324392689604,
+ -0.630650488565126
+ ],
+ [
+ 0.051918537499509206,
+ -0.4099220472977767
+ ]
+ ]
+ },
+ {
+ "type": "rectangle",
+ "version": 751,
+ "versionNonce": 836239059,
+ "isDeleted": false,
+ "id": "HQpIHRCNi42CQ0u351itQ",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1009.6191446933456,
+ "y": 2296.940626690648,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 5.207202259436818,
+ "height": 5.207202259436818,
+ "seed": 103548443,
+ "groupIds": [
+ "OutwEMO533lUjTMN6DMhP"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 795,
+ "versionNonce": 1992969181,
+ "isDeleted": false,
+ "id": "wROf4EznRSkCBu6h5wMQV",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1009.5743173757944,
+ "y": 2313.56854204533,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 5.207202259436818,
+ "height": 5.207202259436818,
+ "seed": 1419414203,
+ "groupIds": [
+ "OutwEMO533lUjTMN6DMhP"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 817,
+ "versionNonce": 1790356595,
+ "isDeleted": false,
+ "id": "ZMI2OEbMra8j1ZatInXlO",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 995.1347141023396,
+ "y": 2305.205441170917,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 5.207202259436818,
+ "height": 5.207202259436818,
+ "seed": 672103259,
+ "groupIds": [
+ "OutwEMO533lUjTMN6DMhP"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "ellipse",
+ "version": 933,
+ "versionNonce": 1118750781,
+ "isDeleted": false,
+ "id": "TzJWlth1fAeWNNL-lz8Yy",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1003.6767628127825,
+ "y": 2305.5136935632163,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 4.799876613026025,
+ "height": 4.799876613026024,
+ "seed": 1826445307,
+ "groupIds": [
+ "PaekpZk8Em3PIrbAM_fXn",
+ "OutwEMO533lUjTMN6DMhP"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "ellipse",
+ "version": 878,
+ "versionNonce": 447653395,
+ "isDeleted": false,
+ "id": "Ew9MC4x09XAoKzLU0NsQK",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1004.5410727907572,
+ "y": 2306.378003541191,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "white",
+ "width": 3.071256657077243,
+ "height": 3.0712566570772424,
+ "seed": 1627824283,
+ "groupIds": [
+ "PaekpZk8Em3PIrbAM_fXn",
+ "OutwEMO533lUjTMN6DMhP"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "line",
+ "version": 270,
+ "versionNonce": 2114641629,
+ "isDeleted": false,
+ "id": "vlnPDA5sRcpRToibNMy0x",
+ "fillStyle": "cross-hatch",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 887.4883699945209,
+ "y": 2257.1267580123017,
+ "strokeColor": "#1971c2",
+ "backgroundColor": "transparent",
+ "width": 105.48856245285094,
+ "height": 12.994357975033836,
+ "seed": 859723701,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 105.48856245285094,
+ -12.994357975033836
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 351,
+ "versionNonce": 1673316723,
+ "isDeleted": false,
+ "id": "GtVAy-pbGmtaasEUBPt1Z",
+ "fillStyle": "cross-hatch",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 882.8626811416442,
+ "y": 2272.986490182761,
+ "strokeColor": "#1971c2",
+ "backgroundColor": "transparent",
+ "width": 111.80907356459636,
+ "height": 12.929967694521565,
+ "seed": 419764533,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 111.80907356459636,
+ -12.929967694521565
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 1535,
+ "versionNonce": 1777447133,
+ "isDeleted": false,
+ "id": "EFr6u3RaWKi1LtMdi-F2O",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 861.1807230666249,
+ "y": 2214.0747559672427,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 15.896024939498197,
+ "height": 12.807449434576053,
+ "seed": 1748196277,
+ "groupIds": [
+ "1Ht3ueP4RjVqTtYZryzwz"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059830361,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 7.940775652730609,
+ 7.836427741431539
+ ],
+ [
+ 3.129717769098604,
+ 8.044191549716741
+ ],
+ [
+ 3.3503310394194927,
+ 12.793832431341501
+ ],
+ [
+ -3.230375314901173,
+ 12.807449434576053
+ ],
+ [
+ -3.110447002568436,
+ 7.99620309216759
+ ],
+ [
+ -7.9552492867675895,
+ 8.09930374901842
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 1618,
+ "versionNonce": 94473533,
+ "isDeleted": false,
+ "id": "P1WD5WPY3sOEupginOvJx",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 3.141592653589793,
+ "x": 860.9264777506008,
+ "y": 2232.974323423892,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 15.896024939498195,
+ "height": 12.807449434576053,
+ "seed": 286792981,
+ "groupIds": [
+ "1Ht3ueP4RjVqTtYZryzwz"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059830361,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -7.9407756527306095,
+ 7.836427741431539
+ ],
+ [
+ -3.129717769098604,
+ 8.044191549716741
+ ],
+ [
+ -3.3503310394194914,
+ 12.793832431341501
+ ],
+ [
+ 3.230375314901172,
+ 12.807449434576053
+ ],
+ [
+ 3.1104470025684363,
+ 7.99620309216759
+ ],
+ [
+ 7.955249286767588,
+ 8.09930374901842
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 1704,
+ "versionNonce": 1809243549,
+ "isDeleted": false,
+ "id": "3iE8lT6emDXQscMzdY9-I",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 4.71238898038469,
+ "x": 870.5528221004664,
+ "y": 2223.699979479701,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 15.896024939498197,
+ "height": 12.807449434576053,
+ "seed": 916304501,
+ "groupIds": [
+ "1Ht3ueP4RjVqTtYZryzwz"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059830361,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -7.9407756527306095,
+ 7.836427741431539
+ ],
+ [
+ -3.129717769098604,
+ 8.044191549716741
+ ],
+ [
+ -3.3503310394194914,
+ 12.793832431341501
+ ],
+ [
+ 3.230375314901172,
+ 12.807449434576053
+ ],
+ [
+ 3.1104470025684363,
+ 7.99620309216759
+ ],
+ [
+ 7.955249286767588,
+ 8.09930374901842
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 1803,
+ "versionNonce": 331555325,
+ "isDeleted": false,
+ "id": "-dPoIYMgtoMmp5IF8LDsY",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 851.543216796353,
+ "y": 2223.787675895339,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 15.896024939498197,
+ "height": 12.807449434576053,
+ "seed": 898210773,
+ "groupIds": [
+ "1Ht3ueP4RjVqTtYZryzwz"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059830361,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -7.9407756527306095,
+ 7.836427741431539
+ ],
+ [
+ -3.129717769098604,
+ 8.044191549716741
+ ],
+ [
+ -3.3503310394194914,
+ 12.793832431341501
+ ],
+ [
+ 3.230375314901172,
+ 12.807449434576053
+ ],
+ [
+ 3.1104470025684363,
+ 7.99620309216759
+ ],
+ [
+ 7.955249286767588,
+ 8.09930374901842
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 1226,
+ "versionNonce": 1366952029,
+ "isDeleted": false,
+ "id": "WEkhNADkJclq9qXUPgZyk",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 867.8962279516385,
+ "y": 2259.4667099456096,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 13.709532316968268,
+ "height": 13.891881189304865,
+ "seed": 905009461,
+ "groupIds": [
+ "QFEXUgF9Q4n9HUyvLnKIC"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0.05157250871858333,
+ 5.337183467876706
+ ],
+ [
+ -12.103991954322073,
+ 5.292187876055851
+ ],
+ [
+ -11.93736250588609,
+ 6.9588971209408905
+ ],
+ [
+ 0.08328391343613158,
+ 6.831468467275338
+ ],
+ [
+ 0.08101813593913357,
+ 13.218311281604404
+ ],
+ [
+ 1.6055403626461942,
+ 13.261230700739738
+ ],
+ [
+ 1.4974324392689604,
+ -0.630650488565126
+ ],
+ [
+ 0.051918537499509206,
+ -0.4099220472977767
+ ]
+ ]
+ },
+ {
+ "type": "rectangle",
+ "version": 1087,
+ "versionNonce": 558823411,
+ "isDeleted": false,
+ "id": "URcnF-HyM1_iApW1rUCVF",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 866.1872549178969,
+ "y": 2254.70648341298,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 5.207202259436818,
+ "height": 5.207202259436818,
+ "seed": 1094347413,
+ "groupIds": [
+ "QFEXUgF9Q4n9HUyvLnKIC"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1131,
+ "versionNonce": 422769853,
+ "isDeleted": false,
+ "id": "roOQAnt7EyHVpzM0ul5Z1",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 866.1424276003457,
+ "y": 2271.334398767662,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 5.207202259436818,
+ "height": 5.207202259436818,
+ "seed": 404377589,
+ "groupIds": [
+ "QFEXUgF9Q4n9HUyvLnKIC"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1153,
+ "versionNonce": 2133950867,
+ "isDeleted": false,
+ "id": "ipKZoTr8aZlmFiu4mNKWy",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 851.7028243268909,
+ "y": 2262.971297893248,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 5.207202259436818,
+ "height": 5.207202259436818,
+ "seed": 1217825109,
+ "groupIds": [
+ "QFEXUgF9Q4n9HUyvLnKIC"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "ellipse",
+ "version": 1269,
+ "versionNonce": 1741640989,
+ "isDeleted": false,
+ "id": "XfeFjOm91H1ODxYcvPKJi",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 860.2448730373338,
+ "y": 2263.2795502855483,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 4.799876613026025,
+ "height": 4.799876613026024,
+ "seed": 67409589,
+ "groupIds": [
+ "ML6Hjg3O4IRMSTk9ZRk_t",
+ "QFEXUgF9Q4n9HUyvLnKIC"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "ellipse",
+ "version": 1214,
+ "versionNonce": 1062328115,
+ "isDeleted": false,
+ "id": "TuQbZUOMAaYfpcS2Qa8Ms",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 861.1091830153085,
+ "y": 2264.143860263523,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "white",
+ "width": 3.071256657077243,
+ "height": 3.0712566570772424,
+ "seed": 889845781,
+ "groupIds": [
+ "ML6Hjg3O4IRMSTk9ZRk_t",
+ "QFEXUgF9Q4n9HUyvLnKIC"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "line",
+ "version": 403,
+ "versionNonce": 967051933,
+ "isDeleted": false,
+ "id": "Z_QLYy-qAAq_lA0aeAnUR",
+ "fillStyle": "cross-hatch",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 881.8886026128241,
+ "y": 2457.176746649619,
+ "strokeColor": "#1971c2",
+ "backgroundColor": "transparent",
+ "width": 115.83496361015068,
+ "height": 138.3650539946475,
+ "seed": 562852981,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1703059843008,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 115.83496361015068,
+ -138.3650539946475
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 494,
+ "versionNonce": 216043485,
+ "isDeleted": false,
+ "id": "4_f4jxl4coCZah-DbhUw_",
+ "fillStyle": "cross-hatch",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 877.009612285646,
+ "y": 2441.309501634997,
+ "strokeColor": "#1971c2",
+ "backgroundColor": "transparent",
+ "width": 113.3713568231293,
+ "height": 131.44630452426827,
+ "seed": 424680917,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1703059845694,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 113.3713568231293,
+ -131.44630452426827
+ ]
+ ]
+ },
+ {
+ "type": "rectangle",
+ "version": 1372,
+ "versionNonce": 491287005,
+ "isDeleted": false,
+ "id": "LubMKqhrP54vZJNBdS_fv",
+ "fillStyle": "cross-hatch",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1628.4006037949123,
+ "y": 2159.3500765103618,
+ "strokeColor": "#e03131",
+ "backgroundColor": "transparent",
+ "width": 253.3461767206081,
+ "height": 171.5890064842986,
+ "seed": 464267707,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": {
+ "type": 3
+ },
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "BJnInlZNbR5Zovo7tT3rp"
+ }
+ ],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "text",
+ "version": 1490,
+ "versionNonce": 253093491,
+ "isDeleted": false,
+ "id": "BJnInlZNbR5Zovo7tT3rp",
+ "fillStyle": "cross-hatch",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1702.3393171552163,
+ "y": 2164.3500765103618,
+ "strokeColor": "#e03131",
+ "backgroundColor": "transparent",
+ "width": 105.46875,
+ "height": 24,
+ "seed": 2039822939,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false,
+ "fontSize": 20,
+ "fontFamily": 3,
+ "text": "peering-a",
+ "textAlign": "center",
+ "verticalAlign": "top",
+ "containerId": "LubMKqhrP54vZJNBdS_fv",
+ "originalText": "peering-a",
+ "lineHeight": 1.2,
+ "baseline": 20
+ },
+ {
+ "type": "rectangle",
+ "version": 1167,
+ "versionNonce": 41430589,
+ "isDeleted": false,
+ "id": "iUltUTxWgZdRhu485J5m6",
+ "fillStyle": "cross-hatch",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1631.4515300791693,
+ "y": 2340.3805419215405,
+ "strokeColor": "#e03131",
+ "backgroundColor": "transparent",
+ "width": 252.86183709857812,
+ "height": 160.44091586782883,
+ "seed": 958967643,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": {
+ "type": 3
+ },
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "YGJ0p9LfQXwyn0yWsI86f"
+ }
+ ],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "text",
+ "version": 1276,
+ "versionNonce": 588685331,
+ "isDeleted": false,
+ "id": "YGJ0p9LfQXwyn0yWsI86f",
+ "fillStyle": "cross-hatch",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1705.1480736284584,
+ "y": 2345.3805419215405,
+ "strokeColor": "#e03131",
+ "backgroundColor": "transparent",
+ "width": 105.46875,
+ "height": 24,
+ "seed": 1823476731,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false,
+ "fontSize": 20,
+ "fontFamily": 3,
+ "text": "peering-b",
+ "textAlign": "center",
+ "verticalAlign": "top",
+ "containerId": "iUltUTxWgZdRhu485J5m6",
+ "originalText": "peering-b",
+ "lineHeight": 1.2,
+ "baseline": 20
+ },
+ {
+ "type": "line",
+ "version": 60,
+ "versionNonce": 925982365,
+ "isDeleted": false,
+ "id": "b2pDNIAguitDGETJQVCVx",
+ "fillStyle": "cross-hatch",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1478.556867,
+ "y": 2282.082982,
+ "strokeColor": "#e03131",
+ "backgroundColor": "transparent",
+ "width": 148.6234251630549,
+ "height": 52.22947100600368,
+ "seed": 2032387893,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 148.6234251630549,
+ -52.22947100600368
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 277,
+ "versionNonce": 370091443,
+ "isDeleted": false,
+ "id": "xaQ6duxeuBW9DTcHTKUwf",
+ "fillStyle": "cross-hatch",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1479.9258015295748,
+ "y": 2282.11149919917,
+ "strokeColor": "#e03131",
+ "backgroundColor": "transparent",
+ "width": 144.2325954261787,
+ "height": 108.62601454663536,
+ "seed": 436206965,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 144.2325954261787,
+ 108.62601454663536
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 266,
+ "versionNonce": 1555919805,
+ "isDeleted": false,
+ "id": "RNeZ_yZBTTH4uJ26mwD5I",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1096.257786536119,
+ "y": 1940.9076578205977,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 7.606266135575659,
+ "height": 3.114070710579337,
+ "seed": 2094943419,
+ "groupIds": [
+ "GC04Hry_G-XznKFVOAv6u"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 5.542590385269981,
+ -0.011749421338263826
+ ],
+ [
+ 7.606266135575659,
+ 3.102321289241073
+ ],
+ [
+ 0.00021497885632761963,
+ 2.9498048152566634
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "rectangle",
+ "version": 203,
+ "versionNonce": 1859285651,
+ "isDeleted": false,
+ "id": "8nEo2kJn4eUZd0NUqOG7I",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1091.4620547467305,
+ "y": 1951.389762264169,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 14.437042901434056,
+ "height": 3.0413389536721747,
+ "seed": 1451949403,
+ "groupIds": [
+ "GC04Hry_G-XznKFVOAv6u"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "line",
+ "version": 309,
+ "versionNonce": 1941042205,
+ "isDeleted": false,
+ "id": "DjpMnhRS0-xNk21UvPJk1",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 3.141592653589793,
+ "x": 1103.8420008020894,
+ "y": 1961.7835613863776,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 7.606266135575659,
+ "height": 3.114070710579337,
+ "seed": 77109755,
+ "groupIds": [
+ "GC04Hry_G-XznKFVOAv6u"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -5.542590385269981,
+ -0.011749421338263826
+ ],
+ [
+ -7.606266135575659,
+ 3.102321289241073
+ ],
+ [
+ -0.00021497885632761963,
+ 2.9498048152566634
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "ellipse",
+ "version": 290,
+ "versionNonce": 1336715315,
+ "isDeleted": false,
+ "id": "w9zOzTZ7iL6MMBz8szQy-",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1091.1412340220434,
+ "y": 1939.283763085099,
+ "strokeColor": "#669df6",
+ "backgroundColor": "#aecbfa",
+ "width": 6.371049940947724,
+ "height": 6.371049940947724,
+ "seed": 604611227,
+ "groupIds": [
+ "BKsisrLF7ftQOR8PuBPBw",
+ "GC04Hry_G-XznKFVOAv6u"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "ellipse",
+ "version": 261,
+ "versionNonce": 1291282557,
+ "isDeleted": false,
+ "id": "uSRBLUsunhsG7DPpaqIgn",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1093.2593569573971,
+ "y": 1941.4018860204528,
+ "strokeColor": "#669df6",
+ "backgroundColor": "white",
+ "width": 2.1348040702403304,
+ "height": 2.1348040702403304,
+ "seed": 227579707,
+ "groupIds": [
+ "BKsisrLF7ftQOR8PuBPBw",
+ "GC04Hry_G-XznKFVOAv6u"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "ellipse",
+ "version": 363,
+ "versionNonce": 787425747,
+ "isDeleted": false,
+ "id": "KeTgfsonMsUWo09uJWVO0",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1086.5421740724028,
+ "y": 1949.7805973188683,
+ "strokeColor": "#669df6",
+ "backgroundColor": "#aecbfa",
+ "width": 6.371049940947724,
+ "height": 6.371049940947724,
+ "seed": 1603270619,
+ "groupIds": [
+ "R5G9JBt20ZRsFps6E9K0L",
+ "GC04Hry_G-XznKFVOAv6u"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "ellipse",
+ "version": 334,
+ "versionNonce": 1515147485,
+ "isDeleted": false,
+ "id": "f1cWMw49D0ADO4eAuzr5g",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1088.6602970077565,
+ "y": 1951.898720254222,
+ "strokeColor": "#669df6",
+ "backgroundColor": "white",
+ "width": 2.1348040702403304,
+ "height": 2.1348040702403304,
+ "seed": 1209681019,
+ "groupIds": [
+ "R5G9JBt20ZRsFps6E9K0L",
+ "GC04Hry_G-XznKFVOAv6u"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "ellipse",
+ "version": 326,
+ "versionNonce": 833648499,
+ "isDeleted": false,
+ "id": "kzd6_jZWCHoYKtE9Jtp4u",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1091.3392618822695,
+ "y": 1960.2711548413145,
+ "strokeColor": "#669df6",
+ "backgroundColor": "#aecbfa",
+ "width": 6.371049940947724,
+ "height": 6.371049940947724,
+ "seed": 250739995,
+ "groupIds": [
+ "2Pyi9gzZMwlT4kW0Eph_r",
+ "GC04Hry_G-XznKFVOAv6u"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "ellipse",
+ "version": 297,
+ "versionNonce": 1498099005,
+ "isDeleted": false,
+ "id": "S8kyFWydAGjUKnYZUcTgF",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1093.4573848176233,
+ "y": 1962.3892777766682,
+ "strokeColor": "#669df6",
+ "backgroundColor": "white",
+ "width": 2.1348040702403304,
+ "height": 2.1348040702403304,
+ "seed": 1602855355,
+ "groupIds": [
+ "2Pyi9gzZMwlT4kW0Eph_r",
+ "GC04Hry_G-XznKFVOAv6u"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "line",
+ "version": 617,
+ "versionNonce": 372707603,
+ "isDeleted": false,
+ "id": "sIz3_GdNbJMQjcOlEekHS",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1101.346380162843,
+ "y": 1933.1050863607288,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 11.487984999895955,
+ "height": 39.668093560357086,
+ "seed": 1392751195,
+ "groupIds": [
+ "GC04Hry_G-XznKFVOAv6u"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 1.9189012712869844,
+ 1.6342644423091504
+ ],
+ [
+ 3.7876242726036007,
+ 3.572305722154397
+ ],
+ [
+ 5.929546814322157,
+ 6.616511060577209
+ ],
+ [
+ 7.685262596846332,
+ 9.674118125778662
+ ],
+ [
+ 8.98612170539948,
+ 13.579579751093279
+ ],
+ [
+ 9.65491541505417,
+ 17.50974878611622
+ ],
+ [
+ 9.711234363124966,
+ 22.043548132083853
+ ],
+ [
+ 8.970896792551143,
+ 26.93008643914338
+ ],
+ [
+ 7.448813416314007,
+ 31.17904155665962
+ ],
+ [
+ 4.313501141049105,
+ 35.34085030934008
+ ],
+ [
+ 2.274492836433714,
+ 37.68405920789095
+ ],
+ [
+ -0.05017826997060611,
+ 39.668093560357086
+ ],
+ [
+ -1.7767506367709904,
+ 36.78616418476654
+ ],
+ [
+ 1.1153047941787904,
+ 33.99757697489578
+ ],
+ [
+ 3.427424442742467,
+ 30.94731364254809
+ ],
+ [
+ 4.972885391532042,
+ 27.494981970006393
+ ],
+ [
+ 6.189373567407041,
+ 23.687474909334696
+ ],
+ [
+ 6.379795223578899,
+ 19.447670173906996
+ ],
+ [
+ 6.004122428343023,
+ 15.256315609181819
+ ],
+ [
+ 4.852811431873948,
+ 11.75197007797351
+ ],
+ [
+ 2.5924851508422107,
+ 7.781466324073101
+ ],
+ [
+ 0.5358540922889202,
+ 5.0819850939973295
+ ],
+ [
+ -1.7748489007344752,
+ 2.767318772828393
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 286,
+ "versionNonce": 1498185117,
+ "isDeleted": false,
+ "id": "NA9PEECIKU_IxXvG0BfWX",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1112.793127808279,
+ "y": 1951.3347166524009,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 13.508709077169547,
+ "height": 9.688113111516508,
+ "seed": 976400123,
+ "groupIds": [
+ "GC04Hry_G-XznKFVOAv6u"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -0.055497618594264705,
+ 3.3179836680533445
+ ],
+ [
+ 6.709875964445189,
+ 3.4676640748181984
+ ],
+ [
+ 6.689623853726602,
+ 6.499546714952619
+ ],
+ [
+ 13.453211458575282,
+ 1.6165142169342475
+ ],
+ [
+ 6.73594352884048,
+ -3.1885663965638886
+ ],
+ [
+ 6.728457854818745,
+ -0.02557697162071037
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 1754,
+ "versionNonce": 234452659,
+ "isDeleted": false,
+ "id": "RRQ8keB3eHmtIKpMUGil5",
+ "fillStyle": "solid",
+ "strokeWidth": 4,
+ "strokeStyle": "solid",
+ "roughness": 0,
+ "opacity": 100,
+ "angle": 0,
+ "x": 918.0999915470898,
+ "y": 2010.0713027622992,
+ "strokeColor": "#1971c2",
+ "backgroundColor": "transparent",
+ "width": 234.00841221290932,
+ "height": 144.06609761970694,
+ "seed": 1499973723,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 9.84112582335979,
+ -3.4086670467121394
+ ],
+ [
+ 16.08478867991687,
+ -10.538944431718818
+ ],
+ [
+ 19.060612048499195,
+ -20.641588098529297
+ ],
+ [
+ 16.25686337909093,
+ -32.4391480612106
+ ],
+ [
+ 12.478134170818919,
+ -36.313454947567834
+ ],
+ [
+ 6.754860329386531,
+ -39.832759029607985
+ ],
+ [
+ -0.09749600220283128,
+ -41.15284299966956
+ ],
+ [
+ 3.115235265671572,
+ -44.449795877191036
+ ],
+ [
+ 4.906293452603279,
+ -53.1705127025933
+ ],
+ [
+ 4.408944843723134,
+ -60.77131293408959
+ ],
+ [
+ 0.5468557328943575,
+ -69.80724529060362
+ ],
+ [
+ -3.7318892728702053,
+ -75.80341356076084
+ ],
+ [
+ -10.400107006023063,
+ -81.50413427079135
+ ],
+ [
+ -17.406667873082995,
+ -85.59586319194332
+ ],
+ [
+ -28.01346147973544,
+ -88.2697659388052
+ ],
+ [
+ -36.30232456431986,
+ -87.45083645060535
+ ],
+ [
+ -39.45654098669047,
+ -88.47734696881528
+ ],
+ [
+ -37.38612639857149,
+ -93.88057674655167
+ ],
+ [
+ -37.91330648624012,
+ -107.6918307717751
+ ],
+ [
+ -42.26911272606901,
+ -119.05105880283546
+ ],
+ [
+ -49.66385212041797,
+ -130.65372934528838
+ ],
+ [
+ -59.7363873311611,
+ -138.29826121161116
+ ],
+ [
+ -74.09484844008693,
+ -143.48229106611254
+ ],
+ [
+ -87.93318725274935,
+ -144.06609761970694
+ ],
+ [
+ -100.95971591912371,
+ -141.82135064979738
+ ],
+ [
+ -109.86734624496114,
+ -136.64307576764836
+ ],
+ [
+ -116.8834782157727,
+ -130.7549388947132
+ ],
+ [
+ -121.82609672559397,
+ -125.11486082115377
+ ],
+ [
+ -126.76091883793276,
+ -117.20898550448177
+ ],
+ [
+ -127.56879604715829,
+ -111.79631521702257
+ ],
+ [
+ -130.64188343740352,
+ -115.61934109146111
+ ],
+ [
+ -140.908395069196,
+ -121.20662934732954
+ ],
+ [
+ -148.07197127818733,
+ -122.38344425523164
+ ],
+ [
+ -157.01851178251343,
+ -120.87208182798625
+ ],
+ [
+ -167.03045051966524,
+ -116.87859264432328
+ ],
+ [
+ -174.5834670413276,
+ -108.18750725856361
+ ],
+ [
+ -177.4342300392392,
+ -99.93297909815576
+ ],
+ [
+ -178.5277465950909,
+ -92.7576159671809
+ ],
+ [
+ -176.56812225040022,
+ -87.3294401693395
+ ],
+ [
+ -180.52109052144147,
+ -86.30418898467221
+ ],
+ [
+ -192.15674187692912,
+ -82.2667219641572
+ ],
+ [
+ -203.82806006342872,
+ -73.72024483215935
+ ],
+ [
+ -211.2009376946695,
+ -61.62444849622429
+ ],
+ [
+ -214.94780016441013,
+ -51.16288545406593
+ ],
+ [
+ -214.81002067082886,
+ -38.98760648111789
+ ],
+ [
+ -210.53527060968543,
+ -23.949853216579584
+ ],
+ [
+ -201.6864776724825,
+ -12.42689490339859
+ ],
+ [
+ -190.90388121821076,
+ -5.2438262478790705
+ ],
+ [
+ -180.85901638046522,
+ -1.184982098601182
+ ],
+ [
+ -156.8781887487329,
+ -0.9696705628900588
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 22,
+ "versionNonce": 25477629,
+ "isDeleted": false,
+ "id": "PCEUsa-kgrIgOAlxSlOvT",
+ "fillStyle": "cross-hatch",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1084.644408039474,
+ "y": 1953.3714916729625,
+ "strokeColor": "#1971c2",
+ "backgroundColor": "transparent",
+ "width": 164.9090580571409,
+ "height": 0,
+ "seed": 1768524245,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -164.9090580571409,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 1066,
+ "versionNonce": 1469982803,
+ "isDeleted": false,
+ "id": "YeGVU137QIYz2zjbMH9MB",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1101.2408777017226,
+ "y": 1981.8964950066338,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 15.896024939498195,
+ "height": 12.807449434576053,
+ "seed": 191099893,
+ "groupIds": [
+ "XEk2uZSxoi3b-9GdbXQuQ"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 7.940775652730609,
+ 7.836427741431539
+ ],
+ [
+ 3.129717769098604,
+ 8.044191549716741
+ ],
+ [
+ 3.3503310394194927,
+ 12.793832431341501
+ ],
+ [
+ -3.230375314901173,
+ 12.807449434576053
+ ],
+ [
+ -3.110447002568436,
+ 7.99620309216759
+ ],
+ [
+ -7.9552492867675895,
+ 8.09930374901842
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 1151,
+ "versionNonce": 385186397,
+ "isDeleted": false,
+ "id": "c-6_JBRndzSOD2tvuWRf-",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 3.141592653589793,
+ "x": 1100.986632385699,
+ "y": 2000.7960624632842,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 15.896024939498197,
+ "height": 12.807449434576053,
+ "seed": 1795927381,
+ "groupIds": [
+ "XEk2uZSxoi3b-9GdbXQuQ"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -7.9407756527306095,
+ 7.836427741431539
+ ],
+ [
+ -3.129717769098604,
+ 8.044191549716741
+ ],
+ [
+ -3.3503310394194914,
+ 12.793832431341501
+ ],
+ [
+ 3.230375314901172,
+ 12.807449434576053
+ ],
+ [
+ 3.1104470025684363,
+ 7.99620309216759
+ ],
+ [
+ 7.955249286767588,
+ 8.09930374901842
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 1235,
+ "versionNonce": 419145203,
+ "isDeleted": false,
+ "id": "EACrFg5-l9v-9rdbpAEQf",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 4.71238898038469,
+ "x": 1110.6129767355646,
+ "y": 1991.5217185190932,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 15.896024939498195,
+ "height": 12.807449434576053,
+ "seed": 1681210037,
+ "groupIds": [
+ "XEk2uZSxoi3b-9GdbXQuQ"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -7.9407756527306095,
+ 7.836427741431539
+ ],
+ [
+ -3.129717769098604,
+ 8.044191549716741
+ ],
+ [
+ -3.3503310394194914,
+ 12.793832431341501
+ ],
+ [
+ 3.230375314901172,
+ 12.807449434576053
+ ],
+ [
+ 3.1104470025684363,
+ 7.99620309216759
+ ],
+ [
+ 7.955249286767588,
+ 8.09930374901842
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 1307,
+ "versionNonce": 1114646205,
+ "isDeleted": false,
+ "id": "6_MonwZvyZkBz34w7yAm0",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1091.6033714314513,
+ "y": 1991.60941493473,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 15.896024939498195,
+ "height": 12.807449434576053,
+ "seed": 260447253,
+ "groupIds": [
+ "XEk2uZSxoi3b-9GdbXQuQ"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825744,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -7.9407756527306095,
+ 7.836427741431539
+ ],
+ [
+ -3.129717769098604,
+ 8.044191549716741
+ ],
+ [
+ -3.3503310394194914,
+ 12.793832431341501
+ ],
+ [
+ 3.230375314901172,
+ 12.807449434576053
+ ],
+ [
+ 3.1104470025684363,
+ 7.99620309216759
+ ],
+ [
+ 7.955249286767588,
+ 8.09930374901842
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "rectangle",
+ "version": 547,
+ "versionNonce": 565680669,
+ "isDeleted": false,
+ "id": "nqCg8C043EerPVR26WgWX",
+ "fillStyle": "cross-hatch",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1280.873077161392,
+ "y": 2283.9252812783316,
+ "strokeColor": "#f08c00",
+ "backgroundColor": "transparent",
+ "width": 190.57315247671846,
+ "height": 80,
+ "seed": 1177851421,
+ "groupIds": [
+ "spqYTauP-yPJTF-8Xmv_M"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 3
+ },
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "jsWz_WbUcznOLF13Q8ffQ"
+ }
+ ],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "text",
+ "version": 230,
+ "versionNonce": 716988979,
+ "isDeleted": false,
+ "id": "jsWz_WbUcznOLF13Q8ffQ",
+ "fillStyle": "cross-hatch",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1337.5399796381105,
+ "y": 2310.9252812783316,
+ "strokeColor": "#f08c00",
+ "backgroundColor": "transparent",
+ "width": 128.90625,
+ "height": 48,
+ "seed": 987089533,
+ "groupIds": [
+ "spqYTauP-yPJTF-8Xmv_M"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false,
+ "fontSize": 20,
+ "fontFamily": 3,
+ "text": "hub-b\n10.0.2.0/24",
+ "textAlign": "right",
+ "verticalAlign": "bottom",
+ "containerId": "nqCg8C043EerPVR26WgWX",
+ "originalText": "hub-b\n10.0.2.0/24",
+ "lineHeight": 1.2,
+ "baseline": 44
+ },
+ {
+ "type": "rectangle",
+ "version": 849,
+ "versionNonce": 928534141,
+ "isDeleted": false,
+ "id": "kZKYeuxYuq5MIhqXJKU2C",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1294.978213545343,
+ "y": 2315.499215118297,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1320772603,
+ "groupIds": [
+ "supSNn_AJprcC4eOaGFUE",
+ "spqYTauP-yPJTF-8Xmv_M"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 841,
+ "versionNonce": 1140302803,
+ "isDeleted": false,
+ "id": "jDkThL7obg2IUM6VTBfMk",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1294.9254936112293,
+ "y": 2322.7887699218454,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1132539035,
+ "groupIds": [
+ "supSNn_AJprcC4eOaGFUE",
+ "spqYTauP-yPJTF-8Xmv_M"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 869,
+ "versionNonce": 1403221725,
+ "isDeleted": false,
+ "id": "UMY50oeLLy0UiaVZzBiJ3",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1302.8528071855048,
+ "y": 2300.261198717837,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 696705339,
+ "groupIds": [
+ "supSNn_AJprcC4eOaGFUE",
+ "spqYTauP-yPJTF-8Xmv_M"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 912,
+ "versionNonce": 1134145907,
+ "isDeleted": false,
+ "id": "6gbfmkPcyvtqZMMqBggcT",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1310.2160836726216,
+ "y": 2300.3490126676725,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 2049769947,
+ "groupIds": [
+ "supSNn_AJprcC4eOaGFUE",
+ "spqYTauP-yPJTF-8Xmv_M"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 919,
+ "versionNonce": 556438333,
+ "isDeleted": false,
+ "id": "PcaAjNpuWcPwPCdFHlgXq",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1317.3995211321521,
+ "y": 2300.3413872157535,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1585843835,
+ "groupIds": [
+ "supSNn_AJprcC4eOaGFUE",
+ "spqYTauP-yPJTF-8Xmv_M"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 927,
+ "versionNonce": 1256786707,
+ "isDeleted": false,
+ "id": "h6D9PRr8GKGlLcPZOlgjt",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1302.7264656494735,
+ "y": 2330.3892630167093,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 961840923,
+ "groupIds": [
+ "supSNn_AJprcC4eOaGFUE",
+ "spqYTauP-yPJTF-8Xmv_M"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 969,
+ "versionNonce": 2085561245,
+ "isDeleted": false,
+ "id": "iJWWZIGbO6BqmJhNuHtw_",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1310.0897421365898,
+ "y": 2330.4925819238024,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1896541115,
+ "groupIds": [
+ "supSNn_AJprcC4eOaGFUE",
+ "spqYTauP-yPJTF-8Xmv_M"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 976,
+ "versionNonce": 240922803,
+ "isDeleted": false,
+ "id": "dxnP_oVoAr6E0YJPa9y2K",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1317.2731795961195,
+ "y": 2330.4849564718834,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 2043395163,
+ "groupIds": [
+ "supSNn_AJprcC4eOaGFUE",
+ "spqYTauP-yPJTF-8Xmv_M"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 858,
+ "versionNonce": 960669693,
+ "isDeleted": false,
+ "id": "Op14u2v1SNqb5jaHbGVEv",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1324.8898936169744,
+ "y": 2308.230291088469,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 527005947,
+ "groupIds": [
+ "supSNn_AJprcC4eOaGFUE",
+ "spqYTauP-yPJTF-8Xmv_M"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 901,
+ "versionNonce": 1872339539,
+ "isDeleted": false,
+ "id": "AAtyXe05u0wgkjHK52GfN",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1325.0245727243623,
+ "y": 2315.737865106993,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 258384283,
+ "groupIds": [
+ "supSNn_AJprcC4eOaGFUE",
+ "spqYTauP-yPJTF-8Xmv_M"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 893,
+ "versionNonce": 705077341,
+ "isDeleted": false,
+ "id": "uIfWUQYewSSdGtsWo9kji",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1324.9718527902482,
+ "y": 2323.0274199105415,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 586528315,
+ "groupIds": [
+ "supSNn_AJprcC4eOaGFUE",
+ "spqYTauP-yPJTF-8Xmv_M"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 805,
+ "versionNonce": 1467473907,
+ "isDeleted": false,
+ "id": "A2BJgjiIquiPXPZCth2cS",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1294.8435344379554,
+ "y": 2307.991641099773,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1761162971,
+ "groupIds": [
+ "supSNn_AJprcC4eOaGFUE",
+ "spqYTauP-yPJTF-8Xmv_M"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1062,
+ "versionNonce": 1684835517,
+ "isDeleted": false,
+ "id": "wXTNNmzoMJQyvHY_9eMym",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1300.629512563331,
+ "y": 2304.6525371170983,
+ "strokeColor": "#669df6",
+ "backgroundColor": "#aecbfa",
+ "width": 25.68701803825022,
+ "height": 25.322961410864238,
+ "seed": 1879286651,
+ "groupIds": [
+ "EIMSbsGeqlpo6At7o_BQy",
+ "supSNn_AJprcC4eOaGFUE",
+ "spqYTauP-yPJTF-8Xmv_M"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 941,
+ "versionNonce": 1342007699,
+ "isDeleted": false,
+ "id": "_LTtof8111p5E7EM2oqEk",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1304.2200996005854,
+ "y": 2308.0450962490904,
+ "strokeColor": "#669df6",
+ "backgroundColor": "white",
+ "width": 18.415416343106916,
+ "height": 18.197540514342283,
+ "seed": 1347910683,
+ "groupIds": [
+ "EIMSbsGeqlpo6At7o_BQy",
+ "supSNn_AJprcC4eOaGFUE",
+ "spqYTauP-yPJTF-8Xmv_M"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "line",
+ "version": 910,
+ "versionNonce": 1209396509,
+ "isDeleted": false,
+ "id": "Wb2WkByHceNJtk3Ef7Igu",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1307.874847645891,
+ "y": 2322.8269876295735,
+ "strokeColor": "#669df6",
+ "backgroundColor": "#aecbfa",
+ "width": 11.005694271511862,
+ "height": 10.941584275697766,
+ "seed": 1978089659,
+ "groupIds": [
+ "dDOTZ8escyi2T9PZRQMWu",
+ "supSNn_AJprcC4eOaGFUE",
+ "spqYTauP-yPJTF-8Xmv_M"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -0.11767292537006607,
+ -10.939877113695731
+ ],
+ [
+ 10.888021346141796,
+ -10.941584275697766
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 915,
+ "versionNonce": 1583398707,
+ "isDeleted": false,
+ "id": "4hzzNKNcle0lJ_qF5ZLtm",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1313.3498165620426,
+ "y": 2317.3146226543195,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 5.716009503705499,
+ "height": 10.677776743237455,
+ "seed": 710242651,
+ "groupIds": [
+ "dDOTZ8escyi2T9PZRQMWu",
+ "supSNn_AJprcC4eOaGFUE",
+ "spqYTauP-yPJTF-8Xmv_M"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 5.459069112195784,
+ 5.178594135612063
+ ],
+ [
+ 5.716009503705499,
+ -5.499182607625391
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 1087,
+ "versionNonce": 1148469629,
+ "isDeleted": false,
+ "id": "ULpJF_9EStysgbRDYCG4S",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1310.37465422984,
+ "y": 2320.006583258987,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 5.716009503705499,
+ "height": 10.677776743237455,
+ "seed": 1593085435,
+ "groupIds": [
+ "dDOTZ8escyi2T9PZRQMWu",
+ "supSNn_AJprcC4eOaGFUE",
+ "spqYTauP-yPJTF-8Xmv_M"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 5.459069112195784,
+ 5.178594135612063
+ ],
+ [
+ 5.716009503705499,
+ -5.499182607625391
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "id": "qZfGSi0K0YrYl1ARhqUI3",
+ "type": "rectangle",
+ "x": 1225.5217516386235,
+ "y": 2184.476319994022,
+ "width": 190.57315247671846,
+ "height": 80,
+ "angle": 0,
+ "strokeColor": "#f08c00",
+ "backgroundColor": "transparent",
+ "fillStyle": "cross-hatch",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": {
+ "type": 3
+ },
+ "seed": 1261356861,
+ "version": 453,
+ "versionNonce": 2015741501,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "sk8mEqYAcZ_O5Ff59hnB7"
+ }
+ ],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "sk8mEqYAcZ_O5Ff59hnB7",
+ "type": "text",
+ "x": 1282.188654115342,
+ "y": 2211.476319994022,
+ "width": 128.90625,
+ "height": 48,
+ "angle": 0,
+ "strokeColor": "#f08c00",
+ "backgroundColor": "transparent",
+ "fillStyle": "cross-hatch",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": null,
+ "seed": 731617875,
+ "version": 132,
+ "versionNonce": 1521387539,
+ "isDeleted": false,
+ "boundElements": null,
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false,
+ "text": "hub-nva\n10.0.0.0/24",
+ "fontSize": 20,
+ "fontFamily": 3,
+ "textAlign": "right",
+ "verticalAlign": "bottom",
+ "baseline": 44,
+ "containerId": "qZfGSi0K0YrYl1ARhqUI3",
+ "originalText": "hub-nva\n10.0.0.0/24",
+ "lineHeight": 1.2
+ },
+ {
+ "type": "rectangle",
+ "version": 837,
+ "versionNonce": 675984221,
+ "isDeleted": false,
+ "id": "KhOnCVePeiAlQUZnxpbHc",
+ "fillStyle": "cross-hatch",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1066.2402504689583,
+ "y": 2283.1754570548537,
+ "strokeColor": "#f08c00",
+ "backgroundColor": "transparent",
+ "width": 190.57315247671846,
+ "height": 80,
+ "seed": 499873917,
+ "groupIds": [
+ "yJKSPh8b3UW2OebDT34Py"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 3
+ },
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "D4v1QyKPzKupS4wtyH4EY"
+ }
+ ],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "text",
+ "version": 527,
+ "versionNonce": 1567784179,
+ "isDeleted": false,
+ "id": "D4v1QyKPzKupS4wtyH4EY",
+ "fillStyle": "cross-hatch",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1122.9071529456767,
+ "y": 2310.1754570548537,
+ "strokeColor": "#f08c00",
+ "backgroundColor": "transparent",
+ "width": 128.90625,
+ "height": 48,
+ "seed": 371286237,
+ "groupIds": [
+ "yJKSPh8b3UW2OebDT34Py"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false,
+ "fontSize": 20,
+ "fontFamily": 3,
+ "text": "hub-a\n10.0.1.0/24",
+ "textAlign": "right",
+ "verticalAlign": "bottom",
+ "containerId": "KhOnCVePeiAlQUZnxpbHc",
+ "originalText": "hub-a\n10.0.1.0/24",
+ "lineHeight": 1.2,
+ "baseline": 44
+ },
+ {
+ "type": "rectangle",
+ "version": 1139,
+ "versionNonce": 1186348989,
+ "isDeleted": false,
+ "id": "rAzbS8mn__1iSqTltgiyU",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1080.3453868529089,
+ "y": 2314.749390894819,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1885027645,
+ "groupIds": [
+ "NH2NJlKQP6T0NDhb2kl12",
+ "yJKSPh8b3UW2OebDT34Py"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1131,
+ "versionNonce": 1453090451,
+ "isDeleted": false,
+ "id": "Zr5OwMqiBpwSbMm7uzN5Y",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1080.2926669187952,
+ "y": 2322.0389456983676,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 869961117,
+ "groupIds": [
+ "NH2NJlKQP6T0NDhb2kl12",
+ "yJKSPh8b3UW2OebDT34Py"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1159,
+ "versionNonce": 1018249245,
+ "isDeleted": false,
+ "id": "sJ6ThHYhxYGnyK85Ywugm",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1088.2199804930708,
+ "y": 2299.5113744943583,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 2144391677,
+ "groupIds": [
+ "NH2NJlKQP6T0NDhb2kl12",
+ "yJKSPh8b3UW2OebDT34Py"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1202,
+ "versionNonce": 303569971,
+ "isDeleted": false,
+ "id": "9APmI_5l1ovHcjBOyqO6e",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1095.5832569801876,
+ "y": 2299.5991884441946,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 289376861,
+ "groupIds": [
+ "NH2NJlKQP6T0NDhb2kl12",
+ "yJKSPh8b3UW2OebDT34Py"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1209,
+ "versionNonce": 1345139837,
+ "isDeleted": false,
+ "id": "R5tAuvNCKomeKyjNraMug",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1102.766694439718,
+ "y": 2299.5915629922756,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 150484669,
+ "groupIds": [
+ "NH2NJlKQP6T0NDhb2kl12",
+ "yJKSPh8b3UW2OebDT34Py"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1217,
+ "versionNonce": 2076974547,
+ "isDeleted": false,
+ "id": "-Lj3DswqWbyXn3OPiFAeX",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1088.0936389570395,
+ "y": 2329.6394387932314,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1906071325,
+ "groupIds": [
+ "NH2NJlKQP6T0NDhb2kl12",
+ "yJKSPh8b3UW2OebDT34Py"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1259,
+ "versionNonce": 216767709,
+ "isDeleted": false,
+ "id": "HcNVUjYQnFTC8ywfY00hT",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1095.4569154441558,
+ "y": 2329.7427577003245,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 94202749,
+ "groupIds": [
+ "NH2NJlKQP6T0NDhb2kl12",
+ "yJKSPh8b3UW2OebDT34Py"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1266,
+ "versionNonce": 1053748083,
+ "isDeleted": false,
+ "id": "Zhf5TwF3nGtZK1GtjWNLx",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1102.6403529036854,
+ "y": 2329.7351322484055,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 893187037,
+ "groupIds": [
+ "NH2NJlKQP6T0NDhb2kl12",
+ "yJKSPh8b3UW2OebDT34Py"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1148,
+ "versionNonce": 176027965,
+ "isDeleted": false,
+ "id": "eAnuIpbLf0Mgt7MEVMLUu",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1110.2570669245404,
+ "y": 2307.4804668649913,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1821143101,
+ "groupIds": [
+ "NH2NJlKQP6T0NDhb2kl12",
+ "yJKSPh8b3UW2OebDT34Py"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1191,
+ "versionNonce": 1600587027,
+ "isDeleted": false,
+ "id": "1dZvG1UpFn5vrSgive64s",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1110.3917460319283,
+ "y": 2314.988040883515,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 426598557,
+ "groupIds": [
+ "NH2NJlKQP6T0NDhb2kl12",
+ "yJKSPh8b3UW2OebDT34Py"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1183,
+ "versionNonce": 1917176221,
+ "isDeleted": false,
+ "id": "s2UugGasje5o2hU-Fhuxl",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1110.3390260978142,
+ "y": 2322.2775956870637,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1905345789,
+ "groupIds": [
+ "NH2NJlKQP6T0NDhb2kl12",
+ "yJKSPh8b3UW2OebDT34Py"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1095,
+ "versionNonce": 353036979,
+ "isDeleted": false,
+ "id": "6jz_2rWzyTRnKbNhBVdeR",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1080.2107077455214,
+ "y": 2307.241816876295,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 2021236061,
+ "groupIds": [
+ "NH2NJlKQP6T0NDhb2kl12",
+ "yJKSPh8b3UW2OebDT34Py"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1352,
+ "versionNonce": 1165266429,
+ "isDeleted": false,
+ "id": "jMIlmyW1J6PrCCSXyzjze",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1085.996685870897,
+ "y": 2303.9027128936204,
+ "strokeColor": "#669df6",
+ "backgroundColor": "#aecbfa",
+ "width": 25.68701803825022,
+ "height": 25.322961410864238,
+ "seed": 1165486525,
+ "groupIds": [
+ "h7tUw0NxJlWu0G2gO72Mn",
+ "NH2NJlKQP6T0NDhb2kl12",
+ "yJKSPh8b3UW2OebDT34Py"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1231,
+ "versionNonce": 1684085843,
+ "isDeleted": false,
+ "id": "adKkCqeZs90gjGNnJzK0m",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1089.5872729081514,
+ "y": 2307.2952720256117,
+ "strokeColor": "#669df6",
+ "backgroundColor": "white",
+ "width": 18.415416343106916,
+ "height": 18.197540514342283,
+ "seed": 162376221,
+ "groupIds": [
+ "h7tUw0NxJlWu0G2gO72Mn",
+ "NH2NJlKQP6T0NDhb2kl12",
+ "yJKSPh8b3UW2OebDT34Py"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "line",
+ "version": 1200,
+ "versionNonce": 1661716061,
+ "isDeleted": false,
+ "id": "2c0oxB3G7RudBhLSDu6xW",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1093.2420209534569,
+ "y": 2322.0771634060957,
+ "strokeColor": "#669df6",
+ "backgroundColor": "#aecbfa",
+ "width": 11.005694271511862,
+ "height": 10.941584275697766,
+ "seed": 1443651197,
+ "groupIds": [
+ "bTKKfdH2rEUh0izhaN83x",
+ "NH2NJlKQP6T0NDhb2kl12",
+ "yJKSPh8b3UW2OebDT34Py"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -0.11767292537006607,
+ -10.939877113695731
+ ],
+ [
+ 10.888021346141796,
+ -10.941584275697766
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 1205,
+ "versionNonce": 2034244083,
+ "isDeleted": false,
+ "id": "UX-hfmmIY-EPQFiIlsZHk",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1098.7169898696086,
+ "y": 2316.5647984308407,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 5.716009503705499,
+ "height": 10.677776743237455,
+ "seed": 559253213,
+ "groupIds": [
+ "bTKKfdH2rEUh0izhaN83x",
+ "NH2NJlKQP6T0NDhb2kl12",
+ "yJKSPh8b3UW2OebDT34Py"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 5.459069112195784,
+ 5.178594135612063
+ ],
+ [
+ 5.716009503705499,
+ -5.499182607625391
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 1377,
+ "versionNonce": 1306325693,
+ "isDeleted": false,
+ "id": "jCYs1sZJ76Fyg-mW9DVOx",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1095.741827537406,
+ "y": 2319.2567590355093,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 5.716009503705499,
+ "height": 10.677776743237455,
+ "seed": 236626749,
+ "groupIds": [
+ "bTKKfdH2rEUh0izhaN83x",
+ "NH2NJlKQP6T0NDhb2kl12",
+ "yJKSPh8b3UW2OebDT34Py"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 5.459069112195784,
+ 5.178594135612063
+ ],
+ [
+ 5.716009503705499,
+ -5.499182607625391
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "rectangle",
+ "version": 981,
+ "versionNonce": 1085170579,
+ "isDeleted": false,
+ "id": "BnEhv87Sff9IZGzbh4scV",
+ "fillStyle": "cross-hatch",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1664.354147472308,
+ "y": 2218.1952942599296,
+ "strokeColor": "#f08c00",
+ "backgroundColor": "transparent",
+ "width": 190.57315247671846,
+ "height": 80,
+ "seed": 1830028573,
+ "groupIds": [
+ "zKtzn3nnITiKSM3USgFRB"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 3
+ },
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "BlBeAHPwwDYgBGwfDIrxC"
+ }
+ ],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "text",
+ "version": 690,
+ "versionNonce": 847876893,
+ "isDeleted": false,
+ "id": "BlBeAHPwwDYgBGwfDIrxC",
+ "fillStyle": "cross-hatch",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1721.0210499490263,
+ "y": 2245.1952942599296,
+ "strokeColor": "#f08c00",
+ "backgroundColor": "transparent",
+ "width": 128.90625,
+ "height": 48,
+ "seed": 1374640509,
+ "groupIds": [
+ "zKtzn3nnITiKSM3USgFRB"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false,
+ "fontSize": 20,
+ "fontFamily": 3,
+ "text": "peering-a\n10.3.0.0/16",
+ "textAlign": "right",
+ "verticalAlign": "bottom",
+ "containerId": "BnEhv87Sff9IZGzbh4scV",
+ "originalText": "peering-a\n10.3.0.0/16",
+ "lineHeight": 1.2,
+ "baseline": 44
+ },
+ {
+ "type": "rectangle",
+ "version": 1282,
+ "versionNonce": 1122138419,
+ "isDeleted": false,
+ "id": "Xpy7p5S7xJdi1ky00JhJp",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1678.4592838562585,
+ "y": 2249.640898798332,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1025581533,
+ "groupIds": [
+ "q5UF4B9hLKLVnwaQdFiap",
+ "zKtzn3nnITiKSM3USgFRB"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1274,
+ "versionNonce": 763570045,
+ "isDeleted": false,
+ "id": "ZNTJyryaeBTaWIIDecNu3",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1678.4065639221449,
+ "y": 2256.9304536018803,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 62578237,
+ "groupIds": [
+ "q5UF4B9hLKLVnwaQdFiap",
+ "zKtzn3nnITiKSM3USgFRB"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1302,
+ "versionNonce": 1027791571,
+ "isDeleted": false,
+ "id": "z5MzkFzeOP0a0qlfdbH-O",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1686.3338774964204,
+ "y": 2234.402882397871,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1553862301,
+ "groupIds": [
+ "q5UF4B9hLKLVnwaQdFiap",
+ "zKtzn3nnITiKSM3USgFRB"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1345,
+ "versionNonce": 1359687645,
+ "isDeleted": false,
+ "id": "R1YcSxH0ICURR3S_sqnAu",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1693.6971539835372,
+ "y": 2234.4906963477074,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 645673725,
+ "groupIds": [
+ "q5UF4B9hLKLVnwaQdFiap",
+ "zKtzn3nnITiKSM3USgFRB"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1352,
+ "versionNonce": 2087061619,
+ "isDeleted": false,
+ "id": "cKWsVV8c1p1Mzb3DLczxf",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1700.8805914430677,
+ "y": 2234.4830708957884,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1842793309,
+ "groupIds": [
+ "q5UF4B9hLKLVnwaQdFiap",
+ "zKtzn3nnITiKSM3USgFRB"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1360,
+ "versionNonce": 1798515773,
+ "isDeleted": false,
+ "id": "LYNUjaPN0vWHZFQm6vxVf",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1686.2075359603891,
+ "y": 2264.530946696744,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 855594941,
+ "groupIds": [
+ "q5UF4B9hLKLVnwaQdFiap",
+ "zKtzn3nnITiKSM3USgFRB"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1402,
+ "versionNonce": 1980924435,
+ "isDeleted": false,
+ "id": "ImjsKp3-z2yBdCVmZrmot",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1693.5708124475054,
+ "y": 2264.6342656038373,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1880578077,
+ "groupIds": [
+ "q5UF4B9hLKLVnwaQdFiap",
+ "zKtzn3nnITiKSM3USgFRB"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1409,
+ "versionNonce": 199007389,
+ "isDeleted": false,
+ "id": "i8rBzUjHKzn6DsmZISWjg",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1700.754249907035,
+ "y": 2264.6266401519183,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1594903677,
+ "groupIds": [
+ "q5UF4B9hLKLVnwaQdFiap",
+ "zKtzn3nnITiKSM3USgFRB"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1291,
+ "versionNonce": 591316915,
+ "isDeleted": false,
+ "id": "x4eKxqxRWiZ5npOY22hux",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1708.37096392789,
+ "y": 2242.371974768504,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 2141959389,
+ "groupIds": [
+ "q5UF4B9hLKLVnwaQdFiap",
+ "zKtzn3nnITiKSM3USgFRB"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1334,
+ "versionNonce": 1253638397,
+ "isDeleted": false,
+ "id": "boCv9rtnuypdrQ7zQ2TBZ",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1708.505643035278,
+ "y": 2249.879548787028,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1568346429,
+ "groupIds": [
+ "q5UF4B9hLKLVnwaQdFiap",
+ "zKtzn3nnITiKSM3USgFRB"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1326,
+ "versionNonce": 437344595,
+ "isDeleted": false,
+ "id": "R1ItI1LWcxHZs47jLilEc",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1708.4529231011638,
+ "y": 2257.1691035905765,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 366993821,
+ "groupIds": [
+ "q5UF4B9hLKLVnwaQdFiap",
+ "zKtzn3nnITiKSM3USgFRB"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1238,
+ "versionNonce": 1296685405,
+ "isDeleted": false,
+ "id": "XmBxDYG-os2AP32HuJQ9T",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1678.324604748871,
+ "y": 2242.133324779808,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 504079869,
+ "groupIds": [
+ "q5UF4B9hLKLVnwaQdFiap",
+ "zKtzn3nnITiKSM3USgFRB"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1495,
+ "versionNonce": 1742780147,
+ "isDeleted": false,
+ "id": "YCBEBtQInSuq_qKhm4XVh",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1684.1105828742466,
+ "y": 2238.794220797133,
+ "strokeColor": "#669df6",
+ "backgroundColor": "#aecbfa",
+ "width": 25.68701803825022,
+ "height": 25.322961410864238,
+ "seed": 1224728157,
+ "groupIds": [
+ "UPppP-IYltbZn9lkzBwLQ",
+ "q5UF4B9hLKLVnwaQdFiap",
+ "zKtzn3nnITiKSM3USgFRB"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1374,
+ "versionNonce": 216049085,
+ "isDeleted": false,
+ "id": "mNcQrDN1mWtdHeKP56Rdh",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1687.701169911501,
+ "y": 2242.1867799291244,
+ "strokeColor": "#669df6",
+ "backgroundColor": "white",
+ "width": 18.415416343106916,
+ "height": 18.197540514342283,
+ "seed": 227412669,
+ "groupIds": [
+ "UPppP-IYltbZn9lkzBwLQ",
+ "q5UF4B9hLKLVnwaQdFiap",
+ "zKtzn3nnITiKSM3USgFRB"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "line",
+ "version": 1343,
+ "versionNonce": 724787347,
+ "isDeleted": false,
+ "id": "8beFB6OaJs-mf2d06XFi3",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1691.3559179568065,
+ "y": 2256.9686713096085,
+ "strokeColor": "#669df6",
+ "backgroundColor": "#aecbfa",
+ "width": 11.005694271511862,
+ "height": 10.941584275697766,
+ "seed": 207072029,
+ "groupIds": [
+ "a45MIjJZgj6J-MFEBgc10",
+ "q5UF4B9hLKLVnwaQdFiap",
+ "zKtzn3nnITiKSM3USgFRB"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -0.11767292537006607,
+ -10.939877113695731
+ ],
+ [
+ 10.888021346141796,
+ -10.941584275697766
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 1348,
+ "versionNonce": 1553917469,
+ "isDeleted": false,
+ "id": "U4nL3SWR_AfziE4PzofWm",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1696.8308868729582,
+ "y": 2251.4563063343535,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 5.716009503705499,
+ "height": 10.677776743237455,
+ "seed": 1439580029,
+ "groupIds": [
+ "a45MIjJZgj6J-MFEBgc10",
+ "q5UF4B9hLKLVnwaQdFiap",
+ "zKtzn3nnITiKSM3USgFRB"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 5.459069112195784,
+ 5.178594135612063
+ ],
+ [
+ 5.716009503705499,
+ -5.499182607625391
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 1520,
+ "versionNonce": 1841288755,
+ "isDeleted": false,
+ "id": "oMgmmGmHVoxoOqRFPFCpN",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1693.8557245407555,
+ "y": 2254.148266939022,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 5.716009503705499,
+ "height": 10.677776743237455,
+ "seed": 1882408925,
+ "groupIds": [
+ "a45MIjJZgj6J-MFEBgc10",
+ "q5UF4B9hLKLVnwaQdFiap",
+ "zKtzn3nnITiKSM3USgFRB"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 5.459069112195784,
+ 5.178594135612063
+ ],
+ [
+ 5.716009503705499,
+ -5.499182607625391
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "rectangle",
+ "version": 934,
+ "versionNonce": 796269181,
+ "isDeleted": false,
+ "id": "deB_OONuWN3y9yULiUy-q",
+ "fillStyle": "cross-hatch",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1662.9466648099979,
+ "y": 2391.087980705108,
+ "strokeColor": "#f08c00",
+ "backgroundColor": "transparent",
+ "width": 190.57315247671846,
+ "height": 80,
+ "seed": 2065175933,
+ "groupIds": [
+ "Kfav3HathzNhS3zDUcBJw"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 3
+ },
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "8Bqs2uPQWXHNd4iMQFgXU"
+ }
+ ],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "text",
+ "version": 649,
+ "versionNonce": 1047304147,
+ "isDeleted": false,
+ "id": "8Bqs2uPQWXHNd4iMQFgXU",
+ "fillStyle": "cross-hatch",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1719.6135672867163,
+ "y": 2418.087980705108,
+ "strokeColor": "#f08c00",
+ "backgroundColor": "transparent",
+ "width": 128.90625,
+ "height": 48,
+ "seed": 970087901,
+ "groupIds": [
+ "Kfav3HathzNhS3zDUcBJw"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false,
+ "fontSize": 20,
+ "fontFamily": 3,
+ "text": "peering-b\n10.4.0.0/16",
+ "textAlign": "right",
+ "verticalAlign": "bottom",
+ "containerId": "deB_OONuWN3y9yULiUy-q",
+ "originalText": "peering-b\n10.4.0.0/16",
+ "lineHeight": 1.2,
+ "baseline": 44
+ },
+ {
+ "type": "rectangle",
+ "version": 1236,
+ "versionNonce": 505922269,
+ "isDeleted": false,
+ "id": "8YaKlR-0giGPZ4X7q9CJB",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1677.0518011939484,
+ "y": 2422.661914545073,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1323604541,
+ "groupIds": [
+ "rqF8owiiHLWZG-UrJRbAC",
+ "Kfav3HathzNhS3zDUcBJw"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1228,
+ "versionNonce": 189801843,
+ "isDeleted": false,
+ "id": "KRbTioonq70IWNjiEHeii",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1676.9990812598353,
+ "y": 2429.9514693486217,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 321931933,
+ "groupIds": [
+ "rqF8owiiHLWZG-UrJRbAC",
+ "Kfav3HathzNhS3zDUcBJw"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1256,
+ "versionNonce": 759521085,
+ "isDeleted": false,
+ "id": "thiBcJfSpKiHNhlLk3yxB",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1684.9263948341104,
+ "y": 2407.4238981446124,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1197928189,
+ "groupIds": [
+ "rqF8owiiHLWZG-UrJRbAC",
+ "Kfav3HathzNhS3zDUcBJw"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1299,
+ "versionNonce": 1001455379,
+ "isDeleted": false,
+ "id": "VBXBI1BcbYFrBaokLDhnq",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1692.2896713212276,
+ "y": 2407.5117120944487,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 436864861,
+ "groupIds": [
+ "rqF8owiiHLWZG-UrJRbAC",
+ "Kfav3HathzNhS3zDUcBJw"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1306,
+ "versionNonce": 1395683229,
+ "isDeleted": false,
+ "id": "RWe2aFkjCAAQZ7eiaPHgQ",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1699.4731087807577,
+ "y": 2407.5040866425297,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1835733949,
+ "groupIds": [
+ "rqF8owiiHLWZG-UrJRbAC",
+ "Kfav3HathzNhS3zDUcBJw"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1314,
+ "versionNonce": 168142003,
+ "isDeleted": false,
+ "id": "XFG9cRIkiS-hG0CNkUwoB",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1684.8000532980795,
+ "y": 2437.5519624434855,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1571525661,
+ "groupIds": [
+ "rqF8owiiHLWZG-UrJRbAC",
+ "Kfav3HathzNhS3zDUcBJw"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1356,
+ "versionNonce": 1041921021,
+ "isDeleted": false,
+ "id": "nWT6UtuDgHW3RTwjZ1jed",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1692.1633297851959,
+ "y": 2437.6552813505787,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 113051773,
+ "groupIds": [
+ "rqF8owiiHLWZG-UrJRbAC",
+ "Kfav3HathzNhS3zDUcBJw"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1363,
+ "versionNonce": 502568531,
+ "isDeleted": false,
+ "id": "NzA70P05eZAdwsSxwQnZy",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1699.346767244725,
+ "y": 2437.6476558986597,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 174125277,
+ "groupIds": [
+ "rqF8owiiHLWZG-UrJRbAC",
+ "Kfav3HathzNhS3zDUcBJw"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1245,
+ "versionNonce": 1510272093,
+ "isDeleted": false,
+ "id": "wdi-wiVopMx52Pezr8NL-",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1706.9634812655804,
+ "y": 2415.3929905152454,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1445514557,
+ "groupIds": [
+ "rqF8owiiHLWZG-UrJRbAC",
+ "Kfav3HathzNhS3zDUcBJw"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1288,
+ "versionNonce": 1716802547,
+ "isDeleted": false,
+ "id": "ZDRyL4Rrdti5_H_18s55U",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1707.0981603729679,
+ "y": 2422.9005645337693,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 695606685,
+ "groupIds": [
+ "rqF8owiiHLWZG-UrJRbAC",
+ "Kfav3HathzNhS3zDUcBJw"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1280,
+ "versionNonce": 381769917,
+ "isDeleted": false,
+ "id": "qcvet2RljcEpbUwXXPEov",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1707.0454404388538,
+ "y": 2430.190119337318,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1534747133,
+ "groupIds": [
+ "rqF8owiiHLWZG-UrJRbAC",
+ "Kfav3HathzNhS3zDUcBJw"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1192,
+ "versionNonce": 858480019,
+ "isDeleted": false,
+ "id": "AxJmIljb5w0nL5ZTGVEcY",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1676.917122086561,
+ "y": 2415.1543405265493,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1631001181,
+ "groupIds": [
+ "rqF8owiiHLWZG-UrJRbAC",
+ "Kfav3HathzNhS3zDUcBJw"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1449,
+ "versionNonce": 1844525341,
+ "isDeleted": false,
+ "id": "MfsmaS8ziiYFIsiCEgwEd",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1682.7031002119365,
+ "y": 2411.8152365438746,
+ "strokeColor": "#669df6",
+ "backgroundColor": "#aecbfa",
+ "width": 25.68701803825022,
+ "height": 25.322961410864238,
+ "seed": 327009981,
+ "groupIds": [
+ "AN8eDOALCylkf9mdVguhh",
+ "rqF8owiiHLWZG-UrJRbAC",
+ "Kfav3HathzNhS3zDUcBJw"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1328,
+ "versionNonce": 263205683,
+ "isDeleted": false,
+ "id": "4c8sej-9vzWIktLsaQDl8",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1686.293687249191,
+ "y": 2415.207795675866,
+ "strokeColor": "#669df6",
+ "backgroundColor": "white",
+ "width": 18.415416343106916,
+ "height": 18.197540514342283,
+ "seed": 888137501,
+ "groupIds": [
+ "AN8eDOALCylkf9mdVguhh",
+ "rqF8owiiHLWZG-UrJRbAC",
+ "Kfav3HathzNhS3zDUcBJw"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "line",
+ "version": 1297,
+ "versionNonce": 688262525,
+ "isDeleted": false,
+ "id": "NlJhu1uUb3YTOk2wfZw2t",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1689.9484352944964,
+ "y": 2429.98968705635,
+ "strokeColor": "#669df6",
+ "backgroundColor": "#aecbfa",
+ "width": 11.005694271511862,
+ "height": 10.941584275697766,
+ "seed": 939457405,
+ "groupIds": [
+ "HNqh4eyMg4fTAjEFWYkwB",
+ "rqF8owiiHLWZG-UrJRbAC",
+ "Kfav3HathzNhS3zDUcBJw"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -0.11767292537006607,
+ -10.939877113695731
+ ],
+ [
+ 10.888021346141796,
+ -10.941584275697766
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 1302,
+ "versionNonce": 1548309715,
+ "isDeleted": false,
+ "id": "aeaUAj4j77oCMLFJJ1EkW",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1695.4234042106482,
+ "y": 2424.477322081095,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 5.716009503705499,
+ "height": 10.677776743237455,
+ "seed": 1156350941,
+ "groupIds": [
+ "HNqh4eyMg4fTAjEFWYkwB",
+ "rqF8owiiHLWZG-UrJRbAC",
+ "Kfav3HathzNhS3zDUcBJw"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 5.459069112195784,
+ 5.178594135612063
+ ],
+ [
+ 5.716009503705499,
+ -5.499182607625391
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 1474,
+ "versionNonce": 1732335069,
+ "isDeleted": false,
+ "id": "It_JfiM7dynatHkiZf-l-",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1692.4482418784455,
+ "y": 2427.1692826857634,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 5.716009503705499,
+ "height": 10.677776743237455,
+ "seed": 2143944765,
+ "groupIds": [
+ "HNqh4eyMg4fTAjEFWYkwB",
+ "rqF8owiiHLWZG-UrJRbAC",
+ "Kfav3HathzNhS3zDUcBJw"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 5.459069112195784,
+ 5.178594135612063
+ ],
+ [
+ 5.716009503705499,
+ -5.499182607625391
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "rectangle",
+ "version": 1085,
+ "versionNonce": 680346227,
+ "isDeleted": false,
+ "id": "tKI7lmXT5PBFEm6EfMAD_",
+ "fillStyle": "cross-hatch",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 610.4528204220549,
+ "y": 2195.346921568677,
+ "strokeColor": "#f08c00",
+ "backgroundColor": "transparent",
+ "width": 190.57315247671846,
+ "height": 80,
+ "seed": 1978662899,
+ "groupIds": [
+ "Ah-NAposoI2CAcYtObdBl"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 3
+ },
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "Y52ZaOEm_qpEis4O7O5Y-"
+ }
+ ],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "text",
+ "version": 803,
+ "versionNonce": 1672778301,
+ "isDeleted": false,
+ "id": "Y52ZaOEm_qpEis4O7O5Y-",
+ "fillStyle": "cross-hatch",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 667.1197228987733,
+ "y": 2222.346921568677,
+ "strokeColor": "#f08c00",
+ "backgroundColor": "transparent",
+ "width": 128.90625,
+ "height": 48,
+ "seed": 712083859,
+ "groupIds": [
+ "Ah-NAposoI2CAcYtObdBl"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false,
+ "fontSize": 20,
+ "fontFamily": 3,
+ "text": "vpn-a\n10.1.0.0/16",
+ "textAlign": "right",
+ "verticalAlign": "bottom",
+ "containerId": "tKI7lmXT5PBFEm6EfMAD_",
+ "originalText": "vpn-a\n10.1.0.0/16",
+ "lineHeight": 1.2,
+ "baseline": 44
+ },
+ {
+ "type": "rectangle",
+ "version": 1386,
+ "versionNonce": 1296202771,
+ "isDeleted": false,
+ "id": "8Ys1M4FRFYoVYqTx_FOaF",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 624.5579568060054,
+ "y": 2226.79252610708,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 357621555,
+ "groupIds": [
+ "gh-8zRc6RI71mKBvliDbF",
+ "Ah-NAposoI2CAcYtObdBl"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1378,
+ "versionNonce": 2067874461,
+ "isDeleted": false,
+ "id": "djV1bp-BFLv_Pcbm777v9",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 624.5052368718918,
+ "y": 2234.0820809106285,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1089765587,
+ "groupIds": [
+ "gh-8zRc6RI71mKBvliDbF",
+ "Ah-NAposoI2CAcYtObdBl"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1406,
+ "versionNonce": 1180664243,
+ "isDeleted": false,
+ "id": "EZwhCweM9iSMwe3jicIva",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 632.4325504461674,
+ "y": 2211.5545097066192,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 653454963,
+ "groupIds": [
+ "gh-8zRc6RI71mKBvliDbF",
+ "Ah-NAposoI2CAcYtObdBl"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1449,
+ "versionNonce": 1922623229,
+ "isDeleted": false,
+ "id": "wT0X5Ft4kdeqfC2XiNoyn",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 639.7958269332842,
+ "y": 2211.6423236564556,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1242736659,
+ "groupIds": [
+ "gh-8zRc6RI71mKBvliDbF",
+ "Ah-NAposoI2CAcYtObdBl"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1456,
+ "versionNonce": 1292555091,
+ "isDeleted": false,
+ "id": "LkLPjhfF7pL4woWGI2BYA",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 646.9792643928147,
+ "y": 2211.6346982045366,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 273296819,
+ "groupIds": [
+ "gh-8zRc6RI71mKBvliDbF",
+ "Ah-NAposoI2CAcYtObdBl"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1464,
+ "versionNonce": 2084372317,
+ "isDeleted": false,
+ "id": "ZfHpPgeVc9wdqGRciNvgD",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 632.3062089101361,
+ "y": 2241.6825740054924,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1556086611,
+ "groupIds": [
+ "gh-8zRc6RI71mKBvliDbF",
+ "Ah-NAposoI2CAcYtObdBl"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1506,
+ "versionNonce": 832237811,
+ "isDeleted": false,
+ "id": "n424AOqdzmsQ0cS7uVSDe",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 639.6694853972524,
+ "y": 2241.7858929125855,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1774886131,
+ "groupIds": [
+ "gh-8zRc6RI71mKBvliDbF",
+ "Ah-NAposoI2CAcYtObdBl"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1513,
+ "versionNonce": 2122255293,
+ "isDeleted": false,
+ "id": "tOq-1exOIqi_eHkzWCmS2",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 646.852922856782,
+ "y": 2241.7782674606665,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1659930259,
+ "groupIds": [
+ "gh-8zRc6RI71mKBvliDbF",
+ "Ah-NAposoI2CAcYtObdBl"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1395,
+ "versionNonce": 1972787859,
+ "isDeleted": false,
+ "id": "zcKlNeucI7QCXyqKiXApv",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 654.469636877637,
+ "y": 2219.5236020772522,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1055407155,
+ "groupIds": [
+ "gh-8zRc6RI71mKBvliDbF",
+ "Ah-NAposoI2CAcYtObdBl"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1438,
+ "versionNonce": 427854877,
+ "isDeleted": false,
+ "id": "eeXoDAYII-6VbxNuJGOsy",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 654.6043159850249,
+ "y": 2227.031176095776,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1503149523,
+ "groupIds": [
+ "gh-8zRc6RI71mKBvliDbF",
+ "Ah-NAposoI2CAcYtObdBl"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1430,
+ "versionNonce": 632524851,
+ "isDeleted": false,
+ "id": "Wn2pQXw7IcvWhiYReNsT7",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 654.5515960509108,
+ "y": 2234.3207308993246,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1310133107,
+ "groupIds": [
+ "gh-8zRc6RI71mKBvliDbF",
+ "Ah-NAposoI2CAcYtObdBl"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1342,
+ "versionNonce": 1832059005,
+ "isDeleted": false,
+ "id": "PcuiNNleWYazHcBXfcv4A",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 624.423277698618,
+ "y": 2219.284952088556,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 279651603,
+ "groupIds": [
+ "gh-8zRc6RI71mKBvliDbF",
+ "Ah-NAposoI2CAcYtObdBl"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1599,
+ "versionNonce": 1943605715,
+ "isDeleted": false,
+ "id": "9wEwyCrfHNsAuoGrpaDY6",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 630.2092558239935,
+ "y": 2215.9458481058814,
+ "strokeColor": "#669df6",
+ "backgroundColor": "#aecbfa",
+ "width": 25.68701803825022,
+ "height": 25.322961410864238,
+ "seed": 1221266099,
+ "groupIds": [
+ "dslCd4W--VBvkfq-QteaB",
+ "gh-8zRc6RI71mKBvliDbF",
+ "Ah-NAposoI2CAcYtObdBl"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1478,
+ "versionNonce": 525854941,
+ "isDeleted": false,
+ "id": "BOpT64nVCoJ73p4rYDYv_",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 633.799842861248,
+ "y": 2219.3384072378726,
+ "strokeColor": "#669df6",
+ "backgroundColor": "white",
+ "width": 18.415416343106916,
+ "height": 18.197540514342283,
+ "seed": 1797078099,
+ "groupIds": [
+ "dslCd4W--VBvkfq-QteaB",
+ "gh-8zRc6RI71mKBvliDbF",
+ "Ah-NAposoI2CAcYtObdBl"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "line",
+ "version": 1447,
+ "versionNonce": 287137651,
+ "isDeleted": false,
+ "id": "Ug_7bg7bRG6_hxcE_RkHo",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 637.4545909065534,
+ "y": 2234.1202986183566,
+ "strokeColor": "#669df6",
+ "backgroundColor": "#aecbfa",
+ "width": 11.005694271511862,
+ "height": 10.941584275697766,
+ "seed": 326646259,
+ "groupIds": [
+ "yxQY6HQUdA4DEwLpWCmUq",
+ "gh-8zRc6RI71mKBvliDbF",
+ "Ah-NAposoI2CAcYtObdBl"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -0.11767292537006607,
+ -10.939877113695731
+ ],
+ [
+ 10.888021346141796,
+ -10.941584275697766
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 1452,
+ "versionNonce": 562087229,
+ "isDeleted": false,
+ "id": "nZRsXN7RVKC5tnAL-GOwX",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 642.9295598227052,
+ "y": 2228.6079336431017,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 5.716009503705499,
+ "height": 10.677776743237455,
+ "seed": 518161299,
+ "groupIds": [
+ "yxQY6HQUdA4DEwLpWCmUq",
+ "gh-8zRc6RI71mKBvliDbF",
+ "Ah-NAposoI2CAcYtObdBl"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 5.459069112195784,
+ 5.178594135612063
+ ],
+ [
+ 5.716009503705499,
+ -5.499182607625391
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 1624,
+ "versionNonce": 1204222227,
+ "isDeleted": false,
+ "id": "H9Kx8KlaQIiwoduDRflF-",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 639.9543974905025,
+ "y": 2231.29989424777,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 5.716009503705499,
+ "height": 10.677776743237455,
+ "seed": 93493555,
+ "groupIds": [
+ "yxQY6HQUdA4DEwLpWCmUq",
+ "gh-8zRc6RI71mKBvliDbF",
+ "Ah-NAposoI2CAcYtObdBl"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059825745,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 5.459069112195784,
+ 5.178594135612063
+ ],
+ [
+ 5.716009503705499,
+ -5.499182607625391
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "rectangle",
+ "version": 1536,
+ "versionNonce": 1863856275,
+ "isDeleted": false,
+ "id": "OCP9Q4gw75Civj_P3y4QB",
+ "fillStyle": "cross-hatch",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 589.0149766134494,
+ "y": 2323.0800893278024,
+ "strokeColor": "#e03131",
+ "backgroundColor": "transparent",
+ "width": 286.50895203755545,
+ "height": 171.5890064842986,
+ "seed": 769560691,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": {
+ "type": 3
+ },
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "70u91zjSNaUmq-FsZjQeb"
+ }
+ ],
+ "updated": 1703059839395,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "text",
+ "version": 1659,
+ "versionNonce": 1392900435,
+ "isDeleted": false,
+ "id": "70u91zjSNaUmq-FsZjQeb",
+ "fillStyle": "cross-hatch",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 702.9725776322272,
+ "y": 2328.0800893278024,
+ "strokeColor": "#e03131",
+ "backgroundColor": "transparent",
+ "width": 58.59375,
+ "height": 24,
+ "seed": 2000292371,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059848410,
+ "link": null,
+ "locked": false,
+ "fontSize": 20,
+ "fontFamily": 3,
+ "text": "vpn-b",
+ "textAlign": "center",
+ "verticalAlign": "top",
+ "containerId": "OCP9Q4gw75Civj_P3y4QB",
+ "originalText": "vpn-b",
+ "lineHeight": 1.2,
+ "baseline": 20
+ },
+ {
+ "type": "line",
+ "version": 1597,
+ "versionNonce": 1264412627,
+ "isDeleted": false,
+ "id": "2eH4g-jMpfFJyDf55YYpD",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 858.8521671914804,
+ "y": 2403.3066602598788,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 15.896024939498197,
+ "height": 12.807449434576053,
+ "seed": 641028019,
+ "groupIds": [
+ "9MNOX0vHevE_J2DWlHA2m"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059839395,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 7.940775652730609,
+ 7.836427741431539
+ ],
+ [
+ 3.129717769098604,
+ 8.044191549716741
+ ],
+ [
+ 3.3503310394194927,
+ 12.793832431341501
+ ],
+ [
+ -3.230375314901173,
+ 12.807449434576053
+ ],
+ [
+ -3.110447002568436,
+ 7.99620309216759
+ ],
+ [
+ -7.9552492867675895,
+ 8.09930374901842
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 1680,
+ "versionNonce": 1638331763,
+ "isDeleted": false,
+ "id": "xhJ3VlVQQZ-y3cRNAnt9g",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 3.141592653589793,
+ "x": 858.5979218754563,
+ "y": 2422.2062277165273,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 15.896024939498195,
+ "height": 12.807449434576053,
+ "seed": 217506131,
+ "groupIds": [
+ "9MNOX0vHevE_J2DWlHA2m"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059839395,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -7.9407756527306095,
+ 7.836427741431539
+ ],
+ [
+ -3.129717769098604,
+ 8.044191549716741
+ ],
+ [
+ -3.3503310394194914,
+ 12.793832431341501
+ ],
+ [
+ 3.230375314901172,
+ 12.807449434576053
+ ],
+ [
+ 3.1104470025684363,
+ 7.99620309216759
+ ],
+ [
+ 7.955249286767588,
+ 8.09930374901842
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 1766,
+ "versionNonce": 1051578131,
+ "isDeleted": false,
+ "id": "sGiNjbQFppIWDzBrZ4JLk",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 4.71238898038469,
+ "x": 868.2242662253219,
+ "y": 2412.9318837723363,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 15.896024939498197,
+ "height": 12.807449434576053,
+ "seed": 1960132339,
+ "groupIds": [
+ "9MNOX0vHevE_J2DWlHA2m"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059839395,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -7.9407756527306095,
+ 7.836427741431539
+ ],
+ [
+ -3.129717769098604,
+ 8.044191549716741
+ ],
+ [
+ -3.3503310394194914,
+ 12.793832431341501
+ ],
+ [
+ 3.230375314901172,
+ 12.807449434576053
+ ],
+ [
+ 3.1104470025684363,
+ 7.99620309216759
+ ],
+ [
+ 7.955249286767588,
+ 8.09930374901842
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 1865,
+ "versionNonce": 887649459,
+ "isDeleted": false,
+ "id": "X1tvyccO6F8FWLkzuFiII",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 849.2146609212085,
+ "y": 2413.019580187974,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 15.896024939498197,
+ "height": 12.807449434576053,
+ "seed": 945219731,
+ "groupIds": [
+ "9MNOX0vHevE_J2DWlHA2m"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059839395,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -7.9407756527306095,
+ 7.836427741431539
+ ],
+ [
+ -3.129717769098604,
+ 8.044191549716741
+ ],
+ [
+ -3.3503310394194914,
+ 12.793832431341501
+ ],
+ [
+ 3.230375314901172,
+ 12.807449434576053
+ ],
+ [
+ 3.1104470025684363,
+ 7.99620309216759
+ ],
+ [
+ 7.955249286767588,
+ 8.09930374901842
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 1288,
+ "versionNonce": 66938451,
+ "isDeleted": false,
+ "id": "NeSUmiOzS8vf72BwJ1-cZ",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 865.567672076494,
+ "y": 2448.698614238245,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 13.709532316968268,
+ "height": 13.891881189304865,
+ "seed": 489840179,
+ "groupIds": [
+ "lo0Tiy2FccxVELkQh5UKU"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059839395,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0.05157250871858333,
+ 5.337183467876706
+ ],
+ [
+ -12.103991954322073,
+ 5.292187876055851
+ ],
+ [
+ -11.93736250588609,
+ 6.9588971209408905
+ ],
+ [
+ 0.08328391343613158,
+ 6.831468467275338
+ ],
+ [
+ 0.08101813593913357,
+ 13.218311281604404
+ ],
+ [
+ 1.6055403626461942,
+ 13.261230700739738
+ ],
+ [
+ 1.4974324392689604,
+ -0.630650488565126
+ ],
+ [
+ 0.051918537499509206,
+ -0.4099220472977767
+ ]
+ ]
+ },
+ {
+ "type": "rectangle",
+ "version": 1149,
+ "versionNonce": 851649523,
+ "isDeleted": false,
+ "id": "_Qb7mcfWICxgukqPcBMwl",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 863.8586990427524,
+ "y": 2443.9383877056157,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 5.207202259436818,
+ "height": 5.207202259436818,
+ "seed": 1850613715,
+ "groupIds": [
+ "lo0Tiy2FccxVELkQh5UKU"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059839395,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1193,
+ "versionNonce": 692071827,
+ "isDeleted": false,
+ "id": "49PtbwzqvhU5Y_Mm3T1ap",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 863.8138717252012,
+ "y": 2460.5663030602977,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 5.207202259436818,
+ "height": 5.207202259436818,
+ "seed": 1438690675,
+ "groupIds": [
+ "lo0Tiy2FccxVELkQh5UKU"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059839395,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1215,
+ "versionNonce": 178979635,
+ "isDeleted": false,
+ "id": "jNGaQLPuxvkc-3HJ3nrDn",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 849.3742684517464,
+ "y": 2452.2032021858836,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 5.207202259436818,
+ "height": 5.207202259436818,
+ "seed": 1993377555,
+ "groupIds": [
+ "lo0Tiy2FccxVELkQh5UKU"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059839395,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "ellipse",
+ "version": 1331,
+ "versionNonce": 1332356307,
+ "isDeleted": false,
+ "id": "A-JVJ4IDbOT3T2kJ3ZveR",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 857.9163171621893,
+ "y": 2452.511454578184,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 4.799876613026025,
+ "height": 4.799876613026024,
+ "seed": 1207184563,
+ "groupIds": [
+ "Wa-ia71skhXThVr1Ufxzu",
+ "lo0Tiy2FccxVELkQh5UKU"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059839395,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "ellipse",
+ "version": 1276,
+ "versionNonce": 521409139,
+ "isDeleted": false,
+ "id": "Sj2i3J_3JsUEzY1RHgClt",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 858.780627140164,
+ "y": 2453.3757645561586,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "white",
+ "width": 3.071256657077243,
+ "height": 3.0712566570772424,
+ "seed": 751967827,
+ "groupIds": [
+ "Wa-ia71skhXThVr1Ufxzu",
+ "lo0Tiy2FccxVELkQh5UKU"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059839395,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1147,
+ "versionNonce": 1785678867,
+ "isDeleted": false,
+ "id": "x46LdZDq1sK-cwS7K2tbb",
+ "fillStyle": "cross-hatch",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 608.1242645469102,
+ "y": 2384.5788258613125,
+ "strokeColor": "#f08c00",
+ "backgroundColor": "transparent",
+ "width": 190.57315247671846,
+ "height": 80,
+ "seed": 1346427891,
+ "groupIds": [
+ "Ms51rkF5yFOD8ASz3QYec"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 3
+ },
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "SrDmM1v7D1GW60VDU_ooR"
+ }
+ ],
+ "updated": 1703059839395,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "text",
+ "version": 874,
+ "versionNonce": 475444701,
+ "isDeleted": false,
+ "id": "SrDmM1v7D1GW60VDU_ooR",
+ "fillStyle": "cross-hatch",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 664.7911670236288,
+ "y": 2411.5788258613125,
+ "strokeColor": "#f08c00",
+ "backgroundColor": "transparent",
+ "width": 128.90625,
+ "height": 48,
+ "seed": 1044833683,
+ "groupIds": [
+ "Ms51rkF5yFOD8ASz3QYec"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059857588,
+ "link": null,
+ "locked": false,
+ "fontSize": 20,
+ "fontFamily": 3,
+ "text": "vpn-b\n10.2.0.0/16",
+ "textAlign": "right",
+ "verticalAlign": "bottom",
+ "containerId": "x46LdZDq1sK-cwS7K2tbb",
+ "originalText": "vpn-b\n10.2.0.0/16",
+ "lineHeight": 1.2,
+ "baseline": 44
+ },
+ {
+ "type": "rectangle",
+ "version": 1448,
+ "versionNonce": 21209939,
+ "isDeleted": false,
+ "id": "u4Jfc4VMCf2ht14NZe4ci",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 622.2294009308608,
+ "y": 2416.0244303997156,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1041939251,
+ "groupIds": [
+ "cuAhBAkSU23K0v96qczrk",
+ "Ms51rkF5yFOD8ASz3QYec"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059839395,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1440,
+ "versionNonce": 104448243,
+ "isDeleted": false,
+ "id": "Br6eZTo7t1KJXmgGwz5C_",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 622.1766809967472,
+ "y": 2423.313985203264,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1814224083,
+ "groupIds": [
+ "cuAhBAkSU23K0v96qczrk",
+ "Ms51rkF5yFOD8ASz3QYec"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059839395,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1468,
+ "versionNonce": 1843079827,
+ "isDeleted": false,
+ "id": "DM2ufRyKBC-eUMfDqxFca",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 630.1039945710228,
+ "y": 2400.786413999255,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 334875251,
+ "groupIds": [
+ "cuAhBAkSU23K0v96qczrk",
+ "Ms51rkF5yFOD8ASz3QYec"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059839395,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1511,
+ "versionNonce": 1558077491,
+ "isDeleted": false,
+ "id": "kYPceQpr_oiVhEuPtKeb3",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 637.4672710581395,
+ "y": 2400.874227949091,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1247413267,
+ "groupIds": [
+ "cuAhBAkSU23K0v96qczrk",
+ "Ms51rkF5yFOD8ASz3QYec"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059839395,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1518,
+ "versionNonce": 489284051,
+ "isDeleted": false,
+ "id": "m1-AJ8KG7_0MKJ7CdZaWU",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 644.6507085176701,
+ "y": 2400.866602497172,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1195772339,
+ "groupIds": [
+ "cuAhBAkSU23K0v96qczrk",
+ "Ms51rkF5yFOD8ASz3QYec"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059839395,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1526,
+ "versionNonce": 2010394483,
+ "isDeleted": false,
+ "id": "Ld9sEsTr2mt6VK9f51FyN",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 629.9776530349915,
+ "y": 2430.914478298128,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 2145409875,
+ "groupIds": [
+ "cuAhBAkSU23K0v96qczrk",
+ "Ms51rkF5yFOD8ASz3QYec"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059839395,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1568,
+ "versionNonce": 1327745299,
+ "isDeleted": false,
+ "id": "hdENQDAYlZcx-Y2tm3FVq",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 637.3409295221078,
+ "y": 2431.017797205221,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 8354035,
+ "groupIds": [
+ "cuAhBAkSU23K0v96qczrk",
+ "Ms51rkF5yFOD8ASz3QYec"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059839395,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1575,
+ "versionNonce": 2022649523,
+ "isDeleted": false,
+ "id": "v_EfdESSk9-frBDB5RoAr",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 644.5243669816374,
+ "y": 2431.010171753302,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 111796883,
+ "groupIds": [
+ "cuAhBAkSU23K0v96qczrk",
+ "Ms51rkF5yFOD8ASz3QYec"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059839395,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1457,
+ "versionNonce": 1455218771,
+ "isDeleted": false,
+ "id": "cXvb7Aj6NXkDEJ6SkxJad",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 652.1410810024923,
+ "y": 2408.755506369888,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1528174643,
+ "groupIds": [
+ "cuAhBAkSU23K0v96qczrk",
+ "Ms51rkF5yFOD8ASz3QYec"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059839395,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1500,
+ "versionNonce": 864247283,
+ "isDeleted": false,
+ "id": "Qu-7sBMmx0D1vp0FUyu0Z",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 652.2757601098803,
+ "y": 2416.2630803884117,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1806342611,
+ "groupIds": [
+ "cuAhBAkSU23K0v96qczrk",
+ "Ms51rkF5yFOD8ASz3QYec"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059839395,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1492,
+ "versionNonce": 1508452243,
+ "isDeleted": false,
+ "id": "jutpG8LrSjEQPiq0rui1N",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 652.2230401757662,
+ "y": 2423.5526351919602,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 629008243,
+ "groupIds": [
+ "cuAhBAkSU23K0v96qczrk",
+ "Ms51rkF5yFOD8ASz3QYec"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059839395,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1404,
+ "versionNonce": 1881455923,
+ "isDeleted": false,
+ "id": "7jbP2X8VJO0t3-BKS8lJU",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 622.0947218234734,
+ "y": 2408.5168563811917,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 248938771,
+ "groupIds": [
+ "cuAhBAkSU23K0v96qczrk",
+ "Ms51rkF5yFOD8ASz3QYec"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059839395,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1661,
+ "versionNonce": 295476947,
+ "isDeleted": false,
+ "id": "0plkdLt4TdYzhp6B-XXBz",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 627.8806999488489,
+ "y": 2405.177752398517,
+ "strokeColor": "#669df6",
+ "backgroundColor": "#aecbfa",
+ "width": 25.68701803825022,
+ "height": 25.322961410864238,
+ "seed": 556459699,
+ "groupIds": [
+ "Nh39oWl6XeR9XxceuHasT",
+ "cuAhBAkSU23K0v96qczrk",
+ "Ms51rkF5yFOD8ASz3QYec"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059839395,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1540,
+ "versionNonce": 686247027,
+ "isDeleted": false,
+ "id": "yOpWHbaA-Ua3Cl2vrjXf_",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 631.4712869861033,
+ "y": 2408.570311530508,
+ "strokeColor": "#669df6",
+ "backgroundColor": "white",
+ "width": 18.415416343106916,
+ "height": 18.197540514342283,
+ "seed": 1663146067,
+ "groupIds": [
+ "Nh39oWl6XeR9XxceuHasT",
+ "cuAhBAkSU23K0v96qczrk",
+ "Ms51rkF5yFOD8ASz3QYec"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059839395,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "line",
+ "version": 1509,
+ "versionNonce": 164316691,
+ "isDeleted": false,
+ "id": "sz68YdrqzYLxm9PXR01O_",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 635.1260350314088,
+ "y": 2423.352202910992,
+ "strokeColor": "#669df6",
+ "backgroundColor": "#aecbfa",
+ "width": 11.005694271511862,
+ "height": 10.941584275697766,
+ "seed": 1116804595,
+ "groupIds": [
+ "p6Di7xYrPJhVu1-nq1QRP",
+ "cuAhBAkSU23K0v96qczrk",
+ "Ms51rkF5yFOD8ASz3QYec"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059839395,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -0.11767292537006607,
+ -10.939877113695731
+ ],
+ [
+ 10.888021346141796,
+ -10.941584275697766
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 1514,
+ "versionNonce": 1262422963,
+ "isDeleted": false,
+ "id": "WkBLanBBNbKPGoI2AypQ0",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 640.6010039475606,
+ "y": 2417.8398379357373,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 5.716009503705499,
+ "height": 10.677776743237455,
+ "seed": 780132243,
+ "groupIds": [
+ "p6Di7xYrPJhVu1-nq1QRP",
+ "cuAhBAkSU23K0v96qczrk",
+ "Ms51rkF5yFOD8ASz3QYec"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059839395,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 5.459069112195784,
+ 5.178594135612063
+ ],
+ [
+ 5.716009503705499,
+ -5.499182607625391
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 1686,
+ "versionNonce": 1634278739,
+ "isDeleted": false,
+ "id": "DkvZgauujAiVmZkjYG2U5",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 637.6258416153579,
+ "y": 2420.531798540406,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 5.716009503705499,
+ "height": 10.677776743237455,
+ "seed": 1898214707,
+ "groupIds": [
+ "p6Di7xYrPJhVu1-nq1QRP",
+ "cuAhBAkSU23K0v96qczrk",
+ "Ms51rkF5yFOD8ASz3QYec"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059839395,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 5.459069112195784,
+ 5.178594135612063
+ ],
+ [
+ 5.716009503705499,
+ -5.499182607625391
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "rectangle",
+ "version": 1058,
+ "versionNonce": 447806333,
+ "isDeleted": false,
+ "id": "uWtU_FeLRedA51Gtav-m6",
+ "fillStyle": "cross-hatch",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1166.0680281207106,
+ "y": 1899.5205212385947,
+ "strokeColor": "#f08c00",
+ "backgroundColor": "transparent",
+ "width": 190.57315247671846,
+ "height": 80,
+ "seed": 365105789,
+ "groupIds": [
+ "ji5b1nS9NfGYW-gMtOe_o"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 3
+ },
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "bRk7mVnU1nhCd5z9rwVCO"
+ }
+ ],
+ "updated": 1703059875211,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "text",
+ "version": 778,
+ "versionNonce": 530354877,
+ "isDeleted": false,
+ "id": "bRk7mVnU1nhCd5z9rwVCO",
+ "fillStyle": "cross-hatch",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1199.297430597429,
+ "y": 1926.5205212385947,
+ "strokeColor": "#f08c00",
+ "backgroundColor": "transparent",
+ "width": 152.34375,
+ "height": 48,
+ "seed": 538295005,
+ "groupIds": [
+ "ji5b1nS9NfGYW-gMtOe_o"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059881545,
+ "link": null,
+ "locked": false,
+ "fontSize": 20,
+ "fontFamily": 3,
+ "text": "ext\n10.255.0.0/16",
+ "textAlign": "right",
+ "verticalAlign": "bottom",
+ "containerId": "uWtU_FeLRedA51Gtav-m6",
+ "originalText": "ext\n10.255.0.0/16",
+ "lineHeight": 1.2,
+ "baseline": 44
+ },
+ {
+ "type": "rectangle",
+ "version": 1359,
+ "versionNonce": 1576796221,
+ "isDeleted": false,
+ "id": "1LyC5uLjAwuGz_4BmJBRa",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1180.1731645046611,
+ "y": 1930.966125776997,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 783570749,
+ "groupIds": [
+ "dpH6lzlECxP1gDBq5jLOz",
+ "ji5b1nS9NfGYW-gMtOe_o"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059875211,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1351,
+ "versionNonce": 1449848989,
+ "isDeleted": false,
+ "id": "YRgHgSzp8hnD1v27C0vN5",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1180.120444570547,
+ "y": 1938.2556805805455,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1006659485,
+ "groupIds": [
+ "dpH6lzlECxP1gDBq5jLOz",
+ "ji5b1nS9NfGYW-gMtOe_o"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059875211,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1379,
+ "versionNonce": 1482478845,
+ "isDeleted": false,
+ "id": "INCx1zS8fJSD1YFkxo29I",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1188.047758144823,
+ "y": 1915.7281093765362,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 2049666045,
+ "groupIds": [
+ "dpH6lzlECxP1gDBq5jLOz",
+ "ji5b1nS9NfGYW-gMtOe_o"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059875211,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1422,
+ "versionNonce": 525544797,
+ "isDeleted": false,
+ "id": "OYZGFZ9gYI2f6o3qeCdO4",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1195.4110346319394,
+ "y": 1915.8159233263725,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1496769629,
+ "groupIds": [
+ "dpH6lzlECxP1gDBq5jLOz",
+ "ji5b1nS9NfGYW-gMtOe_o"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059875211,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1429,
+ "versionNonce": 2057271741,
+ "isDeleted": false,
+ "id": "nydylK60ZtAOVRmY3Mjkf",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1202.5944720914704,
+ "y": 1915.8082978744535,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1291079869,
+ "groupIds": [
+ "dpH6lzlECxP1gDBq5jLOz",
+ "ji5b1nS9NfGYW-gMtOe_o"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059875211,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1437,
+ "versionNonce": 1399011869,
+ "isDeleted": false,
+ "id": "Hgch8rBsMsiGVjn6v3OHP",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1187.9214166087913,
+ "y": 1945.8561736754093,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1392849181,
+ "groupIds": [
+ "dpH6lzlECxP1gDBq5jLOz",
+ "ji5b1nS9NfGYW-gMtOe_o"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059875211,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1479,
+ "versionNonce": 1922035325,
+ "isDeleted": false,
+ "id": "-kxMV7UyOqOZwbOiIuZZe",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1195.2846930959076,
+ "y": 1945.9594925825024,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 953877885,
+ "groupIds": [
+ "dpH6lzlECxP1gDBq5jLOz",
+ "ji5b1nS9NfGYW-gMtOe_o"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059875211,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1486,
+ "versionNonce": 115807965,
+ "isDeleted": false,
+ "id": "MuVLkLsR_GjGBhCSkNxNP",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1202.4681305554377,
+ "y": 1945.9518671305834,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 565661149,
+ "groupIds": [
+ "dpH6lzlECxP1gDBq5jLOz",
+ "ji5b1nS9NfGYW-gMtOe_o"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059875211,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1368,
+ "versionNonce": 1794782013,
+ "isDeleted": false,
+ "id": "G_ZnbOzkmxIgYASxCrvlu",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1210.0848445762922,
+ "y": 1923.6972017471692,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1286310461,
+ "groupIds": [
+ "dpH6lzlECxP1gDBq5jLOz",
+ "ji5b1nS9NfGYW-gMtOe_o"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059875211,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1411,
+ "versionNonce": 724222877,
+ "isDeleted": false,
+ "id": "IvqYLmdUlIdx1xpSax3P5",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1210.2195236836806,
+ "y": 1931.204775765693,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 446249629,
+ "groupIds": [
+ "dpH6lzlECxP1gDBq5jLOz",
+ "ji5b1nS9NfGYW-gMtOe_o"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059875211,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1403,
+ "versionNonce": 1269450749,
+ "isDeleted": false,
+ "id": "5EQTrkF-BCpvd8DCo1XIR",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1210.1668037495665,
+ "y": 1938.4943305692416,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 1412554493,
+ "groupIds": [
+ "dpH6lzlECxP1gDBq5jLOz",
+ "ji5b1nS9NfGYW-gMtOe_o"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059875211,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1315,
+ "versionNonce": 1316634717,
+ "isDeleted": false,
+ "id": "vovK35CZ4OV9cs_6CCMtH",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1180.0384853972737,
+ "y": 1923.458551758473,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 6.390428952916756,
+ "height": 3.559017050423508,
+ "seed": 804714333,
+ "groupIds": [
+ "dpH6lzlECxP1gDBq5jLOz",
+ "ji5b1nS9NfGYW-gMtOe_o"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059875211,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1572,
+ "versionNonce": 2037132477,
+ "isDeleted": false,
+ "id": "VSDMkda27iGkBjWqU8t89",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1185.8244635226492,
+ "y": 1920.1194477757983,
+ "strokeColor": "#669df6",
+ "backgroundColor": "#aecbfa",
+ "width": 25.68701803825022,
+ "height": 25.322961410864238,
+ "seed": 406455229,
+ "groupIds": [
+ "U9e5QiMKwSvBkmKVjYK8H",
+ "dpH6lzlECxP1gDBq5jLOz",
+ "ji5b1nS9NfGYW-gMtOe_o"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059875211,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "rectangle",
+ "version": 1451,
+ "versionNonce": 1545702685,
+ "isDeleted": false,
+ "id": "ZcgKHNHtSCJPs9sggCBCA",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1189.4150505599036,
+ "y": 1923.5120069077896,
+ "strokeColor": "#669df6",
+ "backgroundColor": "white",
+ "width": 18.415416343106916,
+ "height": 18.197540514342283,
+ "seed": 823952413,
+ "groupIds": [
+ "U9e5QiMKwSvBkmKVjYK8H",
+ "dpH6lzlECxP1gDBq5jLOz",
+ "ji5b1nS9NfGYW-gMtOe_o"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059875211,
+ "link": null,
+ "locked": false
+ },
+ {
+ "type": "line",
+ "version": 1420,
+ "versionNonce": 369877373,
+ "isDeleted": false,
+ "id": "87V2aMASqpShAwPIXGRBz",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1193.0697986052091,
+ "y": 1938.2938982882736,
+ "strokeColor": "#669df6",
+ "backgroundColor": "#aecbfa",
+ "width": 11.005694271511862,
+ "height": 10.941584275697766,
+ "seed": 512751741,
+ "groupIds": [
+ "CvneiRXyEi3pl1f9QoKrJ",
+ "dpH6lzlECxP1gDBq5jLOz",
+ "ji5b1nS9NfGYW-gMtOe_o"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059875211,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -0.11767292537006607,
+ -10.939877113695731
+ ],
+ [
+ 10.888021346141796,
+ -10.941584275697766
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 1425,
+ "versionNonce": 1550625245,
+ "isDeleted": false,
+ "id": "1DF0gduuuG2WyREp88c6o",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1198.5447675213609,
+ "y": 1932.7815333130186,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#4285f4",
+ "width": 5.716009503705499,
+ "height": 10.677776743237455,
+ "seed": 173400285,
+ "groupIds": [
+ "CvneiRXyEi3pl1f9QoKrJ",
+ "dpH6lzlECxP1gDBq5jLOz",
+ "ji5b1nS9NfGYW-gMtOe_o"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059875211,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 5.459069112195784,
+ 5.178594135612063
+ ],
+ [
+ 5.716009503705499,
+ -5.499182607625391
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 1597,
+ "versionNonce": 1079338557,
+ "isDeleted": false,
+ "id": "UUoDBdjiC8ngT0MPFfyqx",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 1.5707963267948957,
+ "x": 1195.5696051891582,
+ "y": 1935.4734939176872,
+ "strokeColor": "#1864ab",
+ "backgroundColor": "#669df6",
+ "width": 5.716009503705499,
+ "height": 10.677776743237455,
+ "seed": 1778367805,
+ "groupIds": [
+ "CvneiRXyEi3pl1f9QoKrJ",
+ "dpH6lzlECxP1gDBq5jLOz",
+ "ji5b1nS9NfGYW-gMtOe_o"
+ ],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1703059875211,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 5.459069112195784,
+ 5.178594135612063
+ ],
+ [
+ 5.716009503705499,
+ -5.499182607625391
+ ],
+ [
+ 0,
+ 0
+ ]
+ ]
+ }
+ ],
+ "appState": {
+ "gridSize": null,
+ "viewBackgroundColor": "#ffffff"
+ },
+ "files": {}
+}
\ No newline at end of file
diff --git a/blueprints/networking/vpc-connectivity-lab/diagram.png b/blueprints/networking/vpc-connectivity-lab/diagram.png
new file mode 100644
index 000000000..6522af033
Binary files /dev/null and b/blueprints/networking/vpc-connectivity-lab/diagram.png differ
diff --git a/blueprints/networking/vpc-connectivity-lab/diagram.svg b/blueprints/networking/vpc-connectivity-lab/diagram.svg
new file mode 100644
index 000000000..f3836c7a8
--- /dev/null
+++ b/blueprints/networking/vpc-connectivity-lab/diagram.svg
@@ -0,0 +1,21 @@
+
\ No newline at end of file
diff --git a/blueprints/networking/vpc-connectivity-lab/dns-hub.tf b/blueprints/networking/vpc-connectivity-lab/dns-hub.tf
new file mode 100644
index 000000000..ab1553981
--- /dev/null
+++ b/blueprints/networking/vpc-connectivity-lab/dns-hub.tf
@@ -0,0 +1,42 @@
+/**
+ * Copyright 2023 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+# tfdoc:file:description DNS setup.
+
+module "hub-dns" {
+ source = "../../../modules/dns"
+ project_id = module.project.project_id
+ name = "${var.prefix}-example"
+ zone_config = {
+ domain = "example."
+ private = {
+ client_networks = [
+ module.hub-vpc.self_link,
+ module.ext-vpc.self_link,
+ module.spoke-peering-a-vpc.self_link,
+ module.spoke-peering-b-vpc.self_link,
+ module.spoke-vpn-a-vpc.self_link,
+ module.spoke-vpn-b-vpc.self_link,
+ ]
+ }
+ }
+ recordsets = merge({
+ "A localhost" = { records = ["127.0.0.1"] }
+ },
+ var.test_vms
+ ? { for instance, _ in local.test-vms : "A ${instance}" => { records = [module.test-vms[instance].internal_ip] } }
+ : {})
+}
diff --git a/blueprints/networking/vpc-connectivity-lab/main.tf b/blueprints/networking/vpc-connectivity-lab/main.tf
new file mode 100644
index 000000000..92b04da4a
--- /dev/null
+++ b/blueprints/networking/vpc-connectivity-lab/main.tf
@@ -0,0 +1,32 @@
+/**
+ * Copyright 2023 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+# tfdoc:file:description Project setup.
+
+module "project" {
+ source = "../../../modules/project"
+ name = var.project_id
+ parent = try(var.project_create_config.parent_id, null)
+ billing_account = try(var.project_create_config.billing_account_id, null)
+ project_create = try(var.project_create_config.billing_account_id, null) != null
+ prefix = var.prefix
+ services = [
+ "compute.googleapis.com",
+ "dns.googleapis.com",
+ "networkconnectivity.googleapis.com",
+ "stackdriver.googleapis.com",
+ ]
+}
diff --git a/blueprints/networking/vpc-connectivity-lab/nva.tf b/blueprints/networking/vpc-connectivity-lab/nva.tf
new file mode 100644
index 000000000..812315804
--- /dev/null
+++ b/blueprints/networking/vpc-connectivity-lab/nva.tf
@@ -0,0 +1,117 @@
+/**
+ * Copyright 2023 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+locals {
+ network_interfaces = [
+ {
+ addresses = null
+ name = "ext"
+ nat = false
+ enable_masquerading = true
+ network = module.ext-vpc.self_link
+ routes = [var.ip_ranges.ext, "0.0.0.0/0"]
+ subnetwork = module.ext-vpc.subnet_self_links["${var.region}/ext"]
+ },
+ {
+ addresses = null
+ name = "hub"
+ nat = false
+ network = module.hub-vpc.self_link
+ routes = [var.ip_ranges.int]
+ subnetwork = module.hub-vpc.subnet_self_links["${var.region}/hub-nva"]
+ }
+ ]
+}
+
+module "cos-nva" {
+ source = "../../../modules/cloud-config-container/simple-nva"
+ enable_health_checks = true
+ network_interfaces = local.network_interfaces
+}
+
+module "nva-a" {
+ source = "../../../modules/compute-vm"
+ project_id = module.project.project_id
+ zone = "${var.region}-a"
+ name = "cos-nva-a"
+ network_interfaces = local.network_interfaces
+ can_ip_forward = true
+ instance_type = "e2-micro"
+ options = {
+ spot = true
+ termination_action = "STOP"
+ }
+ metadata = {
+ user-data = module.cos-nva.cloud_config
+ google-logging-enabled = true
+ }
+ boot_disk = {
+ initialize_params = {
+ image = "projects/cos-cloud/global/images/family/cos-stable"
+ type = "pd-ssd"
+ size = 10
+ }
+ }
+ tags = ["nva", "ssh"]
+}
+
+module "nva-b" {
+ source = "../../../modules/compute-vm"
+ project_id = module.project.project_id
+ zone = "${var.region}-b"
+ name = "cos-nva-b"
+ network_interfaces = local.network_interfaces
+ can_ip_forward = true
+ instance_type = "e2-micro"
+ options = {
+ spot = true
+ termination_action = "STOP"
+ }
+ metadata = {
+ user-data = module.cos-nva.cloud_config
+ google-logging-enabled = true
+ }
+ boot_disk = {
+ initialize_params = {
+ image = "projects/cos-cloud/global/images/family/cos-stable"
+ type = "pd-ssd"
+ size = 10
+ }
+ }
+ tags = ["nva", "ssh"]
+}
+
+resource "google_compute_instance_group" "nva-a" {
+ name = "nva-ig-a"
+ description = "NVA instance group for the primary region, zone a."
+ zone = "${var.region}-a"
+ project = module.project.project_id
+ network = module.ext-vpc.self_link
+ instances = toset([
+ module.nva-a.self_link,
+ ])
+}
+
+resource "google_compute_instance_group" "nva-b" {
+ name = "nva-ig-b"
+ description = "NVA instance group for the primary region, zone b."
+ zone = "${var.region}-b"
+ project = module.project.project_id
+ network = module.ext-vpc.self_link
+ instances = toset([
+ module.nva-b.self_link,
+ ])
+}
diff --git a/blueprints/networking/vpc-connectivity-lab/outputs.tf b/blueprints/networking/vpc-connectivity-lab/outputs.tf
new file mode 100644
index 000000000..0b4adf5ca
--- /dev/null
+++ b/blueprints/networking/vpc-connectivity-lab/outputs.tf
@@ -0,0 +1,20 @@
+/**
+ * Copyright 2023 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+output "ping_commands" {
+ description = "Ping commands that can be run to check VPC reachability."
+ value = var.test_vms ? join("\n", [for instance, _ in local.test-vms : "ping -c 1 ${instance}.example"]) : ""
+}
diff --git a/blueprints/networking/vpc-connectivity-lab/test-resources.tf b/blueprints/networking/vpc-connectivity-lab/test-resources.tf
new file mode 100644
index 000000000..b04a55ffb
--- /dev/null
+++ b/blueprints/networking/vpc-connectivity-lab/test-resources.tf
@@ -0,0 +1,82 @@
+/**
+ * Copyright 2023 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+locals {
+ test-vms = {
+ ext = {
+ network = module.ext-vpc.self_link
+ subnetwork = module.ext-vpc.subnet_self_links["${var.region}/ext"]
+ }
+ hub-a = {
+ network = module.hub-vpc.self_link
+ subnetwork = module.hub-vpc.subnet_self_links["${var.region}/hub-a"]
+ }
+ hub-b = {
+ network = module.hub-vpc.self_link
+ subnetwork = module.hub-vpc.subnet_self_links["${var.region}/hub-b"]
+ }
+ spoke-vpn-a = {
+ network = module.spoke-vpn-a-vpc.self_link
+ subnetwork = module.spoke-vpn-a-vpc.subnet_self_links["${var.region}/vpn-a"]
+ },
+ spoke-peering-a = {
+ network = module.spoke-peering-a-vpc.self_link
+ subnetwork = module.spoke-peering-a-vpc.subnet_self_links["${var.region}/peering-a"]
+ },
+ spoke-vpn-b = {
+ network = module.spoke-vpn-b-vpc.self_link
+ subnetwork = module.spoke-vpn-b-vpc.subnet_self_links["${var.region}/vpn-b"]
+ },
+ spoke-peering-b = {
+ network = module.spoke-peering-b-vpc.self_link
+ subnetwork = module.spoke-peering-b-vpc.subnet_self_links["${var.region}/peering-b"]
+ },
+ }
+}
+
+module "test-vms" {
+ for_each = var.test_vms ? local.test-vms : {}
+ source = "../../../modules/compute-vm"
+ project_id = module.project.project_id
+ zone = "${var.region}-a"
+ name = "test-vm-${each.key}"
+ network_interfaces = [{
+ network = each.value.network
+ # change the subnet name to match the values you are actually using
+ subnetwork = each.value.subnetwork
+ }]
+ instance_type = "e2-micro"
+ tags = ["ssh"]
+ boot_disk = {
+ initialize_params = {
+ image = "projects/debian-cloud/global/images/family/debian-11"
+ }
+ }
+ options = {
+ spot = true
+ termination_action = "STOP"
+ }
+ metadata = {
+ startup-script = < /etc/apt/sources.list
+ echo "deb https://packages.cloud.google.com/mirror/cloud-apt/$DEB_VERSION-security $DEB_VERSION-security main" >> /etc/apt/sources.list
+ echo "deb https://packages.cloud.google.com/mirror/cloud-apt/$DEB_VERSION-updates $DEB_VERSION-updates main" >> /etc/apt/sources.list
+ apt update
+ apt install -y iputils-ping bind9-dnsutils
+ EOF
+ }
+}
diff --git a/blueprints/networking/vpc-connectivity-lab/variables.tf b/blueprints/networking/vpc-connectivity-lab/variables.tf
new file mode 100644
index 000000000..fd2be1ecb
--- /dev/null
+++ b/blueprints/networking/vpc-connectivity-lab/variables.tf
@@ -0,0 +1,72 @@
+/**
+ * Copyright 2023 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+variable "ip_ranges" {
+ description = "Subnet/Routes IP CIDR ranges."
+ type = map(string)
+ default = {
+ ext = "10.255.0.0/16"
+ hub-a = "10.0.1.0/24"
+ hub-all = "10.0.0.0/16"
+ hub-b = "10.0.2.0/24"
+ hub-nva = "10.0.0.0/24"
+ int = "10.0.0.0/9"
+ peering-a = "10.3.0.0/24"
+ peering-b = "10.4.0.0/24"
+ rfc1918_10 = "10.0.0.0/8"
+ rfc1918_172 = "172.16.0.0/12"
+ rfc1918_192 = "192.168.0.0/16"
+ vpn-a = "10.1.0.0/24"
+ vpn-b = "10.2.0.0/24"
+ }
+}
+
+variable "prefix" {
+ description = "Prefix used for resource names."
+ type = string
+ validation {
+ condition = var.prefix != ""
+ error_message = "Prefix cannot be empty."
+ }
+}
+
+variable "project_create_config" {
+ description = "Populate with billing account id to trigger project creation."
+ type = object({
+ billing_account_id = string
+ parent_id = string
+ })
+ default = null
+}
+
+variable "project_id" {
+ description = "Project id for all resources."
+ type = string
+ default = "net-test-02"
+}
+
+variable "region" {
+ description = "Region used to deploy resources."
+ type = string
+ default = "europe-west8"
+}
+
+variable "test_vms" {
+ description = "Enable the creation of test resources."
+ type = bool
+ default = true
+}
+
diff --git a/blueprints/networking/vpc-connectivity-lab/vpc-ext.tf b/blueprints/networking/vpc-connectivity-lab/vpc-ext.tf
new file mode 100644
index 000000000..b52ef9aba
--- /dev/null
+++ b/blueprints/networking/vpc-connectivity-lab/vpc-ext.tf
@@ -0,0 +1,105 @@
+/**
+ * Copyright 2023 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+# tfdoc:file:description External VPC.
+
+module "ext-vpc" {
+ source = "../../../modules/net-vpc"
+ project_id = module.project.project_id
+ name = "ext"
+ mtu = 1500
+ subnets = [
+ {
+ name = "ext"
+ region = var.region
+ ip_cidr_range = var.ip_ranges.ext
+ }
+ ]
+}
+
+module "nat" {
+ source = "../../../modules/net-cloudnat"
+ project_id = module.project.project_id
+ router_network = module.ext-vpc.name
+ region = var.region
+ name = "default"
+}
+
+module "ext-firewall" {
+ source = "../../../modules/net-vpc-firewall"
+ project_id = module.project.project_id
+ network = module.ext-vpc.name
+ default_rules_config = {
+ admin_ranges = [var.ip_ranges.rfc1918_10]
+ ssh_ranges = ["35.235.240.0/20", "35.191.0.0/16", "130.211.0.0/22", "209.85.152.0/22", "209.85.204.0/22"]
+ }
+}
+
+resource "google_compute_route" "ext-rfc1918-10" {
+ project = module.project.project_id
+ network = module.ext-vpc.name
+ name = "ext-rfc1918-10"
+ description = "Terraform-managed."
+ dest_range = var.ip_ranges.rfc1918_10
+ priority = 1000
+ next_hop_ilb = module.ext-lb.forwarding_rule_self_links[""]
+}
+
+module "ext-addresses" {
+ source = "../../../modules/net-address"
+ project_id = module.project.project_id
+ internal_addresses = {
+ ext = {
+ region = var.region
+ subnetwork = module.ext-vpc.subnet_self_links["${var.region}/ext"]
+ address = cidrhost(module.ext-vpc.subnet_ips["${var.region}/ext"], -3)
+ }
+ }
+}
+
+module "ext-lb" {
+ source = "../../../modules/net-lb-int"
+ project_id = module.project.project_id
+ region = var.region
+ name = "ext-lb"
+ vpc_config = {
+ network = module.ext-vpc.name
+ subnetwork = module.ext-vpc.subnet_self_links["${var.region}/ext"]
+ }
+ forwarding_rules_config = {
+ "" = {
+ global_access = false
+ address = module.ext-addresses.internal_addresses["ext"].address
+ }
+ }
+ backends = [
+ {
+ failover = false
+ group = google_compute_instance_group.nva-a.id
+ balancing_mode = "CONNECTION"
+ },
+ {
+ failover = false
+ group = google_compute_instance_group.nva-b.id
+ balancing_mode = "CONNECTION"
+ },
+ ]
+ health_check_config = {
+ tcp = {
+ port = 22
+ }
+ }
+}
diff --git a/blueprints/networking/vpc-connectivity-lab/vpc-hub.tf b/blueprints/networking/vpc-connectivity-lab/vpc-hub.tf
new file mode 100644
index 000000000..34546b851
--- /dev/null
+++ b/blueprints/networking/vpc-connectivity-lab/vpc-hub.tf
@@ -0,0 +1,222 @@
+/**
+ * Copyright 2023 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+# tfdoc:file:description Internal Hub VPC.
+
+module "hub-vpc" {
+ source = "../../../modules/net-vpc"
+ project_id = module.project.project_id
+ name = "hub"
+ mtu = 1500
+ subnets = [
+ {
+ name = "hub-nva"
+ region = var.region
+ ip_cidr_range = var.ip_ranges.hub-nva
+ },
+ {
+ name = "hub-a"
+ region = var.region
+ ip_cidr_range = var.ip_ranges.hub-a
+ },
+ {
+ name = "hub-b"
+ region = var.region
+ ip_cidr_range = var.ip_ranges.hub-b
+ },
+ ]
+ policy_based_routes = {
+ nva-skip = {
+ use_default_routing = true
+ priority = 100
+ target = {
+ tags = ["nva"]
+ }
+ }
+ default-nva = {
+ next_hop_ilb_ip = module.hub-lb.forwarding_rule_addresses[""]
+ priority = 101
+ filter = {
+ src_range = var.ip_ranges.hub-all
+ dest_range = "0.0.0.0/0"
+ }
+ }
+ }
+}
+
+module "hub-firewall" {
+ source = "../../../modules/net-vpc-firewall"
+ project_id = module.project.project_id
+ network = module.hub-vpc.name
+ default_rules_config = {
+ admin_ranges = [var.ip_ranges.rfc1918_10]
+ ssh_ranges = ["35.235.240.0/20", "35.191.0.0/16", "130.211.0.0/22", "209.85.152.0/22", "209.85.204.0/22"]
+ }
+}
+
+resource "google_compute_route" "hub-0-0" {
+ project = module.project.project_id
+ network = module.hub-vpc.name
+ name = "hub-0-0"
+ description = "Terraform-managed."
+ dest_range = "0.0.0.0/0"
+ priority = 1000
+ next_hop_ilb = module.hub-lb.forwarding_rule_self_links[""]
+}
+
+module "hub-addresses" {
+ source = "../../../modules/net-address"
+ project_id = module.project.project_id
+ internal_addresses = {
+ hub = {
+ region = var.region
+ subnetwork = module.hub-vpc.subnet_self_links["${var.region}/hub-nva"]
+ address = cidrhost(module.hub-vpc.subnet_ips["${var.region}/hub-nva"], -3)
+ }
+ }
+}
+
+module "hub-lb" {
+ source = "../../../modules/net-lb-int"
+ project_id = module.project.project_id
+ region = var.region
+ name = "hub-lb"
+ vpc_config = {
+ network = module.hub-vpc.name
+ subnetwork = module.hub-vpc.subnet_self_links["${var.region}/hub-nva"]
+ }
+ forwarding_rules_config = {
+ "" = {
+ global_access = false
+ address = module.hub-addresses.internal_addresses["hub"].address
+ }
+ }
+
+ backends = [
+ {
+ failover = false
+ group = google_compute_instance_group.nva-a.id
+ balancing_mode = "CONNECTION"
+ },
+ {
+ failover = false
+ group = google_compute_instance_group.nva-b.id
+ balancing_mode = "CONNECTION"
+ },
+ ]
+ health_check_config = {
+ tcp = {
+ port = 22
+ }
+ }
+}
+
+
+module "vpn-hub-a" {
+ source = "../../../modules/net-vpn-ha"
+ project_id = module.project.project_id
+ region = var.region
+ network = module.hub-vpc.self_link
+ name = "hub-a"
+ peer_gateways = {
+ default = { gcp = module.vpn-a-hub.self_link }
+ }
+ router_config = {
+ asn = 64513
+ custom_advertise = {
+ all_subnets = false
+ ip_ranges = {
+ "0.0.0.0/0" = "default"
+ }
+ }
+ }
+ tunnels = {
+ remote-0 = {
+ bgp_peer = {
+ address = "169.254.1.2"
+ asn = 64514
+ }
+ bgp_session_range = "169.254.1.1/30"
+ shared_secret = module.vpn-a-hub.random_secret
+ vpn_gateway_interface = 0
+ }
+ remote-1 = {
+ bgp_peer = {
+ address = "169.254.2.2"
+ asn = 64514
+ }
+ bgp_session_range = "169.254.2.1/30"
+ shared_secret = module.vpn-a-hub.random_secret
+ vpn_gateway_interface = 1
+ }
+ }
+}
+
+module "vpn-hub-b" {
+ source = "../../../modules/net-vpn-ha"
+ project_id = module.project.project_id
+ region = var.region
+ network = module.hub-vpc.self_link
+ name = "hub-b"
+ peer_gateways = {
+ default = { gcp = module.vpn-b-hub.self_link }
+ }
+ router_config = {
+ asn = 64513
+ custom_advertise = {
+ all_subnets = false
+ ip_ranges = {
+ "0.0.0.0/0" = "default"
+ }
+ }
+ }
+ tunnels = {
+ remote-0 = {
+ bgp_peer = {
+ address = "169.254.1.6"
+ asn = 64515
+ }
+ bgp_session_range = "169.254.1.5/30"
+ shared_secret = module.vpn-b-hub.random_secret
+ vpn_gateway_interface = 0
+ }
+ remote-1 = {
+ bgp_peer = {
+ address = "169.254.2.6"
+ asn = 64515
+ }
+ bgp_session_range = "169.254.2.5/30"
+ shared_secret = module.vpn-b-hub.random_secret
+ vpn_gateway_interface = 1
+ }
+ }
+}
+
+module "peering-hub-a" {
+ source = "../../../modules/net-vpc-peering"
+ prefix = "a"
+ local_network = module.hub-vpc.id
+ peer_network = module.spoke-peering-a-vpc.id
+}
+
+module "peering-hub-b" {
+ source = "../../../modules/net-vpc-peering"
+ prefix = "b"
+ local_network = module.hub-vpc.id
+ peer_network = module.spoke-peering-b-vpc.id
+ depends_on = [module.spoke-peering-a-vpc.id]
+}
+
diff --git a/blueprints/networking/vpc-connectivity-lab/vpc-peering-a.tf b/blueprints/networking/vpc-connectivity-lab/vpc-peering-a.tf
new file mode 100644
index 000000000..b1ba8cd02
--- /dev/null
+++ b/blueprints/networking/vpc-connectivity-lab/vpc-peering-a.tf
@@ -0,0 +1,48 @@
+/**
+ * Copyright 2023 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+module "spoke-peering-a-vpc" {
+ source = "../../../modules/net-vpc"
+ project_id = module.project.project_id
+ name = "peering-a"
+ mtu = 1500
+ subnets = [
+ {
+ name = "peering-a"
+ region = var.region
+ ip_cidr_range = var.ip_ranges.peering-a
+
+ }
+ ]
+ routes = {
+ default = {
+ description = "Route to default."
+ dest_range = "0.0.0.0/0"
+ tags = null
+ next_hop_type = "ilb"
+ next_hop = module.hub-lb.forwarding_rule_addresses[""]
+ }
+ }
+}
+
+module "peering-a-firewall" {
+ source = "../../../modules/net-vpc-firewall"
+ project_id = module.project.project_id
+ network = module.spoke-peering-a-vpc.name
+ default_rules_config = {
+ admin_ranges = [var.ip_ranges.rfc1918_10]
+ }
+}
diff --git a/blueprints/networking/vpc-connectivity-lab/vpc-peering-b.tf b/blueprints/networking/vpc-connectivity-lab/vpc-peering-b.tf
new file mode 100644
index 000000000..961518a31
--- /dev/null
+++ b/blueprints/networking/vpc-connectivity-lab/vpc-peering-b.tf
@@ -0,0 +1,47 @@
+/**
+ * Copyright 2023 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+module "spoke-peering-b-vpc" {
+ source = "../../../modules/net-vpc"
+ project_id = module.project.project_id
+ name = "peering-b"
+ mtu = 1500
+ subnets = [
+ {
+ name = "peering-b"
+ region = var.region
+ ip_cidr_range = var.ip_ranges.peering-b
+ }
+ ]
+ routes = {
+ default = {
+ description = "Route to default."
+ dest_range = "0.0.0.0/0"
+ tags = null
+ next_hop_type = "ilb"
+ next_hop = module.hub-lb.forwarding_rule_addresses[""]
+ }
+ }
+}
+
+module "peering-b-firewall" {
+ source = "../../../modules/net-vpc-firewall"
+ project_id = module.project.project_id
+ network = module.spoke-peering-b-vpc.name
+ default_rules_config = {
+ admin_ranges = [var.ip_ranges.rfc1918_10]
+ }
+}
diff --git a/blueprints/networking/vpc-connectivity-lab/vpc-vpn-a.tf b/blueprints/networking/vpc-connectivity-lab/vpc-vpn-a.tf
new file mode 100644
index 000000000..d1aee2791
--- /dev/null
+++ b/blueprints/networking/vpc-connectivity-lab/vpc-vpn-a.tf
@@ -0,0 +1,78 @@
+/**
+ * Copyright 2023 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+module "spoke-vpn-a-vpc" {
+ source = "../../../modules/net-vpc"
+ project_id = module.project.project_id
+ name = "vpn-a"
+ mtu = 1500
+ subnets = [
+ {
+ name = "vpn-a"
+ region = var.region
+ ip_cidr_range = var.ip_ranges.vpn-a
+ }
+ ]
+}
+
+module "vpn-a-firewall" {
+ source = "../../../modules/net-vpc-firewall"
+ project_id = module.project.project_id
+ network = module.spoke-vpn-a-vpc.name
+ default_rules_config = {
+ admin_ranges = [var.ip_ranges.rfc1918_10]
+ }
+}
+
+module "vpn-a-hub" {
+ source = "../../../modules/net-vpn-ha"
+ project_id = module.project.project_id
+ region = var.region
+ network = module.spoke-vpn-a-vpc.self_link
+ name = "a-hub"
+ peer_gateways = {
+ default = { gcp = module.vpn-hub-a.self_link }
+ }
+ router_config = {
+ asn = 64514
+ custom_advertise = {
+ all_subnets = false
+ ip_ranges = {
+ (var.ip_ranges.vpn-a) = "default"
+ }
+ }
+ }
+ tunnels = {
+ remote-0 = {
+ bgp_peer = {
+ address = "169.254.1.1"
+ asn = 64513
+ }
+ bgp_session_range = "169.254.1.2/30"
+ vpn_gateway_interface = 0
+ }
+ remote-1 = {
+ bgp_peer = {
+ address = "169.254.2.1"
+ asn = 64513
+ }
+ bgp_session_range = "169.254.2.2/30"
+ vpn_gateway_interface = 1
+ }
+ }
+}
+
+
diff --git a/blueprints/networking/vpc-connectivity-lab/vpc-vpn-b.tf b/blueprints/networking/vpc-connectivity-lab/vpc-vpn-b.tf
new file mode 100644
index 000000000..a57a39d9f
--- /dev/null
+++ b/blueprints/networking/vpc-connectivity-lab/vpc-vpn-b.tf
@@ -0,0 +1,76 @@
+/**
+ * Copyright 2023 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+module "spoke-vpn-b-vpc" {
+ source = "../../../modules/net-vpc"
+ project_id = module.project.project_id
+ name = "vpn-b"
+ mtu = 1500
+ subnets = [
+ {
+ name = "vpn-b"
+ region = var.region
+ ip_cidr_range = var.ip_ranges.vpn-b
+ }
+ ]
+}
+
+module "vpn-b-firewall" {
+ source = "../../../modules/net-vpc-firewall"
+ project_id = module.project.project_id
+ network = module.spoke-vpn-b-vpc.name
+ default_rules_config = {
+ admin_ranges = [var.ip_ranges.rfc1918_10]
+ }
+}
+
+module "vpn-b-hub" {
+ source = "../../../modules/net-vpn-ha"
+ project_id = module.project.project_id
+ region = var.region
+ network = module.spoke-vpn-b-vpc.self_link
+ name = "b-hub"
+ peer_gateways = {
+ default = { gcp = module.vpn-hub-b.self_link }
+ }
+ router_config = {
+ asn = 64515
+ custom_advertise = {
+ all_subnets = false
+ ip_ranges = {
+ (var.ip_ranges.vpn-b) = "default"
+ }
+ }
+ }
+ tunnels = {
+ remote-0 = {
+ bgp_peer = {
+ address = "169.254.1.5"
+ asn = 64513
+ }
+ bgp_session_range = "169.254.1.6/30"
+ vpn_gateway_interface = 0
+ }
+ remote-1 = {
+ bgp_peer = {
+ address = "169.254.2.5"
+ asn = 64513
+ }
+ bgp_session_range = "169.254.2.6/30"
+ vpn_gateway_interface = 1
+ }
+ }
+}
diff --git a/default-versions.tf b/default-versions.tf
index 4a2837182..5ec74cff3 100644
--- a/default-versions.tf
+++ b/default-versions.tf
@@ -17,13 +17,11 @@ terraform {
required_providers {
google = {
source = "hashicorp/google"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
google-beta = {
source = "hashicorp/google-beta"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
}
}
-
-
diff --git a/fast/stages-multitenant/0-bootstrap-tenant/templates/workflow-github.yaml b/fast/stages-multitenant/0-bootstrap-tenant/templates/workflow-github.yaml
index 2d92cce0b..56fb0719f 100644
--- a/fast/stages-multitenant/0-bootstrap-tenant/templates/workflow-github.yaml
+++ b/fast/stages-multitenant/0-bootstrap-tenant/templates/workflow-github.yaml
@@ -28,11 +28,11 @@ env:
FAST_SERVICE_ACCOUNT: ${service_account}
FAST_WIF_PROVIDER: ${identity_provider}
SSH_AUTH_SOCK: /tmp/ssh_agent.sock
- %{~ if tf_providers_file != "" ~}
TF_PROVIDERS_FILE: ${tf_providers_file}
+ %{~ if tf_var_files != [] ~}
+ TF_VAR_FILES: ${join("\n ", tf_var_files)}
%{~ endif ~}
- TF_VAR_FILES: ${tf_var_files == [] ? "''" : join("\n ", tf_var_files)}
- TF_VERSION: 1.4.4
+ TF_VERSION: 1.5.1
jobs:
fast-pr:
@@ -57,7 +57,7 @@ jobs:
# set up authentication via Workload identity Federation
- id: gcp-auth
name: Authenticate to Google Cloud
- uses: google-github-actions/auth@v0
+ uses: google-github-actions/auth@v2
with:
workload_identity_provider: $${{ env.FAST_WIF_PROVIDER }}
service_account: $${{ env.FAST_SERVICE_ACCOUNT }}
@@ -73,15 +73,15 @@ jobs:
- id: tf-config
name: Copy Terraform output files
run: |
- %{~ if tf_providers_file != "" ~}
gcloud alpha storage cp -r \
"gs://$${{env.FAST_OUTPUTS_BUCKET}}/providers/$${{env.TF_PROVIDERS_FILE}}" ./
- %{~ endif ~}
+ %{~ if tf_var_files != [] ~}
gcloud alpha storage cp -r \
"gs://$${{env.FAST_OUTPUTS_BUCKET}}/tfvars" ./
for f in $${{env.TF_VAR_FILES}}; do
ln -s "tfvars/$f" ./
done
+ %{~ endif ~}
- id: tf-setup
name: Set up Terraform
@@ -97,8 +97,8 @@ jobs:
terraform init -no-color
- id: tf-validate
- name: Terraform validate
continue-on-error: true
+ name: Terraform validate
run: terraform validate -no-color
- id: tf-plan
diff --git a/fast/stages-multitenant/1-resman-tenant/templates/workflow-github.yaml b/fast/stages-multitenant/1-resman-tenant/templates/workflow-github.yaml
index 9266a134a..56fb0719f 100644
--- a/fast/stages-multitenant/1-resman-tenant/templates/workflow-github.yaml
+++ b/fast/stages-multitenant/1-resman-tenant/templates/workflow-github.yaml
@@ -29,8 +29,10 @@ env:
FAST_WIF_PROVIDER: ${identity_provider}
SSH_AUTH_SOCK: /tmp/ssh_agent.sock
TF_PROVIDERS_FILE: ${tf_providers_file}
- TF_VAR_FILES: ${tf_var_files == [] ? "''" : join("\n ", tf_var_files)}
- TF_VERSION: 1.4.4
+ %{~ if tf_var_files != [] ~}
+ TF_VAR_FILES: ${join("\n ", tf_var_files)}
+ %{~ endif ~}
+ TF_VERSION: 1.5.1
jobs:
fast-pr:
@@ -55,7 +57,7 @@ jobs:
# set up authentication via Workload identity Federation
- id: gcp-auth
name: Authenticate to Google Cloud
- uses: google-github-actions/auth@v0
+ uses: google-github-actions/auth@v2
with:
workload_identity_provider: $${{ env.FAST_WIF_PROVIDER }}
service_account: $${{ env.FAST_SERVICE_ACCOUNT }}
@@ -73,11 +75,13 @@ jobs:
run: |
gcloud alpha storage cp -r \
"gs://$${{env.FAST_OUTPUTS_BUCKET}}/providers/$${{env.TF_PROVIDERS_FILE}}" ./
+ %{~ if tf_var_files != [] ~}
gcloud alpha storage cp -r \
"gs://$${{env.FAST_OUTPUTS_BUCKET}}/tfvars" ./
for f in $${{env.TF_VAR_FILES}}; do
ln -s "tfvars/$f" ./
done
+ %{~ endif ~}
- id: tf-setup
name: Set up Terraform
@@ -93,8 +97,8 @@ jobs:
terraform init -no-color
- id: tf-validate
- name: Terraform validate
continue-on-error: true
+ name: Terraform validate
run: terraform validate -no-color
- id: tf-plan
diff --git a/fast/stages/0-bootstrap/README.md b/fast/stages/0-bootstrap/README.md
index c10b2bf32..076586099 100644
--- a/fast/stages/0-bootstrap/README.md
+++ b/fast/stages/0-bootstrap/README.md
@@ -597,7 +597,7 @@ The `fast_features` variable consists of 4 toggles:
| [organization](variables.tf#L235) | Organization details. | object({…}) | ✓ | | |
| [prefix](variables.tf#L250) | Prefix used for resources that need unique names. Use 9 characters or less. | string | ✓ | | |
| [bootstrap_user](variables.tf#L27) | Email of the nominal user running this stage for the first time. | string | | null | |
-| [cicd_repositories](variables.tf#L33) | CI/CD repository configuration. Identity providers reference keys in the `federated_identity_providers` variable. Set to null to disable, or set individual repositories to null if not needed. | object({…}) | | null | |
+| [cicd_repositories](variables.tf#L33) | CI/CD repository configuration. Identity providers reference keys in the `federated_identity_providers` variable. Set to null to disable, or set individual repositories to null if not needed. | object({…}) | | null | |
| [custom_roles](variables.tf#L79) | Map of role names => list of permissions to additionally create at the organization level. | map(list(string)) | | {} | |
| [factories_config](variables.tf#L86) | Configuration for the organization policies factory. | object({…}) | | {} | |
| [fast_features](variables.tf#L96) | Selective control for top-level FAST features. | object({…}) | | {} | |
diff --git a/fast/stages/0-bootstrap/identity-providers.tf b/fast/stages/0-bootstrap/identity-providers.tf
index f648f965a..ca0783597 100644
--- a/fast/stages/0-bootstrap/identity-providers.tf
+++ b/fast/stages/0-bootstrap/identity-providers.tf
@@ -33,9 +33,10 @@ locals {
"attribute.repository" = "assertion.repository"
"attribute.repository_owner" = "assertion.repository_owner"
"attribute.ref" = "assertion.ref"
+ "attribute.fast_sub" = "\"repo:\" + assertion.repository + \":ref:\" + assertion.ref"
}
issuer_uri = "https://token.actions.githubusercontent.com"
- principal_tpl = "principal://iam.googleapis.com/%s/subject/repo:%s:ref:refs/heads/%s"
+ principal_tpl = "principalSet://iam.googleapis.com/%s/attribute.fast_sub/repo:%s:ref:refs/heads/%s"
principalset_tpl = "principalSet://iam.googleapis.com/%s/attribute.repository/%s"
}
# https://docs.gitlab.com/ee/ci/secrets/id_token_authentication.html#token-payload
@@ -89,7 +90,7 @@ resource "google_iam_workload_identity_pool_provider" "default" {
? each.value.custom_settings.issuer_uri
: try(each.value.issuer_uri, null)
)
- # OIDC JWKs in JSON String format. If no value is provided, they key is
+ # OIDC JWKs in JSON String format. If no value is provided, they key is
# fetched from the `.well-known` path for the issuer_uri
jwks_json = each.value.custom_settings.jwks_json
}
diff --git a/fast/stages/0-bootstrap/templates/workflow-github.yaml b/fast/stages/0-bootstrap/templates/workflow-github.yaml
index 5969f5a95..56fb0719f 100644
--- a/fast/stages/0-bootstrap/templates/workflow-github.yaml
+++ b/fast/stages/0-bootstrap/templates/workflow-github.yaml
@@ -32,7 +32,7 @@ env:
%{~ if tf_var_files != [] ~}
TF_VAR_FILES: ${join("\n ", tf_var_files)}
%{~ endif ~}
- TF_VERSION: 1.4.4
+ TF_VERSION: 1.5.1
jobs:
fast-pr:
@@ -47,19 +47,6 @@ jobs:
name: Checkout repository
uses: actions/checkout@v3
-# # Print JWT token payload, useful for debugging
-# - id: jwt-debug
-# name: Print GITHUB_TOKEN payload
-# shell: python -u {0}
-# run: |
-# import base64
-# import json
-#
-# token = '${{ secrets.GITHUB_TOKEN }}'
-# payload_text = token.split('.')[1]
-# payload = json.loads(base64.urlsafe_b64decode(payload_text + '=' * (4-len(payload_text) %4)))
-# print(json.dumps(payload, indent=2))
-
# set up SSH key authentication to the modules repository
- id: ssh-config
name: Configure SSH authentication
diff --git a/fast/stages/0-bootstrap/variables.tf b/fast/stages/0-bootstrap/variables.tf
index 9980c1189..a20c4465e 100644
--- a/fast/stages/0-bootstrap/variables.tf
+++ b/fast/stages/0-bootstrap/variables.tf
@@ -34,16 +34,16 @@ variable "cicd_repositories" {
description = "CI/CD repository configuration. Identity providers reference keys in the `federated_identity_providers` variable. Set to null to disable, or set individual repositories to null if not needed."
type = object({
bootstrap = optional(object({
- branch = string
- identity_provider = string
name = string
type = string
+ branch = optional(string)
+ identity_provider = optional(string)
}))
resman = optional(object({
- branch = string
- identity_provider = string
name = string
type = string
+ branch = optional(string)
+ identity_provider = optional(string)
}))
})
default = null
diff --git a/fast/stages/1-resman/README.md b/fast/stages/1-resman/README.md
index 8cbaa7f5c..e1a4637a5 100644
--- a/fast/stages/1-resman/README.md
+++ b/fast/stages/1-resman/README.md
@@ -357,7 +357,7 @@ Due to its simplicity, this stage lends itself easily to customizations: adding
| [billing_account](variables.tf#L39) | Billing account id. If billing account is not part of the same org set `is_org_level` to `false`. To disable handling of billing IAM roles set `no_iam` to `true`. | object({…}) | ✓ | | 0-bootstrap |
| [organization](variables.tf#L198) | Organization details. | object({…}) | ✓ | | 0-bootstrap |
| [prefix](variables.tf#L214) | Prefix used for resources that need unique names. Use 9 characters or less. | string | ✓ | | 0-bootstrap |
-| [cicd_repositories](variables.tf#L50) | CI/CD repository configuration. Identity providers reference keys in the `automation.federated_identity_providers` variable. Set to null to disable, or set individual repositories to null if not needed. | object({…}) | | null | |
+| [cicd_repositories](variables.tf#L50) | CI/CD repository configuration. Identity providers reference keys in the `automation.federated_identity_providers` variable. Set to null to disable, or set individual repositories to null if not needed. | object({…}) | | null | |
| [custom_roles](variables.tf#L132) | Custom roles defined at the org level, in key => id format. | object({…}) | | null | 0-bootstrap |
| [fast_features](variables.tf#L141) | Selective control for top-level FAST features. | object({…}) | | {} | 0-0-bootstrap |
| [groups](variables.tf#L155) | Group names or emails to grant organization-level permissions. If just the name is provided, the default organization domain is assumed. | object({…}) | | {} | 0-bootstrap |
diff --git a/fast/stages/1-resman/templates/workflow-github.yaml b/fast/stages/1-resman/templates/workflow-github.yaml
index 1d8a555a1..56fb0719f 100644
--- a/fast/stages/1-resman/templates/workflow-github.yaml
+++ b/fast/stages/1-resman/templates/workflow-github.yaml
@@ -29,8 +29,10 @@ env:
FAST_WIF_PROVIDER: ${identity_provider}
SSH_AUTH_SOCK: /tmp/ssh_agent.sock
TF_PROVIDERS_FILE: ${tf_providers_file}
- TF_VAR_FILES: ${tf_var_files == [] ? "''" : join("\n ", tf_var_files)}
- TF_VERSION: 1.4.4
+ %{~ if tf_var_files != [] ~}
+ TF_VAR_FILES: ${join("\n ", tf_var_files)}
+ %{~ endif ~}
+ TF_VERSION: 1.5.1
jobs:
fast-pr:
@@ -73,11 +75,13 @@ jobs:
run: |
gcloud alpha storage cp -r \
"gs://$${{env.FAST_OUTPUTS_BUCKET}}/providers/$${{env.TF_PROVIDERS_FILE}}" ./
+ %{~ if tf_var_files != [] ~}
gcloud alpha storage cp -r \
"gs://$${{env.FAST_OUTPUTS_BUCKET}}/tfvars" ./
for f in $${{env.TF_VAR_FILES}}; do
ln -s "tfvars/$f" ./
done
+ %{~ endif ~}
- id: tf-setup
name: Set up Terraform
diff --git a/fast/stages/1-resman/variables.tf b/fast/stages/1-resman/variables.tf
index 849fc6ef7..d3099f456 100644
--- a/fast/stages/1-resman/variables.tf
+++ b/fast/stages/1-resman/variables.tf
@@ -51,52 +51,52 @@ variable "cicd_repositories" {
description = "CI/CD repository configuration. Identity providers reference keys in the `automation.federated_identity_providers` variable. Set to null to disable, or set individual repositories to null if not needed."
type = object({
data_platform_dev = optional(object({
- branch = string
- identity_provider = string
name = string
type = string
+ branch = optional(string)
+ identity_provider = optional(string)
}))
data_platform_prod = optional(object({
- branch = string
- identity_provider = string
name = string
type = string
+ branch = optional(string)
+ identity_provider = optional(string)
}))
gke_dev = optional(object({
- branch = string
- identity_provider = string
name = string
type = string
+ branch = optional(string)
+ identity_provider = optional(string)
}))
gke_prod = optional(object({
- branch = string
- identity_provider = string
name = string
type = string
+ branch = optional(string)
+ identity_provider = optional(string)
}))
networking = optional(object({
- branch = string
- identity_provider = string
name = string
type = string
+ branch = optional(string)
+ identity_provider = optional(string)
}))
project_factory_dev = optional(object({
- branch = string
- identity_provider = string
name = string
type = string
+ branch = optional(string)
+ identity_provider = optional(string)
}))
project_factory_prod = optional(object({
- branch = string
- identity_provider = string
name = string
type = string
+ branch = optional(string)
+ identity_provider = optional(string)
}))
security = optional(object({
- branch = string
- identity_provider = string
name = string
type = string
+ branch = optional(string)
+ identity_provider = optional(string)
}))
})
default = null
diff --git a/modules/__experimental/alloydb-instance/versions.tf b/modules/__experimental/alloydb-instance/versions.tf
index 4a2837182..5ec74cff3 100644
--- a/modules/__experimental/alloydb-instance/versions.tf
+++ b/modules/__experimental/alloydb-instance/versions.tf
@@ -17,13 +17,11 @@ terraform {
required_providers {
google = {
source = "hashicorp/google"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
google-beta = {
source = "hashicorp/google-beta"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
}
}
-
-
diff --git a/modules/__experimental/net-neg/versions.tf b/modules/__experimental/net-neg/versions.tf
index 4a2837182..5ec74cff3 100644
--- a/modules/__experimental/net-neg/versions.tf
+++ b/modules/__experimental/net-neg/versions.tf
@@ -17,13 +17,11 @@ terraform {
required_providers {
google = {
source = "hashicorp/google"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
google-beta = {
source = "hashicorp/google-beta"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
}
}
-
-
diff --git a/modules/__experimental/project-iam-magic/versions.tf b/modules/__experimental/project-iam-magic/versions.tf
index 4a2837182..5ec74cff3 100644
--- a/modules/__experimental/project-iam-magic/versions.tf
+++ b/modules/__experimental/project-iam-magic/versions.tf
@@ -17,13 +17,11 @@ terraform {
required_providers {
google = {
source = "hashicorp/google"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
google-beta = {
source = "hashicorp/google-beta"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
}
}
-
-
diff --git a/modules/api-gateway/versions.tf b/modules/api-gateway/versions.tf
index 4a2837182..5ec74cff3 100644
--- a/modules/api-gateway/versions.tf
+++ b/modules/api-gateway/versions.tf
@@ -17,13 +17,11 @@ terraform {
required_providers {
google = {
source = "hashicorp/google"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
google-beta = {
source = "hashicorp/google-beta"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
}
}
-
-
diff --git a/modules/apigee/versions.tf b/modules/apigee/versions.tf
index 4a2837182..5ec74cff3 100644
--- a/modules/apigee/versions.tf
+++ b/modules/apigee/versions.tf
@@ -17,13 +17,11 @@ terraform {
required_providers {
google = {
source = "hashicorp/google"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
google-beta = {
source = "hashicorp/google-beta"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
}
}
-
-
diff --git a/modules/artifact-registry/versions.tf b/modules/artifact-registry/versions.tf
index 4a2837182..5ec74cff3 100644
--- a/modules/artifact-registry/versions.tf
+++ b/modules/artifact-registry/versions.tf
@@ -17,13 +17,11 @@ terraform {
required_providers {
google = {
source = "hashicorp/google"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
google-beta = {
source = "hashicorp/google-beta"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
}
}
-
-
diff --git a/modules/bigquery-dataset/versions.tf b/modules/bigquery-dataset/versions.tf
index 4a2837182..5ec74cff3 100644
--- a/modules/bigquery-dataset/versions.tf
+++ b/modules/bigquery-dataset/versions.tf
@@ -17,13 +17,11 @@ terraform {
required_providers {
google = {
source = "hashicorp/google"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
google-beta = {
source = "hashicorp/google-beta"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
}
}
-
-
diff --git a/modules/bigtable-instance/versions.tf b/modules/bigtable-instance/versions.tf
index 4a2837182..5ec74cff3 100644
--- a/modules/bigtable-instance/versions.tf
+++ b/modules/bigtable-instance/versions.tf
@@ -17,13 +17,11 @@ terraform {
required_providers {
google = {
source = "hashicorp/google"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
google-beta = {
source = "hashicorp/google-beta"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
}
}
-
-
diff --git a/modules/billing-account/versions.tf b/modules/billing-account/versions.tf
index 4a2837182..5ec74cff3 100644
--- a/modules/billing-account/versions.tf
+++ b/modules/billing-account/versions.tf
@@ -17,13 +17,11 @@ terraform {
required_providers {
google = {
source = "hashicorp/google"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
google-beta = {
source = "hashicorp/google-beta"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
}
}
-
-
diff --git a/modules/binauthz/versions.tf b/modules/binauthz/versions.tf
index 4a2837182..5ec74cff3 100644
--- a/modules/binauthz/versions.tf
+++ b/modules/binauthz/versions.tf
@@ -17,13 +17,11 @@ terraform {
required_providers {
google = {
source = "hashicorp/google"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
google-beta = {
source = "hashicorp/google-beta"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
}
}
-
-
diff --git a/modules/cloud-config-container/__need_fixing/onprem/versions.tf b/modules/cloud-config-container/__need_fixing/onprem/versions.tf
index 4a2837182..5ec74cff3 100644
--- a/modules/cloud-config-container/__need_fixing/onprem/versions.tf
+++ b/modules/cloud-config-container/__need_fixing/onprem/versions.tf
@@ -17,13 +17,11 @@ terraform {
required_providers {
google = {
source = "hashicorp/google"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
google-beta = {
source = "hashicorp/google-beta"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
}
}
-
-
diff --git a/modules/cloud-config-container/__need_fixing/squid/versions.tf b/modules/cloud-config-container/__need_fixing/squid/versions.tf
index 4a2837182..5ec74cff3 100644
--- a/modules/cloud-config-container/__need_fixing/squid/versions.tf
+++ b/modules/cloud-config-container/__need_fixing/squid/versions.tf
@@ -17,13 +17,11 @@ terraform {
required_providers {
google = {
source = "hashicorp/google"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
google-beta = {
source = "hashicorp/google-beta"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
}
}
-
-
diff --git a/modules/cloud-config-container/coredns/versions.tf b/modules/cloud-config-container/coredns/versions.tf
index 4a2837182..5ec74cff3 100644
--- a/modules/cloud-config-container/coredns/versions.tf
+++ b/modules/cloud-config-container/coredns/versions.tf
@@ -17,13 +17,11 @@ terraform {
required_providers {
google = {
source = "hashicorp/google"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
google-beta = {
source = "hashicorp/google-beta"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
}
}
-
-
diff --git a/modules/cloud-config-container/cos-generic-metadata/versions.tf b/modules/cloud-config-container/cos-generic-metadata/versions.tf
index 4a2837182..5ec74cff3 100644
--- a/modules/cloud-config-container/cos-generic-metadata/versions.tf
+++ b/modules/cloud-config-container/cos-generic-metadata/versions.tf
@@ -17,13 +17,11 @@ terraform {
required_providers {
google = {
source = "hashicorp/google"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
google-beta = {
source = "hashicorp/google-beta"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
}
}
-
-
diff --git a/modules/cloud-config-container/envoy-sni-dyn-fwd-proxy/versions.tf b/modules/cloud-config-container/envoy-sni-dyn-fwd-proxy/versions.tf
index 4a2837182..5ec74cff3 100644
--- a/modules/cloud-config-container/envoy-sni-dyn-fwd-proxy/versions.tf
+++ b/modules/cloud-config-container/envoy-sni-dyn-fwd-proxy/versions.tf
@@ -17,13 +17,11 @@ terraform {
required_providers {
google = {
source = "hashicorp/google"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
google-beta = {
source = "hashicorp/google-beta"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
}
}
-
-
diff --git a/modules/cloud-config-container/envoy-traffic-director/versions.tf b/modules/cloud-config-container/envoy-traffic-director/versions.tf
index 4a2837182..5ec74cff3 100644
--- a/modules/cloud-config-container/envoy-traffic-director/versions.tf
+++ b/modules/cloud-config-container/envoy-traffic-director/versions.tf
@@ -17,13 +17,11 @@ terraform {
required_providers {
google = {
source = "hashicorp/google"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
google-beta = {
source = "hashicorp/google-beta"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
}
}
-
-
diff --git a/modules/cloud-config-container/mysql/versions.tf b/modules/cloud-config-container/mysql/versions.tf
index 4a2837182..5ec74cff3 100644
--- a/modules/cloud-config-container/mysql/versions.tf
+++ b/modules/cloud-config-container/mysql/versions.tf
@@ -17,13 +17,11 @@ terraform {
required_providers {
google = {
source = "hashicorp/google"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
google-beta = {
source = "hashicorp/google-beta"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
}
}
-
-
diff --git a/modules/cloud-config-container/nginx-tls/versions.tf b/modules/cloud-config-container/nginx-tls/versions.tf
index 4a2837182..5ec74cff3 100644
--- a/modules/cloud-config-container/nginx-tls/versions.tf
+++ b/modules/cloud-config-container/nginx-tls/versions.tf
@@ -17,13 +17,11 @@ terraform {
required_providers {
google = {
source = "hashicorp/google"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
google-beta = {
source = "hashicorp/google-beta"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
}
}
-
-
diff --git a/modules/cloud-config-container/nginx/versions.tf b/modules/cloud-config-container/nginx/versions.tf
index 4a2837182..5ec74cff3 100644
--- a/modules/cloud-config-container/nginx/versions.tf
+++ b/modules/cloud-config-container/nginx/versions.tf
@@ -17,13 +17,11 @@ terraform {
required_providers {
google = {
source = "hashicorp/google"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
google-beta = {
source = "hashicorp/google-beta"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
}
}
-
-
diff --git a/modules/cloud-config-container/simple-nva/versions.tf b/modules/cloud-config-container/simple-nva/versions.tf
index 4a2837182..5ec74cff3 100644
--- a/modules/cloud-config-container/simple-nva/versions.tf
+++ b/modules/cloud-config-container/simple-nva/versions.tf
@@ -17,13 +17,11 @@ terraform {
required_providers {
google = {
source = "hashicorp/google"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
google-beta = {
source = "hashicorp/google-beta"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
}
}
-
-
diff --git a/modules/cloud-function-v1/versions.tf b/modules/cloud-function-v1/versions.tf
index 4a2837182..5ec74cff3 100644
--- a/modules/cloud-function-v1/versions.tf
+++ b/modules/cloud-function-v1/versions.tf
@@ -17,13 +17,11 @@ terraform {
required_providers {
google = {
source = "hashicorp/google"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
google-beta = {
source = "hashicorp/google-beta"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
}
}
-
-
diff --git a/modules/cloud-function-v2/versions.tf b/modules/cloud-function-v2/versions.tf
index 4a2837182..5ec74cff3 100644
--- a/modules/cloud-function-v2/versions.tf
+++ b/modules/cloud-function-v2/versions.tf
@@ -17,13 +17,11 @@ terraform {
required_providers {
google = {
source = "hashicorp/google"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
google-beta = {
source = "hashicorp/google-beta"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
}
}
-
-
diff --git a/modules/cloud-identity-group/versions.tf b/modules/cloud-identity-group/versions.tf
index 4a2837182..5ec74cff3 100644
--- a/modules/cloud-identity-group/versions.tf
+++ b/modules/cloud-identity-group/versions.tf
@@ -17,13 +17,11 @@ terraform {
required_providers {
google = {
source = "hashicorp/google"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
google-beta = {
source = "hashicorp/google-beta"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
}
}
-
-
diff --git a/modules/cloud-run/versions.tf b/modules/cloud-run/versions.tf
index 4a2837182..5ec74cff3 100644
--- a/modules/cloud-run/versions.tf
+++ b/modules/cloud-run/versions.tf
@@ -17,13 +17,11 @@ terraform {
required_providers {
google = {
source = "hashicorp/google"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
google-beta = {
source = "hashicorp/google-beta"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
}
}
-
-
diff --git a/modules/cloudsql-instance/versions.tf b/modules/cloudsql-instance/versions.tf
index 4a2837182..5ec74cff3 100644
--- a/modules/cloudsql-instance/versions.tf
+++ b/modules/cloudsql-instance/versions.tf
@@ -17,13 +17,11 @@ terraform {
required_providers {
google = {
source = "hashicorp/google"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
google-beta = {
source = "hashicorp/google-beta"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
}
}
-
-
diff --git a/modules/compute-mig/versions.tf b/modules/compute-mig/versions.tf
index 4a2837182..5ec74cff3 100644
--- a/modules/compute-mig/versions.tf
+++ b/modules/compute-mig/versions.tf
@@ -17,13 +17,11 @@ terraform {
required_providers {
google = {
source = "hashicorp/google"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
google-beta = {
source = "hashicorp/google-beta"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
}
}
-
-
diff --git a/modules/compute-vm/versions.tf b/modules/compute-vm/versions.tf
index 4a2837182..5ec74cff3 100644
--- a/modules/compute-vm/versions.tf
+++ b/modules/compute-vm/versions.tf
@@ -17,13 +17,11 @@ terraform {
required_providers {
google = {
source = "hashicorp/google"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
google-beta = {
source = "hashicorp/google-beta"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
}
}
-
-
diff --git a/modules/container-registry/versions.tf b/modules/container-registry/versions.tf
index 4a2837182..5ec74cff3 100644
--- a/modules/container-registry/versions.tf
+++ b/modules/container-registry/versions.tf
@@ -17,13 +17,11 @@ terraform {
required_providers {
google = {
source = "hashicorp/google"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
google-beta = {
source = "hashicorp/google-beta"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
}
}
-
-
diff --git a/modules/data-catalog-policy-tag/versions.tf b/modules/data-catalog-policy-tag/versions.tf
index 4a2837182..5ec74cff3 100644
--- a/modules/data-catalog-policy-tag/versions.tf
+++ b/modules/data-catalog-policy-tag/versions.tf
@@ -17,13 +17,11 @@ terraform {
required_providers {
google = {
source = "hashicorp/google"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
google-beta = {
source = "hashicorp/google-beta"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
}
}
-
-
diff --git a/modules/datafusion/versions.tf b/modules/datafusion/versions.tf
index 4a2837182..5ec74cff3 100644
--- a/modules/datafusion/versions.tf
+++ b/modules/datafusion/versions.tf
@@ -17,13 +17,11 @@ terraform {
required_providers {
google = {
source = "hashicorp/google"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
google-beta = {
source = "hashicorp/google-beta"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
}
}
-
-
diff --git a/modules/dataplex-datascan/versions.tf b/modules/dataplex-datascan/versions.tf
index 4a2837182..5ec74cff3 100644
--- a/modules/dataplex-datascan/versions.tf
+++ b/modules/dataplex-datascan/versions.tf
@@ -17,13 +17,11 @@ terraform {
required_providers {
google = {
source = "hashicorp/google"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
google-beta = {
source = "hashicorp/google-beta"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
}
}
-
-
diff --git a/modules/dataplex/versions.tf b/modules/dataplex/versions.tf
index 4a2837182..5ec74cff3 100644
--- a/modules/dataplex/versions.tf
+++ b/modules/dataplex/versions.tf
@@ -17,13 +17,11 @@ terraform {
required_providers {
google = {
source = "hashicorp/google"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
google-beta = {
source = "hashicorp/google-beta"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
}
}
-
-
diff --git a/modules/dataproc/versions.tf b/modules/dataproc/versions.tf
index 4a2837182..5ec74cff3 100644
--- a/modules/dataproc/versions.tf
+++ b/modules/dataproc/versions.tf
@@ -17,13 +17,11 @@ terraform {
required_providers {
google = {
source = "hashicorp/google"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
google-beta = {
source = "hashicorp/google-beta"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
}
}
-
-
diff --git a/modules/dns-response-policy/versions.tf b/modules/dns-response-policy/versions.tf
index 4a2837182..5ec74cff3 100644
--- a/modules/dns-response-policy/versions.tf
+++ b/modules/dns-response-policy/versions.tf
@@ -17,13 +17,11 @@ terraform {
required_providers {
google = {
source = "hashicorp/google"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
google-beta = {
source = "hashicorp/google-beta"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
}
}
-
-
diff --git a/modules/dns/versions.tf b/modules/dns/versions.tf
index 4a2837182..5ec74cff3 100644
--- a/modules/dns/versions.tf
+++ b/modules/dns/versions.tf
@@ -17,13 +17,11 @@ terraform {
required_providers {
google = {
source = "hashicorp/google"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
google-beta = {
source = "hashicorp/google-beta"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
}
}
-
-
diff --git a/modules/endpoints/versions.tf b/modules/endpoints/versions.tf
index 4a2837182..5ec74cff3 100644
--- a/modules/endpoints/versions.tf
+++ b/modules/endpoints/versions.tf
@@ -17,13 +17,11 @@ terraform {
required_providers {
google = {
source = "hashicorp/google"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
google-beta = {
source = "hashicorp/google-beta"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
}
}
-
-
diff --git a/modules/folder/versions.tf b/modules/folder/versions.tf
index 4a2837182..5ec74cff3 100644
--- a/modules/folder/versions.tf
+++ b/modules/folder/versions.tf
@@ -17,13 +17,11 @@ terraform {
required_providers {
google = {
source = "hashicorp/google"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
google-beta = {
source = "hashicorp/google-beta"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
}
}
-
-
diff --git a/modules/gcs/README.md b/modules/gcs/README.md
index 2c3a85e30..539d82ce6 100644
--- a/modules/gcs/README.md
+++ b/modules/gcs/README.md
@@ -53,7 +53,7 @@ module "bucket" {
location = "EU"
}
-# tftest skip e2e
+# tftest modules=3 skip e2e
```
### Example with retention policy and logging
diff --git a/modules/gcs/versions.tf b/modules/gcs/versions.tf
index 4a2837182..5ec74cff3 100644
--- a/modules/gcs/versions.tf
+++ b/modules/gcs/versions.tf
@@ -17,13 +17,11 @@ terraform {
required_providers {
google = {
source = "hashicorp/google"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
google-beta = {
source = "hashicorp/google-beta"
- version = ">= 5.6.0, < 6.0.0" # tftest
+ version = ">= 5.10.0, < 6.0.0" # tftest
}
}
}
-
-
diff --git a/modules/gcve-private-cloud/README.md b/modules/gcve-private-cloud/README.md
index 0e3a9ef7b..ee9f0a100 100644
--- a/modules/gcve-private-cloud/README.md
+++ b/modules/gcve-private-cloud/README.md
@@ -1,100 +1,134 @@
# Google Cloud VMWare Engine Private Cloud Module
-This module implements the creation and management of a Google Cloud VMWare Engine Private Cloud with its management cluster. If configured, it also creates the VMWare engine network or it can work with an existing one. The creation of the private connection with the user VPC requires the execution of the [Google SDK command](https://cloud.google.com/sdk/gcloud/reference/vmware/private-connections/create#--routing-mode) the module provides as an output.
+The module manages one or more Google Cloud VMWare Engine Private Clouds.
+
+It can either create a new VMWare engine network shared between the private clouds or it can use an existing one. The module also creates peering connections to users' VPCs or other VMware engine networks.
To understand the limits and to properly configure the vSphere/vSAN subnets CIDR range please refer to the [GCVE public documentation](https://cloud.google.com/vmware-engine/docs/quickstart-networking-requirements).
-Be aware that the deployment of this module might require up to 2 hours depending on the selected private cloud target zone.
+The deployment might require up to 2 hours, depending on the selected private cloud target zone.
- [Limitations](#limitations)
- [Basic Private Cloud Creation](#basic-private-cloud-creation)
-- [Private Cloud Creation with custom nodes and cores count](#private-cloud-creation-with-custom-nodes-and-cores-count)
+- [Customize management cluster configs](#customize-management-cluster-configs)
+- [Create additional clusters](#create-additional-clusters)
- [Variables](#variables)
- [Outputs](#outputs)
## Limitations
-At the moment this module doesn't support the following use cases:
-- Single node private cloud
-- Stretched private cloud
+
+The module (and the underlying resource) still don't support the creation of stretched (regional) private clouds.
## Basic Private Cloud Creation
```hcl
module "gcve-pc" {
source = "./fabric/modules/gcve-private-cloud"
- name = "gcve-pc"
+ prefix = "gcve-pc"
project_id = "gcve-test-project"
- zone = "europe-west8-a"
- cidr = "192.168.0.0/24"
- private_connections = {
+ vmw_network_peerings = {
transit-conn1 = {
- name = "transit-conn1"
- network_self_link = "projects/test-prj-gcve-01/global/networks/default"
- tenant_host_project = "g39a814990532d10ap-tp"
- type = "PRIVATE_SERVICE_ACCESS"
- routing_mode = "REGIONAL"
+ peer_network = "projects/test-prj-gcve-01/global/networks/default"
+ }
+ }
+
+ vmw_private_cloud_configs = {
+ pcc_one = {
+ cidr = "192.168.0.0/24"
+ zone = "europe-west8-a"
}
}
}
-# tftest modules=1 resources=2 inventory=basic.yaml
+# tftest modules=1 resources=3 inventory=basic.yaml
```
-## Private Cloud Creation with custom nodes and cores count
+
+## Customize management cluster configs
+
+You can customize the management cluster of each VMware engine private cloud.
```hcl
module "gcve-pc" {
source = "./fabric/modules/gcve-private-cloud"
- name = "gcve-pc"
+ prefix = "gcve-pc"
project_id = "gcve-test-project"
- zone = "europe-west8-a"
- cidr = "192.168.0.0/24"
- management_cluster_config = {
- node_type_id = "standard-72"
- node_count = 6
- custom_core_count = 28
+ vmw_network_peerings = {
+ transit-conn1 = {
+ peer_network = "projects/test-prj-gcve-01/global/networks/default"
+ }
}
- private_connections = {
- transit-conn1 = {
- name = "transit-conn1"
- network_self_link = "projects/test-prj-gcve-01/global/networks/default"
- tenant_host_project = "g39a814990532d10ap-tp"
- type = "PRIVATE_SERVICE_ACCESS"
- routing_mode = "REGIONAL"
+ vmw_private_cloud_configs = {
+ pcc_one = {
+ cidr = "192.168.0.0/24"
+ management_cluster_config = {
+ node_type_id = "standard-72"
+ node_count = 6
+ custom_core_count = 28
+ }
+ zone = "europe-west8-a"
}
}
}
-# tftest modules=1 resources=2 inventory=custom.yaml
+# tftest modules=1 resources=3 inventory=custom-management.yaml
+```
+
+## Create additional clusters
+
+You can optionally create additional clusters in each VMware engine private cloud.
+
+```hcl
+module "gcve-pc" {
+ source = "./fabric/modules/gcve-private-cloud"
+ prefix = "gcve-pc"
+ project_id = "gcve-test-project"
+
+ vmw_network_peerings = {
+ transit-conn1 = {
+ peer_network = "projects/test-prj-gcve-01/global/networks/default"
+ }
+ }
+
+ vmw_private_cloud_configs = {
+ pcc_one = {
+ cidr = "192.168.0.0/24"
+ additional_cluster_configs = {
+ test-cluster-one = {
+ node_type_id = "standard-72"
+ node_count = 6
+ custom_core_count = 28
+ }
+ test-cluster-two = {
+ node_type_id = "standard-72"
+ node_count = 4
+ custom_core_count = 28
+ }
+ }
+ zone = "europe-west8-a"
+ }
+ }
+}
+# tftest modules=1 resources=5 inventory=additional-clusters.yaml
```
## Variables
| name | description | type | required | default |
|---|---|:---:|:---:|:---:|
-| [cidr](variables.tf#L16) | vSphere/vSAN subnets CIDR range. To undersatnd the limits, please refer to [GCVE network requirements](https://cloud.google.com/vmware-engine/docs/quickstart-networking-requirements). | string | ✓ | |
-| [name](variables.tf#L42) | Private cloud name. | string | ✓ | |
-| [project_id](variables.tf#L84) | Project id. | string | ✓ | |
-| [zone](variables.tf#L101) | Private cloud zone. | string | ✓ | |
-| [description](variables.tf#L21) | Private cloud description. | string | | "Terraform-managed." |
-| [management_cluster_config](variables.tf#L27) | Management cluster configuration. | object({…}) | | {…} |
-| [private_connections](variables.tf#L47) | VMWare private connections configuration. It is used to create the gcloud command printed as output. | map(object({…})) | | {} |
-| [vmw_network_create](variables.tf#L89) | Create the VMware Engine network. When set to false, it uses a data source to reference an existing VMware Engine network. | bool | | true |
-| [vmw_network_description](variables.tf#L95) | VMware Engine network description. | string | | "Terraform-managed." |
+| [prefix](variables.tf#L17) | Resources name prefix. | string | ✓ | |
+| [project_id](variables.tf#L22) | Project id. | string | ✓ | |
+| [vmw_network_config](variables.tf#L27) | VMware Engine network configuration. | object({…}) | | {} |
+| [vmw_network_peerings](variables.tf#L37) | The network peerings towards users' VPCs or other VMware Engine networks. The key is the peering name suffix. | map(object({…})) | | {} |
+| [vmw_private_cloud_configs](variables.tf#L51) | The VMware private cloud configurations. The key is the unique private cloud name suffix. | map(object({…})) | | {…} |
## Outputs
| name | description | sensitive |
|---|---|:---:|
-| [hcx](outputs.tf#L17) | Details about a HCX Cloud Manager appliance. | |
-| [id](outputs.tf#L22) | ID of the private cloud. | |
-| [management_cluster](outputs.tf#L27) | Details of the management cluster of the private cloud. | |
-| [network_config](outputs.tf#L32) | Details about the network configuration of the private cloud. | |
-| [nsx](outputs.tf#L37) | Details about a NSX Manager appliance. | |
-| [private-cloud](outputs.tf#L42) | The private cloud resource. | |
-| [private_connections_setup](outputs.tf#L47) | Cloud SDK commands for the private connections manual setup. | |
-| [state](outputs.tf#L63) | Details about the state of the private cloud. | |
-| [vcenter](outputs.tf#L68) | Details about a vCenter Server management appliance. | |
+| [vmw_engine_network_config](outputs.tf#L17) | VMware engine network configuration. | |
+| [vmw_engine_network_peerings](outputs.tf#L22) | The peerings created towards the user VPC or other VMware engine networks. | |
+| [vmw_engine_private_clouds](outputs.tf#L27) | VMware engine private cloud resources. | |
diff --git a/modules/gcve-private-cloud/main.tf b/modules/gcve-private-cloud/main.tf
index 3235fb29a..9e9579c41 100644
--- a/modules/gcve-private-cloud/main.tf
+++ b/modules/gcve-private-cloud/main.tf
@@ -15,61 +15,87 @@
*/
locals {
- region = regex("([a-z]*-[a-z]*[0-9]{1,2})-([a-z])", var.zone)[0]
+ # Creates a map of additional clusters objects, including their parent private cloud
+ additional_cluster_configs = merge(
+ [for pcc_name, pcc in var.vmw_private_cloud_configs
+ : { for cluster_name, cluster in pcc.additional_cluster_configs
+ : "${cluster_name}" => merge(
+ cluster,
+ { parent = try(google_vmwareengine_private_cloud.vmw_engine_private_clouds[pcc_name].id, null) }
+ )
+ }
+ ]...)
vmw_network = (
- var.vmw_network_create
- ? try(google_vmwareengine_network.private-cloud-network.0, null)
- : try(data.google_vmwareengine_network.private-cloud-network.0, null)
+ var.vmw_network_config.create
+ ? try(google_vmwareengine_network.private_cloud_network.0, null)
+ : try(data.google_vmwareengine_network.private_cloud_network.0, null)
)
- tenant_host_project = {
- for k, v in var.private_connections : k => v.tenant_host_project == null
- ? regex("(.*)/projects/([a-z0-9-]*)/(.*)", "${data.google_compute_network_peering.psa_peering[k].peer_network}")[1]
- : v.tenant_host_project
- }
}
-data "google_vmwareengine_network" "private-cloud-network" {
- count = var.vmw_network_create ? 0 : 1
- provider = google-beta
- project = var.project_id
- name = "${local.region}-default"
- location = local.region
-}
-
-data "google_compute_network_peering" "psa_peering" {
- for_each = { for k, v in var.private_connections : k => v if v.tenant_host_project == null }
- name = each.value.peering_name
- network = each.value.network_self_link
-}
-
-resource "google_vmwareengine_private_cloud" "private-cloud" {
+resource "google_vmwareengine_network" "private_cloud_network" {
provider = google-beta
+ count = var.vmw_network_config.create ? 1 : 0
project = var.project_id
- location = var.zone
- name = var.name
- description = var.description
+ name = "${var.prefix}-${var.vmw_network_config.name}"
+ description = var.vmw_network_config.description
+ location = "global"
+ type = "STANDARD"
+}
+
+data "google_vmwareengine_network" "private_cloud_network" {
+ provider = google-beta
+ count = var.vmw_network_config.create ? 0 : 1
+ project = var.project_id
+ name = "${var.prefix}-${var.vmw_network_config.name}"
+ location = "global"
+}
+
+resource "google_vmwareengine_network_peering" "vmw_engine_network_peerings" {
+ provider = google-beta
+ for_each = var.vmw_network_peerings
+ project = var.project_id
+ name = "${var.prefix}-${each.key}"
+ description = each.value.description
+ export_custom_routes = each.value.export_custom_routes
+ export_custom_routes_with_public_ip = each.value.export_custom_routes_with_public_ip
+ import_custom_routes = each.value.import_custom_routes
+ import_custom_routes_with_public_ip = each.value.import_custom_routes_with_public_ip
+ peer_network = each.value.peer_network
+ peer_network_type = each.value.peer_to_vmware_engine_network ? "VMWARE_ENGINE_NETWORK" : "STANDARD"
+ vmware_engine_network = local.vmw_network.id
+}
+
+resource "google_vmwareengine_private_cloud" "vmw_engine_private_clouds" {
+ provider = google-beta
+ for_each = var.vmw_private_cloud_configs
+ project = var.project_id
+ location = each.value.zone
+ name = "${var.prefix}-${each.key}"
+ description = each.value.description
network_config {
- management_cidr = var.cidr
+ management_cidr = each.value.cidr
vmware_engine_network = local.vmw_network.id
}
management_cluster {
- cluster_id = "${var.name}-mgmt-cluster"
+ cluster_id = "${var.prefix}-${each.key}-${each.value.management_cluster_config.name}"
node_type_configs {
- node_type_id = var.management_cluster_config.node_type_id
- node_count = var.management_cluster_config.node_count
- custom_core_count = var.management_cluster_config.custom_core_count
+ node_type_id = each.value.management_cluster_config.node_type_id
+ node_count = each.value.management_cluster_config.node_count
+ custom_core_count = each.value.management_cluster_config.custom_core_count
}
}
}
-resource "google_vmwareengine_network" "private-cloud-network" {
- count = var.vmw_network_create ? 1 : 0
- provider = google-beta
- project = var.project_id
- name = "${local.region}-default"
- location = local.region
- type = "LEGACY"
- description = var.vmw_network_description
+resource "google_vmwareengine_cluster" "vmw_engine_additional_clusters" {
+ provider = google-beta
+ for_each = local.additional_cluster_configs
+ name = "${var.prefix}-${each.key}"
+ parent = each.value.parent
+ node_type_configs {
+ custom_core_count = each.value.custom_core_count
+ node_count = each.value.node_count
+ node_type_id = each.value.node_type_id
+ }
}
diff --git a/modules/gcve-private-cloud/outputs.tf b/modules/gcve-private-cloud/outputs.tf
index 55578f6d2..e3812b7f8 100644
--- a/modules/gcve-private-cloud/outputs.tf
+++ b/modules/gcve-private-cloud/outputs.tf
@@ -14,58 +14,17 @@
* limitations under the License.
*/
-output "hcx" {
- description = "Details about a HCX Cloud Manager appliance."
- value = google_vmwareengine_private_cloud.private-cloud.hcx
+output "vmw_engine_network_config" {
+ description = "VMware engine network configuration."
+ value = local.vmw_network
}
-output "id" {
- description = "ID of the private cloud."
- value = google_vmwareengine_private_cloud.private-cloud.id
+output "vmw_engine_network_peerings" {
+ description = "The peerings created towards the user VPC or other VMware engine networks."
+ value = google_vmwareengine_network_peering.vmw_engine_network_peerings
}
-output "management_cluster" {
- description = "Details of the management cluster of the private cloud."
- value = google_vmwareengine_private_cloud.private-cloud.management_cluster
-}
-
-output "network_config" {
- description = "Details about the network configuration of the private cloud."
- value = google_vmwareengine_private_cloud.private-cloud.network_config
-}
-
-output "nsx" {
- description = "Details about a NSX Manager appliance."
- value = google_vmwareengine_private_cloud.private-cloud.nsx
-}
-
-output "private-cloud" {
- description = "The private cloud resource."
- value = google_vmwareengine_private_cloud.private-cloud
-}
-
-output "private_connections_setup" {
- description = "Cloud SDK commands for the private connections manual setup."
- value = {
- for k, v in var.private_connections : k => <