From 8d8ed82bb0efbe5331c345675617d2fafe7af63a Mon Sep 17 00:00:00 2001 From: Liam Fallon <35595825+liamfallon@users.noreply.github.com> Date: Thu, 1 Feb 2024 17:58:52 +0000 Subject: [PATCH 01/20] Update text on Nephio landing page to be release-neutral (#101) This PR makes minor changes to the landing page of the documentation to make the language release neutral. --- README.md | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index e1e37c6a..d07eaa5b 100644 --- a/README.md +++ b/README.md @@ -27,16 +27,13 @@ To build and see the documentation locally run `hugo serve`. To double-check if --gc --minify`. -# Nephio R1 +# Nephio -Welcome to the R1 release of Nephio. Please use the documentation links below to -learn more about Nephio R1, or checkout our [Learning Nephio with -R1](https://wiki.nephio.org/display/HOME/Learning+with+Nephio+R1) series, which -includes a [demo video](https://youtu.be/mFl71sy2Pdc) and short articles about -different aspects of R1. +Welcome to Nephio! Please use the documentation links below to +learn more about Nephio, or check out our [Learning Nephio](https://wiki.nephio.org/display/HOME/Learning+with+Nephio+R1) series. The video series includes a [demo video](https://youtu.be/mFl71sy2Pdc) and short articles about different aspects of Nephio. ## User Documentation -* [Release Notes](/content/en/docs/release-notes) +* [Release Notes for each Nephio release](/content/en/docs/release-notes) * [Demo Sandbox Environment Installation](/content/en/docs/guides/install-guides/_index.md) * [Quick Start Exercises](/content/en/docs/guides/user-guides/_index.md) * [User Guide](/content/en/docs/guides/user-guides/_index.md) @@ -47,7 +44,7 @@ different aspects of R1. * [Developer Guide](/content/en/docs/guides/contributor-guides/_index.md) * [Project Resources](https://github.com/nephio-project/docs/blob/main/resources.md) -## About Nephio R1 +## About Nephio Our mission is "to deliver carrier-grade, simple, open, Kubernetes-based cloud native intent automation and common automation templates that materially @@ -122,7 +119,7 @@ This challenge is currently left to ad hoc processes that differ across organizations. Nephio is working on how to structure the intent to make it manageable using data management techniques. -This release of Nephio focuses: +The releases of Nephio to date focus on: - Demonstrating the core Nephio principles such as Configuration-as-Data and leveraging the intent-driven, active-reconciliation nature of Kubernetes. - Infrastructure orchestration/automation using controllers based on @@ -131,7 +128,7 @@ This release of Nephio focuses: management. This release focuses on network functions from [free5gc](https://free5gc.org/). -While the current release uses Cluster API, KIND, and free5gc for demonstration +While the releases to date use Cluster API, KIND, free5gc and OAI for demonstration purposes, the exact same principles and even code can be used for managing other infrastructure and network functions. The *uniformity in systems* principle means that as long as something is manageable via the Kubernetes Resource Model, From 994ff89f19f6a5742880a27e5bd8f0f2377fed40 Mon Sep 17 00:00:00 2001 From: Liam Fallon <35595825+liamfallon@users.noreply.github.com> Date: Fri, 2 Feb 2024 10:53:53 +0000 Subject: [PATCH 02/20] Fix Hugo relref references to work in md (#100) This PR fixes the "ref" and "relref" links in the documentation so that they work in Markdown and thus Github. This will mean the links will not work in the Hugo documentation. We need to figure out a way to get the links working in both but they really should work in Github. The links are now all absolute links in order to pass linkspector and to work in md. The linkspector tool fails on any link with a '#' in it, that is a link to a tag in any document. The change to the .linkspector file is to remove the '#' character and any following text, thus allowing those links to pass linkspector. --- .linkspector.yml | 4 +++- content/en/docs/abbreviations.md | 2 +- .../en/docs/guides/contributor-guides/_index.md | 2 +- .../en/docs/guides/contributor-guides/doc-faq.md | 16 ++++++++++++++++ content/en/docs/guides/install-guides/_index.md | 8 ++++---- .../install-guides/explore-nephio-free5gc.md | 6 +++--- .../guides/install-guides/explore-sandbox.md | 2 +- .../guides/install-guides/install-on-byoc.md | 10 +++++----- .../docs/guides/install-guides/install-on-gce.md | 8 ++++---- .../docs/guides/install-guides/install-on-gcp.md | 11 ++++++----- .../install-guides/install-on-openshift.md | 3 ++- .../install-guides/install-on-single-vm.md | 4 ++-- content/en/docs/guides/install-guides/webui.md | 4 ++-- content/en/docs/guides/user-guides/_index.md | 8 ++++---- .../guides/user-guides/exercise-1-free5gc.md | 4 ++-- .../en/docs/guides/user-guides/exercise-2-oai.md | 2 +- .../en/docs/guides/user-guides/helm/_index.md | 2 +- .../en/docs/guides/user-guides/helm/flux-helm.md | 8 ++++---- content/en/docs/release-notes/R1.md | 2 +- content/en/docs/release-notes/R2.md | 2 +- resources.md | 4 ++-- 21 files changed, 66 insertions(+), 46 deletions(-) create mode 100644 content/en/docs/guides/contributor-guides/doc-faq.md diff --git a/.linkspector.yml b/.linkspector.yml index e5b4399e..e73b0822 100644 --- a/.linkspector.yml +++ b/.linkspector.yml @@ -10,4 +10,6 @@ aliveStatusCodes: ignorePatterns: - pattern: "^http://localhost.*$" - pattern: "^http://HOSTNAME:PORT.*$" - \ No newline at end of file +replacementPatterns: + - pattern: ".md#.*$" + replacement: ".md" \ No newline at end of file diff --git a/content/en/docs/abbreviations.md b/content/en/docs/abbreviations.md index 7c09eb0b..f03dcb7b 100644 --- a/content/en/docs/abbreviations.md +++ b/content/en/docs/abbreviations.md @@ -5,7 +5,7 @@ weight: 3 --- This page gives brief explanations of abbreviations used in the Nephio project. See also the -[Nephio Glossary]({{< ref "glossary.md" >}}) for more detailed descriptions of Nephio related terms. +[Nephio Glossary](/content/en/docs/glossary.md) for more detailed descriptions of Nephio related terms. ## Nephio related abbreviations * NF: Network Function diff --git a/content/en/docs/guides/contributor-guides/_index.md b/content/en/docs/guides/contributor-guides/_index.md index 934acd7e..79a31d8f 100644 --- a/content/en/docs/guides/contributor-guides/_index.md +++ b/content/en/docs/guides/contributor-guides/_index.md @@ -11,5 +11,5 @@ This developer guide is for for people who want to write code for the Nephio pro extension of the [Kubernetes Developer Guides](https://github.com/kubernetes/community/tree/master/contributors/devel#the-process-of-developing-and-contributing-code-to-the-kubernetes-project) and therefore covers topics that are specific to Nephio development. -* How to set up a [Minimal Development Environment]({{< relref "minimal-environment.md" >}}) defines common terminology +* How to set up a [Minimal Development Environment](/content/en/docs/guides/contributor-guides/minimal-environment.md) defines common terminology used in the Nephio project. \ No newline at end of file diff --git a/content/en/docs/guides/contributor-guides/doc-faq.md b/content/en/docs/guides/contributor-guides/doc-faq.md new file mode 100644 index 00000000..74495cb0 --- /dev/null +++ b/content/en/docs/guides/contributor-guides/doc-faq.md @@ -0,0 +1,16 @@ +--- +title: Nephio Documentation System FAQ +description: > + Frequently Asked Questions on the Nephio Documentation system +weight: 5 +--- + +# Frequently Asked Questions on the Nephio Documentation system + +1. How do I check the documentation links on the documentation before I check in my changes? + + Install and run *linkspector* + ``` + npm install -g @umbrelladocs/linkspector + linkinspector check -c .linkspector.yml + ``` \ No newline at end of file diff --git a/content/en/docs/guides/install-guides/_index.md b/content/en/docs/guides/install-guides/_index.md index 82a9e99f..63f3fd4c 100644 --- a/content/en/docs/guides/install-guides/_index.md +++ b/content/en/docs/guides/install-guides/_index.md @@ -173,7 +173,7 @@ ssh @ ## Next Steps -* Step through the [Free5GC]({{< relref "exercise-1-free5gc.md" >}}) and [OAI]({{< relref "exercise-2-oai.md" >}}) exercises -* Learn more about the [Nephio demo sandbox]({{< relref "explore-sandbox.md" >}}) -* Dig into the [user guide]({{< ref "user-guides#nephio-r1-user-guide" >}}) -* Create a [Bring-Your-Own-Cluster]({{< relref "install-on-byoc.md" >}}) Nephio Installation +* Step through the [Free5GC](/content/en/docs/guides/user-guides/exercise-1-free5gc.md) and [OAI](/content/en/docs/guides/user-guides/exercise-2-oai.md) exercises +* Learn more about the [Nephio demo sandbox](/content/en/docs/guides/install-guides/explore-sandbox.md) +* Dig into the [user guide](/content/en/docs/guides/user-guides/_index.md) +* Create a [Bring-Your-Own-Cluster](/content/en/docs/guides/install-guides/install-on-byoc.md) Nephio Installation diff --git a/content/en/docs/guides/install-guides/explore-nephio-free5gc.md b/content/en/docs/guides/install-guides/explore-nephio-free5gc.md index 7eb46ac7..0636647c 100644 --- a/content/en/docs/guides/install-guides/explore-nephio-free5gc.md +++ b/content/en/docs/guides/install-guides/explore-nephio-free5gc.md @@ -5,9 +5,9 @@ description: > weight: 6 --- -Concepts as [Operator]({{< ref "/docs/glossary.md#operator" >}}) and -[Controller]({{< ref "/docs/glossary.md#controller" >}}) and -[CR]({{< ref "/docs/glossary.md#custom-resource" >}}) have already been explained here. +Concepts as [Operator](/content/en/docs/glossary.md#operator) and +[Controller](/content/en/docs/glossary.md#controller) and +[CR](/content/en/docs/glossary.md#custom-resource) have already been explained here. # Deploy the operator to the cluster diff --git a/content/en/docs/guides/install-guides/explore-sandbox.md b/content/en/docs/guides/install-guides/explore-sandbox.md index 49560638..ff8ba5dd 100644 --- a/content/en/docs/guides/install-guides/explore-sandbox.md +++ b/content/en/docs/guides/install-guides/explore-sandbox.md @@ -6,7 +6,7 @@ weight: 5 --- -You have installed the Nephio single VM [using the installation instructions]({{< relref "install-on-single-vm.md" >}}). +You have installed the Nephio single VM [using the installation instructions](/content/en/docs/guides/install-guides/install-on-single-vm.md). The installation has done a good job of installing a complex software stack without any fuss. Let's take a look around. ![Software Installed by the Nephio Sandbox Installation](/images/install-guides/ManagementCluster.png) diff --git a/content/en/docs/guides/install-guides/install-on-byoc.md b/content/en/docs/guides/install-guides/install-on-byoc.md index 1ded8b94..4ef4d3f3 100644 --- a/content/en/docs/guides/install-guides/install-on-byoc.md +++ b/content/en/docs/guides/install-guides/install-on-byoc.md @@ -67,9 +67,9 @@ options, if you wish to assemble your own set of components. | Environment | Description | | ----------- | ---------------------------------------------------------- | -| [Single VM]({{< relref "install-on-single-vm.md" >}}) | The single VM demo environment, set up "the hard way" - without using the included provisioning script. This creates a complete Nephio-in-a-VM, just like the R1 demo environment. These instructions cover both Ubuntu and Fedora. | -| [Google Cloud Platform]({{< relref "install-on-gcp.md" >}}) | Nephio running in GCP. A GKE cluster is used as the management cluster, with Anthos Config Controller for GCP infrastructure provisioning, Gitea as the Git provider, and Web UI authentication and authorization via Google OAuth 2.0 | -| [OpenShift]({{< relref "install-on-openshift.md" >}}) | Nephio running in OpenShift, with Cluster API as the cluster provisioner, Gitea as the Git provider and Web UI authentication backed by Open Shift OIDC. | +| [Single VM](/content/en/docs/guides/install-guides/install-on-single-vm.md) | The single VM demo environment, set up "the hard way" - without using the included provisioning script. This creates a complete Nephio-in-a-VM, just like the R1 demo environment. These instructions cover both Ubuntu and Fedora. | +| [Google Cloud Platform](/content/en/docs/guides/install-guides/install-on-gcp.md) | Nephio running in GCP. A GKE cluster is used as the management cluster, with Anthos Config Controller for GCP infrastructure provisioning, Gitea as the Git provider, and Web UI authentication and authorization via Google OAuth 2.0 | +| [OpenShift](/content/en/docs/guides/install-guides/install-on-openshift.md) | Nephio running in OpenShift, with Cluster API as the cluster provisioner, Gitea as the Git provider and Web UI authentication backed by Open Shift OIDC. | ## A La Carte Installation @@ -146,8 +146,8 @@ development it must not be exposed on the internet (for example, via a LoadBalancer service, Ingress, or Route). The WebUI currently supports the following options: -- [Google OAuth or OIDC]({{< relref "webui-auth-gcp.md" >}}) -- [OIDC with Okta]({{< relref "webui-auth-okta.md" >}}) +- [Google OAuth or OIDC](/content/en/docs/guides/install-guides/webui-auth-gcp.md) +- [OIDC with Okta](/content/en/docs/guides/install-guides/webui-auth-okta.md) ### Nephio Stock Repositories diff --git a/content/en/docs/guides/install-guides/install-on-gce.md b/content/en/docs/guides/install-guides/install-on-gce.md index e4055e94..cca390a7 100644 --- a/content/en/docs/guides/install-guides/install-on-gce.md +++ b/content/en/docs/guides/install-guides/install-on-gce.md @@ -174,7 +174,7 @@ ssh @ ## Next Steps * Step through the exercises - * [Free5GC Testbed Deployment and E2E testing with UERANSIM]({{< relref "/docs/guides/user-guides/exercise-1-free5gc.md" >}}) - * [OAI Core and RAN Testbed Deployment and E2E testing]({{< relref "/docs/guides/user-guides/exercise-2-oai.md" >}}) -* Learn more about the [Nephio demo sandbox]({{< relref "explore-sandbox.md" >}}) -* Dig into the [user guide]({{< relref "/docs/guides/user-guides/_index.md" >}}) + * [Free5GC Testbed Deployment and E2E testing with UERANSIM](/content/en/docs/guides/user-guides/exercise-1-free5gc.md) + * [OAI Core and RAN Testbed Deployment and E2E testing](/content/en/docs/guides/user-guides/exercise-2-oai.md) +* Learn more about the [Nephio demo sandbox](/content/en/docs/guides/install-guides/explore-sandbox.md) +* Dig into the [user guide](/content/en/docs/guides/user-guides/_index.md) diff --git a/content/en/docs/guides/install-guides/install-on-gcp.md b/content/en/docs/guides/install-guides/install-on-gcp.md index 06f77cb8..4cfd3892 100644 --- a/content/en/docs/guides/install-guides/install-on-gcp.md +++ b/content/en/docs/guides/install-guides/install-on-gcp.md @@ -1022,9 +1022,9 @@ git commit -m "Initial checking of nephio-mgmt" **Prior to deploying the package, we need to manually setup the secret for the WebUI.** -See [Google OAuth 2.0 or OIDC]({{< relref "webui-auth-gcp.md" >}}) for details on how to -set up OAuth. In particular you need to [create the client ID]({{< relref "webui-auth-gcp.md#creating-an-oauth-20-client-id" >}}) -and the [secret]({{< relref "webui-auth-gcp.md#create-the-secret-in-the-cluster" >}}) +See [Google OAuth 2.0 or OIDC](/content/en/docs/guides/install-guides/webui-auth-gcp.md) for details on how to +set up OAuth. In particular you need to [create the client ID](/content/en/docs/guides/install-guides/webui-auth-gcp.md#creating-an-oauth-20-client-id) +and the [secret](/content/en/docs/guides/install-guides/webui-auth-gcp.md#create-the-secret-in-the-cluster) manually. The `nephio-webui` subpackage in `nephio-mgmt` is already set up for @@ -1384,5 +1384,6 @@ Note that the exercises using free5gc rely on Multus and on the gtp5g kernel mod GKE nodes. Therefore, the free5gc workloads cannot be run on this installation. You will need to alter the exercises to\ use workloads that do not rely on that functionality in order to experiment with Nephio features. -* Step through the [Free5GC]({{< relref "exercise-1-free5gc.md" >}}) and [OAI]({{< relref "exercise-2-oai.md" >}}) exercises -* Dig into the [user guide]({{< relref "/docs/guides/user-guides/_index.md" >}}) +* Step through the [Free5GC](/content/en/docs/guides/user-guides/exercise-1-free5gc.md) and +[OAI](/content/en/docs/guides/user-guides/exercise-2-oai.md) exercises +* Dig into the [user guide](/content/en/docs/guides/user-guides/_index.md) diff --git a/content/en/docs/guides/install-guides/install-on-openshift.md b/content/en/docs/guides/install-guides/install-on-openshift.md index e982ee82..a1015e2b 100644 --- a/content/en/docs/guides/install-guides/install-on-openshift.md +++ b/content/en/docs/guides/install-guides/install-on-openshift.md @@ -70,7 +70,8 @@ Application: oc apply -f https://raw.githubusercontent.com/openshift-telco/blueprints-nephio-openshift/v1.0.1/nephio-mgnt/app-of-apps.yaml ``` -This will take care of applying the [common dependencies]({{< relref "common-dependencies.md" >}}) and the [common components]({{< relref "common-components.md" >}}) +This will take care of applying the [common dependencies](/content/en/docs/guides/install-guides/common-dependencies.md) +and the [common components](/content/en/docs/guides/install-guides/common-components.md) ### Access the Nephio diff --git a/content/en/docs/guides/install-guides/install-on-single-vm.md b/content/en/docs/guides/install-guides/install-on-single-vm.md index 3be4e444..87d9b69b 100644 --- a/content/en/docs/guides/install-guides/install-on-single-vm.md +++ b/content/en/docs/guides/install-guides/install-on-single-vm.md @@ -65,12 +65,12 @@ kpt live apply gitea --reconcile-timeout 15m --output=table There are a few dependencies that are common across most installations, and do not require any installation-specific setup. You should install these next, as described in the -[common dependencies documentation]({{< relref "common-dependencies.md" >}}). +[common dependencies documentation](/content/en/docs/guides/install-guides/common-dependencies.md). ## Common Components With the necessary dependencies now installed, you can now install the essential Nephio components. This is documented -in the [common components documentation]({{< relref "common-components.md" >}}). +in the [common components documentation](/content/en/docs/guides/install-guides/common-components.md). ## Provisioning Cluster API diff --git a/content/en/docs/guides/install-guides/webui.md b/content/en/docs/guides/install-guides/webui.md index 61e05e2e..953876a7 100644 --- a/content/en/docs/guides/install-guides/webui.md +++ b/content/en/docs/guides/install-guides/webui.md @@ -54,8 +54,8 @@ service). Configuring authentication for the WebUI is very specific to the particular cluster environment. Guides for different environments are below: -- [Google OAuth or OIDC]({{< relref "/webui-auth-gcp.md" >}}) -- [OIDC with Okta]({{< relref "/webui-auth-okta.md" >}}) +- [Google OAuth or OIDC](/content/en/docs/guides/install-guides/webui-auth-gcp.md) +- [OIDC with Okta](/content/en/docs/guides/install-guides/webui-auth-okta.md) Once that configuration is updated, you can proceed with the installation (note, this uses `inventory-policy=adopt`, since in the previous steps we may have created the namespace already). diff --git a/content/en/docs/guides/user-guides/_index.md b/content/en/docs/guides/user-guides/_index.md index e0717a3b..43b65121 100644 --- a/content/en/docs/guides/user-guides/_index.md +++ b/content/en/docs/guides/user-guides/_index.md @@ -330,10 +330,10 @@ The diagram below depicts deployment at the high level. On the demo VM, the `test-infra/e2e/provision/hacks` directory contains some workaround scripts. Also, please see the Release Notes -[known issues]({{< relref "../../release-notes/r1#known-issues-and-workarounds">}}). +[known issues](/content/en/docs/release-notes/R2.md#known-issues-and-workarounds). ## Next Steps -* Learn more about the Nephio [controllers]({{< relref "controllers.md" >}}) -* Learn more about how packages are [transformed]({{< relref "../install-guides/package-transformations.md" >}}) -* Learn more about [deploying helm charts]({{< relref "../user-guides/helm/#helm-integration-in-nephio" >}}) in Nephio +* Learn more about the Nephio [controllers](/content/en/docs/guides/user-guides/controllers.md) +* Learn more about how packages are [transformed](/content/en/docs/guides/install-guides/package-transformations.md) +* Learn more about [deploying helm charts](/content/en/docs/guides/user-guides/helm/_index.md) in Nephio diff --git a/content/en/docs/guides/user-guides/exercise-1-free5gc.md b/content/en/docs/guides/user-guides/exercise-1-free5gc.md index dd21fec1..b41409e8 100644 --- a/content/en/docs/guides/user-guides/exercise-1-free5gc.md +++ b/content/en/docs/guides/user-guides/exercise-1-free5gc.md @@ -20,7 +20,7 @@ weight: 2 ## Introduction -Be sure you have followed the [installation guide]({{< ref "docs/guides/install-guides ">}}) +Be sure you have followed the [installation guide](/content/en/docs/guides/install-guides/_index.md) before trying these exercises. These exercises will take you from a system with only the Nephio Management cluster setup to a deployment with: @@ -995,7 +995,7 @@ commits to see how Porch interacts with packages stored in Git repositories. ![Commits in Gitea made by porch](/images/user-guides/gitea-porch.png) After the package is approved, the results can be observed in Nephio Web UI. Head over to http://localhost:7007/config-as-data -([port forwarding]({{< ref "docs/guides/install-guides/#access-to-the-user-interfaces" >}}) must be running). +([port forwarding](/content/en/docs/guides/install-guides/_index.md#access-to-the-user-interfaces) must be running). ![Deployments in Nephio UI](/images/user-guides/UPF-Capacity.png) diff --git a/content/en/docs/guides/user-guides/exercise-2-oai.md b/content/en/docs/guides/user-guides/exercise-2-oai.md index 25920c8f..2292dc75 100644 --- a/content/en/docs/guides/user-guides/exercise-2-oai.md +++ b/content/en/docs/guides/user-guides/exercise-2-oai.md @@ -19,7 +19,7 @@ weight: 2 ## Introduction -Be sure you have followed the [installation guide]({{< ref "docs/guides/install-guides ">}}) +Be sure you have followed the [installation guide](/content/en/docs/guides/install-guides/_index.md) before trying these exercises. These exercises will take you from a system with only the Nephio Management cluster setup to a deployment with: diff --git a/content/en/docs/guides/user-guides/helm/_index.md b/content/en/docs/guides/user-guides/helm/_index.md index 039942f7..f4f78d1d 100644 --- a/content/en/docs/guides/user-guides/helm/_index.md +++ b/content/en/docs/guides/user-guides/helm/_index.md @@ -16,6 +16,6 @@ for deploying on Kubernetes, legacy helm support will be required for a number o ### Deployment options -* [Using Flux CD]({{< ref "flux-helm.md" >}}) +* [Using Flux CD](/content/en/docs/guides/user-guides/helm/flux-helm.md) * [Operator SDK](https://sdk.operatorframework.io/docs/building-operators/helm/) diff --git a/content/en/docs/guides/user-guides/helm/flux-helm.md b/content/en/docs/guides/user-guides/helm/flux-helm.md index f116f64c..4905c960 100644 --- a/content/en/docs/guides/user-guides/helm/flux-helm.md +++ b/content/en/docs/guides/user-guides/helm/flux-helm.md @@ -16,11 +16,11 @@ Then, we can utilize the flux Custom Resources defined in another test kpt packa ## Prerequisites: -* [Nephio R1 sandbox]({{< ref "/docs/guides/install-guides/" >}}): Set up the Nephio sandbox environment. -* [Access to the Nephio Web UI]({{< ref "/docs/guides/install-guides/#access-to-the-user-interfaces" >}}) -* [Nephio R1 sandbox workload clusters]({{< ref "/docs/guides/user-guides/exercise-1-free5gc.md" >}}): +* [Nephio R1 sandbox]/content/en/docs/guides/install-guides/install-guides/_index.md): Set up the Nephio sandbox environment. +* [Access to the Nephio Web UI](/content/en/docs/guides/install-guides/_index.md#access-to-the-user-interfaces) +* [Nephio R1 sandbox workload clusters](/content/en/docs/guides/user-guides/exercise-1-free5gc.md): Create/Deploy the predefined set of workload clusters by completing the Free5GC Core quick start exercises up to and including - [Step 3]({{< ref "/docs/guides/user-guides/exercise-1-free5gc.md#step-3-deploy-two-edge-clusters" >}}). + [Step 3](/content/en/docs/guides/user-guides/exercise-1-free5gc.md#step-3-deploy-two-edge-clusters). ### Deploying the flux-helm-controllers pkg diff --git a/content/en/docs/release-notes/R1.md b/content/en/docs/release-notes/R1.md index 6d90d302..cff99b4d 100644 --- a/content/en/docs/release-notes/R1.md +++ b/content/en/docs/release-notes/R1.md @@ -7,7 +7,7 @@ weight: 1 ## Prerequisites -Please refer to the [Install Guide]({{< ref "/docs/guides/install-guides" >}}) +Please refer to the [Install Guide](/content/en/docs/guides/install-guides/_index.md) for the prerequisites on supported environments. ## Support Matrix diff --git a/content/en/docs/release-notes/R2.md b/content/en/docs/release-notes/R2.md index 61550c9c..85882a35 100644 --- a/content/en/docs/release-notes/R2.md +++ b/content/en/docs/release-notes/R2.md @@ -7,7 +7,7 @@ weight: 1 ## Prerequisites -Please refer to the [Install Guide]({{< ref "docs/guides/install-guides/install-on-byoc.md#prerequisites" >}}) +Please refer to the [Install Guide](/content/en/docs/guides/install-guides/install-on-byoc.md#prerequisites) for the prerequisites on supported environments. ## Support Matrix diff --git a/resources.md b/resources.md index 9050c2c8..a1ba9a8a 100644 --- a/resources.md +++ b/resources.md @@ -46,7 +46,7 @@ More tutorials are under discussion in * [SIG Release Meeting playlist](https://www.youtube.com/playlist?list=PLiW9_IXAWtks9Ys4Zs6wPRNEuQYAnWcg1) ## Other Resources -* The [Glossary](content/en/docs/glossary.md) defines common terminology used in the Nephio +* The [Glossary](/content/en/docs/glossary.md) defines common terminology used in the Nephio project. * The [Nephio Learning Resources page](learning.md) lists some learning resources that are useful for the Nephio community -* The [Abbreviation Decoder page](content/en/docs/abbreviations.md) explains common abbreviations used in the project. +* The [Abbreviation Decoder page](/content/en/docs/abbreviations.md) explains common abbreviations used in the project. From fa5ceee3c52cfb3ccfcb08dd34aacbaba2e65a75 Mon Sep 17 00:00:00 2001 From: Liam Fallon <35595825+liamfallon@users.noreply.github.com> Date: Fri, 2 Feb 2024 11:32:53 +0000 Subject: [PATCH 03/20] Fix image links in markdown files (#103) This PR fixes the image links in the markdown files in the Nephio documentation. Prior to this PR, the images did not appear whent he markdown was rendered. --- .../ManagementCluster.drawio | 1 - .../ManagementCluster.png | Bin 93138 -> 0 bytes .../SandboxRepos.drawio | 1 - .../guides/install-guides/explore-sandbox.md | 2 +- .../guides/install-guides/install-on-gcp.md | 4 +- content/en/docs/guides/user-guides/_index.md | 8 ++-- .../guides/user-guides/exercise-1-free5gc.md | 40 +++++++++--------- .../docs/guides/user-guides/exercise-2-oai.md | 4 +- .../docs/guides/user-guides/helm/flux-helm.md | 20 ++++----- 9 files changed, 39 insertions(+), 41 deletions(-) delete mode 100644 content/en/docs/guides/install-guides/ExploreSandbox-diagrams/ManagementCluster.drawio delete mode 100644 content/en/docs/guides/install-guides/ExploreSandbox-diagrams/ManagementCluster.png delete mode 100644 content/en/docs/guides/install-guides/ExploreSandbox-diagrams/SandboxRepos.drawio diff --git a/content/en/docs/guides/install-guides/ExploreSandbox-diagrams/ManagementCluster.drawio b/content/en/docs/guides/install-guides/ExploreSandbox-diagrams/ManagementCluster.drawio deleted file mode 100644 index 00d3e021..00000000 --- a/content/en/docs/guides/install-guides/ExploreSandbox-diagrams/ManagementCluster.drawio +++ /dev/null @@ -1 +0,0 @@ -7Vtdc6M2FP01nmkfktEHAvHoOLtp2mTHM2k36SMG2dYYIxfk2O6vrwBhAyJdr2MWh1nnAXT1AZxzdHUvIgM8Wm7vYm81fxQBCwcIBNsBvh0gBIlF1SG17LQFQDu3zGIeaNvB8MT/ZUVDbV3zgCWVhlKIUPJV1eiLKGK+rNi8OBabarOpCKtXXXkzZhiefC80rc88kPPcijC2DxW/MT6bF5e2iZXXLL2itX6UZO4FYlMy4U8DPIqFkPnZcjtiYQpfAUze7/Mbtfs7i1kkj+mAkuH9/A48v9An+fuSgo2M0JUe5dUL1/qJB8gO1Xg3U6GGVXctdxoL+5+1KCqukoypoWqA4ErRfXOoV2ez9Pj1sRhK3VM+Wl6h4dgPjGKxjgKW3iZQ1Zs5l+xp5flp7UbpStnmchmqElSnryyWXBE0DPksUjYp0gZTHoYjEYo4GxEHHqNTX9kTGYsFK9XYPmWT6f4uyvAVWKgLsG3JpOG8Y2LJZLxTTXSthTW1Wt12Ud4cpAKRrY3zkkxIoW9P63O2H/zAoDrRJH4Hocgg9Fb4Cxa/D/SUPj050dEkTKdT5DeSENgTm9jnIcGxaiRQkwQXN3BgWW1xgA0OHr1IOYoly6bUKFwnMmUE/LLgUfBrF9RQnzVTM6HEIuA81FBQpcZpmB+UNFCDnbaoKeZdiZsbL2HZCrJciUg9bJKOESXSC0PFAQLrhEczdfxj/GcGiL9QVCZdkEbSP927ZM9/jc4u+52JzJqzc5vIBA1kQtIWmZY5z5iiTZke3rnI1PmpLy+E0cBqQpyiCT4b4jXP5jpNy0sD4nZbgBMD8JF6GmXJ/duZF5lOQHcdcmGg2wbodwpGrwMH9GMYgBDQ0yiAoC0OHFP4+0V8NBzf90D4EF2cu6ENa7WKZaPg6n48fOwD5vtA52Iwd9/E/OvD8EsfMCfg0jCHZhb+tGI+n3L/Z2D67RWb1LKMhgSQWE3LBW6NUDMLH4vYn/dg+rg2qqBNkXPc7HFwW2Cb6fZIRFM+S3aR3wPEIXCtS4PczLy+sNWcizQcUpjFQrmo+MyuqKOoCNmXBr6Zhe3Bf2aTv3oRjGJCLwz24mIl2IMW3qx2ArdVC0NteiTalt0W2mZIlL4r7SHWDnG7xtqMVhbrCfNl2EO4KeocbjNeWaxkH6F2O/ciZpziR7yHULt251CbUYmBM4uCYbonr0p+6CUJz3egvFia5hLiVXrq+LMtly+6ZXr+d9rumujS7VZ3ywq7oqBC1N1LuZD3ggAVhkPHrFT0zO72M0+x0bVBtaRvDZKicdmQjTVmMVeYs1h3elMOiVjHPjsiJFGXmTH5fw3zdiyofOxgqqucMTftWmtbzEJP8ldWudsmRekrjAXPNj6LFBLVxFt/bZs/uO510KU5UN3h1HeacmCMgTKB7x/7HZo3X813qXl0ouiR9aFEX3wG9C3R44sSvUVrYZ8Dr8lpsnfcmuzr86dt2Zu7IR/A1V+BawBgVfr4Qwkf9UL41MKnCp/C2lAY1YdqW/rmltQHkH7N4X8sd4+PVH2hjQuVvYvOJHpjoJYlj803MWORyFncyVbTjTNybuzWXz9C6FRAh6DYZSgnWACZ8mnvo0LztcFMrki6AfjAo/VWHR9FsFZUtJneMqgSXKcJf5WCYu9c6W3tWzMIGvb0IG2Yva3t0eLO8ts3vLhD2nXjp6QYP8LNw4ty88Ste+cTc9n6x34QnC2qV8XDfxnkzQ//rYE//Qc= \ No newline at end of file diff --git a/content/en/docs/guides/install-guides/ExploreSandbox-diagrams/ManagementCluster.png b/content/en/docs/guides/install-guides/ExploreSandbox-diagrams/ManagementCluster.png deleted file mode 100644 index 563251ec9e48c3ce077a70a2dae2225fcefc9223..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 93138 zcmeEuXH-+$x366h1q21L(VO(pLFpw02%Ur~Bq4+VfdHXb3nJ2+NK>lx4$@H&qzD2c zO+ZCNNSv=UQv7x#s-MvI)`A);N3m(&PN+dV}m%x1o0vcz7!=Qit1`+{@35rMxf5;ytP-U^Fx{ELu;kO)A4SIY{8b95!R*m8*}1K%Nzt{8jZ6SxhW;rhS{0sM)I zSc*zmO7Q`gN={Dp7-Nhz4Cl%PQkM{u5)zXHZu7#x23ne2AQj-+9*4&O9~u}Go=;qUqVYD~GOZ)Iae#Qmc; z3I&X-753M(!Ej|Ub(Eu>oiPcjgVhj`M7RT#DQ!p?q6-e-)lbg-?wj(1tEUs@*IhJ* zghTyoE~W->9F4QW60ID7Cb++tYGP^UDhb8e8x!0$oJHMj#I-SYzo2xo#oXljCRt_Vp(6S%lK(q79`+)!Fo2jZ-b*KssK*}3A7x=uDqhF%yc z%5&DPHZD>)Q9K@CnzDlu-VH1R+*T5oCdnuPLac1#rjI3nv_znW7zwnYCcs2>XQ;9? z7A}gwiWy33Xc!?-u4oSeAX>^2z@I2g#n}x{@N^;=J1dE+5%p{kaDovC<0YeGC+ebS z3llTa0-71yOWKN~u{w4dFb_K{%vcO(qAP0RA_2&@vWJs|jlGkUp|z8~tD^(T*1=iL zUf+@E>1m8mRufUx!MhmRA)Q39CI(;v(oPLY5ZCZf1B0El4G=PT0}Z5$I!p$E)NwF2 zkhBqZ^CT%58N;xeE*fG`C%A?*5~K+=(eyAdKWb7OvC=CxQoSrV;T^FG(ri?W<7WKd?iNL``Q3xDKu=kX-HiW6WJ8C%? zssV&FHL->^%0zV;JzYmHBLgi-uo}coNm^80S=R|=;^Y8qePu&!brn@dYbyc_V}iz+ zxL9j~z$Pk0C<+8sXq)fCZi)@DycLV53fS_JbXD^fl38Jhdir0087(19CCA=hXI0F+rMvUkP5!G>U z()0w{s)?YKopqf&aViGl*5Y;u9SJ)pZBG#wRdGiXYpk-Csx(wxQo{iO1<0e_Ow=Xp z;ksZH8s(sY1-V-j(C$teM0YK)jD{8xtE{Rk;)zotr~q71*AWM(ix^33D|^|HdNKp1dEf9fRL-Bu|RVo z7Ub-#tc^$LprpX+?#3V$Ye^duh@Lt{UiHPS^u*kC)F22ISAB6El-EyoxM&-ra9+A7 zLnk|RU7`b^L6x;U-JD@?f{L~SLYXLOVv7+|wgFigki-ajb{bF>O?NMlxC6u<1ko}U zbM^o!5z$5}BHFGPoPm|StB5hk!31KjDNdBq2OFz8YDjswI%^r(S`$@lwCzD^aB&!h zfU>sJ#u!_9;K7pWAUH636wbuS3#TXL2{zPp1xbjiSQ{c8l(od&RFKvLN1})mFf2(G zL#US+21`=MSxMMx;*1bPXW+J`ma9EwT_sHrMBoE0Lv(X+v(uL{G76baTb0)uSrblr?dND>?hcCsTtk@j}dB4S#`a6M0TN0g_L zwSk?1wx_k5modUiMnzIxPsvtN6=|Z6bu?B|F_Cs~BoRb3yMnrIaD_Tzw4AZ}2p9@#BVnw9bdy0z8jHCaduc&5NY)|{4G@xKCFUxE(S%F8 zx`>f9ZB;>z2szf-6_B%$G(y$J!x8VL z3v@`CACj`cfI}BWF{5GtbWs0oe}5Wd;QL<)NKDPet-SNlA=X0>RV4!ti-nZqt_B*H z?>LycIkR2^A<%Z6Ju^qky210y}_;s5CvpgVOKHUka_(t|uPFTY1R?`wPw9*%3UMyb z{Z9?*7@kzPY%n+f_}?{%M-Q6Ib0Vf!Lo)K<%ph#S{V2chrT$Vy=JBRdMY;1$Uj%ud zZ*+H{<|eIL?#9^5_^-LyYtWJtq>3$bW%=}SVr=_Rj~^VDQ#rz^_}8(h8PMO8lF|D& zyB~!&r;JH)`p38CS^5TR$6l|zv_0IuJ@}w&@oEwmq|BhqZwN9{068K8e=UK)92 zxLl=drjy?#o=`s4n*-mETgbJ}#hZK6#?*$5dBl(!PJ~BYa!VR%@Lwz2>VN9#0F@i) zIYN5)hw?au^3Iu$n~>kVX=>b>{w&j<2N8fv}6!pTwMavp=k*gh2<20k7AnoF0oPIm4{%E2zeF^-}T03e1 zYhBpV`{IvOKZy9S6v6oo>-2)8h!9k@r@b4ZHo7-twIPskqm$wID zr8jkyg~J3br`?&wy&hvOdU*=O*B9;V+{uJpgqV+ceGF=ae{*9e15(aq+WBa1CLi-3S(r8` z@~{gPh1>XaJJ{rOC|6a|dTP{b-E?U9yVAj%UcxtQMrFD*Zz=p?!G|zFG1jRiPjUTL zuuj*H_-kF{R@rvdJqg{F@GnHeFTmFP$>CGc0+>sdSyzSD=RTM*c0U#%*RIEQ0_Q}tGV3sCLF}tf-de1zNP`Q~Tng!9{syE;=u+LmFZn-@B z(^C)R3F(zG@m4PlY-UXlIo3BELrP^)fX1Ki8>B~?YnyqqP5QH>_V>u-9QD@vt;;@g zQ}z+(+bi6ENUzW%e(j2OP(TBZBV_fFh4%n+=uKSkyl-t~e9b_6ejeuf`^cwLHb}>* zWyDMh(}K*Or|}dcK;9&}{u!8%;>YRGnP{02xE<%#X~qOT7vr(3aq@zUFe|C0oA_Lp zZ_SRmx{^)X8<`{g)73Az8X$60(MTr6HnzV_S-=2=?lv9q&>y=0x+qcyI6cVT`Qz`0 zezW}79qF5Zh0CF3JNa9S|BC?UM>~KQW`gNgXn)VW2|AY9=nE%g-|Gk`8Kjm}7 zB<0rMAmX=u2eX2y?(~RHTJ>gBxLkxvsvhCI#eF1_#OLA;(oYy>`lGi0TrhDvIrh>4 z(DKtE7h7PvgtGw_@M2dDcU~Xq)Js zRIE^Qz5h>;>~#Kcbu5XRR>I}HLKRByh+(<52(EWn@SlDB7t+l#RL=`5@*^wbT+|;n z>|YPW1h<{a8aEa#4N?Gl++w(x|Hlsf(KJ2`hoN$ zw~jLA|1v#~9w>%wk7M?u!{pcb^jg2`Ra&28mU)(6CXdt)X% zNdTPM5&YNm0?H}2rs{ralO?b)8-}U{bccXR91dtR{lz&=B}G`>b7yOC(ZZ~tZ>{@* zU*&CV+Yi$e)^-wWv%6Z2~6{GU}!apbTY^A0Hx$}fl2}WLL$$~ zw0?3a@CoaaEb~zHILtzcwo%0H>THaFNuyfc(2h#OJ}i8-47*aHxWt%c{)FS}(O*L_ z3jpR!eJn}^K%ZAm`2a)%dmq7n3Dl`8M;ak=d##n1-C?<%4ucBS1&>*euVBmPx-x3cd3z9-yfT_=he|Gnk^X>)ZE{F z1b*t7W+{g6p%p4^=A8l;raw<7>E+uwC*I78n67~tJH~ju@#^X_CKPNhn@$ug4?VwT z)P-ZY;lo~eX+2U?>3gnUgIH$!5Z3828NX3VKgwNa~*n>+C6#@h$c1&MkcFH*_} zH^Z1cB0cHc+!y7eXI+ds2It*5k zDp!5lJ@RaPztC%)6{TNTfrk5|F-{88M#O#a3W&xFFD~jaJLZ-f>M`TZ$A;n#H#|1= zBF!wSbj0Rl-;$a8e%Jw!<4Yj-KCj%tlAJu3MPS#}UzpzWrVUBU%gmG8C~nltAd2$i znAl!!EW@5|&w1rqH+6nS-u_az^fJ$z?a;tXUbdfnJw6=W6WQM%?5C0qiST2HlfL1P zPNcu1jtiDQJ3D5ge0RC=&d`hdBUk=1OUF(F3Q6%rr}}L`%bGj&yN_e_M{6AIWk3{h zb8cl9UF1rSC?K{!u7juOuPW9c}^F=Cv zc^Z0sa`8DI`ACAWDbG(aJ9UFHX8$)Pd}mG9V*qXQy3l1F(^vLJuhLPf^4;40wAS^Q zH;C1>G={b)eja1UXIIR-Xyj`Nu;k=}iGdyj_G6l0Cag}@s2X?f5ufkrj<}mC)!gk` z$N~$~np@AK{bUD<%yM_jd?wyD-|me6%Ryj01!$_{htcxvwt)6OE=X|qyaf0Qs*k5Q zDZ?7#00bgu-fFVe0ngp}wy!)(KSDHKQ`Qu8xoRQi^97UK>5AT^T|qVutf3*PAW2|r z8NFU!ahtQ%g2c-dA()UEGG)4`m6}^`lDbn_=G1m5SMO45D zz%fmVAA0Q5*5;>-h2aX7mwrsz%Z$4cI^M2Rb7yN@R>C=gy|)Df0Q84FKW{$M$Ap za-!u7uZ7Tw23@J&g+E!heHYLNa_csjmH$qgYczz{w>0LDB^5F1x;zZ-@44c9OZbNtW<+Lf9#Sz}jgWLE@maFlZj;AMi(Lq3)t~#Xn&(N@ z_>kheTwQ47^gT>=t$HA zjKY)YqqcfYL9OA;TKf~;27*ay$R_)T=lNq{dz!e7O5PROpL#Ap3_vE-pKbRxCjE)? z+k!P7>*=cDm(==gz#N3h#x-Zpg}UmcFRLK~#MuvATL6yWgeHSQHeI}v!3PtLy~P%_ z*Rk5kaVIwxVXKcsIbFiL>7^Qn2r{}pCf9cM_q=O-K0U}|;IMHGxh7USooXy>nY(Y% z&D@~?+->#upM1$Z9E<=q@@Ql^ko;cc+2y$(SM1JVv^Z1Y)mUd z8fnR6>Ul;2_MX1Gv9J2mTj(lzSk}Lyej{ouAnQzb`n=ay6Du|wvaZN^bkF4q%1S0U ztF(KM4bY?)IJA(6d!26i+oGuU*cVeLA@9vBcwC?QY<^dws!3$PdR^A->JiL>jJ3_V zdH2)2EYxa{Ec4!R47ntj*KH~`#6HS8QCsotda-3g)jmscRalm1``37_pxzW&o(t55 z(cL3ruzmI|3?j`cZ~uO7OBOhnT?veAE$(-mdYo0}HF9L68lN9qq+`C<5zP@%VW*>} zmkklt8uQpQO1yhaF`z$uqSpoNF7|L&)xAA38SiODy7A*nZfpT@V^bUcD82h*&*A^$-?BK&}@Wqt5)Mgz{b zVd@zdcJC<9^>@#n>|2z(hJ9#sHeGw^LHDXM^(b>*QN{g6v- z?tFi(DL>b8P}wFoxhGjRyKJuHm?W}O+@h?=$BpW08=m>~9A*Xm{#|LA{Z!zS1pxjX z1JF=1D|mtZFIe%%;dxF+ne*wd+i{mOQ8D4rZo%=gR`xNAMh~vauJ=Y=@UZ?O_>6p+ z?R)DuEh)?=G}UFvf;m3WoXP$K6!U6Ya5G=?k(`pFMIGNOBBSw8u=W-9S6!Za50A{A z*vdYhBsx%JA6M32Pomz!_A1azDVZhK_}ps^XD}Tciz z`#Nfj%Vy!CQ9q6EH8E7hF5T9cf5xTA@59i#1mRR~L4R{e%WF652_1PmG7w_^*U5T6 zE;V9KJR8ae+;hX?W$fK!;=tzXIsOZc|Kl9^1VH9YsulBw1;t+wUD|?~kUDN7_;{^f zQbp0wC_A~t-F);QOW$ofe1U&DKdwCQVB@`ce?j&TpGnSQssS@e1&GPt31R50ZNL}K zrOJ33Wj}l@;LOk(6W$<;0Fh1H9RzpwCvwWxSr=@IlMBBj3CT&4bzq*(XPJGa!@3Z8 z=L_@7Hfw2jRq_T40p#RrWJ&jQZT+GknY1*Fj&kGbGK|xk&WAJxS>DMehc(ny=}j&4 z`5QR7rSwXOQcUg1U~`V&SpBz?&Gd6xN^fGm8pl=MvzMH*aP`<7A9K&riGRt6+xR%4 zvL%>doINz!fFFE8(`H@YNd9J&C~K1^kX!?X#tO5kaGzOsQWixd;*z%>nesO~-utH9DC+x~-lj)p< z1AkVhaRRS``dVDqgt=*!>Daw8=U(Qm{hjYh;{2NzvFw0nq}gX}`6p!i3j~0hws}KjP+voN^oZ;}&+Z_7xenLD)MTH|nYX9oP@eT7nc)FdLwTtfnN|A}x zvuR;Uii0y6ilbcHI>_vYSJ_!^+{jef2#gk*N>Gto7)MHDPlue7t3vn0n_9O%6zoH_ z#a|SaKe#GZb!V&oh796lTkuJWuDJE8H~8N%gn%)MDNB!3DO0LiWA4+qZXirpGicyR z0if%1jq$H4Nu1jC(nf2vEYbo^356LJazt{;>f$?7BVlAl=H)L*r9Qjgb@zQ&i|&aIr4^^Cm}9=C3H7N{iNuzT>3SzJ9j3(7sfcreY8wbbG- zyqQ6pE)rUi|JW^PZY2mAgF!So>SZ|U+LvYQyZ8_RI?cn2#)2Bx2bmmv>$0UG>KH=_}`FFlCz#9nUQm1bY37Ese zuimh6r<#9omp{`x=~}#|-2JN6AE0NcYb@h%r(1VQHPb{??rks^9UEI5s1pb}dobZP zN67EKk-Yk#pk|?_ylXXUpg!eV=xvb)GuMma7eC(_ej0NxPlFjAKJM;UtQt-~l1Ce( zt{DxR5r)J~=7Xy&%My)7pAJa-SRh;y4(ac&!?pM;t3dg;s?2}Mtb+H_PLpC|X+ z=ZRq9^US%MIyAXaczp7745f^}HdtG;`VL~;2??as|G^;&{METPxgf>n6u z#0#giMxRc^SDI#O-L9HTrE+P5O(=U#cTDBziF@nDT^-IMFaiE&_T83!^PMcE>3egN zh|{49vgJ0T%(tsCdr;>0O-bmU^-$Mu@`~yE=f|&Cjp)CMel@=i4pN02xw3+VvzT_= z#P_*R5(Vv_JCQ&e*09x!?}LPW?%Y4TNKJ4R0JKc|G8+F27yt9z_;aj%;9^c9XYn2g^B zJs+Y2T#+o>S$6vCuC~Z(pOkH>xuOp>%6|8EZ=2(SWu?OybNbm$344ue^s~YDDK=+z zpeDjDL#IPIn%$6C<4nG1@*uRo#83q{P*}M=!kl?^du!7FAh)27Yb6I3tZ)K6{rIea z*c1PVs%4cgELoV~)IfRuR0VIlm`Zo}HTl)l4yNk{y!7W0HHq+OIoCG3h-(@JmU&X;twaL&OMOf2>R0ISJ-)3A-^ z8s1RKcp|yqp_wJVTiz^9oLJ_{^3FVOFxM`Z`W%9@ZiugRTNSZ;Mro)LW1KJ9*BhT= z0=_$UK_I6!y?C11Ao4GRbUQL{L*o4uyX_*EH_N7LxMka8>d`n(YGfjF=~*lFIk{#Z4}%4+`w4*PUJUH>ybATVhyopd7^AZ)3*=@dpjG%t(O-(cfN+T!sy_b5nsIL z#(K(V)8ZnzZW;BCh0CF>V(vRtIb#!8ZhV6|M!oax{&=QZ-C}27}nd(v54k$ zjpyEj8{XTh9isvxE<2tcu_QnBR}cOv^S`cXfXU4qx^Mr|?AR^``Rxi&Y>-z_XDU?; z+14DH9?WL~xh`nBob6O<@Lbs*oDpc)A;nMmbxf>y983^FMQY!fwL1oRzN&Bi;5oS_ z@I6Upxz}QLq$aUo%u_jD=+RSaiz=ev>}LC+%H&=A-Tp=Voj;+1KY|8sjsg(e6-bOj zVo-p8R?6b)<7sL%IIRb2N0#x^hw!@#E=@G*Ua61&XsRmb+~|VT zSn$lWt&_fKI5`XIvzEKg%P9jT2l-`WCy|c8n{t_`jl)32!g0$wH5`+f?v%@a80edn z5Iy#Tx!1eHaioCd^*8w0kdExd- zd7Y^)3!lDp{~e;^WZU}Colit^r`oK7Pg&MzPvN}bd-DhHX5;EZndQRAxq<0P;D>4c z4NxNkEGg0NyY%zY7Xk@UBy9;Dp1FmSw6w(q4Z-h&ZHH}^Z+dSJmk12;!+OU;YDDYT zzfgl;tei%}xr2po=XK1qgYw^?3iy+h5K^z_BAxAb9=c zi$@v`m~Nt^xFvbGJ%WYI^6ZDF%wkI~%nfjbzYoR`*ZM!uu_+^NR;%qnql*fm7pR_oF`siy6ma7uH(ruA`i;{5-ZM_DfQ~)+60QFgkSlDs^f4P@dEf0- z&!(I6-8X%$i>AMP2;SiGT76^`v;?GEiTewXk&2Ci2=in)-=H(|LxyvbjvR$@8%Arq z0i5B6V1&6WcCXSP}Lh}dmv-rA= zrEw$gai#Br_A~?Ii*Sf)GZ=^>_}i8i=>sVmmj@!pVLU7!n)uaR za^gq2s-UB*iN55PEioSS+Vb%-^o00Up%dS%<;>MA^AgoC+CMq@-~8C1gvnE#-Dh=y zaHgwA6VB8{X0Xp-V6X%;Re3B^K97x*xS z5#FQ6VZ)m`f3MH45jvRy0dU95UPD)(6-?_9QhR!kOXcf=C7B7xSDh<8@*m3)a1@xL3>|k8=p-Oa zF0C&F8l(ZOf-|docwW#@NwUzK4JeR`>AzqH&Rrhd9aM9VAtlYNtuV0|{YR3Ho{kUH zP}d>?5Inw0H)KN63)CDif4ER09ZV2WCk^nl8OjVru`YG{pUL6P#g+_Pu5sKUzyznSemaI zJ@tp!Ul)PRK&q2T+HB-Hg^QcO77u5*^Y4*^o27tGl36GUpY9AW-k`&>ERetQaepj= zHl+k4B&Gowh4sq<+RWJbJV}CCjq7A>_>6K6-9sz zMSbF%59hy^S^6CCFwbemI_MG3kFvn1%y{CjPyqqpc{-2Xg~Tgz?iOcx&4x>&d0eg?O%g4apLfAVA1@Qb?9++fy`fvmXh zTs=)Gj!J?`yuDU6$KgB?TQ=zTTo&qoabCi z@P_j)+_FBB1KX1)`)vLjaju`M#%CoStr?}fh95672YOPQH7G8+Lvx|CF9PNLlcmon zf`38y^3Mq54)8@kOmIw_RF}Fg%(bm8H(eB6AgzvcCD8K|{JJWSs|15< zjx;3_bQ~u#PDZeFjqn?Djz%azM>8RNny8gVU%d<$CeN)=Sm$W`<1A?B$0~;}IlQ_8 z3D+y}!g$iYpv#G~k-)c3k~#MPK1YnP$@$9_z|dob2$RbC97W> zgIec#!VRwLA^JJBt`jC3Vp4)>x`Ni`2P-W>HnCdz+{m)(AiYtE#c>UrLKDHpH@XUE zB?IEJg)Q0MY_BEsnajeaI^zuZf#l0hI7`ChoJ3@-!ht}0yb#STTA#)@fIDULNj(fR z^oiqh(tURijbT=bKuS{*vPW6Vs3=qVE(}cRfF9*b`2u8TtNMko_g2eL+v0V!MQ^iH zOh`G@S>_+xd064!iz`%4nBF^WL7!(=nhwe~HQr)VK9;W`JW+wPb0=q8T<&j7smRkc z-&+vsr-8j>xWJd!=7Z|8p*k3MpTjmm>kjsJ;PO7Zylg7>&csgVt!Iv}`_n*wWWUMu z3i%9bAfyFoa!vfKBYXj5%!LpoD^CGoThstK z#}8C{)tu1!mj@}mcs>D8Y0-EM2S8VjmR81NIX1b$OHGieJCgmbn$x!vmQB9=OhuN) zJ6T-eOz@iA)NM)L`cr#&%KQ?w0EhQw9B#}8S6{SxwmANeyq$) zzsetq7W0)2xh9cU@3CiM(cmYjpdKzT8BC3Jo8R+4Fx&~SqOzIe4B_%!{xY#0DC^F0 zGkUl$9kTGP??UjnMmV^ClZq2RDh_?E_|~k}SwB4aCdX6dyYaxD&2t{*|JFMTOEB1z z7PWpR+58Hz+cMuh&0l6cCOIqR`JnT`<EcL>Ym+@*E2oad+X8(!N6rO*U{ zT+YojV|%tbr-r4>j-aj6R)|Uu(YQ*Rhfgg(Z+z=us9F0MxGU`C8gfDKu~~z!Y1N_v zs{}M&$9FyV;bSr5+J{%TuFk)YY7{g@Lw&goBy=-@ zjzvJG&HKp81s86WfNZi65wXi!nA2O;vVwpKikN-iQAYR;DMNDCqK@Z z87f#`Yp`zXbjYwb<)-MmCXBhyf1Xcn3mKfD zZn;sT2j-kn1)QCe!8EWKdEdAI5yscg4i}n03;VMQETnAi%~F5U`0z+{kiKi==t=N2 zyM=d&FMu0f3}o~3p-mZSS-7)SX3Fbt*p9jmS}rh<7Uv{JJikRwn`EB)gz0*h3&PCm zz0iZAnEP@w#PdyF%}FdAH!jwoC3wGfbI`H$62}#&M)-Sj2^oE0w_I!S85`>6MMZ_( zEf7fSj5Do9ckS=dUq|!e5T!wRHvHrgVT)PD!gqnEc4mMynBBmHuUey6{KV*X@ zIF6)`HdNtmN0-RQRZMs0Z+p-5RLMrR0L2J?GezfZ-zvU3?BdvQ{}XZHgABoYbhhSQ zgENQQ_mf|5msT7!RIL)mJLe?o73N7xxV1~bdn(ofUT`_{r@gHZ(5*R3JNdo7XHO%h zrhbNRMSx-)IWe`{zCiB6=`uxuGT70?0t+2-$`%(~kgDV`b}GL4l34DljuYbeoH8ja zS;90tMS;LYE@8Q}u6FzRc7`rT$d(5 z{EJ-W6}Ek6l`K4cHlL_IDOKb);x{s&Ns-~$iAd8)5Gu6f|6%<~Pa(tM%67mJ&qrb^ zCu%(QYBkNiR8ArrmZ#Cm8w$H`@co}(J)k;92P$C|qn_^OLk?tC$?>0SPaeeQ;nzU| z@jc1YrFkilGoBA#bP0C z6Nk$Q4wzxjCoDb*T%Mw}&>N{ze3`{-Xwu+Am?7nRRRQ@5@4J^I^TG5H5wmWq43P8*YYnN}!5zYspo&W>to^v6`@t)46Keah^W%;K$fNBuG?@CLc* ztkh?_pt@dRX-~=~9tQJ%E2y!@4RjVE#RMFhd=D(5<9M^ssXg~qz8cjMFBqs_1C70{ z5~>y6td1vr6Wb0iBTQWBhy`V3?Kd}NLzbu*20^c4x)O4;9;o*P**CweA?9um&(pqS znBD+oVSF|e-aVS|_5go4ay;(2nW$GRYu)!Zb?(viXxt!SOyxq!?)j6ao_srcY`3dR z!F!Zh?QPfXlbo90-tIrnoxDzFJ;O#57A*JVs0y|__8O`^H>+e=h4$5i()sV<9&^~w?5A7_%B8BMzJHCzr9%rTPqb< z`Bvj%M-W+v$>~}#F3!BQcMr;FM-_~zqvPZ4rCBHkGptRr!Ql|os(N~_TECfd9GKM) zo<@ldwZ01>OaMY$>%C1qlaIyYu>5p{@g@TDrKiUaG%1y>*T_XyVm;T%_cG8JD__j^Jd$*TbIxyJR&sTYl2ymU#o z9_%fxmKl2Y_cZ+wgUXr4%ZItYUS;lg`QQ;Zj`aqIE-HN0-+2mD%(T!G(TjI?1Qs5; zTsyJ}fW$dnFQE~cwkD0w#V0S#H)EiWvy?GL-H@IaDU@Yw=xp+z7MX?Ioz&X#{uY!XXHY>qr z;+Kz8566+71q(=_lgaW#gObeepTp*_i=BFvT5)*B%+2hmWK6;v$EULk3TLdPS{hvGz|omOnn>7F6=}rwb=r) zUfa>oxFBfLZR=Hn&l$9$H@UNpAJmh5w`IQi^aSEDvQ$Tj(EH&zw)j$74``sjry!pS*8UW#$D>&IEewf=U!oNYIFoBs@F-I&-hfJ8 z0RP4?rpDCw0I}#_k_sWaqnj>r{6zhnGdUX zmf>hKsBqTjx{zd?f8Bg;Xhl>nibE~B#OkHA>gcTfO|)21n)F0F_TIt1w_8vVqkJG6 zIr7D(@7IDnS~@*CefbN%!}mp}dKLP$BgTwIXJ?ce7jOERy(fbyp90?A0JdJNwbtX@qZdE7hZkydn2Y;7lf81}mC>jb6<=Aq{f4KCxxh$Ee?x%H zsMXPZgy%|bx5C)8Z<@Ss^rN(59FF4KcNkZvnpk+d%roXcltM`+7Zt;=Rr0h>czS?C z_m6%VuiF3>pu8y!%UzPxQYh?%8+6 z%m{OOc0^yNX=`D#&l;yd+Nd@ygUi)bj#YNqHZw(Ku3e0M{WQ^l*ggenlsyvPl?NM+ z-_(eJzBm!~4!_-M^m8Lq->+zaRMEwI<>r-UROPf^+AwIvbs)AMEEgt{wr_@1X$x59 zt-HTFZY|{5p*PoRVv2KLnYihO2yNKe{PeRz#s(-y#=d|3^GzxtN_AXTOVdJ2X8Jl>St8Mk+uzt?mzCDA2N~r*yOX4JxWUpTRC!_97)AE zHB_G`+{U2(!|Q-g-|)n>2k}nD6ZKKCSzUQt{_G8{Xy60vqESTq=ViB57`?UltxF(zfL!mBxa()Q6Ka!>@dXJ^(m9#r%K)Z-q>yNLC?F5 z8;u5f*9YAll;D8h?EMaCy!(($dkdbkOUa_+c5o$u#KQNbF}3S+Zx!a87|=dFW;M`S zDaXwHC!11!hoeZ+uO$2%w(T5mX|`GOlby7%Uq4|NMowh|7~&xh4aXG0qn#$+UhYa} z&`}v3`>d<$2?Folh7L|O)ER!|rl$DwkARG3$_Pj6KEU7SoPecCIKzKZ4G1uOIko_i zJJa!e$)xi0D~x)Re0w65H^2$~Iz8+5xLmR{o@HIN`otsQ&!OJA^>Ymp`V`^<2S zi{2AIl{)&?iByu?{x>0NDSHF*)S*)gSyh;W!)_+ojx6k_*bAMC%&fc7E%XLx>P1=N zFjU#DBUsYy#6>@K(q+&bt6YgaBW7?|bne!%^BQ2eii{0`mfm51VTUsGk&ckPZ#t}3 zb}DR({ML&r9mGnG`{`8ApvXYRxMwu z7e)l$0J_iY?N0Yo`Sn|M&P%C^KC{+l*YL?$=|XA01q5;VGZ(T97xN&&8Il*@VtbN@ znbvMh9e~)=#hb@fN7<%8P@3Y+u~cb1eDu@1PZiVGd7TS3p6nRmg0b^ilbg(E{5v9* zzE7A|qJr-h7FHxRcvXsTmq(m`9cBJr>$@jkRdLL1CQ3$y^*%+piaN=MQ^Jpbmoar~ zD5f#uKj5hw#D(CkZ5xrawYE5{87O}`!1)f{asRb_eJ{ZK9LYEX<97Bq21+Q))aLU3 z+FccNzA}LM3*xxR@@i8J9#7{svM8Qz z0l-)cfG8`?26n>E+Kxk6vt9d6s$WbCv43Tul>|;H!x)g5AM~s)^9u`H?lG=zoW2zt zl_CcjxNf00SRHhmJCf_(^xLZA%Yw{>F@G^_3H}dhBPX=g4Dv={T1- zt6XZDvpDnedj{mUkY&u9>z8@p1__bV#!VV_BoJY{e$%y!; zcAi>=?^bLcrFHs&=Nl-C``BQ8{`vEbp~?B{J<>SlAVdOJk`$~^X#Aam=uo;^Ncz|M z9|owjuk?$3-ou8%x@OrMd+gmah2}hK-X>|cLS=E$oKcP$?avs(*s9!SrS0!LOi`FL zRnM_(f8+Htnt6p1Aigb|1_X%z`Sxl+C_{jmO1!~+I(EP%(qne6Rs75BFts^*T>&Uvlq`n3@rOJugKt*!vPfpC=$Y z7KE7a`>y!%E>*@H^NilDHp1TGxSeO^4@Jg<5+}6z{T>vym+GtbSA$&6Hu%H_YwOBH zqrdPEYDPWg(Dij~S9IDiHq;dnKE`WyUjvMW?<7(gypes;J&u}8js&L4a3ak7XF`RCGvLiusJNr` z$WFKPv4sPP>0XO{6QQ{~r-r8$*`Lt%JO_d%CaL)MWgY`Ix#N{d0vBafue!ecnLX&C z8Ob{gAHfN!rO~aE5uOftsanpn|xQ7ARjoa--|IVx_(or&ghtPjD1`4Es@(6mMjDjH| z+ML>slAX~??){Itv>8fvCcp!DedfcdK?m?zW>v~?xVPI2MGZ!B;2sUXXz9))Oh z6dnH`>y%t5c~HfAfYhPBR;^8q(G&$2y^z|$uCI_nuQypXdtdwO9o29X>$H4`f`|W4 zwA4ng%9faZ)n*Y6USEoTy!IGYxc!E!pEe59QI9LLTGLBxw7ngo@w(_Zkf*Er_@oC* z0fqlO0#+!@RV?^DI&Lz_9+?yWVxrblD@68G9VOAMt}miNoR#t^`?ATE_7^p5G--@< zE%sZVU#u%G`ozV-Y_B~|%j(6$jcHQ<(MR1+4z%+9;s5|h@$tP0G6UTAXWD7)sO)Px zD;vUYZD&RicV8=jZ03|1BErq7g^u)alKX9n*^P@Qqf7>&-~^Hzr`7K8ew#XOhJdaQ z{I5y0<~M+Kleu*SI8oMH1X>3qgL5$@K=GUr((SI#aL(fRSar0N3wvUtQ$wb9LPu)` zYA7f)KnzlMwT=c>UUf9fC-Df#wpDZXZC-Y?yMp@Gi{4G()w+idF8sS7L6I_{W>tz< zsxn9&#<`<>Igyq2sp#%#m8&9A9PWOW-ZwG{Of@d^_gwc}p537W0#WzQVz=bbuOqpy z3Dz+h97~3b20~u+zsYobqZcjgZo@2Xo!$Mo$ta|*h&*@S@~e23xy~B_`QU#|(-279 z$*@KPdCCCW&)lqJ?e3LG%70eKh)>CM?&_I~q?&|=)Xz?L#Awhn)(-YL<3k zG+1zV3xr^U1a}V*G!P(Yg1Zk8+zIXwB)B_FaCdity9F6Mxcr-(_niBE=iYxU)&ges z?%iEgUDi+4ZdT3`|IUk3KEq`i2WFau#&^(~3_MzMs!@&pXe+Khsy*f}-FmL7^F+tW zOSc@+j|}?XbEGYr z!1tl%nVaj=9H})o*XATlx&6I1p{*_?P(uM-#>~&Ljj{a&B+EC26`n=sc`QRe$Hv%% zk!F=W;ym|L#LkEVbAIwd2%=VUv(-uUjk0ZNIMoWr>3`5Y9;ejE3WT!()rgZhj__~P z4>g8-t|$eIwwAX`>T=~5`7Krj+yf^^pBw{R{@0EG+)|!r?bN+WoSR;-`})T83Kj*Q zKi+68eR)=86@XzsgN>^;dlMyPark`3ljw!Lt{DKNZFJ>oU|cg|o5!ikZwa!cWT+S( z;aEoE8^hrKtcRvNl@dkO9K{b!O2esdV!~5fB_~b#H`XW+^&A1DQ&~V3L1?YR7?bBR36wgA`rP_v86B}|I5)q*E04!j4NJEx!x({E<9WKdIv+q9O#S9#>?MEsDaz-&&r zrg^kq1I<#TMpJ|KEA;EVWp@e9?#Jr@6y!UOTiHI~_O09{viz4~t*8IH%o*a`Z;2&z4+zN5Q`I#brj=6tW*;PhDflK9|fTJ-iJvd7uQ#V3pV4sHPz zQ+g7qjU@hGofEfS?i`acDmSpiVR~bgEyq&@O2Q!Zk3-4UN#el?;}ubI7rc9~tmfEo zSgnXE+PcJuNFF1$$JWE2q+2R+SeJHhi_6z3)Mpzb*goHb@I1rR&W7=g27imZvbDKG zDt)f>d=ZuWhCN$GeaPf|d!RHW2Xa??GuHH9yLkx!(WS$GIkK3v8T?(u@pa9tXt^-a z>1gvDXWS>#kn5Y=ZCF>u2jnRG$LrQe9BW5TrBeSH@wCH&o(xmNG9W z0FGP2jLzn$acE7fey-~NB6Bm^%KUM*-{ZK)ZUBKdAxX8PgA@BHc-i*!$oZ}n#4#rS zV&Q%fbHi@TcN4&03C#c8tEdPvJUwHX1WNn{;+S&Op0I)@k4m~V|4T9ZAhbT4n06~W z@H0UAhln>dwRlLbT&f&^i)2-z5J~8d@s2K>$YvDhDPM`!sL+$&$Q6hs`{lnbUosgQAgQ9omxx3O3u55m*!j0#X8m+!CwVMHFlSH-#KhTa>wFz z8D|SYZ5oWs?n*0(0Jf0NptcG{gBnY1ax|t{*yEZ3MKviN|2$aslG)tDibM;%na`Za z5JM{))|-&0I`0S6IQ5HG{&gasUB`cZ>Yj0UK5POtki{C$sJG=Sk}77?jaiVRg-?f2 zbB&5Gp3fx)9Ip3N-+8~p0=V1d(51QWhFf*nZCZN&v)-jxFD!Dzcxn8UwW?rwHh)xq zGuX{|r6-hS-f<`42YjCglt9mg7H*UQdW&%*U#`=_!uk4Pk43eAft1IsDm=aV-DI93 z4GW2SOedm)=Dxj>08h#i*PLCZ|TOsjcoP)`Tnd4cv&p+c*>QX0JHu{rQ z-zkRY^_{;$zb!V)v$4NK17tjRt>x7a=)4r*QzP5tO)2t03p_W(Dpehj$ROl#q1LOQ z^=gwI6uTkiAP?9JI+Jqc0|w0DAP&Wyw34l(Oj=7ki@fuwJg^@ zRhj??$RhUFx>@eZ0eDVz&lVYSFTFOytZHL&E@9cIJ&ZUWnUK`4G~u4g69`3 z8cLhq2_U@(aj$11q$w;o{}z@LcJ+v#kl-&2(P{lE|E&=yN0yKKia*UU7e9b|L&PE{ zK$za&Az1n`E+4@W^V;=4Tz8>j%O6NO9y(&vi<}Vr>ky&=cG1uzJn^Hmc1cX#@x0zX zSBa%m2M+*o_59F*qhVO2mmQSG>mVMaNW$1NM1b28Uu#@IFqxY^JE^T(TfRzPcJMPF z*b>c#xT6Z~-*cB|EbHjpc0wIC4@nw;s`sBS!F$Elj3wn#n~XTG!50-T{DGYnqDc*d zKn0bKBqR0_aQmA~`4_vdBSaT#tpQtRTdFy9`aH$<>G|Ar`~LG^!wE07IIp!9(9?M( zLz9?n)Z09BE`f3&`aPlMI<-<2v9sJ8^&j_lk|wMf)LM?lKa1V3E_L6;=dl4QafdwB z&gR(*Bl&sw`gp~?A1L44UR$4%n--gs3MX0_69bwha58?pcm{!aw}1Jk0{uDG0{kO1 zEbf&pD!@C(fY}S5WHmWVK3iLXmrdr)VqR^1-x-KzO1-X~zZ}qj`^vUM-!mR;%$St; z@|2_a;9vC@rAo;jf6fw&lv4bG=;S<7ftLr?GzKhiMHbU(oH8_qvME=Rub!*rF9!>! zWKKwB)x5_9tesctIUoA>2QC#rM;qXp+_nC7*Y54O&4aBP-p_N&`o2e;`5h6gytcXu zlw_DE0mU3{5Bona{;8Lcy59Mjs>*C?4~XQj0QdS5LYmZq@7ef-W3J)Br&WYB06und zYC`#pp|beTmP6nMeC&4m;Y*;}*bRd>6(ZpH1fk(@KeHlUvJAO(>$%*HWmf0-b6zLc zl#*vTQ03p3D|v&%Vbp2Bbjw6g9(`o}6|mH2X-4Neuh-sBj$*$BJZ7;N>p2{t89~~= z)esJ{6+l#9g=8qu2;q#(?xXoG0B&X^D9=@N?BV!zW4S9^IG)w2wZM{GC3@=&t>|9L zRtS5gvJt=t2bh_}eLBm2C~4jEBo(XO&Vj>EPVewJiU0iZkL25dfv1d8i0vMUB=zxA zd5tnc*__gDL#Omr_^*y$0ovoy1Za-bh4d!1BJH`zV4xuuU+!H1GPcq7hWfq_DqgeK z$(aa7CgrsPv%p*FVv}^NYs?MYrBJ}yY6qtJqrZAy214SC=o77ruw?iZKrSBA4ZE?y-%w+(p^syAqm>lKW98^IBj?+Fcmmz1!IID z{^KP-S6B6YYXV}M?heCQ1&MYmpf`l~Qv!fcA4(T+**e|q!w~{7E~Gr=TYzs*BNb{y zV$&PB)Z(u3hsR_%8Ars+V<^w%cx6E3>7KU!$17Q!ffTNiG-1zAE3KYPMLKG@SU?jV)4?_(BvDoaPWznznkC9mkL3*Gs$wDhHO?(0PY)0 zuR!AVc;BGY>^fod00fbRW9v^3$KF6?DUm$6kVzYd_!71^XA&VuuOGlKd2E~RJf^k) z2gxQ;(UwzlDGqJF~odII+8+&@!|GQoWA$NjLOI@gHyR~6TM2dBub@$ zZ)S;pTWhQ!8X>FN*xs+Q)Wi82naBHcr5kA7DjEL^q$62n_4RiU>sG zaF2tyN9In!4v#99C<>w2L>6tvs$dSIeyo8Q+TdF$+1=4}Pjc34Zrc@|DrxhH?7%cZ zx5MIriXsJ@o2A&@a!wUM(@u69guN-o|fow7bK8qZ~-_*q_WfPhkONXO`oczJqd1 z%9%bF`!hqKQNh8%7kg7ORF}~m5UY8PsS^nq0PX(jp9~TTF-PwHVwOa3uIJq)4oFY% zJCE&;ytcyN+g@Xne3F*}xCU^(bkK`56mouuLD3fj0=Xui3G_jtn_m(cx#?wyE!_o4p=BJ#->`cgAuk`B+xHhkU+g8$zaug~R3#>7uZe3dK{&`N8(tZ}43WOMzm#s(g*| zuX0@`k^2+>wXj#0EnRvp*EBaL>k>c1u{K_6QS?4+heJJqDrw`R&%{)h9i8XdQeiu^ z&dl!J!ZOzzcT-9tvbPs|bl}6e#M?O}lso4=ucbC`eGCdghOQv=IH2CI*!W|wWps4? zD#Ou99_2i9zv|bg$CmC8Y>8^)p`8lP4{j9?J+$x4hTyWw+qGXb=>O57W;*xxj}Lpd~@~F&n@^0`8LZCFWNqb{IKYHtpgsP>7t|ln0N(K zz~v~OnA3zI%fD1baEeH2SocsP_zLs#br+G}wxmI(@cgR)_ zl6jIv8mUa`gRT(21PQO5cNX}$t_k^7?T_i+U%@}=c6#fFZ+3ei5qk7)v;-eodFU<1 zUHwMlAZO=3krW!HY*rdp1$sK-pj;gyaRM1m7r@~D-+9>7ARnN>EkJs`GY}s)4FJJyV*Mg80N9(!}uWzMw=bgkC?ohB@1TYbgr- z?8>VpKn|OG(4c_yYPZ-l73eNEIhpPASI#(|Ad(7J?#A2p zR6IzMUORlVUx=h64quC9H`&&( z;?i|gzFnw&pUSNu3yX}{jcw0O@D7B$%xk}KO`^ZJT?I?bvk`pAxafDK7>q$a?PZso z(@T`Y`Xgd{8S8~>h4o_Xh&HKKwUNr^lta77B*yy=7;Ta9QN;Fjdo7W0sB2_C}JIbPI;+*PAQ$dLqH&&>oHikHI2)>$1^%{0b-L z?6rsz&7co2gVf-Ib7Z1wo0wNYlNhSS=2Q9m6La3vDwpfPr&qXxHtkZ@Qcd@7~1SqaimY_C$bA8X?#;>-`UN^sRk05 zk}OCw==yVO)7!9a`-%E?b6Jyd=kBJH-6AZn58IbIb}6d+|9B-|(;@Vlrrsb+yOKL- z5q1+Fqc3(zvU#%=*dfOfqvoX(XRoz-0=|vt;Xj$)|Jx)*gMG5v*fvd#7}vw_IH;^@ zT*KEOSd$fEYg9w9-|+;%hsvN$wvbOhEs8Quw-qUkeBa|v%LKtEB5cTGazs_mrj17W zZM7$X;{kpD6Pu)94qtdmZ=rV|QjY$L!*IXE;e!CoiX5^5nHXS>HQla+0vs#D( zSzT9u3#T?xDb;V&`-7t2xHFbpnh6X#uugipE?k zV0Hp?32pr|6X9tO-krKwyHAxpN{zSSR)#Q15ArRt7jWF`hoTCrpG!?m&FIu2tjF}R zRQah?H7|59+!tZ;9C1<%&4^rM^Ikk3jl&0nj5kv+=)G^UcB4}f&ZmA+f3+9--Q+Yd zNb#AVWLvDt{$Cwu;vOBf(2N$$7puAH`n?f!5xj3jqlgVfd$D)$C9}Pve9#h|X(N*l zqA7^bR)XW`6;%JQV^XnqkT_sCk{fnuQa>r*GeX;SK!JVLu51#CSYLwuuHY~bMa4=_ zbxx!xRH#y;1)N(+3-mWq}AUN zugB>TYLyD=ZlxC1Yp`Qct=B!RL5l|f!jpn<2d6 zYO~up<9y`oN$Yfm()D2^K2xHF17P~k`Y62%GaPqE%T`>jho@*LVu>840koJ$2A5@G zqXy-YZ$`v0)yXNJkA9HVe6`erbyI@>sUwM}DD#QnCP)YZ=`uwydb=aAVu`iiUoYuR zt%U9W4fl01^XGUlbfL(8vyC(Q2R5yAJYdhYglA8LPoZsj!XvL`+7$n~^3Ase-(YCiM9G z3mz*Lnr1nI7>tS!sJoxLD~SrPpWWkg7on(8)=BuuV_oVJyP8)S z64Fj6d7)tXYi+1)RQPZ*FANW)r!&)+q|~p0*WxkS#(t(m88L~W|B;B;7scML=Vjc=O$quHAaspyoHjvGO$6gP=dC+4YMG|_t@Ms6= zQ&l*1sG8qTBAv^b0zC<5O0_;zu?-q8)i`X+5wm{@kgA*qU}d#goSVv+#NLg+$HZ9f zFAg*Zi*HKxT0RYEZ0^40SfwISIUx>u{~^7jc(>_@@Jr+vV+-E=wN`|_@>+}GJ+qkf z+L*|b)m~1b+ijaA*q{wL>0uR@3QH;X8-%v@b0K;Jw&WvN5kpU8W@V%!Q$8 z`S!N#A0p24P;VvKA2dYNQd3`0=&c2ZQ(ef&vt{Ixb9jtv^uJj4hSb?_N)xjg_#`Nw zg+UgZTq-_|BE9i_DZKbF=(JNt@HGXtS~cdgG4t(~`Tr0RLz7C19D=WpG2mN0BlErY zLPp)$k$Du*d+cV>v#?qV?O=*80NC9Ye`b9w%q;zra35_hdH7T z6c;WZSoNBk<5>B^H0m*}_JIy#f6Wml8ykppSO%aEozmXg% zddzp?aD^~2)jC@6@0 zS(_HA>HelvhS*vny*Hng7Q_r_4tnbYaOH2JtNcZXx@JRd#rr{pkZ4GT^g2kj zN~K{p7x$|AHN_9B1c{I=4BnKikWMhf-_t-L-9BoQ>~9@Jf4xo?Gogx81dg-LB;_&x z2hWAB!kJIzk?fE3&4X`qq$5;=qeQE7sHQZ$F-S519d2OF+|S>`@!@_0-tku*Za6tL zl*;d?)8s=th0C>}N1GV`rX688CXN!Na(2znpOCJ^7jupipz|(<`9C%Glq;r}7%QUW zf|NKUV=^M)ZFZ9xd0(|!e~i^0yFF+j0y+laVF=9wLu{WEt^3tV0Rw*+*=Y~xgOgbA z+gh7;%FPuQ{ku|>!{_)6NU+^KcY=mJf6hPtKiT{Or~+XyLNfsIErKjb;uBGxOpgUK z(+XSJyu`kO;Icy|5%R*`$>j1R=po=?F<%t>Xfntl6-}y1@_Vab<%Z(H?oEdI(V!wv zCguA)owppK#aV%QY6N6Ws#gVqyKK&O5{_4lINO$7Kwh&x^6=DKR9z$4E>k=lJ}xl) zRUJG!6}I89w=ftmI(B5t`2-qf!AoCmljA`|>rrvnO^Sv%Zk{^Ryuvn4&TlhP;WIgO7}lEUWhNnSmcVo!V~xnBGI=8Ts(l?O5<6K6Q3PAD+}{)5PW9|%rH z!)Jp?2DO+iQfm72B<1B>6t;CbSc-TQoODM43Kc9FHW87)|B6MBBqUpr7@v&zs|B z$6gxr^PQ3NgBIkQX)N_3+IBlZRmzTl%aCghZf}Q$p3BCGRs_naK$rW57oHasIW^RJ z0<_ZMb~56$-sCh~r>!Pdu1ey$r1xqP0$Y2M0n{`b9{7grdbR=JTU+cE(q~gc6CZ)D z;x>-c7wp`{HU4pTaB3XG5^?Ta7`41&>NwR09Kzo-q2ZkpIowsHC7HVEY@vhM+x`_x z=;-0`_t^EvD{4s1CzVK3X;^UqP7A52r14QWY->S;tn`S8&9yx21->~~oknZCN_fbW z3Lb;-=ive)JQNlDe))iY3eR|8W|H1i8^cZ1Ac8aM^&k`sLyIy#wafGNN{)5}FD+$Tx+=K>t!R{@D zL6fw8?xW>8)_Ll+X)oI(Do{!oW8bTW468{4kyOn^;lGr#3$*65y?Ww zm^}i)o%98She{@%{jt@6dF!YvNxabxDSOum7EN*}fk8!FHgw6&_4pSe2h8eco-M^5 z&D$ZOhekL%1XoFQZBM69|{2_|0Uv?4v!40bw@nxSf9rzq5tQw%Tz&`-PYjvM8#}FMI!-EWZj;AxY#tGyHo> zO0xpnOV185&*@=}A53LYZ3mJuL4yfQB|~-}N*t;7?491CUWPGnyk*KtccFfv&kd)^ zRU>Ukjp|J^dV$SF7L_jS*%%x~txx*4bHo)$%}!%;F=diN5OTXFObv0|-7Lne!+Z#fB!pZ_8pLg#CL_67X7KHKdyM!I4ivhwbI1`W)s^? z%@gr(k`IcNp1%shrVF0M2vvolA+0zsAO5=0jdGO)N3yWaFDZO``(;q`t&Gg*UZIk{ zN-Ghi8_#Kqn6QG!y5B5A_RG`2fT}Du#M|4iV`x3WSmI5}g`<2w;R3(}*Kk?sh%^hX z$l?N|qk4-jXU;pSsOtt%CBeVTE`wjOjx!zYWGTlc|Km)I(^uwOVl=6>7VJlpQY=fs$#5=e z2ZFEJ=4PhhAIXJ1>en7%(0h_j=;DRJQ0T`Sa^Q^BlsN*ca;w5)Xh2-D3x+=cl$UY!)f zX9eu9*@#N#)jNXJj$<=y{}R9N#)$?9-F>kEQPc6KEnqOnvTe6N4-U99gLwtRXcj^u z&f!Hy+QnNx4_DZZ-qfn~c4cjYh@N70pcUKMmsGO7=UP;tom3QdY5MajFG1j|Cm2FA zm~bC7_HDs)m-JgA>Rzc1^rimwUi?7eOweUOp=A2dfQ8v^RK#%U1T&=To&^9W(lACa`P874NOAbz2zH`)WM|+G4W|unAMAVhd&Cen zaeCc{54&jHdd_;H&|O{!G_1n7L-@!|UM7-uGza-FR>R+D8%ZY3*VZv1oYL3pEpT=( zYk79|r^ZLaZBBn;>jnEPFz{!cXRmv1L(6gPamVMcs+;lqc&~PXbvF97G_Yih0nt6hV5!^ zJ-)%|_k21D#1&=u?SkMW_#H(@Iv7x&89eN4D9U+S9+v+zd%zoj*M4%2+aa z;}|otd4CpWrR0>%18HLJ1phv=lkbGOU9gNi`-SsLx7n(h-w8sNE|%mD-UOqlnW?WM z%tBRQ9o&dqMZz1p= zaMP0mZT93gpRhXo4b^(V*C(Ixb+f25y)by*)pwjno^&acU8%?|*{##-%G_mQ+T4aG zz&b;sU08W^Uv?1f1*S>+NZr1WuRu{o>7$Q`!EN=xj|qG%#hry4gwb)c3~!blN92oj zI+(}__6wGd4&1#!Z>{J);+M%79l<9gy=juBg>(t7@VgOaw=ckYN0VBPrtwjzcDBJF zI$YoK1|HD~0f zsf7*xYatIEnby6WVxObmC8^lOa1Mr^*AB>*Fq%{7o9pakb-jerW+ch$KLgXg@;;WV zqGgJB5FS%&CY8SkJ2>GNXGBU*QXKOIrB#~XaZI9P&n6>zuQsQ;yebj7L{_5|ZxVeo zWdESz1Ng}abHS*}u#5&(&xQtVa2+QX4(tbJgYiMIS%aCen}Q1oK-jETndGrrP$og% z6VwQCYLDQtSs54Mp9|!(i}PO+ediRFDk!NVHH$?Yn93$8vX(!bOgJo8&@rJs?7tZt z0&_Ncj=!k$SdM!qBZ-@>s_X=Nlfz*=h_`rR|5aF+8+D7s{uNQon-k(WTonyzQM`f? zX^I93JW{I=WG-@QlvOb&lE~a_>S|V(qor78t?GJ3<6Hhi;tEU{%xeOVc>x!q7l=CT zmYA7v6+&fbeAphQ`U@+qefcI7<#4z4|;Ds8f_DH-_?9wzYW z?VP4Y2iFmjSLiI8-iK>AI+;kaqc-e%jLX0%(y;3_lI98+NLDtl2ZL~h`!%Z`t}7+1 z4`(?pclQCZ<&@0epW6w_naNX3Ln>8F^zpfRifg#b;46%KvSrJUZ8m=nkYTQUktmci zXAf6nL~mba=~B&X&sDtfw&!iT?9Co*CB6HIuo^D68 zBf?*1uhM$rf3@GxGyKGvrCYBxt#wBYaZGHf|HLSY*eMAs-o(cKst#Kfc&<33_neZV z8Q~@U&I=Z010bfEEKs84!ifydjs<0RMt8lGVQfLO(`3sl3qp1=3oaDcN|ETA&?f6b zYL{4Pcur^bwM0cO4vG@61dWfo+;4Nbvo)co)OK9{J#z1>a6Ov5W++hKXwUJ1woz$f|6%CCzzJ_QO z`qmeTD%h=S39lwQoBo4Z^C|j-O?3RkuAf<07>_3F^~`6N)R+{H)WPQBW&vQ7j={@i z+N^X>>#hV9fHl3SSPOww_6ey#5x$M##m3KsQ}g+|G|=xI%=C-YV99@!0Ri*|GB~JdF^FveNnQ&7q>{yUr-@DKS9(1CDCXdv>+J3A&tF!+^Wz@xxb2(#-(z*uQkLgnetQvvSq;RML; z7?j@WoDcwBx6nEY1HRB^0_=+Axt%@6vvQyg+TZ}j_&a}IO<)R0q@b6H0P|l+ZxH~G zwEF=JK3YSpVfD7p;F5SQ`T8UtYjdjX~v!sLH-Uk+FYr~wR# z9vmC^_u#LPf%|a+zFRlRiVG~J1fk^s3r)kPf}oimIM{Zm0{3akIa2(4p(q-_{Q;Kl z0*7hiqZl98NPxM#vjfOM#~bI^1q;XxD@?Y-yMJG<)-D0eonMmSdBD8ev{Ya&2qgf~ z{kVj9Y_gseU+6&AUlRUhR0c581iN?oD8I*$`WMN8 z?|^HOtO{VV(xLA=5djg1#scUnkNk0m0=^6wArpV+`tPWJXG0794WFe3%rAc5(FXVg zrxbWP%CC#1`aobHEe87F?0VrS0!B!y!4C0jdBIm5aw3 z04BVvd?udel;bABvtyB!Ocwf&l)&Jh0CXTHr;P`$2vqePRRD(eQwN6bNcllprwm&& zZZo}bL@+vLTST@P^SGutg=n;X5$w~yKPNVF4WE^6I6_8%_8NkQ z#_50y5QSF(;7fs4_`%N{ID20(x;(gQ^J6_d8s4?T9WT2h?h7*+?@CeER17ii%A(KW z5awHnkbt^9h{=QR_-KC6d#WKCNKO0rd96#O0UpL@Q^b^nG^5>Zduxnm^7u+`##;Z2 zF*uWm-&;^X#G8Cl18}=D0VX0I!J75iTCiYE z=1Z(8qyvxXwLhswhLTwcvMzH2G??$jtJMsdPh}Gq&`xGC2+I^fc>hTT9VqZ)^IR2mUJHT)DKo){8&!dbI zn4rzk{KkZh`xOH}MM-8}>%+28DuT6uIE+U&hY5)AJ=U9A)&OwTo2|oL6lj{YNK^UB zoAILz0EuNJ8`rDdn_!J3pXc?kDTINP2`3HQ@f%Ybad;&Fdm*syX`HfivDL&y#+$7~ z)Afqy029y~P)zVDIY2f7fD@vUq?lr6riPomuI7q9;MKB4`Y|pjYr4KABUGCwy1Buz zTgzU&iC4Z4&G1>bABh1n8=?qX!?PVwzYdkZ2tKK;m|y-5FhrmRwWclMc}rx{|L@q> z5f0+ttdwX=jcGDQL&|fUxG*y`P-0EeUxS~)Q3eD|<^!(2l)#-pr+T>kXSzhwH>dkQ zVy#?qH3{7MYxQ(CwP|?+n!wh(^6m&3%3O){Ur#`VXjhrkIJsNKAI@_q<$Kk>dyr4! z{^{oeYSWyxMFWOr!52sYRxlc%iIQ3JEDKF1VANX)*Tvbxqu-b&_-MzE&oau|{LpdK z1Q?=raX`m}m~B!cL#?dHkU%4E#xZbsET@!0@x9*PUYM2P={H-o__?@a-qTdn7J({i zZK&p}O+qI~0>BvHkE9?#5PN%3Iwt?ciuQM6X|a!3l2znv_zxYh(x@9aBe(ECWDwC+ zl+ExQ8GQIJd3i0?iAhk6{eN`j1~|E7Q#uu5g*S z*{*@<&(ld1V4`VQ%p->iL|MAX;dtF|_Atfp7GXb3P?8zsQn60_m8%Kfw9s)@EMY+A zk=3D`0INK$uoao?aUlLjwym5WY08(QWpnN%*}H(M0;7FX{ek!~0$E>=CxCgdQtpdYQ;Xb>6_ogKELIo1HR|g)s6iA zZ>zhc1Nr^wH-Y1$wdKEm2Lj2=1&>6~%JTx#x9KZqd@hi*zte7oWr+kVA=G~Id6toy zgd3ctFMy1&@%@*Kz(K<5!MXsri&djsFRlc8cI%vP$msYn!}#H>sEV=e^OVirge~Ni zQlc7n*<<`T>&KosYF0ojd!&AzwDkTZ>-8-hSlS!e_AX_a{Gp@t%lh)_GgSlYMCLqQ z0D;jA`QQ0hMAQW-Nu4AnY#-~{={6?p>(xI^k6L2&@335Y4)|t3XANp^KD=9i6wz6y zOvkcXGs=3bdOBR};yOHD{fy;R$u^tOzZkjVu>1Yi?X4-;{K`S7NV^8eE%|%SjLN@; z)YLfpwQ<+*d=3D2)TywULYhR#<{U*?^_!W$;k=HW#FvxLHhV0mm~&TV)vtf$cD9>f zHDB{Wr&HhiM%|0=K1?unSHZ)k;6A#J*Ot*_%5h zKm63qHD6;GmHR$HHB>}bu(j)ZqpfH_fWMxCi89gb!51h2wE}XSj zCl}&04Rso!E4-b20wWG2Pl07`GFNq+Mfa7fd@6TBQO0o-s4BRs@rszGNR>VbbLHUo zREPkWQnm7EE5m!B$#X&ep)q0U!BsHPi}Kk;fy*j(?1S7XG&m+W?+ikZFw00GG0@aH zCVLqVK^=?P3h0O5mkNtRJAbr|+6!SP3#GbzNDT*NJ^=L)_GfYh8o4r0M^&SZu?K2P;XfG)^Z!}o;<-B9j zd}yIBbXd~Bt%bn$*YUu|0BWX0)E{&Z8HCgk|hVS8j-uP@6pI9KIoZ|r6aS+&Cf zDrZ+uldVqH@`Y@U(MF+IEUSd{-qL}t`E;{F^K2*VVNUzckP<&{?3kz3yPHr+9WG&) zo|)a^BljNXb^2hf>l@=yZYC$VxiAgxooms+H-|)k|};lRk6=Xa<$r2Z2BD0H((NoKnv?0x+8d zzuy5GE+mM0W$!VPIpr?lg7U2Pt?g#xjSCLs4txsto$YJo)_{g+@wA7YZ_|u+q$U%N zOjsP;N+t^p4Nj(%I5(l|xySHBQ;?&EE*7hC@iYMF{Un=CUzRHyr>I&mBSK2i4MQpw!%7@axMbv;3DN+zRU9Qcl1s z%snCj1)RsloA?nhajnm88DQdGi;)~=?F}hxEq^}d$5>cy@RT`vbkT?faLiC_eF4`u z57agv+0dY!Gk~7k*b!+SBmu;Yc|7J>19ZVGJV4H6zOz|W>NKC!Iqly>3Tl@{UhG|l zZjD^kLk{MKKE>dSoAsJ;BaRDZ&mD=?y2n_(IN6D`bM&ou&typ_%{Mtv6U9 zDxe3hGRC>A2fWqA$CakKI|aTnd>zEYBTW9ua^))V>ZjMUd*A0*hhx9cg}EW)f5=@1 zimOV_#vUBDl3yvsybl#pe_t)U_Wg==!y+I};0~x#O!~-SI>2nIm>yFmV)Y@z5EUQv zs^LsZMFNNjcg1}gP`8lH-?8N{)Z%;HZKW^{vQf?RTEGE`Ricz^qKGL zNr+Cfoh-#b!iUgA2F5GX7Loc$EIvSb=nx({^8EkW`hlUuIO)GRGp0Gjg$Mf$%m$B} zP^u^>ZeWJ8%==TB+ehXr8Cji@jG+{kFr$G)sUibG3Z~e1UJF&)kNln=&x8|YLgN`| z%qMRnGx@G&`S?86DuFGhc!uB46h-Kz1BlT6hxvoq@}VE;?pwPOBJ$bY-?k?Nqu$Mj z8mmXPErH?w)=NN$K|mhs}7uH1{& zitt~_r*q>JOGy{sMA~s)ocdXP^x1)YNb)5qY;g;qOiY_ zpKI`r4#+R-b5zC20wVVwm0)LiWF?>qOUhLsVEI8zqRBT0X>ic?<6!pu=F5!(3!VzFHAwdkoDd~U z#x&KdaQ^)rco>Ot;No;D?_4{5`_EB@o2bA&^$)f$*})uzFaAutHq4bQ!a3^0eiU>* zoM!Nx_`GClm?y_F)=W^yI@91x*umq_dujGV#(2N^%|2;cF}a;`^^mNWKo|$EQdPd)oot{5mgfFk0cinGE?6qL@#9Wo*hmZZKLiKnHBEzDHfb+ z;*K;p>lghya8@CD=aF_zNb@?_HsuW5F1gwZkXQy40|yAA-bAvg9S)>KtF30bTtyLs zjGtb9)tewyQ%P%p*7Xwqq@^TTX zTnS)?M;{uj#v4EIb++D>%*CgXUCaK!b3)^RPP%y)jUv0w^b`=Dm@)diYKyndOmOVaR2wFxh|y}=q1%+Q|l$6_#}?TK2xO^2SL+!vD! z#-%2IB-XY~kF_t7BFdvsHay93AB-meirb5u444!BKB<y2G}bBGgww)W|!gWL5)@XT0irf$@w(9EuNd*gas zPzf$m`Pkxh^U^!~L{cH^c$jfw;DkvS_ThEZcbd)M2#wiCJG&gC;rI#o1!AVo4M)?| zAZzs=ZNn9FTeIM?(-!?>7KZZEkzP8A9_WRKtIflTGew{ILzTJ5?KmY6@;$LX2Y07# ze@+*!0j)`>j~KIP?v7-xSsjK*+any{@<%fu-NmCQuCY=+gZ1oFoyM|%H~zxR1UTOofvblhDc@wG1Xj0`L;7!iEzCy$%|s`rR4tXl${%i(p%|>$@hQ zl?2c(b8O!a*Y`WDskCoY^OYZ>C~md(MYQ!Fn!oljy0P{7f7unsTl8LHz?DXi)#kC4 zEBNt{=aIKB9C6v!kTH<59cFwsTp{#hHWRA%HdRDMswFb2k#?!PJ~HB#mz9L>b*g|; z>MZsL2`5r9?ZXNYCU;)M1?xxqD5u}-YCE37lBiqf!|sOCn9tCMs*1Mf2(m=2^S9~W z_`La{^XPF69ct&7r}C$FpA#H7h;MY37M0-JoJB62l;pmYkRt94=KiGW{V3zKG^f

bA`#YE8mfg=)V(ifpqIXF+cnq>y7Ibr}YOvyF>L- zg_-1$nPBrNb!g^plMo``8;^$x=@21tsOQ7PA7?@E#xRO%(O0^tNB-jS>!}{~clRe( zGX1-8B1zILqys)N$1-WDmG#EVq6k=j}|y?`Fl|o-@A6bM*lG8CLut!*mJ78wQqTyeSqd= zI5ifPEGTX%lk$X60OFnr}YrYcC&Qj&{x<#+;GYBR$yVA(B%+d-e0=pc0W2Lr1~zF;*9T7XZ#s%5 zXaWn|_6C!-h`b8F>CPWyhV=Ol;b#Bq7ON@My&DUq`DU*$(&D|bttw*bK3YDb?O*sd zX2J1X?{qhpR}N1SnYAJBzqZZF=QW*{Q&=8Sl0r&Un?mshkL1ucJ#l2BrXVJq36voI zLc+z?ja$J7-$#QB^1oTESq+Mc8u4cesJ*0vNF4EPg>|V+OIfzXZw(x8r-Y&`?Dg~M z$AI|@0#!&h>%Jn59wzZ`?@Jeb+?JQ~kiRyFJUsi7PO!h1p?DNoTV2|^5; zq%{b+^C3pGCbpe^#$HPsjEpe z5ED7fwrXCh2EqsfMr236e8wm`bWr$%bpA*Nfs{xKhU5%&BdhRuIS_=YW+_W0sP-i< zep32+zQgk7w6LUb`2uk&_r27t%DlnbTlj~L-==@lIz$z!qu9^6R)TBk!p!B6sNkWv zydUw5N*~pmP83;5aUoM#hv}<_uPUzW)YE6Yjbhs1s4seh{BU7B`KR^tSF3f=+{#i* zZc8f?xjjGeIiJN(vueu-wKz?w4kYw(f(RTOmzwQAaF~o1X6EQ-rLU|eMpzoJ5Kb9Q z-Ofxx)ZGz}9fV1^zMjO%=4=({Y8&5QAQHF|2P5+UE?nnG_L33<5I&*>?q8-){Y`Lq zTATL_0?zt`n82au=0e2TZJ4cVe`ZugHt%9hkIrjN`jM1ZV`^o;Cu~QmxvD)*9o&kC zKTI|&I7X#`MJSeO0Fw;9YIC>=jUUke_)xCY)lImt=Z>J?XL)tFwE0Lw*^WKo(_!&f zLCyYEP?dT`X?;n5iS(?XXjaBe6u-aeS|Kg>dbB7jnS)>G%MngQp`|aj9SP@q6aBmP zy>B(+UMa|Imq~|QJyRJSRlQhRfjkd}LX;x1k5vbXl4rBrNC*EFQ>};O_T@e;F^6&V z7feD8%QFhn%JNSG`}?E~Ac8S9tjVKs#in7~KJSk)F4r1G7S@O-atY_dh?;lbX(pSV zu-s}>&^}eGzykUC|Btb^4y&@;zCZy*5ClXCr9+ewq&uWT>6Dai1f^qxQi61sbeG6R zV$(`@cXw=3y6)P1e&0F2bIx<`{X^h+@ZsI>T63*6*O+6BN$TN^@kj6vsLgSs{TKoA6ar5E2ED9M+p6*@owMAcYoDo(l z9{JQu%DTjmyAyA%F2}WcGtx+PLyL5srI*tR)G89bB=8R?2pln+s}z-= z;>@=#a0;aeQf?HLNK^0|6VMhcu-^bo%vabG(F*9sCAmeZiuJ)%N_8*Dl7J(Q1%M?m03wRP_2mmW))R0V-;qEz(tAc2_*(G6Rf$poMT^`s(;cjY8g6 znT$_vfoI(t(g{#=qs?sV?Nj&UjZ%@pxRz9KCVjbjdxL;pVl1DqfYO?&H^hf%;w@&& zyMu~5HFV6iM-iZ#OpC_{f^VDcIYFR90Fp(!DCtaSCUyu?GDcNE(Ha5E&IaW>ebR=VR#$j+{E$|DZF z3kBaB%vD;=T(}r7HG~gj$rHL1O%`krB@bfLjQRg2U#K&0c%RFCc-4j+LDgIFtcN=z`H`9bjU0rc*B+h)4IS>O+sQAvj<_ z34^Jd1%sP(;t(Kj9X!j^Uxq0UaVr!a`S!`(mNc-8E-ng0LHZtYxkTL_&yeHKbKh6J z;Fa~E#tZ7H5BPG0cTti0-hJ3Vf=>ce+F+906dNj^SWAb)2`w|Yb`HLB-BRbdIY)VaU{^>akP3E=kAzAPI%9KJD>r_7Kdfv251u`VRf@a=MT8b;52B+5gM z(avJO6?!%Io%J91X9#w?^-vO|G7y!(Ecq9p+#VAov{rw81k>h+D0=jPmI;@o*q?Ab zgvie{J(T^DXwN2j^$62(nttz5BF(1a)4!o@!3l&U3o_JS*=w^J_hgPlQW*!*{-lDE zg@2Teq=_uVF|xZ=t3gQSg$+uXu8(u6f(*-)Td*SQZb`~S5)@N6TY;ivh#;u7l!bAY9 zi8!G!lcQ&4%Rei0aK-Ba&DS|L_?u2HTQfkzpAW~v==;apvt@eg_s*9)B4tVSh8+70 zlej%asHlpizq(h^?0I}%{`UPq(OAeVnAxy@7j-*+5K>i--dsAB(-EUm=T&vZ`(8~c zM{aq$q_y7lG@mzy)Q&?WFqW}+KW={25_gowqvbc5UY7xOQWCez0#12PP3UrXYY=}i zhF=DvyK|NB(TX?OH{=%@`}$OMP#^^xrx;W|nM-_mfK3F(HM{ft=Pdbr zKVhHgcE$VY&nt_z{U^ctAaMX}=>wbv4XTi55~E0+bqUAOu0(kPsaQm*TE|BM{7R8? zc3y>VANtF*f2Wxi-B^rpzF6#!%+O{7*9z79wW1h#lngq|{S6Fgt@N#oQ|PD> zh{zoJQ#s9{Vs%-8T8{(A^*syu(1(Q1Q;*C~PM3P4h4fS6Mm55LoLSA~d;b3O6XVF3 z;OQ#daNcGZJ$*}D`4Xn;kZ8rhYL9G+oX1e9tl`hQ!HUX~)q^F!mRP)Z{ZCxX%!;38 z+O5k$-mMEm0um90s+G&2vT8(~qTwMJ*!%r0qM$xL#*M8@gdnW8W=%?Xzw>o8?M;eC zWap>P=K); zke;tS743%Mn`tppKnJ*L#MKDi)GF91=|6I1(T`8z)M6@?YT}-!=s7)=d;z+!|c$(MQR5rzb}uC z#?y_rhp6}<(`i(+>P)(nWkSgr4MYQ9`7flf%`YV^$9JdwXnkqxw62mrm=6xuhA1t6 zjRE*)I!4TTb{c8=UVc<=z7^()MyUmA<2stkZQmVa)*g-D@hJ8a{&NhwkEg>dvBJ~M zh>vZf5~PfCyC`*piL{`@bT`6E)u@+a1jYQf?UXd+5hJhN6% zE6*JdzH7*bXuxr)Bz zLb!6ZPTdFbAJ!933u24ZC~mzoXdc1G=vkMd+rikWbli`lWAz+!9wt|m=k5X2Cg%F9 z@4wx1a;BX03^<~T2SVENsybIH2URGJRW40+?yjrvXwZz4wXOI)_hQYZC{ccc#G7_T zvodvd5K8&lFzvAHEPD!l+Jxy!TXmX!5RsWSG9l54F{f7&PJrS7L$cm>Iu%_?-W$cI z-S(=vqkY&3J-WQI08!5&lO&4Rm#@TdqwHl4iA!In9@1m{N+%!Vsw9woK)EsHie%%^ zF{;{(@up@#MD@u?x5kOADC{}$4=LDFc(hIh$@s$2<7DN>qZ?+gYiHDXe?*h*{C*c2 zM0JPOBz08(%NV0dVb}l)1&;MWb@xDBJVV9))!=y)xyM0$7JUb{^*YXME;ZDwE$a)q zpqC7FYDmvhwewGpCnximt?HeQ1zpzW(FEr5lSdwXDeoiKrXM8N=8Z!TN%U)EcqBgn z@JMrx7~Bv4t>z!x*VEXtIAEROHJGOJN(3e0%ZYO(zcT#saFJ*y_IJ-5&ro5HE)6E)mRWA}DBmnlO4Uc^ zf+n(>evc~Ao|(q4>XTV!DDu3v86|S)VjTiSd=0Bs!(h~>1|6oWma`JcwFRE(LRNPZ z)8TyO>ZHuW_qYB+-$@1hJWAy-qal6HUxtAi;EU^|gFz18GtxU~uL^XEL#jWIE?#{* zLUVzOtCyc6XWWsx%s!mr!Irw%yR3aPn&;Y|-se!NGQp2dVaYZr7xI~? z=Yd?{fiRb^e+RqavG^vUaa#(3VI2$lzm@TSlu7S+p`t^Ijp_2vYo7x{s>nNw9&DR- zZqxI7sb#3VMpeHPLPi_VcVKhof~EH%Q)hTW)o3fnaC%ztUcSAZ`iEIA;#jF|_o|HY z92Sud=P$~73cKDS8nh;yJPw~Tqt)Lr){Jr*3v(sI;E zHDkDFwLm~sSHue{@ti2%|I*u$p7=7ecZ|_VpHX-uO@sC#Q_G% z|I~7U5gR<+FnBl=r)AxkkE--7;Mp1*3JKOBJJfQdIoUj4CL=5CM>-m^hEbXexf7XeyO$g{O|{hlCML@^f}wOes_i z-|V!nevaHsASY@8LO!nd9j_iA&AiJ4S6z2@k5^I48Q<>OYd@wwxe`3Dm|NTW$V?zX zC*jTSMl16%mzN#ua>Bvp+4Su8Q$znR(RqeBdHinVUq}njeyvDKnE8v)@`h5_uRg|f z_;tj)=Lt9+E>`zPw=TA9nNinpj=oFgsvF+0sjN$V1cU&S;|P!){++D^ST>wwu{Ol0 z4=|vg=I}98RgjF=eA4!{sntvGPTS1X(9n=MENcz6;$(bsd=`=tHetM(TUSTbppZro zt-xl|Lo2;4yC6tr$!}1w`Wn5j*mANsU;k67!p9Oquf0l!^!BUERlPjb7X0TG7Uwdm z!J}i27nP#A#iMTod=?&X+Yq6fRs8PE+E;58RN5Z5XLZ<)qLm%(ca<>9;Y0pGD(Ecs z2tz;T!u^$?Fn3Dm7}7r!6AffZiM zWqOni7?PZ}aAZyNOG=9Gyp9S8Xm3?R*}u6792YMDbM=1;i^9TElkf1hpg*-nH~c-- zQN-{BV2e{c@EXv3MpCdg4P9TSJYpE1M9l6MUJ7l*PgQ*OG!Z_XF=Qg=RYSI>BCasU@eNvoxv+)d;QeyT+2VbR(Ib{R!uVP`FxTB$Zo&j25cGh;5Yi#Uy5JcZ zdRzJqK$~4RTmnwAj|hU5-R{6YOur{j%+TUKT4Z`L2aPaAknre)Yau{)<-Jw6Yof@(SN@B}smrL~Hla-?1-U z3%32;b=`t+>dd)vC||wPgCEZq@7*uFs>MFRYga#h)ib)oGQoks{IcA*e1@HLBCF2T zH+hB?0<&;BYd)yr0}#`}@jA(g^m(AZ)RSZ?_(dPnEH43uCCy+}zZxNG@RrxyHExwAMlnV;c*7oiog@~676u3P=3bHrH(v$(HxoN z4$hreHO8giDLKodDUfI@91~?PBCPXz=d1KoqQgtgoeF~luP?ZakbupF@{o1b%!f;S zhc?bwJyj06j{RK||2gzg;Nz_N9L2WKY;oS6KOssxZu{`U%h z0KH}8lBOhp>Waj+!Bz0gd>}i#DDg-8HgMy3y;2glS~nhacOnhL3;}>xhKUyb0YEIQ z*j2W~mV3tZWktBjFa_Sde^YON%gK{#O%E!DTSZ`}4i~gEFr=E$VFVDXX z7dSZSZC&1qFZ*cNa^*!>hIw#UHvnqhnlOW+HH$`*)_ZE#!snvy$KF$sZ7K}o-Ly;ZPd{`^j8 zSno3kQ*^$1#Ami=xt=XaUqSM&ra0Ybb2DjU1PksGsG-xr>VIaPR=YGrQz$U63?cN_h^HHmeb3Ok=kk;B&iq=h!Tk>tl!WhNGHdF zD8v2Wmi$=iQ%2@PKY110FEdzk2S4q|Pipq~?dJl1JD2AW2W(i%Ml)woNM?6Ep8i>G zJE7}MCnifZ&^`8{(H|7vr9Z744lC1sKsMt(Pt;T@%-p2iPB6C2++>(mi5fk5yf`Il zHU3Tf-NBc(N9){loPuN1PNzi5bVcnL+>pl+ZPw>aiY8=p7Av zkR>a%!WfSqmVDVxl7%(_by3c;q8Vjb60UHnuBQ%K@uayTsA7SU0k&=6=`8uqCap<^ zZmVEEV}*NNG;z|Xxq_shJkbhECCdX2CJIobGtt7GINj;oGOtCz`eriV(h=~VTc^Mb z#&2?=moc_uw6zn^n3Zy!a49=;IbTP+@q#@f5=B1OHPh3bZ5{l^Lxmpysn$o`A(x}; zW&4}Vtu)FjuOisg<&JUX$`;4cAQY6rGvpyZsi^jrK1X8o318oP%=W9&L%85!{ns!< z$&kE-y8$AY!z?0&A`#oYMq~-2+=87@3Z#E+0M_VQ&6&1 zFq<8iufJAwks`^Kh8VR+&|SYup{$)XL>nMK`>;VhdtsXw$SR_$YfI~&o6|C!KucS^ ze|KApJZh96P3QMEt`uZ35;3U^i{PQ56vnvi9vuH!$mOznp4Ju5VN!_* z^;Pk4EOmVwX73OtebT0uZ~)x_V})_GIu{_9OnhLc2ARheNzH$Pp%UOffN9=#WksKBn$Q?b+w z${#M>{3QiE)TU4DB{%N4%|BvwzpeN+V1YebR9Gn4ZIG{np!d`e4M6RgJ9Rp4_%9%| zrr3xi+Ng7TpJUpYf8>ktcr3;*c~CPrSS>>@5LL#TLc2Yw4T6 z(yz!hK>+Vb)$Hea9G}m+5VZaVaJrOVs)CqY0`bY~BHdgv zOHd)=lbmn!E;eA}P3Y`$1+EqWOv${C`L7{wkfcm_*cd!nX)qNE*H>%|BcPY3*3U1k<=fI}-1{&MYWz_C)^rpW zgrvyZ|33)ne+&r3yk*r(WYS!*jON$Em9ldg?jELd%+fhmm>=8Vd!Tu#7YciutpW!9 zFTA&G0S|3DL@7C`=I`$ajI4%Yrh_ ztZTlxU!56b zSqs{g9BRK>!nXwQX;#Y#MpUi)s_Gyq-#2Psz!*q>fts3Z!~I4R+_~2$N`P~f=F|{k z(1}>z_Kes}SEenh*xgyu z?}|Ui<*C^T`nwQ?plcwhe<}R)dZFWo**J2?cL?LJyjQn36En!EEQk?GtiHTVdN8 z%%9v@xRLKdHsTkXBu-i~RxnW$4bOZwzsf!m0fO4OHTGS{lh08E1CO2}lo0$A2-n+& zG211@_%5b^TrLWYyoYI-J~~J#_lex6H_nQw7in@;)$~+_e~3e`i^kA-6?n!p<{kb3 zP!3(rfRD6cmh0!}Y;`oCY4hk)I{R|UJA8(h?4;?>`rVgra#G@nXhtoi`|B}G9=yY| zTdu$cAYeo6!?OuMY0K0PcS8j=BV?D@tKHzh2!P4P>OnMJ>jnqmk=%awK#yZF!~U=9 zi#eTfID$&8Ub95I*?OGlQ9>siRVm3fGnI5S_5xY1@_H{`<9qZA%dM8eJTLvCJPV;4 zWy@_Q#+@{n_2G5N=k&8L`zh8eMzAH!DvW*_9QSVkH%^%f_3Aw8VOmG%yTgyPbw4*s zJ&EF`bA?F&-z6yHUCoypF(5gZkA)1f60B#a8;)yF92iuiMiZy_91W*tBX&mf)?npY z6*56!3UV+ARCEwRiH8gIgwLj;S|PC{je4jk%Q%ROYQNkqNt`G@=IXhqdIXR}ze++y z;{Szw!ESuGQ#}iTC6)fclBWB%|Au+aHa8lnpN57_9BQL_7<_V^sXFW`ZY4MKr*BS? zztVOWry@G8T!S&I+VE0C4|23SOY+j)@=}33o|;BVMeSBU+G#i* z5VqA{m*aXbJQ)zac9H6Q98HS4u2dS5KuoUuHn2qq=DcVSP#P6A+TB~Ij=;&aTz7}! zyk7T-CYy1fqvSKW6vx#%n2_O}JoT#Y7p|88%Vle^#g{08GXXK#9!!XjR~9*EDvD25 zb+s7mZ>ecA+Ej3hsC+s|(h2pOxtx?y3b|g6g~fR#n5Q+4;cxfyoQ`Ww{UIdtq4c+f zz)YxFv21e>ZNmIMdY@XMQ7J99kGqu_FL?@CnFXAl^=Pn^?DCrHT-K#z)or`=-4m!) zGpkaay$gZ?lt#?_dFy& z{LU$LEz{&PGc)D?T6F9uLJ%D&Sl}t{V^myIHKb_j#eWhl)YqdyajWY1Ymb&pFqi4L zm8w4VSa+e&H&?4~&wrhM0prw9ek1OqM34(_r@xocqI*l zad8(h57h`qk5-+wYbeQc8cf0n5>&Eh&>+=PpTR~z7NN9pK9@+nm`6~iM3Ar&Mq@!< z+f2IvZk0Y~C%}}|4(E`j{GH@?H{{SG0ld4V`IC$iKsw^hhiT!93 z6(15k<35VP(#q6%s80C>-ufeN<5%58BI%40&m-JujCx=@z_y6HC5tKsbZw{zQKt8O z#B~v+pT}4jzX5BmDu@t2fX{6{JqfmkV!v_R);hdHsMCAxcK*YtJ+2>LCst}Hlnv7U zdAK;=yKW+Fv30rjbL7&{co}P|p=6#?HC|}zouTv|;wd_=2yNf3TsR+{+l&hkX#I6Drgv zSMpd@N^kS%4YVf`(1fHDK!5r^IUFzQcG!>Yh#mE!NINmuCc&&J>g z7G(*R6`7>H;d^wNEzv=}uywN@$K=Vp@^st@O*jV$^Ay;+Fr6^pL%^tw0pTd0R)TNP zzS5k`FAgquzM$Mnja2QJSC46ATV6%rUz>I;`PrY@UEoNeX~Z(UCOWpVKC7pu!NiZk z?oK#`Hliu#w1=4w8tdnT3@k3kPI<%)hA>&GG=NcqzIlfSw&9Dt^Ax4Ubs~$0b@tus z)2~m>^7GvTk1pjcRkt~?lr}huo&o%Ci_(Xs2?N*8>xH+U<6m)xFB>e5`C9^UHw8qY zCr7L{&vpYz|6I>YK!%+acRl;hA6k=^{(en6&&oi>>Lh} z=VVSO4-fxrK^GK(RXU@VNVkC{Nn^D6eg}-1&nu93hDoQSKD%0-g&3mRwwP6BN=Jy{ z%updG!={wq%d{N3!X^$V!>&Y7#jz4DV@3A8QQ{&MLqkjPU^qLFM0{v z8Y=G4pOl)xsoKK_55M|ZB1l0Uit1_hsPX)(hKH4!X2&+6PRpGj zqfHzIu7qLaK%iB^Zj-Yjk)_zcH~lmu=}Dx7oDwR{$d>kVKn)8an0QRxV*+98q!uCz z>2kCj)xm-thYHy1MVuQrR12Sp7Dgs+>HlWdJ{yls=@?x8dh}>{vZOA0#&)V8iSLgL zYFp3*uJ7XoZh>kpxB97yC1~BYug&ZI_2zkWPHqdypSaiXYyFHq#>Q$We*N{o6{Lld}5tA`+sw0GFFq^bD8nzm3oF7L7U+<0T?a%mp{=V4o@^N3@Cwkub z0^AAIDgKaz25GM4kOw1aL0FkWNZ%0%06=Dki?AcsbL1jrz+P4ma-9ac$>h>yAnt%0 zPF}f$^uq{|M7FTRrODxw*AwjD9R@kaYpp9b*dWdPbf6M-HqHoTYx;_y;Lq$FN5~Q~ zNrMZX2N?|qj0}=WI#P51pI^;p<_c%jENeS@&NtZjz;dO zfKAR#)mg7w%x<$MgSmeEQm>w$J?v_36y? zs_3auYyNMFpcK2--};5LhWZ%D@Ul`_-5<_9AH0lTN(`2LBHD6qo5x1Gp0b1kqT^^Y zokw=-5tG7;`U{W&?%T1SoSFs+Mt&6EZqyRtd)U)ZtRf6nwA_s?0s3cfoKuER<3{Sj z?0%ABO6+)8!t7dr z0)tTNbbNm;yI4+!g{o(Do{nHVaj1>{&@t|=m~97Tx7(@ru_T{8yO)@npX9nzI_g%N z=~(+_+utKNFGVa$eYWS)2p(9jI5M4UOuf#R8=5J#J{v3ReT2rKrv{o=L=S{k*^j8^ z>qC&U%c;!1x`>YNv7d*@07i7)`Y!uwGFJ;mRP-e}|j ztY}uhZ9(Sp8*vu)QIKG;7!J)S&h&P_ur1pn?Xp3x#CFGur^(6^2f<&t8W; z1Z<-x(h*W$FI@1Z0-ozM0BQ~T3eOV7hbpA{bH@}|o}t`B`k1U{%7_Fjv5)_Yro8STck+$d_BWRjG@HB?gX z#>&D+7;MJ(18nA_VvBVhR3(D>JuQ6fXIhn*wd=M%zVjq7mx`p1_GKtPR)EjC>FqCf z(LuiQJ)14m%E@o~;aXfg8}t-Sb%NZ`r)RG8 zkEd}b#-~NJ$$?A5TVSJ*T-)WknF8TYpLbvW^j`9(P9+6h#Is}KUujD8S}Leax>Zy- zf?DFN#%&bcmcuH(PnB|Bnaj|N@G0B-dYIk_bLZg?{>bF}$-C$YW-f1p-_GZsrV)B5 zCrmpJ#A$=@jPT}S$dCAX$VRl?QlwS9fGG%`if=CUl~Hq!>;4Mc))+)M;rA9znIBg8 z_vXN6^9mrbjCgLv%!<%p6aFYp<@|rqCOcN#AC&}75E_6wV>(laJ6ZxupTD?m7eA15 z%tyo|IssiF{KX(r4EEr**ZKvhaR~PXpr&TjyLZ`WFHI^yaoO0vQs%yQ!$Y-y_)hpC zI4$Gv2kG2cf~Wz8+%x<09@55eWk|++*w7>?RxDklQFk268(ROh%5z4kHS6eF9yxsk z&G}2Q9O*D(CX$t(!)L44ajw>*6kPks9|UGyPUax=e+TmFM;KoagVGcJnGw>4zr0~}HyRhQ6NJn6Z;Pa-UWBIgegog`5}r8 zz-FN(Sc~ao1$BP+oaa{5U~i6eveI{x_9vPnm-0u=$XoU zJq7%C|s7Y)0+X|*8 zGSm8h#BQ_!@^v--w_TEEu`jl^c9?*g5x~|3g>2{jPkPd5fQ@AjHps&^MOrd-H^DdY#2d4bI65nq7nh9$Cf~Y&E5~0x9f&ft z)!QGpVdx^T+m^02N#GK4Li=vs?Yrac(MdPvyg@_N6SIcq#YW5;awk4YsPX8TUL;!9|CE zr005usSFO*rlD_kQ!zI|%#8sL>s-UZW>E=?k%pj0^kK)}96~(5zP+t}1?pP&WdEw0 zP%-skpY}-LxJUvoMo9%P{mHbl2tiQ^;vLoxvatJ_agE6jdy=V{SoM-9C8vrKxv=`W z(Y%6u?28TaG-)*L&k4-H=9k=Sx3a59!PLj(?%11rqLga7%;Jf8%dC}P1~5VXk73K= zjbRJs|21rROEBTV0m=SCHlUY3;`;Ktz;5b=>xJoK&Ld^woxX`IouJBm`poK(v<)h( zW6vYniQQwK_Ar)6$!)G=v>tp^Q|{sfaBGlFX`E>Gd&dqA*1+DppAx_qh{=kxCs^Ue zYYO2Z^%A&KF_|g7r$U&sXwDJ*VMhVv)E{SCwcjC@SvQQ#15G;5K6=TQo+fk0D_p7i zqKtFqZI>*}+7)*eS!7F@JA zg|K8Eb=0o%08c3keO~zhfteu&dp;kWyp?Z89-kxDx!j+zc7F+rtiPr=^sAu;eQnhx z-!hCk_ZXrD$T4VA1X;}-=lsf|Uk7s6XERl^Ou1`Zgdg5FR=Ig?AHgBi2TjJR2kRpD z`c-9KC$Pr{hafnd!eV1)>0rWqcl?m|4>Y9&A6-= zq#minwvrlw_-o@>xmDXYGJYmh}pgTh>-4pdX8lq?#){xp6?xpP!;+k+^zU9hyL(< z($c204=slj$E?Q5mHHiA$la(WRAZlCgc(8B-oE^mgz{mvS7zXeG!2HAvalSXbsJT@ zY6!Rb@DOO;G_HZq^t=wdO0)V)U3pZEfRBK~{rBT;>w@PuSav;5S4Wihb`YK&zy%4} z?D+CT`Mc97r|R9KQ$OaG>Iu0L_LyIvAIP4|)#7{I3Xlz_GAUOzqRo#b@L?qZ zV;jt*A0+YrgzP(z1xd=^7=RJv%KsIwD1A%@Ze*H=aCQ5=3!c2u%ILG>zMr9DunoZ7 zl{vHz?OerFmrhHkv8v%?daeRKwy%s!53wBLhe(bp!oLIL2;q?R)lr(Z01+Sqe*)wS z4;)MflOFShNF8u5jVjU*Z-iNt>+V*aji*z#}gby!QD?`RkUPKjWDe`!Xj`b$Xef|5gKSVf+MyKELET9ix73IKZdq74rF z$7e&X84ttHi=`Rj&rk7AS5vh1ulnw$P2M*B@ox@pf4|e89rRl?NIePSKJ|t4^=Nrh zqaEjGl<7Uc5W&FrR64qZinhE?Vb1Clvh;4X3wVcsfJqA51pZo%|NfUy5RPc56MocC zm@@!6&laId&zxqo?N@t9d7O@Hr9o>Uqn-%Oo+MssP=I<0w$&JsW=!c~{?O`Z{>xQ! zo^PwEAFL-;1%Bucqc}|e3>CEUo@gX*nw5gBsr^{$3IAAc(6e?Mu@~#p6o>z_p#F*x;L^woe#O`) zn3Ou*J}cMJd8oypkHErC*CJUWsEjdAU9UzlCf3y!tB8~Ux98>IIKHe}zCY{;P7f?5 zO1x%P91@L2evfbLA?hC5r}lS??F@n#pfK0N?<72x@*yM>&m?iSBZD{9q*IP1r4AGa_lqZmj1rAaE&w@Lkr;U}qXjQiJ9E(Z+3YD_v$E?uFqk1^FAjA`z=V#We9w5H~WsT)_zzdyoFq*A;< ze2!F0ZehNRdkE4eoVVgYK|&NJ(u~o5fq#&mJFsU6&Rr)O%jSUhtfapg4lHki@dF;JLdW$eYNu?4SMf=6^2` zZ(&dmF!j!#M}dDg?#;FzPxFAe#Pdg-<5utzO$dzU7T-&L!5(N~>*y>S^Zdz0QZeLFdaHLhvbiV8j)M`%o}8AMBx!BVPCJ&E3(h>s>^?8`#PTtwksckxBYX!6L>c0D*RM0}532=hSAXY4 z4qQ~3X6m%+4t$5#ek3KRB=Se61`lg$i<`puug^h&ga`x*3+|VEZF}>RqDDZ!6wQh- zzT)Pz{96vYO1yCjbK2?fzZ8tBVq1~UK4)w9^Vp;TO-=V#+l8`R+llgfj|?ZDsBWkb z(2^!l)=de@-8avf^ebn`RGw_vZ(PgU*Z#DkNKkGzv%2p&D;L3POrN)F72F0HMs21a z%k}!p$?0E5+&?4rw-l2YEdA5`AtrT6)rcanXkR7qG~Swc$x4#)T%#~`YqC}zKUMe- zKVSFKef5ZxPC2zOpEhU#-(h1kCRW$29i{w}kPjF1Cx)Z-BxAC!Ib*V0Ekn1SXSbmu z$d9ARN-Cn{SC}HPW=o=iH)iSSG%71qoPSh*boLF5LBEpV&L~3UfYCgakN!U5{|PZK zIO10gPvra@nMcei-5j^WO8}=8*llzbwd^-DWR6axpWU9&d&$34r3FZU zFy@f1Bho2Jz>?faTLCUQ#=uP{uQh+9n95Ly)beKACxrf_2isi^)pi2ZU3|i63$8nc z$ROpHr0Cp2^kR(KBVpv%Z>Q-|caZjq^@3iA%@2n~J9=!mRN*$l$Tmg?R_E}P2GJ{#={C9sFn;nS;!`ZyQYcv;PZQ&{I@Jc{qX z4@C_G*n?{E;4j0^0IZ3(>rOVaF(Dv-y!V*3y{|N-Ehnm2A0qiGv=wvfFVv_>6`0cgpRpB2-2#@w$*3`ZvQ^-ZKiIi5yhj5% zllrkk);Z$&ZF1fBmJ^)eTfmb+Af(>}q{&V!K@nLDzbvhENf6t^#|%hpyYeSCT+=j^ zewKw}9qKCDI*S#`H8dqWpEi7|ysg5&YOtaDjunV3F}Z zAL;1o(*^U*g* zk}Ru;39*3Ml1PRSNkQQtYj!x|<=Fn~wS;~8di-?3@gSO^QJGmO%=fDP3bwreD*6pU z@spJ_&SI@)CNsOm2@de5qwAIlVTJ3WO4m3^oQ z`_Jqs663`{59rUl27I3HfxOj!FfF;l9_?t`UbM!;&5_=D^`kS#QX>hE=(7(fiSd0* z+;@PZZ%9v)?|=R!iHY$6Gyr#*6Lb>b+w}F&b~R%{+{EUMK{TQ6&UW zPk{?Y#ThwG=iP^u|B4MDg!$)_L<4DqB2*c2wT|j);j-!p#(25D->+!+ZO%get%X`Fh7`ly54T>wKoGZrr1+lV`RS zZEL1#kI!_w=d$}V|0#xfGvhu1tpRaeuchRxiBrh~@CD73%okVx_9J8ouYY}ugTBwi zdSSjQRX)ae^)j1$F^T06T|~1%$8^itc1Oujvct+LQ1Vd#;$6CzA8)@Q9(yuk zt!B^~^4b>zpLLR7VnV=W-zS8G=K-B33o8p*6s~g*?wkl7HapT&I7u!Zan7$y9kCb8 zI@~$9&TdZDc9EjMIRj;AHikussgTk<635#le;CL~Hn@mFd-xqS1R^yM@~h z+f$nCb0(iw6T+wc82|AK3kwCuvz0rR7G8C z;$NAbU2+e6-h=kz{0pW($ZcBDU!WXOHDo5&I!_D`gGS;FYh!Y8&>(G&P%^>$Z=r6E z*0_+?Ai~~m%-+(#;Q7xi=BwnWAWF!ST<~ToQX?F>mt1bDtMqY-!(;dW-{d6ilX}`uP5-i*Tfe?JDH7#LPdsO#LAGd5o8w;B#T z$O)lhLz2%-{`w8HM0;3!z72b$PH%4dy9s48k>~x>qBrF-+P83IoRv0~4|;`iz&%nC z^bI#3|86W;uB!K;Co`E@VOj98_ZoFWrp|AcB{HyN8|2ZaPT_=Eam@rW$(*;M@o($W z(7*ZqCBuntLAXFE8!Rg@-w7nk?2>qGMX3~|~D|r5DNmqnBMOS!>l+W?iQg25x z9~S_wC*FPMURprH!V$dB)Fys(wppUQ@ar?yE{t%bhyvEi^e=vSM045dhPr;L zZNz3lo09!T?%a`p73zykF6d5crCVZqN@^ut&NfE1pEODPqpHp6`rC|NHDATY+*x+Q z1tzbL(m=M^B7oxNLnjfe zls{-XpKsxq_jo3-7x5HQ7m>$iZrWmyKIyCaI_Sj1#= zq{xpl9-I)_Z-4rk-=@H>B!^s-N==mz^5ZSOVE#-SpR<|lG=rNNm;kus@toE~9(&D% zzlYWJsvPi%h-3~oh99PQe-kBRbY4~|*47MrlMi~fM%}?CS(A{Mo4dPZ9G7erN_7Xl zL^*QY2|l6Ph3P@j8grGPm?6Mu}Q72UxndQ#*Ii;vyUoxN5REt=T$XM8uTzDUD0Kpax=zl)Y(v$#>F;Nhm4xPAb z=7htMh=}142(}-Mr-TdB)*X&$8LXv=`VUOn)|0*^nu&0n*?Q=l=5yj9>n)(7j=FbY=>Y_W2C1P-KtMXAyFp4CRFIS$x}{-A0qGC~ zq?@57M7mqLV`xdgAHMhg?|tvLTx%Q#*36vP`|SNZ&)Hj|V9i5<3pl@N`94f4EX;__ z;rb7Q1j&(@4l~NAvMA^~K&f&o(?k0skp>6LQl6)z(_PkQTLR^fcg<%{tos2^n)Ks; z+$r-o?y?9%yz2@Guv9Vx<0V)mSJ1}bo-QAq{Lh92(BeOh0DZe9!tiKF>?I-<;?SYh zD=tu^z+$D;7qp?Fp<_UYcbPYoWd+Q5z1@T1X1;KacU>yDui zXdc4&!B{TjeOV?~{MgmFOqRNL6Ake^Fl-oTTl~CVlQJP*+V*tgXC5Z*8l)Lw9p%S; z?AUfKSB6<_(SsH9JbokjfQHr|(IM5w0gmy42eN~h6s}Jic?@4E zL{bVlgWx&dp#G#FG;Ay?zuUtGWEXG}LV?W$-iUCmwZM~$jEx5K)EphR-Kv4f#(OK# zp~ufn+l*#kfJ;#eLpxTO&7LbaftrsSfXL-?Q9jw5{$6Tc zI4nz@F?CV8!3rV?X%8|=UUuE-XQ9a;_C{D;#N$i7n-=rFwEGCfz(-w34APjxr4j}? zKedD!qKJPsUr%_F;%fwlYC@T%rYlUj!kKCcsQR^G#i^tq67q3S5E=vTIm0pWlzXoF z?&>F)DmWqGAhN`(j96U+EY+uvs`EtC~#NmkTJn{Bd&~q0%SM7^zto+&HH!R8j6B2R}j_bAaCMimns3} zYM}Dld>~7=IIU?qL`8Rt6D=3L%k(>S>5*Hd;%qw+dpq`?ILJ{6eis-J{i%=XCaAx) zZ_g2B3!ToOy`r=9I8j~vV|Uktcy~50vYH$a^)cIqZTAA9Z9T+kx2x&B3ACj?oDy1{ zDm#53WKT~2Rm6OJ_|-Er;6d<=rA<vp>IG$6JlxA$^Pmqzb z-h5bQhFL>o86-h;nEn!WD^4sC;HehnVQdresgl=(e`R;Fh0BFKpbfr=PK-5rMM(c~ zd^;wswjkLWBuWSw1^QQUL^S_oYcP!-j>?Fi%gnx-91i0Q&q_u88HB=uB-gFzq*#Mn^fQ-#a8$`{aOg{6KJ!G1iL{>`Fh!e~5( zX_Fs}Xf&A(qAPxXt{rrhdoIpHcUU$X%={(#(T6y!;I5Gdp}+@SSkCZ+o+mQI6iE?v z;CqEN#HKTYuV+>~F#wy4>0f{UsTPHtG2-Kt@@oso_H*_VC9!S_9QQmd(6iZwr7ZUk z3Jl>sP<15>e4)XIn|-b-ljN08?@fRnsXxxkW|6BckNe^K8v6#FxI(6y~JA78^!Av=39CKas&Sb&3(Rlr(@m%H=b_#2F5hRooCwh8-nt5Fm~)QW1DZ9y@{o$43X}L1)t;At3?G7sN^^5*d07`_dmfe_$i~`f+!T2#JF?3W)y-H2yK1rAEhhflkc@>gEKxEM6T*2t{3Gj@Ml(yqg@Z057S@wM}mKv$lTwKqJy#KSM zm*V{v)h8HO)V9uK;3-+)6Umix4|$srfAiWRbxI&dS4|xLqgq1vxfh5uYP9=)iOrkZo(J-2mBY2iDnJ9z0#oBs3sw=ia&rIYTt9T+a?@6b# zf*(Bk2CCDUi1vdDRp{V+)nhNvFu^OKmY3~$4)Y;QK%F2r-heFfBjow`#LdU=#N)$d zV$gJLs}NY4TfQmS1MxIOFWqEv)KtBI%DE8f)l^ol_H515&RVJYPHinlQ=sjp3~@LK zv`Q)(URfYu>8dEAnDH%?MPrkUA4Oz}H2(<_N}SfLjjJ2#Z5Y{Rq;}NHGNUG*@gdD2 zo1!i5Zj%rv7f`qYIRTppZ{o!8U^%7n`0${3;5{Low8@m`&w;8+ZN+)>-zm3P@BsSK zf$z+R1)u4{9d_itli30G*G>azxmYcAK1xVRDaaIP$C>3dr@8sfT85(1Q(A#=*-;aFSA>!a{-)fPJ!X z)BEc}!TQiRTGGs{ouJQ{Adx{TE240W{56vP5oT|wnMSP{gB zwgvi}L~AWao5)5>8|4WY#)cPc2Fv!G0RXpLustUeQyPb{Y~BN=HN@N;0-NVj*yVjc z3_510>kpLkYpwm?S^$Q{Xa$j3bOkhnm#9|6QeOe3F`b=qLZ_~RNSz>hIJ%hwLnUd5 zgpxV~J(s592idS%lq$9eNdqI9OgyQ<)%!5EY=~b$SngmGDPU#;t&o+#?`*RID;yuD zCe#?MbBn}%Z^FSw;maURe{hwk{&I5uX2};~lHfjeZQns1=ko=E zxq9)G+ftrvHN zJYs*i|AYMv!rVWw5SMVQLE;vjA%iPeFQDGyJb*R*6D|6gUYo1bLiv=jWod@p>A>gLo0U zk`8pJ6S(Rk?3XJ)_wtoNozl1%o(!9MQE>sqk`7X{{Nbh{;?LsUOQ^mj$8rC*ohi2o zsUaR$`%YlD!2#;R+#u`nkaSiS(d>?AG)ZXWm!3yLS>)|6Wcf*c?y@;R%%PXXaA;=P zXbN-D(oIOQ%nQJZ{2UN~gimNpm7Dqt$jM{^3DdZ=V$nwQp%m$~COQ^xj$cPac0zJ; z9cPgasJKueYIKKr^URf8{T75bT`c-hPvt)sWGeOVDVo*^;)oKi#(X8olkkTILRwP` znG2e)zFZr_&}fxDb8YRvt`GTiuSD%h*{3$Q~S00{UG)FlCc3Aoh|JEtd! z$t)lBgFoZpM*K0su@BnDQV^tEgCx`@5(|9{=t6o9;HvW$usH1OpTS=Me3t-kBa>(< z3MGsFCJ(ck3bz0;E-lVX zp#=yRX%K?(*R@s`vV)`{l##UkFkNV4KyA`>jYbEGtQc6Wj48B1YMwR&hZZ)<7_O15 zlbkHY{kd2{xt9C1HW3YFvWr;vpfho5K^F8=G}xK4E+_n{2%llFA+0XXZ`9aIirvgAg3|3J@gU81fawJ1!B(aRSDh&M@tYmh8rq8 zktLV-(aDaExi&_!fhJnB;-+1ofUk)}fZ+wL$q7fA4}f>(Vg_ZX@Ps8Zd_xG~rXh-@ z1vzl{Z&0$BbtZ!aw~(YzvfQc_J~3EHY~-FYg>wyJngso!pq5Uk)NuJUr#f%`(2o-u zL@8LHBr4Gxs1jT}^)5ae3zc~*hA$`;=_^7w0gVFyOLj~X?EeV#(?O>pKDgBHzzhfS z4zI#rtBWKrB5Pu4fp02-JXkoEleS$FmFAyn@x!|nzp;K5277(rw(%f^{WHwC~6>|qj+qdi+eiYh5Q^^2d<&o8B)6?7i@ zDTdaB?D)IwFhzP4cN|y0v}whv7@nvg!h0KH2u1Qn6@{*HM7OFO{hVb-NTKi-?P(oJ zBAgP1WUJzGAd%@4Y8N^>V)2sv^fHSB$H;!l1y_{Q7#0Lpkgd{4hC@UeV9tD|%vw(i zl#-Pee?jP~m_kguMUq1CK{}|Zwb(jCCvb8A{pAK3H9HLhaQy3-`UJ>n^}CVX&z?Ls z+oY)xz`Cyt=Kn!QN~0LiK89cdz%3^Ti_)v0LmE5mO~{mDXD8T-P=O}Id2KYVk{`O9 zgT)aJ&?&>RWJ<@YXgtV5ODSBYN7E!2YUf;McCw)$kRmuHp;+3R^7JEFvI*6nr_{EH zXHsqSuU}Ai)$2IE3RwvHF|qC1;{Ue|atA3+C}n#8Ih3V9AS2!JX;#2EuVyUH;0jf- z7r|O(1WIX}0!H{#s1@y15)n~!z~_v;R=Rc+YQfq)=`|}*akC#x6Ot}5pyWuTzTfA@ zQ}s&W1vFT4W0P*=Zlk9csy9Sd6mii(*YkU8Zjgm6+8L< zJk2dc>$@QSFF8wi%EZeIvxOWzjgM0-}Z_cl?J^a+2y}x` zlFgWzSnso<3JA}Sl41ssl7v4qLqAT{GvynO!{Q<;Lu*9Vu2oHWZs7WL&7A{xTk91B zY1Q{#UoHuh&Vx*}NTW<<&2fs_?oIJHzTMLwL<-ikv@?iM z#H$<@DdJymzceIu#gRh0KGA?7%QO~I#)3-G(y&_shAbX#)|lQ^22iwDP&)l;++$t%+^_3Jh z-W_1!;LK7_$}0DRxJrS=D@1Mdu&?8VhonWEH|TZ4iTrnc2coVIz+yll7@L6C?YWP* z#cxM@9xajc$kOE4!nQ{M=pj~aWzs{w&VmHUQKtGuU{IU!x0UusD)V#bZwsg%X*7UA zlY{7kE4Ai$^`{5-%}~qeo~Vn3_@uCE%l%Sjy@f58%E^+J#ja0YcDAWQP$`x>Ao=)y z-`i9q1qEHB!5=q%S(*d+P&nv?O`mQj@R`v8+2F>r1+Lon+aw9si1Du@#i3&)94B(M z?>Y;NYgc%Exf9*L=B|B;enOwKQOuj@7>#6!nx%)@)zww3o-J;14WgH4G=+Z5g*}mC zyFe2R!YMLiK3oxsxcdqw8j+Ys0Ym%Uge`lYo(OeapHN`~`0ooF0k>B(y{u#+_$q`x6R$Nw({{QzoA>&E|vk}G`Qq=u#(+Pke zqWrSu?zNuYWcG8^YF`?{w0oa^`=%5ME-?}h8AxK=P;H29{iG<;SMrJZ5tsX~AtLkB z0&%FSgtNfEmwzxI%K_5wPgH~(R0{BY0sl!+#7e}~hf_TZ=jJi$FN!VJ(*0Eb?|VcC zbOR9aa3Gf9wLJ#LaAc7cGjdGiP;HIKQ51f7HMpmaqJa-j6b6;W-Xvf!*~BU=R*=-= zj*=i?Iz(1{BdYh`(*^v5KnGY3xa3gZOh9d^URhL}{OXY-HMgZMm)_dGUHB{z>Ok_nR|9@{8&IF{$vV;<*M*o;yH??fwFXc%) zUlNuUWHw*cY*&b$buHjOl%>jsf(Nd>nB=h(gazso^i?;q(~29JkIfl z_rQZv)kh^@e}I@g3Te$qZHmIq`>Se#;L_Ca{Js$}?0gOyDf026NNyZdWSc%4T#G?b zAMqELA9?W%vx@5e*l_b8-F(d0~o(NA5b#u z>;8&);EPr`otX)v4vJfG+g#nH#R}AShMld{6PEIKUUpnQL7l~Y{1>!5)CqT0;EzNK7IV@5Glus_lMtJ| z7<)wSbA_a1b8=n#pu@n!K*g4odSIspnYO>vv%b6vR1~QRzp0{1boWCQLH}ei&WSGJ zkNfHTwVH@yZZO7j%3-<2d{`W{Ej1L;6-C2U-mvsxhTDeJ9@G?U4KcfNpoaAO8m5;vl?(~rQ2Q0?k?sc78s^X2X_#RAd-(!s>PSr}S6ShocZ zFYXTRMX^M8?y>*~mAHnY$ZM*^S^& ztn>R{a!obwa=-cBrq*LI9jZtZPvQ)TTcHWtTy5XKvQZeJJ-;CR^7JC@V9M&H)uI`j zX&qes{QlQS`)JP@DXYP$RS*#f^`w{oKrjOXnSW%T^837u%3L>42CLY+g*xPRS>Z$b zn=f8CyNWsT6h2Q>Ubjqo>pNyAdQ_IK%^6uO?b4`U6RcTZ7?;`st$^+s=PQrd&28HV z>QU-ZW>X9voui(I#mk$wCg{;L0{)E`l;Nc znJq=LQ1>mHRyBxGJwC(1q($-97FSWW!(WEBFD=fv$zH#_8a;JBRr_7&O*XigmS}tz zRW*3QSh5xSXPIK5a^30ZSC6u~^4T#0vVtY^N|U=q$#MFwgdkrX4MQKDL00| z3n32-hv@DU3j4Y~YAE7I>M?Kl>$PS54u6%2&6;B*)Us<7Jb62kY+QD>o5&nOO1G_+ zJ#&fp;8rr;IJfQ-iIV7kgs2AW3nS{qqn%&7dY_iNFdasJ#9p9cYGW~J7VPn3t@l_F zUSR`#PEH6UL+S;DK|TB+IllSlZb8C^K@~CPk-(Zn~tm|chG54 zt5d*k76UDSO@~WjK8>4N%iA>er-nSy9e?cMD%+pczZrQAoAN2*>nn{=#TJRFjGAq# zgMv)z`}is033YOwvFS=Duk%0Lub&gsJ?LOz=0ZQN%Y7@8HT6-vjit)>lnx887we5F zN+jhR9r(D;Vvz8Iy5jvfr;>Gc6#C<=byTiHwrpYeYN6fKRzEgYbs98(bW^v9)cyt6 zmCY#CPIxbf`QGS2-_VjSugm*uW+69)&b%(uuUh=-zrKgl>~V}YkinOTm=}IH{Mh{Q zkZE)9OK`oztQ>FO2+^`wYuMFSpd&ZFlym0u<=Ib!_Q)nlF{ONCq9562%2d!IH;S0m zv&K7pF>H>9ThpJNhje7Hy4Vc#X%`!`T*=N-F@Q1kTMhl(qPbhP> z5}EHdW`C^kr?}+UL+@4b58 zR#a0oJeFzdpZ_$C7okJ+1+ zx4+f@=DQS)jE%f{h^yWnlxsTOjI2!g?ROpH@cSm-L^&-;t3X9^*8lPtH-G+k`jpkY zkaPNtMB6HwuW{!SFQ|MKQb@Z9fs+s_qa_qYC9(+37Sp`@l@ zA#!u=QSO74I-Lsgvh3?{KEX-~gz zAa;2tZ8j8yD}B-~?_p^**1sO^gBpLOGS#iRsm!0KVxSIEH%E_FKW-%shzjniGbnMP z(NVf!`4G|D^0$wMPE!n59_H27{xA)qpKJVE>^E8Pn$VQ%mEpa&C52jTM4a$B3AH;SFQeLwCo~D?WB2A*e&1wE zx4cxJm%1`ThX3h?sn=>K=`J8F20unaZc`sID_ePt0>?|QCH?Vh&%Si=26=3u?Pr)ynGUyMtwZh~+>pfp2b5aGn~Nao zU@whdcyGW`7wkme$jnV_>%WtD;|_ydz7CFw_D+8CQXhSL_Ia%Mfkyk*fhK(PFHkx= ze5)n)_*~&Y##Z`8ZYFejIB3se=|}p%G0y76fa(xjTb7X zN(A<9Md}$O^$=~QelDK3LozP9esmyxK!I9IZZyGJ%Mp5sQ+FpaUgBqa!ec%dJ@(Re z&5q-Ha7JIPthVeb18Zg4Sa9#?DcY~4m#B_E^21^y_Jg^LGMUF?4?C_Oqwpn>Dx7;D zE`3VpH=8}K-7OHn-*MEy3B&;ulOt0SBfK_6Y&V_VVYPgVvMYi8%HUU7h_+Jw5~9~n zS-lYf2_3M2h`=#{2^j>M;%Fo{=iGS2C6waT&#skM zDHt8*OURk982qDjp)$63>vM&Mc#U>MygT4YChXSwJLxCO++6~HNB2zZephlNx4;}p zw=jr`I%XQqltAz2+Fhqpn7zujNDpe>#%>yf2y{?}XDrF{|5)Z3K5VV9@ zmn3$Og>~aa4HRBuZ8OW*^9qE;+?2OF)r zsw~ne(XK}u1}EcBsyBZ1&^0WNHz}h9hWMi0N~~Ih7I)s_$ZQOSi_=^8(0$%Ejlz4Q zQS$QJ&TOt_?It@Zt$^2!b%{ayr#}r0hZ}U<4#T2C)?FExNrD7i-pV;LW3&I9NR~oN z7#=m&b4fD`Q%)T?ti#Yt>KCcNY=y}AA6P;WGV9<{B2FO?D}~kEby^4n>UZ9qG`ugp zcX-mHs4%!qE2_M9pLI>-0M%a4C1>1IKD}w$;eEFJz7aC7>u6j^74rAt)^TqU9tA43 zTg=19Av`!u(`G-#f}7v<<`l;5 zUdACqijJbbY9f?77u13!GYsK#;+Z#c#fDgp#lUshX0fweFYB44)xBy%=f|vjb&A2Cr~)K_)|TC5@RWjK^_aH2tM>H7HaTS1eqU77N_!_N$e? z&9u&qc=PAq=e5q41?txGsWzyNT;Law0-f=4&)cm@OEbJ7ipg;~(wN?Nhn=`08l`kkR*+1n_H8BYvMkRJ7qd%mJhc1XW&XIj`TeZ4oj#$q``KrEeWf{<=B)jrJNK~V zeq*`2H(u`^oYpZ)bOtYiB=3hjPd6fpQ)25Rg5qntn`d#2sG9@d0r8!z<;2BQVW8Ul z{Y|?mCT7{mCnI7z0>Z86BA!j7FGa+9?}lx**=^VTg3*BVHg9@^%j2lA%evdx1d2y3 zmdEPrrCno)-yNvyFt0*`OQFWz7Y8JI*{^%7#yLM^WQUQw!!wrCpZy3vo@ z_l*A|*_7>?F!&3x=d5%p!KvCey6zl=sME@=lVo|nbo+U)#saX_NZh;^_{zq^)u>*{ zE@8OlPiGpwIWkh8U(GrGX{*H;qtQuFp>9p^zqJ4|tI1J%d|YHx3xwC-=lMP`-ylmO zO!lvSEUHn8bCyI(^$tB#p4!u`5q)oJVg>|*+tepL?@cxSjv}o={CCzQf4z|TT$@;r zj`w{xstEsdPg0}q@)ED12W}2&@i#t9|<;m?Vw&NnYv0laB0z3)YS#y1h4 zdEVeUFoBJ)$2UlgOPA}N%P_l{Kw9m_)*_NwO5?cZzl;r=yUg&>mrA6S8+Hxusp8)c z;CcHfWO})|?w2ZFT%rDq+iRS)v>I0BQ+Z<&01tO0hQ7JeOK=Af``t`ZiEa2M<^Ej; zl4m6Rg}`f9c9nTg@1ko&Gmy)``U?DdZq^Q;8V&#UZAYRl-PvXrCv`M9S-*9gmGio& z)8iXglOj)J=S_4Me<^q*%xs~H#5Yp(G<7vI5L6iE!3 z+68;l=`Ikg;B1@O+h3Y5Sl_!-{_u$@6@6lGQQOTc@laciLV1cotD;K0(T0MLG3W7) zi%~U2hyD=VXEFO(gWbV&mZFHMt+2&kNbl)a_fQDE<7=QH)8ez-KOm`@^PqvwP-P+# z8j9C(eB+GaX^}l_m_hm#{zRhIC$amG_On?vrL-Hqh8J+enYqJibnbU4SwFEU-d}%r z$m6X4EqU%IslJe+C7=O=jT4?;DkExv{kLk`bGaq~7WF{5!;f%$o3K%(5dENYcKtFl zRJ8t#w>(8@42Ntw?CRPiDiQdE+_re`vw=kj{fttH$fLQcFfbbyk|bW93D%JdwA+{B zfny2&5R7Q+r2%}iU-Lb0GW*5=anaTfUSwUIxYzBbms45-OP*&UbpAEb3b)jUUg3+O z(#%f_Z;q$vcNL#H<1u8L6uhrwI6N&Fpva9GQ)Vsg{o%e6OST}nK>`4gQzCa z(o!FwbCNm@YwZs=Q3Isq5bD7Vx%WNEX^JAR$f)t~M*&jcy@~HHe!BvsiLVngHSaXa zpN|l%QCw7B^=p2ZtznKi7!Ng^{tiHBo~gmjg>zx{^xy-*@atzrX~!6fP4SJwJZXX! z3B`X5>(q#WBsOTP5IjZ6h@XEosaat;&dEk}_;>kxru}CIzss`SL-@~t7uQ(_(Vs_g1TydyRm0eTF% z)vFg{J7ar(t0Q7k7te#XiCk9|%Z=bt!QPF|M#K6%(gpCUH5=wuwhL-CP?d?Gt!4=9 z{VWmIOoueCh0Od+$+7C)l%jT_guwd=< zrz%1&yDDBaQU(pb&I_na&{qndbd^h{%Fxi+7Tpc|xDe)pO$dH(-0~9<7O>*WDWQ0I5#9(wZBQ-|C_AOf~< zZE0}P3E_{TiQk#I9_+29yRzSfo6Y~CKW3{7PuhQ98;1y6wufzJJ&o%*MiX^e9Yq4< zR*=8nrhenI7Z_Juw#sM{5-}rPeB=%+W5!8;2T@0Yn*o zZo%_ae*Nk|!gMHAj#x>&l%dq*`WCns`3;+NXCpLf?O2wt65e@}>O0Gi+!c%AWQr24Q9RIN9MK%(jQaCrla})DZ#SQ!elf;ul=EC&YnSV; zx9Qvt=!}Z#GG_pWJZw-vb9BrbyQ*+73L$uEf-; zxA1GA3UUVE^KBvuVgUueeasRenit4;gORfA5f-!`K-CWqvVUBEd3~3m@m4?lxG(1= z3TVX`miqnZW%npIMszk2f!&jEHSCl4r=k3GhgO^VA${e`^#kAWV85ijaq|1(s5P@! zeOY7&h*ajuQ!%hGauLA{miSsvzq}aW#d4hP6brKklvI_wE;&HMpJEm4HFXY|z;DkV zthi&yMRf=F&N9m_NWeh!qN~tCzW#oE@Ps#Xi3;u{QJNa{QS-b~&PER?ulHOAX~Yvc zN`bi``5cFYc^)azecFG)$4?eGVfPlAWzlJgy;jQXDgm5o@cC!U>duM#r~!?iC?L$SeXU|S*zbn& zm_yS$$8Vv|u4mn!e&Jfgt@FxQ^=yC+6I3XODBi5)i2F~8#<4|{zM@_o32enE21@Sd z8CP_QeLG($l(nW3Eq;M92mo&T9>DIiP5#ayMf~yiu)e6Vj$RTn!QWuu#PWFu5w544 ze}1YN>D?|%Dm8{o?uSK(OU(ubr1uk$evvS1O5j*q@q7(wWyi}D&nA|7*HZs+Q!n^x zCaTJGvLva*#GpjAczspajceY|>IEm&4EK^7x>RsnjibI z`3rn;JkY5++q*!gVGS|J)Q5>P@h_!f*$V20=P{#m?bLsX18ch-J@1upWH`^^XlLW6 zIKM*5zdyw43u$MGd8X{?*+Hg7ZI)$9bn+Aa2pm-PVTj2%sPvyn%vVvN#y&zP_YFha zdZ=tR7-n>(f>!|I>Uw-6rUZiog6gWOI|0p(OU*hGG9?h*in4=4j59fNyIMH?78}z^ zjZ5@Qrxb+1Zjhbo_x<2+j6YBTJL~A)h?bh3RQ#o6^XKUl@omh(ezIFP`yPPglN4l^ z?Yys}XUAYjd(Tws$Wn)GPqC}vr6S5lE$R+#T^J4ym+FpKvYqfpgR@SyQYcq(|1C z{F{L*H~N&P#yf=SHVDwmb+~LK;RjIyo#W`H{AyzLF%)L1i3din-gAMRNraQVU-=c` zC)_Pmv}1CqfE3Pw^fj;2vFl}vWHUp7sulo;J)9(cN=zqJ-%6{w5wX}*i3nWf098nW z*ap_#uC^K9%1+s_b}G!vzRj@17=EPC@~W4~{)odAMVf4$ZDPXk-keIjdm9Y!2FKs=F2y9WlAJ{Dq+bVs%cgPSLAlW$LTuPTU(S{jeh9!5*Wmzll2 z2-x7T!5H63{tFjJe7y^!cr}`KJZy~-MZ1o!jiSTTp!o>9eX3oDyj$0zJH%>lElnxQ zQ>16Mg$`glK~ZRpigNdzim(VG@DBLHFOL@YFNGA^A84+MM6ZpP1;E#KW-@Z!*f};s zS9Pctr-^NyL8SyVe=4;=3v~x zMOULu>Uwr!n8|z9feh&}a`Qjvz$~EB^;)?_$#c#&u?kPUyYqw`MpKuaq_o-YI|RLC z)5-&JJe+F3!TE6@oidgKey(>KI4x_A_uiM zJ6#5WdX%zR#oqpkANpZ^r0R6|*Y742Cc^5Lu0!WK@N+H3UT};Ff&2u+&p?a-iwU#r#0$&5d#%qIIKU7V%c~G)bk5s-%?AQI|t+Y zH9fvU9o*Bt+8L^p(uYSwnhYt#0Eef$=N`%+`xb=*RHu!%#M-^>=khW2R}TzF3(x1O zWzrKm35P)qtsf83TT@Q?#^RK)b}Nv^JT4~gl z3Z3=|&psK`{iQyDI0nLF7r6%KrBxP?6fOW~h8cZE)W3f@h~#^JcHExCsw^i!b?18f zzS;SNhfz681zI7SGSEGEZ!>coUQ`8E4RD%6jUWJ3ND(a{K37tu%BLR&ge!`iU9L5x z1ggxhe)q{QiP;_e$-9PB@*%Utb-x#H{*8zzOf_9Z(++W9vn`Og7MO+dXxDKGmg%+9 zv8?c)a+`G@+)8EjYkf*N7s%t?A+I>IS`>i(V|ky~dvgI=Hxe1R$jBn>f9ajh?cUrk z9n!D?a1P+>?`yrj2DV|rW2=a6*X*b)p#LN6zw_Nl_z+r6I zvfN0+rD&MgvwAWJE#6Z#C})3RPAr;+!F)STShJPsqShD9H^&JnVXG9mf;D8%&3ax_ z)Zc>3uzg#(k1Y4~7pD?2LG;ll+2ID>W+EUbS$S^X`rwu6in*zO8iGN(y*_tf=8%{~ zH*ogEQ(>ht#39dJ_kSCEYg_gt8{ot(d3$j&Djz8YP=p74snM)T3lwzAssV0!0k`-D zB5cNSJu|+>q%px&V9$++L+EnXo|&XVD2WtvfW*pqDx`j|B((PDK0Y4eETUG0 zHRXWOP?yON2Pz5Y$sqF#ZW}&b`>x$faH2kX_v}BB16l2%CypIP=XcYZQr<`MGfj3f z?hrY%Hc=yY2bH=5sL4QYRPYu}=#|uNf9_+Y7DHq|tw+sSD7Wf7?O}k*AdR1RGy$_> z8HbVXhi>eIkO+dYyWO)TAU@k$McyDO)hgwoy?cAVcadlP1g@=XZ!8NCSOOfGElF(; z7Kw;G>CoP;9xO~caM*@>%sl3?jgAj0D@f?$AHnZ$PMZES?4gkn7EnnQz*L&$Te9f% zro+UWH}ql|BX*b zY>O); zFmNY(l_pL1wf_~z|G6>q+*ta#ofXV&yQO3ku}iRr9?unA9g)X}$QW&4^l~qn*a0rv4n+-es1d`# z5Ek_!QAm7yL|+1ErO3cwb^NM?MwOELXH2b#=RpAr0jeZLYfklge6ai?K_f-H`>C+b zPOtz?iRgpVJyWKLuSqG-uH(3xX*lwA1E5QgRNm&upHkM1VjVFOPJ}g#Z~}G&$Qq2p zG1Oiy&!W=|qsX@}4^BQxi=e^ID@K-&sxM^uqUFJ)!w!ncpyOx%QGL0M{FmwrP`kZa z2q07t(eXN*Eh9W!ZvOH~l~V2^9WD(Z>_)?!ogpr$M2ThC9FX+#w{zqkl?qXMXtw`n7 z6F}=BXS87Jq^?;&r#-Eb=e52jq-;Hy!yQX^D0fLA`-}8BsUYo4wz0*dT1%t_jF;gD z2O%{%yjmqWB_Lo#IeK4^B=|6#eXZlfK#&uM-aHz zQ~j1tAG34(Lb+JuMCwz)(nOK^?*07GBUPqTB`2Hy!W*t7cF9~~S{2x@cy&@6_f0oA zJr9o@eWB_-#@=X6@E?@~_hegLlH_-VJ~h60Zq|Dr2$vAEYOTUrrE1?rKU@OUf4;st zdXQvv2?^)F$#4hi2{y0{a=YBA%)|YntZS^7q}X&zQthXKwfJQ%A%bV|_u-6-YSBZ3 z;;U0cS4c)!*2X{&yX)xpx+^AUzSPPyz zT$5EB-h#*IZ2|zZR;JNIKM!XJN>`bL%K}MLJE0n&C|P+aBGLIR*c%VTa`qqg^4xv9 zLB#d4rREb@8iQ54h@oIP9B7{;&zAwDw?}tg%vwM}{bS>t*}#&kXaioY`EwhwJ{UHz76X@S z_|!8&F=AD3MBqDOhXJ^!L$p^^1rqVdYXNRo!^SsjHC#I*xBggN#}jT*FL@mQ7o9am z&0q{H!nNYX4|guVWH4oXXv@FBe1B&+Q6c+c}7%86iDf16#(?d4j`Xf+rKhwm%o?0 ztgCf!pyWda;-^f0{EPpuy|<34s$2iXML|K7P(tYtkXE|8Q@TM!x}-J@(n@!SbcfQ7 zppw$LX(@?KZ#wSWyze>Z^?dIgM4PZtNIG1HlIJA;v>Q!9Mp#&2zJbZYRdJ(8E zeRh9EaqUYCl>rlVlV%mgh6BCT^Q|qf+lJ){ph2$60T1K1&dJ9ulb7{U(?I{6C&@py z;J_Uy1_qA%qPejGq?R2)n^R#;H+XCPE33Rscb_en?Pq!F-$>>vVd`~tseNm^9RXA9Y@*JreQO@nq8 znMvtuYQ3#_FPZ z=ugW&m1&q{jgm+tPd39^-+WR%8sb8$rn?u5=%N1m*Qu-{ zJi1p0Gs{hv)f}JL67Es@bhu20@i;-kCA`fcDE1|*gi4qj`^?>;7%yv{+Dx0vMu|iz zu%St__^B179xSdH^2GdVznA|;f&~Urgk&w|ZUZC(+PQ?I6feJ>p!+EUoyzvq6**02 zG~}djq!*+Gq!(Hr7htQpe!Vr#5mI^nLwT#c*Lu@-W4{@vc;uU&Vk6tff_KvrA5A20 zAnHK|0HWT3i}Pv32+i{EJ8$G%7j=(t_Oe)wy_UjpT0V%p|n>WBGHsjD> zG{@7Sd=JKzWvjP?2iB1U6{fm6SlF`dNgTCLp~pU3r;lZUTS63PUtT5wM|5&U8s@^8 z=z|};yO&6eR?@@h^SL6 zxx?Ms8aXJxpC3R(A4vna)UBbfdH|B}dIfoR6k+x4`}%;K59P1?!HDP=&X&h54a}EX z1_Lr&-@;SanxD(!X0EaMo=qrA1hjF<#+q*<`x=ru= zgWPQyCjp3bgt{q>(_oDk#Haj6wvhB^+CQydpYwS|<~@6l28VW&@^#*NAP z1@8o(yLHulWwSl=ScI3Z%BxLFibFGD%StL{+oSaqsgDffus|Tns23Ela!d2iz#M5h z^FD`T#C0#(=Oh74Yqj;L!Uf^joDy6Qx6ymY!!P<&|K~Qk!W3rmxSN5?$c6(!FK%(> zXUQ@myi=!aQK&Sg+{Mu`$r(0$ds6a&@!=a~5SVuVE^FqpNP*IqikneK>o47C`VM$# zuk_)Q(O`#!9N*ys6+@F7i4Vj|F0%Q+hhOE0naRh(zY?t2Suj}gsk$*1Y(-O zbX-reqnSv|2%F~L+cn!>Lxd#hBypHel~ zGX`_^NBbR);4HG2%{Z#e+t7xTctyqLPr&pP8#5ZST-#*kPyzv@nKMSX32LrPOz?Q= ziSF{KunjRS*&JvKPiVMZU_bL&L$cKN8L#9J?sBVJ|JBdUtco$z*ivU z{^@vzRTRpYSRYCKAcgEcu@!fnR%j=PKW*{w04utXBA@Q<#9rE=HeCWui(DpoM^4I^ z4HMtK>VR}T0WV^6BCG%2oN)%7;uSUt0WLnp0t!*1y-*}&l1IeD7>g&<99ES6vfhK$ z#JIiMx`%~$axqJ?!x#gkBX|n9uA5|MrYL}2nTJaAS{@f0TK?~72M`cuzXIv^t&W-@ zp1(+E6H=1v+%xf5v?%?-iJ(-2ooHuBPfOQ5F7GoB&S3@qSjvwc{T}tdp}ECXhO-iT zKL~<0(mEkxE~uUNT%>G;eyLm@ zx>)aiebwH>nE7me&&hm!e^7X?jF%wIY!PzpL)QK99-sz_1cUpjJ1F-o}oKo~zffO&+?Vt1JnQGz*r+gq|OoCU*;4$&A4ZysjG6zqIK&?!27~x{WKroGr~edL!BRerMgTNUtK~eM{uYbFSiRO2BuNL#C?! z$j4oACl^%dZfNEXa{iVYm+>lEBl?4EJ0!?_Q9j=$1Ls~PfVztzto-@S?r($YnZBWx zN5ZVwSH46XWAg>%BCCgsjTY=ir$-k<9g?b_HL0*`I2V?#M(d1?thaYhgj?vl`i*$S z!^Pu3K@KjbMV#7S^pMH48=9H?e0RG;|1Yj)__kHa7v!`uq=;`IO3V(|&tc_U9V+Id zDQcif@kTnkWWF#9r8iB-0cBG%PAeLV2^g05mO33TcF~}fo)PMyZ{~{Xag;g4Jb?YG zRjO$T>MN-9HkcWKng(iD@ml^3>Cfuc`;O?f@ zKoPZu7`z+yB0Ip`IFRcZ)NGz8sm)2dXx8YMTU45_7sttOm!; zRcqiuuE4ADw;Zco+b7rZMAg9TF)LSRi-$#7B48D<&!peb!PRLWMtfg-ib(0UnyeGR zG6}ekBi%9W524s@rz@ten=hD1+J%32cg&PAHWsKH^i!~57`mVB@+5UCK5_$9c`l?k zJhr}Y+gf!fq*PcE&qR3sMHZs1Oqc7uY6fm{w{7nh{tZF%U+ZmQbw`BLf3dhucCNWA z!0dX}3d@Ps&50s~$oz5ucbA|XpH3u)QEXO&G#WO@>XXv_=S{7PDB%P7jP`2O0acb4 zNU-_pd6@HqjA^jso+~Z&?OQDiIhR6nokC(i8EN>bc@MY9>{Vs<;sF7}pUwr%*>2u< z5?6pyBn5x)&VHiMi@{iB2S6DulPz|<0W}aca(w`^q0=lObBEIAfzbWKV|FRt_yvhi zz+?HfSx7%^{>Eb&$%@DTP7^>#|7@qp(_3YN-^lhHq%iPbQu8k@XVys1;jA7%a1Z`RIr2O9~hkB$~(CqShF1KwZRT#A@<5?ztQ}iaze{ej{Xs z;PP*$OcP2_7w00&C@u=!_|7TIZ4VYciD(GR7Cs4qnuXfOL9c;ue&6MobPvFwkn{2> zo(z2!1RD@4|H%N)l;Tx+V()oJ3}8;IM+=J21d{lI^1{;z7!`Tf)k55L_^l{oiPKvn zX%A>r0yc1~azQBn*jaqVf$anFIaN<8<6~R~?N>OhN+9$*uNeeN{kYfD?bay72r#bn z#KefqJs4_#qc+e>S4}rUxH31$G+pnS@Ei+y%JWTv`t02HJn#Icw=Ei#=e{vVeh945 z4ZQG2@4O*=CH=~Io^V(JzI%^6gAT?T(cn6=ioT=I# z$n@6oii2-rwV%yw!_eqanFu2U6+~G+b$Q-ok-o+T5m<)XtHvPNqzRd+i-{F@e5d3GGgi9Q#InZgyi!R{KgOt>kY!JPGmT>POlFW)W&GRC)L9KKNsA_bE4P^o|6 z@oak8C}4o|iCHEz((%ef0Z&ujGZ>!tm&6|rNMz3j30>s@`0o&a0L_9>p4Q;Ux&DnD zDhTK-lHSa27~ePsHptTyq1NyErAAIXGjpA&9_PLII9oZh;}3NTbyBt|Jg^Nzqq;#O z-jQGw`sbc`hivves6(m`T|>9Dn>*E1xnX>WJR;lBxd-OXXPqi}cQyEHC>lS_ceQAf zr~;WFCqIZ8)_0|zc^uKPS4OCGnRjmur_v*#wHHDTk1Yj^5~ z$R*VEQ5HGg^$8UzH3V{5?Fh7lENJB&SBZ8>Pc<2TPjS#4x$rZIZI$u@T5aKTiYQJe zfzJ^o1&vxY$8$Y5!E7&;ip^y3Nm$i%1>_Dw&8teP{1t<` z+x<@CG|<597WvN43$+8jWcj9(Ju#{H!zv)P)}1vM`gTBMOmzUCy}KzY{_T}qwePe2 zMW5H50>G_WjGCZV@1jKs$L0xXzSo|kSNj~z(0h&+6pu0&a|?~7!j zYE$%c%F~DzVyJ=ig7@t|Y&BXVN$;6^H+kaWLLjH~x&Y*TUN3AND)k9i5terJ-+PxW z`oO*`u1jC}!EBv4I20`3;X>KTQ8c&ZdM zS7kRV0kS$`#5NCfW*glV(Jw)V|E58)~Mx2(@#C0BFY<{>Z7i450R z{fIX^dzQDY~5kD|=V>`^JNq_tAmIEb`MlhP>WAm!~A>0PUd) zoS)bV6E(6r_hHlG%R;x!2Q#%Kqf&_|q#NhGnnl%QRIwe@9;;`|pQOLDIIz(f^6LHi zGfNZ29f~qr`eX^+jYNv~edtB}ZkAuH8>|11z9*CzKb1$%A3p257(4jZT-<^)S>b)h zxIel3m8sseW41M6jgk)qirMK8<#HUYhZLecdI=nLUz$Pdr3I)RRk*o%-lA3?YC+pI?)xVGDy=ZXkA_FJ} z71IKp3gp+uW64$S_GFa3*Gx`Ig;>Uy<|5pBHxLkzSfv1h#`(4#Ex4HdT(P-wY0=Pt zn#Y;!MaM*-B;ES(hZ-{)P(t(M+BBo=k(wDf*UVZUa56S(ww}@NJ?&~OyA=7}npA~e zG(CtN;;Ii;od54+yFlK3WeR7|%eZyq=)Ql;z@=4qoh^Bn(nsAmiPJJwl%nIy2}43! z;G>m;!X799q3Al5=RmkIKCd=ABK5Xk`IPWz;VMIwMe>7L!{&)X>2Q7AJg=k`!L@w* zmV(J&`TtV|eqH0H-I4F_QZ;b4$^6dXAL z41hyc>pr$*{_Z#ka4b;6wi@v3NN?%_Fd%9uP}Mcr0F`565M?aj<|JFM-8msW-d5?J z(95i_h-(HJA<9Dx-@mQh_}{w!^1r!*9OC=dV`^B=$_q&xCTC_10Qd56n_J9-&-g2j zTjQ_}fw?J8OBQa{$w2XHcMQ$H{BWFHuYTfXvV+VJ9DP0ub}koKC^3ryeW*`;(?k&( zc|!jxT*nNWRY-wWgM;PRrILLg!!1p4LkylgIwEqKqe1>5Ancs;H>W|brn+6je8}H$6Uq+V)p|*Rr{YIkDosVhjtLMeOs>*fR-RT+>jDq&4nU&N5i7>cEq0r9ehM7*eEp5!hsI8%12vLCtM zqtO+&1A5&-IZp?1uzlxaptcS7Hww~cC5*fYy%M!Yt;t)ofg0D7Oqs&i>a0{cVlaQN zh*-)4cpNgqiFv3G%M?w?r$PC^1tspoY{RV9ipq0Z0Gr}3x?RYOK>4-^y1`J>1iX^x z%4Zpd-*AI&3RzIwF>LpQq%0nV$~$Ewo6KRmTsH+TPOyOf;elE<%#NsDJhh&UfN5$6 zjbOa74|n;*53;*~GpDSeD^R9N87uIt7vvSnO|dAYa@jR0W6t$aN|KPoJFNbs6)`01 zif~xmLXn9+#07Blsl*eEWl9kv;{a_}saGAIW2cnfv!yAuVifK~&y_sd=K+8t@iQ85 zb(BgwEb-gs5Whltde4_Mor%o;%i948zIS2!GfAR*rxwOH3&>~Cg)(6=h2blkF<18E zCI_6c-Glf>2w{jIgwS(vDE}5hZ&4nZuOas>a%;A}@qCH}96K{GDeAMVPF|oPHr1hh&MO2BA0OeW` zy)IC0%JtkR>kQPe5`bok&>pv3QAZX%^355cqz-%M_#_?iF0V`iszei6+wsDl*<859 z0tHPKl+}Ft3APYo#-6vEjpQiYRH2#y=P|I~~%~+=92vdI3)`pw$a>JlwD>KXc=1Jp#6=!6HWR*PBTN ze7d#Ft%p4Q)uG5`_RCGg`2V!#h_GY6U!(vmGdf>#~Uhu z_pp(r3%JVQx3-EEjJxk_>&c`58>cTOCYoB&0u>L6(6qc-9TJ9fWJR^Un2w9sT%WFy z0&o!>V_I!2224=QiEu2pmcCUUk^IKR+=+c@*aZ4@4Oh!fJQpv*iDi`JKy32*#Pube zJ$_5{Xq-FdoX_?7I=;-61&hp)1xv$ahc%De?(?{E?Q~F*Xmew8U8TY4fJ3kTT@s>R zb5A;JV}TG6y?P0%LucJQF|Rad`FsutXKJ`Sd$T3>@v#=m{iCW%WPHw=SB6kP7w`YS z(nV^S^!eHv;3?d(pbX%{ErAahL8N&EaEn)+>BPubh;ZOXO6nnyu}yi)54dXz%dlUQ zEiVYyIvn()S_|JEw^WX}IzC_q@b3dukUi~4VC>0HKYM;j5=P7t9!|uURs9hljM*(G zLIsj8&~jx`g7M0<$Xaw--S~edbESYZ9yvkXR%v(07H$Ufr3D(5H#_(2^-@cs;v}b` z%~EEB;Zl(DncRByfG{e?Iy;-loM0&bYgKPL-K+}p4nT8ksx!NSe^cmP_IKC-sH8hP z#qDr|L`W-eF!-xL5f6CEAdQ&eJVnuj zmR7Oigfi^;hz$PlNR^$CftDQG8gJ2wa@~9is$fL^cOk%)#V*Hv8!dD-T^zdirNrv= zOYBM9w<_xn4#u@~Y;zj+K)c1U31=~bMe~WzS~M^33Y1^kFe37tpL^^eiBRbs3Yu?= z^(0bd*EM;YdGomae$t%2>4Z&?N@gg+Q+54G0@G?O3!kZh8t z&(K3%P(SCkhBKsp1|bPdX*Oo?ZzRD>e^8t93KUZ}U(0y9_xxqR`#2)C4I(=%BQzV} zTMJC;sOQYlTS<1stR2w5efkVIF#ZH=dB_PsFdjGtP2A9dm; zaM3je0RrNib1x^uWB>S)SLm30E}PO?)h?i5PPLSOdkwlZy#Pm#`8~{LgxgoZlp$TA za3l}UdJ%>XfTEWt9T9=)5VHeNOJTG@#ZtIWn4@f3YNYcg7A&7JRR--b6;8(W!LcA) z)$t3?h;~U#Ql(k@oew*vjA_y!&NsZu)ZOGod9IvfZ!Gt;5MbU_{2a31i?{WWd~L-= zD%Kx)Y|8uMq1r1>HX{%cMX5&H{e|Eou81=yQuAmSb$`(H|-DA*a%J-XG>a)+ZBl{@krWUVlzWr66Yj*|+ ztXYR_3;pL{Taj6Bgl;3^+#`C2xuj$5;+hBT4s3B()(byn_VS3DFO~Y(9?KUHqUu*w zGB4v&3sMebb_Yj7E?NdE<`5AF^Mf-+wv{DXZC3wgJSP1Q!SM`qQvB;EL3br`(za{| z6NPQ&-kU|dm;gEToQGBPa1&YrF1Pm_+c7kX1#adE`J_$vRhr`4tv5h-FdEq8a!=#& zR9+kfvh&u$=PH17E!Eo_{$BX%v&iko?8j+O3EvL)KaiOT{Hw(o84nQU_{4`N+Bf<# z5u!}|l@jt_4I>PZ(`k@F%Sfl+Lp~Pc-gpfgXez3DrHC+}+eUjK_6GqErsAJPIdcHJ zZ4TS7rm#(=>-xy)c!AXu%^z|y`Jt+qKv~{{6G*$La|K-0Kx?(uYI5_SH%~y$D&GRJ$t{H62K+_CvKx319wIAx-QK zBJ&lA#GvQK#iD}H3j~u9AE0ePXxsI4fW{tzd2G z3HqE`rfwS9RhhHU^_6UC(vNPV>ZMH%{HnLc%T>HD$9_EwIn2XC3xH(u2X(c~p67@T z91T~P>yrKETK$-32`AB`Wj?QP(H!A=RmB64?DK&AW=Ok2X z-z`I{{-uu13fcyn>8g*~pV}G_Z_eNGQ>5f;KtY4?z4`SF8B6Gv&s$W`a`#SzEaH7C z!Sz!WG!b5-)O8djUbIB=DxFI>K@x{y@?5Mi|Ci*ok9-Zt8)GOUnxeA;Qyh40WZm||G)x%j;Tu|>c_ z7gDw(m*!@e_Ar2o)2$QPAuAsf%tfxK0!Y{T~x$z)LR4F{4gOw>`*AyZ?))=J&I;fwT#q`1|#$pPb&! z3v)w$Co)N%%oJvE)V>PRHm`ltEpu6K7xE*TUXh6#K0-THW0x}1;3~VpS;(B`<~-V3 zuKPtMPcgYnP@_~|4eDe|!)$0x& z{&vw=2{mZe7oS)WL!UiR}j$)z0o;4mp`+UT~DADH$hgjsT|e^Mm2xCgy!%Nc3t86?}{d-~R7`N3r~ z>8JFGqa*~*J4A6&DNAA8sST61tLN0@-z&7-f!+! z94`e$colb;`b7a1VeNu$!u>kjWr!c-o*_u;<-bX4VRMkF9@46RCf|SIs6ATtg^sKD zz=cFQ4(fU5o+PP7{zQymYOGGJjdZ`HgUsA*Md`Aci0_2H+KZ6WVPomzS3KQ&W*D^( z$yEitul5r7q8W>G6w&dw{}CBX zoc3;J+ROe!-}hjtlCcOk$wV=VTQ0zxx3b1HMjG(pm;EK^M zcuS#FFyu?;+y8k>A}ESm8XD|&vu`LVc;<^%aKowPH&no|eC~ne;g9U1p}~Tl`bSBC zX#fgmdS`o2q_M4(m=eL3ZzKNa72S6(#QkE3Eve`K_kjY>tsA4RLZ5-Yv`3KBEAac< zxyqrB!Gp-E9PXFcvT7GSyw84-PFBU5nu>v4(FEqb5T6JhV%gb+7*YrubW4wwd8q)t z|9&uhFx(pjmFzV)5|{xaEx30)Jc<&$qYnjm*7LYGsfcaOB+ewhz7J+=4;IZwNBMt0 zTO<))5#B3Yu=6X3Y1QT+?&XyT2aF6k7);}nYOoz*`TQaNkPCXizI)L?XJ#8|uvWE@ zP$KXOs5oF6LWMX>VqhUqVW_YZ4RC+_V=&{H=ttmQ*c0yCsAO2r5z|nn{qYeDjRnPq z?v;c48E6*F%}nb*>bw;R>v2|eq&9$sMGB1NYrd_Ky8{LnYBK{f%>KTP34Yl1YlB_> z%+-v$@-mxBl`s2y-8|mSn)XH0s+ewGVw*6>zgjW zJ+e!P>z9aA#P#@J3>vTkDA=D$h-VTpnCOBnc%nD@hyb{L4VEztsf$9y%rum>nd~(U z_?4wb3itxt7=jq86_CpXque>-8VL-0mkbQ+hv55ih+$DcE9C$4uwWKsfDkyqQdL5} zqQOe^3`~N+>YV6+@6NYZMS$xk2!Vf#1)S6_K;J*X0+;B$1Cy9Ym_kUND?GBQgW4A` z#O~ik2-f#kQeVB14KZwna3%O$mYw}cJ>-4AikUmsh5vzhLkvAP3Z`2oS$0-jZ|{z%gQ&mCAo zpmBD1BjO7ch!g!%{D0m7*oynj4G4z)()j<;8`|rb-l5!Zd-Zq5U_X)5YaGBs0KxzL@m>r3wom)%4`VGr z$i49#(vK;tWFO(vASnG`H{H5jgWw%{-AV6c(6OMojwpRYf|+UD8*R`3x%oin1|lq} znkBUN3z%X&qjfa3gjvEfCIyLqP7K+K1{|cuXx7D8z*S_|?|$@+jG;0*S11AdAW>`0O{ zK9!pUKE+isij|obSG0bqiwbM1U6T3FR)VWG3I7MrTfl7D2h+-8Lus zi0IUE%t8vvX70&RoKsSzk~Y_JSw7QDAI(G@@nfzW)gL0z$bYAST%_?m6R96Ujrh-| zT`&QgPwrPp0#nb>4yJ5_Bc}A}7u>__LJhB03Q(@AeA$g5LATLMzW;lATwW<*cNpP> z@kX7wa+Q=)GjzMQx3#C*a^jiuHs4v))Q&eF)BN^4eZ9jjg6-+7MV z0cVbMN8Te2lOjpVR)@9lQ~`GxuaiA@*I#=yxng_KJfkX03JFZGI~pBS>{Yx@XE`Jq zJ{KrdpjWs3!MHrP>jn*Iq#1(KrSXbMw}C7uoG4cC`a&-lpOIWV1jhmWWE9S6GZ*Q5 ziY~L-r!}+cvVW*(f3PY~tNYs==CnL%SnqyZ_SXGb3SS&&#&rFfmq78f^z}P8+QimK zNp*=dF*DQHs`_*CDpqIDCkW~MpFLrr z%c*MD)~%^p*@ojyqVj}FNoJ`GVg9$>`{KimmV#PetfC4&b;DmF&8NT#xLdVbRxM}8 z+vfaoRi?`@iB5OCFPQl6IYwDe*YXVfjHRtSgpC_Wgc8!7?yn~NhBrR4rU7b~$WGOC zrEM)6n$7bugFy5Z=F;r`x**4c*k*ye9sqvCMH2up8fq2g~|>;-qpe`#f6uG)J&F&ZPM+BnHY{<)gJmncrEgC@4fQ*3%ReBc88Hcvg%LOztDordw*Vb_T% z{0ypvo$>pYB6lHWeTtWhou!K-T4tK0T)g1Ne=Dc|Vdz3%fTV9)Na4553r&BaOV_L^ zj@PHRHSVh|tX{7^)5E1G+DI^F(VdF9R$uLKc!KTPY$ty?i+QfFIrb)8NEX%uEtWN) zRVwlKlGObssd5<1<5Y6(R;dr4XmF5ihL#va_zYKjV%F9W`=k$L&MxW+N{usUr5Syk zdP>CzWp_fyj3Iy){%APfq3G3M9z)9IQGLf*Fo3l_NPT70tsgtRmH^a}R5migXI1E3 zUtXI1c`jc7S;brs6zXNL%6y^Y zJSN~Ld&_8rO4qoe8qh-Apq>u+s}!SAi<2UZ>2TPo()F^u+400!>+;wqy8ceDvGeVg zi)DJyVLl9h41P`J54qyR@FxMLPNqyK_CHxJmK3n3c$v4RA?CT9LQimc)O}N`!zX-~ zlr$AZd2zoKR>0;uu&)@e?ZfyCzQ|=!s_jgu>`bZb)ao3=Iis)Z>pJbnOyOypb{t2c zO}cATqN2RjmavWQgweQAZeOWt>;P~OH-|o(@@h5ORbOpf&SjpZ`IrDh5y*L?PC)1- zoXt1xq3+mC~_O>pkj{IQUge!b0>l|mF&V7AV7Z+^83nr)@75fx3Q?I9Pg#Hgg zys_%^RX4J^N8ZjXzl( z%Uscj8XmI{?OGM(T$vS)eTkj%3EqAVR5w`)YLDk%VJY1;FdgIH@1uq}xNNfTb}mld zY7foSi&+T#Vmfb=#K$2*z;5=7sB%e38y;Y3mJew!)n22zK>v~@H94ow;YLRu*s)3Bp$or(af~7uYIfR2{1@b6$m(8bg07~P86@I5^mIS4l0u;+;1FRbP1ZxH|UEpG!hlJ*4}ek zmRZ~W%nRw1s^qXU)C6XF@CtqRMba^|RfFUDa{nx^a-Hf-8>S|v`sdH@F%M~N(G@j}LHONktO^&FvQ(Yhg=3W&APZ{5+x6*78S4b0BpJ}7a z#0~8(ZDuZ`sX7RFvrubTJIJ(4|Kq`bln!v^(}q_eZk8{zJQ*tDS*E>?OUwX+Hg=S{ zfw!d8RVHLnbzL_`BV-+8tWv=*`n0h(qxf6TV2t{aMcgbWeYTihcKD#u9k>b3hD)wJ zJFR|||F?8On&R=&!TCZv4}o*p%hMy6cW%E9yO=dkCbaP44erOw(^Q89Ehh!=>i1^j z7ncNMIXA`?A!fC1mon=!jm_I-jvv>kyjyO&!Be%B*0_kkg5&GLn=PO4taQ9c;_(C$ zV|G|xd24Eogv~?Lo2H62cDgDJ8=6$Z_Ta%EBwms8-ddy)=ue6Q23(5mg2}%g#Ex2g z5%vs}k~-!%v-^4Hr6iT)5mCe7#%HZ+E#EVJV$%rycYzS{Ql2i(X^x&k*8EgX@yy!+ zfU`~<4;7Nx>{q=weFqV1O34>Z=^xIw^maX23`%P)#C3m6`J*>_B_#E-=ymzeMp%y1 zT73WUJQajSAqAId!w!0n82fR)>?@dC|DcWcA$E5XWxhUfKFO>a(oArGHVq0 znX6gfezq19^k#Oh5VECWUV3;q>!64pAqpAAT8EtFC2paH7~Bp ze1ytH@xlqte7Zi0R`0PAyxe;pi_>Kw#ga4dZvK1?gxh#D`_dVMa-?G<-asVQJ8kte zR+C_>=jS`EPQUX=>lt5ZvY7V2sUdgcClTQ-UuSS4&rHkh>3;ji@kAOypQNZ#*$E(g zQFWsNGo;pzGA8OYS!Es)~s_@oQL%8P5*HB>|T6)z4JH1p<%IDQQK&h(J8L{xN zNS)<5ifx&_d-6pGx(|G5{db-brULhl9|f!UpL{{=b`2`5?7~aDN1ZWqYK$`Tp}x1u zJ(mro!J)^JzjyK#({sIL3kMbWZKm@aDz*ido5Pi}wdIu}4nbjl?N)rn<~5tKb|>Y6 z*E2;z7&j(-C5M9|FcHfzjBdQp|27LtXkLd5D#TfTPc|MdHONP%=duw?WV4+4+v_SN%|yMVe(g2&vFC7;FQN>1@aSMqw!ig zaWuQEIxSq+oL23Z>)PF?($*0NG2nR#9-{PB;IRR8EcgCcE3$XUR=7|U1+6EANkD<= zQw@tHL z2jT4I-|Ty`7Ng$cUVN@19Oc1BbT|*z$F(`E^l3)gO{AI|9(oA02-!pqGDQ}zHGX~! zJ?)Q<|L3!SX-UE$WOn>I+r@N-5IR=+^cicOSL$ooHSbd`x-o{G3*ae5-^FS1A7lzZ ze;vJz29r}p4fOeQy~V%+hKS4)LJO(Gx6XvWyzM3^ujW25?d{qVMT0fHf+^9kbQeK!{7CHL9xN?VcTt z<=r8_hBUb(mfp$%K6+!BX0k$+e1&(8t$J5#7^M6;-t<6)L9nBlbC)gn=EU;h)JXJ8 zqaQ92y*ysMsoa$~eFjpsF_TN5H!hZF!h6?QX{Z#_X>#PcSc6`C4NMeCiMkat zda!@zo8y0M%A2bN;6-2i4qG6A!eJaj2$utU(O5J$X}^OdY-YeT*8&#I^TBd%Sug2w zJ=A5VN~h8=?(iXuiql5dxv^$AMD1;Rm-N2soJar8*xe_ToeyJNqa0@YJU0@g-+9+)8?d# zoAbK!{Ocif^$~r*uAswDcwUI`iq^0Hmw;A zH3cFKfOT~>%KK5tu9oZ%rJCDh&H||>lhXh7?4ovq6AyP(ugOsfk5P||ZkJy5QzWn* zLii2`MbA<*jqdW^;dS!LysaoZdc=s(!%Q>6!=8I!Lre8rm3fYB%BRb&-9%|M@|sfl zJcqdhO~Q1#>aY#fnGqp^dDu${A<~`4AefI&v;H_t4^? zXn=rSN3<++Hl6Wa&h?-`mU_872_bnH0h=8LXMr>$xBXTHLt>+5R*kI#I&8G4J{fK> zRJ_#S@0f7KKkuxc@7p**I1x+VY7jqo)j^e`cJK7mqeQh#O*n&<)gyegaIfLYW38X~ zDOXbl!v$U02jK6qx%89;4K_Y?zMyj~LFTlC5zUu1^X9C(haJv0a*{^!)gL65iU|;7 zW~M1}oBz4$2(nfdYKza*>+3gL=PzhP=!mO7Pedv+xSh523w5Lg3Ea)r?9k9jckrNv z$1{b;vxP>zMNeo|D=KvAf5?+$4>?cAHl%wng_7q`~k9DeYzs^ zV@cAeRBrp8P;SzmYwC!2^`FySU0;p9VYhR0WNFqz>K$RzO7^QRst7$(wNSY}?#Eu^ z{hwJAJJAAuZe2i+$#I_W8qQYPaWO6dwuEk-<5yF97*WJg(O$DszE{&#jhJUP>7q6M zjDFyQCyQ&-bjB$(RkB*%Zhv~Vz(jqP(I;7|dei75s$j!19M-d+I3vuU1@)t@2khKl zzY-ZP91B$$u9cexZB}R2Ss=p&$eb0gjNe(|WvXuwPakA^5vlRV7u{yTjh%JpQg3nH zcPUxYbNXm4ws>~c^vxzDey1vWNc0EQb^l8{bbkmn6Nc!Y0vEAb5y)1A&{EAxxd!-V z4rk00*0-rmXA-#0!8QZqccMZ6c9+cAU&iRUI}7RiF58{P6RVed?+{MN9T}axL-a2U z_Hi~k@I8}e2^OcBDwnl{Qf=i{@BWyWsA0VhUN9lbA zyMNNntEd-AEnPN2`~GOy&DS<8f4d~KYSio+QXEgEa*EvO$$%E!}^26m6G z#~kwRhi?lk9&y16M`)a+3NR$iY8?h3uK7+z#6$=Ma~zT&K>T*B0oP`yvyrpPVV3)7 zA$%zs7G-5)E!LMvA$W1pJooe%ICdE?nSmG>UNN@+Z$h3FX{*UhE3#RegNX;|g)bEk zXh_wwtUP`I({(n5P1b}o&GU}BrfpK=TEwMkTRQ{qMRRruk3ceuj(#~j@XF)-sCBqr z@t#(zd8v+BzWQw8nDd5avx{HsbCP4%gBtl^;KI1%{@iI)4wSN@@xteT;U*Z~k(5b^ zC-2|;z7-mc2TR^)9Xmf7bw4igz=CSkH}oMQ$p4VKw~*XXCwXpIw&MmazD*&njeD&Z z4e)afdCxZvD|oKC9-rM%^IeYRl0$two14=l(WBPvfuAb+hK1 zt#hyT*XYTVUh0Skc!YO+9#*)#w0LFA?X()JpOz1hHP^Bw9`3Kp4`#lJ@H!2zp|ABW zMBO<&b+WuGy_Yr6yL{xmJm0Ec7O1bn35Rup9LpquLy@K8 z__cHjN7{j9b&-O#{!7yE@^;U1&uQT7z@{jnTzsKB0Xa=G`LE))u#qY}|&Sz)NRD9lM*j(nCXPcaPda4V8 z*rdMUYS2u`ciLOGkk+KdgjN60AV7>1j$(xkJ#7fxP?{oDOpmNw>zA6N+3#Tu2$2H* z;qB?4xdzNVQA#V zw*UDUDL|x@)C%{XA!74Ict-zYsy_Z;0(Hy`h>%ZxGz7Vhdc9soFP01nuk+NCOBvvyYOB/NzGabaR6afcQSlphg4SIc2/31e5FAloSycVMn6XT6ZLjABc45l3vlCZ4tt1eSrIobkVE+QV62neDzCUJ+gGL40ZadsXh+1FhyyTJj2xvu2HdqJxrrmmW06k1UQnDFVn1jKsqSpqpnI1KKTX/aQvD+riuSU8dwlxLuWr+yTBWNFWEc7Qc+UZYXdusoDJqRJbGzzVWqgmRi0zHhiwmeSSFU01puZ5Rr+CwwzbrLJ0bbk0laqkMW3J/xXXBxfbt4vKTy4vrKjxT6iBsvj4SvzY1vSAl3WmqnyJvxdaWohNaHB1Zmf5mbqJ3FR4p1mVG9gzfBZ5uCKXq3Iqke3YAkwFaoJYeeD82FKJWhGOn+I5WKAdannOUlGJXQCxaM85ngQtY74EWS0jQFe6WkeKCdkXkSBqHe1twBvNHtk+D4LeSgViqWVMkdTDELIis4K9TQ9Dd71uOpsRUdwrGllxil5a3vPRfQMHT8ADWxQ80VoEvegYIspEkWjFGQoDmOouNQMA37FCDPpaB9F7oUoPC1KPCRw8GtkGlxXA7eBe1WzBbtOHbQ9tEI2jF+LbDdt2gmygXLq12Z/gaI+yjqQ45jV+BvDHngQP4PXRVM6KcfMJOCcyqr3wD8CA/kjt4bezR1sJ+giCuDWA/w6Nta2IGPVY3lKUzww9W2hseOQys3v7WjuTXc5Evt8U6RnJU5tL7QlWhnyeE6uFC79LpkihF9nTmUKkAS8Iu8r0I+cEGyXo2Q1uG6lkQxUf6v9+aG1jxQFxRKK91MdxxqDirx8xqbN4L8e94aSPqQ1zL9vFbghhp7A955PKJDQpPFaJ0RpQmdL46U5OKBDoMRHcYjOpy+Vo6zgfGWOuyqr6s1VzPnu5IsWfpHcUdTHB6pbEcVl7ya4tyqymGEltmp/nzTpHBSVazBiUjlmjus9BNTJ/P4IfTplql7M1O3/9XzTuzI+dYsqzs724EsuLvvdppVKLT9/bq6ZxfWh71k3B4NbmTP0g4bw7QZ7kxu8KCZ83E6YB0wE2uZ0gNyPOyXU/VssevqqKOTcEQm1iYphyh87B94TDtmh1vB6telrY6G5f9Qf81NzbLud+7QE/YGnvDAUwOF46kWc3vxn9C3W8h+0amzLmOHT9QZPDh1Sn46AAQ4Gqrf2H5Y+t5LpO/3pf9y5ScD4SeO8GtPt1QyIIFK45CTOeVn7ftqH8pS6Ef2qLGCD4wV7E3eMVbiaChw9LJQSfxhzEUncfi2weJ+gvy6yeCn3vSnMkkQBs8E1GhQHFP26EDZx7+U6qPoZKDVg3U/yBDYC3VCP47uobv/U7eZvv9zHF/8Bw== \ No newline at end of file diff --git a/content/en/docs/guides/install-guides/explore-sandbox.md b/content/en/docs/guides/install-guides/explore-sandbox.md index ff8ba5dd..8a975bcc 100644 --- a/content/en/docs/guides/install-guides/explore-sandbox.md +++ b/content/en/docs/guides/install-guides/explore-sandbox.md @@ -9,7 +9,7 @@ weight: 5 You have installed the Nephio single VM [using the installation instructions](/content/en/docs/guides/install-guides/install-on-single-vm.md). The installation has done a good job of installing a complex software stack without any fuss. Let's take a look around. -![Software Installed by the Nephio Sandbox Installation](/images/install-guides/ManagementCluster.png) +![Software Installed by the Nephio Sandbox Installation](/static/images/install-guides/ManagementCluster.png) # Components Installed on the VM Itself diff --git a/content/en/docs/guides/install-guides/install-on-gcp.md b/content/en/docs/guides/install-guides/install-on-gcp.md index 4cfd3892..9ece4a28 100644 --- a/content/en/docs/guides/install-guides/install-on-gcp.md +++ b/content/en/docs/guides/install-guides/install-on-gcp.md @@ -672,7 +672,7 @@ git push To check the status, use the console: -![Console Packages](/images/install-guides/gcp-console-packages.png) +![Console Packages](/static/images/install-guides/gcp-console-packages.png) Alternatively, you can use `kubectl` to view the status of the `root-sync`: @@ -1248,7 +1248,7 @@ ID START_TIME STATUS You can now access the site via your browser, and will be asked to login as shown below: -![Nephio Login Screen](/images/install-guides/install-guide-gcp-nephio-login.png) +![Nephio Login Screen](/static/images/install-guides/install-guide-gcp-nephio-login.png) ## Some Exercises diff --git a/content/en/docs/guides/user-guides/_index.md b/content/en/docs/guides/user-guides/_index.md index 43b65121..bd91e34a 100644 --- a/content/en/docs/guides/user-guides/_index.md +++ b/content/en/docs/guides/user-guides/_index.md @@ -48,7 +48,7 @@ Nephio is establishing open, extensible Kubernetes Custom Resource Definition (CRD) models for each layer of the stack, in conformance to the 3GPP & O-RAN standards. -![nephio-overview.png](/images/user-guides/nephio-overview.png) +![nephio-overview.png](/static/images/user-guides/nephio-overview.png) ## Overview of Underlying Technologies @@ -186,14 +186,14 @@ A package may have a single upstream parent, and many downstream descendants. The Kptfiles in these packages are used to maintain the relationships, capturing ancestry relationships like those shown below. -![package-ancestry.png](/images/user-guides/package-ancestry.png) +![package-ancestry.png](/static/images/user-guides/package-ancestry.png) By tracking these relationships, changes at the original source can be propagated via controlled automation down the tree. ### Package Configuration Journey -![package-lifecycle.png](/images/user-guides/package-lifecycle.png) +![package-lifecycle.png](/static/images/user-guides/package-lifecycle.png) ## R1 scope @@ -240,7 +240,7 @@ For the purposes of Nephio deployment, we can categorize clusters into two varie The diagram below depicts deployment at the high level. -![nephio-deployment.png](/images/user-guides/nephio-deployment.png) +![nephio-deployment.png](/static/images/user-guides/nephio-deployment.png) ### Management Cluster Components diff --git a/content/en/docs/guides/user-guides/exercise-1-free5gc.md b/content/en/docs/guides/user-guides/exercise-1-free5gc.md index b41409e8..b6387aa9 100644 --- a/content/en/docs/guides/user-guides/exercise-1-free5gc.md +++ b/content/en/docs/guides/user-guides/exercise-1-free5gc.md @@ -41,7 +41,7 @@ These exercises will take you from a system with only the Nephio Management clus The network configuration is illustrated in the following figure: -![nephio-r1-5g-network.png](/images/user-guides/nephio-r1-5g-network.png) +![nephio-r1-5g-network.png](/static/images/user-guides/nephio-r1-5g-network.png) Note that for simplicity, only one edge cluster is represented. @@ -442,20 +442,20 @@ SMF, AMF, and UPF. For this, you will use the Regional cluster. Since these are can use the UI to pick the `free5gc-cp` package from the `free5gc-packages` repository and clone it to the `regional` repository (you could have also used the CLI). -![Install free5gc - Step 1](/images/user-guides/free5gc-cp-1.png) +![Install free5gc - Step 1](/static/images/user-guides/free5gc-cp-1.png) -![Install free5gc - Step 2](/images/user-guides/free5gc-cp-2.png) +![Install free5gc - Step 2](/static/images/user-guides/free5gc-cp-2.png) -![Install free5gc - Step 3](/images/user-guides/free5gc-cp-3.png) +![Install free5gc - Step 3](/static/images/user-guides/free5gc-cp-3.png) Click through the "Next" button until you are through all the steps, then click "Add Deployment". On the next screen, click "Propose", and then "Approve". -![Install free5gc - Step 4](/images/user-guides/free5gc-cp-4.png) +![Install free5gc - Step 4](/static/images/user-guides/free5gc-cp-4.png) -![Install free5gc - Step 5](/images/user-guides/free5gc-cp-5.png) +![Install free5gc - Step 5](/static/images/user-guides/free5gc-cp-5.png) -![Install free5gc - Step 6](/images/user-guides/free5gc-cp-6.png) +![Install free5gc - Step 6](/static/images/user-guides/free5gc-cp-6.png) Shortly thereafter, you should see free5gc-cp in the cluster namespace: @@ -992,18 +992,18 @@ edge01-40c616e5d87053350473d3ffa1387a9a534f8f42 free5gc-upf Additionally you can check the Gitea edge01 repository (accessible at http://localhost:3000/nephio/edge01) for new commits to see how Porch interacts with packages stored in Git repositories. -![Commits in Gitea made by porch](/images/user-guides/gitea-porch.png) +![Commits in Gitea made by porch](/static/images/user-guides/gitea-porch.png) After the package is approved, the results can be observed in Nephio Web UI. Head over to http://localhost:7007/config-as-data ([port forwarding](/content/en/docs/guides/install-guides/_index.md#access-to-the-user-interfaces) must be running). -![Deployments in Nephio UI](/images/user-guides/UPF-Capacity.png) +![Deployments in Nephio UI](/static/images/user-guides/UPF-Capacity.png) -![UPF Deployment](/images/user-guides/UPF-Capacity-2.png) +![UPF Deployment](/static/images/user-guides/UPF-Capacity-2.png) -![Inspecting Capacity.yaml file](/images/user-guides/UPF-Capacity-3.png) +![Inspecting Capacity.yaml file](/static/images/user-guides/UPF-Capacity-3.png) -![Throughput values](/images/user-guides/UPF-Capacity-4.png) +![Throughput values](/static/images/user-guides/UPF-Capacity-4.png) Inside the package, you can see that the throughput values for UPF have been modified, reflecting the changes you made with the CLI. @@ -1011,27 +1011,27 @@ with the CLI. You can also scale NFs vertically using the Nephio Web UI. For practice you can scale the UPF on the second edge cluster. Once again, navigate to the Web UI and choose the `edge02` repository in the Deployments section. -![Edge02 Deployments](/images/user-guides/UPF-Capacity-5.png) +![Edge02 Deployments](/static/images/user-guides/UPF-Capacity-5.png) Select the `free5gc-upf` deployment, and then `View draft revision`. -![UPF Deployment in edge02](/images/user-guides/UPF-Capacity-6.png) +![UPF Deployment in edge02](/static/images/user-guides/UPF-Capacity-6.png) -![First revision](/images/user-guides/UPF-Capacity-7.png) +![First revision](/static/images/user-guides/UPF-Capacity-7.png) Edit the draft revision, and modify the `Capacity.yaml` file. -![Edit the revision](/images/user-guides/UPF-Capacity-8.png) +![Edit the revision](/static/images/user-guides/UPF-Capacity-8.png) -![Capacity.yaml file](/images/user-guides/UPF-Capacity-9.png) +![Capacity.yaml file](/static/images/user-guides/UPF-Capacity-9.png) -![Throughput inside the file](/images/user-guides/UPF-Capacity-10.png) +![Throughput inside the file](/static/images/user-guides/UPF-Capacity-10.png) -![Propose the draft package](/images/user-guides/UPF-Capacity-11.png) +![Propose the draft package](/static/images/user-guides/UPF-Capacity-11.png) After saving the changes to the file, propose the draft package and approve it. -![New revision](/images/user-guides/UPF-Capacity-12.png) +![New revision](/static/images/user-guides/UPF-Capacity-12.png) After a few minutes, the revision for the UPF deployment will change, and the changes will be reflected in the `edge-02` cluster. diff --git a/content/en/docs/guides/user-guides/exercise-2-oai.md b/content/en/docs/guides/user-guides/exercise-2-oai.md index 2292dc75..a0bd9a1b 100644 --- a/content/en/docs/guides/user-guides/exercise-2-oai.md +++ b/content/en/docs/guides/user-guides/exercise-2-oai.md @@ -39,13 +39,13 @@ These exercises will take you from a system with only the Nephio Management clus Above described deployment configuration is illustrated in the following figure: -![nephio-r2-deployment-diagram.png](/images/user-guides/nephio-r2-deployment-diagram.png) +![nephio-r2-deployment-diagram.png](/static/images/user-guides/nephio-r2-deployment-diagram.png) The placement of Core and RAN network functions and the naming of the clouds is referred from O-RAN.WG6.CADS-v4.00 TR page 23. The network configuration is illustrated in the following figure: -![nephio-r2-5g-network.png](/images/user-guides/nephio-r2-5g-network.png) +![nephio-r2-5g-network.png](/static/images/user-guides/nephio-r2-5g-network.png) To perform these exercises, you will need: diff --git a/content/en/docs/guides/user-guides/helm/flux-helm.md b/content/en/docs/guides/user-guides/helm/flux-helm.md index 4905c960..a77014ce 100644 --- a/content/en/docs/guides/user-guides/helm/flux-helm.md +++ b/content/en/docs/guides/user-guides/helm/flux-helm.md @@ -31,22 +31,22 @@ cluster. * **Step 1** -![Install flux controllers - Step 1](/images/user-guides/nephio-ui-edge02-deployment.png) +![Install flux controllers - Step 1](/static/images/user-guides/nephio-ui-edge02-deployment.png) * **Step 2** -![Install flux controllers - Step 2](/images/user-guides/add-deployment-selection.png) +![Install flux controllers - Step 2](/static/images/user-guides/add-deployment-selection.png) * **Step 3** -![Install flux controllers - Step 3](/images/user-guides/flux-controller-selection.png) +![Install flux controllers - Step 3](/static/images/user-guides/flux-controller-selection.png) Click through the `Next` button until you are through all the steps, leaving all options as `default`, then click `Create Deployment`. * **Step 4** -![Install flux controllers - Step 4](/images/user-guides/select-create-deployment.png) +![Install flux controllers - Step 4](/static/images/user-guides/select-create-deployment.png) At this point, we can take a closer look at the contents of the kpt package which contains the relevant kubernetes resources to deploy the controllers. @@ -57,11 +57,11 @@ Finally, we need to `propose` and then `approve` the pkg to initialize the deplo * **Step 5** -![Install flux controllers - Step 5](/images/user-guides/propose-selection.png) +![Install flux controllers - Step 5](/static/images/user-guides/propose-selection.png) * **Step 6** -![Install flux controllers - Step 6](/images/user-guides/approve-selection.png) +![Install flux controllers - Step 6](/static/images/user-guides/approve-selection.png) Shortly thereafter, you should see flux helm and source controllers in the flux-system namespace: @@ -107,21 +107,21 @@ EOF ``` The new repository should now have been added to the `External Blueprints` section of the UI. -![External Blueprints UI](/images/user-guides/external-bp-repos.png) +![External Blueprints UI](/static/images/user-guides/external-bp-repos.png) From here, we can see the onlineboutique-flux pkg to be deployed. -![online boutique pkg](/images/user-guides/nephio-pkgs-onlineboutique-show.png) +![online boutique pkg](/static/images/user-guides/nephio-pkgs-onlineboutique-show.png) The HelmRepository Custom Resource within the kpt pkg refers to the official [online boutique helm charts repo.](https://github.com/GoogleCloudPlatform/microservices-demo/tree/main/helm-chart) -![HelmRepo online boutique ref](/images/user-guides/helmrepo-onlineboutique-ref.png) +![HelmRepo online boutique ref](/static/images/user-guides/helmrepo-onlineboutique-ref.png) To deploy the pkg, repeat/follow **Steps 1 - 6** from above, replacing **Step 3** with the following. Take note of the source repo and the package to be deployed. -![Add acm pkg](/images/user-guides/add-deploy-onlinebout-select.png) +![Add acm pkg](/static/images/user-guides/add-deploy-onlinebout-select.png) **_NOTE:_** The overrides online-boutique-values ConfigMap in the package refers to the default values.yaml for the chart and can be customized prior to pkg approval. From 50fead4689f8459952fe23960bcb530ddae4dfc7 Mon Sep 17 00:00:00 2001 From: Victor Morales Date: Sat, 3 Feb 2024 07:51:55 -0800 Subject: [PATCH 04/20] Update user guides instructions (#102) This PR fixes some instructions describe in the Free5GC and OAI user guides, removes some trail spaces, and simplifies the get logs instructions. Signed-off-by: Victor Morales --- .../guides/user-guides/exercise-1-free5gc.md | 2 - .../docs/guides/user-guides/exercise-2-oai.md | 96 ++++++++----------- 2 files changed, 41 insertions(+), 57 deletions(-) diff --git a/content/en/docs/guides/user-guides/exercise-1-free5gc.md b/content/en/docs/guides/user-guides/exercise-1-free5gc.md index b6387aa9..8b4a2a4f 100644 --- a/content/en/docs/guides/user-guides/exercise-1-free5gc.md +++ b/content/en/docs/guides/user-guides/exercise-1-free5gc.md @@ -423,8 +423,6 @@ also the credentials and information is provided to configure the network device ```bash ./test-infra/e2e/provision/hacks/network-topo.sh - -kubectl apply -f test-infra/e2e/tests/003-network-topo.yaml ```

diff --git a/content/en/docs/guides/user-guides/exercise-2-oai.md b/content/en/docs/guides/user-guides/exercise-2-oai.md index a0bd9a1b..8e10e197 100644 --- a/content/en/docs/guides/user-guides/exercise-2-oai.md +++ b/content/en/docs/guides/user-guides/exercise-2-oai.md @@ -24,7 +24,7 @@ before trying these exercises. These exercises will take you from a system with only the Nephio Management cluster setup to a deployment with: -- A Core cluster +- A Core cluster - A Regional cluster - An Edge Cluster - Repositories for each cluster, registered with Nephio, and with Config Sync set up to pull from those repositories. @@ -37,7 +37,7 @@ These exercises will take you from a system with only the Nephio Management clus - CU-UP and DU (RF Simulated) running on the Regional cluster and attached to the secondary Multus networks as needed - NR-UE (RF Simulated) running on the Regional cluster and attached to the secondary Multus networks as needed -Above described deployment configuration is illustrated in the following figure: +Above described deployment configuration is illustrated in the following figure: ![nephio-r2-deployment-diagram.png](/static/images/user-guides/nephio-r2-deployment-diagram.png) @@ -52,7 +52,7 @@ To perform these exercises, you will need: - Access to the installed demo VM environment and can login as the `ubuntu` user to have access to the necessary files. - Access to the Nephio UI as described in the installation guide -Access to Gitea, used in the demo environment as the Git provider, is optional. +Access to Gitea, used in the demo environment as the Git provider, is optional. ## Step 1: Setup the infrastructure @@ -109,7 +109,7 @@ You can also look at the state of `packagerevisions` for the three packages. You kubectl get packagerevisions | grep -E 'core|regional|edge' | grep mgmt ``` -While you are checking you will see `LIFECYCLE` will change from Draft to Published. Once packages are Published then the clusters will start getting deployed. +While you are checking you will see `LIFECYCLE` will change from Draft to Published. Once packages are Published then the clusters will start getting deployed. ## Step 2: Check the status of the workload clusters @@ -146,7 +146,6 @@ export KUBECONFIG=$HOME/.kube/config:$HOME/.kube/regional-kubeconfig:$HOME/.kube To retain the KUBECONFIG environment variable permanently across sessions for the user, add it to the `~/.bash_profile` and source the `~/.bash_profile` file - You can then use it to access the Workload cluster directly: ```bash @@ -188,7 +187,6 @@ regional-md-0-hm5n8-wts7m regional 1 1 1 35m v1.2 ```
- Once all the clusters are ready, it is necessary to connect them. For now you are using the [containerlab tool](https://containerlab.dev/). Eventually, the inter-cluster networking will be automated as well. ```bash @@ -287,7 +285,7 @@ rawtopology.topo.nephio.org/nephio created ``` -To list the networks you can use the below command +It might take a couple of seconds for the networks to come up. To list the networks you can use the below command ```bash kubectl get networks.infra.nephio.org @@ -313,7 +311,7 @@ PackageVariantSet). ```bash kubectl apply -f test-infra/e2e/tests/oai/002-database.yaml -kubectl apply -f test-infra/e2e/tests/oai/002-oai-operators.yaml +kubectl apply -f test-infra/e2e/tests/oai/002-operators.yaml ```
@@ -330,7 +328,7 @@ packagevariant.config.porch.kpt.dev/oai-ran-operator-regional created ## Step 4: Check Database and Operator Deployment -Within five minutes of applying the RAN and Core Operator YAML file, you should see `oai-core` and `oai-operators` namespaces on core workload cluster, : +Within five minutes of applying the RAN, Core Operator, and database Packages, you should see `oai-core` and `oai-cn-operators` namespaces on the Core workload cluster, : ```bash kubectl get ns --context core-admin@core @@ -350,8 +348,8 @@ kube-public Active 90m kube-system Active 90m local-path-storage Active 89m metallb-system Active 89m +oai-cn-operators Active 5m oai-core Active 5m39s -oai-operators Active 5m resource-group-system Active 88m ```
@@ -371,23 +369,23 @@ mysql-7dd4cc6945-lqwcv 1/1 Running 0 7m12s ``` -In the `oai-operators` namespace you should see control plane network function operators +In the `oai-cn-operators` namespace you should see control plane network function operators ```bash -kubectl get pods -n oai-operators --context core-admin@core +kubectl get pods -n oai-cn-operators --context core-admin@core ```
The output is similar to: ```console -NAME READY STATUS RESTARTS AGE -oai-amf-controller-7cfcfdcf8f-m5b4h 1/1 Running 0 11m -oai-ausf-controller-746b56b745-zdfmc 1/1 Running 0 11m -oai-nrf-controller-57bc444f87-94x78 1/1 Running 0 11m -oai-smf-controller-5874557bb9-kbp4t 1/1 Running 0 11m -oai-udm-controller-6b4658b9c-nnnb7 1/1 Running 0 11m -oai-udr-controller-85464c47c9-wjprf 1/1 Running 0 11m +NAME READY STATUS RESTARTS AGE +oai-amf-operator-7cfcfdcf8f-m5b4h 1/1 Running 0 11m +oai-ausf-operator-746b56b745-zdfmc 1/1 Running 0 11m +oai-nrf-operator-57bc444f87-94x78 1/1 Running 0 11m +oai-smf-operator-5874557bb9-kbp4t 1/1 Running 0 11m +oai-udm-operator-6b4658b9c-nnnb7 1/1 Running 0 11m +oai-udr-operator-85464c47c9-wjprf 1/1 Running 0 11m ```
@@ -415,7 +413,6 @@ resource-group-system Active 97m ``` - ```bash kubectl get ns --context edge-admin@edge ``` @@ -433,29 +430,27 @@ kube-public Active 99m kube-system Active 99m local-path-storage Active 98m metallb-system Active 98m -oai-operators Active 14m +oai-cn-operators Active 14m oai-ran-operators Active 14m resource-group-system Active 97m ``` -In edge cluster in `oai-operators` namespace you will see only oai-upf network function. - +In edge cluster in `oai-cn-operators` namespace you will see only oai-upf network function. ```bash -kubectl get pods -n oai-operators --context edge-admin@edge +kubectl get pods -n oai-cn-operators --context edge-admin@edge ```
The output is similar to: ```console -NAME READY STATUS RESTARTS AGE -oai-upf-controller-75cbc869cb-67lf9 1/1 Running 0 16m +NAME READY STATUS RESTARTS AGE +oai-upf-operator-75cbc869cb-67lf9 1/1 Running 0 16m ```
- ## Step 5: Deploy the Core Network Functions You can start by deploying the core network functions which the operator will instantiate. For now, you will use @@ -471,12 +466,12 @@ kubectl create -f test-infra/e2e/tests/oai/003-core-network.yaml The output is similar to: ```console -packagevariantset.config.porch.kpt.dev/oai-nrf created -packagevariantset.config.porch.kpt.dev/oai-udm created -packagevariantset.config.porch.kpt.dev/oai-udr created -packagevariantset.config.porch.kpt.dev/oai-ausf created -packagevariantset.config.porch.kpt.dev/oai-amf created -packagevariantset.config.porch.kpt.dev/oai-smf created +packagevariant.config.porch.kpt.dev/oai-nrf created +packagevariant.config.porch.kpt.dev/oai-udm created +packagevariant.config.porch.kpt.dev/oai-ausf created +packagevariant.config.porch.kpt.dev/oai-udr created +packagevariant.config.porch.kpt.dev/oai-amf created +packagevariant.config.porch.kpt.dev/oai-smf created packagevariant.config.porch.kpt.dev/oai-upf-edge created ``` @@ -485,10 +480,10 @@ All the NFs will wait for NRF to come up and then they will register to NRF. SMF ### Check Core Network Deployment -You can check if all the control plane network functions are up and running +You can check if all the control plane network functions are up and running ```bash -kubectl get pods -n oai-core --context regional-admin@regional +kubectl get pods -n oai-core --context core-admin@core ```
@@ -525,8 +520,7 @@ upf-edge-55ccb4f9d7-868k6 1/1 Running 0 30m To verify that UPF and SMF are sharing PFCP heartbeats you can run the below commands ```bash -UPF_POD=$(kubectl get pods -n oai-core --context=edge-admin@edge -l workload.nephio.org/oai=upf -o jsonpath='{.items[*].metadata.name}') -kubectl logs $UPF_POD -n oai-core -c upf-edge --context edge-admin@edge --tail=20 +kubectl logs -n oai-core --context=edge-admin@edge -l workload.nephio.org/oai=upf --tail=20 ```
@@ -556,11 +550,11 @@ content-length: 58 ```
-In the logs you should see `Received SX HEARTBEAT REQUEST` statement. If that is present then SMF and UPF are sharing PFCP heartbeats. +In the logs you should see `Received SX HEARTBEAT REQUEST` statement. If that is present then SMF and UPF are sharing PFCP heartbeats. ## Step 6: Deploy RAN Network Functions -If the core network functions are running and configured properly then you can start by deploying RAN network function `PackageVariants`. +If the core network functions are running and configured properly then you can start by deploying RAN network function `PackageVariants`. ```bash kubectl create -f test-infra/e2e/tests/oai/004-ran-network.yaml @@ -576,11 +570,11 @@ packagevariant.config.porch.kpt.dev/oai-cuup created ```
-Wait for ~15 mins for the RAN network functions to come up. +Wait for ~20 mins for the RAN network functions to come up. ### Check RAN Deployment -You can check if the deployment of RAN components, CU-CP in Regional cluster and CU-UP and DU in Edge cluster respectively. +You can check if the deployment of RAN components, CU-CP in Regional cluster and CU-UP and DU in Edge cluster respectively. ```bash kubectl get pods -n oai-ran-cucp --context regional-admin@regional @@ -595,7 +589,6 @@ oai-gnb-cu-cp-588f76c5f9-9fp54 1/1 Running 0 10m ``` - ```bash kubectl get pods -n oai-ran-cuup --context edge-admin@edge ``` @@ -609,7 +602,6 @@ oai-gnb-cu-up-75475f949b-j6chc 1/1 Running 0 9m ``` - ```bash kubectl get pods -n oai-ran-du --context edge-admin@edge ``` @@ -623,14 +615,12 @@ oai-gnb-du-6cb4cc5fcd-zvlrq 1/1 Running 0 9m ``` -To check that RAN network functions are properly deployed it is important to check if N2, E1 and F1 links are created. - +To check that RAN network functions are properly deployed it is important to check if N2, E1 and F1 links are created. To verify E1 link between CU-CP and CU-UP is properly configured you can run the below commands ```bash -CU_CP_POD_NAME=$(kubectl get pods -n oai-ran-cucp --context=regional-admin@regional -l app.kubernetes.io/name=oai-gnb-cu-cp -o jsonpath='{.items[*].metadata.name}') -kubectl logs -n oai-ran-cucp $CU_CP_POD_NAME -c gnbcucp --context regional-admin@regional | grep "e1ap_send_SETUP_RESPONSE" +kubectl logs -n oai-ran-cucp --context=regional-admin@regional -l app.kubernetes.io/name=oai-gnb-cu-cp --tail=-1 | grep "e1ap_send_SETUP_RESPONSE" ```
@@ -644,8 +634,7 @@ kubectl logs -n oai-ran-cucp $CU_CP_POD_NAME -c gnbcucp --context regional-admi To verify F1 link between CU-CP and DU is properly configured you can run the below commands ```bash -CU_CP_POD_NAME=$(kubectl get pods -n oai-ran-cucp --context=regional-admin@regional -l app.kubernetes.io/name=oai-gnb-cu-cp -o jsonpath='{.items[*].metadata.name}') -kubectl logs -n oai-ran-cucp $CU_CP_POD_NAME -c gnbcucp --context regional-admin@regional | grep "Cell Configuration ok" +kubectl logs -n oai-ran-cucp --context=regional-admin@regional -l app.kubernetes.io/name=oai-gnb-cu-cp --tail=-1 | grep "Cell Configuration ok" ```
@@ -659,8 +648,7 @@ kubectl logs -n oai-ran-cucp $CU_CP_POD_NAME -c gnbcucp --context regional-admi To verify N2 link between AMF and CU-CP is properly configured you can run the below commands ```bash -CU_CP_POD_NAME=$(kubectl get pods -n oai-ran-cucp --context=regional-admin@regional -l app.kubernetes.io/name=oai-gnb-cu-cp -o jsonpath='{.items[*].metadata.name}') -kubectl logs -n oai-ran-cucp $CU_CP_POD_NAME -c gnbcucp --context regional-admin@regional | grep "Received NGAP_REGISTER_GNB_CNF: associated AMF" +kubectl logs -n oai-ran-cucp --context=regional-admin@regional -l app.kubernetes.io/name=oai-gnb-cu-cp --tail=-1 | grep "Received NGAP_REGISTER_GNB_CNF: associated AMF" ```
@@ -703,8 +691,7 @@ oai-nr-ue-78846cf68c-rxkkz 1/1 Running 0 32m ```
-To verify if the UE is successfully connected you can use the below command - +To verify if the UE is successfully connected you can use the below command ```bash UE_POD=$(kubectl get pods -n oai-ue --context edge-admin@edge -l app.kubernetes.io/name=oai-nr-ue -o jsonpath='{.items[*].metadata.name}') @@ -721,10 +708,9 @@ kubectl logs -n oai-ue $UE_POD -c nr-ue --context edge-admin@edge | grep "Interf ```
- ## Step 8: Test the End to End Connectivity -To perform the end to end connectivity test you can ping from the UE to the UPF. +To perform the end to end connectivity test you can ping from the UE to the UPF. ```bash UE_POD=$(kubectl get pods -n oai-ue --context edge-admin@edge -l app.kubernetes.io/name=oai-nr-ue -o jsonpath='{.items[*].metadata.name}') From 512da25c1ba05b767a23753c75bfda2d08e7bf82 Mon Sep 17 00:00:00 2001 From: Eric Debeau <43334934+debeaueric@users.noreply.github.com> Date: Mon, 5 Feb 2024 09:28:56 +0100 Subject: [PATCH 05/20] Correct documentation (#104) Installation guide: Update R1 to R2 OAI exercice: correct editor --- content/en/docs/guides/install-guides/_index.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/content/en/docs/guides/install-guides/_index.md b/content/en/docs/guides/install-guides/_index.md index 63f3fd4c..0b95a794 100644 --- a/content/en/docs/guides/install-guides/_index.md +++ b/content/en/docs/guides/install-guides/_index.md @@ -41,8 +41,8 @@ gcloud compute instances create --machine-type e2-standard-8 \ --boot-disk-size 200GB \ --image-family=ubuntu-2004-lts \ --image-project=ubuntu-os-cloud \ - --metadata=startup-script-url=https://raw.githubusercontent.com/nephio-project/test-infra/v1.0.1/e2e/provision/init.sh,nephio-test-infra-branch=v1.0.1 \ - nephio-r1-e2e + --metadata=startup-script-url=https://raw.githubusercontent.com/nephio-project/test-infra/main/e2e/provision/init.sh \ + nephio-r2-e2e ``` ### Follow the Installation on GCE @@ -51,7 +51,7 @@ If you want to watch the progress of the installation, give it about 30 seconds then ssh in and tail the startup script execution: ```bash -gcloud compute ssh ubuntu@nephio-r1-e2e -- \ +gcloud compute ssh ubuntu@nephio-r2-e2e -- \ sudo journalctl -u google-startup-scripts.service --follow ``` @@ -100,7 +100,7 @@ Log onto your VM and run the following command: ```bash wget -O - https://raw.githubusercontent.com/nephio-project/test-infra/v1.0.1/e2e/provision/init.sh | \ sudo NEPHIO_DEBUG=false \ - NEPHIO_BRANCH=v1.0.1 \ + NEPHIO_BRANCH=main \ NEPHIO_USER=ubuntu \ bash ``` @@ -112,7 +112,7 @@ The following environment variables can be used to configure the installation: | NEPHIO_USER | userid | ubuntu | The user to install the sandbox on (must have sudo passwordless permissions) | | NEPHIO_DEBUG | false or true | false | Controls debug output from the install | | NEPHIO_HOME | path | /home/$NEPHIO_USER | The directory to check out the install scripts into | -| NEPHIO_DEPLOYMENT_TYPE | r1 or one-summit | r1 | Controls the type of installation to be carried out | +| NEPHIO_DEPLOYMENT_TYPE | r2 or one-summit | r2 | Controls the type of installation to be carried out | | RUN_E2E | false or true | false | Specifies whether end-to-end tests should be executed or not | | DOCKERHUB_USERNAME | alpha-num string | | Specifies the dockerhub username | | DOCKERHUB_TOKEN | alpha-num string | | Specifies the password or token | @@ -134,7 +134,7 @@ Once it is completed, ssh in and port forward the port to the UI (7007) and to G Using GCE: ```bash -gcloud compute ssh ubuntu@nephio-r1-e2e -- \ +gcloud compute ssh ubuntu@nephio-r2-e2e -- \ -L 7007:localhost:7007 \ -L 3000:172.18.0.200:3000 \ kubectl port-forward --namespace=nephio-webui svc/nephio-webui 7007 @@ -162,7 +162,7 @@ would fail if you try to open a second ssh connection with that setting). Using GCE: ```bash -gcloud compute ssh ubuntu@nephio-r1-e2e +gcloud compute ssh ubuntu@nephio-r2-e2e ``` Using a VM: From 041c4343cade5f00c85524a39274530e821dc26e Mon Sep 17 00:00:00 2001 From: Gergely Csatari Date: Mon, 5 Feb 2024 16:24:56 +0200 Subject: [PATCH 06/20] Fixing the ordered list in README (#105) Signed-off-by: Gergely Csatari --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index d07eaa5b..a183407d 100644 --- a/README.md +++ b/README.md @@ -11,15 +11,15 @@ site. The content of this repo (especially this) branch will be a bit chaotic du ### Setting up the environment -1 The site is using Hugo as the documentation generating engine, therefore you need to install Hugo. As the Docsy +1. The site is using Hugo as the documentation generating engine, therefore you need to install Hugo. As the Docsy template that we use requires transforming Sass to CSS, you will need to install the *extended* version of Hugo. Link to installation instructions is [here](https://gohugo.io/installation/linux/). To ensure that you have the *extended* version of Hugo, run `hugo version`. The version string should have the word extended in it (Or `hugo version | grep extended` should not be an empty line). -2 Some functions of the theme generation are using NPM packages, therefore NodeJS and NPM will be needed. For +2. Some functions of the theme generation are using NPM packages, therefore NodeJS and NPM will be needed. For compatibility reasons a Node version of at least v16.20.2 is needed. To install this version of NodeJS, follow the instructions from [deb.nodesource.com](http://deb.nodesource.com/) and set the `NODE_MAJOR=20`. -3 Install the npm dependencies with `npm install` +3. Install the npm dependencies with `npm install` ### Build the docs locally From 9b3cf604d541a85ec8834a8bfd720434eb822243 Mon Sep 17 00:00:00 2001 From: Sagar Arora <74044881+arora-sagar@users.noreply.github.com> Date: Mon, 5 Feb 2024 22:17:56 +0530 Subject: [PATCH 07/20] Correcting steps in the exercises (#106) - Adding metallb ip-address pool creation - Removing the extra white spaces from network diagram --- content/en/docs/_index.md | 9 ++- content/en/docs/abbreviations.md | 12 ++-- .../en/docs/guides/install-guides/_index.md | 19 ++--- .../guides/install-guides/install-on-gce.md | 5 +- .../guides/user-guides/exercise-1-free5gc.md | 16 ++--- .../docs/guides/user-guides/exercise-2-oai.md | 67 +++++++++++++++++- content/en/docs/release-notes/R1.md | 10 +-- content/en/docs/release-notes/R2.md | 8 +-- .../user-guides/nephio-r2-5g-network.png | Bin 314929 -> 313645 bytes 9 files changed, 109 insertions(+), 37 deletions(-) diff --git a/content/en/docs/_index.md b/content/en/docs/_index.md index a47399d1..54a45d4e 100644 --- a/content/en/docs/_index.md +++ b/content/en/docs/_index.md @@ -5,7 +5,7 @@ menu: {main: {weight: 20}} weight: 1 --- -# About Nephio R1 +# About Nephio Our mission is "to deliver carrier-grade, simple, open, Kubernetes-based cloud native intent automation and common automation templates that materially @@ -85,11 +85,10 @@ This release of Nephio focuses: leveraging the intent-driven, active-reconciliation nature of Kubernetes. - Infrastructure orchestration/automation using controllers based on the Cluster API. At this time only KIND cluster creation is supported. -- Orchestration/automation of 5G core network functions deployment and - management. This release focuses on network functions from - [free5gc](https://free5gc.org/). +- Orchestration/automation of 5G Core and RAN network functions deployment and + management. -While the current release uses Cluster API, KIND, and free5gc for demonstration +While the current releases uses Cluster API, KIND, and free5gc/OAI for demonstration purposes, the exact same principles and even code can be used for managing other infrastructure and network functions. The *uniformity in systems* principle means that as long as something is manageable via the Kubernetes Resource Model, diff --git a/content/en/docs/abbreviations.md b/content/en/docs/abbreviations.md index f03dcb7b..7b252737 100644 --- a/content/en/docs/abbreviations.md +++ b/content/en/docs/abbreviations.md @@ -7,14 +7,18 @@ weight: 3 This page gives brief explanations of abbreviations used in the Nephio project. See also the [Nephio Glossary](/content/en/docs/glossary.md) for more detailed descriptions of Nephio related terms. -## Nephio related abbreviations +## Nephio Related Abbreviations * NF: Network Function * PV: Package Variant * PVS: Package Variant Set -## free5gc related abbreviations +## 5G 3GPP Related Abbreviations * AMF: Access and Mobility Management Function -* DNN: Data Network Name -* NAD: Network Attachment Definition * SMF: Session Management Function * UPF: User Plane Function +* AUSF: Authentication Server Function +* NRF: Network Repository Function +* UDR: Unified Data Repository +* UDM: Unified Data Management +* DNN: Data Network Name +* NAD: Network Attachment Definition diff --git a/content/en/docs/guides/install-guides/_index.md b/content/en/docs/guides/install-guides/_index.md index 0b95a794..4a13245c 100644 --- a/content/en/docs/guides/install-guides/_index.md +++ b/content/en/docs/guides/install-guides/_index.md @@ -37,14 +37,16 @@ You will need a account in GCP and `gcloud` installed on your local environment. ### Create a Virtual Machine on GCE ```bash -gcloud compute instances create --machine-type e2-standard-8 \ +gcloud compute instances create --machine-type e2-standard-16 \ --boot-disk-size 200GB \ --image-family=ubuntu-2004-lts \ --image-project=ubuntu-os-cloud \ - --metadata=startup-script-url=https://raw.githubusercontent.com/nephio-project/test-infra/main/e2e/provision/init.sh \ + --metadata=startup-script-url=https://raw.githubusercontent.com/nephio-project/test-infra/v2.0.0/e2e/provision/init.sh,nephio-test-infra-branch=v2.0.0 \ nephio-r2-e2e ``` +**NOTE**: e2-standard-16 is recommended and e2-standard-8 is minimum. + ### Follow the Installation on GCE If you want to watch the progress of the installation, give it about 30 seconds to reach a network accessible state, and @@ -64,7 +66,7 @@ This install has been verified on VMs running on vSphere, OpenStack, AWS, and Az Order or create a VM with the following specification: - Linux Flavour: Ubuntu-20.04-focal -- 8 cores +- Minimum 8 cores and recommended 16 Cores - 32 GB memory - 200 GB disk size - Default user with sudo passwordless permissions @@ -98,9 +100,9 @@ sudo netplan apply Log onto your VM and run the following command: ```bash -wget -O - https://raw.githubusercontent.com/nephio-project/test-infra/v1.0.1/e2e/provision/init.sh | \ +wget -O - https://raw.githubusercontent.com/nephio-project/test-infra/v2.0.0/e2e/provision/init.sh | \ sudo NEPHIO_DEBUG=false \ - NEPHIO_BRANCH=main \ + NEPHIO_BRANCH=v2.0.0 \ NEPHIO_USER=ubuntu \ bash ``` @@ -112,12 +114,11 @@ The following environment variables can be used to configure the installation: | NEPHIO_USER | userid | ubuntu | The user to install the sandbox on (must have sudo passwordless permissions) | | NEPHIO_DEBUG | false or true | false | Controls debug output from the install | | NEPHIO_HOME | path | /home/$NEPHIO_USER | The directory to check out the install scripts into | -| NEPHIO_DEPLOYMENT_TYPE | r2 or one-summit | r2 | Controls the type of installation to be carried out | | RUN_E2E | false or true | false | Specifies whether end-to-end tests should be executed or not | | DOCKERHUB_USERNAME | alpha-num string | | Specifies the dockerhub username | | DOCKERHUB_TOKEN | alpha-num string | | Specifies the password or token | | NEPHIO_REPO | URL | https://github.com/nephio-project/test-infra.git | URL of the repository to be used for installation | -| NEPHIO_BRANCH | branch or tag | main | Tag or branch name to use in NEPHIO_REPO | +| NEPHIO_BRANCH | branch or tag | main/v2.0.0 | Tag or branch name to use in NEPHIO_REPO | | DOCKER_REGISTRY_MIRRORS | list of URLs in JSON format | | List of docker registry mirrors in JSON format, or empty for no mirrors to be set. Example value: ``["https://docker-registry-remote.mycompany.com", "https://docker-registry-remote2.mycompany.com"]`` | ### Follow the Installation on VM @@ -173,7 +174,9 @@ ssh @ ## Next Steps -* Step through the [Free5GC](/content/en/docs/guides/user-guides/exercise-1-free5gc.md) and [OAI](/content/en/docs/guides/user-guides/exercise-2-oai.md) exercises +* Step through the exercises + * [Free5GC Testbed Deployment and E2E testing with UERANSIM](/content/en/docs/guides/user-guides/exercise-1-free5gc.md) + * [OAI Core and RAN Testbed Deployment and E2E testing](/content/en/docs/guides/user-guides/exercise-2-oai.md) * Learn more about the [Nephio demo sandbox](/content/en/docs/guides/install-guides/explore-sandbox.md) * Dig into the [user guide](/content/en/docs/guides/user-guides/_index.md) * Create a [Bring-Your-Own-Cluster](/content/en/docs/guides/install-guides/install-on-byoc.md) Nephio Installation diff --git a/content/en/docs/guides/install-guides/install-on-gce.md b/content/en/docs/guides/install-guides/install-on-gce.md index cca390a7..f97c64af 100644 --- a/content/en/docs/guides/install-guides/install-on-gce.md +++ b/content/en/docs/guides/install-guides/install-on-gce.md @@ -45,6 +45,8 @@ gcloud compute instances create --machine-type e2-standard-16 \ nephio-r2-e2e ``` +**NOTE**: e2-standard-16 is recommended and e2-standard-8 is minimum. + ### Follow the Installation on GCE If you want to watch the progress of the installation, give it about 30 @@ -66,7 +68,7 @@ Azure. Order or create a VM with the following specification: - Linux Flavour: Ubuntu-20.04-focal -- 16 cores +- Minimum 8 cores and recommended 16 Cores - 32 GB memory - 200 GB disk size - Default user with sudo passwordless permissions @@ -114,7 +116,6 @@ The following environment variables can be used to configure the installation: | NEPHIO_USER | userid | ubuntu | The user to install the sandbox on (must have sudo passwordless permissions) | | NEPHIO_DEBUG | false or true | false | Controls debug output from the install | | NEPHIO_HOME | path | /home/$NEPHIO_USER | The directory to check out the install scripts into | -| NEPHIO_DEPLOYMENT_TYPE | r1 or one-summit | r1 | Controls the type of installation to be carried out | | RUN_E2E | false or true | false | Specifies whether end-to-end tests should be executed or not | | NEPHIO_REPO | URL | https://github.com/nephio-project/test-infra.git |URL of the repository to be used for installation | | NEPHIO_BRANCH | branch or tag | main | Tag or branch name to use in NEPHIO_REPO | diff --git a/content/en/docs/guides/user-guides/exercise-1-free5gc.md b/content/en/docs/guides/user-guides/exercise-1-free5gc.md index 8b4a2a4f..8740eeaf 100644 --- a/content/en/docs/guides/user-guides/exercise-1-free5gc.md +++ b/content/en/docs/guides/user-guides/exercise-1-free5gc.md @@ -433,7 +433,7 @@ rawtopology.topo.nephio.org/nephio created ```
-## Step 4: Deploy Free5GC Control Plane Functions +## Step 4: Deploy free5GC Control Plane Functions While the Edge clusters are deploying (which will take 5-10 minutes), you can install the free5gc functions other than SMF, AMF, and UPF. For this, you will use the Regional cluster. Since these are all installed with a single package, you @@ -531,9 +531,9 @@ statefulset.apps/mongodb 1/1 3m31s ``` -## Step 5: Deploy Free5GC Operator in the Workload clusters +## Step 5: Deploy free5GC Operator in the Workload clusters -Now you will need to deploy the free5gc operator across all of the Workload clusters (regional and edge). To do this, +Now you will need to deploy the free5GC operator across all of the Workload clusters (regional and edge). To do this, you use another PackageVariantSet. This one uses an objectSelector to select the WorkloadCluster resources previously added to the Management cluster when you had deployed the nephio-workload-cluster packages (manually as well as via PackageVariantSet). @@ -550,7 +550,7 @@ packagevariantset.config.porch.kpt.dev/free5gc-operator created ``` -## Step 6: Check Free5GC Operator Deployment +## Step 6: Check free5GC Operator Deployment Within five minutes of applying the free5gc Operator YAML file, you should see `free5gc` namespaces on your regional and edge clusters: @@ -766,7 +766,7 @@ The UERANSIM package can be deployed to the edge01 cluster, where it will simula packages, UERANSIM needs to be configured to attach to the correct networks and use the correct IP address. Thus, you use our standard specialization techniques and pipeline to deploy UERANSIM, just like the other network functions. -However, before you do that, let us register the UE with free5gc as a subscriber. You will use the free5gc Web UI to do +However, before you do that, let us register the UE with free5GC as a subscriber. You will use the free5GC Web UI to do this. To access it, you need to open another port forwarding session. Assuming you have the `regional-kubeconfig` file you created earlier in your home directory, you need to establish another ssh session from your workstation to the VM, port forwarding port 5000. @@ -787,9 +787,9 @@ ssh @ \ port-forward --namespace=free5gc-cp svc/webui-service 5000 ``` -You should now be able to navigate to [http://localhost:5000/](http://localhost:5000/) and access the free5gc WebUI. -The test subscriber is the same as the standard free5gc default subscriber. Thus, you can follow the -[instructions](https://free5gc.org/guide/Webconsole/Create-Subscriber-via-webconsole/) on the free5gc site, but start at +You should now be able to navigate to [http://localhost:5000/](http://localhost:5000/) and access the free5GC WebUI. +The test subscriber is the same as the standard free5GC default subscriber. Thus, you can follow the +[instructions](https://free5gc.org/guide/Webconsole/Create-Subscriber-via-webconsole/) on the free5GC site, but start at Step 4. Once the subscriber is registered, you can deploy UERANSIM: diff --git a/content/en/docs/guides/user-guides/exercise-2-oai.md b/content/en/docs/guides/user-guides/exercise-2-oai.md index 8e10e197..ea7af99b 100644 --- a/content/en/docs/guides/user-guides/exercise-2-oai.md +++ b/content/en/docs/guides/user-guides/exercise-2-oai.md @@ -304,6 +304,71 @@ vpc-ran True ``` +After the networks are succesfully configured lets configure metallb ip-address pool for each workload cluster. Some workloads in the workload cluster require metallb to expose their services. + + +```bash +./test-infra/e2e/tests/oai/001b-infra-metal-lb.sh +``` + +
+The output is similar to: + +```console +21:58:35 - INFO: looking for packagerev default/mgmt-staging-7ad404ab9e0e02af747501c6ce9c2c183d02694b using /home/ubuntu/.kube/config +21:58:35 - INFO: Found packagerev default/mgmt-staging-7ad404ab9e0e02af747501c6ce9c2c183d02694b +[RUNNING] "gcr.io/kpt-fn/search-replace:v0.2" +[PASS] "gcr.io/kpt-fn/search-replace:v0.2" in 2.5s + Results: + [info] spec.addresses[0]: Mutated field value to "172.18.16.0/20" +[RUNNING] "gcr.io/kpt-fn/set-annotations:v0.1.4" +[PASS] "gcr.io/kpt-fn/set-annotations:v0.1.4" in 3.1s +21:58:42 - INFO: looking for Update.*packagerevisionresources/mgmt-staging-7ad404ab9e0e02af747501c6ce9c2c183d02694b, log entry in porch server(porch-server-68bfdddbbf-pmnmd) +21:58:42 - INFO: Found Update.*packagerevisionresources/mgmt-staging-7ad404ab9e0e02af747501c6ce9c2c183d02694b, log entry in porch server +mgmt-staging-7ad404ab9e0e02af747501c6ce9c2c183d02694b proposed +21:58:43 - INFO: looking for Update.*packagerevisions/mgmt-staging-7ad404ab9e0e02af747501c6ce9c2c183d02694b, log entry in porch server(porch-server-68bfdddbbf-pmnmd) +21:58:43 - INFO: Found Update.*packagerevisions/mgmt-staging-7ad404ab9e0e02af747501c6ce9c2c183d02694b, log entry in porch server +mgmt-staging-7ad404ab9e0e02af747501c6ce9c2c183d02694b approved +21:58:46 - INFO: looking for Update.*/mgmt-staging-7ad404ab9e0e02af747501c6ce9c2c183d02694b.*/approval log entry in porch server(porch-server-68bfdddbbf-pmnmd) +21:58:46 - INFO: Found Update.*/mgmt-staging-7ad404ab9e0e02af747501c6ce9c2c183d02694b.*/approval log entry in porch server +~ +21:58:48 - INFO: looking for packagerev default/mgmt-staging-0c11427319b42b1f9e85f27ad22f82d27c9978a3 using /home/ubuntu/.kube/config +21:58:48 - INFO: Found packagerev default/mgmt-staging-0c11427319b42b1f9e85f27ad22f82d27c9978a3 +[RUNNING] "gcr.io/kpt-fn/search-replace:v0.2" +[PASS] "gcr.io/kpt-fn/search-replace:v0.2" in 300ms + Results: + [info] spec.addresses[0]: Mutated field value to "172.18.32.0/20" +[RUNNING] "gcr.io/kpt-fn/set-annotations:v0.1.4" +[PASS] "gcr.io/kpt-fn/set-annotations:v0.1.4" in 1.3s +21:58:51 - INFO: looking for Update.*packagerevisionresources/mgmt-staging-0c11427319b42b1f9e85f27ad22f82d27c9978a3, log entry in porch server(porch-server-68bfdddbbf-pmnmd) +21:58:51 - INFO: Found Update.*packagerevisionresources/mgmt-staging-0c11427319b42b1f9e85f27ad22f82d27c9978a3, log entry in porch server +mgmt-staging-0c11427319b42b1f9e85f27ad22f82d27c9978a3 proposed +21:58:52 - INFO: looking for Update.*packagerevisions/mgmt-staging-0c11427319b42b1f9e85f27ad22f82d27c9978a3, log entry in porch server(porch-server-68bfdddbbf-pmnmd) +21:58:52 - INFO: Found Update.*packagerevisions/mgmt-staging-0c11427319b42b1f9e85f27ad22f82d27c9978a3, log entry in porch server +mgmt-staging-0c11427319b42b1f9e85f27ad22f82d27c9978a3 approved +21:58:55 - INFO: looking for Update.*/mgmt-staging-0c11427319b42b1f9e85f27ad22f82d27c9978a3.*/approval log entry in porch server(porch-server-68bfdddbbf-pmnmd) +21:58:55 - INFO: Found Update.*/mgmt-staging-0c11427319b42b1f9e85f27ad22f82d27c9978a3.*/approval log entry in porch server +~ +21:58:57 - INFO: looking for packagerev default/mgmt-staging-f1b8e75b6c87549d67037f784abc0083ac601722 using /home/ubuntu/.kube/config +21:58:57 - INFO: Found packagerev default/mgmt-staging-f1b8e75b6c87549d67037f784abc0083ac601722 +[RUNNING] "gcr.io/kpt-fn/search-replace:v0.2" +[PASS] "gcr.io/kpt-fn/search-replace:v0.2" in 200ms + Results: + [info] spec.addresses[0]: Mutated field value to "172.18.48.0/20" +[RUNNING] "gcr.io/kpt-fn/set-annotations:v0.1.4" +[PASS] "gcr.io/kpt-fn/set-annotations:v0.1.4" in 1.3s +21:59:00 - INFO: looking for Update.*packagerevisionresources/mgmt-staging-f1b8e75b6c87549d67037f784abc0083ac601722, log entry in porch server(porch-server-68bfdddbbf-pmnmd) +21:59:00 - INFO: Found Update.*packagerevisionresources/mgmt-staging-f1b8e75b6c87549d67037f784abc0083ac601722, log entry in porch server +mgmt-staging-f1b8e75b6c87549d67037f784abc0083ac601722 proposed +21:59:01 - INFO: looking for Update.*packagerevisions/mgmt-staging-f1b8e75b6c87549d67037f784abc0083ac601722, log entry in porch server(porch-server-68bfdddbbf-pmnmd) +21:59:01 - INFO: Found Update.*packagerevisions/mgmt-staging-f1b8e75b6c87549d67037f784abc0083ac601722, log entry in porch server +mgmt-staging-f1b8e75b6c87549d67037f784abc0083ac601722 approved +21:59:04 - INFO: looking for Update.*/mgmt-staging-f1b8e75b6c87549d67037f784abc0083ac601722.*/approval log entry in porch server(porch-server-68bfdddbbf-pmnmd) +21:59:04 - INFO: Found Update.*/mgmt-staging-f1b8e75b6c87549d67037f784abc0083ac601722.*/approval log entry in porch server +~ +``` +
+ ## Step 3: Deploy Dependencies, MySQL database, OAI Core and RAN Operator in the Workload clusters Now you will need to deploy the MySQL database required by OAI UDR network function, OAI Core and RAN operators across the Workload clusters. To do this, you use `PackageVariant` and `PackageVariantSet`. Later uses an objectSelector to select the WorkloadCluster resources previously added to the Management cluster when you had deployed the nephio-workload-cluster packages (manually as well as via @@ -476,7 +541,7 @@ packagevariant.config.porch.kpt.dev/oai-upf-edge created ``` -All the NFs will wait for NRF to come up and then they will register to NRF. SMF has a dependency on UPF which is described by `dependency.yaml` file in SMF package. It will wait till the time UPF is deployed. It takes around ~20 mins for the whole core network to come up. +All the NFs will wait for NRF to come up and then they will register to NRF. SMF has a dependency on UPF which is described by `dependency.yaml` file in SMF package. It will wait till the time UPF is deployed. It takes around ~20 mins for the whole core network to come up. NRF is exposing its service via metallb external ip-address. In case metallb ip-address pool is not properly defined in the previous section, then UPF will not be able to register to NRF and in this case SMF and UPF will not be able to communicate. ### Check Core Network Deployment diff --git a/content/en/docs/release-notes/R1.md b/content/en/docs/release-notes/R1.md index cff99b4d..883eec40 100644 --- a/content/en/docs/release-notes/R1.md +++ b/content/en/docs/release-notes/R1.md @@ -38,7 +38,7 @@ Basic web UI to view and manage the packages and resources within them. ### Packages -* Kpt packages for all [free5gc](https://free5gc.org/) services +* Kpt packages for all [free5GC](https://free5gc.org/) services * Packages for the core Nephio services * Packages for the Cluster API services for cluster creation * Packages for the dependent services @@ -48,9 +48,9 @@ Basic web UI to view and manage the packages and resources within them. * Create Kubernetes clusters. This functionality is based on the Cluster API. At this time only KIND cluster creation is supported. * Fully automated deployment of UPF, SMF and AMF services of - [free5Gc](https://free5gc.org/). These are deployed on multiple clusters + [free5GC](https://free5gc.org/). These are deployed on multiple clusters based on user's intent expressed via the CRDs. -* Deployment of other free5gc functions. +* Deployment of other free5GC functions. * Auto scaling up of the UPF, SMF and AMF services based on changes to the capacity requirements expressed as user intent. @@ -67,10 +67,10 @@ Basic web UI to view and manage the packages and resources within them. * Web UI features are limited to view/edit of packages and resources in those packages and their deployment. Additional features will be added in subsequent releases. -* When the capacities of the UPF,SMF and AMF NFs are changed, the free5gc Operator on the +* When the capacities of the UPF,SMF and AMF NFs are changed, the free5GC Operator on the Workload cluster will instantiate a new POD with correspondingly modified resources (CPU, memory etc.) During this process, the pod will restart. This is a - limitation of free5gc. + limitation of free5GC. * Only Gitea works with automated cluster provisioning to create new repositories and join them to Nephio. To use a different Git provider, you must manually provision cluster repositories, register them to the Nephio diff --git a/content/en/docs/release-notes/R2.md b/content/en/docs/release-notes/R2.md index 85882a35..25175e85 100644 --- a/content/en/docs/release-notes/R2.md +++ b/content/en/docs/release-notes/R2.md @@ -14,7 +14,7 @@ for the prerequisites on supported environments. The sandbox environment requires a physical or virtual machine with: - Ubuntu-20.04-focal or Ubuntu 22.04 Linux Or Fedora 34 -- 16 cores (Needed for end-to-end testing with RAN and core ) +- Minimum 8 cores and Recommended 16 cores (Needed for end-to-end testing with RAN and core ) - 32 GB memory - 200 GB disk size - Default user with sudo passwordless permissions @@ -35,7 +35,7 @@ Basic web UI to view and manage the packages and resources within them. ### Packages -* Kpt packages for all [free5gc](https://free5gc.org/) services +* Kpt packages for all [free5GC](https://free5gc.org/) services * Kpt packages for all [OAI](https://openairinterface.org/) services * Packages for the core Nephio services * Packages for the Cluster API services for cluster creation @@ -95,10 +95,10 @@ Basic web UI to view and manage the packages and resources within them. * Web UI features are limited to view/edit of packages and resources in those packages and their deployment. Additional features will be added in subsequent releases. -* When the capacities of the UPF,SMF and AMF NFs are changed, the free5gc Operator on the +* When the capacities of the UPF,SMF and AMF NFs are changed, the free5GC Operator on the Workload cluster will instantiate a new POD with correspondingly modified resources (CPU, memory etc.) During this process, the pod will restart. This is a - limitation of free5gc. + limitation of free5GC. * Only Gitea works with automated cluster provisioning to create new repositories and join them to Nephio. To use a different Git provider, you must manually provision cluster repositories, register them to the Nephio diff --git a/static/images/user-guides/nephio-r2-5g-network.png b/static/images/user-guides/nephio-r2-5g-network.png index 428c51a9b5436abb6b7de3432b71eb2d13b74d1d..48fcddbd96fd98a28bdb393a64c31d72dd1d156a 100644 GIT binary patch delta 58844 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 z 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 From 3f0e26caab3f5b0a4dd4897c651564ad0f2fd6d7 Mon Sep 17 00:00:00 2001 From: Eric Debeau <43334934+debeaueric@users.noreply.github.com> Date: Mon, 5 Feb 2024 21:44:41 +0100 Subject: [PATCH 08/20] Correct free5gc exercise (#107) Remove edge1, edge2 and regional repos in the output from `kubectl get repositories` command For R2, free5GC tests moved from `test-infra/e2e/tests` to `test-infra/e2e/tests/free5gc` directory - Correct path for yaml files - Correct file name from 003-network.yaml to 002-network.yaml - Correct file name from 003-secret.yaml to 002-secret.yaml --- .../docs/guides/user-guides/exercise-1-free5gc.md | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/content/en/docs/guides/user-guides/exercise-1-free5gc.md b/content/en/docs/guides/user-guides/exercise-1-free5gc.md index 8740eeaf..0ed3693d 100644 --- a/content/en/docs/guides/user-guides/exercise-1-free5gc.md +++ b/content/en/docs/guides/user-guides/exercise-1-free5gc.md @@ -82,12 +82,9 @@ catalog-nephio-optional git Package false True https://github catalog-workloads-free5gc git Package false True https://github.com/Nordix/catalog.git catalog-workloads-oai-ran git Package false True https://github.com/nephio-project/catalog.git catalog-workloads-tools git Package false True https://github.com/nephio-project/catalog.git -edge01 git Package true True http://172.18.0.200:3000/nephio/edge01.git -edge02 git Package true True http://172.18.0.200:3000/nephio/edge02.git mgmt git Package true True http://172.18.0.200:3000/nephio/mgmt.git mgmt-staging git Package false True http://172.18.0.200:3000/nephio/mgmt-staging.git oai-core-packages git Package false True https://github.com/OPENAIRINTERFACE/oai-packages.git -regional git Package true True http://172.18.0.200:3000/nephio/regional.git ``` @@ -391,7 +388,7 @@ specialization pipeline will determine the exact VLAN tags and IP addresses for clusters. There is a predefined PackageVariant in the tests directory for this: ```bash -kubectl apply -f test-infra/e2e/tests/003-network.yaml +kubectl apply -f test-infra/e2e/tests/free5gc/002-network.yaml ```

@@ -405,7 +402,7 @@ packagevariant.config.porch.kpt.dev/network created Then you will create appropriate `Secret` to make sure that Nephio can authenticate to the external backend. ```bash -kubectl apply -f test-infra/e2e/tests/003-secret.yaml +kubectl apply -f test-infra/e2e/tests/free5gc/002-secret.yaml ```
@@ -539,7 +536,7 @@ added to the Management cluster when you had deployed the nephio-workload-cluste PackageVariantSet). ```bash -kubectl apply -f test-infra/e2e/tests/004-free5gc-operator.yaml +kubectl apply -f test-infra/e2e/tests/free5gc/004-free5gc-operator.yaml ```
@@ -603,9 +600,9 @@ yet-another-package - a "topology" package - and deploy them all as a unit. Or y create them. But for now, let's do each manually. ```bash -kubectl apply -f test-infra/e2e/tests/005-edge-free5gc-upf.yaml -kubectl apply -f test-infra/e2e/tests/006-regional-free5gc-amf.yaml -kubectl apply -f test-infra/e2e/tests/006-regional-free5gc-smf.yaml +kubectl apply -f test-infra/e2e/tests/free5gc/005-edge-free5gc-upf.yaml +kubectl apply -f test-infra/e2e/tests/free5gc/006-regional-free5gc-amf.yaml +kubectl apply -f test-infra/e2e/tests/free5gc/006-regional-free5gc-smf.yaml ``` Free5gc requires that the SMF and AMF NFs be explicitly configured with information about each UPF. Therefore, the AMF From 55569f135ce38e3fe63d110c1e2c5311656a9966 Mon Sep 17 00:00:00 2001 From: Sagar Arora <74044881+arora-sagar@users.noreply.github.com> Date: Tue, 6 Feb 2024 20:27:41 +0530 Subject: [PATCH 09/20] Updating webui deployment of free5gc control plane (#108) --- README.md | 2 +- .../guides/user-guides/exercise-1-free5gc.md | 92 +++++++++++------- static/images/user-guides/free5gc-cp-3.png | Bin 55614 -> 65187 bytes 3 files changed, 58 insertions(+), 36 deletions(-) diff --git a/README.md b/README.md index a183407d..db4a92cb 100644 --- a/README.md +++ b/README.md @@ -126,7 +126,7 @@ The releases of Nephio to date focus on: the Cluster API. At this time only KIND cluster creation is supported. - Orchestration/automation of 5G core network functions deployment and management. This release focuses on network functions from - [free5gc](https://free5gc.org/). + [free5gc](https://free5gc.org/) and [OAI](https://openairinterface.org/). While the releases to date use Cluster API, KIND, free5gc and OAI for demonstration purposes, the exact same principles and even code can be used for managing other diff --git a/content/en/docs/guides/user-guides/exercise-1-free5gc.md b/content/en/docs/guides/user-guides/exercise-1-free5gc.md index 0ed3693d..5970cbd0 100644 --- a/content/en/docs/guides/user-guides/exercise-1-free5gc.md +++ b/content/en/docs/guides/user-guides/exercise-1-free5gc.md @@ -79,7 +79,7 @@ catalog-distros-sandbox git Package false True https://github catalog-infra-capi git Package false True https://github.com/nephio-project/catalog.git catalog-nephio-core git Package false True https://github.com/nephio-project/catalog.git catalog-nephio-optional git Package false True https://github.com/nephio-project/catalog.git -catalog-workloads-free5gc git Package false True https://github.com/Nordix/catalog.git +catalog-workloads-free5gc git Package false True https://github.com/nephio-project/catalog.git catalog-workloads-oai-ran git Package false True https://github.com/nephio-project/catalog.git catalog-workloads-tools git Package false True https://github.com/nephio-project/catalog.git mgmt git Package true True http://172.18.0.200:3000/nephio/mgmt.git @@ -105,6 +105,7 @@ kpt alpha rpkg get --name nephio-workload-cluster ```console NAME PACKAGE WORKSPACENAME REVISION LATEST LIFECYCLE REPOSITORY catalog-infra-capi-d4d7d55835a5578f5c43fc8244deb6a091a8643f nephio-workload-cluster main main false Published catalog-infra-capi +catalog-infra-capi-b0ae9512aab3de73bbae623a3b554ade57e15596 nephio-workload-cluster v2.0.0 v2.0.0 true Published catalog-infra-capi ```
@@ -112,14 +113,14 @@ Then, use the NAME from that in the `clone` operation, and the resulting Package and `approve` operations: ```bash -kpt alpha rpkg clone -n default catalog-infra-capi-d4d7d55835a5578f5c43fc8244deb6a091a8643f --repository mgmt regional +kpt alpha rpkg clone -n default catalog-infra-capi-b0ae9512aab3de73bbae623a3b554ade57e15596 --repository mgmt regional ```
The output is similar to: ```console -catalog-infra-capi-d4d7d55835a5578f5c43fc8244deb6a091a8643f created +mgmt-08c26219f9879acdefed3469f8c3cf89d5db3868 created ```
@@ -130,7 +131,7 @@ and the `set-labels` function to do this. To pull the package to a local directory, use the `rpkg pull` command: ```bash -kpt alpha rpkg pull -n default catalog-infra-capi-d4d7d55835a5578f5c43fc8244deb6a091a8643f regional +kpt alpha rpkg pull -n default mgmt-08c26219f9879acdefed3469f8c3cf89d5db3868 regional ``` The package is now in the `regional` directory. So you can execute the `set-labels` function against the package @@ -145,9 +146,9 @@ kpt fn eval --image gcr.io/kpt-fn/set-labels:v0.2.0 regional -- "nephio.org/site ```console [RUNNING] "gcr.io/kpt-fn/set-labels:v0.2.0" -[PASS] "gcr.io/kpt-fn/set-labels:v0.2.0" in 3.7s +[PASS] "gcr.io/kpt-fn/set-labels:v0.2.0" in 2.6s Results: - [info]: set 18 labels in total + [info]: set 22 labels in total ```
@@ -159,7 +160,7 @@ In any case, you now can push the package with the labels applied back to the repository: ```bash -kpt alpha rpkg push -n default catalog-infra-capi-d4d7d55835a5578f5c43fc8244deb6a091a8643f regional +kpt alpha rpkg push -n default mgmt-08c26219f9879acdefed3469f8c3cf89d5db3868 regional ```
@@ -174,26 +175,26 @@ kpt alpha rpkg push -n default catalog-infra-capi-d4d7d55835a5578f5c43fc8244deb6 Finally, you propose and approve the package. ```bash -kpt alpha rpkg propose -n default catalog-infra-capi-d4d7d55835a5578f5c43fc8244deb6a091a8643f +kpt alpha rpkg propose -n default mgmt-08c26219f9879acdefed3469f8c3cf89d5db3868 ```
The output is similar to: ```console -catalog-infra-capi-d4d7d55835a5578f5c43fc8244deb6a091a8643f proposed +mgmt-08c26219f9879acdefed3469f8c3cf89d5db3868 proposed ```
```bash -kpt alpha rpkg approve -n default catalog-infra-capi-d4d7d55835a5578f5c43fc8244deb6a091a8643f +kpt alpha rpkg approve -n default mgmt-08c26219f9879acdefed3469f8c3cf89d5db3868 ```
The output is similar to: ```console -catalog-infra-capi-d4d7d55835a5578f5c43fc8244deb6a091a8643f approved +mgmt-08c26219f9879acdefed3469f8c3cf89d5db3868 approved ```
@@ -262,8 +263,8 @@ kubectl get machinesets The output is similar to: ```console -NAME CLUSTER REPLICAS READY AVAILABLE AGE VERSION -regional-md-0-lvmvm-8msw6 regional 1 1 1 143m v1.26.3 +NAME CLUSTER REPLICAS READY AVAILABLE AGE VERSION +regional-md-0-m6cr5-wtzlx regional 1 1 1 5m36s v1.26.3 ```
@@ -272,7 +273,7 @@ regional-md-0-lvmvm-8msw6 regional 1 1 1 143m v1. Next, you can deploy two Edge clusters by applying the PackageVariantSet that can be found in the `tests` directory: ```bash -kubectl apply -f test-infra/e2e/tests/002-edge-clusters.yaml +kubectl apply -f test-infra/e2e/tests/free5gc/002-edge-clusters.yaml ```
@@ -370,15 +371,6 @@ worker nodes. ./test-infra/e2e/provision/hacks/vlan-interfaces.sh ``` -
-The output is similar to: - -```console - -``` -
- - Finally, you want to configure the resource backend to be aware of these clusters. The resource backend is an IP address and VLAN index management system. It is included for demonstration purposes to show how Nephio package specialization can interact with external systems to fully configure packages. But it needs to be configured to match our topology. @@ -792,7 +784,7 @@ Step 4. Once the subscriber is registered, you can deploy UERANSIM: ```bash -kubectl apply -f test-infra/e2e/tests/007-edge01-ueransim.yaml +kubectl apply -f test-infra/e2e/tests/free5gc/007-edge01-ueransim.yaml ``` You can check to see if the simulated UE is up and running by checking the UERANSIM deployment. First, you can use the @@ -801,7 +793,7 @@ UERANSIM pods. ```bash get_capi_kubeconfig edge01 -kubectl --kubeconfig edge01-kubeconfig -n ueransim get po +kubectl --kubeconfig edge01-kubeconfig -n ueransim get pod ```
@@ -861,7 +853,7 @@ kubectl get packagevariant edge-free5gc-upf-edge01-free5gc-upf -o jsonpath='{.st The output is similar to: ```console -edge01-e827e1b4d5ea1d76d1514de20d1ee27bf884c72e +edge01-6b26ca0f4fdf83212a73faff159bd013b41207ee ```
@@ -871,7 +863,7 @@ This way you retrieve the downstream target name of the package. You can also re Next create a new package revision from the existing UPF package. ```bash -kpt alpha rpkg copy -n default edge01-e827e1b4d5ea1d76d1514de20d1ee27bf884c72e --workspace upf-scale-package +kpt alpha rpkg copy -n default edge01-6b26ca0f4fdf83212a73faff159bd013b41207ee --workspace upf-scale-package ```
The output is similar to: @@ -928,6 +920,10 @@ kpt fn eval --image gcr.io/kpt-fn/search-replace:v0.2.0 /tmp/upf-scale-package - [PASS] "gcr.io/kpt-fn/search-replace:v0.2.0" in 6.3s Results: [info] spec.maxUplinkThroughput: Mutated field value to "10" +[RUNNING] "gcr.io/kpt-fn/search-replace:v0.2.0" +[PASS] "gcr.io/kpt-fn/search-replace:v0.2.0" in 400ms + Results: + [info] spec.maxDownlinkThroughput: Mutated field value to "10" ```
@@ -941,13 +937,15 @@ kpt pkg diff /tmp/upf-scale-package | grep linkThroughput The output is similar to: ```console -From https://github.com/nephio-project/free5gc-packages - * tag pkg-example-upf-bp/v3 -> FETCH_HEAD -Adding package "pkg-example-upf-bp". -< maxUplinkThroughput: 10G +From https://github.com/nephio-project/catalog + * tag workloads/free5gc/pkg-example-upf-bp/v2.0.0 -> FETCH_HEAD +Adding package "workloads/free5gc/pkg-example-upf-bp". +< maxUplinkThroughput: 10 < maxDownlinkThroughput: 10 > maxUplinkThroughput: 5G > maxDownlinkThroughput: 5G +< maxDownlinkThroughput: 5G +< maxUplinkThroughput: 5G ```
@@ -963,6 +961,28 @@ kpt alpha rpkg approve -n default edge01-40c616e5d87053350473d3ffa1387a9a534f8f4 The output is similar to: ```console +[RUNNING] "gcr.io/kpt-fn/apply-replacements:v0.1.1" +[PASS] "gcr.io/kpt-fn/apply-replacements:v0.1.1" +[RUNNING] "gcr.io/kpt-fn/apply-replacements:v0.1.1" +[PASS] "gcr.io/kpt-fn/apply-replacements:v0.1.1" +[RUNNING] "gcr.io/kpt-fn/set-namespace:v0.4.1" +[PASS] "gcr.io/kpt-fn/set-namespace:v0.4.1" + Results: + [info]: all namespaces are already "free5gc-upf". no value changed +[RUNNING] "docker.io/nephio/nfdeploy-fn:v2.0.0" +[PASS] "docker.io/nephio/nfdeploy-fn:v2.0.0" +[RUNNING] "docker.io/nephio/interface-fn:v2.0.0" +[PASS] "docker.io/nephio/interface-fn:v2.0.0" +[RUNNING] "docker.io/nephio/dnn-fn:v2.0.0" +[PASS] "docker.io/nephio/dnn-fn:v2.0.0" +[RUNNING] "docker.io/nephio/nad-fn:v2.0.0" +[PASS] "docker.io/nephio/nad-fn:v2.0.0" +[RUNNING] "docker.io/nephio/dnn-fn:v2.0.0" +[PASS] "docker.io/nephio/dnn-fn:v2.0.0" +[RUNNING] "docker.io/nephio/interface-fn:v2.0.0" +[PASS] "docker.io/nephio/interface-fn:v2.0.0" +[RUNNING] "docker.io/nephio/nfdeploy-fn:v2.0.0" +[PASS] "docker.io/nephio/nfdeploy-fn:v2.0.0 edge01-40c616e5d87053350473d3ffa1387a9a534f8f42 proposed edge01-40c616e5d87053350473d3ffa1387a9a534f8f42 approved ``` @@ -970,7 +990,7 @@ edge01-40c616e5d87053350473d3ffa1387a9a534f8f42 approved You can check the current lifecycle stage of a package using the `kpt alpha rpkg get` command. ```bash -kpt alpha rpkg get +kpt alpha rpkg get | grep free5gc-upf ```
@@ -978,9 +998,11 @@ kpt alpha rpkg get ```console NAME PACKAGE WORKSPACENAME REVISION LATEST LIFECYCLE REPOSITORY -edge01-e72d245b864db0fd234d9b4ead2f96edcf6bb3e4 free5gc-operator packagevariant-1 main false Published edge01 -edge01-7c9bf9f43768ecd2b45a8be84698763cdd2593b6 free5gc-operator packagevariant-1 v1 true Published edge01 -edge01-40c616e5d87053350473d3ffa1387a9a534f8f42 free5gc-upf upf-scale-package v2 true Published edge01 +edge01-5e5621cee05df46c3e9ad6dd50ab485f4ebeeffd free5gc-upf upf-scale-package main false Published edge01 +edge01-6b26ca0f4fdf83212a73faff159bd013b41207ee free5gc-upf packagevariant-1 v1 false Published edge01 +edge01-40c616e5d87053350473d3ffa1387a9a534f8f42 free5gc-upf upf-scale-package v2 true Published edge01 +edge02-b5d2931f75d20d95e7d3d9b1fb10bcfa9156b9ba free5gc-upf packagevariant-1 main false Published edge02 +edge02-be05d7134eca3e02fecd63c4e4031f728d5f0e84 free5gc-upf packagevariant-1 v1 true Published edge02 ```
diff --git a/static/images/user-guides/free5gc-cp-3.png b/static/images/user-guides/free5gc-cp-3.png index 7440b69d1538bceaac80c54791cc1ab7ea97549b..e85d8dd63666951a523b2732cc9ba65048ef8419 100644 GIT binary patch literal 65187 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⋘WyoP8cw_letdIqy9L z9!@HX*qtjMCxwIypG3w(U!nB;rJbweJXfLR|b6AHM9+pEOXz$dYqbk~; znhG`a{`3*!7T6Xh(PNYF=I%4nHg2w=d_tY4)858R$JZAC44uEHl*T%Gr!*k~SM8JZ zw<4Thm}q$W^Y20ALUQ>e6ZS+#d_k4^Mr+e zh83Rb--Ke_A6jz}@(fb!oC{K@-`aKnEq$jmk^@ix5dHYwPq3(hKIQe1SRRm_hw z@|w;(hj3{Z@1R>PPHP0*S?0%$%ZS6CU2_u5K zsk+bh$4E?yPL%?e(W_Litc?s6mVSuA9Mm=OWbm95Q}ehR_k=*C-*; zbp9@4m~jD)2%|0D@XuiSe!_~waEU5dz7SnsQ`gt2_vLe5zuve=@_=VQn@|ksuQl4E;_o*J2o!vn zM-g!U`2Aw}IkcD5)ic=wp>vY!Jd_9T@z(ogn*OI#PldZyAtyEZ_SQ3T^@F1p{e|ez zpZI@Urwb9bauy3sDI?YGe$V>Ew{r8sENR5?Tl+)jbh61y16SP(>QS{7-djGudfMAv z(%T$1=Yh&UT|)Rf8O%1C3?%v4?#@$F|MWgF1;ItPO*i)wT|e$`p6srgpPw6@#UM89 z-y|_G@eB)!B2_DMfpv8MYWu#Q$-o|rzqZA3t#KILO}bDh5RVn42%V-2J&D+m6+STd z@puN53VNJPAi_UHTz^ke|I@ac0Ew*Kl+a}SNtYzyR7}wM}zPUOh?X=oxTZrJI1=%H+^%@ zzh9?5Rj7X^H>>w@A3VcexleQAdx*2S4JG%ZEIfm(SrOxYy-MGS%KM=HbiHf(Sl``^ z@W)z^A$0_ejg38#mU_KVrJLodS}ScuuVs5{+jTY1nPh47Iv5asXCJc+2gLOBhU9w zDpvh}6Gxu0NSzc}C^P>p^7voNbGpl~6p#hDzWc|l@cm4(>x{+O53*bauk3SdkA52K z(1Q&-zo&s}|Cr4sRFIjO8Oy>mS2fZ#tPeRK0rq`shZ0`vPg88c7)P?NnBMyO`ZNjB z_NWcvv(KoVab>a>O)Nu{M8w#wOmFxWhYtLL(_k?qi&Zywc5KzLV*k+6tZT9`m188= zYHOc#J{Bn{sXazhs_F?wWMBK#>})Tr(i$AW&7|?offe=jT)w`(vMFCV1Ox>5!J5K< zr>H)1l>Ve*01^E=RBs=jdnD1&ZurwylzuqWU<6opP(lZVP^8xo zdI#y!JG_s3j_2O@_x*lj#5l$d*?X_G*SGeXbFPHHQj;epq#?X<;|8&!f{f;k8#qwl zpE3R&V5Gt08$IyfO&3jh=^Mqp4_9y8V7Q?uBlX6^a3cfH<4x;ns00H6BbisC%`FZr z5#*ltc7uD-tX7HFfkVw&r9M?DY;N59XuLtNC@e8MP$7AmfI#ud)k=or{I4?3w5g4; zsTomH(o%1W-fj^WH@}s$##HP6FE2v{P=Y-#d~=Tax{tkkXv$xhTPSN=$oZ}pCV{n6 zIiK)BwWcZ$TvzsI@=R`(3#xYS(&mUg^|w=Yz?D}to@3>2MzeRA(G3H2(7{%i=@;< z1mWG`3N2iaG9(4jp#l1h7Xpx-=He7~G^rUo-<{m*9I@?I>MZ2&t@%VqqZN*LTT6!I=;b7~Cp8{v zuGL~GlynqP6o@<->@V&w%0(y1DJ_$AkRY{cI^k>1%Y7ov~bvV%XD|3RJy8WS7=vfuO~!%Ph#iKgKr;#Y)4wjZ9Ea zPe6wFtBlwtUQ|I7?Zl~T#s zougM+{6dXE1P#ilcCH-Dd3T2`&pD1fFSwt*YlkYeNCj4DARG+3(1++&N-|PX+-&3I zH!+vi{vN}KtGAq1>A=Ln6vu;GCJztr5uA`*jC1XBp=UxlJ0^#&_u5IZ=>yH@~1lm1v&Toj% z9BH#f=t((-C%$>3OT))HrzVsC%|%1%TdAhl`w=>G7gR>{cdDZ_azEm`rttXe;Fiph6Y3nBfE1%AYHc1VCiJ@IBfPb2bZx3ehua8 z7n)jbyae}FQeD}VEW+89aW$0~>d>J4(qoPe=XDU&pqsmA^Eu}!O`%HNx1Yj+Y?Q4a z4yRToJ=$FBm5Yy;-QWKdF*6_&T@5~M5_gItWn+==g)xX-j!6%qbvh@#np)-ht8fmk zXJ8Vnp-3t_YIZ!KN3BxB40ZL}Qud4mRhCWb@|}F_DJq@esSs2r-XP6qkn7M1R!Ix0 z*H_yzUXm`ae@7>mW_@$_k|#(6X%}AvtvS~>SDK(=$a*T4>s8De_XsKLqdF9#Ma#~_ zz>Z;=A#81g!f$KT9;QpixLX++W7uY*s>KVjp+2qp(}v`-1?2#{eV*{XwPmp2K>x4 z_G5oP8HYd@B$d<9TCjxa#e~quVt%lV6{gU7vv=SV)c(*me5~R|hEpE1=cQLg#BKqu z6xl)~uK~Q~>#I*GRJdlYmLV6P3u+H!B+uX@lvY!0y0~lVa90NyhNstq4CQ#-&<$6l z6MSNqYKdv+kIHDJRCUo#@ojj1pElR|2M+|XTbWcVGx2ftWVhb;3(cLO(*#A44tW|P z+^+JBkRoX6Wrdl;1#~H`atK2@Ht}<8wCt1|N-Mx)OPSZdd!I64ancKH)3insKf)6p zFeJgnLtDr1+pvwQ$SA_y zbL*iDjxa4xSVOjOD?^+Ya^!1&(M!6ZzH_B=37fgziPCW02|dC(kC0zEOBP04Q7fH` zMlXvn^HgOvx0lXati-xe5BF?%3_nQdCA?;mj=YUuX3rX$r=}f3+Fo(lykS+ODMXKNrU^7js=RLO)g&a9W7OArP|zy$52*~3v={YtIy1bj36 zfZ+%PXJilIhf+mYt4(=UlC1lek&!@ZFQ`^iH{%aSxRDh`^!B5u?k}G|S=>u>~dME5xBj){(r^`Uo=PKtO>cf{Jj+E4ah zLYAZI)Gi$AvN6SyXoDX&f2ksi|76`&bW!exV9E<$Xj$pR{m5a{h85r!PL5OjXq|c? z8QM3Bx~vs{Opv1nXYC69?MhUPrcXvpD59k?hfmZmzL1EFE%;Q(-MpO(XEI1EjfW1dvRAMc`nH4x+v^1BvqCPq*&VSm^%Tl({ zORBaggz+sOHKMG!=JdC|VRrFl%e>Vx^6wK}sL{6%Kf52kQ4dT3TrqUo8@X!Bx zhzOsSpU0NE_25}vGhFE*t(%~&8A`X@73o*UQpT{VYu5Jb&v%tb_MYj2DL-iN3Gv4M zC1NA$5@8n_eH9^+BAVBHxi`S%{b%X~HQP7n3MtQUa`aw*v@$o&VOH;S{C3oNH%>_J z)T!Co+Xdb1S}_$MQdLGLXlFs%C_J%T+NT>e>|Snxx>7@I1Yh-38I2yUW5m+N-!Y3| zBk4IyW92x%>*7e)KbbkTpXiL4K;+s@Bl-n5bd1+4d#fH0v2VtXQ3+bC5qi&mkQKDh z6SHHYEsWps$wJs0yM1Us&1b<`WtxpK2lvJ#m%Zf~_8pRDsDu$Iw|?vC{v;Qs7t5AZ z;KcuI0#&11{ikF*DMgkyg8W&NYs6HzOJ|RG3axuPupqL*x91dtFlaP6PpK&#{MJ`e zamcw_WIN$wn?Ca+DXAFswd8>Vy`KRe2#zl8v8zHz!!S&f50E2{c_ouob#`Nua-tQU z-NL;_^@EpwGxxkV5KZGQS4*_m+w$%eoa&dq~qb!WFc zWtuRDYnu&r{j_jsH&b;TX= zqRoUkJ_Hk`AW`luCHC$l^MME%FA{Co1e5Apo-8(lI9{BGR~XLjNcT?r{6JZT7r2^W zR6euR`omnx+Lp5o!t(DTfm&T=S}_mP z^+~pw%=5SL#5CevAf#*SIQr5@`_Vveu?XtDRe0UqxV$te$^y3i*VQMR?^}Z9 zpaaLy?+@fxWRy7fy1jCr#XI~KLYV1M{R$K&?u z#tO4IO1~CAGV(RZhS?q=K22D*2v#}5x{SiPHVHSXsH>1;MC|adU;Q18SPkF}&%25g z8$~Xc#+r^wDcx+XXH=e4`r4oszzjU zrz5sSpUr|*z3joZ6HGIoHcu)M`nKmvmDuc4?u)`?x~ZmUSFuHrG@cTs8klXzJ=)W0 zobonL)Io^qMrfUPtw&Kt@h7XUF4GcRE9hj0-=oPPGQ+9fiyjLXFUdH{2?^t|P85SD zBpSu>5zNzJ%AK~3`TCtiu5bCWXC5_Dg58xY(?r?@jFlx?WXj%}Yqq2#gq0ZYcbYU_ zh_n0_t|*rll2)zYvrI};1sA^fqsY4eAik zsWbmEG-_w|cyp%rH2wHPbjBMhuogXRy;#``JENxG=O*SJ<@>@**SQtL>_6V`UZ`J8 znmIalXJd3crrx)pL6BFxi{a$bO#xcB9;N2iN?E?qE42K0{KLVA*hVv1Yt&}qw{nVg z%k$q{>l9CBRb=RfzJ7^M#T|T%!uL{_qk+PfBYpMqI?Td2V{r9oV2aiQ9YyX6pO>R} z%gKqlAtM#TZ*3AS`9d9F4nB3mBu#cUi;(gr%(>=SyS2ea5)fii{%0f8Ck5=U8pY8V z7omfSg(GX*hS-arZR$`BcjQQE03Fgu#QWeh8s7gWRd9c^;Pc6M(gPHxHM(f&*Mbd| z|45B%W{<~P$}_9C;hVlKi)K-o!--Oppqsn6otCd*^!$R)?H;a#w2lqCRkAkVep-0& zbT~C^b@TR=m=w+`Idmhp;$;FFvzw^ZejYT@N7OSUv>28(9@t#Q&mA@4-~!PN8Cz%V zF5ays&660M$h?AuXE?g|FdWc~=z4#f{;?oD7NLQ9|%G<_3h+`#YGE4I|r(s%bvQMG8w6 zi=pLjqL%4U-H-EjT5ApEZ(Dv){+6tVH0ommwx4J{dl;}E#%VKOGn+8LZJM0MSlgUi ztApy)PP?dpPiZ>29)^`ME%%HG;2bT0phU`3J1+;&5DxvLCeaD5S{Ka&b0mb>ZS$3} z2wV^T@)Fg^Sj|N%+`8pw|E+8Lc1L@y@Act)5y3LmI*{HFWg7;ici``f%EbL~r(&Zfk(jn0bCusu$M}Pm`O%HbW%HmW z&+vUimXju-MzZ4~o9)5js1&Ko9{OmB=-j(ZapFj-U%Vgj>mw@VFN2m@1&g@0Iu*g) z%ZZ~LiJ|Eib;lx_r{>ntI%U0OqE|)u&eBeP2J`%i5}fvjN!v08<|)9 zz2#Dmi!9&wt;6JJct#9QzOjSAZ{Ry)=Z^&|btBmkeV=DcwQMuCkz{28ZFg3#DmBY7 z!Nb}i0DA&TPD9{(JoC5nH0yehRB2aLte$?O4@bTnss6~Ha_F~A(giCj9Utl)`3l(@ zvtu`EFVYNRIlo-q%QG3V-#zbHQDP!{g|kWtok~k_Rhg&QJxR2H*RT3de_Bbk(+ow> z%W?C8iN+G%Ay}}QOnQVb+8%QuTS@yTmx_nqgdzI;^=#gVlQyTfi`V?r+%BKc@$FC7hph3tzX5B@7-55%0lf3@>fM>0B)Dxx-&Q z5_E8RJ&%HMSKn1an2x?@@SI0sAF3(hHk1G1fati7-3g|iw*f=tnRJvh&)$4#iSjefzGG^zbG+0E?uM z;K<^92Gy~LAlvLt$oMRX*6~(WS#{x_JkTpIpAZASA~zh?0xUb+3=>6AWm5UVzyGJ5 z-JjG9SOjA4(9W*q&Rf)aW}2x`!@Vn#^P}|2Oaq@+v?9whLmNvarbW`xBk~6aVi%nt zvax$rxeO<#G-9cq^lhR$5le*$M+pOEP9u+ecdAJ|@g&nLIiA^`k8Z!VXnunz50*Sd zgK*D+Ug*~ro2_W2sInLG@=;PllJ|!+`3~RBBf?!CEl}CREqC_H3WRC~wJ^B@HfiE! z3%_sfDr=`CzPUaBc&IFqAGyRMYeuykT4{p@qX>6tuvxM8FwO`Xy_rI`anfpAQx>-b z|Et;qyTNqAb=QI8?g6f9Wza{h8nrT36Aj}MM05QyTNB*6Y8=URlN%G^v?T*s5-vop zMAGXdC>g>tg%nm;DawBNqGZ^78C=l6Jfdhn5OQ{<8W@5BMUKQ=$y z>EYfz2cwa8*A12|yED5vIWyU8w&K(KQa|hQFnWU9t*RZzBxAd5)``pRp;V==PQ=a- zd!9UP{(|v)TG?Rhsjq?a%yEWDSvqg35z)5Cjb8Fi5yyz9;O^QoMVke*5}N8cq8a`^ z?s}tZHYuObdOwsql_n5CdXZ)1Bx9ni-ecHqp zRH*8bIwrdI;JtQ(x>LX@$}g-d`ZwZKYGhHU;tbENiipJC5=!#P_-kG;$36U(FM_bh z4a-9Zb5f)J){7AFi!s>Qc7Cp)+c;sGXw@3S8fUE#($wAB1kWD25wrJVXUqCu=d0cW?^iclvwjt zIo0;DP5)6L7Swc!6FIm>!c{F zz&;Wr4`bsDPrSlKNOz8OAJj@c0V8$J<76{ss&MJoA@`Im>rJ&r&B<=|k}^-4Y&vLl z+V(n-FGTeRo3Z*G9XHsv4ZOas)#MF8OBl{7HIzRtps(O(Eg@GBhP$h9^6eaj121m1 z(4R(!Kgs6bVXBGiJp4P$?+-Y~1F(jfgIX3Fg7nV*&3D|^46R&}5M@R!c5x9;{RYRs z`eBNYy_|dS1-09P_RimXOwAWMM^GcDszv4+Ukjd>K2NY5vl*y}x0|Z_u9^Wg`LOZ^ zLh#g2U(_VnyqWKNXbR^0%N5LtpbgAge}%e?%=l}}?OtI4e}sALc^zESOhQf1q^U0g zPB&4ZY-;&)yvX*8t4*Q`T@b+=4yB8`?5) ztiD6QgZy@mgL_c_{OtKsqGB_#hm_5T3?zW%^IaeEa|{Pq2>NK5CHjr_BWl>5o(G8H zJ89D@f>v9%W)Y+w^m!L8#qb=~MM+3Uo91f&(0AySf6Mc7N4MayY_DU+AFPTOU0-%oJx#z8`pA!b39QGOw8C=v zopKK{$ixw8Z*EtN%CqH4<&fUze=FiqPo| zop7ErO|4HmS1Rg}qEfDW-AQh z-QxS&$h)%X4!iVv8P}}g3;{doY8o@)aiGZvo!WaJbY}L;5B(^hQoqMN!QG&dpTrM> z1oKId1Po=4zdl-c{kR(chT<%cpjL<1)-pZ7CDYR>CxfoOr7_mBG5XjzQfyCU=BM?i z9#@-J4$_;+g}hh`gjhq+Ng~hSyAG;4zM|107JuF$4L^})Ng#` zy@A-~PS#|Yus0KUixc>!eY$}K>J5+!4B~f%OVtNpz1=FUWn&*l8<&aos2~~Ic^^-3 zJ;-$^$O^$sc?LtX9F4|VZ4e6mREdtE37l}m{%%R_S+{0+0*4dl?EuTT^&dH?qU=ts z537nW@Q`!{`hMb2A>wb z>}RW%fpQ@epVSyHwsdwzyyQTv-VHe#QfT`!^gUa--$w-UbnV9B8^+#cXI9{gb^m-3 zaSOwVv&82~iyw|SrQ`cmPb*#MqotJ&sXZJZv?IkZqr4eNo+&^OG_X>W#NfyU-;Xk% zLAWd^o10+s#P4F3ZJ7@Eh_@Se>BDJO?8 ze&f9?pR+z|F5vS8$`~~q3aC?{(yF;$bc$wu0O!MXP+Gc$O#-&FJCi7zmbMV$WXjho z-5s=ucr{#8p4tx$$p4Clkkv|^!Eb+|9()}doSSMpHD8_C=A4&fIXgU8{II3mL)LM= z!b<6zPNnDu+QC(SUF~i`S2@W`8Ql-+k}&Xzimg$$TU?1)Is8|Eh^3!(DO;n*m<`^E zhvMxOVYjgMPqn-mD}RD!JNOHev@gCzcMA&+knH_@FcnZ7e!aLQpwIbaMBfi8R#2u3 z%h1gXNE=^+qbu$v2RYE>L@QrJ&;D6~JYd(u`bW|&17_a2KHR(UtyC5++PGiX3SJ81 z8&5Im_?f@L%(UMOXb5p+UKWa2fEiHW7e6}{Go%P-)%$-)2xx!PQ`i=H)^O}21O5RZ7r3YJ`P+K(&1!y4jFq@9y> zuYgC*w^v5QN!LQ9Olmd};c6U=9lW6yG3QbK-pxgoD}X-Y9A*5XU6$@+#(cms$5-1{ zFTpU*!1J-+Z$!HAF5?xnZ`1B?PE-lAAEo*A`t1if zEexmr27of8fe?H05;jLzenKVnJ$fx(4M&H0nM;VsrbyIb2W`t^ZSkJyNrrDmr#JJY zGPoxR*D4WA#7?GnJG#tagRC(O%ihZrX~5oY8IuTPrH>@s2G)Wv!4&TY>8wleR@k`i z&SomS+hJ3o8~Jc(LQ#oRB&z@Lb4xGzYUbGssH|6)Pq`pEdq9Vk{5bL*8uCi+7C7Yc z34xN`n^*=i2AxbXY+#b(2Qrth#H#Nxd;;t5*WnaL zV*=^s!InmNHEH<^lYUqqXJ$OSa@ySGD!0^*0{S!vx}I&BoXSc3ne{7%SR*8djA8lC zm*8Nqg8Yfu(4~UnYW_P=Stbrofw9h#Wx)>XkJlFwLw+sWtmaS^noFscy+WP+12o8>GF zA}Vgn^k>C;6&n#F4}Rj&V|SOj5ET`}?Ck9DgSC;Z*aZBrcYj}!FkG831Ua+Z8zMv^ zSQ|ow5U6KOO+9jlRcUgOlimFH)ggu>fX3u&d@ZW4pCr>Ogdm*fJGm=p79$=!KWYom zk*0{UvOxmQOOIca`hZ8)Zc~B(`;*G+C3hCuMMfFt+4&*LT<9XY zTQ({GZHbUzm<;NFz9V0`{>n-3X-;vrtR$|?|Gb<-B#Ds%p1WqFj=D(aZ&xF){_Zj0 z9%Viw>YGYx!u-T{kH4cg$vZf&H#GeHbqmTcsd$p+o(J*Bg`fGc>C6L1p?&?=j{v8441SHFmng27D7-bx`z;d=WjY}Z}M z?=UUuy+0toxmH*bQ@Gj^N?P@jN|ClfHIL;X<;CuR3 zWG(-zJ}0Ea(C))yb=0V#cTcbII>-9JS9$4+5BA95&w7*B0>9zRh8h(l{`ePT!0Oz$mg-_w0X#R;wa{|OMuPpuf> zIjWUV7XD$w3qFK>!`tID7{}PcjIw0h}#gZ)95zsX(_}L$ENzpY`cChrYB2c zMi)&Yw*P8mQ4hZ?guT*>kmw*4VTYiEWZTs7l2vD}*hG>lX_gQ&NtKBZLD7}dFL!Xr6R zrFK z|k4J z(2KRhv+X9RtZXoy!mytPBNZhQV$T>* zzh3$e_Ik8JL^luHC_zs%Z&F;y898&~POO(S*;BHqI4(G**`bhq;%D8Lmq$$#p9E|- zfXM~10``;GgP!s}@%7X9DE5CI!eNPkk5JS(EHeCEc#Psz6ko67hq;TR8Hbg0ml)Tr z$+2&088)$^yI}@?CrfGylfFk&_Po>1U7VYFS$@vas|AI{Wz*iF^KjQ{|;KvRT@qW0?BRUeN#;vpZ)nh;~=EbB%Se{+l((jXGgA=?lUBi zP3{Z$I?V-B3(o~&rOoJp%LAgTyIL$8rLjflK562;fehU&Z6Q(Xme}uq*&FdI@?|{? zoaxqrqs_dfg}c+42;P*qI*Fy!@;y6ry$ZqeePK7we z>%W@PQsD^0M}sICDc2MqXPAk3AHE&^(-zx$hg`ZwMOXzRH0|*<`aVyyuBIrMmP?fl z!luP>UuA>Z;H}0%L&}d*ed8CqkJaG@K0B?w3GW4NBKQBakcxnDq&p~~!(Tps{-MiU z+RJcxe0OJ77nP!-h!5g$2O0m$yIi?zXRlN94 zi_=3(8;{1g&-hxFvN_EtTm-QaQL|;^1Sm^CgKh3ZQDg}^k+U1DL0qGom7|9CD#pLE zNfpC%WyE#@baaqPy!O^YNsn=9eaU075mi%@)V7b|_gBJlwT*m7T3mesc8#VN}@Y1--`D&i`Cswv1> zRZ^NRPYWYgV4CPb=~pgR()q?cCV`8@S1G13PRX;vEe+C!TP^Nk__%j4_w^-oV(Nnw zq&8m3bKngBRMwB|9|xWwo5^WPsEV6PX|+3J?v-%n0QgB$&nU>%y{2ix%Z^Ak@1 z_T#sUzO^4RSb#z!#&tk>KmJJ9ib1S7v$3Tz+BQ*`!LPIk_6r>yMHVR!Z=JB8>@dPsJk7uml6^cPF{K za8RMCO+0_n1hd`&--AUervJh?jKO%9HZxM_f?=_Zzs{Ru?OMXKbW*aSCZ{V<-Yqxs!U_bvR>LHMcoMS`hT(cFH-qYdi-u?48v~sULYx&jndNJ_nlAv()R4 ze`CvTAZy5t3vh9Dv+l(_6*MefVafPG1PhAHuO)=o#a;sU5e}bz_9Of!MX>{#`Pk-p z%I{fZlwoS~efO#HNrSAdxsdb z6TVCxCO1JBC=~I*9|Szx-=PKpSM&*8BDkrP9z!h?U7ce9 zMAbO?_lH}wig1&umV_{o0ZP^{vAFX$$yKt@N?(8*vCYjvR18nT z6GN)+ASIDA{mDjttFUHAq^H!p)OXtouhMz)!aGhj)v=CLCUeb854L+Z4+eVQlZscX z(bh4gWB2)|gJcP{*}()z1`66xeAZ>sQ9WN)5VNs{=D!QwjFs#J=oxZK(vXg304l_K zu*0CdPfdQBblt?I=3<3)hS~0In`J3(Dq0wX>$a$N!){DEz`3&xhCV3jnEzA#ut+oH zp&?A~KFa^aACkCh0GCk6wf|B3e}`aXao9mJ^1oP%EZ`nR99D@@pNjJ@B4Pm07tO7I z0Ve=E#qaN$nxEhtz26` zHRj z&91(_s-N%iwA+;g9HuAbqVAgn2M3$jiUQco(sh<>)x0Zdtc}(I4%D}`b>e#67~mjm zNyYZ#q92Kk>t;IYl01Cg-^$BMQ%)5T#S*V@TSRu!#%_0J3c_r!vZ zc%o-R0Hb0Dz+j&FbOm5T#R#Cz@x#{#yD8+xs>rtz4DRN75oVxG_AivZwF z-@jjIzqQ_TZ!%!Eoz6XdT^lxc9`1b&Iu9{Whp`Ilp}Xtz*SHy|#){^W4j&&s^!oi} zi+OE#+y81JgqU`DO$b0hwxh)v*Eq@T@?-@%^i6fjwQj4{*0t%Ri|Gmg6ZB_K2dVys zO0Z-@IOo-3!_l<2$j)1!l9)h;QyLuDHyl8O$V0yYB+P_$UdHmI>lXs|={||84RI3U zIDY^{8N8~SX=r!7efu_QE`(NiN4mi7oev9AR<~->Ia2Ik_;v9lP|A;o({P&%Fq7bq znp)Y6mF0?^{{E`A@9~QpHM=`*TY~sNx)W$6bJz3fC#=``PJ6~NzBb-2P*PrQd840Y zgPc@KpNF3@JJtvNsX5>6n)0t2w*i0kSIopp;}1O!``s_o#M}rVoIKY?BG;c>2DQV+ z0Sb4Mjavfo)IS5@*KNXXW&G!TLRI|Mxt7qnSXNYX_DJYIwktBda)7M^^&XPPw5{4k z;?Iv;m?nRJ(_Kperl6;HfLp7mH-nM+X25zhC@{ zf@!Pi>Y}84JPx?ouS`#N#)JOs$dKV|E+rckFOw<4eRqF7?)|jD3VF&TS9;HLOTBTg z?rllq>6%TvJCF~wBf-UWf0~Iluj`Xmlba%!#|u+UV#uW_yqoR5)e=dH{`2D*ZsWgn zw}5AHsWJQFoK{1H>2MREWZbSoeuh8Jw1W4%YlZ&|yuGytVA}!RR#8l*dF0i?p!o*C z|8)I& z(iZ)x(l#I9FzhQIePEscLCN?fVE6LfDG--5u(tBz*^rl#PlLnWg~tW5k}P z3EO;d0OSOnbqr$4RpRpaDERSXO293pdyV@oC-v`8K96Vg@ceYDj( zwaRJrj=4F`ZH}Ui_l=?97J2|cqg!ZJAQY>CD|LERJg>P4^^z1`FDl=N02k*M)6b)co|95BReL(x#$VGn)a8rnDwvlc zcb(`@T0uNgS-yvVMJX7PHzmG6GD}Hx!;{Phpm%=@VO{>6yUVv z>U4e27w(<`gvV5+j=y75d~-Nw(+#ObrWh=3ch-4Qdtq^HXRBI#={MC((Xop(PT^8X zCc_5b{IFDM7B9f~t(uib)a}c;Kz17{6;9ZyUWi%4vR|s-r9nbj(DY|XS5I5rb(fx{6rEmHr+g#uH+$4Jg1di13S zm=y58f!&ucbbOY*MJTo4JDsMU#*}Y>T6a?RGU#?2k@Qg{XJA9aeR>YCO6R4_3qw&Y z-qs}lz1M6W9Itc?9S=Mq`BuK6OQDjE2}Wd0&z;0hDYLsLvZ7K1i!5`1?$9P1KF#h2 z%?sC5gt@T*knPqdn=S%JDOd%x~M!oZ0NHi>mEJR+_9#_p;>W@`dPpZz?Hgi$v|FFtOphH zf3n(b+>7MIStBTlO^T%|EYe{icT_Jj%)#}ZZvs-t>FL5iN96M(2t*0q>O}+m9`BmG zm*mCI(T6kQ%Edf<;BIhHcnlQwgcLlAI!foO0N3XReF~%>Kr-NRWO~PM{NtUCP)2gH zvAqMUei<56_=pssOKre(_RlAsSmx8}jqUYK{dTAbqKx1fUTfdiA5t&6CmI5@Xb3d^ zUMwy7&1OOc|J^!rf?bKFkFN`w+5{pZKg#@hVK1Xuy~%l=#MvjkMD+%W3|{JWDP;O1 zI!9&qOcCCCk-sYaKMZw%7ZXtG3b?Mlsmi#)#a~3Pql14)qFThhU-zqC(o;X68dniL z!|Le1^&GhCTPW4zFA>%?W&=U#~n=jsw#E0W=ky+{e=qYd}bpKHDMhiL!7JVY7$VN%^V=cRlNO zLp}a|?tZbiuV3R->xTc<^{*G*m1=O`y{kC^v1D_GucZCfiW=ztA>#9R(5DLyMqa!nLxdA;dl_ zGf;3MEOO`Nl{eHU2tzc04~5OGF`)o%l)5T0NJ2vpM@R8r+^{CiU=E8+c?!!@2qQqN z|BmOsj3{R(Uk`u$1V7}6O@d8dUleGukqwn}=6I%~U7zR(0KKv?ubTlscm4Ifbw;r^ zfeono_u1?0C>>V?hC>h(J~yeZQ^dq7xGwV$sT4nwijRx48eRokQ1{;j_^mHGF3*MU ztQ$EwA&E5eIN|QI>d2V&xef*h9ff>5glIVHJ})XG3>A&;qg?X3v@CU=xEA8G1SJc*Eg<}9IE2^k7neYb`87iO%dMfFIyqM zAG~vIdbz3e2XAo!wl|+6r+>K7*s#KLkPLs&W9Pdf?E5>7FLKjUk0 z{;Lw<;{y7RxlmVOK&yjRo@m(+wqk07+_oA*b*^AxnmV5x`&sCa>B4N>Vq;!(st(%P0M9;y(n_ z^*ajy%)pHB&i|vg?Eo@aMC^y+zetmuEFcKb-&uoHQ~%HG;=t@XPJ>$i*0tB5j|{LT zsPyT-^wst3XnA0EakW~d{{@p2*SZ*)p!xrq{TP_NwOvvBKV2+LQW`LaqWPQ3|ISWE z56pi2e3kuw%~1#g%#p@^{2Ow>?&hz(PXE~8uls=S6I>&5o5^Y?X)4YCke!XMWhVQ6jPIEObDQQ>Of%ko1#I#rD{~Mg24e`y2u)_Yw zEN2BE>8`Ie$|W%G*(hS0+W=>OR2feBxK

qzc7O7C%&W_O+U}MIl>AB_==dTf+eC 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 z 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 From 9a12a451244cbcabd13d2eb8d96142333768ee24 Mon Sep 17 00:00:00 2001 From: Victor Morales Date: Wed, 7 Feb 2024 01:39:42 -0800 Subject: [PATCH 10/20] Fix typos (#109) Signed-off-by: Victor Morales --- .wordlist.txt | 20 +++++++++++++++++++ .../install-guides/common-components.md | 2 +- .../docs/guides/user-guides/exercise-2-oai.md | 2 +- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/.wordlist.txt b/.wordlist.txt index 5e2f57ea..8dcf8195 100644 --- a/.wordlist.txt +++ b/.wordlist.txt @@ -1,3 +1,4 @@ +aab AAC abcdef acat @@ -9,6 +10,7 @@ ackage acm addons Addr +ade adecc adetalhouet adf @@ -46,11 +48,13 @@ backends bae balancer bazelbuild +bbae bbd bbf bcbd bcdfbf bce +bcfa bd bdb bdd @@ -61,9 +65,11 @@ bedc benchmarking bfb bfd +bfdddbbf bfe bffe BFVa +blockquote bmc bool bootstrappackages @@ -89,6 +95,7 @@ ccd cdd cea cecf +cee cfb cfcfdcf Cfg @@ -194,6 +201,7 @@ ead eadd ealenn eb +ebeeffd eca ecc ecd @@ -243,6 +251,7 @@ fcf fdb fdec fdf +fecd ffa ffc ffcd @@ -397,6 +406,8 @@ lfnetworking LIBDIR Libvirt lifecycle +linkinspector +linkspector linkThroughput linkTitle linuxfoundation @@ -470,6 +481,8 @@ networkconfigs networkFeatureSupport networkinstances networkName +nfdeploy +NFDeploy NFDeploymentStatus nfm nfpb @@ -528,6 +541,7 @@ otel PackageDeployment packageExpr packageNames +packagerev PackageRevision PackageRevisionResources PackageRevisions @@ -538,6 +552,7 @@ packagevariantset PackageVariantSets pageinfo parameterization +parameterRef params passwordless paymentservice @@ -551,11 +566,13 @@ PLiW plmnSupportList pluggable pluralsight +pmnmd PNG pocs podIP podman popd +porchctl postdeploy Postgres pq @@ -586,6 +603,7 @@ ReadWriteOnce REcb recommendationservice reconciler +reconcilerinterface reconcilers reconfigures redfish @@ -695,6 +713,7 @@ UI UID uint UIs +umbrelladocs undeploy Undeploys updateStrategy @@ -749,6 +768,7 @@ wq wr wts wttp +wtzlx wzmz xargs xc diff --git a/content/en/docs/guides/install-guides/common-components.md b/content/en/docs/guides/install-guides/common-components.md index 001aa686..ed4c34bf 100644 --- a/content/en/docs/guides/install-guides/common-components.md +++ b/content/en/docs/guides/install-guides/common-components.md @@ -26,7 +26,7 @@ Fetch the package using `kpt`, and run any `kpt` functions, and then apply the package: ```bash -kpt pkg get --for-deployment https://github.com/nephio-project/catalog/nephio/core/proch@main +kpt pkg get --for-deployment https://github.com/nephio-project/catalog/nephio/core/porch@main kpt fn render porch kpt live init porch kpt live apply porch --reconcile-timeout=15m --output=table diff --git a/content/en/docs/guides/user-guides/exercise-2-oai.md b/content/en/docs/guides/user-guides/exercise-2-oai.md index ea7af99b..92b19ba8 100644 --- a/content/en/docs/guides/user-guides/exercise-2-oai.md +++ b/content/en/docs/guides/user-guides/exercise-2-oai.md @@ -304,7 +304,7 @@ vpc-ran True ```

-After the networks are succesfully configured lets configure metallb ip-address pool for each workload cluster. Some workloads in the workload cluster require metallb to expose their services. +After the networks are successfully configured lets configure metallb ip-address pool for each workload cluster. Some workloads in the workload cluster require metallb to expose their services. ```bash From 7e8aea060252182b4a13cb48478bf6bd8d51ba94 Mon Sep 17 00:00:00 2001 From: Lapenta Francesco Davide <37077655+lapentad@users.noreply.github.com> Date: Mon, 12 Feb 2024 09:17:46 +0000 Subject: [PATCH 11/20] Adding a render hook to Hugo generation (#112) Based on this [comment](https://discourse.gohugo.io/t/replace-image-reference-link/35314/8) This will make MD cross reference links work in both Github and Hugo rendered page. And Images showing in both. Note the link at the bottom Before: 1 After: 2 Note the image: 3 --------- Signed-off-by: lapentafd --- layouts/_default/_markup/render-image.html | 19 +++++++++++++++++++ layouts/_default/_markup/render-link.html | 10 ++++++++++ 2 files changed, 29 insertions(+) create mode 100644 layouts/_default/_markup/render-image.html create mode 100644 layouts/_default/_markup/render-link.html diff --git a/layouts/_default/_markup/render-image.html b/layouts/_default/_markup/render-image.html new file mode 100644 index 00000000..bdf75275 --- /dev/null +++ b/layouts/_default/_markup/render-image.html @@ -0,0 +1,19 @@ +{{- $img := .Page.Resources.GetMatch .Destination -}} +{{- if and (not $img) .Page.File -}} +{{ $path := path.Join .Page.File.Dir .Destination }} +{{- $img = resources.Get $path -}} +{{- end -}} +{{- with $img -}} +{{- $large := $img.Resize "1200x" -}} +{{ $medium := $large.Fill "726x402" -}} +{{ $small := $medium.Fill "458x254" -}} +
+ {{ $.Text }} + +
{{ with $.Title | safeHTML }}{{ . }}{{ end }}
+
+{{- else -}} +{{ $.Text }}{{- end -}} \ No newline at end of file diff --git a/layouts/_default/_markup/render-link.html b/layouts/_default/_markup/render-link.html new file mode 100644 index 00000000..77d8ee19 --- /dev/null +++ b/layouts/_default/_markup/render-link.html @@ -0,0 +1,10 @@ +{{ $link := .Destination }} +{{ $isRemote := strings.HasPrefix $link "http" }} +{{- if not $isRemote -}} +{{ $url := urls.Parse .Destination }} +{{- if $url.Path -}} +{{ $fragment := "" }} +{{- with $url.Fragment }}{{ $fragment = printf "#%s" . }}{{ end -}} +{{- with .Page.GetPage $url.Path }}{{ $link = printf "%s%s" .RelPermalink $fragment }}{{ else }}{{ warnf "%q not found from %q" $url.Path $.Page.Path }}{{ end }}{{ end -}} +{{- end -}} +
{{ .Text | safeHTML }} \ No newline at end of file From 3f24ac22c58cdb1d037ba1c76581b788d4c7d2c7 Mon Sep 17 00:00:00 2001 From: Lapenta Francesco Davide <37077655+lapentad@users.noreply.github.com> Date: Wed, 14 Feb 2024 16:36:48 +0000 Subject: [PATCH 12/20] Update Openstack installation r2 (#111) Renamed the md file. Deleted extra steps and added single command for install. Linked to the manual installation of the kpt packages for the common components. --------- Signed-off-by: lapentafd Co-authored-by: Fiachra Corcoran Co-authored-by: Victor Morales Co-authored-by: Kushal Harish Naidu <159911459+kushnaidu@users.noreply.github.com> --- .../install-guides/install-on-multiple-vm.md | 86 ++++++++++ .../docs/guides/install-guides/openstack.md | 150 ------------------ 2 files changed, 86 insertions(+), 150 deletions(-) create mode 100644 content/en/docs/guides/install-guides/install-on-multiple-vm.md delete mode 100644 content/en/docs/guides/install-guides/openstack.md diff --git a/content/en/docs/guides/install-guides/install-on-multiple-vm.md b/content/en/docs/guides/install-guides/install-on-multiple-vm.md new file mode 100644 index 00000000..cd043fb7 --- /dev/null +++ b/content/en/docs/guides/install-guides/install-on-multiple-vm.md @@ -0,0 +1,86 @@ +--- +title: Nephio manual deployment on multiple VMs +description: > + Nephio manual deployment on different VMs +weight: 7 +--- + +## Prerequisites +* Cluster Management (master) + * 4 vCPU + * 8 GB RAM + * Kubernetes version 1.26+ +* Cluster Edge n + * 2 vCPU 1 NODE + * 4 GB RAM + * Kubernetes version 1.26+ +* KPT beta [releases](https://github.com/kptdev/kpt/releases) + +## Installation of the management cluster +### Automatic installation of the management cluster using the sandbox Ansible script +Override the default Ansible values and run the installation script in +*test-infra\e2e\provision\init.sh* by changing the k8s.context with your + +```kubectl config get-contexts``` + +then run: +```bash +export NEPHIO_USER=$USER +export ANSIBLE_CMD_EXTRA_VAR_LIST="k8s.context=kubernetes-admin@cluster.local kind.enable=false host_min_vcpu=4 host_min_cpu_ram=8" + +curl -fsSL https://raw.githubusercontent.com/nephio-project/test-infra/main/e2e/provision/init.sh | sudo -E bash +``` + +### Manual Installation of the management cluster using kpt + +- [Common Components](/content/en/docs/guides/install-guides/common-components.md) +- [Common Dependencies](/content/en/docs/guides/install-guides/common-dependencies.md) + +## Manual Installation of the Edge cluster using kpt +Install config-sync using: + +```bash +kpt pkg get --for-deployment https://github.com/nephio-project/catalog.git/nephio/core/configsync@main +kpt fn render configsync +kpt live init configsync +kpt live apply configsync --reconcile-timeout=15m --output=table +``` +Get the Roosync kpt package and edit it: +```bash +kpt pkg get https://github.com/nephio-project/catalog.git/nephio/optional/rootsync@main +``` + +Change *./rootsync/rootsync.yaml* and point spec.git.repo to the edge git repository +```yaml + spec: + sourceFormat: unstructured + git: + repo: + branch: main + auth: none +``` +Deploy the modified configsync +```bash +kpt live init rootsync +kpt live apply rootsync --reconcile-timeout=15m --output=table +``` + +## Configure Management Cluster to manage Edge Cluster +Get a [GitHub token](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#fine-grained-personal-access-tokens) if your repository is private, or allow Porch to make modifications. + +Register the edge repository using kpt cli or nephio web-ui. +```bash +GITHUB_USERNAME= +GITHUB_TOKEN= + +kpt alpha repo register \ + --namespace default \ + --repo-basic-username=${GITHUB_USERNAME} \ + --repo-basic-password=${GITHUB_TOKEN} \ + --create-branch=true \ + --deployment=true \ + +``` + +## Deploy packages to the edge clusters +Using the web-ui, add a new deployment to the edge workload cluster. \ No newline at end of file diff --git a/content/en/docs/guides/install-guides/openstack.md b/content/en/docs/guides/install-guides/openstack.md deleted file mode 100644 index 8bcbe183..00000000 --- a/content/en/docs/guides/install-guides/openstack.md +++ /dev/null @@ -1,150 +0,0 @@ ---- -title: OpenStack deployment management -description: > - OpenStack Multi-Cluster Deployment Management with Nephio -weight: 7 ---- - -## Prerequisites - -* Openstack Cluster Management (master) - * 4 VCPU 4 NODES - * 8GB RAM - * Kubernetes version 1.24+ -* Openstack Cluster Edge n - * 2 VCPU 1 NODE - * 4GB RAM - * Kubernetes version 1.24+ -* KPT beta [releases](https://github.com/kptdev/kpt/releases) - -## Automatic Installation of the management cluster -* Change ansible variables to reflect your cluster and run the installation script - - 1. Add the following to *test-infra\e2e\provision\playbooks\roles\bootstrap\tasks\prep-gitea.yml* -```yaml -- name: Create PersistentVolume -kubernetes.core.k8s: -context: "{{ k8s.context }}" -state: present -definition: - apiVersion: v1 - kind: PersistentVolume - metadata: - name: data-gitea-postgresql-0 - spec: - capacity: - storage: 10Gi - volumeMode: Filesystem - accessModes: - - ReadWriteOnce - storageClassName: standard - hostPath: - path: /tmp/ -namespace: "{{ gitea.k8s.namespace }}" - -- name: Create PersistentVolumeClaim -kubernetes.core.k8s: -context: "{{ k8s.context }}" -state: present -definition: - apiVersion: v1 - kind: PersistentVolumeClaim - metadata: - name: data-gitea-postgresql-0 - spec: - storageClassName: standard - accessModes: - - ReadWriteOnce - resources: - requests: - storage: 10Gi -namespace: "{{ gitea.k8s.namespace }}" - -- name: Create PersistentVolume -kubernetes.core.k8s: -context: "{{ k8s.context }}" -state: present -definition: - apiVersion: v1 - kind: PersistentVolume - metadata: - name: data-gitea-0 - spec: - capacity: - storage: 10Gi - volumeMode: Filesystem - accessModes: - - ReadWriteOnce - storageClassName: standard - hostPath: - path: /tmp/ -namespace: "{{ gitea.k8s.namespace }}" - -- name: Create PersistentVolumeClaim -kubernetes.core.k8s: -context: "{{ k8s.context }}" -state: present -definition: - apiVersion: v1 - kind: PersistentVolumeClaim - metadata: - name: data-gitea-0 - spec: - storageClassName: standard - accessModes: - - ReadWriteOnce - resources: - requests: - storage: 10Gi -namespace: "{{ gitea.k8s.namespace }}" -``` - 2. Override the default Ansible values and run the installation script in - *test-infra\e2e\provision\install_sandbox.sh* by -```bash -ANSIBLE_CMD_EXTRA_VAR_LIST="k8s.context='kubernetes-admin@cluster.local' kind.enable=false host_min_vcpu=4 host_min_cpu_ram=8" ./install_sandbox.sh -``` - -## Manual Installation of the management cluster using kpt -TDB (manual install of kpt, porch, configsync, nephio-webui, capi, metallb) - -## Manual Installation of the Edge cluster using kpt - -```bash -kpt pkg get https://github.com/nephio-project/nephio-packages.git/nephio-configsync@v1.0.1 -``` - -Change *nephio-configsync/rootsync.yaml* and point spec.git.repo to the edge git repository -```yaml - spec: - sourceFormat: unstructured - git: - repo: - branch: main - auth: none -``` -Deploy the modified configsync -```bash -kpt live init nephio-configsync -kpt live apply nephio-configsync --reconcile-timeout=5m -``` - -## Configure Management Cluster to manage Edge Cluster -Get a [GitHub token](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#fine-grained-personal-access-tokens) if your repository is private, or allow Porch to make modifications. - -Register the edge repository using kpt cli or nephio web-ui. -```bash -GITHUB_USERNAME= -GITHUB_TOKEN= - -kpt alpha repo register \ - --namespace default \ - --repo-basic-username=${GITHUB_USERNAME} \ - --repo-basic-password=${GITHUB_TOKEN} \ - --create-branch=true \ - --deployment=true \ - -``` - -## Deploy packages to the edge clusters -Using the web-ui add a new deployment with destination the edge cluster. - From 6097320e118c139797625e6afcd7c2f668c5b76b Mon Sep 17 00:00:00 2001 From: Fiachra Corcoran Date: Fri, 16 Feb 2024 09:08:09 +0000 Subject: [PATCH 13/20] Update kpt alpha to use porchctl (#115) Restoring https://github.com/nephio-project/docs/pull/110 --- .../guides/install-guides/install-on-byoc.md | 1 + .../install-guides/install-on-multiple-vm.md | 2 +- .../install-guides/package-transformations.md | 22 +++++++------- .../guides/user-guides/exercise-1-free5gc.md | 30 +++++++++---------- 4 files changed, 28 insertions(+), 27 deletions(-) diff --git a/content/en/docs/guides/install-guides/install-on-byoc.md b/content/en/docs/guides/install-guides/install-on-byoc.md index 4ef4d3f3..f6de3999 100644 --- a/content/en/docs/guides/install-guides/install-on-byoc.md +++ b/content/en/docs/guides/install-guides/install-on-byoc.md @@ -31,6 +31,7 @@ your environment and choices. - `kubectl` [installed ](https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/)on your workstation - `kpt` [installed](https://kpt.dev/installation/kpt-cli) on your workstation (version v1.0.0-beta.43 or later) + - `porchctl` [installed](https://github.com/nephio-project/porch/releases) on your workstation - Sudo-less `docker`, `podman`, or `nerdctl`. If using `podman` or `nerdctl`, you must set the [`KPT_FN_RUNTIME`](https://kpt.dev/reference/cli/fn/render/?id=environment-variables) diff --git a/content/en/docs/guides/install-guides/install-on-multiple-vm.md b/content/en/docs/guides/install-guides/install-on-multiple-vm.md index cd043fb7..6d82c0f1 100644 --- a/content/en/docs/guides/install-guides/install-on-multiple-vm.md +++ b/content/en/docs/guides/install-guides/install-on-multiple-vm.md @@ -73,7 +73,7 @@ Register the edge repository using kpt cli or nephio web-ui. GITHUB_USERNAME= GITHUB_TOKEN= -kpt alpha repo register \ +porchctl repo register \ --namespace default \ --repo-basic-username=${GITHUB_USERNAME} \ --repo-basic-password=${GITHUB_TOKEN} \ diff --git a/content/en/docs/guides/install-guides/package-transformations.md b/content/en/docs/guides/install-guides/package-transformations.md index 806683c2..9ae3d962 100644 --- a/content/en/docs/guides/install-guides/package-transformations.md +++ b/content/en/docs/guides/install-guides/package-transformations.md @@ -11,7 +11,7 @@ weight: 7 - [kpt pkg get](#kpt-pkg-get) - [kpt fn render](#kpt-fn-render) - [kpt live init](#kpt-live-init) -- [kpt alpha rpkg for the Workload clusters](#kpt-alpha-rpkg-for-workload-clusters) +- [porchctl rpkg for the Workload clusters](#porchctl-rpkg-for-workload-clusters) - [Create workload cluster package](#create-workload-cluster-package) - [Configure the package](#configure-the-package) - [Propose the package](#propose-the-package) @@ -189,9 +189,9 @@ metadata: labels: cli-utils.sigs.k8s.io/inventory-id: 0123456789abcdef0123456789abcdef01234567-0123456789abcdef012 ``` -# kpt alpha rpkg for Workload clusters +# porchctl rpkg for Workload clusters -The `kpt alpha rpkg` suite of commands that act on `Repository` resources on the +The `porchctl rpkg` suite of commands that act on `Repository` resources on the kubernetes cluster in scope. The packages in the `Repository` resources are *remote packages (rpkg)*. @@ -208,7 +208,7 @@ nephio-example-packages git Package false True https://github.c To see all the remote packages that are available:
-$ kpt alpha rpkg get +$ porchctl rpkg get ```bash NAME PACKAGE WORKSPACENAME REVISION LATEST LIFECYCLE REPOSITORY @@ -250,7 +250,7 @@ nephio-example-packages-dc0b55fb7a17d107e834417a2c9d8fb37f36d7cb vlanindex To see the versions of a particular package: ```bash -$ kpt alpha rpkg get --name nephio-workload-cluster +$ porchctl rpkg get --name nephio-workload-cluster NAME PACKAGE WORKSPACENAME REVISION LATEST LIFECYCLE REPOSITORY nephio-example-packages-05707c7acfb59988daaefd85e3f5c299504c2da1 nephio-workload-cluster main main false Published nephio-example-packages nephio-example-packages-781e1c17d63eed5634db7b93307e1dad75a92bce nephio-workload-cluster v1 v1 false Published nephio-example-packages @@ -275,7 +275,7 @@ creates the blueprint package for the workload cluster in the management repository. ```bash -kpt alpha rpkg clone -n default nephio-example-packages-7895e28d847c0296a204007ed577cd2a4222d1ea --repository mgmt regional +porchctl rpkg clone -n default nephio-example-packages-7895e28d847c0296a204007ed577cd2a4222d1ea --repository mgmt regional ``` During the clone operation, the command above performs the following operations: @@ -309,7 +309,7 @@ file](https://github.com/nephio-project/test-infra/tree/main/e2e/provision). 1. Get the name of the package: ```bash -kpt alpha rpkg get | egrep '(NAME|regional)' +porchctl rpkg get | egrep '(NAME|regional)' NAME PACKAGE WORKSPACENAME REVISION LATEST LIFECYCLE REPOSITORY mgmt-08c26219f9879acdefed3469f8c3cf89d5db3868 regional v1 false Draft mgmt ``` @@ -317,7 +317,7 @@ mgmt-08c26219f9879acdefed3469f8c3cf89d5db3868 regional v1 f 2. Pull the package to get a local copy of it ```bash -kpt alpha rpkg pull -n default mgmt-08c26219f9879acdefed3469f8c3cf89d5db3868 regional +porchctl rpkg pull -n default mgmt-08c26219f9879acdefed3469f8c3cf89d5db3868 regional ``` 3. Set the Nephio labels on the package @@ -337,7 +337,7 @@ labels: 5. Push the updated package back to the draft branch on the repository: ```bash -kpt alpha rpkg push -n default mgmt-08c26219f9879acdefed3469f8c3cf89d5db3868 regional +porchctl rpkg push -n default mgmt-08c26219f9879acdefed3469f8c3cf89d5db3868 regional [RUNNING] "gcr.io/kpt-fn/apply-replacements:v0.1.1" [PASS] "gcr.io/kpt-fn/apply-replacements:v0.1.1" ``` @@ -347,7 +347,7 @@ kpt alpha rpkg push -n default mgmt-08c26219f9879acdefed3469f8c3cf89d5db3868 reg Propose the package: ```bash -kpt alpha rpkg propose -n default mgmt-08c26219f9879acdefed3469f8c3cf89d5db3868 +porchctl rpkg propose -n default mgmt-08c26219f9879acdefed3469f8c3cf89d5db3868 mgmt-08c26219f9879acdefed3469f8c3cf89d5db3868 proposed ``` @@ -361,7 +361,7 @@ workload cluster using all the `PackageVariant` components specified in the `nephio-workload-cluster` kpt package. ```bash -kpt alpha rpkg approve -n default mgmt-08c26219f9879acdefed3469f8c3cf89d5db3868 +porchctl rpkg approve -n default mgmt-08c26219f9879acdefed3469f8c3cf89d5db3868 mgmt-08c26219f9879acdefed3469f8c3cf89d5db3868 approved ``` diff --git a/content/en/docs/guides/user-guides/exercise-1-free5gc.md b/content/en/docs/guides/user-guides/exercise-1-free5gc.md index 5970cbd0..52eddb4d 100644 --- a/content/en/docs/guides/user-guides/exercise-1-free5gc.md +++ b/content/en/docs/guides/user-guides/exercise-1-free5gc.md @@ -90,13 +90,13 @@ oai-core-packages git Package false True https://github Since those are Ready, you can deploy a package from the [catalog-infra-capi](https://github.com/nephio-project/catalog/tree/main/infra/capi) repository into the mgmt -repository. To do this, you retrieve the Package Revision name using `kpt alpha rpkg get`, clone that specific Package -Revision via the `kpt alpha rpkg clone` command, then propose and approve the resulting package revision. You want to +repository. To do this, you retrieve the Package Revision name using `porchctl rpkg get`, clone that specific Package +Revision via the `porchctl rpkg clone` command, then propose and approve the resulting package revision. You want to use the latest revision of the nephio-workload-cluster package, which you can get with the command below (your latest revision may be different): ```bash -kpt alpha rpkg get --name nephio-workload-cluster +porchctl rpkg get --name nephio-workload-cluster ```
@@ -113,7 +113,7 @@ Then, use the NAME from that in the `clone` operation, and the resulting Package and `approve` operations: ```bash -kpt alpha rpkg clone -n default catalog-infra-capi-b0ae9512aab3de73bbae623a3b554ade57e15596 --repository mgmt regional +porchctl rpkg clone -n default catalog-infra-capi-b0ae9512aab3de73bbae623a3b554ade57e15596 --repository mgmt regional ```
@@ -131,7 +131,7 @@ and the `set-labels` function to do this. To pull the package to a local directory, use the `rpkg pull` command: ```bash -kpt alpha rpkg pull -n default mgmt-08c26219f9879acdefed3469f8c3cf89d5db3868 regional +porchctl rpkg pull -n default mgmt-08c26219f9879acdefed3469f8c3cf89d5db3868 regional ``` The package is now in the `regional` directory. So you can execute the `set-labels` function against the package @@ -160,7 +160,7 @@ In any case, you now can push the package with the labels applied back to the repository: ```bash -kpt alpha rpkg push -n default mgmt-08c26219f9879acdefed3469f8c3cf89d5db3868 regional +porchctl rpkg push -n default mgmt-08c26219f9879acdefed3469f8c3cf89d5db3868 regional ```
@@ -175,7 +175,7 @@ kpt alpha rpkg push -n default mgmt-08c26219f9879acdefed3469f8c3cf89d5db3868 reg Finally, you propose and approve the package. ```bash -kpt alpha rpkg propose -n default mgmt-08c26219f9879acdefed3469f8c3cf89d5db3868 +porchctl rpkg propose -n default mgmt-08c26219f9879acdefed3469f8c3cf89d5db3868 ```
@@ -187,7 +187,7 @@ mgmt-08c26219f9879acdefed3469f8c3cf89d5db3868 proposed
```bash -kpt alpha rpkg approve -n default mgmt-08c26219f9879acdefed3469f8c3cf89d5db3868 +porchctl rpkg approve -n default mgmt-08c26219f9879acdefed3469f8c3cf89d5db3868 ```
@@ -863,7 +863,7 @@ This way you retrieve the downstream target name of the package. You can also re Next create a new package revision from the existing UPF package. ```bash -kpt alpha rpkg copy -n default edge01-6b26ca0f4fdf83212a73faff159bd013b41207ee --workspace upf-scale-package +porchctl rpkg copy -n default edge01-6b26ca0f4fdf83212a73faff159bd013b41207ee --workspace upf-scale-package ```
The output is similar to: @@ -877,7 +877,7 @@ The output contains the package revision of our newly cloned upf package. Pull t choice (in the example you can use /tmp/upf-scale-package). ```bash -kpt alpha rpkg pull -n default edge01-40c616e5d87053350473d3ffa1387a9a534f8f42 /tmp/upf-scale-package +porchctl rpkg pull -n default edge01-40c616e5d87053350473d3ffa1387a9a534f8f42 /tmp/upf-scale-package ``` You can inspect the contents of the package in the chosen directory. The UPF configuration is located in the capacity.yaml file. @@ -953,9 +953,9 @@ Next, progress through the package lifecycle stages by pushing the changes to th the changes and approving them. ```bash -kpt alpha rpkg push -n default edge01-40c616e5d87053350473d3ffa1387a9a534f8f42 /tmp/upf-scale-package -kpt alpha rpkg propose -n default edge01-40c616e5d87053350473d3ffa1387a9a534f8f42 -kpt alpha rpkg approve -n default edge01-40c616e5d87053350473d3ffa1387a9a534f8f42 +porchctl rpkg push -n default edge01-40c616e5d87053350473d3ffa1387a9a534f8f42 /tmp/upf-scale-package +porchctl rpkg propose -n default edge01-40c616e5d87053350473d3ffa1387a9a534f8f42 +porchctl rpkg approve -n default edge01-40c616e5d87053350473d3ffa1387a9a534f8f42 ```
The output is similar to: @@ -988,9 +988,9 @@ edge01-40c616e5d87053350473d3ffa1387a9a534f8f42 approved ```
-You can check the current lifecycle stage of a package using the `kpt alpha rpkg get` command. +You can check the current lifecycle stage of a package using the `porchctl rpkg get` command. ```bash -kpt alpha rpkg get | grep free5gc-upf +porchctl rpkg get | grep free5gc-upf ```
From a025c3189bee9e4b99aa99e99ca3a10d2f7baf66 Mon Sep 17 00:00:00 2001 From: Gergely Csatari Date: Mon, 19 Feb 2024 11:59:11 +0200 Subject: [PATCH 14/20] Adding API Specs (#116) So far it is an iframe reference to doc.crds.dev. In the long run it might be better to use the [swaggerui](https://www.docsy.dev/docs/adding-content/shortcodes/#swaggerui) or the [redoc](https://www.docsy.dev/docs/adding-content/shortcodes/#redoc) options of Docsy. For these two later options we would need to have the Open API specs of the API-s somewhere. I have a feeling that at the moment we have the API-s defined in Go code and not in Open API. Is this correct @johnbelamaric ? Signed-off-by: Gergely Csatari --- content/en/docs/apis.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 content/en/docs/apis.md diff --git a/content/en/docs/apis.md b/content/en/docs/apis.md new file mode 100644 index 00000000..b0292337 --- /dev/null +++ b/content/en/docs/apis.md @@ -0,0 +1,8 @@ +--- +title: "API Specifications" +type: docs +weight: 5 +description: Reference for the Nephio APIs +--- + +{{< iframe src="https://doc.crds.dev/github.com/nephio-project/api@v2.0.0" sub="https://doc.crds.dev/github.com/nephio-project/api@v2.0.0">}} \ No newline at end of file From 89581e1a9335d2b6b758f1a30b4bdacdeb2442bf Mon Sep 17 00:00:00 2001 From: Liam Fallon <35595825+liamfallon@users.noreply.github.com> Date: Mon, 19 Feb 2024 10:08:11 +0000 Subject: [PATCH 15/20] Unit Test Mocking using Mockery (#114) This is a contributor guide describing how to use Mockery. It draws heavily on [PR-441](https://github.com/nephio-project/nephio/pull/441) raised by @vjayaramrh --------- Co-authored-by: Victor Morales --- .../docs/guides/contributor-guides/_index.md | 8 +- .../contributor-guides/minimal-environment.md | 2 +- .../unit-testing-mockery.md | 228 ++++++++++++++++++ 3 files changed, 231 insertions(+), 7 deletions(-) create mode 100644 content/en/docs/guides/contributor-guides/unit-testing-mockery.md diff --git a/content/en/docs/guides/contributor-guides/_index.md b/content/en/docs/guides/contributor-guides/_index.md index 79a31d8f..1766843b 100644 --- a/content/en/docs/guides/contributor-guides/_index.md +++ b/content/en/docs/guides/contributor-guides/_index.md @@ -7,9 +7,5 @@ weight: 3 # Developer guide -This developer guide is for for people who want to write code for the Nephio project. This document is written as an -extension of the [Kubernetes Developer Guides](https://github.com/kubernetes/community/tree/master/contributors/devel#the-process-of-developing-and-contributing-code-to-the-kubernetes-project) -and therefore covers topics that are specific to Nephio development. - -* How to set up a [Minimal Development Environment](/content/en/docs/guides/contributor-guides/minimal-environment.md) defines common terminology - used in the Nephio project. \ No newline at end of file +This developer guide is for people who want to write code for the Nephio project. This document is written as an extension of the [Kubernetes Developer Guides](https://github.com/kubernetes/community/tree/master/contributors/devel#the-process-of-developing-and-contributing-code-to-the-kubernetes-project) +and therefore covers topics specific to Nephio development that are not already covered there. diff --git a/content/en/docs/guides/contributor-guides/minimal-environment.md b/content/en/docs/guides/contributor-guides/minimal-environment.md index f173b5f3..81ef4be5 100644 --- a/content/en/docs/guides/contributor-guides/minimal-environment.md +++ b/content/en/docs/guides/contributor-guides/minimal-environment.md @@ -1,7 +1,7 @@ --- title: Minimal Environment install for development description: > - Minimal Environment install for development + How to set up a minimal environment for development in the Nephio project. weight: 5 --- diff --git a/content/en/docs/guides/contributor-guides/unit-testing-mockery.md b/content/en/docs/guides/contributor-guides/unit-testing-mockery.md new file mode 100644 index 00000000..9ef583e3 --- /dev/null +++ b/content/en/docs/guides/contributor-guides/unit-testing-mockery.md @@ -0,0 +1,228 @@ +--- +title: Unit Test mocking using Mockery +description: > + How to set up and use Mockery for unit testing in Nephio. +weight: 5 +--- +# Introduction + +This guide describes how to use [testify](https://pkg.go.dev/github.com/stretchr/testify) and [mockery](https://vektra.github.io/mockery/latest/) for writing, mocking, and executing unit tests. +This guide will help folks come up to speed on using testify and mockery. + +# How Mockery works + +The [mockery documentation](https://vektra.github.io/mockery/latest/#why-mockery) describes why you would use and how to use Mockery. In a nutshell, Mockery generates mock implementations for interfaces in `go`, which you can then use instead of real implementations when unit testing. + +# Mockery support in Nephio `make` + +The `make` files in Nephio repos containing `go` code have targets to support mockery. + +The [default-mockery.mk](https://github.com/nephio-project/nephio/blob/main/default-mockery.mk) file in the root of Nephio repos is included in Nephio `make` runs. + +There are two targets in default-mockery.mk: + + 1. install-mockery: Installs mockery in docker or locally if docker is not available + 2. generate-mocks: Runs generation of the mocks for go interfaces + +The targets above must be run explicitly. + +Run `make install-mockery` to install mockery in your container runtime (docker, podman etc) or locally if you have no container runtime running. You need only run this target once unless you need to reinstall Mockery for whatever reason. + +Run `make generate-mocks` to generate the mocked implementation of the go interfaces specified in '.mockery.yaml' files. You need to run this target each time an interface that you are mocking changes or whenever you change the contents of a `.mockery.yaml` file. You can run `make generate-mocks` in the repo root to generate or re-generate all interfaces or in subdirectories containing a `Makefile` to generate or regenerate only the interfaces in that subdirectory and its children. + +The generate-mocks target looks for `.mockery.yaml` files in the repo and it runs the mockery mock generator on each `.mockery.yaml` file it finds. This has the nice effect of allowing `.mockery.yaml` files to be in either the root of the repo or in subdirectories, so the choice of placement of `.mockery.yaml` files is left to the developer. + +# The .mockery.yaml file + +The `.mockery.yaml` file specifies which mock implementations Mockery should generate and also controls how that generation is performed. Here we just give an overview of `mockery.yaml`. For full details consult the [configuration](https://github.com/vektra/mockery/blob/master/docs/configuration.md) section of the Mockery documentation. + +## Example 1 +Here, we use the [Nephio Controllers package .mockery.yaml](https://github.com/nephio-project/nephio/blob/main/controllers/pkg/.mockery.yaml) file as an example: + +``` +1. packages: +2. github.com/nephio-project/nephio/controllers/pkg/giteaclient: +``` + +We provide a list of the packages for which we want to generate mocks. In this example, we only have one package. Here we want to generate mocks for the GiteaClient interface so we provide the package path to the interface. + +``` +3. interfaces: +4. GiteaClient: +5. config: +6. dir: "{{.InterfaceDir}}" +``` + +We want mocks to be generated for the `GiteaClient` go interface (line 4). The `{{.InterfaceDir}}` parameter (line 6) asks Mockery to generate the mock file in the same directory as the interface is located. + +## Example 2 + +This example is a slightly more evolved version of the file used in Example 1 above. + +``` +1. with-expecter: true + ``` + +Generate EXPECT() methods for your mocks, see the [configuration](https://github.com/vektra/mockery/blob/master/docs/configuration.md) section of the Mockery documentation. + +``` +2. packages: +3. github.com/nephio-project/nephio/controllers/pkg/giteaclient: +4. interfaces: +5. GiteaClient: +6. config: +7. dir: "{{.InterfaceDir}}" +``` + +Lines 2 to 7 are as explained in Example 1 above. + +``` +8. sigs.k8s.io/controller-runtime/pkg/client: +``` + +Generate mocks for the external package `sigs.k8s.io/controller-runtime/pkg/client`. + +``` + 9. interfaces: +10. Client: +``` + +Generate a mock implementation of the go interface `Client` in the external package `sigs.k8s.io/controller-runtime/pkg/client`. + +``` +11. config: +12. dir: "mocks/external/{{ .InterfaceName | lower }}" +13. outpkg: "mocks" +``` + +Create the mocks for the `Client` interface in the `mocks/external/client` directory and cal the output package `mocks`. + +# The generated mock implementation + +[This mocked implementation of the GiteaClient interface](https://github.com/nephio-project/nephio/blob/main/controllers/pkg/giteaclient/mock_GiteaClient.go) was generated by mockery using the `make generate-mocks` make target. + +We can treat this generated file as a black box and we do not have to know the details of the contents of this file to write unit tests. + +# The Mockery Utils package + +The [mockery utils](https://github.com/nephio-project/nephio/tree/main/testing/mockeryutils) package is a utility package that you can use to initialize your mocks and to define some common fields for your tests. + +[mockeryutils-types.go](https://github.com/nephio-project/nephio/blob/main/testing/mockeryutils/mockeryutils-types.go) contains the `MockHelper` struct, which allows you to control the behaviour of a mock. + +``` +type MockHelper struct { + MethodName string // The mocked method name for which we want to supply configuration + ArgType []string // The arguments we are supplying to the mocked method + RetArgList []interface{} // The arguments we want the mocked method to return to us +} +``` + +The `MockHelper` struct is used to configure a mocked method to expect and return a certain set of arguments. We pass instances of this struct to the mocked interface during tests. + +[mockeryutils.go](https://github.com/nephio-project/nephio/blob/main/testing/mockeryutils/mockeryutils-types.go) contains the `InitMocks` function, which initializes your mocks for you before a test. + +``` +func InitMocks(mocked *mock.Mock, mocks []MockHelper) +``` + +For the given `mocked` interface, the function initializes the `mocks` as specified in the given `MockHelper` array. + +# Using the mock implementation in unit tests + +The unit tests for the [Repository Reconciler](https://github.com/nephio-project/nephio/blob/main/controllers/pkg/reconcilers/repository/reconciler_test.go) use the mocks generated above. + +``` +type fields struct { + APIPatchingApplicator resource.APIPatchingApplicator + giteaClient giteaclient.GiteaClient + finalizer *resource.APIFinalizer + l logr.Logger +} +type args struct { + ctx context.Context + giteaClient giteaclient.GiteaClient + cr *infrav1alpha1.Repository +} +type repoTest struct { + name string + fields fields + args args + mocks []mockeryutils.MockHelper + wantErr bool +} +``` +The code above allows us to specify input data and the expected outcome for tests. Each test is specified as an instance of the `repoTest` struct. For each test, we specify its fields and arguments, and specify the mocking for the test. + +``` +func TestUpsertRepo(t *testing.T) +``` + +This method contains unit tests for the upsertRepo method written using mockery and testify. + +``` +tests := []repoTest{} +``` + +This is the specification of an array of tests that we will run. + +``` +{ + name: "Create repo: cr fields not blank", + fields: fields{resource.NewAPIPatchingApplicator(nil), nil, nil, log.FromContext(context.Background())}, + args: args{ + nil, + nil, + &infrav1alpha1.Repository{ + Spec: infrav1alpha1.RepositorySpec{ + Description: &dummyString, + Private: &dummyBool, + IssueLabels: &dummyString, + Gitignores: &dummyString, + License: &dummyString, + Readme: &dummyString, + DefaultBranch: &dummyString, + TrustModel: &dummyTrustModel, + }, + }, + }, + mocks: []mockeryutils.MockHelper{ + {MethodName: "GetMyUserInfo", ArgType: []string{}, RetArgList: []interface{}{&gitea.User{UserName: "gitea"}, nil, nil}}, + {MethodName: "GetRepo", ArgType: []string{"string", "string"}, RetArgList: []interface{}{&gitea.Repository{}, nil, fmt.Errorf("repo does not exist")}}, + {MethodName: "CreateRepo", ArgType: []string{"gitea.CreateRepoOption"}, RetArgList: []interface{}{&gitea.Repository{}, nil, nil}}, + }, + wantErr: false, +} +``` + +The code above specifies a single test and is an instance of the `tests` array. We specify the fields, arguments, and mocks for the test. In this case, we mock three functions on our GiteaClient interface: `GetMyUserInfo`, `GetRepo`, and `CreateRepo`. We specify the arguments we expect for each function and specify what the function should return if it receives correct arguments. Of course, if the mocked function receives incorrect arguments, it will report an error. The `wantErr` value indicates if we expect the `upsertRepo` function being tested to succeed or fail. + +``` +for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + r := &reconciler{ + APIPatchingApplicator: tt.fields.APIPatchingApplicator, + giteaClient: tt.fields.giteaClient, + finalizer: tt.fields.finalizer, + } + + initMockeryMocks(&tt) + + if err := r.upsertRepo(tt.args.ctx, tt.args.giteaClient, tt.args.cr); (err != nil) != tt.wantErr { + t.Errorf("upsertRepo() error = %v, wantErr %v", err, tt.wantErr) + } + }) +} +``` + +The code above executes the tests. We run a reconciler `r` and initialize our tests using the local `initMockeryTests()` function. We then call the `upsertRepo` function to test it and check the result. + +``` +func initMockeryMocks(tt *repoTest) { + mockGClient := new(giteaclient.MockGiteaClient) + tt.args.giteaClient = mockGClient + tt.fields.giteaClient = mockGClient + mockeryutils.InitMocks(&mockGClient.Mock, tt.mocks) +} +``` + +The `initMockeryMocks` local function calls the `mockeryutils.InitMocks` to initialize the mocks for the tests. From 8a223eb769515441f6d701b08ed091085ec8d665 Mon Sep 17 00:00:00 2001 From: Ashish Jain Date: Thu, 22 Feb 2024 11:15:41 +0530 Subject: [PATCH 16/20] Adding Helm-to-operator-codegen-sdk user-guide --- .../en/docs/guides/user-guides/helm/_index.md | 1 + ...helm-to-operator-codegen-sdk-user-guide.md | 315 ++++++++++++++++++ 2 files changed, 316 insertions(+) create mode 100644 content/en/docs/guides/user-guides/helm/helm-to-operator-codegen-sdk-user-guide.md diff --git a/content/en/docs/guides/user-guides/helm/_index.md b/content/en/docs/guides/user-guides/helm/_index.md index f4f78d1d..07c9ee70 100644 --- a/content/en/docs/guides/user-guides/helm/_index.md +++ b/content/en/docs/guides/user-guides/helm/_index.md @@ -16,6 +16,7 @@ for deploying on Kubernetes, legacy helm support will be required for a number o ### Deployment options +* [Using Helm To Operator Codegen Sdk](/docs/guides/user-guides/helm/helm-to-operator-codegen-sdk-user-guide.md) * [Using Flux CD](/content/en/docs/guides/user-guides/helm/flux-helm.md) * [Operator SDK](https://sdk.operatorframework.io/docs/building-operators/helm/) diff --git a/content/en/docs/guides/user-guides/helm/helm-to-operator-codegen-sdk-user-guide.md b/content/en/docs/guides/user-guides/helm/helm-to-operator-codegen-sdk-user-guide.md new file mode 100644 index 00000000..99311644 --- /dev/null +++ b/content/en/docs/guides/user-guides/helm/helm-to-operator-codegen-sdk-user-guide.md @@ -0,0 +1,315 @@ +--- +title: Helm to Operator Codegen Sdk +description: > + Deploying helm charts in Nephio using Helm To Operator Codegen Sdk +weight: 1 +--- + +The [Helm to Operator Codegen SDK](https://github.com/nephio-project/nephio-sdk/tree/main/helm-to-operator-codegen-sdk) offers a streamlined solution for translating existing Helm charts into Kubernetes operators with minimal effort and cost. + +By utilizing the Helm to Operator Codegen SDK, users can efficiently convert existing Helm charts into Kubernetes operators. This transition enables users to leverage the advanced capabilities provided by Kubernetes operators, such as enhanced automation, lifecycle management, and custom logic handling. Overall, the SDK facilitates a smooth migration process, empowering users to embrace the operator model for managing their Kubernetes resources effectively. + +## Excercise: Deploying Free5gc using operator +In the following exercise, the objective is to convert the Free5gc Helm chart to Go code suitable for a Kubernetes operator using the sdk. Once the conversion is complete, the generated Go code will be used to deploy all the resources defined in the Free5gc Helm chart using a Kubernetes operator. + +### Step 0: Prerequisite +1. GoLang Version: 1.21 +2. Helm : v3.9.3 +3. Kubebuilder +4. A Kubernetes Cluster with Calico CNI and multus-cni plugin (Can Refer [here](https://medium.com/rahasak/deploying-5g-core-network-with-free5gc-kubernets-and-helm-charts-29741cea3922), Before "Deploy Helm-Chart Part" ) +5. Go Packages: +``` +# Clone the Repo +git clone https://github.com/nephio-project/nephio-sdk.git +cd nephio-sdk/helm-to-operator-codegen-sdk/ +go mod tidy +``` + +### Step 1: Convert the helm-chart to Go-Code using Helm-to-operator-codegen-sdk +Currently, only Local-Helm charts are supported by sdk, Therefore, the first step would be to download the free5gc-Helm-Chart. (Refer [here](https://github.com/Orange-OpenSource/towards5gs-helm/tree/main)) + +To initiate the conversion process using the SDK, you can use the following command: +``` +go run main.go +where: + : Path to your local chart, the folder must contain a chart.yaml file. + : The namespace you want to deploy the resources + : debug, info (default), error, warn + +``` + + +#### Example Run +``` +go run main.go /home/ubuntu/free5gccharts/towards5gs-helm/charts/free5gc/ free5gcns info +``` +
+The output is similar to: + +```console +INFO[0000] free5gcns ../../testing_helpers/free5gc_helm_chart/towards5gs-helm/charts/free5gc/ +INFO[0000] ----------------- Converting Helm to Yaml -------------------------- +WARN[0000] Duplication Detected in Struct Mapping | For Preconditions +WARN[0000] Duplication Detected in Struct Mapping | For ConditionStatus +WARN[0000] Duplication Detected in Enum Mapping | For ConditionStatus +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-amf/templates/amf-configmap.yaml +INFO[0000] Current KRM Resource| Kind : ConfigMap| YamlFilePath : temp/templated/free5gc/charts/free5gc-amf/templates/amf-configmap.yaml +INFO[0000] Converting Runtime to Json Completed +INFO[0000] Converting Json to String Completed +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-amf/templates/amf-deployment.yaml +INFO[0000] Current KRM Resource| Kind : Deployment| YamlFilePath : temp/templated/free5gc/charts/free5gc-amf/templates/amf-deployment.yaml +INFO[0000] Converting Runtime to Json Completed +INFO[0000] Converting Json to String Completed +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-amf/templates/amf-hpa.yaml +ERRO[0000] Unable to convert yaml to unstructured |Object 'Kind' is missing in 'null' +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-amf/templates/amf-ingress.yaml +ERRO[0000] Unable to convert yaml to unstructured |Object 'Kind' is missing in 'null' +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-amf/templates/amf-n2-nad.yaml +INFO[0000] Kind | NetworkAttachmentDefinition Would Be Treated as Third Party Kind +INFO[0000] Converting Unstructured to String Completed +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-amf/templates/amf-service.yaml +INFO[0000] Current KRM Resource| Kind : Service| YamlFilePath : temp/templated/free5gc/charts/free5gc-amf/templates/amf-service.yaml +INFO[0000] Converting Runtime to Json Completed +INFO[0000] Converting Json to String Completed +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-ausf/templates/ausf-configmap.yaml +INFO[0000] Current KRM Resource| Kind : ConfigMap| YamlFilePath : temp/templated/free5gc/charts/free5gc-ausf/templates/ausf-configmap.yaml +INFO[0000] Converting Runtime to Json Completed +INFO[0000] Converting Json to String Completed +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-ausf/templates/ausf-deployment.yaml +INFO[0000] Current KRM Resource| Kind : Deployment| YamlFilePath : temp/templated/free5gc/charts/free5gc-ausf/templates/ausf-deployment.yaml +INFO[0000] Converting Runtime to Json Completed +INFO[0000] Converting Json to String Completed +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-ausf/templates/ausf-hpa.yaml +ERRO[0000] Unable to convert yaml to unstructured |Object 'Kind' is missing in 'null' +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-ausf/templates/ausf-ingress.yaml +ERRO[0000] Unable to convert yaml to unstructured |Object 'Kind' is missing in 'null' +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-ausf/templates/ausf-service.yaml +INFO[0000] Current KRM Resource| Kind : Service| YamlFilePath : temp/templated/free5gc/charts/free5gc-ausf/templates/ausf-service.yaml +INFO[0000] Converting Runtime to Json Completed +INFO[0000] Converting Json to String Completed +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-dbpython/templates/dbpython-deployment.yaml +INFO[0000] Current KRM Resource| Kind : Deployment| YamlFilePath : temp/templated/free5gc/charts/free5gc-dbpython/templates/dbpython-deployment.yaml +INFO[0000] Converting Runtime to Json Completed +INFO[0000] Converting Json to String Completed +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-nrf/templates/nrf-configmap.yaml +INFO[0000] Current KRM Resource| Kind : ConfigMap| YamlFilePath : temp/templated/free5gc/charts/free5gc-nrf/templates/nrf-configmap.yaml +INFO[0000] Converting Runtime to Json Completed +INFO[0000] Converting Json to String Completed +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-nrf/templates/nrf-deployment.yaml +INFO[0000] Current KRM Resource| Kind : Deployment| YamlFilePath : temp/templated/free5gc/charts/free5gc-nrf/templates/nrf-deployment.yaml +INFO[0000] Converting Runtime to Json Completed +INFO[0000] Converting Json to String Completed +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-nrf/templates/nrf-hpa.yaml +ERRO[0000] Unable to convert yaml to unstructured |Object 'Kind' is missing in 'null' +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-nrf/templates/nrf-ingress.yaml +ERRO[0000] Unable to convert yaml to unstructured |Object 'Kind' is missing in 'null' +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-nrf/templates/nrf-service.yaml +INFO[0000] Current KRM Resource| Kind : Service| YamlFilePath : temp/templated/free5gc/charts/free5gc-nrf/templates/nrf-service.yaml +INFO[0000] Converting Runtime to Json Completed +INFO[0000] Converting Json to String Completed +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-nssf/templates/nssf-configmap.yaml +INFO[0000] Current KRM Resource| Kind : ConfigMap| YamlFilePath : temp/templated/free5gc/charts/free5gc-nssf/templates/nssf-configmap.yaml +INFO[0000] Converting Runtime to Json Completed +INFO[0000] Converting Json to String Completed +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-nssf/templates/nssf-deployment.yaml +INFO[0000] Current KRM Resource| Kind : Deployment| YamlFilePath : temp/templated/free5gc/charts/free5gc-nssf/templates/nssf-deployment.yaml +INFO[0000] Converting Runtime to Json Completed +INFO[0000] Converting Json to String Completed +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-nssf/templates/nssf-hpa.yaml +ERRO[0000] Unable to convert yaml to unstructured |Object 'Kind' is missing in 'null' +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-nssf/templates/nssf-ingress.yaml +ERRO[0000] Unable to convert yaml to unstructured |Object 'Kind' is missing in 'null' +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-nssf/templates/nssf-service.yaml +INFO[0000] Current KRM Resource| Kind : Service| YamlFilePath : temp/templated/free5gc/charts/free5gc-nssf/templates/nssf-service.yaml +INFO[0000] Converting Runtime to Json Completed +INFO[0000] Converting Json to String Completed +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-pcf/templates/pcf-configmap.yaml +INFO[0000] Current KRM Resource| Kind : ConfigMap| YamlFilePath : temp/templated/free5gc/charts/free5gc-pcf/templates/pcf-configmap.yaml +INFO[0000] Converting Runtime to Json Completed +INFO[0000] Converting Json to String Completed +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-pcf/templates/pcf-deployment.yaml +INFO[0000] Current KRM Resource| Kind : Deployment| YamlFilePath : temp/templated/free5gc/charts/free5gc-pcf/templates/pcf-deployment.yaml +INFO[0000] Converting Runtime to Json Completed +INFO[0000] Converting Json to String Completed +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-pcf/templates/pcf-hpa.yaml +ERRO[0000] Unable to convert yaml to unstructured |Object 'Kind' is missing in 'null' +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-pcf/templates/pcf-ingress.yaml +ERRO[0000] Unable to convert yaml to unstructured |Object 'Kind' is missing in 'null' +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-pcf/templates/pcf-service.yaml +INFO[0000] Current KRM Resource| Kind : Service| YamlFilePath : temp/templated/free5gc/charts/free5gc-pcf/templates/pcf-service.yaml +INFO[0000] Converting Runtime to Json Completed +INFO[0000] Converting Json to String Completed +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-smf/templates/smf-configmap.yaml +INFO[0000] Current KRM Resource| Kind : ConfigMap| YamlFilePath : temp/templated/free5gc/charts/free5gc-smf/templates/smf-configmap.yaml +INFO[0000] Converting Runtime to Json Completed +INFO[0000] Converting Json to String Completed +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-smf/templates/smf-deployment.yaml +INFO[0000] Current KRM Resource| Kind : Deployment| YamlFilePath : temp/templated/free5gc/charts/free5gc-smf/templates/smf-deployment.yaml +INFO[0000] Converting Runtime to Json Completed +INFO[0000] Converting Json to String Completed +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-smf/templates/smf-hpa.yaml +ERRO[0000] Unable to convert yaml to unstructured |Object 'Kind' is missing in 'null' +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-smf/templates/smf-ingress.yaml +ERRO[0000] Unable to convert yaml to unstructured |Object 'Kind' is missing in 'null' +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-smf/templates/smf-n4-nad.yaml +INFO[0000] Kind | NetworkAttachmentDefinition Would Be Treated as Third Party Kind +INFO[0000] Converting Unstructured to String Completed +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-smf/templates/smf-service.yaml +INFO[0000] Current KRM Resource| Kind : Service| YamlFilePath : temp/templated/free5gc/charts/free5gc-smf/templates/smf-service.yaml +INFO[0000] Converting Runtime to Json Completed +INFO[0000] Converting Json to String Completed +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-udm/templates/udm-configmap.yaml +INFO[0000] Current KRM Resource| Kind : ConfigMap| YamlFilePath : temp/templated/free5gc/charts/free5gc-udm/templates/udm-configmap.yaml +INFO[0000] Converting Runtime to Json Completed +INFO[0000] Converting Json to String Completed +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-udm/templates/udm-deployment.yaml +INFO[0000] Current KRM Resource| Kind : Deployment| YamlFilePath : temp/templated/free5gc/charts/free5gc-udm/templates/udm-deployment.yaml +INFO[0000] Converting Runtime to Json Completed +INFO[0000] Converting Json to String Completed +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-udm/templates/udm-hpa.yaml +ERRO[0000] Unable to convert yaml to unstructured |Object 'Kind' is missing in 'null' +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-udm/templates/udm-ingress.yaml +ERRO[0000] Unable to convert yaml to unstructured |Object 'Kind' is missing in 'null' +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-udm/templates/udm-service.yaml +INFO[0000] Current KRM Resource| Kind : Service| YamlFilePath : temp/templated/free5gc/charts/free5gc-udm/templates/udm-service.yaml +INFO[0000] Converting Runtime to Json Completed +INFO[0000] Converting Json to String Completed +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-udr/templates/udr-configmap.yaml +INFO[0000] Current KRM Resource| Kind : ConfigMap| YamlFilePath : temp/templated/free5gc/charts/free5gc-udr/templates/udr-configmap.yaml +INFO[0000] Converting Runtime to Json Completed +INFO[0000] Converting Json to String Completed +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-udr/templates/udr-deployment.yaml +INFO[0000] Current KRM Resource| Kind : Deployment| YamlFilePath : temp/templated/free5gc/charts/free5gc-udr/templates/udr-deployment.yaml +INFO[0000] Converting Runtime to Json Completed +INFO[0000] Converting Json to String Completed +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-udr/templates/udr-hpa.yaml +ERRO[0000] Unable to convert yaml to unstructured |Object 'Kind' is missing in 'null' +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-udr/templates/udr-ingress.yaml +ERRO[0000] Unable to convert yaml to unstructured |Object 'Kind' is missing in 'null' +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-udr/templates/udr-service.yaml +INFO[0000] Current KRM Resource| Kind : Service| YamlFilePath : temp/templated/free5gc/charts/free5gc-udr/templates/udr-service.yaml +INFO[0000] Converting Runtime to Json Completed +INFO[0000] Converting Json to String Completed +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-upf/templates/upf/upf-configmap.yaml +INFO[0000] Current KRM Resource| Kind : ConfigMap| YamlFilePath : temp/templated/free5gc/charts/free5gc-upf/templates/upf/upf-configmap.yaml +INFO[0000] Converting Runtime to Json Completed +INFO[0000] Converting Json to String Completed +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-upf/templates/upf/upf-deployment.yaml +INFO[0000] Current KRM Resource| Kind : Deployment| YamlFilePath : temp/templated/free5gc/charts/free5gc-upf/templates/upf/upf-deployment.yaml +INFO[0000] Converting Runtime to Json Completed +INFO[0000] Converting Json to String Completed +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-upf/templates/upf/upf-hpa.yaml +ERRO[0000] Unable to convert yaml to unstructured |Object 'Kind' is missing in 'null' +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-upf/templates/upf-n3-nad.yaml +INFO[0000] Kind | NetworkAttachmentDefinition Would Be Treated as Third Party Kind +INFO[0000] Converting Unstructured to String Completed +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-upf/templates/upf-n4-nad.yaml +INFO[0000] Kind | NetworkAttachmentDefinition Would Be Treated as Third Party Kind +INFO[0000] Converting Unstructured to String Completed +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-upf/templates/upf-n6-nad.yaml +INFO[0000] Kind | NetworkAttachmentDefinition Would Be Treated as Third Party Kind +INFO[0000] Converting Unstructured to String Completed +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-upf/templates/upf-n9-nad.yaml +ERRO[0000] Unable to convert yaml to unstructured |Object 'Kind' is missing in 'null' +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-upf/templates/upf1/upf1-configmap.yaml +ERRO[0000] Unable to convert yaml to unstructured |Object 'Kind' is missing in 'null' +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-upf/templates/upf1/upf1-deployment.yaml +ERRO[0000] Unable to convert yaml to unstructured |Object 'Kind' is missing in 'null' +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-upf/templates/upf1/upf1-hpa.yaml +ERRO[0000] Unable to convert yaml to unstructured |Object 'Kind' is missing in 'null' +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-upf/templates/upf2/upf2-configmap.yaml +ERRO[0000] Unable to convert yaml to unstructured |Object 'Kind' is missing in 'null' +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-upf/templates/upf2/upf2-deployment.yaml +ERRO[0000] Unable to convert yaml to unstructured |Object 'Kind' is missing in 'null' +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-upf/templates/upf2/upf2-hpa.yaml +ERRO[0000] Unable to convert yaml to unstructured |Object 'Kind' is missing in 'null' +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-upf/templates/upfb/upfb-configmap.yaml +ERRO[0000] Unable to convert yaml to unstructured |Object 'Kind' is missing in 'null' +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-upf/templates/upfb/upfb-deployment.yaml +ERRO[0000] Unable to convert yaml to unstructured |Object 'Kind' is missing in 'null' +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-upf/templates/upfb/upfb-hpa.yaml +ERRO[0000] Unable to convert yaml to unstructured |Object 'Kind' is missing in 'null' +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-webui/templates/webui-configmap.yaml +INFO[0000] Current KRM Resource| Kind : ConfigMap| YamlFilePath : temp/templated/free5gc/charts/free5gc-webui/templates/webui-configmap.yaml +INFO[0000] Converting Runtime to Json Completed +INFO[0000] Converting Json to String Completed +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-webui/templates/webui-deployment.yaml +INFO[0000] Current KRM Resource| Kind : Deployment| YamlFilePath : temp/templated/free5gc/charts/free5gc-webui/templates/webui-deployment.yaml +INFO[0000] Converting Runtime to Json Completed +INFO[0000] Converting Json to String Completed +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-webui/templates/webui-hpa.yaml +ERRO[0000] Unable to convert yaml to unstructured |Object 'Kind' is missing in 'null' +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-webui/templates/webui-ingress.yaml +ERRO[0000] Unable to convert yaml to unstructured |Object 'Kind' is missing in 'null' +INFO[0000] CurFile --> | temp/templated/free5gc/charts/free5gc-webui/templates/webui-service.yaml +INFO[0000] Current KRM Resource| Kind : Service| YamlFilePath : temp/templated/free5gc/charts/free5gc-webui/templates/webui-service.yaml +INFO[0000] Converting Runtime to Json Completed +INFO[0000] Converting Json to String Completed +INFO[0000] CurFile --> | temp/templated/free5gc/charts/mongodb/templates/serviceaccount.yaml +INFO[0000] Current KRM Resource| Kind : ServiceAccount| YamlFilePath : temp/templated/free5gc/charts/mongodb/templates/serviceaccount.yaml +INFO[0000] Converting Runtime to Json Completed +INFO[0000] Converting Json to String Completed +INFO[0000] CurFile --> | temp/templated/free5gc/charts/mongodb/templates/standalone/dep-sts.yaml +INFO[0000] Current KRM Resource| Kind : StatefulSet| YamlFilePath : temp/templated/free5gc/charts/mongodb/templates/standalone/dep-sts.yaml +INFO[0000] Converting Runtime to Json Completed +INFO[0000] Converting Json to String Completed +INFO[0000] CurFile --> | temp/templated/free5gc/charts/mongodb/templates/standalone/svc.yaml +INFO[0000] Current KRM Resource| Kind : Service| YamlFilePath : temp/templated/free5gc/charts/mongodb/templates/standalone/svc.yaml +INFO[0000] Converting Runtime to Json Completed +INFO[0000] Converting Json to String Completed +INFO[0000] ----------------- Writing GO Code --------------------------------- +INFO[0000] ----------------- Program Run Successful| Summary --------------------------------- +INFO[0000] Deployment |11 +INFO[0000] NetworkAttachmentDefinition |5 +INFO[0000] Service |10 +INFO[0000] ServiceAccount |1 +INFO[0000] StatefulSet |1 +INFO[0000] ConfigMap |10 + +``` +
+ +The generated Go-Code would be written to the "outputs/generated_code.go" file + +The Generated Go-Code shall contain the following functions: + +#### A) Pluggable functions +1. CreateAll(): When called, it will create all the k8s resources(services, deployment) on the kubernetes cluster. (Note: For your Reconciler to call the function, Replace `YourKindReconciler` with the type of your Reconciler) +2. DeleteAll(): When called, it will delete all the k8s resources(services, deployment) on the kubernetes cluster. (Note: For your Reconciler to call the function, Replace `YourKindReconciler` with the type of your Reconciler) +3. Getxxx(): Shall return the list of a particular resource. + 1. GetService(): Shall return the list of all services. + 2. GetDeployment(): Shall return the list of all deployments. & so on + +#### B) Helper Functions: (For internal use only) +1. deleteMeAfterDeletingUnusedImportedModules: This function is included in the generated Go code to handle the scenario where a module is imported but not used. Once the user has removed the non-required modules from the import statements, they can safely delete this function as well. +2. Pointer Fxns: `intPtr(), int16Ptr(), int32Ptr(), int64Ptr(), boolPtr(), stringPtr()`: Takes the value and returns the pointer to that value. +3. getDataForSecret: This function takes the encodedVal of Secret, decodes it, and returns. + +### Step 2: Using kubebuilder to develop the operator +Please refer [here](https://book.kubebuilder.io/quick-start) to develop & deploy the operator. + +After the basic structure of the operator is created, users can proceed to add their business logic +The `CreateAll()` and `DeleteAll()` functions generated by the SDK can be leveraged for Day-0 resource deployments, allowing users to easily manage the creation and deletion of resources defined in the Helm chart. By integrating their business logic with these functions, users can ensure that their operator effectively handles resource lifecycle management and orchestration within a Kubernetes environment. + +In the end, all the resources created could be checked by: +`kubectl get pods -n free5gcns` + +
+The output Should be: + +``` +mongodb-0 1/1 Running 0 87m +release-name-free5gc-amf-amf-8649b95f6-hkrqr 1/1 Running 0 87m +release-name-free5gc-ausf-ausf-78864bd7c4-cgc8v 1/1 Running 0 87m +release-name-free5gc-dbpython-dbpython-6f7fbbbd4-qmg4b 1/1 Running 0 87m +release-name-free5gc-nrf-nrf-7f99d8bbcc-kkzzv 1/1 Running 0 87m +release-name-free5gc-nssf-nssf-bdbf85c77-2dkd4 1/1 Running 0 87m +release-name-free5gc-pcf-pcf-c447dcfb6-ftnnv 1/1 Running 0 87m +release-name-free5gc-smf-smf-797db658cf-ndnss 1/1 Running 0 87m +release-name-free5gc-udm-udm-64d6c55855-6sl9n 1/1 Running 0 87m +release-name-free5gc-udr-udr-7566b84c8b-5n7dv 1/1 Running 0 87m +release-name-free5gc-upf-upf-76bd87cc76-bfqsw 1/1 Running 0 87m +release-name-free5gc-webui-webui-7dccf6c877-lj5p5 1/1 Running 0 87m + +``` +
From a725d726004026e2d0e7b2e9d40aacbf9999d921 Mon Sep 17 00:00:00 2001 From: Ashish Jain Date: Thu, 22 Feb 2024 11:59:54 +0530 Subject: [PATCH 17/20] Adding Helm-to-operator-codegen-sdk developer guide --- ...to-operator-codegen-sdk-developer-guide.md | 333 ++++++++++++++++++ ...helm-to-operator-codegen-sdk-user-guide.md | 3 + ...m-to-operator-codegen-sdk-flow-diagram.jpg | Bin 0 -> 121959 bytes 3 files changed, 336 insertions(+) create mode 100644 content/en/docs/guides/user-guides/helm/helm-to-operator-codegen-sdk-developer-guide.md create mode 100644 static/images/user-guides/helm-to-operator-codegen-sdk-flow-diagram.jpg diff --git a/content/en/docs/guides/user-guides/helm/helm-to-operator-codegen-sdk-developer-guide.md b/content/en/docs/guides/user-guides/helm/helm-to-operator-codegen-sdk-developer-guide.md new file mode 100644 index 00000000..2284f014 --- /dev/null +++ b/content/en/docs/guides/user-guides/helm/helm-to-operator-codegen-sdk-developer-guide.md @@ -0,0 +1,333 @@ +--- +title: Helm to Operator Codegen Sdk Developer Guide +weight: 1 +--- + +The [Helm to Operator Codegen SDK](https://github.com/nephio-project/nephio-sdk/tree/main/helm-to-operator-codegen-sdk) offers a streamlined solution for translating existing Helm charts into Kubernetes operators with minimal effort and cost. + +## The Flow Diagram +In a nutshell, Firstly, the Helm-Charts are converted to Yamls using the values provided in "values.yaml". Then, each Kubernetes Resource Manifest (KRM) in the YAML is translated into Go code, employing one of two methods. +1) If the resource is Runtime-Supported, it undergoes a conversion process where the KRM resource is first transformed into a Runtime Object, then into JSON, and finally into Go code. +2) Otherwise, if the resource is not Runtime-Supported, it is converted into an Unstructured Object and then into Go code. + +After the conversion process, all the generated Go code is gathered and compiled into a single Go file. This resulting file contains functions that can be readily utilized by Kubernetes operators. + +![alt Flow Diagram](/static/images/user-guides/helm-to-operator-codegen-sdk-flow-diagram.jpg) + +----- +### Flow-1: Helm to Yaml +Helm to Yaml conversion is achieved by running the command +`helm template --namespace --output-dir “temp/templated/”` Internally. As of now, It retrieves the values from default "values.yaml" + +### Flow-2: Yaml Split +The SDK iterates over each YAML file in the "converted-yamls" directory. If a YAML file contains multiple Kubernetes Resource Manifests (KRM), separated by "---", the SDK splits the YAML file accordingly to isolate each individual KRM resource. This ensures that each KRM resource is processed independently. + +### Runtime-Object and Unstruct-Object +The SDK currently employs the "runtime-object method" to handle Kubernetes resources whose structure is recognized by Kubernetes by default. Examples of such resources include Deployment, Service, and ConfigMap. Conversely, resources that are not inherently known to Kubernetes and require explicit installation or definition, such as Third-Party Custom Resource Definitions (CRDs) like NetworkAttachmentDefinition or PrometheusRule, are processed using the "unstructured-object" method. Such examples are given below: + +
+Example + +``` +// Runtime-Object Example +service1 := &corev1.Service{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "v1", + Kind: "Service", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "my-service", + }, + Spec: corev1.ServiceSpec{ + Selector: map[string]string{ + "app.kubernetes.io/name": "MyApp", + }, + Ports: []corev1.ServicePort{ + corev1.ServicePort{ + Port: 80, + Protocol: corev1.Protocol("TCP"), + TargetPort: intstr.IntOrString{ + IntVal: 9376, + }, + }, + }, + }, + } + +// Unstruct-Object Example +networkAttachmentDefinition1 := &unstructured.Unstructured{ + Object: map[string]interface{}{ + "apiVersion": "k8s.cni.cncf.io/v1", + "kind": "NetworkAttachmentDefinition", + "metadata": map[string]interface{}{ + "name": "macvlan-conf", + }, + "spec": map[string]interface{}{ + "config": "some-config", + }, + }, + } +``` +
+ +### Flow-3.1: KRM to Runtime-Object +The conversion process relies on the "k8s.io/apimachinery/pkg/runtime" package. Currently, only the API version "v1" is supported. The supported kinds for the Runtime Object method include: +`Deployment, Service, Secret, Role, RoleBinding, ClusterRoleBinding, PersistentVolumeClaim, StatefulSet, ServiceAccount, ClusterRole, PriorityClass, ConfigMap` + +### Flow-3.2: Runtime-Object to JSON +Firstly, the SDK performs a typecast of the runtime object to its actual data type. For instance, if the Kubernetes Kind is "Service," the SDK typecasts the runtime object to the specific data type corev1.Service. Then, it conducts a Depth-First Search (DFS) traversal over the corev1.Service object using reflection. During this traversal, the SDK generates a JSON structure that encapsulates information about the struct hierarchy, including corresponding data types and values. This transformation results in a JSON representation of the corev1.Service object's structure and content. +
+DFS Algorithm Cases + +The DFS function iterates over the runtime object, traversing its structure in a Depth-First Search manner. During this traversal, it constructs the JSON structure while inspecting each attribute for its data type and value. Attributes that have default values in the runtime object but are not explicitly set in the YAML file are omitted from the conversion process. This ensures that only explicitly defined attributes with their corresponding values are included in the resulting JSON structure. The function follows this flow to accurately capture the structure, data types, and values of the Kubernetes resource while excluding default attributes that are not explicitly configured in the YAML file. + +``` +A) Base-Cases: +1. Float32, Float64, Int8, Int16, Int32, Int64 + Typecast the Float, Int value to String and returns. (0 is considered as default value) +2. Bool + Returns the bool value as it is. +3. String + Replaces (“ with \”) and (\ with \\) and returns. (“” is considered as default value) + +B) Composite-Cases: +1. Slice/ Array: + Iterates over each element of slice and calls the DFS fxn again with the element. + Returns the list of all backtrack-values. ([] is considered as default value) +2. Map + Iterates over each key-value pairs, calls the DFS(value). + Returns the map containing key-backtrack_values. (Empty Map is considered as default value). +3. Struct + Iterates over each attribute-value and calls the DFS(value). + Returns map[Attribute-Name] = {“type” : “Data-type of Attribute”, “val”: “Backtracked-Value of Attribute”}. + +C) Special-Cases: +We have assumed in the DFS function, that every path (structure) will end at the basic-data-types (string, int, bool etc), But there lies some cases when we can’t traverse further because the attributes of struct are private. Such cases are handled specially. (Converted to String and then return appropriately) +1. V1.Time and resource.Quantity +2. []byte/[]uint8: []byte is generally used in kind: Secret. It is seen that we provide 64base encoded secret-value in yaml, but on converting the yaml to runtime-obj, the secret-val automatically get decoded to actual value, Since, It is not good to show decoded/actual secret value in the code, therefore, we decode it again and store this decoded-value as secret-value in json. + + + + +``` + +
+ +
+JSON Conversion Example + +``` +// For A KRM Resource +apiVersion: v1 +kind: Service +metadata: + name: my-service +spec: + ports: + - protocol: TCP + port: 80 + +// The Converted JSON Representation looks-like the following: +{ + "ObjectMeta": { + "type": "v1.ObjectMeta", + "val": { + "Name": { + "type": "string", + "val": "my-service" + } + } + }, + "Spec": { + "type": "v1.ServiceSpec", + "val": { + "Ports": { + "type": "[]v1.ServicePort", + "val": [ + { + "Port": { + "type": "int32", + "val": "80" + }, + "Protocol": { + "type": "v1.Protocol", + "val": "TCP" + } + } + ] + } + } + } +} +// It shows the hierarchical structure along with the specific data types and corresponding values for each attribute +``` +
+ +### Flow-3.3: JSON to String (Go-Code) +The SDK reads the JSON file containing the information about the Kubernetes resource and then translates this information into a string of Go code. This process involves parsing the JSON structure and generating corresponding Go code strings based on the structure, data types, and values extracted from the JSON representation. Ultimately, this results in a string that represents the Kubernetes resource in a format compatible with Go code. + +
+TraverseJSON Cases (Json-to-String) + + +``` +The traverse JSON function is responsible for converting JSON data into Go code. Here's how it handles base cases: +The JSON structure contains type as well as value information. Based on the type the following case are formulated. +A) Base Cases: +1. Bool: Returns the boolean value as a string. +2. String: if SingleLine, then return the string with enclosed quotes i.e. \”mystring\”, + If MultiLine, then it is handled using Concatenated Line strings. + Line-1 ---> "Line-1\n" + + Line-2 "Line-2\n" + + +B) Composite Cases: +1. Slice/Array: Iterate over each element, run the TraverseJson(element), capture the backtrackVal & format it accordingly using FormatTypeVal(backtrack-Val): + “Formatted-backtrackVal1”, + “Formatted-backtrackVal2”, + +2. Map: Iterate over each key-value pair, run the TraverseJson(value), capture the backtrackVal & format it accordingly using FormatTypeVal(backtrack-Val): + map[string]string{}{ + “key1”: “Formatted-backtrackVal1”, + “key2”: “Formatted-backtrackVal2”, + } + +3. : Any Data-type Other Than Map (Signifies it is a Struct with attributes) + Iterate over each attribute value, run the TraverseJson(attribute-value), capture the backtrackVal & format it accordingly using FormatTypeVal(backtrack-Val) + Attribute-Name1: “Formatted-backtrackVal1”, + Attribute-Name2: “Formatted-backtrackVal2”, + +``` + +
+ + + +
+GoCode Conversion Example + +``` +// For a JSON structure Like the following: +{ + "ObjectMeta": { + "type": "v1.ObjectMeta", + "val": { + "Name": { + "type": "string", + "val": "my-service" + } + } + }, + "Spec": { + "type": "v1.ServiceSpec", + "val": { + "Ports": { + "type": "[]v1.ServicePort", + "val": [ + { + "Port": { + "type": "int32", + "val": "80" + }, + "Protocol": { + "type": "v1.Protocol", + "val": "TCP" + } + } + ] + } + } + } +} + +// The Go-code will look like as + &corev1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: "my-service", + }, + + Spec: corev1.ServiceSpec{ + Ports: []corev1.ServicePort{ + + corev1.ServicePort{ + Port: 80, + Protocol: corev1.Protocol("TCP"), + TargetPort: intstr.IntOrString{ + IntVal: 9376, + }, + }, + }, + }, +} +``` +
+ +### Significance of Config-Jsons: (Struct_Module_mapping.json & Enum_module_mapping.json) +Based on the data type, Values are formatted accordingly, +| Data-Type | Value | Formatted-Value | +| :---: | :---: | :---: | +| int32 | 5 | 5 | +| string | 5 | \"5\" | +| *int32 | 5 | int32Ptr(5) | + +The Config-Jsons are required for more package-specific-types (such as : v1.Service, v1.Deployment) + +#### i) Struct_Module_mapping.json +Mostly, It is seen that inspecting the type of struct(using reflect) would tell us that the struct belong to package “v1”, but there are multiple v1 packages (appsv1, metav1, rbacv1, etc), So, the actual package remains unknown. + +Solution: To solve the above problems, we build a “structModuleMapping” which is a map that takes “struct-name” as the key and gives “package/module name” as a value. +``` +v1.Deployment --> appsv1.Deployment +v1.Service --> corev1.Service +``` + +#### ii) Enum_Module_mapping.json +Structs need to be initialized using curly brackets {}, whereas enums need Parenthesis (), Since, reflect doesn’t tell us which data-type is struct or enum, We: + +Solution: We solve the above problems by building an “enumModuleMapping” which is a set that stores all data types that are enums. i.e. If a data type belongs to the set, then It is an Enum. + +There is an automation-script that takes the types.go files of packages and build the config-json. For details, Please refer [here](https://github.com/nephio-project/nephio-sdk/tree/main/helm-to-operator-codegen-sdk/config) + + +### Flow-4: KRM to Unstruct-Obj to String(Go-code) +All Kubernetes resource kinds that are not supported by the runtime-object method are handled using the unstructured method. In this approach, the Kubernetes Resource Manifest (KRM) is converted to an unstructured object using the package "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured". +Then, We traverse the unstructured-Obj in a DFS fashion and build the gocode-string. +
+DFS Algorithm Cases (Unstruct-Version) + + +``` +A) Base Cases: +1. Bool: Convert the Bool value to string and return. +2. Int & Float: Convert the value to string and return. +3. String: if SingleLine, then return the string with enclosed quotes i.e. \”mystring\”, + If MultiLine, then it handled using Concatenated Line strings, (as done previously in Flow 3.3). + +B) Composite Cases: +1. Slice/Array: Iterate over each element, runs the DFS(element), captures the backtrackVal & return as: + []interface{}{ + “backtrackVal1”, + “backtrackVal2”, + } +2. Map: Iterate over each key-value pair, runs the DFS(value), capture the backtrackVal & returns as: + map[string]interface{}{ + “key1”: “backtrackVal1”, + “key2”: “backtrackVal2”, + } + +``` + +
+ +### Flow-5: Go-Codes to Gofile +The process of generating the final Go file consists of the following steps: + +1. Collecting Go Code: Go code for each Kubernetes Resource Manifest (KRM) is collected and stored in a map where the key represents the kind of resource (e.g., "Service", "Deployment"), and the value is a slice containing the corresponding Go code strings. + +2. Aggregation and Writing to Runnable Go Function: Iterate over the map and for each kind of resource, assign the collected Go code to a variable and write it into its corresponding runnable Go function. All services are written in one function, and the same applies to other kinds of resources. + +3. Adding Helper Functions and Import Statements: Include import statements at the beginning of the file. Additionally, add helper functions such as "deleteMeAfterDeletingUnusedImportedModules" to handle unused import errors, as well as functions like "int32Ptr", "int64Ptr", etc., which return pointers to values of specific types. Also, include functions like "getDataForSecret()" for decoding base64-encoded bytes and master functions like "CreateAll()" and "DeleteAll()" for creating and deleting all KRM resources, respectively. + +4. Pluggable Functions: Generate pluggable functions such as "Getxxx()", where "xxx" represents the specific kind of resource. These functions are designed to create KRM resources belonging to a particular kind and are intended to be called by a Reconciler. Examples include "GetDeployment()", "GetService()", etc. + +By following these steps, the final Go file is created, containing all necessary import statements, helper functions, runnable functions for each kind of resource, and pluggable functions for creating specific types of resources. This comprehensive file is ready for use by a Reconciler in managing Kubernetes resources within an operator. \ No newline at end of file diff --git a/content/en/docs/guides/user-guides/helm/helm-to-operator-codegen-sdk-user-guide.md b/content/en/docs/guides/user-guides/helm/helm-to-operator-codegen-sdk-user-guide.md index 99311644..1a1820ce 100644 --- a/content/en/docs/guides/user-guides/helm/helm-to-operator-codegen-sdk-user-guide.md +++ b/content/en/docs/guides/user-guides/helm/helm-to-operator-codegen-sdk-user-guide.md @@ -313,3 +313,6 @@ release-name-free5gc-webui-webui-7dccf6c877-lj5p5 1/1 Running ```
+ +---- +For advanced requirements, Please refer to the developer guide [here](/docs/guides/user-guides/helm/helm-to-operator-codegen-sdk-developer-guide.md) \ No newline at end of file diff --git a/static/images/user-guides/helm-to-operator-codegen-sdk-flow-diagram.jpg b/static/images/user-guides/helm-to-operator-codegen-sdk-flow-diagram.jpg new file mode 100644 index 0000000000000000000000000000000000000000..64be899943655ece902f9039a53b4b3b8c32f38e GIT binary patch literal 121959 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 Date: Fri, 23 Feb 2024 15:06:33 +0530 Subject: [PATCH 18/20] static-links are replaced with relative-links --- .../en/docs/guides/user-guides/helm/_index.md | 2 +- ...-to-operator-codegen-sdk-developer-guide.md | 18 +++++++++--------- .../helm-to-operator-codegen-sdk-user-guide.md | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/content/en/docs/guides/user-guides/helm/_index.md b/content/en/docs/guides/user-guides/helm/_index.md index 07c9ee70..3ed52890 100644 --- a/content/en/docs/guides/user-guides/helm/_index.md +++ b/content/en/docs/guides/user-guides/helm/_index.md @@ -16,7 +16,7 @@ for deploying on Kubernetes, legacy helm support will be required for a number o ### Deployment options -* [Using Helm To Operator Codegen Sdk](/docs/guides/user-guides/helm/helm-to-operator-codegen-sdk-user-guide.md) +* [Using Helm To Operator Codegen Sdk](helm-to-operator-codegen-sdk-user-guide.md) * [Using Flux CD](/content/en/docs/guides/user-guides/helm/flux-helm.md) * [Operator SDK](https://sdk.operatorframework.io/docs/building-operators/helm/) diff --git a/content/en/docs/guides/user-guides/helm/helm-to-operator-codegen-sdk-developer-guide.md b/content/en/docs/guides/user-guides/helm/helm-to-operator-codegen-sdk-developer-guide.md index 2284f014..32898e67 100644 --- a/content/en/docs/guides/user-guides/helm/helm-to-operator-codegen-sdk-developer-guide.md +++ b/content/en/docs/guides/user-guides/helm/helm-to-operator-codegen-sdk-developer-guide.md @@ -6,21 +6,21 @@ weight: 1 The [Helm to Operator Codegen SDK](https://github.com/nephio-project/nephio-sdk/tree/main/helm-to-operator-codegen-sdk) offers a streamlined solution for translating existing Helm charts into Kubernetes operators with minimal effort and cost. ## The Flow Diagram -In a nutshell, Firstly, the Helm-Charts are converted to Yamls using the values provided in "values.yaml". Then, each Kubernetes Resource Manifest (KRM) in the YAML is translated into Go code, employing one of two methods. +In a nutshell, the Helm-Charts are converted to YAML files using the values provided in "values.yaml". Then, each Kubernetes Resource Model (KRM) in the YAML is translated into Go code, employing one of two methods. 1) If the resource is Runtime-Supported, it undergoes a conversion process where the KRM resource is first transformed into a Runtime Object, then into JSON, and finally into Go code. 2) Otherwise, if the resource is not Runtime-Supported, it is converted into an Unstructured Object and then into Go code. -After the conversion process, all the generated Go code is gathered and compiled into a single Go file. This resulting file contains functions that can be readily utilized by Kubernetes operators. +After the conversion process, all the generated Go code is gathered and compiled into a single Go file. This process results in a file that contains functions which can be readily utilized by Kubernetes operators. ![alt Flow Diagram](/static/images/user-guides/helm-to-operator-codegen-sdk-flow-diagram.jpg) ----- -### Flow-1: Helm to Yaml -Helm to Yaml conversion is achieved by running the command -`helm template --namespace --output-dir “temp/templated/”` Internally. As of now, It retrieves the values from default "values.yaml" +### Flow-1: Helm to YAML +Helm to YAML conversion is achieved by running the following command +`helm template --namespace --output-dir “temp/templated/”` Internally. As of now, it retrieves the values from default "values.yaml" -### Flow-2: Yaml Split -The SDK iterates over each YAML file in the "converted-yamls" directory. If a YAML file contains multiple Kubernetes Resource Manifests (KRM), separated by "---", the SDK splits the YAML file accordingly to isolate each individual KRM resource. This ensures that each KRM resource is processed independently. +### Flow-2: YAML Split +The SDK iterates over each YAML file in the "converted-yamls" directory. If a YAML file contains multiple Kubernetes Resource Models (KRM), separated by "---", the SDK splits the YAML file accordingly to isolate each individual KRM resource. This ensures that each KRM resource is processed independently. ### Runtime-Object and Unstruct-Object The SDK currently employs the "runtime-object method" to handle Kubernetes resources whose structure is recognized by Kubernetes by default. Examples of such resources include Deployment, Service, and ConfigMap. Conversely, resources that are not inherently known to Kubernetes and require explicit installation or definition, such as Third-Party Custom Resource Definitions (CRDs) like NetworkAttachmentDefinition or PrometheusRule, are processed using the "unstructured-object" method. Such examples are given below: @@ -290,7 +290,7 @@ There is an automation-script that takes the types.go files of packages and buil ### Flow-4: KRM to Unstruct-Obj to String(Go-code) -All Kubernetes resource kinds that are not supported by the runtime-object method are handled using the unstructured method. In this approach, the Kubernetes Resource Manifest (KRM) is converted to an unstructured object using the package "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured". +All Kubernetes resource kinds that are not supported by the runtime-object method are handled using the unstructured method. In this approach, the Kubernetes Resource MOdel (KRM) is converted to an unstructured object using the package "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured". Then, We traverse the unstructured-Obj in a DFS fashion and build the gocode-string.

DFS Algorithm Cases (Unstruct-Version) @@ -322,7 +322,7 @@ B) Composite Cases: ### Flow-5: Go-Codes to Gofile The process of generating the final Go file consists of the following steps: -1. Collecting Go Code: Go code for each Kubernetes Resource Manifest (KRM) is collected and stored in a map where the key represents the kind of resource (e.g., "Service", "Deployment"), and the value is a slice containing the corresponding Go code strings. +1. Collecting Go Code: Go code for each Kubernetes Resource Model (KRM) is collected and stored in a map where the key represents the kind of resource (e.g., "Service", "Deployment"), and the value is a slice containing the corresponding Go code strings. 2. Aggregation and Writing to Runnable Go Function: Iterate over the map and for each kind of resource, assign the collected Go code to a variable and write it into its corresponding runnable Go function. All services are written in one function, and the same applies to other kinds of resources. diff --git a/content/en/docs/guides/user-guides/helm/helm-to-operator-codegen-sdk-user-guide.md b/content/en/docs/guides/user-guides/helm/helm-to-operator-codegen-sdk-user-guide.md index 1a1820ce..dae21f64 100644 --- a/content/en/docs/guides/user-guides/helm/helm-to-operator-codegen-sdk-user-guide.md +++ b/content/en/docs/guides/user-guides/helm/helm-to-operator-codegen-sdk-user-guide.md @@ -315,4 +315,4 @@ release-name-free5gc-webui-webui-7dccf6c877-lj5p5 1/1 Running
---- -For advanced requirements, Please refer to the developer guide [here](/docs/guides/user-guides/helm/helm-to-operator-codegen-sdk-developer-guide.md) \ No newline at end of file +For advanced requirements, Please refer to the developer guide [here](helm-to-operator-codegen-sdk-developer-guide.md) \ No newline at end of file From 99eaf506f4c452610050a21ea4a415a9259ac3ea Mon Sep 17 00:00:00 2001 From: Ashish Jain Date: Mon, 26 Feb 2024 16:40:17 +0530 Subject: [PATCH 19/20] Moving helm-to-operator-codegen-sdk-developer-guide to contributor-guide --- ...to-operator-codegen-sdk-developer-guide.md | 71 +++++++++---------- .../en/docs/guides/user-guides/helm/_index.md | 2 +- ...helm-to-operator-codegen-sdk-user-guide.md | 6 +- 3 files changed, 37 insertions(+), 42 deletions(-) rename content/en/docs/guides/{user-guides/helm => contributor-guides}/helm-to-operator-codegen-sdk-developer-guide.md (94%) diff --git a/content/en/docs/guides/user-guides/helm/helm-to-operator-codegen-sdk-developer-guide.md b/content/en/docs/guides/contributor-guides/helm-to-operator-codegen-sdk-developer-guide.md similarity index 94% rename from content/en/docs/guides/user-guides/helm/helm-to-operator-codegen-sdk-developer-guide.md rename to content/en/docs/guides/contributor-guides/helm-to-operator-codegen-sdk-developer-guide.md index 32898e67..c658525f 100644 --- a/content/en/docs/guides/user-guides/helm/helm-to-operator-codegen-sdk-developer-guide.md +++ b/content/en/docs/guides/contributor-guides/helm-to-operator-codegen-sdk-developer-guide.md @@ -76,43 +76,39 @@ The conversion process relies on the "k8s.io/apimachinery/pkg/runtime" package. ### Flow-3.2: Runtime-Object to JSON Firstly, the SDK performs a typecast of the runtime object to its actual data type. For instance, if the Kubernetes Kind is "Service," the SDK typecasts the runtime object to the specific data type corev1.Service. Then, it conducts a Depth-First Search (DFS) traversal over the corev1.Service object using reflection. During this traversal, the SDK generates a JSON structure that encapsulates information about the struct hierarchy, including corresponding data types and values. This transformation results in a JSON representation of the corev1.Service object's structure and content. -
-DFS Algorithm Cases + +#### DFS Algorithm Cases The DFS function iterates over the runtime object, traversing its structure in a Depth-First Search manner. During this traversal, it constructs the JSON structure while inspecting each attribute for its data type and value. Attributes that have default values in the runtime object but are not explicitly set in the YAML file are omitted from the conversion process. This ensures that only explicitly defined attributes with their corresponding values are included in the resulting JSON structure. The function follows this flow to accurately capture the structure, data types, and values of the Kubernetes resource while excluding default attributes that are not explicitly configured in the YAML file. -``` -A) Base-Cases: -1. Float32, Float64, Int8, Int16, Int32, Int64 + +A) Base-Cases: +1. Float32, Float64, Int8, Int16, Int32, Int64: Typecast the Float, Int value to String and returns. (0 is considered as default value) -2. Bool +2. Bool: Returns the bool value as it is. -3. String +3. String: Replaces (“ with \”) and (\ with \\) and returns. (“” is considered as default value) B) Composite-Cases: -1. Slice/ Array: +1. Slice/ Array: Iterates over each element of slice and calls the DFS fxn again with the element. Returns the list of all backtrack-values. ([] is considered as default value) -2. Map +2. Map: Iterates over each key-value pairs, calls the DFS(value). - Returns the map containing key-backtrack_values. (Empty Map is considered as default value). -3. Struct + Returns the map containing key : backtrack_values. (Empty Map is considered as default value). +3. Struct: Iterates over each attribute-value and calls the DFS(value). + ``` Returns map[Attribute-Name] = {“type” : “Data-type of Attribute”, “val”: “Backtracked-Value of Attribute”}. + ``` C) Special-Cases: We have assumed in the DFS function, that every path (structure) will end at the basic-data-types (string, int, bool etc), But there lies some cases when we can’t traverse further because the attributes of struct are private. Such cases are handled specially. (Converted to String and then return appropriately) 1. V1.Time and resource.Quantity -2. []byte/[]uint8: []byte is generally used in kind: Secret. It is seen that we provide 64base encoded secret-value in yaml, but on converting the yaml to runtime-obj, the secret-val automatically get decoded to actual value, Since, It is not good to show decoded/actual secret value in the code, therefore, we decode it again and store this decoded-value as secret-value in json. +2. []byte/[]uint8: []byte is generally used in kind: Secret. It is seen that we provide 64base encoded secret-value in yaml, but on converting the yaml to runtime-obj, the secret-val automatically get decoded to actual value, Since, It is not good to show decoded/actual secret value in the code, therefore, we encode it again and store this base64-encoded-value as secret-value in json. - - -``` - -
-
JSON Conversion Example @@ -166,40 +162,39 @@ spec: ### Flow-3.3: JSON to String (Go-Code) The SDK reads the JSON file containing the information about the Kubernetes resource and then translates this information into a string of Go code. This process involves parsing the JSON structure and generating corresponding Go code strings based on the structure, data types, and values extracted from the JSON representation. Ultimately, this results in a string that represents the Kubernetes resource in a format compatible with Go code. -
-TraverseJSON Cases (Json-to-String) - - -``` +#### TraverseJSON Cases (Json-to-String) The traverse JSON function is responsible for converting JSON data into Go code. Here's how it handles base cases: The JSON structure contains type as well as value information. Based on the type the following case are formulated. A) Base Cases: 1. Bool: Returns the boolean value as a string. 2. String: if SingleLine, then return the string with enclosed quotes i.e. \”mystring\”, - If MultiLine, then it is handled using Concatenated Line strings. + If Multi-line, then it is handled using Concatenated Line strings. + ``` Line-1 ---> "Line-1\n" + Line-2 "Line-2\n" - + ``` B) Composite Cases: 1. Slice/Array: Iterate over each element, run the TraverseJson(element), capture the backtrackVal & format it accordingly using FormatTypeVal(backtrack-Val): + ``` “Formatted-backtrackVal1”, “Formatted-backtrackVal2”, + ``` 2. Map: Iterate over each key-value pair, run the TraverseJson(value), capture the backtrackVal & format it accordingly using FormatTypeVal(backtrack-Val): + ``` map[string]string{}{ “key1”: “Formatted-backtrackVal1”, “key2”: “Formatted-backtrackVal2”, } + ``` -3. : Any Data-type Other Than Map (Signifies it is a Struct with attributes) +3. Any Data-type Other Than Map (Signifies it is a Struct with attributes): Iterate over each attribute value, run the TraverseJson(attribute-value), capture the backtrackVal & format it accordingly using FormatTypeVal(backtrack-Val) + ``` Attribute-Name1: “Formatted-backtrackVal1”, Attribute-Name2: “Formatted-backtrackVal2”, - -``` - -
+ ``` @@ -272,7 +267,7 @@ Based on the data type, Values are formatted accordingly, The Config-Jsons are required for more package-specific-types (such as : v1.Service, v1.Deployment) -#### i) Struct_Module_mapping.json +#### Struct_Module_mapping.json Mostly, It is seen that inspecting the type of struct(using reflect) would tell us that the struct belong to package “v1”, but there are multiple v1 packages (appsv1, metav1, rbacv1, etc), So, the actual package remains unknown. Solution: To solve the above problems, we build a “structModuleMapping” which is a map that takes “struct-name” as the key and gives “package/module name” as a value. @@ -281,7 +276,7 @@ v1.Deployment --> appsv1.Deployment v1.Service --> corev1.Service ``` -#### ii) Enum_Module_mapping.json +#### Enum_Module_mapping.json Structs need to be initialized using curly brackets {}, whereas enums need Parenthesis (), Since, reflect doesn’t tell us which data-type is struct or enum, We: Solution: We solve the above problems by building an “enumModuleMapping” which is a set that stores all data types that are enums. i.e. If a data type belongs to the set, then It is an Enum. @@ -292,11 +287,10 @@ There is an automation-script that takes the types.go files of packages and buil ### Flow-4: KRM to Unstruct-Obj to String(Go-code) All Kubernetes resource kinds that are not supported by the runtime-object method are handled using the unstructured method. In this approach, the Kubernetes Resource MOdel (KRM) is converted to an unstructured object using the package "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured". Then, We traverse the unstructured-Obj in a DFS fashion and build the gocode-string. -
-DFS Algorithm Cases (Unstruct-Version) -``` +#### DFS Algorithm Cases (Unstruct-Version) + A) Base Cases: 1. Bool: Convert the Bool value to string and return. 2. Int & Float: Convert the value to string and return. @@ -305,19 +299,20 @@ A) Base Cases: B) Composite Cases: 1. Slice/Array: Iterate over each element, runs the DFS(element), captures the backtrackVal & return as: + ``` []interface{}{ “backtrackVal1”, “backtrackVal2”, } + ``` 2. Map: Iterate over each key-value pair, runs the DFS(value), capture the backtrackVal & returns as: + ``` map[string]interface{}{ “key1”: “backtrackVal1”, “key2”: “backtrackVal2”, } + ``` -``` - -
### Flow-5: Go-Codes to Gofile The process of generating the final Go file consists of the following steps: diff --git a/content/en/docs/guides/user-guides/helm/_index.md b/content/en/docs/guides/user-guides/helm/_index.md index 3ed52890..b3c87f3f 100644 --- a/content/en/docs/guides/user-guides/helm/_index.md +++ b/content/en/docs/guides/user-guides/helm/_index.md @@ -16,7 +16,7 @@ for deploying on Kubernetes, legacy helm support will be required for a number o ### Deployment options -* [Using Helm To Operator Codegen Sdk](helm-to-operator-codegen-sdk-user-guide.md) +* [Using Helm To Operator Codegen Sdk](/content/en/docs/guides/user-guides/helm/helm-to-operator-codegen-sdk-user-guide.md) * [Using Flux CD](/content/en/docs/guides/user-guides/helm/flux-helm.md) * [Operator SDK](https://sdk.operatorframework.io/docs/building-operators/helm/) diff --git a/content/en/docs/guides/user-guides/helm/helm-to-operator-codegen-sdk-user-guide.md b/content/en/docs/guides/user-guides/helm/helm-to-operator-codegen-sdk-user-guide.md index dae21f64..88fab277 100644 --- a/content/en/docs/guides/user-guides/helm/helm-to-operator-codegen-sdk-user-guide.md +++ b/content/en/docs/guides/user-guides/helm/helm-to-operator-codegen-sdk-user-guide.md @@ -46,7 +46,7 @@ go run main.go /home/ubuntu/free5gccharts/towards5gs-helm/charts/free5gc/ free5g
The output is similar to: -```console +```bash INFO[0000] free5gcns ../../testing_helpers/free5gc_helm_chart/towards5gs-helm/charts/free5gc/ INFO[0000] ----------------- Converting Helm to Yaml -------------------------- WARN[0000] Duplication Detected in Struct Mapping | For Preconditions @@ -297,7 +297,7 @@ In the end, all the resources created could be checked by:
The output Should be: -``` +```bash mongodb-0 1/1 Running 0 87m release-name-free5gc-amf-amf-8649b95f6-hkrqr 1/1 Running 0 87m release-name-free5gc-ausf-ausf-78864bd7c4-cgc8v 1/1 Running 0 87m @@ -315,4 +315,4 @@ release-name-free5gc-webui-webui-7dccf6c877-lj5p5 1/1 Running
---- -For advanced requirements, Please refer to the developer guide [here](helm-to-operator-codegen-sdk-developer-guide.md) \ No newline at end of file +For advanced requirements, Please refer to the developer guide [here](/docs/guides/contributor-guides/helm-to-operator-codegen-sdk-developer-guide.md) \ No newline at end of file From 8426793ea37b1a380bb25d319512e274e2466bf8 Mon Sep 17 00:00:00 2001 From: Gergely Csatari Date: Tue, 27 Feb 2024 10:21:49 +0200 Subject: [PATCH 20/20] test Signed-off-by: Gergely Csatari --- .../user-guides/helm/helm-to-operator-codegen-sdk-user-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/guides/user-guides/helm/helm-to-operator-codegen-sdk-user-guide.md b/content/en/docs/guides/user-guides/helm/helm-to-operator-codegen-sdk-user-guide.md index 88fab277..c35ecfae 100644 --- a/content/en/docs/guides/user-guides/helm/helm-to-operator-codegen-sdk-user-guide.md +++ b/content/en/docs/guides/user-guides/helm/helm-to-operator-codegen-sdk-user-guide.md @@ -315,4 +315,4 @@ release-name-free5gc-webui-webui-7dccf6c877-lj5p5 1/1 Running
---- -For advanced requirements, Please refer to the developer guide [here](/docs/guides/contributor-guides/helm-to-operator-codegen-sdk-developer-guide.md) \ No newline at end of file +For advanced requirements, Please refer to the developer guide [here](/content/en/docs/guides/contributor-guides/helm-to-operator-codegen-sdk-developer-guide.md) \ No newline at end of file