From f26372d200dd814fb05adc3e861fdf2217a32794 Mon Sep 17 00:00:00 2001 From: cherukum-amazon Date: Thu, 6 Nov 2025 12:46:34 -0800 Subject: [PATCH] Add blog post: Introduction to Valkey helm chart Signed-off-by: cherukum-amazon --- .../2025-11-05-valkey-helm-chart/index.md | 141 ++++++++++++++++++ static/assets/media/featured/valkey-helm.webp | Bin 0 -> 16792 bytes 2 files changed, 141 insertions(+) create mode 100644 content/blog/2025-11-05-valkey-helm-chart/index.md create mode 100644 static/assets/media/featured/valkey-helm.webp diff --git a/content/blog/2025-11-05-valkey-helm-chart/index.md b/content/blog/2025-11-05-valkey-helm-chart/index.md new file mode 100644 index 00000000..ff74c041 --- /dev/null +++ b/content/blog/2025-11-05-valkey-helm-chart/index.md @@ -0,0 +1,141 @@ ++++ +title = "Valkey Helm: The new way to deploy Valkey on Kubernetes" +date = 2025-11-05 +description = "A guide on why the new Valkey Helm chart exists, how it helps, and how to migrate from Bitnami." +author = ["maheshcherukumilli"] +[extra] +featured = true +featured_image = "/assets/media/featured/valkey-helm.webp" ++++ + +## Bitnami changes and why it matters + +Bitnami is changing how it publishes and supports many container images and Helm charts (**see [charts issue #35164](https://github.com/bitnami/charts/issues/35164), [charts issue #36215](https://github.com/bitnami/charts/issues/36215), and the [Bitnami Secure Images announcement](https://news.broadcom.com/app-dev/broadcom-introduces-bitnami-secure-images-for-production-ready-containerized-applications)**). Some images move behind new terms, and older tags may not be available as before. If your pipelines pull Bitnami charts or images during deploys, you can see rollouts fail (ImagePullBackOff, auth/404), clusters drift (staging keeps old cached bits while prod can’t pull or resolves a different tag), and “invisible” upgrades when a moved tag points to a new digest. During incidents, rollbacks slow down or fail because the old image isn’t fetchable. Compliance can break, security patches can stall behind limits or paywalls, and you may face surprise licensing or mirroring costs. Net effect: slower releases, harder debugging, inconsistent environments, and higher operational and business risk. + +To reduce the impact on Valkey deployments, the community created an official, project-owned Helm chart (**request: [issue #2371](https://github.com/valkey-io/valkey/issues/2371)**, **chart: [valkey-helm](https://github.com/valkey-io/valkey-helm)**). With the official chart, you can pin chart and image versions, keep `values.yaml` in code, and upgrade on your schedule without depending on vendor policy changes. + +### Why a Valkey maintained chart helps + +With the official chart, you run what you intend, not what a third party changes. Pin a chart release from the Valkey repo (for example `--version 0.7.7` from [https://github.com/valkey-io/valkey-helm](https://github.com/valkey-io/valkey-helm)) and lock the Valkey image tag in your `values.yaml`. Because the chart follows Valkey releases and docs, you can bump versions in a pull request, test in staging, then promote the same versions to production. If something breaks, use Helm history to roll back with `helm rollback `. Keep your values in source control, often per environment (`values.staging.yaml`, `values.prod.yaml`), and you get a clean GitOps flow. For details and examples, see the README: https://github.com/valkey-io/valkey-helm#readme. + + +### Essential capabilities in the Valkey Helm Chart. + +This chart focuses on the basics. It gives you a clean default and a few knobs you actually need. + +* **Small cache for one service.** One Valkey pod, no persistence, ClusterIP service. Fast to start. Good for stateless caches. See the install steps in the README: [https://github.com/valkey-io/valkey-helm](https://github.com/valkey-io/valkey-helm). +* **Read-heavy traffic.** One primary with two replicas. Point reads at a separate service if you prefer. Writes still go to the primary. Configure replicas in `values.yaml` and upgrade with Helm. +* **Simple durability.** Turn on PVCs. Pick a storage class your cluster supports. Back up PVCs with your platform’s snapshot tools while chart-level hooks are being designed. +* **Safe deploys.** Pin your chart version and Valkey image tag in `values.yaml`. Use `helm diff` in CI. If probes fail after an upgrade, roll back immediately with Helm. + +## How to migrate from Bitnami to the Valkey Helm chart (in-place). + +**This path has downtime.** Plan a short **maintenance window** and pause writers during the swap. + +### 1) Find your release and namespace + +``` +helm list --all-namespaces# Example: NAME=valkey-prod NAMESPACE=acme-valkey +kubectl get pods,svc,sts,pvc -n acme-valkey + +``` + +### 1) Back up and capture current values + +``` +helm get values valkey-prod -n acme-valkey -o yaml > current-values.yaml# Also take an AOF/RDB or storage snapshot + +``` + +### 2) Add the Valkey-helm repo + +``` +helm repo add valkey https://valkey.io/valkey-helm/ +helm repo update +``` + +### 3) Prepare migration overrides + +Match names so the new chart **reuses the same PVCs and Services**. Create `migrate-values.yaml`: + +``` +# Set to the names your Bitnami release created +nameOverride: "" # e.g., "valkey" +fullnameOverride: "" # e.g., "valkey-master" +service: +name: "" # e.g., "valkey" +port: 6379 +persistence: +enabled: true +size: "" # e.g., "8Gi" +storageClass: "" + +``` + +Tip: confirm with + +``` +kubectl get sts,svc,pvc -n acme-valkey -o wide +``` + +### 4) Dry run (recommended) + +``` +helm upgrade valkey-prod valkey/valkey \ + -n acme-valkey \ + -f current-values.yaml \ + -f migrate-values.yaml \ + --dry-run +``` + +### 5) Enter maintenance window (pause writes) + +### 6) Perform the in-place swap + +``` +helm upgrade valkey-prod valkey/valkey \ + -n acme-valkey \ + -f current-values.yaml \ + -f migrate-values.yaml \ + --atomic --wait --timeout 10m +``` + +`--atomic` will auto-rollback if health checks fail. + +### 7) Verify and reopen traffic + +``` +helm status valkey-prod -n acme-valkey +kubectl get pods,svc,sts,pvc -n acme-valkey +``` + +### Rollback (if needed) + +``` +helm history valkey-prod -n acme-valkey +helm rollback valkey-prod -n acme-valkey --wait + +``` + +**Notes** + +* PVC reuse depends on matching names; `fullnameOverride` is key. +* Keep ports and Service names the same to avoid app changes. +* Copy auth/TLS settings into the new chart before the swap. + +If you run into issues use the chart repo issues at https://github.com/valkey-io/valkey-helm/issues. + +## Next steps + +This is the rough plan. We will keep the work visible in the repo at [https://github.com/valkey-io/valkey-helm](https://github.com/valkey-io/valkey-helm). + +* **Cluster mode.** Make it easy to run primaries and replicas across slots with sane defaults. +* **Security.** Expose TLS, auth, and Secrets cleanly in values, with copy-paste examples. +* **Observability.** Add a metrics toggle (Prometheus exporter and sample dashboards). +* **Backups.** Provide a simple path to schedule snapshots and store them in S3 or GCS. +* **Upgrades.** Publish notes tied to Valkey releases. Add hooks and checks so failures are obvious and quick to revert. +* **Docs.** Keep them short. Add clear examples. Link to deeper guides only when needed. + +If you currently rely on Bitnami, test this chart in a dev cluster and try your normal workflows. If something is missing, open an issue at [https://github.com/valkey-io/valkey-helm/issues](https://github.com/valkey-io/valkey-helm/issues). Once you try out the official Valkey helm chart please share feedback so the chart grows in the right direction. + + diff --git a/static/assets/media/featured/valkey-helm.webp b/static/assets/media/featured/valkey-helm.webp new file mode 100644 index 0000000000000000000000000000000000000000..5a3d7d9624b9b055be1b52f8b6fe326227695b6e GIT binary patch literal 16792 zcmeI3Q;;Ui(&yXuv~6SBc2C>3ZJX1!ji+r})3&B<+qRy4&v*80?9JZn?&Vikby1O# zRq@ZvUu0D&ONomo2!nuV{1Q=ASL7lN`Dcz&37QK^3jzTGAz;UmEk#a7Mnc+hsu_qF zX<`3yllckUS*77wxx9M>=4ihuqnJEFKLd7v-JVVsgut(|PlvC+S9xM@k{1AJ`~%G1 z+>?awv-jYQ@K?bVCTBr_py@XVP*o5Z-~@!f3!XK|U^)lB^t%4p@7?!412UaMe_#9+ zT??2EeuD<2H*r1zKLnb40*QcMT|8>RI8_zfW)?panSbtp9BSBzhIR_fG^e1F?YNpMT$g3Gqk3Rp4nr)MwFK z4iI>C@H_~V=&-oZ0M>08u1BVvzq^V`G23xe~EwsLcF=VnE-t9Kj)E(a4IN-I}@M0-;T%dze{E* z5JqMbg*ZJv_h6RqKLV1InGmXQ-v3g@zR98PH}9@cW5)T9rQ7J%ji`Q-Ig4!LJ&^4t z%2;A4ikXXJ`hQE41)hZFS1+AUDLUsU=BCmgyCH14#mn2_|0uL~6ij+mJHRvX>Enk= zo{Hj8gg9#PpVOl=M_y5bdTW-C5ht1$tnQL}IRm4uk5>-i&+V3Ns$ z{E+<-645AeSonW=6g)L)2!=mv=j{Uz?9J)jD||5M3L?@43r>=rN%VkDH;ELuT!>W&eY1AZ>wPp0^**2CDti3n z;0CF{J@}S1LW*sE1*4|IMsz)$d(PXC3xy5ya2Z^jubkAqj_iOryc=BtIX(DmPn@@5 z=6}WXZPWxTGV$3Q_#FFz=ISEcAgU$lIx%A93|>AwX96oS#B2IKOV*Lvr6DH>rIqmy z0QXD#RF565#3bNX6~G$pWnhWscEysHG8n-rj4EEWDBYwZNiHq_<~g zXjuqS6Cqm8b%Mk``^YCHY+6AA6dR$QGoRGhSuguQ{ znAP(fPo%(8G6iBbxtFL~RebWjf2;hU{fheT?mSCm?kF4!CGY4^+e{(?sspW66WVp>3TUlPbvG_VNL0g z>;Jq z?QrZQ{;l-AC3*aND*_zt0NRjYE4uq9F@Q~>@N@qG7dk>Q5Cdx2_R}0F^aOEv;!-cE z2zm9etI_oe&%{XF-eB;YwVaN#Fjb_Onp5Wc4g6OU~1O>FgVKM7zE?eJc=h`HL+90zyvb zbj{FhjNdLCyMv2O+(F`}qkuG+GqfK%Zw!HA1GOdf;=~9(TCo6=I1EGH$Q1n*7l?I% zoa@jc4$Elo{>Q$s$l<&q1~#qN58l+qH_K4;#@Pv*QW$-{r&hg`aR_;v?z5N9BG-*Ch3~ zleBrfelEVmLjb_8FN!%?zzj`vGM&Xpwf#QG@zc|# zmNCTUND-Jf=p!M&B99WVJLMPK%Jdl_$HKpI)4wnx? zlJf7PG-)OHHek)=5=ulQEC=zwGG+e!N~Y1?yW?g|MIqhi03HM^V9MnISVzFuGn24w zPL8uUneuNMIi)M3l<-TCW3m^csorX|FLa3WrRqTdM+&Jzm;~6kY<&1rg;}mSKL!UY zI{sI!!IqY#G`4fXLp7pV?D>?D-o3pra2@!(xI$GsAE1f;H_)&VFf^0)S_erJOJoc@ zK}i`?)bkv1T1f2Q^t0H&`U)K-VVJJoLH@g_IYMWMNZ0ZwtgvngF}Ed3 z{r|x1xga3l-*v)}P>EG?0?@U`B%_mHL52QLjd{eN3K;Xa^Nz)?#O{(6@he*a7M6oB*P{ zaO86)AM~{dCAXgfGsSO`HUQ;7kHn?yYuYM#QNHw594wV)_4kEj_yxedd%8* z#s03M?>e(g5XV|1mojD z?=a{aKBGz;7Sj}2+K$9zrmX~}b|vZ3E{voa{Ajj)m$foTxgV)0JMyfbo3_S7{Pk|7Y_DXbAC&<}-Kq{Z-GEQD_aj>cK!&12cAgl7{Iv4zgR5}CU zaLtb>P+XSAOnI&>98v|NM)m-&q7h&^(QWLWYgJy}NIX2tv~x=d4jm_{X2JLN zI5@+~x$YJVTCDUZy(aRAoB55v(hkRJYp&;Y4u>7Hvw?HQ8_arSQWqZnO!EEqe+~zVB~sV{ch z{BIMKi$y0sVcb`>)Igy6BsV;9YYx)R5v-N5906@P?SkdTFlgB4?Dq^Rd*TP_m7D*{ z*_t)Whv0#Kg_{HcFI^mvquXIO4{c4%_x3qOx&~m6_TYZn5D*Ksr8rs>^$0EOAmxIV z78fxk`wK}nFR=7hHpOJNPki&>TH=p&8bN51jh@qBK+h(+66Mu0eT{T1R)L)+FN;;* zW1o>C{cRu-9UcGVA}B=d85W88U+8nKN&bGVw;FVx?RJ0B$&f^$tkPI}LLqswf=k>G zlq}=;kU2id>Rtm$NkItUcJi8jsS1|Ehy@?wl?52m=0)3k^uoOT@^3n6$qRb0m65^j zDY|Ut%>%@*hQEQk*4>Qm&vpK-R=#>2Hh`mWs1KwmU)?=NJ(Gk@frOUMrKBKlT5E8J zC;Xbx0iiqlt}0SZTJ(fOfQl*P3vCjvoIKO_vTiOzRE3R|HeGA=X}hj$uZxYjPtDg` zmE-9*)5X2G6iG2c27E^S*N>~gLalo&;>VU=-q4^*laFX^@bmi7?cueYrSjdP9IoL^ z9k|WK%_z|w&zLMq>W;_$De>^^mxQ_2k041M2Inbk=QD?FATgF-702eLO)uelw24#^ z<yosS(z4FTCP)*1apu_cFYqx&)Xm~ue8+AoK^_wUEPxnc6Y-UZDrV&(9X{@1xh zP*q7jmn~E-cD-2RtIqL4dofOcjC3{`l0xRF_5kL{Cv_n^(CCj}8QNsx2yMA7eZVZ`@l38|sHWHfKDC`n&yQ zd$r>^oZzS7*4h`YdypsJ!dd&vAR9Pv;%UJ^Nj+{AUv8rGg>7#ebGNf{v5B?^{H$2ZDAb%c=lMDxF$q=@S)np!Yq8#l|TZI~ZC#5(XO*yBa7Qh|jRNrK$x)bT* zwWAnOF-OpSF2p{;Dgi>~o|^T9oghOr5^np^oca(U+=QQ+pV7K*-Sa3(kP2m>WzO{R z8RthmK>zB@+j1rSx(vnQTk4Gc%_I`Q66a{OEn%x8Ro)j#sE{sYL$zzQNdIf#gcReH z7zL&qBU;0E95P%BO9%d;jtJZ?!gMc;iuTp=#i%Ix)z)e;8}nD@j~$jEdi`2~QGvm{ z&0@E-H8LSNB;tiy0+XD0F}GJ5(ZamyX!~3igtDm$GVLxFUpiC1kda#>qs!n_YiG#!QeTK1&W810bv~ zR^R+X^wb9|?Pb)gk|E$9?DUq2{aE&;O!cnGSWvyQSU+;GZie_+ugO%pSV*f4#R@D_ ziPTv}d19&w`ZxaAVR%lTU*Ta`8j31(W<>rNrm@E&$;6oi#Am&je6Lk6E=lG}=@nAO z052=Yd+v!(47|k;{;Kx7_P(4)nJWhoEay3cVN>pW_>8tw0>DF$T=Np)iQwpn7;Z=`fz0bF67?H z>Ww9w^70@yPib&9RUO3zO)8dx81GGX>gUlM-E-sq%avv6pmpe->O<6?9;x54!M%K$ z$Pyv4vRnNXKy`RLGP0lH1<%iP4JQN#;IIPa)%>-2bLP4X_SlggbUWUC%x?b5tg)L03db^RD01I(Knr9(m12vMXF|SURt2P)l+EP28 zHiVp995`ieogXdtoH)sEE@%7HklKUbn(*?l<>y2z0{fYtiiTZB1Qgy)#{qqtiW8)+ zhw1Bc7DI>w)Ue5ZcwQH&TU^gk+PQdyMwlSMz&4d(dd|{zPDVwPn{(1YYf5N9s@nL> zh?T_Hs>b*MLvh+IQ%^rHu=r~rb1?coG*sogHNWAn0l@ zU^(#6tI4n_FE3%4KU>)ZSP^*rNaVP@_0qxfL4I$}fv>@tyc)0QuAB;Oz7;QE7P}q_ z8tG1f`d#oXKqZr$Mp$QwVP9|V@#P%+v^|>;{1Snf)>!ISF*+p73%!Cu7*OvQL$~j( zn`Zqk@HR$k-F6LdE%7N7vn?~M!5nBD!xs@jBBWF2XluXwGC53hmUqfs>CGarA?#p0 zbio_K_T{S+kzjt8gc$XcYkc_8kl(I}kqpq654MLKS9K(gR&La8B7=Z%GAhc5cQ=wWsbzbS=hsavq|GOcjm{F)U`Mb086x$TLsRM6>$af*l9fsZj5HV z3vjTtnVIWfzI#Gzg315M0Zn!?Q%>#7WeTi63bcla+&3gcCuDe+WH)~l?4rlbZ;+q3 z`lHZI$83{Ljsz5K8HB`6Ie-^TJ-!_9P)653<*ZI`Q+|v1ROID_!5KfEJ3v6#Ym*5=83wya3!-jiwJSUj}LpCYEcg=frJGCSf8)~-57w7Jo zL!mF;aJ;`x*+eY(JFB)K#PgiBn~Tru1!}WgyAJM!T*YEScGDdyGs5S^+kRB~4t9&O zRqR+4I42T)C-^%Uj4!y^$GlG477lj$t!A6VWo=ZX;#U{_>uU~eDYKFvX3W@;MO*<9 zCZ3(gO1P&4V?1R2iB1vBju`k(TAq4Tib)l*CfN4AO-39w-;?pL-TW=oZp@*2{k}}J zn;R`RODGcu!nibhTJFQ7LqZ=fESm|>Xo7c;Ne?F}u|ht-Vm3U7)$=mV&43m*2K1^n z)ue0E_sPR91rC}9)YM9l(8J{F-`HMX&dj%e=JXQ}mF85%**kF^{ji@=0q8PaqjZEr z6E3+frNhFKHz3YHD6mAYC3^XdT+pquWRc=3B`!kudMiPZ?D<2_3wFM%nc8YJPtCVe zmesu^4Kz{onpPub%yG)Kn_6O0L}H|e)_{l;(9by1=h|AE-cL-a)*4ZP;>S}7alU3e zV_x-Ax9!|#5Ga3+g4*_RN{TumI-pdfPB_9(3=1MUN*@bSKm96hN;}!nA9LGx-!zd2 zj2JLWAMq=aAH(QremW}lvsV*GE0STJ7n!`Dv18s;q_P~5fiS@%5Z6Zc|cGCHP46a%UBF;o^Dx$j9or}wex_|M0i0`io%vKM~+1-+IZVl3*Q2hDT* z-57^GFpV`qT$HkN&~r%rmToO7*&?uUH@$a8QYf=f_s5`F+2b|$aYP~Dm=c08z!`By-NO@?l01VITh~F?Sw{d z14l8C4~&$d1$Gz&M3G<1Gs$cf2_Y|~7jnuNmg%9QROQIb3_x*7Fhfj7TeKMP2vvHA zv{^$x^Dw|!De(hbCJsu1d)u@E(SDrGP7`;G66UlqSaZW%&dVgXY=b5rvIMWZTL5&= z;0+oacjdw+Gaxm^kl3T&HlM|@4O|xM;>XI|^`%7X!K(K`zt639`@A3K%jPrOZP^I$J|8wOw^lz7uG#tX>} zNoQ{z=Bds_L4<=W$(+(UV30Maq_+)tG2qq46|oi22~v`}&l6!pSb(^@dw!&XKkI#H z&VH{XQ@;U+p{UT*ah*`NxkYTz&z&!X@8pGb2(IF~9sup(wz! zOzjOnY$OF2&C`;N2MbZ6nb(?jFilVJ0~id7LYsYS|FTG#P?$>IhjxF+DTqtf=8@6( zO63Fd`V+!udfSW~Y!Upf=CI`YjkM#;+aWQitqP;uUPt$H5JSjmln+VrJC`kon}vFr z*~{vFNK2rm)I89pC6kl$^74wS!C%-7gR5(b@F6Epyci|15UV{4B7bxv$F%l^F;OVC zE*YwedGE~)+1NTLRzphNl~;WJ?C_O1JZ;IHZEl(seLwR=H*hnnRk@b7hdh)WpukVM z`6Umr_#0h+O7|41XKEElja<#6_rs*xVdOcqhtTlgWud$VY`zH28JS4yxj3;_X4ci_ zz$;Gfm_`gQ@I&J?<_cu>a=;j2@|6f1jiv}cd}q-`)mJjnUMh-aI`*Gla0*DXi32`0 z2*HO_`gD(dkys+kWRQ|TktJf}%h?A?c=_%n33&b?_l0e=ooBvqP*{hs&xVb-xgy0U znHX71*)Q;)B_qC{`U5aOZv_Fu6nn~NQH|({19nWTxy>C`*&N~IXlL93Y?_GJE zj*^Kh;Ml{n4bZlAGXyAik4oazu)Klz`0qgW7mEZwRt=X4SuIJ=fFRVft4Qz?QoGSoZ zDqhDOuAS$f3gMLLD=RKPn@Y1f(z$ zF6D;AbUXdLxEB=n`^MwoVCeJvVAyPqQS-Az&fYp0A^sJfLRE zXj=$uGh_)YITPEHVl|4gaaAoU#Cc7h;oT!>iT=m99Q53vnTWRx(@zRZFTqlkyAz7+ zAn6Tfh8jOqB82=Dfa+UL3r%(Ba}#MkiYFe!_r@>r2C_r z%GPSBuyy0V!I!=4(CKw5xb{9C!#d->LoPojTZWIpH1>lHpf$b%oRR-<{|!0!Ou|_j z48Epo_d}rmIemww;XO$xh<1pxoBe!r#Xq7y{|o9RChJ92&v4*Pgq+q@NzHoeIs3tm zg;r|YEdt&vpEC(nsZw>{l$hgb(AkQYsTX$X;BW^AQXfO; z!KQlaTsXPG;Q@gjN0xl9_Lu&IC(gPde z6ss87WMWn6DBlYGzC|A<4auNd8(TguW-O8o8# zI1eM#y!P={`U4lZ7|<2}+kE3QC7Um={)~6|iKkB|TAwCn4#ESxAufs9;Y-b)uu$4O zN9cah(dK8z>+_{~V7Z3Lufqiwca5Tlx1@HL zqguX~Hne=xP58uO|2qR%rW#ak+@Buf?}$@S(ve8 zuwL;ahNhD;Izu>W3zBYwQU3G@8g{!Yr2I)K0%RS(R6wtPlTzfz=wuvRt9a>lKR|Zs z9xSpZ-S{^SeXIt@q0^V6-E!X`3Ew+iUcIaGakqPEDK)cQeqs?@20CxA$0Sm9wj7o( zwywS{Wo+_jXSFy7bDF02ib$fQ`=Z%jukrD--biyAb22aX+0sm-D8W<~q~g-0qt59t z`KD+tmreGPB5bNTmZAp|fAhZ|>W}e^&B>=^zZB_DogRXG-1biw#?$`A!}VEW#x?o) zxwfG7xlJ=YjMpgLeXj2g)PXk>&cZH@G%M;Z|1wbGI%gR)<&_^8-wP8Q9{)zc=*BT8N7dbHn@ zHz~O&gChYI)L&Z1`2GEeMu;uNuPzD&Q_P*J=$E2zHDhuWPSMzr7?tSZ!UygXq(njJ z-9eHfH8b@Cu8#{hNcT6CF6qigzFrSlwOAh*DR{65a+-{PZg|CL(^jB&bMzJ{g}>(Q zVLWROj$N32^`4CWM_=}-&&vIt7c3#HkJ<53p%q{8cCx)G)Ut(j+tLVm#KHlO!K+XP=Z=^ zx;7R_K4{_9Tdqzs1WdMc$xc137CQ0hNKeVyd$CW)GjaSl<2}-!)bOtOGI3*JRIN*0eoKN?z(+>?UVs);f;@@>RnKdEI z7^aJIQn9h{gCBaNcR$zi?=!x+(3)&?5LH%nk0tX@qt|_ve>XM-wZQ)c-gbr%n$N+s zJb8ST#P~44@;C&>-$t0;UrwM_g;B(x$85peh#{5g7O1Q|bqN#^$M~Z#o=Iy4FTCFw z?XF4>4@-qW7HKiJ8L-#A#b~MwW26iTd9N+AR!R0S!|-*R-%Ib*$Fm|}E+n%nP4_^s zaC^fi_B*@bx~Q&V+O1tHrI-IK6d>=SMnNO}Q7Mg=tK2DhaS9Ve%|PmBdK9>E8j6LmN7fV z)8SFI$9lga?usiFjZOuzk)wbzzmAL_?EFAT&1tfjPf#ENv`lH;q`OUOQ<=2Q)d;}@ zY}nV$nRWmDPI zF4S@ZE|R6;RoYb6U-1)Xah-MaKA8a?jhZT=N}Tcv(8r+ti6M77_Oz1T^eqt^w0SwAVC= zc3d5L^ghA!gC+icSKpF^ePH@RIE557+)YQ1fBg(%7&(Y!RUmEL5bf(){2G`I4J?DnUFD4u0);8;lcBv z+0^L7ZlHksJTR38`|2x3yW@?8+hXzxVBjZ#FscX0{A?L_iK#oieyYWTwU4LWiNDoJ zWu8G+-JD+n2qZgS1e=%4ynDCy94{NxWYOlvP^yL<(S5`DwnpQcqd#v>+_gy8*~~+w z;8YGw_!xyxSRvT-)p8A<9^*Qf866)bWC;Fk00+ZV-H??Z_aZ3!5`fy9nyAEGJ!KNH zoe{*kr`~hqnypA6y+dH!=W3Uwv!E`pT)OY{(nLc7QlBvwn8J#VZ_~!`o9gFSEJ;>7 z0?m1asR7Tc>*PET+t%6a>v~>6%@4U-f1xpzhR8EFT@&~D`ps+7_aUqBqi>qdkY;~D z&ryT@E{|$qsrHl}B|duVQSjXak0v0VMykQe@voA-Sh-fS)$BZP9J~qD(+4npJT_@T zYx@@=Is0eI-5(k9Y0YB5{Ith24bJhM5}i_Yw^ zUz%)-OEHP{ac*HpXmHv?g6o9vZ%L;K8HI}4g{)z4OWvd%KgJU{g+Mxe`^9amMN2VU ziBK6S!c7>*(W!Kqm=Ssv&stX&KcIm}{$cyS*M)dI6j_K6p-dK#h}%FIkI09$4I=om zhJMxjYSsaG>gfuQGDVpWeU9~TJFz5TkFP?~L@1ZLb2&bQx6z3rd)i3Fq3{U8`|{oe zP5A`T!Q}?K<26+8NT?(5N2_IKl0Hn2P1wH-$6+sS!xkeQptjJI5pJO9H=1QS3KKPT zC!wt?nS=gTp-32mJ2*Yz^z*`Fn==QeclSyn1mTcu0_;eahtM)1ZTYvQlU;80+st}E zE}U49PEa245(T7C*o1>hKWi_|gS#xa>YGJ&fI{V*32*YAa1r+2!M-tIv3K=MbK~i6 z4hBUm)bI?Ck%9b7Us_MTz2hv?3TIf4^8&1RVtqk+3X{1nslhd$v%;b$u9Xu*OmCpq zn6p!VYE`=Cpw`2@IbGqzjkfh)))pnvKqXmrVYvO>)DTSDN8bvb4#l4DJfM7=omVT) zknV>U|0}M9z3%!e!`=;V2c1$B1Q*8Wz|&5yYn{F(_%vH4;_YctYz>zplh>aDYHnxu zHP5KgKJZV&PLBI8s zMzDv$52f38-rbf1bRlA_sp{&NP%k#fZ)ks@Y>ZJGM!E;>N#_7F9g9w-cB#CW@#vWy^6QoOUsb!sHpIl*Qt6e(?ngSA(b{&TL*%r5QeEu|bp>1tfht9LLTb z)wvoeR)4&{yB=0R+V07*4s?4!zExaA)Zg#J*H6cmc6NO=6v!8sP@fFT_V5kv=Oye~ z$NfEQJAb^T%)FI{_Ap*^AtTMOslk(;T`AX=*c-4hR)Dih2>$WtBsTK*rzLXT1c=Zp zrGK+WnhFQ9>q08Y_i1LpmAK+6MO-Exd9NZ` z8lv9&CjC_H7@%W#QLd@yYC7v-C@jsQlmzzjn%mtCGrP{K%rP|f&Rh!F2h(bB2i=wR zF+e2d*QJ#=okIy*jPeUiDlN+xXg4la`sW)th!>fsKquY4ng=Z53MbzbMLL&1JdT6L zIGgl(Ju|0F$MU3tgkFekbDrE@5tmsKnPGEBM=Q4zP(7#hjqwR?LKyPu^tvT{V&$;knCpd!(JhIY}iuJM>M z%b?Aut_g8Y{7Cu&9Z-ZT<#^!Toh9^1`?dg85>}rcR(~VUStbA3$zBz92(ZUGSE79< zauMR+G?7$}UXz0_8q_W*7uN7VIYu~>krifEb>#r+swiPC0{UtD_BetCA(#VxLYqi*h+q6(T88&MV+beIQG zAoQ6dBH*V@n_pO>T$!dCW+2B&M>OZ2YYS1wtV!5;N9eKX%?QQK_@JCMFS&*k%Wu{W zGLFVmjGWR+eH}Hkd{cOGp5QaC*Ran?aciuOFEC^xwg#nJiHSSgfXhZS~bNr!_;7N38_hJB0%LC zsX3{+xY3_1fE`}dm%$;2glpL*Qm85djNXP}kAg&U8g(RAXvC%==fd1V4BZ~ovKNMp50mcO48$U=~F(wrzh)0y~r1v*1nw;4_q)cX?k z0$BlXSU+=UO2mqyXp2P=iTInI)-;>+jHtb%<(e-~{>Tj~{DPw5yZ?Ws4PBlFoq?_;|Nc8>AJ zQl*|vWFxxLttanH!rT=cU9TQiPrQBBiqKcN0ry+mZPmxxs2h=8alb=M5PupE7+I)QzmBL_E5a(#?|~qUiV&1_S!dnxR9lL34o-u z_hA<5GO(fnJn^gEF2`S@T()W@O-cA-nIBR&gEJw7){~d4nr1V|xc7;ey*y0yPI+D5 zYI@JVpX+Cy(r{nDK=Wsvf>z-_H{Q|9rdBMfPON-V$P`gSa#&hdueHm@mbpn!*69qm zo^owlfx&0g3Su&Mk+#>$3D58}s+8oY`lV4>t-3=+yJF5#JC6v~*YYxwvdpm&3jaJU znxM48fg^AAgXiU1b_db>$snS#ST3ce48+P+QM=sKXoL{KE{#qOt#@e}^BgMJ^6fUMzm;f~P5A>+k$M(Wd@- z05;(e8Csq)%)HDt{B?6rA?*Qlo1g)qLm+F5b=&%a!BBgYh{A}5so-@UVEe&HBJFt? zTDmp-phKu*tQo8MqHQjBAAGLU+izUP4?9Av zbbNZP=LL^zp$(gT*|O+uaWs~wwN0wBa6-$K&?z#kzYre0r-uxqOo{FLKf3QAEUQmp zi>h14aiM294v)P*0veisso*(tO1ZH3cSp42wbFrwdfbgy2h+@F~ifbZd1-+7Po(45Z5&kGB5;N2Rfy33OOt`OG ztt*b8hlINR;LRxP+Ms6AJ9~4tgd2tr5qSPO)oN7qe2s~Mwel}NFlUbw`F_xFJOGqB zHW(z`jmVf2y~#!hA7LuOJ; zEoei`d|wTI0tov1*a_clZ!tPzQBlo}~adH|avG1<;fkE*EmiD&UiSSuQRQO%$ zafaoma8phQ1H1e-bUKV>T>gnV$qqS_H%b?gZ>cf|w^BZ?lHFPzI8mfTP``P-c!foB ztTY32QhC+bk<8L}G3~igGC6U0_n59%KQ_p8o-r2)o7T_rVO2hQD_pPzrcNJTU^=~Z zS^A$*q{Y8Okj@E;+)vS${dUXt9U;M{06Op-E9D~fM@^1CvB|SPoa<3Q25kgt`x%!9 zl3M_g1#J0M7BBe3N%c{slrOWjN(c2A{@4vQ!EHpUGXc@QC0>j`V+Zb=T^R(qRx^NU z#mi(`VR*kFRE<=1)Z9aHEMCn(5wGDyOqV^uiD?%fyE)Q70YY_2!t76{=Bcl59U6gG(~o<<_5%QVG%#Zl!I?{SpOo!MF&}GBnJqjf-^Rh_cc!5A4aRxgg?Yqsr+faH zf#%<=jIg}OX;&arZy1nCclr;K<r?Vq6HzsgY<#v!JWWgHO>Hl=-; zY-@70`L2`XtM}~4%;bB?>fM~At@$ANzl|^TVnYxZ_&*WZyR>tnDRg!?`W|bGc3Two zvL^v#(>b7$EHegJPk(awcKSJ~ApqX;!8sqidMYLR&5x@-9QseYdG{CY?N2o-`0X+1 zr%%FASp!Gw?I-R{h%z3KP|Jnt8Rpp zJ4URsa^F)wZ0}&FL}ora^fWjeLKCEj+jPN(TaIOLd!7bM=&5~B1bBw8ZoU~gbaeWDgIO}d-i3+Plp2;4v@Fwa zck@W1tICB|nA6|VjcAcB`7vG6`2dV@btxg#zt!^Ag)lFwdlj&WM%iksojw`Hk3bW= z$GQaNhTQ}5tJJ|l-TJKOGXOlgA)xfnLdYQ6^#We+XiLbBXl)>%hUu1=U*^>S=Rku} z_I_qQ{Vo%c8irg|i32GD7n-R;WAxR#RYM$cwUtwW*PhJB^#HAJ$2xXyKqry5!t_vP zNhh<&Ps693nx#eQCtM#s7uQavOfWePvsj8Eb1;kPpPX6_%6Q*9C=bDq5d(iF(ccE} zujN)~Sz=&ZIB(*f`VqL3saa`KQNWZ}JZ05GmT!+i9YI8!hbCg#k~HgR8^0>Tz#XQl zF(1R#Tv7AB+aI1=VH7YylokZQeU#(9VaeId%JA-Hn-gk2PG+l6BnhKxV1qW4*MVcx z=fK!2!vzT~iAt7rnrg8D1$mgu>H7&mo=Y?rhg^zN9AXb;aDS^}H5WYSf+`u8PHX95 zghy4lS=;Pl3UIPdR=hM3A*T$(`xw(te(`Lj55fB@Ch82pWkS-ldEPb&=!;aPQ9FW) zQlBvd0&mZTd{Q;R+(b|9(vl&qHm~}JUhSymbzX3NV`N>&s=_&5VV>1L3`Sp(ON#X|5n>o%|Og}h68VQxKw z#AhnZyJqHDPi3EBV$wG#Y5Dr{`{KLW0Hf~7^T*mp)u>AYqOL7do_(Z!X)y(&%yT%z zTkRXymc?qbQ@IETSIAZV^;<^5pxv80AmH~CqXMGiQ(=-cm#alx#YswM{{bj($->VW z($=`A^EONXn*#TNB_Hdt26o3^)`rIM{tz43Cgk6tHJ4Zve@s^GkH+iFK*J#Ia78X| zU&J8uRZ6=3CG0b-0WELD8cj{ylOS+nD-+y^&hU*Yx#$A&QK(ps`|kLQyzeoJz$eUK zCZ4aVXT%)w%wn6g`ruWLNw(6KN_*C;xangYI|){}9C&?$zn-6CDf|P}z)Ut}SaT!R z2QkXVR}m#Y@uLnR@<}*nTDC>KZv$3I$RRc(X!dGhn%i2m?VOfxe!Z4NVwWU&kB?*( z`K>C{j{=v-6!K_azrqnDMl^Z#+9(YKZ1&L*et3DRrX4{X(-<9tGMvzS@+p&^*>VqN z8-^Xc#({t&35BQZ9euiUbIix8#7~2S`A6>XWmuJgzf{oG2_TtC~{Z2*ZL7!3v@Mk)^r?F*OWlct++FREQ6RBjq4_0`F6c z+Whl=rgA}$Z2|o#sy}RjBQQAPI9tBa^>H;~Hl}N+nd7`$#jDr6j4#IVsyu?qn@MYX zSbhw+C@mi{BP43{F+nukv!rHkYyG~A8=)3=h7%Ac2*lZvMAGRZ78cYtMGb60eObTgQ`Ua-%QM zxnZ55f^_jKW@wo+@Rt}V@Zx6GWwg$e0-|;d0tA%VBY*XsS(N<|5l^;|JkWtp4r;EU zDX(D9y;pRxhmEs1z&J?9VM(OBAoqfQ?ZsI{h*kz}>I#esVSry?Rwu}6onEpWYnTG` zY8AZ+bw}4*{)B$2!xRzVA}H1!Nc|91u(6zh+j?De`>+2wM!&R!h>S5@UJDoxBA$xN ziuIRao_|)jy)28Ua9A@QFR)LDb)q494`osuXrH@%BZ`8-Be!@tHHhqfTy|$-%>K*B H|I7Fv(0s79 literal 0 HcmV?d00001