From 89023114b37ff0473f31b6ca46498f47787ceced Mon Sep 17 00:00:00 2001 From: googs1025 Date: Sat, 15 Mar 2025 10:06:37 +0800 Subject: [PATCH 1/8] fix miss metrics endpoint bind Signed-off-by: googs1025 --- Makefile | 4 ++++ chart/templates/deployment.yaml | 3 +++ chart/templates/metrics-monitor.yaml | 23 +++++++++++++++++++++++ chart/values.global.yaml | 4 ++++ config/manager/manager.yaml | 4 ++++ config/prometheus/kustomization.yaml | 1 + 6 files changed, 39 insertions(+) create mode 100644 chart/templates/metrics-monitor.yaml diff --git a/Makefile b/Makefile index d729bd08..d3f27ca9 100644 --- a/Makefile +++ b/Makefile @@ -285,6 +285,10 @@ envtest: $(ENVTEST) ## Download envtest-setup locally if necessary. $(ENVTEST): $(LOCALBIN) test -s $(LOCALBIN)/setup-envtest || GOBIN=$(LOCALBIN) go install sigs.k8s.io/controller-runtime/tools/setup-envtest@latest +.PHONY: prometheus +prometheus: + kubectl apply --server-side -k config/prometheus + ##@Release .PHONY: artifacts diff --git a/chart/templates/deployment.yaml b/chart/templates/deployment.yaml index 0be4fea7..71670543 100644 --- a/chart/templates/deployment.yaml +++ b/chart/templates/deployment.yaml @@ -45,6 +45,9 @@ spec: - containerPort: 9443 name: webhook-server protocol: TCP + - containerPort: 8080 + name: metrics + protocol: TCP readinessProbe: httpGet: path: /readyz diff --git a/chart/templates/metrics-monitor.yaml b/chart/templates/metrics-monitor.yaml new file mode 100644 index 00000000..63ea63d0 --- /dev/null +++ b/chart/templates/metrics-monitor.yaml @@ -0,0 +1,23 @@ +{{- if .Values.prometheus.enable -}} +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + name: {{ include "chart.fullname" . }}-controller-manager-metrics-monitor + labels: + app.kubernetes.io/component: metrics + app.kubernetes.io/created-by: llmaz + app.kubernetes.io/part-of: llmaz + control-plane: controller-manager + {{- include "chart.labels" . | nindent 4 }} +spec: + endpoints: + - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token + path: /metrics + port: https + scheme: https + tlsConfig: + insecureSkipVerify: true + selector: + matchLabels: + control-plane: controller-manager +{{- end }} \ No newline at end of file diff --git a/chart/values.global.yaml b/chart/values.global.yaml index 0d84d9a3..2d780fe6 100644 --- a/chart/values.global.yaml +++ b/chart/values.global.yaml @@ -28,3 +28,7 @@ leaderWorkerSet: image: repository: registry.k8s.io/lws/lws tag: v0.5.0 + +prometheus: + # -- Whether to enable Prometheus metrics exporting. + enable: false diff --git a/config/manager/manager.yaml b/config/manager/manager.yaml index 3439e9b2..5d3fc663 100644 --- a/config/manager/manager.yaml +++ b/config/manager/manager.yaml @@ -80,6 +80,10 @@ spec: capabilities: drop: - "ALL" + ports: + - containerPort: 8080 + name: metrics + protocol: TCP livenessProbe: httpGet: path: /healthz diff --git a/config/prometheus/kustomization.yaml b/config/prometheus/kustomization.yaml index ed137168..87bba7d4 100644 --- a/config/prometheus/kustomization.yaml +++ b/config/prometheus/kustomization.yaml @@ -1,2 +1,3 @@ +namespace: llmaz-system resources: - monitor.yaml From c594f5c3dedc97fc03e8c596c69644e730f69e8b Mon Sep 17 00:00:00 2001 From: googs1025 Date: Mon, 17 Mar 2025 20:38:13 +0800 Subject: [PATCH 2/8] fix metrics-monitor.yaml --- chart/templates/metrics-monitor.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/chart/templates/metrics-monitor.yaml b/chart/templates/metrics-monitor.yaml index 63ea63d0..6b0258d5 100644 --- a/chart/templates/metrics-monitor.yaml +++ b/chart/templates/metrics-monitor.yaml @@ -1,4 +1,7 @@ -{{- if .Values.prometheus.enable -}} +{{- if .Values.prometheus.enable }} +{{- if not (.Capabilities.APIVersions.Has "monitoring.coreos.com/v1/ServiceMonitor") }} +{{- fail "The cluster does not support the required API resource `monitoring.coreos.com/v1/ServiceMonitor`." }} +{{- end }} apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: From 7eba587892a68e0d9c1cba3eb3b9d90ca8392329 Mon Sep 17 00:00:00 2001 From: kerthcet Date: Tue, 18 Mar 2025 18:40:25 +0800 Subject: [PATCH 3/8] Update the prometheus config Signed-off-by: kerthcet --- Makefile | 8 +++- chart/templates/deployment.yaml | 3 -- chart/templates/prometheus/prometheus.yaml | 22 ++++++++++ .../service-monitor.yaml} | 5 ++- .../templates/prometheus/serviceaccount.yaml | 42 +++++++++++++++++++ config/default/manager_metrics_patch.yaml | 11 +++-- config/manager/manager.yaml | 4 -- config/prometheus/kustomization.yaml | 4 ++ config/prometheus/prometheus.yaml | 17 ++++++++ config/prometheus/serviceaccount.yaml | 37 ++++++++++++++++ 10 files changed, 136 insertions(+), 17 deletions(-) create mode 100644 chart/templates/prometheus/prometheus.yaml rename chart/templates/{metrics-monitor.yaml => prometheus/service-monitor.yaml} (86%) create mode 100644 chart/templates/prometheus/serviceaccount.yaml create mode 100644 config/prometheus/prometheus.yaml create mode 100644 config/prometheus/serviceaccount.yaml diff --git a/Makefile b/Makefile index d3f27ca9..95a56625 100644 --- a/Makefile +++ b/Makefile @@ -285,10 +285,14 @@ envtest: $(ENVTEST) ## Download envtest-setup locally if necessary. $(ENVTEST): $(LOCALBIN) test -s $(LOCALBIN)/setup-envtest || GOBIN=$(LOCALBIN) go install sigs.k8s.io/controller-runtime/tools/setup-envtest@latest -.PHONY: prometheus -prometheus: +.PHONY: install-prometheus +install-prometheus: kubectl apply --server-side -k config/prometheus +.PHONY: uninstall-prometheus +uninstall-prometheus: + kubectl delete -k config/prometheus + ##@Release .PHONY: artifacts diff --git a/chart/templates/deployment.yaml b/chart/templates/deployment.yaml index 71670543..0be4fea7 100644 --- a/chart/templates/deployment.yaml +++ b/chart/templates/deployment.yaml @@ -45,9 +45,6 @@ spec: - containerPort: 9443 name: webhook-server protocol: TCP - - containerPort: 8080 - name: metrics - protocol: TCP readinessProbe: httpGet: path: /readyz diff --git a/chart/templates/prometheus/prometheus.yaml b/chart/templates/prometheus/prometheus.yaml new file mode 100644 index 00000000..605915e2 --- /dev/null +++ b/chart/templates/prometheus/prometheus.yaml @@ -0,0 +1,22 @@ +{{- if .Values.prometheus.enable }} +{{- if not (.Capabilities.APIVersions.Has "monitoring.coreos.com/v1/ServiceMonitor") }} +{{- fail "The cluster does not support the required API resource `monitoring.coreos.com/v1/ServiceMonitor`." }} +{{- end }} +apiVersion: monitoring.coreos.com/v1 +kind: Prometheus +metadata: + name: {{ include "chart.fullname" . }}-prometheus +spec: + serviceAccountName: {{ include "chart.fullname" . }}-prometheus + # Associated ServiceMonitor selector + serviceMonitorSelector: + # Need to match the label in ServiceMonitor + # https://github.com/kubernetes-sigs/jobset/blob/main/config/components/prometheus/monitor.yaml#L7 + matchLabels: + control-plane: controller-manager + {{- include "chart.selectorLabels" . | nindent 4 }} + resources: + requests: + memory: 400Mi + enableAdminAPI: false +{{- end }} diff --git a/chart/templates/metrics-monitor.yaml b/chart/templates/prometheus/service-monitor.yaml similarity index 86% rename from chart/templates/metrics-monitor.yaml rename to chart/templates/prometheus/service-monitor.yaml index 6b0258d5..b7ed92c2 100644 --- a/chart/templates/metrics-monitor.yaml +++ b/chart/templates/prometheus/service-monitor.yaml @@ -11,7 +11,7 @@ metadata: app.kubernetes.io/created-by: llmaz app.kubernetes.io/part-of: llmaz control-plane: controller-manager - {{- include "chart.labels" . | nindent 4 }} + {{- include "chart.selectorLabels" . | nindent 4 }} spec: endpoints: - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token @@ -23,4 +23,5 @@ spec: selector: matchLabels: control-plane: controller-manager -{{- end }} \ No newline at end of file + {{- include "chart.selectorLabels" . | nindent 4 }} +{{- end }} diff --git a/chart/templates/prometheus/serviceaccount.yaml b/chart/templates/prometheus/serviceaccount.yaml new file mode 100644 index 00000000..fb08a0fa --- /dev/null +++ b/chart/templates/prometheus/serviceaccount.yaml @@ -0,0 +1,42 @@ +{{- if .Values.prometheus.enable }} +{{- if not (.Capabilities.APIVersions.Has "monitoring.coreos.com/v1/ServiceMonitor") }} +{{- fail "The cluster does not support the required API resource `monitoring.coreos.com/v1/ServiceMonitor`." }} +{{- end }} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "chart.fullname" . }}-prometheus +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: {{ include "chart.fullname" . }}-prometheus +rules: + - apiGroups: [""] + resources: + - nodes + - nodes/metrics + - services + - endpoints + - pods + verbs: ["get", "list", "watch"] + - apiGroups: [""] + resources: + - configmaps + verbs: ["get"] + - nonResourceURLs: ["/metrics"] + verbs: ["get"] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: {{ include "chart.fullname" . }}-prometheus +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: {{ include "chart.fullname" . }}-llmaz +subjects: + - kind: ServiceAccount + name: {{ include "chart.fullname" . }}-prometheus + namespace: llmaz-system +{{- end }} diff --git a/config/default/manager_metrics_patch.yaml b/config/default/manager_metrics_patch.yaml index f46769c0..906646cb 100644 --- a/config/default/manager_metrics_patch.yaml +++ b/config/default/manager_metrics_patch.yaml @@ -1,4 +1,3 @@ -# This patch exposes 8443 port used by metrics service apiVersion: apps/v1 kind: Deployment metadata: @@ -8,8 +7,8 @@ spec: template: spec: containers: - - name: manager - ports: - - containerPort: 8443 - name: metrics - protocol: TCP + - name: manager + ports: + - containerPort: 8080 + name: metrics + protocol: TCP diff --git a/config/manager/manager.yaml b/config/manager/manager.yaml index 5d3fc663..3439e9b2 100644 --- a/config/manager/manager.yaml +++ b/config/manager/manager.yaml @@ -80,10 +80,6 @@ spec: capabilities: drop: - "ALL" - ports: - - containerPort: 8080 - name: metrics - protocol: TCP livenessProbe: httpGet: path: /healthz diff --git a/config/prometheus/kustomization.yaml b/config/prometheus/kustomization.yaml index 87bba7d4..a2c8d48d 100644 --- a/config/prometheus/kustomization.yaml +++ b/config/prometheus/kustomization.yaml @@ -1,3 +1,7 @@ namespace: llmaz-system +namePrefix: llmaz- + resources: - monitor.yaml +- prometheus.yaml +- serviceaccount.yaml diff --git a/config/prometheus/prometheus.yaml b/config/prometheus/prometheus.yaml new file mode 100644 index 00000000..7f831745 --- /dev/null +++ b/config/prometheus/prometheus.yaml @@ -0,0 +1,17 @@ +apiVersion: monitoring.coreos.com/v1 +kind: Prometheus +metadata: + name: prometheus + namespace: system +spec: + serviceAccountName: llmaz-prometheus + # Associated ServiceMonitor selector + serviceMonitorSelector: + # Need to match the label in ServiceMonitor + # https://github.com/kubernetes-sigs/jobset/blob/main/config/components/prometheus/monitor.yaml#L7 + matchLabels: + control-plane: controller-manager + resources: + requests: + memory: 400Mi + enableAdminAPI: false diff --git a/config/prometheus/serviceaccount.yaml b/config/prometheus/serviceaccount.yaml new file mode 100644 index 00000000..7591a71d --- /dev/null +++ b/config/prometheus/serviceaccount.yaml @@ -0,0 +1,37 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: prometheus +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: prometheus +rules: + - apiGroups: [""] + resources: + - nodes + - nodes/metrics + - services + - endpoints + - pods + verbs: ["get", "list", "watch"] + - apiGroups: [""] + resources: + - configmaps + verbs: ["get"] + - nonResourceURLs: ["/metrics"] + verbs: ["get"] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: prometheus +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: prometheus +subjects: + - kind: ServiceAccount + name: prometheus + namespace: system From 9b5dc6c9105974ab0f761472af9d1e868b9b1719 Mon Sep 17 00:00:00 2001 From: googs1025 Date: Wed, 19 Mar 2025 13:07:41 +0800 Subject: [PATCH 4/8] add miss port in chart/templates/deployment.yaml --- chart/templates/deployment.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chart/templates/deployment.yaml b/chart/templates/deployment.yaml index 0be4fea7..3aeee58e 100644 --- a/chart/templates/deployment.yaml +++ b/chart/templates/deployment.yaml @@ -39,7 +39,7 @@ spec: periodSeconds: 20 name: manager ports: - - containerPort: 8443 + - containerPort: 8080 name: metrics protocol: TCP - containerPort: 9443 From b6cd36a1640ddc7bfb63ee5cd5f4a97717687523 Mon Sep 17 00:00:00 2001 From: googs1025 Date: Wed, 19 Mar 2025 17:26:08 +0800 Subject: [PATCH 5/8] fix ClusterRoleBinding roleRef name, llmaz -> prometheus --- chart/templates/prometheus/serviceaccount.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chart/templates/prometheus/serviceaccount.yaml b/chart/templates/prometheus/serviceaccount.yaml index fb08a0fa..1d200445 100644 --- a/chart/templates/prometheus/serviceaccount.yaml +++ b/chart/templates/prometheus/serviceaccount.yaml @@ -34,7 +34,7 @@ metadata: roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole - name: {{ include "chart.fullname" . }}-llmaz + name: {{ include "chart.fullname" . }}-prometheus subjects: - kind: ServiceAccount name: {{ include "chart.fullname" . }}-prometheus From 5b206761afaaf4a885b9548f0f578fac37ed9502 Mon Sep 17 00:00:00 2001 From: googs1025 Date: Wed, 19 Mar 2025 20:39:49 +0800 Subject: [PATCH 6/8] add prometheus operator install docs --- chart/templates/deployment.yaml | 2 +- config/default/manager_metrics_patch.yaml | 2 +- docs/prometheus-operator/README.md | 76 ++++++++++++++++++++++ docs/prometheus-operator/prometheus.png | Bin 0 -> 53636 bytes 4 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 docs/prometheus-operator/README.md create mode 100644 docs/prometheus-operator/prometheus.png diff --git a/chart/templates/deployment.yaml b/chart/templates/deployment.yaml index 3aeee58e..0be4fea7 100644 --- a/chart/templates/deployment.yaml +++ b/chart/templates/deployment.yaml @@ -39,7 +39,7 @@ spec: periodSeconds: 20 name: manager ports: - - containerPort: 8080 + - containerPort: 8443 name: metrics protocol: TCP - containerPort: 9443 diff --git a/config/default/manager_metrics_patch.yaml b/config/default/manager_metrics_patch.yaml index 906646cb..d0a842bc 100644 --- a/config/default/manager_metrics_patch.yaml +++ b/config/default/manager_metrics_patch.yaml @@ -9,6 +9,6 @@ spec: containers: - name: manager ports: - - containerPort: 8080 + - containerPort: 8443 name: metrics protocol: TCP diff --git a/docs/prometheus-operator/README.md b/docs/prometheus-operator/README.md new file mode 100644 index 00000000..2d9dfad9 --- /dev/null +++ b/docs/prometheus-operator/README.md @@ -0,0 +1,76 @@ +# Install Prometheus Operator Guide + +Currently, llmaz has already integrated metrics. This document provides deployment steps explaining how to install and configure Prometheus Operator in a Kubernetes cluster. + +### Install the prometheus operator + +Please follow the [documentation](https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/getting-started/installation.md) to install + +```bash +# Installing the prometheus operator +root@VM-0-5-ubuntu:/home/ubuntu# kubectl get pods +NAME READY STATUS RESTARTS AGE +prometheus-operator-55b5c96cf8-jl2nx 1/1 Running 0 12s +``` +Ensure that the Prometheus Operator Pod is running successfully. + +### Install the ServiceMonitor CR for llmaz + +To enable monitoring for the llmaz system, you need to install the ServiceMonitor custom resource (CR). +You can either modify the Helm chart prometheus according to the [documentation](./../../chart/values.global.yaml) or use `make install-prometheus` in Makefile. + +- Using Helm Chart: to modify the values.global.yaml +```yaml +prometheus: + # -- Whether to enable Prometheus metrics exporting. + enable: true +``` +- Using Makefile Command: `make install-prometheus ` +```bash +root@VM-0-5-ubuntu:/home/ubuntu/llmaz# make install-prometheus +kubectl apply --server-side -k config/prometheus +serviceaccount/llmaz-prometheus serverside-applied +clusterrole.rbac.authorization.k8s.io/llmaz-prometheus serverside-applied +clusterrolebinding.rbac.authorization.k8s.io/llmaz-prometheus serverside-applied +prometheus.monitoring.coreos.com/llmaz-prometheus serverside-applied +servicemonitor.monitoring.coreos.com/llmaz-controller-manager-metrics-monitor serverside-applied +``` + +### Check Related Resources + +Verify that the necessary resources have been created: + +- ServiceMonitor +```bash +root@VM-0-5-ubuntu:/home/ubuntu/llmaz# kubectl get ServiceMonitor -n llmaz-system +NAME AGE +llmaz-controller-manager-metrics-monitor 59s +``` +- Prometheus Pods +```bash +root@VM-0-5-ubuntu:/home/ubuntu/llmaz# kubectl get pods -n llmaz-system +NAME READY STATUS RESTARTS AGE +llmaz-controller-manager-7ff8f7d9bd-vztls 2/2 Running 0 28s +prometheus-llmaz-prometheus-0 2/2 Running 0 27s +``` +- Services +```bash +root@VM-0-5-ubuntu:/home/ubuntu/llmaz# kubectl get svc -n llmaz-system +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +llmaz-controller-manager-metrics-service ClusterIP 10.96.79.226 8443/TCP 46s +llmaz-webhook-service ClusterIP 10.96.249.226 443/TCP 46s +prometheus-operated ClusterIP None 9090/TCP 45s +``` + +### View metrics using the prometheus UI +Use port forwarding to access the Prometheus UI from your local machine: + +```bash +root@VM-0-5-ubuntu:/home/ubuntu# kubectl port-forward services/prometheus-operated 9090:9090 --address 0.0.0.0 -n llmaz-system +Forwarding from 0.0.0.0:9090 -> 9090 +``` + +If using kind, we can use port-forward, `kubectl port-forward services/prometheus-operated 39090:9090 --address 0.0.0.0 -n llmaz-system` +This allows us to access prometheus using a browser: `http://localhost:9090/query` + +![prometheus](prometheus.png?raw=true) diff --git a/docs/prometheus-operator/prometheus.png b/docs/prometheus-operator/prometheus.png new file mode 100644 index 0000000000000000000000000000000000000000..06a9ac9df6b5771e5a2aaf440a9092018bebb2bc GIT binary patch literal 53636 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

I%^y&l zqVZf?Bo^0-TVmO!5qGM_3MfJ}$@BZIx9)6O02xRte(ZF*-^Fn;zs(fr=3);P%c%kA zj}>jWF|7BIZGyspc!%bvTN7$g*9Ke1pzQZNp8L5Yc`_-7wmVXTvp!UcJ)!_Ipc8Ys3C#dN3$CV(kkj#s zS$-K(&L}p9zxzB-WZ-MdPw%BbV@O00n<%tnUh&i9O^H^|vDaLhVMExkq>NqG&$ zgcHdtRYgu9M*EC?#oao2sP{!Ya!|WS>8||uEo@Yt;k6IBY06Rp`GGoyMZ3=+={%|Q zXKm3ppqvSpVJI=y^&-kwozJ2YMg}`vnwU>)&Mo2UmOPRLJpJrK$nIniXLld^K2#QLH2&v?X$;**xz~HRU z7jruyRWbgKuCrP>M&+vyW*@c=-$cMtPm)VEUl^b0)ja71p2!+Js!w@Syd4=mQXM0Rlx%$cWS3)7vo*E2NKa!g;hLmqsjNNN0Fy;^HY9e*FM znpOdmdIaNKh^HBbrSTHRenDM8&F0XTbIkk#_jQ}(&hA3eV-B@uj5(C-G{o0#<@8oA z7&)GfCoCr$r2wv+!ft=+o4$$$Mj=?c2bn4~^5t%}lO?ACi9WK9AI>-+r^p zb*^mGi;+%o%Dht}c)2(7t_}Tevz*T-fRiHn*Rm%21aT$TfKl-@@tph)4kaFGJKyg6 z`g!Gk%Ym=$-`t8U_nr_=NlvBv*-u$|C(Bf;hH|t|HT;J>jXHX< zRr1#JEup6ZiH*m}eYXK(w8Rj)fX_Ue-nM5_6y?ghTQ-tk1 z-N4edMots(M%DG^;gggVZnOr1svw}sqx}26k6otT%wt^6ledNtI$YmIZO{}|IXGfF zh*!Un?(J|s*4KLTYI<)Kj+>p@M6T|uZ+4s_!ZBubp;!|$h{;U0zmQ4nT|K6ZvePda zRHp5go&7ZO`;x%5yPZBoY`pupvrrwk_BX2KF49$YPK|F@Nb_6Te)nMLTl)L|lUaRi z)51PIq4)Nvu(V-t?nyKjoxijZ=Ng^eDIngv!#3!E^Y0 zlh3k0>-M5OkzlMZCWe?l=d5Di_r;>u@i=&@3|SOpb1kQ`jw;jh+LH}S+yGz?;Y@;! z3$)7&mEf7eg+YQ$aT>l^hN*SdW!q+a=mWK$Bk~b}GL=l9z;)~+8&LF$=&Xlp>A|za z8A4FGn;51#s+}VIC3XsNlj^JWjHnloDg8M*HI-SCK;okr)TBJE`V^yduw6HAB=Wn4 zw!nrU9=ASeNgfZHwfHwe}wg@TQ(Vzzh_}(?i z!ai7FlbUiQOI%x{O{bsN7O~3r^&~hZqCNPPGa*$36`$(ORReLJd%V+*0NVR_iy2GW zDRS_xt2UDhD;><-VL$oppM;T8>;diKVo}#QDbm##g} zVK*Dsz=OK01T?vIae^~9@;dqd;qATu*=+yt;kIt2Y8KT}RNYmoR%_4N+L~3=rdm5j zi5+TdYgC8YYVV{D~p1ZWo;hzYIIhE&O58emkruJ zTym9=12Pi+U!neVBMbA9Vb73xou)EmVr#=UFSL)^Hn1iJ4zto(mJccVRyuW(j5@EV zxwbV5{)r90OlMVV(?s}0U9L1o2vQ85iDxTe9ZI^i(zmO1Pu%#@v(0{~wxwKtq> z>8*-;K;#F28n~14Chb0_SLJLGM%FM4fG;=% zXbHa*Sd|^IYv6Bsn37>j$`i$8(_QXsU7hZpj58cg+Ka%(K>)e)rEX6| ze#h#o>~QI1y)x}L|$A6@=Dvm8#)R%?p`tLkPg3nc%n%aDH1kE^H+*|u$#pEjj9t+qx%>@QMtX-S?P z)ZI!|8oAUE=+ocTp)H09ot`wwC3?0N)=DczpFK0yuXlhJYFUM<434Td#t(pUZBX=Y%XwxF}zFMM2-|rG%G8cdU(Dtsa}pxoL+FSrmtm zUiXL5jO`G$=S7q4dY{lN818hy?#+BWOpi>kNpYw=fAt2`EdNo{4LII;d3tT*2atg2 zAMCo(4b}(4`pQ@L$i_QXzm6LTs{vBzMt^{Gajj=w_qp<1$9LK*cmIaa=O3dnq5I1C ze(8J^o6}nNFjZ96uJL5q(BSn+eB1Pu?^+sdFR9Vli}3TxEm#g(e&d`dxozWm-WMJ~ zFOra*W(P$>W;^N;K#EZ((Axz`I$KUFhpxlBA=&lh5IG^b($Z*-t1;2{0%&g8h%ZuI zNl+E{Le^y`Cl;;K>PfHElT=36D^+V&ef=qrpzMxVLZmZg0=a~Ir8eMmu*u3fu_ogm znTc<9Q{Y#HVL}GUGZG^1{6aH0X=i_vo|&KW{XzM|T|#XZPPgVko)b$-GTvRR_|Y#* zKjbLPS|8Pz=Y(-S8{gS)Ap8Yp*bH>zl#AxrDKwQ8%EO#G@xwXYP?_rqU1w*c*#EF` z@(gh>C(Yc$=pKKyV7Szu-550raE1>Rv*$?B4s!S@@H}k@pHAIMzQ5LAR-NXg zdz+LRtbyaOPi@o^{6(NYuQYc}3)>xVfsX%*w5F{y-!-}+NE?6jNfOQZjmsAvE##?G z_xbgEPSo^A)4{uT-TuDG18^GbfF3evdyg1ViD9rpMC1M|&Z7dHLL)z4`_0KxQ~?U@OOG+I**%9@=-Z=Qzp3SgwCKn=Fau% zpw{--G~~c)3m7)?nt91Xaaz%IKW+64^sq;tt<RTdWp|WlA}c>N zVw)|WCRR+0dred+Ma_TL49Mk~F8>2it`8p_>nzKQ)c!mZVF?qP5#O*r5~%Fl;P>t-w4`2(J%P3`18@>y&^KI zjE;eYh(Z1-gI7A#L$NP2=cKo!99xP&EAluT()P=0M92^JPTU!2d`gv`lK;+Rk~6d7 zJj>OR@BSA_>H|l6oVV6-F}e>8oC7+KHy(hZHNPEXecSxb6o=P1IS?E})rOOyITDk2(&{5p=dVJgWmAUOItZjs)p}9 zCg!!>a75p;gw$q$GmrK|C%HtT&k7yx7GfRTL{rJ2(mF)5nzp7Cwfs8g- z{R3I`9Fy6|s-Ft!d~ml;ZR4+E;ugGh-vZv{IoBHhh%Ntw0vbpFeYb??zO1pw0xK<~XHM_vEe>>q*DW%qGPImw&sjk!YxTiZHSJbf~_yyy^S^}?N<*LRg`^(3ZC z^=jmBGJdZ*mhuZ0XAZ;n!G}T}GdpJo$!4j*%$~m(&?&5zWSb{aJHBKSAdpU&xZc=( zpOYeMXwB%+IDE2{(UIMN_CmT`X8{N4ySNPhg--#q7oF}6_&0HH`!nx;+E85rTKY)| zr;Z6LW{&;g0|nLk_P>q`5LD78z=^6fiqf-fE+B-QcN*pzGE}V}9Tx;mPoGZ7^r?#b zNemkwIe?qqvi5mI@fV?%*#|-o(hKu(n-n@Xc-jpb$Fe*wN_L2uSwM)wKg13>pH+}z zWWDQ}z|R%130{rJ(|p^2RSP)0`jG|P<#Z!(Z3_%pMFy|r`fB*ViH;=!Jpq?d`$xv# z`2-J(RzX*uZ6r{K^UD5j?=cVP9H1>ixScrtPpHoA{nsvjR+Ot~WUxUGSA zKPf4G8oXBHdTXTN`Cz_2i&+VsCW86c$2_(91yBOYE(u=NA!SsXPPJwQu1)F=2I@TQ znL#>!tvEiugP8IKllQsT$4Xnv)PH*;Q=ae}w3tc$kg)|~K=qUA$^@8-)|3}A>Todl zE||iMrM%^leE4Q(7D%%g337 zAgxJ$m0&MO`fd8_gY4(^uPOX2)`Cu9%1eyATSbBU9w4z+Z>VEyj%afK`A+Q-jwUW+}yrtPqB z%&k?uu>WvuGvjD;ktfa$UlSn@I4I$?>O)1BdDzkX*Fr?Y2fS99` zd!#k^-L=yG!C%4#<%XI z&bTfG>V@vBq;jXy5w5NWe}x3qs~NV%fXXV)as&KV(BN4)(ORLm24-7{ALSgnoFpcL zzVYshmV-Xu*Ano(qBS=rmGs@%WqN@3b6=i)A=)lllb+0;FTJV4pU1vx&AvO&u+lpe$f8&MJK=YX(6UjY zQkr`>qn^xpf4^(3j*=w;p0axCI=7QwoX`bb0G3$&IR7_{=`K(n(Z>8VpMl1k9ue9Bt&b+~&8<`aOwj!X!CT5Qj0IUJ} z--&NtSMHC-iH6=bdg;gh5RQ~ogYc3%e@F2WNlMAfxDM2!g&}7*Q~}dH)1U_kaoA3s z-)67MTfF8jD)EonR$bkS4d-!{df93#G|h`bYvWYPJgx_H{H)+cuyX7*Ys|(PvA>L4 zlDGuOZ!b8{lFrRZYsS%vYI_gwo&RDgNQ(OkEclf*?_T~?^B0A3KJGZk!85-RN-=p` z5k6d-pq;UHZv|lSQ?}%3%7g5q1-Tj~7SgMyYci`#p2%YUcm1=}+@|%2-8#| zOTSbp0Q6`JyNB~)v8#xEysddRBGKbby*&~u)CWtuJBV4?`pI`yH1=j9SzTNC z)`2D?_wEwNAfFyu zcvY-FMcC2HamdKv^a~;@Lvf!a9K{}GNLsyfaG|F1uNExgB736&jpRp#C=R)E?OLfp zS89MFb1IjorBYChDL03gGwRv=JkTL8i3*7u$T=-8>(=b>=Bv!jTvZimYKS3Uh~>K#+8tm!n4A}yJP>NQ_~xu=8zj2psA|w^ zW6vaS{}jiA@cfg+NX`IFlO=lju1fdUDs{T=T}lZF&LK4a>U-@wNOqO5$x=V5UH#Mx zjs!c_qyr9rn?wVz*k}n-$xlm;*o2MyU3isXz`V>x`TM~m=3fbNI85-yV$(Iw+U_y7 z=SW-UyXe9mJp=NaPlpnW15$g(Za4t%CsbR)##^qN3N|70G+@53oKF4%aC`26p^$i4 z#i^Ie>5X{hbz4Qph&(OVQ}(!v0{;MggZHp{B`eQ3j>IHB)61_e0p+H9$^#%Ga(-43 zb7BX-<~p0{J+g{F%pyQ=9+JK~9If#W$WCuGLKc0IF6Y!scr5_k2%KilWU4%Y95lM#)V{|D~-V4`4tlMU^?M zj;nJ<7A+*ZTD}qW>(kh>tP6h|mN9Dg@g`UX4}>~1+Ykf+FR1ipmIs;7`UqS3x$Ns| zz`(eHNY}theB}RS`+>uFY8EitqwC?R)RXqF1>r2hjr$W~aS`htK#@C5@A?!x$}odw zpcW2-I(Gjl`OuL*+ljCN^zj2i(rl>NvhUes@=+!M(6g3pU-&zd(1+cY$L%H14}_L5 zb(QKPK_!>E;@)3uyf!W?C*AqBA$UKdCpU3#4HA1!X)|5@yhqA)KwH+fFU^{sPq$j$ zI+&i?<5i|D1JIuLou4dHv;o~?rNcXO%v`HwQbn*n@}IM}BOm?9CKzba(aYob34Fd@ z->-D8iz&=8e^8wUoWBN8zbmwN$^?JUk;j2LPkg?T zTL+HC+7`T>TpXI-#wx)$yO9@<8#xYud~;R#{Fhzk@Ap{o$p*m(8ku{iM?l^Fw-zW}k}9qlk-!_;J4D;^ypu+VyD2m}LMab!Nf!sKEFFZf~)c7yzu=kD`0#;neHeWhoq)#FA%A_l64EuF&i#01Ua`4j%}qMZ8M&k3XKEC2g_88^bWpDTc7{uP zUh;%Q$(W`?aNF;N{4ZSRgLZmrZynXd);IKRWgb|7~yURFd^0Rzjl^Mvk@<=hO<6;*%SxQU?=A(Jri z{J3D%jk1vX;A&r{)#$G+D<#&|Hlx`~26fql1wa6)Gtkrg@*?V;bW?4YRq^RLIlY-m zg?GMcQJW83vFq73&f!mN_;LaSICE~~#i=~LrW`@k`<}aMkQLiE>0>@YmPq`~LdUn- zB3Fe;v0Z6m8F-ZW1sK|>+(wYou`pJl=nJSpERcrOPT7r%PEu!Dl6^7g90__8aDz7# zKX-5SC~f?@jzCD0^p~?sqpMKZ)sE`|tH%(zB=LjHrKW;GJcz|SXX5<&4b#YF9$y6? zxNkV4EC1u^r!LH^s;lf@_3lgvkJAl=HoZHy{AFEyTmB()S8f#A1?lDJE585pOnT=b ztGClMbu}vZ!W^LK&a4vy;!H~$D$(ibGf9S~cQ(I3$YSjGz!NfAyeAl-;{XuT)a~U* zUM>`C00og6ZaKZdH33We&2NaBpgxs=Xyy{*Q<0noLp_n zdM8NLSKi1L&m6Q!{R=2*H;H*Db&aU{Q;g2qqfFbsP1Q+1?gG9qIZ}cfa*$$H%Nr&g zwpYIE{Sir8Rs9d3{`3T(rF8oDs<#9QBmA!Phx(`mg@ePcm5VW z!S+L6=fJ>Ir_v;X5~qnyUR2@poEl%eQ@+dytD#_6S1=AuDXJwPa* zstfpBws(}Kabj_+NhdU2ou1rX$BOz5-;^JYIFjdoD7_ldKYc&^63{Z?Gk24;O~uu*l=v^*%G!^D zk}+0Lhb1~R?)%wW3ZB5^2kdyq??^pqh%5VM-5!)j6x4BYDY6c>;cL)f_Gg}$Pf3!n zZK~u*eI17{X`Q>^TyB_G#yKSKGp%(i2Tak?#)pTKl-4=hcvXC2j7Q$Qwo88mIoyC} zC!ELCadzjcL}_-M$bVXgaUUpe&()iFPE^7$^GCy>^(+HnK;ZbHY8ZBf7nZR8t34niO6IMGu&u{Q&qq@QTNeEVmul%4eWkwCmJMZAqV}3C z0chG%IC6KGV>(}B!1jw6=-X-^9wQ|ma8h27x<-pt2+nTuUb4?~&klYndw0&O@4A#s zGT-q5l#nIw+8HL}X1VuZko@lKU1zeoT%v?HDc4e%?#*m&u z6nLC}{WdC_&<8qp{^@7L5-qB;oa`h2tfkGo5oY-2Zb>_5_YEEykwa}RnPe&i=$#YN z#mBDeaMf8!A35docq-`13wC@Fk=c)RDKgdxw*hc#eA4^GLb~D$W!xj~-@O|FO>D|H zAq0;IEAtIQ-q*ixZ0g*35AZ{(I4mkjb}4uDj9<8;>-s%qKW*IY8C%Mo;8dzVbxnPo%Q_pcQK2AG});qF5ybVeQVQRp!c_VsL1z1vE^1={B){q zE%{5jBQL0J;k%L=n}{@=Ga>cqnqf@R@hZ{i;uV)Q4e7ULY;EK-JuJPcpzpWTW1?uf zAx_1Y`p-#_YJH{l%YAMr6sO^II7dD^v7TKX2*z?I88^B50}h3T26lqW22!X{M43$Y zb^Xmcaq!pPJRp?0tF!V~K*Df!k9fs$I|rZ3HKjTFou|!kc54}g|3$b0O5+j^c~of7 zT3Ns7qUUj-H~2MLNgCzJ;?v2^*Z@f^^wsrb}s-6lKWgTVreP^)tEEsC3%L zwL()z4FX*_)~_?OFqyr*9;@*SqL~DD6T_gb?a{vW)RR~)*R+E6B%q+8`pDqlxbfw` zc8^lM^(Lz$8W&^a73+2bO85A+^9_4u`9Vye4g>LB%!Lm%TEI#WTh>er*<|3HSe(2l zFF1Z+1V4!)Zqv1;5>yEt*LwZm)O+MCWB$(hk?PXx|31aVH&@ZR-zei||Hj}(y8>}8 zoU_&7jS<&d(f5~r&Q<^Y@S`Zvm@BA={kk%$50^t#3yJQUKcmBQ<|GPzXm=f%r54cDXUS>Csnq08hms%Tw{Hpp5X^rF&f_LG$Q`!B=me70dUB7 zmto*1z<|XQb7B`Lc1^m5lq|r5%KuCAC;y_7p36+|LBBV@&%v zg#2A+Y>&X8JINp_vGX{GZ?O86>P)ar7tSQ=p;ynu|Z&E5^n~qXjHpf5eE}Lc?duKJ>=U!6$trZR2)!wvUSRC7ZpWH@x>^d>^a({g{m#h@7)p?_=E5t&6ux$ znYSr^n&Q-Xuxk$L+}YgjCeMfPzdgt$UA`06tCno7z~i~tLl$VKT87!H;kaXZFXBc= zhgyd!QeSt#i-vMK@49AOQwtv!E*3Pz% z#}k-f+wG@9JiESgk3*k(yC`$n`J5J;3@#XgOZ_5^@90;ghhN`n7oIWDr;qI5YE)Ie zGx6;a=zJ9mu3yin`bBh%_#k!2BsoB>m7BM^z3XK8sp4thu&(5tbtOpNMT3LepF^*Wu(MqE(}ko}D#`6u3u)_<3$9-BZN>2(-=51pbAsMI z&q+>Zvj(Obq^s3IAJfi^e^WNLS&0!!AzH9k<@0AsK8{f-9ZZdEc+f;;2bJAzg4L) zhcC>%CM=#*07udL+k7S-P6v&8zYx}7o(MmZsNM&?pZ+)hwSKJ9l4oPk*buJe7Y)=o@je#qM-b{;sO3T$Ka5*K8>5z;rs&QEt z(9bTLF+y|h=XZy;uhPA+F9>6VX^l+c+#ACCYS^ZVxr{e7%Yd)3;NxIz|;a!+!@4vMdu5)jX9II&~H_qD)r75iZ=3-?0XNyZo#^6gv{cp;H^ zutuuU-z7bauGNcC&>ac|x3s!gZutfsAle^$ikx;LzrgPw+<)2~3dBR%#Pjh4GCdDyb^;$X zZ&1Yji<}MqsMU0kd=Z-Rdm*l>Sjg+~)2C~C?49*TYG_`)u0Zg@3DADAW9$sxiR}La zRjyLLrGO6Fp26$2Tk*(;#dn<=ptYsBj}yfPupKmWsvo9zTj;~y^A|5#%sP1Cd^^#N z8+;x3C43{W7l6VDX{&{c^yR79(`t_ISFi4!vb`;*jWRmo>)pq`30%IdtNRmr)4P770^iofq$e1?G_ohnCu=}f-oOfFrXxL{j> zqW=gy^&cr?>!u-2$gtL3mdOsE+#R?r%jD3XN_w>za=`MMq%rB5$ja|uP?zJ|+8+ry z)&5kb1fdx2W+mBsO(Q>afy?;rJ0mguos+ljtm)>b0kyr|=YBmTMX5=JQ%GKlbXOk-E`3JSudIoIDb$ z6mnxQ1Dp>MqfcW7`55W;4E zQ4NnEqbWI)GBCyS2+Kg)k-T(~mo`?^^j!^U$c?A@oq4_3l`;RZP_&zFuQB?`fsI*6 zO#pYt)zZzUAiF>)@n-oi{BQoC+Y;3e-&KSLnh!=n!R>ist#fw+F4`4Dvsafh5DSQ>Et&?jZlpW2ZPQfC+zdXasHkBy~3J<9t*=u?o-6-MQ9r@sP z{nJQKa<&Mi$q0=*na^g$dXF+jfdH@dMc+%IHsz_dZ5%Wpklc6iG*y&RY6&Ht5bY&J z?dw;HzZ~3)^x%yr>wmbdw|@5hr#vrPjXCS`P0@uAdrMk*EIVs@GUEC$NaOlfv5vJ2d9JLuWhtf-OdklDsfR zV34keM2gyxxkMUQriScuvrl~BL+}lYA%iP88?$wcwC7FP`9Y&?zH9c5j-!8T9({5j zJ2(x-nJRn>?^=aOR-l`nj)l1)5r2jpJq($qq7=o5ph|Ijbf=&p!I5)tLSc~S3GhhH zG_bR<;&g@mUlIuR-?KlNLtfyP$336RLXEeT|5UGlpA0hkRGd=YLfef3hUqNF@9GsF zlD4M!Ag$w%Rrn4!c7P)Cldpno>40jzu!n0R)YMI!ZMVllulW7AV8k8+NF~M6Eq$4} zKGt8IuH(RAF|=OM@yvY*_vLRku@$->eU6TsdjdCQARsd1`mdt&@i3pBP7PAFS7I^I zJWSE6EfFKnFw6e5;YGnF4CY(7M!w*=a7Zj`_ZKvr&I}w9UXQ>-H;2}D|M@WPdMTHX zbnZ%HjbaK-p$SjC>^+5x8_hwlr!SG+7|%$g#OT7`@7Bh>N_d>Z31_%K`sC}4@EMg_ zZfR7u@aj{~sOvf2=@w zmKM#Pm397RmFDSFPk#ryz6~jW+#5f=jmhY7r&E{(*BHyjT*ehd+%Gu<&#+- z4=!7{nGa#|wO?oW3t=QLU;h7Go@@Nirj})D|FLmtNmGS#UfA4w3dw+J*ztS6vf`NRqx|2Ke`Q%Q|Ev(Nmit@`C)H5#aIo*&2e(l>hp>}~fBw@G z;|Y4(7HXS4;U$8m$5za1>bMp;1r3#%ojVrQ2zxzY6WdKL`QTbCV@3>`8M%=ynmv}8xO4E?hP~x|-wF9^WaQC&Ae8^2L z<&eKobD7je@Q%u)Kqy5wocKvnKH@+p9H?vXh7S>~^F@U5QeIwU)J{0Io`p|d=l{L! zN)tucysF$$sJuk6@uxD)pZ*y`@U3q68OLSxQcXJS;inzZ1ElX1&ya2+alE8DNR#{O*0^kPO@Yxk&-hz z#KoSu>71eN7(%^QH*5|KW?$wns%IdM$#ZA*V?rH zjz2=Zu&d;~gpAU34#a&?wlJTqLJ~qhH!4wVTr8_E;>H_Y`x6B*Ad6!Q`izPD_>oH`>LlV| zMFg-bcjl3_OX`^M1ol7@qr5L(`ka+@71A;TbVKk*drRA0-T4C2H7-#bW0enKO%|b{ zq1#uUySeFOJ>}lKeT(0ks<#Bv?MSo|dS_5`Qyq|pS@_rf`{kS39$vt)-MrSMUjUhc zwvr{OKWj;Lb;tJ?QJjuV1nU-yjH@uz^II<$*$^HIOaj*&>RHo!&kG^_I$>}?pDB9*~+|} z&(e67+9oo`tGYvHX%7sPui8BsYULn&C>wlpXz~Xc!1LvlRIWloz`WLO9;f2 zj$cC+ZwJS>?zEHgS@@O5L<}?M&w0_GQmmgm;mT@tbwlRX0iGz92uTZI(~l-${ZyS> zFiRgFC^y&G4#EHCbgKW-ua=?ViCWuY-zMJQzkka=`@#6gz`(C_)8>kLMDxn>vQC+I z1fq*T*@R)JJDq}%i~oEduc|HWdqN#w-$G7y0M8V=5Vt?=sLikV-o4y>L_)53yE2S|E0ukXEOOHE@GKFV={Z=MG*x=4<`gkcf?AZD zjk`@Pcv>v9Nq&4Gj-F2QZ60^n80#_4d+-|5C~|A3sMf9(6-nvG;Ilrfw44y&_WI30 z3^?tLI!;tO95W|wRKuo$p$D343zZMvwzFc=^x~D9eec1wograscT|%;WAs2lzRWOd zv3q+$3sW`R9(8&m?}of)TlXwp<&*;1Tl~2~EgF6j9RikBjs%3DE9lo+4iYYh8{^x* zQe((tV^4UTqKH#&=`CJCYr{gDqvdI>n(Q5t@H_@Kfn;NW&&c*w$Bu~5gIc}4)g0gH z$vT(WzR>uAT8n4TidcAMD~?6pB0o*r%c13Hzi$;Z=g=Wg^#9I_4MC*abKF$?%(+LM z@9;L`PmXIkKq-2&`i|Am4L)Ex*ta@ABD<4Y1tPj9d?K*o`wi75~5Zt|(xk2`W0Z=7{KjP)LMy6?~7r;fUHuDHaW zT`xqh7Es#e?Czk}#Ro^#xAszxNDQ69HJMmA?gC8X z8wgx!$%ACOCO>_G9g2FfBWZ7qM@u%Ss!h(P&o3g#PzDgGLpvkullcpTxP?nRfmdwP z)<(x;%s+6suG=@oV8SG&fw&|7<;f$?6gxKaK3vbElp@wdKN~$8n{2PbOR)Ag=Pa@E zA`Zh)u=tr&pUw(f)n7ikH@p)@J6IpxhF6-GPZ#OFo$2Im?4^pt zW7%jk^=@f7r$1hEZU;-47uU&svr~A~;EP&%n>2_GFAvGc=ro6ZFqkBpAm>o)zCvg#kE+8Ae+q4yoa@p8cgEi4mbfeQ_aPYo70 z4tmn$eId$0wjEly5%Ut?G{Jr18q=s-(6x&=j6AwmL^^K#`{vD-faRW0d;wOFc7V=q z)Wlq(MTBP?qkX`_+i;WViM14Fdn+IWGz{h_ScUQbH;pZTX&k>3&c+WHf~D4j3bt?i znw!tP?HF>R9u^OMBxPC6o*vah=OVn!q#=h3kme0eqQR;0ZL!qb4-*c<4ueTToUE(PyZH>wlx5*Q?2QZ zOj_KQX##4~aMitqc?5WKhS4?UkAS>)Cf_G1CVDw#TS7$x|H2%eDZSh%XH}2r#TUq_ zNvqV=T*{X7@*c>P*@mPzSsHB9O*YMi^{04}xUQMxD%M5V-*X-K3hYXn(FsFMG1-hi z)ZHABwb4^lOq=eE>b&@_ht>kWCgHL^QYz{9B%Hlg{MvmlUVb{-lZ#gbA9|K_616uc z2ORB6lp zVFPfULKJIvuTB@j!HTgKwLgso1lG+27zepEcqfS9E_i5;);~}>g9vIk78OK_e^1p% zXEYiquyJ*Gk!?EJ7P-%DMtIFC=PN@y4&V8xujL+jX`;&<)1bZ*R_GX_CPCj8>K=)I z6f$*^bC#l7Vf4tR9=PuPVwxblcRD@ ziuh)Sot~9JZEmgX&|Rn;BF#@`o8MR8Ew>5DPpI9^;wxjM;u9vq(4|^?ys(k(yof(s-G7zf<-<|`{u9;?5k>C*J zIVOF$dVDvNJDjErRh~nc{VBqalgCo%_%$S?D1&rnlNx^W_j%5FQMraUg7Ho6_7Ex& zjDc~CGC3V~q{5J|&ppR?YPrvfnjP`s)nF(xVv2L6CzSTYZyWZAW{Y!NXj>hZF?}n5 zulJd77r?&P?KNCzgo;V%1A=vQs1@M;U%q`LerEz+=u*0}kv;knEP2pDlrY4hNIB@k zwa>L)CIm6}iBOcAHo5^BFZdf8P~;J42tNtIGEX*md{99nTmxAu53Er;(|Y*M&bs2E zT%Q>CJOnaO`2Oa|0m4!TD>}Sm1GC}y-2tJ_>`<<4*v0pRs`+Ydj(|%cqm64<*2|*1 zBkXw)7m5i&2${kq=uoP9IYK=UPs!m8GwL5cEC#Pb>~Gm*ln>=Jb|QR}|IIsq$zh^+ zib|agnuTo#o;_k|nq3k&2$NJBrQdjP3s^WZN$^vH7=BgWO(j8l2e3tfpFr+~&zUq8Ns6#IpwV($cJZw;{7c@h=*FYngmA$68eAM8~5Y*NeCz2WgehAbHQ? zskOm6Ue2+1VAm)a#mm1mC_!7QgLBTr;s>rbOI#??p}a zZV|2P?nmLo>ZKSqLu7>n6?E-&O+# zh*4W8_q6ZieqpPqVAM7@I!Apj(5mVeBd!2KoZ2_*rBpt4uRfWJpS~}sMF`84#kHpohp|qot`*X>FI_u1#vS0{Z5f+BD&ySd^3}0 zb@+8C&`7-RC{!6^ohMZ*rTW-@XEP#^E|PwhDF$rFwVGf%)Vk}WOO>T50GihxHg zXe4r@oM?^y)MyJMFgdMeR9%`kxEF+`vL0 z)FhfYq3+*45$(hzo^ybjo=X1$0B?snK6~J!|Ug z7-8khz#4^IbF)Y5HXFT9ZO@ppDG2yC&;#hLfg)_!ws?ffa&@IU(836^;uR)k15})! z(jqBS0<8;;;nm4A=%6|B_oa!bwF;+j{prDAjrshQ&{LNoM8>@JR4DOT?>6ySq7U5X z!rZXm$rI~{r(q9f&pj)3-_`1v>P&u}qH6V>Hi4WB(#EH6a4TbrHJZi53llb2#z5ND0&Caklg*EXTAC@ zYXhR&fx!p!7tKVY?+Qdg^X$WE5{>h-rQ@kzJO7FAuyg{`B3G)|4|B1<*_wW^3wC?` z04qj}Z88BUm5s^SN-bmhuS}EN`w7$%aRbZi6{bTPTjtSVpdhthtJt*?DmEn$ z#nimAQJ|CEx9inaxZW_^!EYQgHEl9Gwu>(NleUk3StQ{#+YD zhv2ZIn$wK9)z=Ey8V}J;Y$tF@Y^=H=xD6Cvfc^ ze(1%~^!UFq9eNg@hJ+*2pz&)xj$j9P{u-9!-v|uV1IFk0#Hzl+jHkj(B+MvFska@< z&|QU#K&!`Y&FSY$?%dnisCzo-xtLFol$wp2^r0RKZ~uyBTRrrf^yvz!1RDkUL<6vV zD^Wf#>>xn%Bv}E6>4??e`Ukp-?$KAk^o5e{Pu_EllAGLuC0dL*p5LKa!rpiscG&zh zXubJDDE#vqKUJ7?#oMlyJ5-MsdkbtLIkn238TL*@IrvYpi+}nB7kS4%S6#qG$;&k| z3nHU}wYEqT{l@MoHO6uepLJ5IOQyTKEmwFmnWL=ZWW^){aEpN^LLfsO@RK~ zY+@1<4)V3;yQ*ro&GA~K;P$VJIPRzaem6{^J-x>Lug_02UE_AG0w?P9go54@hp=&s zf*0wl)Jw*VIN*h-jw4eH=_(J+wyQ0p*y)L;e_N2;^jruI({#&h?e<>k>r^X9cjze# zef&=Zxd=6OJCBZ^4e~(?HxfnHBPBjvJV)pX2N)%acIJvOuLqdo@5*5{aAOSPExX_*^rLv`OK3Mh`w109QZF0W1P2NpNU)#+*aHXGudN?#%y`DNWmKaN zMjchGm~h;b#Dc8(p3ppTh?jPOO06(L0&#UkP@tM)Pq|lFgK{~==c#*pzRisLX_X50 z-@#>Pw84w4ZaPLn81M__4h^N%6D^U1$REcGanHlI0E7{zVD;D1!o=NTN3ZF8!XGK~ zk-J-DqCLL6v#qDrs@7{8vMi<&ai?-5Kv7Ql#QPzl7JD2GUYqFMj$FIYx?QH?jXc)P z7&lyK+f<4gSyX4Y6l%$7d^>eGI>7Yi8Sc?SvtFxLzEwYE$mIC@R*SBylw|5By>A+K zv0G_Wp!RdMeBw<^D@<(gTyA@KN?bVZsIQBn`khQDJnM&w*bVmKucJ(r^mCQvqAcPNyt&i}(FxzlJ+T!Kbm3)R-elfN0^KJ^WSKETB!xdvC z`@#jnM&?e}J`B;KzwUM00L@w7oTBT-(eBN)Dbo(3IwUSeufH0*z4oI06?3gZ%3mqX zOlxs%QSu238FEZyxI>iieGFGVnlwlRsdWqExHG({J|0Wl%@2{KsLUC>#0IDE}!7$(!QFOaQlchUsocsqXc`5eg|ykG-cw`RvR&PJSqjgGo(-)TCO)z z&2kigM>KEAt{;h^)Bi@ygp6NVI8F?^?j8O%C4tS#nwq5{=pJ-u@Q%=|ccgWA&S$wW z^-NrTOC44p#2OiOvm&UDGW5VTm|+J}`gzLh#cZtOuqr>-t6nWaeCwbH@aMw%sf@qt z2ilx+&iBrt1DBqqk;K_>omQ8T)t}q2a}IUC*og;=^Q6yzCIknlqaLnJZ5~9G_S-&p z$I5K%6=C~lX}@YQ-fPuMvsOAjh$VHBQ>@q6MGj{n zE^&m8+7tn;sx!k)>}C}e@9cyMe9a4Y0pbTyvp&XwK0eIRxzJ`vbjDn|28FmJm1{Lw z&e6ad3NUea>Tm_BpbC;k<0RxP_3Ti-`N#U1MB z&0w_#a|tc38qWhLTiX&n3YhkCm!4wySlYk=|o6BRgpTj0PbPN#)iVNR(Bs))xsHolS2a>+&F{NrFMX6~9`y51QiP;>Y zuGsgQyCb|^`7%X50jf*01&~QEe&s}ES7p+)13gg0&{_ao2P6m+A7QhG9QvhA~y+DhgGF%sV$8b z1s1e1%CW)&onBkq103UjD3?7DcLjeGJWz8iMV7rl?5f*j!z#m(RA$1#)RXW^mteG! zjxaGQlnMj=%x0;}kZ&QckgM-nd=hZ~f2#Y=u%^IEl7^;J?}aI*J2qv<5rIxMQe@YbAlA7qtmrhCc)G#yMB9W)=x@@S?-wf z830}Sx{KHp5bMsFtuXvv)QKw=ZwtaSW-gXIwo^Mfkoc?h(-WY4O~vbM=eqYpUs##T3cqvs`~0Hb(5Ll`rUyOkQdQu7GwL(~xLN*C2p`Wt z688OzS?6N_>Tu-eA(pA>2`MF_QA5-A@n3-)QxvF_Z$s1hys$J-@W*gffO&868Cn!B zOQ&`^D@}WpW8UxXhavQ3-g0CZF+Z<{pq8{ns!lDgk2M~tHVDS25OUMb>g?7*XCgY( z3jk+RH-75pgj`C7zb}ttv}0ubJbJyNkhiYa?>_X$FA$u4jPU;Lp78-utMK}tzAn&j zo~B#+qbpv_e%SS*D!3hpmpX%Q&InRx7T*KhOT#Ir%_;;vI{Q8|M=QehSE_w}!QbS0 ziw}E%Kb6Y;(xP#*$@XiUap2X6hoO>DEB~uSW3c$Z%RQywfxLhELD+F0^9Oxn_3i|_ z9^zz%cIhAR4@a=H8E=lvxGV4?VHv0S+%hDq0J4pZD)4+d+A8Rp73F`F*5Y?NyAPOI z*5yhs2CyC$GXyo0_Pu#B_5IWpj?Nb9N5dAHntqtvVc$k`Y`~+~Igb#UPl2@*ncqQG zhTlucjyv7HbxD7YfWfs$!xtmOd#N0sLqK?!z^!N1yt+E4^gjDZ?`r<%E1T;CQoGys zZYo%hz7r`Esi4;r;;pjB?_%av@LAWo5tGeBfct&$(_o}^8q7ILU8_4tYI(;Al-~R1%b4ll*P$0NQSGJOl~WRbWPm&bHM<1rCJcxOdi*9sZ5Voy znp5HwpO6T~r5YWnr}ccnPwO48POO~%%UT`r27D=k!1qBwq&JMic9;*N)YL&gM3NJ| z0GvMx6^+pkYzp1O>jV5Ua^skK!G4?d`;W?{*YEcNAzl~F!N^1tm}>^ffSF3_0q_DM zKerFEOO-z$w!jSMzgV9>gT?$T6g)h)R5m;Z**VEi8*NZKi^#W8gj4yT7Y8Jk1w*Co z1gbozHYZ$v;%=1C?rjk>=f#j-WKhgJVzBYx zZb{Sa%3YH{nEG7Sk*-FE279%~1pB;-7(+0Bo%(5NYK!ycrrgJ1&8j7(XduM#7kvE- zh#-!p>seG(!9%+r=`$L$6)i<$ohrT4E13NQ`c0f$rHh5*~mr5Axtfmv< zbl?4Gw(=uu2+y0im3DF+yg#$hu@|gi!h;geLAkH2*LRvg+zwgwEsoQ z8&d5N-cahgENF?!F)wy-#^ndTnO2 z48}y{R>4y7)(VenK7WN`HvMWr3k1teb#_0=+E3557?E}|4gLBAidy%guDX8b*Ep$B z!ckn)QE>F45Tet}vl?VOV~atWKS zhT|!qzs4o+DlHJ7Us(E{7g%}Fe;b(Us|Nnc)o@ZDg(C`HkFG@t7*YK>CTW=}-w7ux zC`YAHxW!(8ud#m=zN`ClpuzBY>+iHAIC49K2{1}JN4@7o@9|LNb!q<~IknySPB{rRiTR1YT>fb4 zsJ#!6$Y9Z-I{U8uhWMSTCXs{<>XWC#hDg-97hbMC3`3Q6d!MUXkZaexjeaxhAALoB zgR1IUYTa*DJF=I|n3x>MCZ+tdhk`dfDFrg}o)Y9+i51}IgqquJTkmW~}`1=VY`5C1{GTHWD+RKnP=R?_z+_fCss zTk6kPUiG*`BnQ|YXQ|t7jQyrf-Z2{kx9Pu)GiH}{kDa0d$sz9ewi-6wN>$TB5kjV) zx`97csxms}Ci=Px@uuk}*yrUt6{>9y=>J6+{Cc$(Fm(G`(IzJ0&LPgurAg0|uN}=! zPJiYB@Vson$g@k2zc0N_pWg-=D9BR*KFVj}(S*9SxUf~nS{zVQ>)YpyEx@D-&SyAn zk6+nK7T>?`2SaI-BmK}`GWyb`+^Wc3A#i{!c5#CR1bnrfk@o8kO5I`U_q<~levDRZ zOd$T3zxjD%M^FLhHt15DZr%KEyEQ{Yj0~^=`W`-fSX5rFwrUMbbxP6Ox1UUClKtLV zkl!RH<32P5CE_<;HZO^yk1_+Homt9u&c?~bkGdDFD%J9ik}MVOa+3#2hG1D(t4ue& z<#Vt!)hOqs;>#L-5wv;4)FopBr0lBoGtY;CfRc!nk+MY+X7QdVLyTyscZ?`%ao` zMKvQ5``_fNW(8Q4LECh~Z?Rl+@Xxg;uJZQ6BXYhCy2gsSxJ>Tlx?r}}cPpxx@X?W{Pp zC$|>}gghruug32q1Kn%GhAgqdc9JivZwlwGYnHlx_RH|II2QuTz_rKiUSEkt!@}T= zFoq)be10j{U{}suC2_W-&wVcCWwEv+{(y0d2D74nc6?&QR!R-F z>mEBw`}hmxmLg#!7RE?jcA&1!g?^vNR~6ntqic_!xB^D4!Q!wHdNxqW-yhH1%-*44o^ozzgY`f$R~ zp)0~T2Udl+ZU}ZDYCU#+7Vz?XC zW#A9NL1y|e7EBD<-p}`vIeqRkypw zU{99kK~1J8Jvx%oM#AQTXRlN0JNlHJYHys#FAWqhG-+-=JptvJV=lOx3z-tmm|IAo zjkUjl3|U4$+4IBEqZ~M{B#f~ov9Gl0cO0BomYtJ5fW?ID=n+Pzixv~`08zk(nW_?^ zA%V+YWL`Y#E*|IlI^t5k-E?*@GdTQb`O3R}@v5z4ce}TkQff?zCXR1{Z7LI+x7+G2 zTr21kJ@x@f3-6zeTGHTO#@If_xJ^2$!LB3U)+M-;M4NJ$c-hJ|o8*r@GN_-@%9Zwy z5$bg{c5O^)WU(xY3#bhxIn_>bhQ5asj$8Vb|F+0pbjmBK)QD74TwjZz#^GVKhWT(A zav>Vgv9L$ERmLFlj+;9;ko38Xp#rB0_#T>l3F*7cUP>sSXwQEYY3>GpB-MLz0JIi$ z>fJ168!&0HeTZOJR@=Zn5eikN_=Ul&%O&4vSVsg_W-DnW#=P{F@SPo&Ht)=NS4Zq* zF4LyHIKFlRs1k)%{9xPcpLT_km#)NZHe*h_Po_x$jo(>(Ajw;q{h8ogz+p9{kEPj+Mjqg ziU#H04Wr&o#EC71>wmc!;ghy2t;*Wo8lh&b6*YzGV=bR%mKBYu-AF3OdSm>`<;9X3yR6Ix0z)(F$ooF2y+vHoA7hkc<-j z63)Mb27zDRI(;IRlozdf76l5<-R`3S^ejQNtwP#Oyg|oo&cV_sT&0Fon?Zc&X6O!M z7q&16gdLS=vzGdUKM~zmf%#xa<^xcZfm6b~FeAHtxWmPHG$Rwm$!J9YW-oqc@@~3{ z-7iB%Ys1L?HH@=6RQz1Hr4%%}sNyB?nM^#$2mXYxU6{jo~S! z23YzXbebyx$Y$Kr(TXHg*)@Njf-OH6Hruq}_w8UrRps^(;^QmY7KT?9EA>E`89!jl zp_~u**msQ{m45ZO>7i7rZ?;QLojuI8{m zK<#lZqz05{lWh7hGKhZvx^=KFeCdTl&%cV!-l%f_Qt$#{sB^X| z@}u-fq+W=MbAvP%v-HQn!D(&6vEJeUU^TYQmx?V$-kMFvw&Hd1W4GTzru}*Z`dDUe zD&mCgNAWw$Yn{ijyI#kTIQDLw@J5$8|GLhGN`(5&Vp{4$>V`g8sHhIazk2l!3Wd%s z(n(2R!hs^jN{dBFTl}zsqGB0pus0+{*{O0CB}qkt326Nkmj^A)LwT!jGe_2oW__vq z2#h6>B71XW$MAgs61Ax7=XG1Rqs$bJE{Q=6)sQxf8|7+PZML;espx+ww z#EV~zunXhv-D?PQgbtiDe~vM>c67W(XLk%*Sz1c2W4~+la;@T%C|X50VV8t%iw^go zZ+hgeGSm7rLO*vZAWPn)s__?jU*VG*4>O4~fn%2(O2gtRn8O$%Bd71=3huMVm*X&x z>B|a=Cm#xa`Tj`zN7j4DGCI&!@O(ct!=Kug!RloP7v_TJy~mGHLb9R@6C`u;3Tu@6 za&esgJu0Cki#1;4$jbAgutmBur$^U#wu4S;2Oa&kfX>8y_I}UP9Jaqt#WFv0T*=_254cf<6SAYD_z=tme7s3&qrO%&G-4Y z`@P>sY-IzpRlX%Ap_Z;>UzQ0b`NWOFFI~z9qTx*^ahXtP@LWf>aeE8%cL2Hf1n>^q z8eIa|*`+|$+ktBOc>wxBmx_-CsU7JXcEEoGl5z}bce+6+Dg!J0a%w)3q;fnEU7CC7 zz~?>R^SJ=APrm0ZUKa!^z7YCS!9LV_f<&=II_Glt{zjf$^V3;+38L6F@Db38VWQwX z<#rG3({W?Ur$?q>c?GI}dCB_y+IJPN7Z=%n%d2f+la7~pK3Vdn6=&s|9n8&xJc%F8 z9k01CHKVRKKTSv>Q*oim;;Wg>YJE97G095lVxN#zsGfBW51Dz8OM z^*1KpzDz@ktZ++o8(TMQuEOTfudRiEVJmD^aGGoFdnh*TT-Xy(nFt!Po32Op2JH`a-R!DUKFd4wk^dG35d$vgT(grX= z*$Guf|0C^yuWyz_$PE+@xfLoN;Y9;Y=5=hF9UW@Ip6zS$GSBksS{(>wd7L*QO!gn1 z{<-mig@-RMb=i7vk;6a%UCQ`M<<_{AfpSd-F0l4(-Y1~@!9+6QCU534-{G3Qw?vhH zFkdrx{-*()@TzBVF$8d)aSvLY0b!tLAZY2OjXmMn((kK<*?%xSQnc)@Tf-WVYNF=Z zREMdQB+JWyrX!Il1(#KlxM^r@t{+qX<{Odpi%K^lcO9C3Pp_-fW9oZ858a)xTz42F--)D;EyqZb(&<+JSb7k$_{j(07Dl;*>;xW_Nj1>-{{kQ4Hc2?Kxo~9YwwT54;Z!4 zd`7lc`SpW`^bQz=L9afWjgJr+3e|F(lnhtw7LO9>8V~uTBD+?ob00=hchJsw&HXB-jxwm?iJj;RZe04My}fDrxksH;3KQmEvkcc-sd}lM`A}RN`NbT zD%t`K8t%0M%|?Q?G_)BMY$-)(p@@mHNQCCuro1z zuP#LfvG`IXkUI;SLfRZQ2x$M!hgux)HoY%wY{E~uvSX22 zL~|6_`@**2#D-erP5anVk^N;!%t6?_d-wcd+jh!Gv`R?CW1jG4MlsW(GR7f($zgMS z5WHSR;6W{D9j^WJe!#@Ru$L^~q7p$55UyDUq@&;A!x`fqcYy2<+W`%q(;u0%;XmH3 zzpXk@O~=ov!0$f0*-;AwEcVLCMt2);QrS9oXnq}Vw=hBQBA+2y?}f}w_Qg&YUM~TT zf{-Jtceu$8%^6$#$OEiet~Zcqq9-2z-1<{VrK-q!8PWf@sUt-?x#;;veklNin?2T= z#uo3pB{qI?xy9_y%VGSS9#wg>^dKOscwb#Q4k$Tev_p{9MFNk)s~K=L6m@Z_Q$oZ2 zsZYT8-0l)WN-ZZyZh`7Qc*rqDAK3aw8%{ZT#U+=7$h}{_)z?+N8nxZw>1y=U0?{dv zr5LKI6ymoMaP~s(f3Ah>{Tg#Pu8QasS4wMe!e`a<^sXiXHjxr!KE`dd&OQb8OApP7bSTfQ z?Sw7bNx;PahA#l!2G_zo6#uMnz5Dp&RJlz- zCBQi%R2eoi8*0$-O5HrC`J23$cf{!YfL?4vsii`)af(Y;Cr}Bp4LsX5Q0YG~Z{OVd zV!cwIca5>wJ`ZT`Fz5RIZqL2tt2iI+2bY@t1~^hZuNh~=Zz;?UFOC|`JD0Em_`lm) zKQ%$?)0BLMGr5Chd;6J32s?b2@rIuWf{%I5yg!$Ycd80_@35#8+deSERrJs9Jg)!x{Ti?3!{f&R#|x0&e}db*CqLj2tz3-|uPd!=c= zWLjVLjvr5nI%&%tG2b)D$#uHBgjP4;B4*h`UL+VlicEi9a(n3-RWLI-Z(pQ-IgnIiA$FGR0*kr9& zn5CSo&p}}71jp+!X}_lCSazn&B_b2ag&h6Sx%eu$)Sfv4=Tx1N-&sIrMBGJ9ouyZU zqptFrE7r4J~HlIiL05o^i0E>cCNPtFoW9;83T7&eel2{DR*P{{|$!< zl~Dm-5pK87pIWrujo{d=dE6Ymzi!B3G zZrEOY3KX95By?N91(D?H4hbI*f#|-*vnlo<-BAIVhJ-7;JS{czxhWv@L^_N@-+iONii^5{Pei_KfYH} z_+da-L>G{@uL9rhX|?zdTUn{zTQ@QzaHFm1kLMl&;Lty#o0-Q8UdH{;7pB(y|8XIx zc`*|M+134m53YQ367wJ9P|;O8)5v>UTSxs|3j`d2^yS_Uaa*m13-eQ598z(=tEf;; zpFUksXG1-ytXw%e>&sPL1-n{XIBomqcsiwrTE(!xmPK`_^sULxZ4Ogj8~$)TT|&e6 zt(0z0(Zr)2o8^F`l2fBxK_6;(a~ zr1SRR!ew+LmptoJg6Xw;9Yw^`)_&gf&-t}6b6Or<8~YGf?AmO~nM}hLzj@PCKS?8z z$)!NjUB5&?>&Ym6y?~_(1*;c^@uJdtUBeNKp_8PAOw5T`=~FImq(I0zBEP#WJiCCo z)NSQQoh!D(_JE@h1rp2B87hi80d-yplG-jnOBHNmj3`yh%#Rp{Pk#1H!k5XcgwhL6 zvi@T{yK_rc1Cc;pVGq_r#ReFQPz;Z|mz*f6O`L3f=`bDIKDC^gnYl>IA|)i}CB>uV z6%lR{a^^|=AsJEirSh9iBD z+1wwi{M#Qh4mJoa0+4Sn@yGR7yJQUBuj>VkUEq~vj@BL58ZL8-GeH|P0x9yIK*QP! zAeAd^zqk{!8YtdHHyklTt)xmQeQo*zO!0*XEtOm|beJ4Z-YjD*nGiOoLuzXaW%>1& z_Z4Hz(0C0uBC{cq(Z^#m#>rLw>64^j*2StuRya_(N+hj9-}}_F7cUO9Rt;NYz!vx` zh_u5>O2u&PvdCp`2LiI5U$uAt{u;kDozPT=p0D}Dbzm2lr$AaRWw*561P8XZ@(Uo9 z_5dD%8wg*{Na;P*Kb`P|6AX0pns<+mQmHICH&7jvCGnvIG4$3sYi_uHAaZHS?kGw; zo(Oq+{dT=jz)wofl8`H5opZI>LJ*&AkOnasVe{%ume`ss}j$6yAcf#*=0TjMU!-r8{ z8n*clbU~b)7w&8oary-3%-U%tP8RFY9Ozl^vIepwe(kr}x(+10e$A^Lc42oUB}(k##fy()%~4w|_ntj_?ChDQ2MtwR906Ao(|FV~cAK&u#hwt#>SG(E z5Rm-wftW5rE)H138S}ZJJJLhm|I)~0=hl@3Q}k6g?SDcDg-JSf0#a;kqEZ}~%i8^d zJ0i+OMlCYIt)Ew6t$xr{^qOfuiFYMolEP913KEKHcch08ALP$s0}!()W5L8TvwTW= z=j_BXJtAheex)*(&DWnR?_{#Vzl| zP-IULe+*!cVvM{sKPD3NcI!-y?Bchfw6VkTjEsN@6qA9DI$HtZdM+=FHv?&sZv=x# zN(5+qRmwJ{wQUiYL8_>fsX@(NR$IM>@Y$jIV$t730hHm zq_o(^=LtiC4!6-pcUDdO$&{=}m&*-SW-H!yAn}Y<>dTeyqw zBq|35sb5`)B&H1>%k7F-8Qr=Zv|rKoR|YEBbX`ixuI%?5)AasOl(vMF2k|+rn=YIr z@^V%Jz;!s64-X?tgd!?+Zv}&o9#Xc+@UH((zyci^sc!IKbd8yhHZ5}Z#t?`-0Uaaq zN}vWJBhRx+v1(+fw#b-bQ5w`B_eIOJU24s6n(M^&CB+2nXa8hPX4zC*D6rPqhWv@f zTd1Dwm%+e|r(8dFS#<3@5NNAEXHr5r;h+I3n0<#*+bnagdTI6a}- zP<;}2$&tvDyqzI>dQrE9t1HKxYhB~gyykXzC6RF_0YVG*6{8cK}d zj8(-C6s_?`yO`I=W@z?QRU!(l8}7fZO|N6|I;c4)iVqoz{P^f)Y2aw)som~y=7ZZHfN8SUa2!d0aI6|oYb69 z|3;t(Uy0QzhBhI6w9yur2_E*1Sww=KKYppa8>m79Q)H;xy=Bxb#z=+r-k*-RmT)`( ztdZtULB3M%#{Lm7!O<=Q0eR=pCK%X^+)X4QPdQp*f?pc@YQr+7|q?2nHgdUlBp$3IqwT<^Ch=UNq7cgwY4;r^HVCQ)sBuIfgb{OB~{uQ_*71)3z4^ zsyok!f{vJcxvWuBbOLDGmM($d3v#4+h~;i-ms?aqUBD3Qktz`xF`Gf;g;1TsyYEE+ zo1Kd2a~o$a)&Lb`Li^Tdu}tQ<)v2s)REs*t;5PN;Ps?itPy#AfpDto$rsZs_4+Y7% zJHqBFmbcsk>IV^&>pPXI2JNFjb98vZb&4w^V)6D_a1_$0CMrWg#(s%O#R$ky%cz79 z8Exnd$-sA;m+?IP3@9;Q0-wb>aj&1HEpz|IFKAJh{mP0Kvv0DEQ+h;ySsW$0r8rsB z&SwM@))!wlvY387MG?mmK!Rv*+IeP_3eVtHTe|Uujn72Qja(H5cA~ALCfA&$T?I=h z_cyG{9aJ{zU`W!nt5(~ML<>k09vODnc0qBA3-6&qNuJ1;L3v7e<1Wpn2l5%V;@oLK zmlrY&L2F-5Q&;oMvu5(W7gw~qFB6~YB0YS2RdPM1r&F&b z_)?$-7@pN4Vs^?hllS|xT-9qK;G+r+oM;xz82!zxwJy|_kTVt|+Fv9QIF_RLb zid;!Ln%Zx$?=w(@iYX?Hpq-FWn>c?b=QzcOm{P65v_NtrN*vKGEYJROub?h-qkyIN zeVjM&%>f2)kF!5vhCGMPi?$WU3H02DjS|Wz6lYOrC@B z*z*tJrpr%B5>cLnjHiqJY-wnJ%5#hUiM{%5%h`2!R4)GIQ+ZHTlnhTbH@5{w+O|F3 zF@yTKv!XnT6(BIDxgPqUt5+E;l&j{VR$Uv+JY&UA;dN@3h=Tl_he-z8DK zKXNlp$}_$|s^7xArGAL;#P1-zZuWD_wq3;*+bS^PKfdVOZ%&T;v58|tw1^Quz7u=0 z+vwjEoNUMFamK}s^?BifjwHSA?>qmD$wK}8Sh4BA=jd6V#U$K?X30ll7X^6+ngd{rW(>*2-J zq;Ia!&jTmEm4SQJ`273-I1|5-si*#+e=G19@&fwJ^Q&`3`&;Emshn?){ad>&zQq{N z#Q3qH$nJ5oCZL+kzYRuM>J3eN8`16j?@{U-60+wOXeF=m#WAfISMd9>2b6JreTFZD<8lj|wnSPgtt z0BX;vvDH|*S$P2O{fc$yun=*X-vQG9CgK?t_JXrml)>RKd4|#2R9&n}{G(okFc$69 z#TQw9O}#iJ?E;-|bgALS_Mo5x%}j?FMS#ljWydT27Gi!EjToQ~MS`S=&h ze{wnTF*epr_oQ(p2d89u<1Jju1w}6fGNU-JB%6MKT}ateFfQ;nZJNo&rBq4i937i8 zvZQu~uBp}3;!`*ev?gok-9!}?s8IGA6ck_gv4$jPt#3t6vg;1RFL$fctcSRC?sL}b zZmQA6wY%Te!L2YmvhaHAN0PtYucai6v2(hA;$c4?W)ugX=SPhZNt_Z(;UL^dh z2P6?R5*=$})6Bzqu7slCz z%)De)kZmYy+Xcz6&?YP;dHMU&k9*nD<^r5v9?RYR&=#jW zHta2=E+wvzU&Lw~%egBn-s6Jr5^IbGe_i-^S8jiaB2_cXUf8ik_9M+nO4z=5Ya~}Z z<<45=%pgnuhPYv!CoQ(&Spm!0Ds-2s9Jr?n*0ui58)suh>+Ho5SDmRTcLWb%#K`YkPk(jr zQ>><>rD2hWfmZcivXPlGQzb)sA#?rm=JZa2-WSiNw-T~oYd`kYWnRx#G2FaF(9rC> zD>74uT;;HX-5HQ@lj$r*vPp5_hi*&izy~!BUi$(;L^X{yU#^Mb__+<4Q*lV}g6 z_!Z`Op%17~QCP*66F~nwc!ajn`_`Mc)hz^`@J_gR!i~mHNt%WYBSM;@933mIzGJYovFVqq$$XOp=X-HDbrw(i+58A-)QZ_Xm&4>`YtxyI%42ftOFy3*8}OO zT3vrVk1$Y|9iyqt2v8Sc7G&Y-)7bj^7xb`|u=TqnS?~~OtlWXf5ULjZF7ib(TNqdB z#vAU&{XmmbSQ|6jsPwrj$=QWca)&nZ` zeF&wO>PlGy5^X4U4c_O_O8i9VTp6V4frW7mnwlavPUu#LB7^C0Bt$z^uzpt#ALQQD zF$3OTq)0PEs)n^_Wir0LGE+`jA-mG3>A@MLl(omq%Pkoyw};rV^C<)0b4KOu&e>ZxamT>SPD zpGjA$RmMIho3o}%b7c)_`-2$o=iRi&)?d()uB3O?!>4CrPlaF5>t8(AQ&`|Sd>X@N z-zCW@rt)LMQ=TyVq``KEgDMU~_+u`MK%dJ3L?RkspvJ?`GJ9W& znN_t0(B^Mvi^&h$&NK1ee4j#CnodfUjD3yC~nLw$h5f)vw@_b;&wPPI+-w%Bhv?NzurnYGFMo8n$lt}jDTPV02y z;aPsG$$nvTxar!tQ@ADGIL7AtD#!V< zpMLCTpNv2-hRsX3a?Socm}la~TlTrr*GjCySQ0_w=jpbc1!$FN z`(eDF{za375X@rodAa?Hi7(VV#-RpWpUS>#+GsQ(Jj{-8)2ivw2eELK2RGO9%Vq(n z!O;pCKjEJ0T4kpD44w9bv&^a)ayP_RfnAvh|Kkj_l2GBhQhVz<;7*6{C!!_ym%2MO zxtd)pDn=r`S3Z6SadKx#EY#kW8`eDzz$-a$@JJ3FuCH#2jt!SSxWKvH&4L-NL49jJ zwk5G?28BfwbPZx&nBh%R4LCuHF+I^7Koscze4&n+w|M3VNRz%wTD78vU#+=6R6t>s zR7R{fNCb2`j{74>rxtY}UFyy7VEu0}>sESmr2>N+e*o^JO}@QHHUm+K`xR3)El~e>tc1*?l?I-e3i&BsCtRo?n*(xmvH@yL zS}~nv%m6a?9?hBxj{=71LQ&r7(cxG#)YYEvdL&GF;0=m04S|;P294zA z!IGuT4PvVMFY4JMkc~&2IvZyt7UGPF5!QMKgIbni^MmDjij=bEFfW~m?5dr|vk|pk z;HF-jtaOClSc?a-jA2E#0ns#%kL7#QE{R^KD}#h0oPdyaR8yXpn25DuQ6X8Ftv8R6 zGp)}rf)ET`h^W|L|G1kWp>~`KbMr)^aAkom-D5T2hzxIvwsS*BGwY2~_*cJepjo}j zOWJ5YoL3HgBzMdjEmU=Rr%q?vn5ukOlh~c`qF&9V+X6T?%y-NVvR;(5b8Ki3gutqa z0C6-x2N_eJt9FOUNdHzkRayo&rmqoDb_jtRkiW9caOcZw$>_lIO#{2*wCG&Ge!(!; z2!BE0^;mC2GFvVRVj!cc?Lw8@N(gVF8l|}9(yo;RwMx;Weugt=p_m9fBuxM20lgYY zqi;L;ExT8PzJ?cb^;fyK90fWtrruo^b>Ltreic3}m0cv5_ySE>;68V$JMkI>^*vZ) zuyDI<=wc@+41Hi2p;UuNUiJb+T)HT>XI{Zgh{|^Bn`6rjzYL~&^nvLBBoRtbbWnzfe-${_5= zXE#Kgx~Yv;u|+h$i#=LMJS82eHYPBVm3Fi?0A2e_*-%2_ugWB4QPMi<1DXaBV{I!7 ze8@bAkz;Vw%WKDs`90!A(jjhrQGldtNn+tj1!Y=emG{KthYpl7#N5)Tl9uVhN$;#> zw*gcfa@m5;WzQ=zK>39zVeeb0ppGEAGvVgqbZneQa!Ml^Gaod!S{9&8nUGwy>t#6d zwEMw71chru{DfI-k|10$wmQW9pcEPu;BYlr$gIhJV`?)fA(4oZv7hwEFi-&pwIPX) ztjL$M?1S295LOZsw|opi)Sw--sMKaxo=!J0O<{L;lFHaPAm%_{Yla3w*t}0UR`5DXANwgyUoclU?&;PLrx_NcXUaXS~N-x6OaLt3m2o=B;neiJ&IHu-5C2yPfPV;}?SGlc%h&PG{l1G`Bg#Z4QsUe@hK2zaDSU%MEd zM3K?on7k||FlItSqbq4L3q#VE7aWDfSkh_$%1WuQM;PfC@p>jJ(dY`q){yA28MKyD z7B$a)eMBtfN}_G~X_p4#>FhSlN5eri0;5b9B&0ket-{-V_^Ve86nlY1Nl`u-+`-V} zhU-bThr^pDw#g>Eu)Mr%kdiVEA9-=D)q|sVdaTwv?JR+b|EQAi=*3M))6?e5Ipp}2 z{=70})$1-NdTF}Vl3DAKf~y+`xUmrsIZPgI+s@{MhPI=&as_U<$bp#^%#`>-f}E_t zn99icR{)JsyhV06Ne)4&>Z0wuF%7!b)}s34h13#?aao}QLY zqXbA??U=1{MvxFykmlqc&_M@G7M{wFTQYD^E@93I&h!bIbCd_rjXbn5IM&DV2X@Fr zrGO;=3*dvulREtUm>PBiV3P{!4T>iHLyXD-lyK6H$n#5g;u`{ryJ;w{U-+#Ql`jVP zQYIL7f`L8kuM(fF+UJIjRS{^6O{@O{FM+TcV<{=m?;ukUIOJsp;5XtYJggoc Date: Tue, 15 Apr 2025 00:48:45 +0800 Subject: [PATCH 7/8] Fix prometheus could not fetch metrics Signed-off-by: kerthcet --- config/prometheus/monitor.yaml | 3 ++- config/prometheus/serviceaccount.yaml | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/config/prometheus/monitor.yaml b/config/prometheus/monitor.yaml index 52e90517..5d481aa2 100644 --- a/config/prometheus/monitor.yaml +++ b/config/prometheus/monitor.yaml @@ -22,4 +22,5 @@ spec: insecureSkipVerify: true selector: matchLabels: - control-plane: controller-manager + app.kubernetes.io/created-by: llmaz + app.kubernetes.io/name: service diff --git a/config/prometheus/serviceaccount.yaml b/config/prometheus/serviceaccount.yaml index 7591a71d..05f26a88 100644 --- a/config/prometheus/serviceaccount.yaml +++ b/config/prometheus/serviceaccount.yaml @@ -34,4 +34,4 @@ roleRef: subjects: - kind: ServiceAccount name: prometheus - namespace: system + namespace: llmaz-system From 1358a6604f1db7a15e552fd3189a51656ec0fa31 Mon Sep 17 00:00:00 2001 From: kerthcet Date: Tue, 15 Apr 2025 17:38:46 +0800 Subject: [PATCH 8/8] Update Signed-off-by: kerthcet --- Makefile | 2 +- config/prometheus/monitor.yaml | 3 --- config/prometheus/prometheus.yaml | 1 - 3 files changed, 1 insertion(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 95a56625..41387839 100644 --- a/Makefile +++ b/Makefile @@ -308,7 +308,7 @@ HELMIFY ?= $(LOCALBIN)/helmify .PHONY: helmify helmify: $(HELMIFY) ## Download helmify locally if necessary. $(HELMIFY): $(LOCALBIN) - test -s $(LOCALBIN)/helmify || GOBIN=$(LOCALBIN) go install github.com/arttor/helmify/cmd/helmify@v0.4.17 + test -s $(LOCALBIN)/helmify || GOBIN=$(LOCALBIN) go install github.com/arttor/helmify/cmd/helmify@v0.4.18 .PHONY: helm helm: manifests kustomize helmify diff --git a/config/prometheus/monitor.yaml b/config/prometheus/monitor.yaml index 5d481aa2..e6ed6b64 100644 --- a/config/prometheus/monitor.yaml +++ b/config/prometheus/monitor.yaml @@ -5,11 +5,9 @@ metadata: labels: control-plane: controller-manager app.kubernetes.io/name: servicemonitor - app.kubernetes.io/instance: controller-manager-metrics-monitor app.kubernetes.io/component: metrics app.kubernetes.io/created-by: llmaz app.kubernetes.io/part-of: llmaz - app.kubernetes.io/managed-by: kustomize name: controller-manager-metrics-monitor namespace: system spec: @@ -22,5 +20,4 @@ spec: insecureSkipVerify: true selector: matchLabels: - app.kubernetes.io/created-by: llmaz app.kubernetes.io/name: service diff --git a/config/prometheus/prometheus.yaml b/config/prometheus/prometheus.yaml index 7f831745..53d2501e 100644 --- a/config/prometheus/prometheus.yaml +++ b/config/prometheus/prometheus.yaml @@ -8,7 +8,6 @@ spec: # Associated ServiceMonitor selector serviceMonitorSelector: # Need to match the label in ServiceMonitor - # https://github.com/kubernetes-sigs/jobset/blob/main/config/components/prometheus/monitor.yaml#L7 matchLabels: control-plane: controller-manager resources: