From 0ad29c4f34cf1b8f51d991cd1d0e673bb9823855 Mon Sep 17 00:00:00 2001 From: Camila Macedo Date: Fri, 14 May 2021 12:42:46 +0100 Subject: [PATCH] rfe: sort results by package name --- README.md | 2 + pkg/reports/bundles/data.go | 5 + pkg/reports/channels/data.go | 5 + pkg/reports/packages/data.go | 5 + ...tified_operator_index_v4.8_2021-05-14.json | 104 +++++++++--------- ...tified_operator_index_v4.8_2021-05-14.xlsx | Bin 11273 -> 11276 bytes ...tified_operator_index_v4.8_2021-05-14.json | 14 +-- ...tified_operator_index_v4.8_2021-05-14.xlsx | Bin 7736 -> 7745 bytes ...tified_operator_index_v4.8_2021-05-14.json | 104 +++++++++--------- ...tified_operator_index_v4.8_2021-05-14.xlsx | Bin 9336 -> 9355 bytes 10 files changed, 130 insertions(+), 109 deletions(-) diff --git a/README.md b/README.md index c3cd8464..c1443d75 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,8 @@ --- # Audit +**IMPORTANT** This project still at the POC level since its first release did not get done so far. Before running the reports, ensure that you have its latest version by running `git pull` and `git status`. + ## Overview The audit is an analytic tool which uses the Operator Framework solutions. Its purpose is to obtain and report and aggregate data provided by checks and analyses done in the operator bundles, packages and channels from an index catalog image. diff --git a/pkg/reports/bundles/data.go b/pkg/reports/bundles/data.go index 87ff0e79..f1a83c69 100644 --- a/pkg/reports/bundles/data.go +++ b/pkg/reports/bundles/data.go @@ -16,6 +16,7 @@ package bundles import ( "fmt" + "sort" log "github.com/sirupsen/logrus" @@ -109,6 +110,10 @@ func (d *Data) PrepareReport() Report { allColumns = append(allColumns, col) } + sort.Slice(allColumns[:], func(i, j int) bool { + return allColumns[i].PackageName < allColumns[j].PackageName + }) + finalReport := Report{} finalReport.Flags = d.Flags finalReport.Columns = allColumns diff --git a/pkg/reports/channels/data.go b/pkg/reports/channels/data.go index c76367fc..b59d3514 100644 --- a/pkg/reports/channels/data.go +++ b/pkg/reports/channels/data.go @@ -17,6 +17,7 @@ package channels import ( "fmt" "log" + "sort" "strings" sq "github.com/Masterminds/squirrel" @@ -86,6 +87,10 @@ func (d *Data) PrepareReport() Report { allColumns = append(allColumns, col) } + sort.Slice(allColumns[:], func(i, j int) bool { + return allColumns[i].PackageName < allColumns[j].PackageName + }) + finalReport := Report{} finalReport.Flags = d.Flags finalReport.Columns = allColumns diff --git a/pkg/reports/packages/data.go b/pkg/reports/packages/data.go index 87482fa5..2df30deb 100644 --- a/pkg/reports/packages/data.go +++ b/pkg/reports/packages/data.go @@ -17,6 +17,7 @@ package packages import ( "fmt" "log" + "sort" sq "github.com/Masterminds/squirrel" "github.com/operator-framework/api/pkg/operators/v1alpha1" @@ -170,6 +171,10 @@ func (d *Data) PrepareReport() Report { allColumns = append(allColumns, col) } + sort.Slice(allColumns[:], func(i, j int) bool { + return allColumns[i].PackageName < allColumns[j].PackageName + }) + finalReport := Report{} finalReport.Flags = d.Flags finalReport.Columns = allColumns diff --git a/testdata/samples/bundles/json/bundles_registry.redhat.io_redhat_certified_operator_index_v4.8_2021-05-14.json b/testdata/samples/bundles/json/bundles_registry.redhat.io_redhat_certified_operator_index_v4.8_2021-05-14.json index 7df11fec..46e42df0 100644 --- a/testdata/samples/bundles/json/bundles_registry.redhat.io_redhat_certified_operator_index_v4.8_2021-05-14.json +++ b/testdata/samples/bundles/json/bundles_registry.redhat.io_redhat_certified_operator_index_v4.8_2021-05-14.json @@ -10,7 +10,9 @@ "hasV1beta1CRDs": "YES", "buildAt": "2020-09-09T15:40:17.804777864Z", "company": "Alcide", - "bundleChannel": "alpha", + "bundleChannel": [ + "alpha" + ], "defaultChannel": "alpha", "maturity": "alpha", "emailMaintainers": [ @@ -29,61 +31,61 @@ "apiextensions.k8s.io/v1beta1, kind=CustomResourceDefinitions was deprecated in Kubernetes v1.16 and will be removed in v1.22 in favor of v1: [\"kaudits.kaudit.alcide.com\"] should be migrated" ], "scorecardErrors": [ - "gke does not have a spec descriptor", - "ingress does not have a spec descriptor", - "prometheus does not have a spec descriptor", "clusterName does not have a spec descriptor", + "image does not have a spec descriptor", + "ingress does not have a spec descriptor", "kauditPolicyFile does not have a spec descriptor", + "namespace does not have a spec descriptor", "tls does not have a spec descriptor", - "vault does not have a spec descriptor", "aks does not have a spec descriptor", - "image does not have a spec descriptor", - "namespace does not have a spec descriptor", - "storage does not have a spec descriptor", - "runOptions does not have a spec descriptor", - "alcide does not have a spec descriptor", + "prometheus does not have a spec descriptor", + "resources does not have a spec descriptor", "aws does not have a spec descriptor", - "k8s does not have a spec descriptor", "k8sAuditEnvironment does not have a spec descriptor", - "resources does not have a spec descriptor", + "vault does not have a spec descriptor", + "alcide does not have a spec descriptor", + "gke does not have a spec descriptor", + "k8s does not have a spec descriptor", + "runOptions does not have a spec descriptor", + "storage does not have a spec descriptor", "kaudits.kaudit.alcide.com does not have a status descriptor", "Owned CRDs do not have resources specified" ], "scorecardSuggestions": [ - "Add a spec descriptor for gke", - "Add a spec descriptor for ingress", - "Add a spec descriptor for prometheus", "Add a spec descriptor for clusterName", + "Add a spec descriptor for image", + "Add a spec descriptor for ingress", "Add a spec descriptor for kauditPolicyFile", + "Add a spec descriptor for namespace", "Add a spec descriptor for tls", - "Add a spec descriptor for vault", "Add a spec descriptor for aks", - "Add a spec descriptor for image", - "Add a spec descriptor for namespace", - "Add a spec descriptor for storage", - "Add a spec descriptor for runOptions", - "Add a spec descriptor for alcide", + "Add a spec descriptor for prometheus", + "Add a spec descriptor for resources", "Add a spec descriptor for aws", - "Add a spec descriptor for k8s", "Add a spec descriptor for k8sAuditEnvironment", - "Add a spec descriptor for resources", + "Add a spec descriptor for vault", + "Add a spec descriptor for alcide", + "Add a spec descriptor for gke", + "Add a spec descriptor for k8s", + "Add a spec descriptor for runOptions", + "Add a spec descriptor for storage", + "Add CRD validation for spec field `clusterName` in Kaudit/v1alpha1", + "Add CRD validation for spec field `ingress` in Kaudit/v1alpha1", "Add CRD validation for spec field `prometheus` in Kaudit/v1alpha1", + "Add CRD validation for spec field `resources` in Kaudit/v1alpha1", "Add CRD validation for spec field `runOptions` in Kaudit/v1alpha1", - "Add CRD validation for spec field `alcide` in Kaudit/v1alpha1", - "Add CRD validation for spec field `aws` in Kaudit/v1alpha1", - "Add CRD validation for spec field `image` in Kaudit/v1alpha1", + "Add CRD validation for spec field `aks` in Kaudit/v1alpha1", "Add CRD validation for spec field `k8s` in Kaudit/v1alpha1", "Add CRD validation for spec field `namespace` in Kaudit/v1alpha1", - "Add CRD validation for spec field `aks` in Kaudit/v1alpha1", - "Add CRD validation for spec field `clusterName` in Kaudit/v1alpha1", - "Add CRD validation for spec field `resources` in Kaudit/v1alpha1", - "Add CRD validation for spec field `tls` in Kaudit/v1alpha1", "Add CRD validation for spec field `vault` in Kaudit/v1alpha1", - "Add CRD validation for spec field `gke` in Kaudit/v1alpha1", - "Add CRD validation for spec field `ingress` in Kaudit/v1alpha1", - "Add CRD validation for spec field `k8sAuditEnvironment` in Kaudit/v1alpha1", "Add CRD validation for spec field `kauditPolicyFile` in Kaudit/v1alpha1", - "Add CRD validation for spec field `storage` in Kaudit/v1alpha1" + "Add CRD validation for spec field `storage` in Kaudit/v1alpha1", + "Add CRD validation for spec field `tls` in Kaudit/v1alpha1", + "Add CRD validation for spec field `alcide` in Kaudit/v1alpha1", + "Add CRD validation for spec field `aws` in Kaudit/v1alpha1", + "Add CRD validation for spec field `gke` in Kaudit/v1alpha1", + "Add CRD validation for spec field `image` in Kaudit/v1alpha1", + "Add CRD validation for spec field `k8sAuditEnvironment` in Kaudit/v1alpha1" ], "scorecardFailingTests": [ "olm-spec-descriptors", @@ -108,7 +110,9 @@ "buildAt": "2020-09-24T13:57:07.140350464Z", "company": "Anaconda, Inc.", "repository": "github.com/anaconda", - "bundleChannel": "beta", + "bundleChannel": [ + "beta" + ], "defaultChannel": "beta", "maturity": "beta", "emailMaintainers": [ @@ -133,6 +137,8 @@ "apiextensions.k8s.io/v1beta1, kind=CustomResourceDefinitions was deprecated in Kubernetes v1.16 and will be removed in v1.22 in favor of v1: [\"anacondateameditions.anaconda.com\"] should be migrated" ], "scorecardErrors": [ + "Owned CRDs do not have resources specified", + "anacondateameditions.anaconda.com does not have a status descriptor", "proxy does not have a spec descriptor", "redis does not have a spec descriptor", "storage does not have a spec descriptor", @@ -140,19 +146,10 @@ "api does not have a spec descriptor", "dispatcher does not have a spec descriptor", "route does not have a spec descriptor", - "postgres does not have a spec descriptor", - "Owned CRDs do not have resources specified", - "anacondateameditions.anaconda.com does not have a status descriptor" + "postgres does not have a spec descriptor" ], "scorecardSuggestions": [ - "Add a spec descriptor for proxy", - "Add a spec descriptor for redis", - "Add a spec descriptor for storage", - "Add a spec descriptor for worker", - "Add a spec descriptor for api", - "Add a spec descriptor for dispatcher", - "Add a spec descriptor for route", - "Add a spec descriptor for postgres", + "Add CRD validation for spec field `worker` in AnacondaTeamEdition/v1beta1", "Add CRD validation for spec field `api` in AnacondaTeamEdition/v1beta1", "Add CRD validation for spec field `dispatcher` in AnacondaTeamEdition/v1beta1", "Add CRD validation for spec field `route` in AnacondaTeamEdition/v1beta1", @@ -160,12 +157,19 @@ "Add CRD validation for spec field `proxy` in AnacondaTeamEdition/v1beta1", "Add CRD validation for spec field `redis` in AnacondaTeamEdition/v1beta1", "Add CRD validation for spec field `storage` in AnacondaTeamEdition/v1beta1", - "Add CRD validation for spec field `worker` in AnacondaTeamEdition/v1beta1" + "Add a spec descriptor for proxy", + "Add a spec descriptor for redis", + "Add a spec descriptor for storage", + "Add a spec descriptor for worker", + "Add a spec descriptor for api", + "Add a spec descriptor for dispatcher", + "Add a spec descriptor for route", + "Add a spec descriptor for postgres" ], "scorecardFailingTests": [ - "olm-spec-descriptors", "olm-crds-have-resources", - "olm-status-descriptors" + "olm-status-descriptors", + "olm-spec-descriptors" ], "invalidVersioning": "NO", "invalidSkipRange": "NOT USED", @@ -188,7 +192,7 @@ "outputFormat": "json" }, "IndexImageInspect": { - "Id": "sha256:414ec051c4eec31a9f8e0e51eb4e0aa92653ca6b1d1c3da6cef92cb4bd21d0ed", + "ID": "sha256:414ec051c4eec31a9f8e0e51eb4e0aa92653ca6b1d1c3da6cef92cb4bd21d0ed", "Created": "2021-04-27T21:39:54.614373596Z", "Config": { "Labels": { diff --git a/testdata/samples/bundles/xls/bundles_registry.redhat.io_redhat_certified_operator_index_v4.8_2021-05-14.xlsx b/testdata/samples/bundles/xls/bundles_registry.redhat.io_redhat_certified_operator_index_v4.8_2021-05-14.xlsx index c285db7ec6c245f94dce5ae38a9ca78ab9a0b903..a69e2f8eba453664ceb45cbd1745d2c53ce448ce 100644 GIT binary patch delta 4699 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 O-yp{Xf!4VGVgCVkz`BtD delta 4688 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 Ij$WJo1qtV$i~s-t diff --git a/testdata/samples/packages/json/package_registry.redhat.io_redhat_certified_operator_index_v4.8_2021-05-14.json b/testdata/samples/packages/json/package_registry.redhat.io_redhat_certified_operator_index_v4.8_2021-05-14.json index a9e0887a..dd03840b 100644 --- a/testdata/samples/packages/json/package_registry.redhat.io_redhat_certified_operator_index_v4.8_2021-05-14.json +++ b/testdata/samples/packages/json/package_registry.redhat.io_redhat_certified_operator_index_v4.8_2021-05-14.json @@ -11,65 +11,65 @@ "apiextensions.k8s.io/v1beta1, kind=CustomResourceDefinitions was deprecated in Kubernetes v1.16 and will be removed in v1.22 in favor of v1: [\"kaudits.kaudit.alcide.com\"] should be migrated" ], "scorecardErrors": [ - "Owned CRDs do not have resources specified", - "aks does not have a spec descriptor", - "aws does not have a spec descriptor", - "image does not have a spec descriptor", - "resources does not have a spec descriptor", - "vault does not have a spec descriptor", "clusterName does not have a spec descriptor", - "k8s does not have a spec descriptor", - "k8sAuditEnvironment does not have a spec descriptor", + "kauditPolicyFile does not have a spec descriptor", "namespace does not have a spec descriptor", "alcide does not have a spec descriptor", - "gke does not have a spec descriptor", - "prometheus does not have a spec descriptor", + "k8sAuditEnvironment does not have a spec descriptor", "runOptions does not have a spec descriptor", + "image does not have a spec descriptor", + "k8s does not have a spec descriptor", + "prometheus does not have a spec descriptor", + "aks does not have a spec descriptor", + "aws does not have a spec descriptor", + "gke does not have a spec descriptor", + "tls does not have a spec descriptor", + "vault does not have a spec descriptor", "ingress does not have a spec descriptor", - "kauditPolicyFile does not have a spec descriptor", + "resources does not have a spec descriptor", "storage does not have a spec descriptor", - "tls does not have a spec descriptor", + "Owned CRDs do not have resources specified", "kaudits.kaudit.alcide.com does not have a status descriptor" ], "scorecardSuggestions": [ + "Add a spec descriptor for clusterName", + "Add a spec descriptor for kauditPolicyFile", + "Add a spec descriptor for namespace", + "Add a spec descriptor for alcide", + "Add a spec descriptor for k8sAuditEnvironment", + "Add a spec descriptor for runOptions", + "Add a spec descriptor for image", + "Add a spec descriptor for k8s", + "Add a spec descriptor for prometheus", + "Add a spec descriptor for aks", + "Add a spec descriptor for aws", + "Add a spec descriptor for gke", + "Add a spec descriptor for tls", + "Add a spec descriptor for vault", + "Add a spec descriptor for ingress", + "Add a spec descriptor for resources", + "Add a spec descriptor for storage", "Add CRD validation for spec field `alcide` in Kaudit/v1alpha1", - "Add CRD validation for spec field `ingress` in Kaudit/v1alpha1", - "Add CRD validation for spec field `k8s` in Kaudit/v1alpha1", - "Add CRD validation for spec field `prometheus` in Kaudit/v1alpha1", - "Add CRD validation for spec field `runOptions` in Kaudit/v1alpha1", - "Add CRD validation for spec field `clusterName` in Kaudit/v1alpha1", + "Add CRD validation for spec field `aws` in Kaudit/v1alpha1", "Add CRD validation for spec field `gke` in Kaudit/v1alpha1", - "Add CRD validation for spec field `kauditPolicyFile` in Kaudit/v1alpha1", "Add CRD validation for spec field `namespace` in Kaudit/v1alpha1", + "Add CRD validation for spec field `prometheus` in Kaudit/v1alpha1", "Add CRD validation for spec field `resources` in Kaudit/v1alpha1", - "Add CRD validation for spec field `tls` in Kaudit/v1alpha1", - "Add CRD validation for spec field `aks` in Kaudit/v1alpha1", - "Add CRD validation for spec field `aws` in Kaudit/v1alpha1", + "Add CRD validation for spec field `runOptions` in Kaudit/v1alpha1", + "Add CRD validation for spec field `clusterName` in Kaudit/v1alpha1", "Add CRD validation for spec field `image` in Kaudit/v1alpha1", + "Add CRD validation for spec field `k8s` in Kaudit/v1alpha1", "Add CRD validation for spec field `k8sAuditEnvironment` in Kaudit/v1alpha1", "Add CRD validation for spec field `storage` in Kaudit/v1alpha1", - "Add CRD validation for spec field `vault` in Kaudit/v1alpha1", - "Add a spec descriptor for aks", - "Add a spec descriptor for aws", - "Add a spec descriptor for image", - "Add a spec descriptor for resources", - "Add a spec descriptor for vault", - "Add a spec descriptor for clusterName", - "Add a spec descriptor for k8s", - "Add a spec descriptor for k8sAuditEnvironment", - "Add a spec descriptor for namespace", - "Add a spec descriptor for alcide", - "Add a spec descriptor for gke", - "Add a spec descriptor for prometheus", - "Add a spec descriptor for runOptions", - "Add a spec descriptor for ingress", - "Add a spec descriptor for kauditPolicyFile", - "Add a spec descriptor for storage", - "Add a spec descriptor for tls" + "Add CRD validation for spec field `ingress` in Kaudit/v1alpha1", + "Add CRD validation for spec field `kauditPolicyFile` in Kaudit/v1alpha1", + "Add CRD validation for spec field `aks` in Kaudit/v1alpha1", + "Add CRD validation for spec field `tls` in Kaudit/v1alpha1", + "Add CRD validation for spec field `vault` in Kaudit/v1alpha1" ], "scorecardFailingTests": [ - "olm-crds-have-resources", "olm-spec-descriptors", + "olm-crds-have-resources", "olm-status-descriptors" ], "hasSupportForAllNamespaces": true, @@ -99,8 +99,7 @@ "apiextensions.k8s.io/v1beta1, kind=CustomResourceDefinitions was deprecated in Kubernetes v1.16 and will be removed in v1.22 in favor of v1: [\"anacondateameditions.anaconda.com\"] should be migrated" ], "scorecardErrors": [ - "anacondateameditions.anaconda.com does not have a status descriptor", - "Owned CRDs do not have resources specified", + "storage does not have a spec descriptor", "worker does not have a spec descriptor", "api does not have a spec descriptor", "dispatcher does not have a spec descriptor", @@ -108,9 +107,11 @@ "postgres does not have a spec descriptor", "proxy does not have a spec descriptor", "redis does not have a spec descriptor", - "storage does not have a spec descriptor" + "anacondateameditions.anaconda.com does not have a status descriptor", + "Owned CRDs do not have resources specified" ], "scorecardSuggestions": [ + "Add a spec descriptor for storage", "Add a spec descriptor for worker", "Add a spec descriptor for api", "Add a spec descriptor for dispatcher", @@ -118,20 +119,19 @@ "Add a spec descriptor for postgres", "Add a spec descriptor for proxy", "Add a spec descriptor for redis", - "Add a spec descriptor for storage", - "Add CRD validation for spec field `postgres` in AnacondaTeamEdition/v1beta1", - "Add CRD validation for spec field `proxy` in AnacondaTeamEdition/v1beta1", - "Add CRD validation for spec field `redis` in AnacondaTeamEdition/v1beta1", - "Add CRD validation for spec field `storage` in AnacondaTeamEdition/v1beta1", "Add CRD validation for spec field `worker` in AnacondaTeamEdition/v1beta1", "Add CRD validation for spec field `api` in AnacondaTeamEdition/v1beta1", "Add CRD validation for spec field `dispatcher` in AnacondaTeamEdition/v1beta1", - "Add CRD validation for spec field `route` in AnacondaTeamEdition/v1beta1" + "Add CRD validation for spec field `route` in AnacondaTeamEdition/v1beta1", + "Add CRD validation for spec field `postgres` in AnacondaTeamEdition/v1beta1", + "Add CRD validation for spec field `proxy` in AnacondaTeamEdition/v1beta1", + "Add CRD validation for spec field `redis` in AnacondaTeamEdition/v1beta1", + "Add CRD validation for spec field `storage` in AnacondaTeamEdition/v1beta1" ], "scorecardFailingTests": [ + "olm-spec-descriptors", "olm-status-descriptors", - "olm-crds-have-resources", - "olm-spec-descriptors" + "olm-crds-have-resources" ], "hasSupportForAllNamespaces": true, "hasSupportForSingleNamespaces": true, @@ -157,7 +157,7 @@ "disableValidators": false }, "IndexImageInspect": { - "Id": "sha256:414ec051c4eec31a9f8e0e51eb4e0aa92653ca6b1d1c3da6cef92cb4bd21d0ed", + "ID": "sha256:414ec051c4eec31a9f8e0e51eb4e0aa92653ca6b1d1c3da6cef92cb4bd21d0ed", "Created": "2021-04-27T21:39:54.614373596Z", "Config": { "Labels": { diff --git a/testdata/samples/packages/xls/packages_registry.redhat.io_redhat_certified_operator_index_v4.8_2021-05-14.xlsx b/testdata/samples/packages/xls/packages_registry.redhat.io_redhat_certified_operator_index_v4.8_2021-05-14.xlsx index f45cf74021d80e6f6f784dde8182fd5c0f5968d5..8b2a8e96f4c2fdd049ed322e2fe33390679b4ba4 100644 GIT binary patch delta 2049 zcmYjRdpy&7AOCI3|Eyx0rt_CI#Jw6~)_a28u)E!vju+v~ z3(>*cFQeH$wb>{OOWD!1K z{;>fftF8+1uIiRc$fC%G(u$jmAnouL?_0ChF;Xm=I=|`m_!>a3f)kw(dD~u==yxe2ka+e|s?dy<@GAB$(7mcC09Hyt z(@+BY_S^)fZM0|gFPTP>?0?y!BrYOOq@0=W`!d`xh9RWN5`9xJhAVWT*3DI>aIfSP zU```t!VA0Lh2*ZaZ0(hdic;&g=m(y=qizNnx`CWcnH@UmvQ*s_mR31QyQvHnc47F( z?q%)E5y~Tv-;gEundXM&qZELRJq1>qi){SCsk#iT$%8<;Y8 zN%;_jJ0oE&!Btaw1L5XFoOf^;a^{d66q4qUIb;A&o&TX|^@qKqd@xEQ#YGx%W%~B7 zH!z5hJv$fu4vl}9c&nc=J}dR8;~sT5lO1c(+sW6@EyTt|)0uj6xG_h<<*SQG^Ekq^>y*{bS3+G+sQ!m{VAEWu^ z2|Yt02VxqlKUYXUv#qa~sd3m_Wl5W_D<^?l6xGW)NCrA84wEr9#C zem>&Nt(!5JUGWEHyFR|@&Hl1{tA*%g-u}pLB`>b}ZgSMS(Vaas04?V5`LcR&AW+k~RBYs4zO){83$EG&gNncd$(9EJbJc?c+D@ z@I^yP6y&jx+E-|ynQ>6+)Fot7S6wRJtbyZYrz66t<2k1)ee9ZNiO;ywah7;zZ|jcf zl(@)8Ya=b|Kv&)2_`L*dq+7w29;ZxVBbq(suEq&5q^-0*G+!#lvmRq*>Kqqz3M+NB z6%y|Xe(5;xV%M#*+mGXXxl#j-v-?IT#Kzot^$;*QnvG>7YWOBtba)jh z8jf%Me#eh@obmeYqC+O(*gUDkUbVknYB|?5S1#4&-Qp5UhH?yz5Di4b(xV!Ua!YFQ z5iJ7?d+*?5K`=$1F;b3WR$q(I9Z!^1(B!!L06)>?!J_`nEAxT;9MQ}U#fqAO<>{tAdtEJ@U=j%g_ zD;|R;Z-}csAKX3dp~dv;)jT7@>v+K)K6E5JunEKQ|{P))%*QJgQoUBzWY(*mu5yc z&IMc!xP16JcQs2yD^`0Of?u&Xkc~q@ zw*Zib)0Ft%@)^M?LYb1F69NUo@o=ynkAnLA0=DDP;GS($h772O!-HBHDCqc3&>n*Z z9q`)F1bHwPPXO6i6!gzsAP=hss&Bh3BR~s07DR4KUm`&x>``crGUx+Cg6UW|=)4^a zqXLHEbX0#18vww!SK&|cR0S8+amWAv?TDY+Z8VAofS6GIi1U7wzyQ}sO7O*?2)&rF XP^S|T+y4Xr`R!A%or59u|J?o!n!LI& delta 2022 zcmYjRc{J3E7oQnsEJK!f7{VB05Z)6eyTOyPJxdt|WjXZlh89eX_bqFWjQB>8ib|3# z#x(SXiYzn3&}18XD9iK<4`qv|&iVcN-FwbGcl+FP|M=XS>AZgQx+)l_A`A5VK5Zo3 zzPKfak9Tt0$B()$m!J9)FJ)C<#!C)%4ZgCY*p0)HH}B)z&RmKtDGTiC>cJ!$ub>;1 zlER%j=RCbB))hyRhcpFKcFP^<(ex<^mO~^Zqj+8HI%(CA|4>?8whq01HG|J}L!J$TC4ZJx`V%&S}FEU%4 zir>2#W8)mzWnIL2qsu-N6GKOZ$69wgk^%A7bB%OSo)6==?n~Od5zjt#dAI0CX=12bLqXB;E?Uy=r68<)k zl@gb2enYh2iT=%s6lK1Pl?J+*#e?%HcC2&GHu7%gl_lxK59NyG=l#Xc z*f`efG<4@37EnTTGHFb?x?!m|!3DiEgRt0MW@zl#s|n)AYb!4L0O2bB;fYW&`b9mR z^3Ut{`y$)Q2zZM;53hIDfL@m1M0jCnFpH6Tr((=urh@Jo5kCZY12vnvs8|l6vY$Ga z5{KRJbLCalKH09W@ehvmJ7g~K4Bqb-{WY`G$;ToBaWUgKCo!$jy1J9LgJ$ex82GkTB^5os!9weW@TQ;~N= zsZF9SdI}e#fT_BW&PN6-rew+IVrV9`_Z$;mb#b~;DDQyiqFt$o8e|n=A=JzHf>~Of zRIw%5BGmyK0>s9U!yV^;W zvIsiO-S0xl@CgiALL@U3nXRbj9g{+c@LRJO#H=Dfgv@F0w_Q|N-y5eL+oxNQQ!%5~ z_U09Z=-~ScM!!HNzpIsdGX18DQ6_d^!vsMxO2~X=QCV_H!unK98reEHhWZMAd3>V7 zE9Jd$%Rfpug>rml!sgFB%1w^^8*OsFhgJ82zxpZtXWOOH#?@8m@?o~_a36WgYqTcg z_7{~;w9~P@qpAECkpGgm3$Pu`gh3$g$nWHpkspB43ilm`(h|h5P;l!23J4%gn@Up_ zYt&b7!1_hBj@7|O>=s7ph+z&ot|lVWx{^hANYU`g{YPuJ`RSSH`jr7MOXD!KpiaV;E}gv338I_M+?`t<m_;>HS?v;ki;AKLqN4H3Q0#Z&aYwb1@w z)!d0QZ#OPD2LSG8*T$Bdq}p>WN;^d&-duROEYD4b&qntol9qQr2vCf~fCnqQIcGLz z?19L!f$T2~ul4Xzvv$iy=cU0wG9RlMpKr#SRu?=`9?|AoB~`~hnNzjsgP8yYc#G+x zQ9aEA!|1?5Ob&N#`mf#hVKFO*1{t1%;uA(Yg0y!$;N$}Eu~gPxT&3}d@7r9owZmQ2 zHC#zhW5XY|k=`V+g!RgrYk)7H`QoK&zbIcKFz5Ci^c@qGJDBDi>d@)(Yc~?Nu8k*q zdJcxBbF**R#bS*pNpGKR)|nbq>?AOnEH{^8$iLL$a*YboSrn(03@!OX4+t&nx+3|g zdK^_B&jxUHj~j${HZMIS2$}iW&dCf*r&>DB(C4uuZz|awT`Y#3tM5K!_BLd8dtu^# z%$8`fyHLBwY&Qh$9kK+b3x&x+w$yg8fu_G9R-s`f+A=Qa2}0<$w+{34Gh?{2Z@#h&6QQaHH}; o|6g#*V34LFh|8XOd$OAul9ET&mb?n>ILLmsGQ~g`?FV