From 8c12cdb21d22f4a82d8afe5505318dc9b9128881 Mon Sep 17 00:00:00 2001 From: stefanprodan Date: Sun, 25 Nov 2018 21:05:16 +0200 Subject: [PATCH] Release v0.1.0 --- README.md | 4 +--- artifacts/flagger/deployment.yaml | 2 +- charts/flagger/Chart.yaml | 2 +- charts/flagger/values.yaml | 2 +- docs/README.md | 23 ++++++++++++++++++----- docs/flagger-0.1.0.tgz | Bin 3136 -> 3433 bytes docs/grafana-0.1.0.tgz | Bin 6855 -> 6853 bytes docs/index.yaml | 12 ++++++------ pkg/version/version.go | 2 +- 9 files changed, 29 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 0db1606d..ad80479e 100644 --- a/README.md +++ b/README.md @@ -8,8 +8,6 @@ Flagger is a Kubernetes operator that automates the promotion of canary deployments using Istio routing for traffic shifting and Prometheus metrics for canary analysis. -The project is currently in experimental phase and it is expected that breaking changes -to the API will be made in the upcoming releases. ### Install @@ -370,9 +368,9 @@ when a new revision has been detected and if the canary analysis failed or succe ### Roadmap -* Extend the canary analysis and promotion to other types than Kubernetes deployments such as Flux Helm releases or OpenFaaS functions * Extend the validation mechanism to support other metrics than HTTP success rate and latency * Add support for comparing the canary metrics to the primary ones and do the validation based on the derivation between the two +* Extend the canary analysis and promotion to other types than Kubernetes deployments such as Flux Helm releases or OpenFaaS functions ### Contributing diff --git a/artifacts/flagger/deployment.yaml b/artifacts/flagger/deployment.yaml index d7710db9..677227bd 100644 --- a/artifacts/flagger/deployment.yaml +++ b/artifacts/flagger/deployment.yaml @@ -22,7 +22,7 @@ spec: serviceAccountName: flagger containers: - name: flagger - image: quay.io/stefanprodan/flagger:0.1.0-beta.9 + image: quay.io/stefanprodan/flagger:0.1.0 imagePullPolicy: Always ports: - name: http diff --git a/charts/flagger/Chart.yaml b/charts/flagger/Chart.yaml index 1f2713a7..909b3b7d 100644 --- a/charts/flagger/Chart.yaml +++ b/charts/flagger/Chart.yaml @@ -1,6 +1,6 @@ apiVersion: v1 name: flagger version: 0.1.0 -appVersion: 0.1.0-beta.9 +appVersion: 0.1.0 description: Flagger is a Kubernetes operator that automates the promotion of canary deployments using Istio routing for traffic shifting and Prometheus metrics for canary analysis. home: https://github.com/stefanprodan/flagger diff --git a/charts/flagger/values.yaml b/charts/flagger/values.yaml index 467e1844..efddf810 100644 --- a/charts/flagger/values.yaml +++ b/charts/flagger/values.yaml @@ -2,7 +2,7 @@ image: repository: quay.io/stefanprodan/flagger - tag: 0.1.0-beta.9 + tag: 0.1.0 pullPolicy: IfNotPresent controlLoopInterval: "10s" diff --git a/docs/README.md b/docs/README.md index 981c1310..11f869a0 100644 --- a/docs/README.md +++ b/docs/README.md @@ -8,8 +8,6 @@ Flagger is a Kubernetes operator that automates the promotion of canary deployments using Istio routing for traffic shifting and Prometheus metrics for canary analysis. -The project is currently in experimental phase and it is expected that breaking changes -to the API will be made in the upcoming releases. ### Install @@ -351,13 +349,28 @@ flagger_canary_duration_seconds_sum{name="podinfo",namespace="test"} 17.3561329 flagger_canary_duration_seconds_count{name="podinfo",namespace="test"} 6 ``` +### Alerting + +Flagger can be configured to send Slack notifications: + +```bash +helm upgrade -i flagger flagger/flagger \ +--namespace=istio-system \ +--set slack.url=https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK \ +--set slack.channel=general \ +--set slack.user=flagger +``` + +Once configured with a Slack incoming webhook, Flagger will post messages when a canary deployment has been initialized, +when a new revision has been detected and if the canary analysis failed or succeeded. + +![flagger-slack](https://raw.githubusercontent.com/stefanprodan/flagger/master/docs/screens/slack-notifications.png) + ### Roadmap -* Extend the canary analysis and promotion to other types than Kubernetes deployments such as Flux Helm releases or OpenFaaS functions * Extend the validation mechanism to support other metrics than HTTP success rate and latency * Add support for comparing the canary metrics to the primary ones and do the validation based on the derivation between the two -* Alerting: trigger Alertmanager on successful or failed promotions -* Reporting: publish canary analysis results to Slack/Jira/etc +* Extend the canary analysis and promotion to other types than Kubernetes deployments such as Flux Helm releases or OpenFaaS functions ### Contributing diff --git a/docs/flagger-0.1.0.tgz b/docs/flagger-0.1.0.tgz index a0dbe21c24f8031c86d7922ec458bc471bb5671f..e76f901fcaa2964e647b695d5daf5ecaa9a68f40 100644 GIT binary patch delta 3407 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 delta 3108 zcmV+<4BPYR8o(HkJAXTWbKAC(`5T{NPkwJ+;#X3X9NVqt{AO}?dgHk^_1J0NbaJ^0 zB3B|B5I_J>v1G{6i{_^)z=TA)P(QlX|+ zYOp!AKuaqN>gsKdptLNcLkBsAlnSb61Rz7j<*Yzq4U~q737i_sBxqS$_ceCJG#!sw z3MOY`Ur9vHl7G(A(<&W0V~@ z!7(klg&+Z5<0_$u31J1D;D7*VRMIdj^=trZ6$il5$$yg308l08XOgpYHh|OdD{0R( z8Wfh0R0^vl|4vGEDlFoU>F%K0RgKEW%o&Nu%#6h%Hq$gt zd1)-_n9G#%!8ge_Nr#YBXKv`JMrv^YR+mVK9?^8Q)~WpuQ`DMeIDk%vj7!c}Dv3rT zOP!)|6n{7?nDxH^3M@QpI{Ur;_pIaVQdRmHB}vio9Q;tCSwYxafiF6Q2$|spa!jq% z1Gu^gdrE0e+u;O#p?oKY0a&V2K4UjJJEEf$J9W8HoA!|Rt9vAwhpCS$khf70(S z>HqV+-gf_gl+tYF!dS{VW`D*_Zd*2%RsH`tM}MwRo7k!cas_VD|9;Y6_W$?$z3u-0 zDCO#^y9-lR48Wj;G2>`w3XclMmNdr!>~?Q%h=U?8FO~DWoip!tM(4-7->HurNd*@{ zhGQlWI<*twU^@`aTfMgthk)~yBNV?0&S!hSg=@Dnixdv_{7+U~l;bhGgibUkh9dL7 z!+-dW{f-W_>BH^eGx$(a&c+Ngpi23X$K;>&FbN1e-GhPe(J)i<4Iu4%P)JMq&CaCZ}W2$dQ_gY0mATOqjs7P{%BMWSqkY zp)_usF068cuSUC(wY8Hn=Lj1&++6lx8h@CL0C!?JH*-pV@xvb+-F;PC<7_w)sKn=i zO#!(X>q70l2dFd?b_|`rn&_{lvqUZQdmlO5^m{@6S_|vcr3xY4qWZD)?Du5#L&*HvaFs%W(|3Ekjl3@G2sTmzwhV0DYxlVp4Ld2lImqfNIWlg-NBt0XPd}6iqR64xXwPxHP-}vXTc`^I ze^H%^w3^m+?n*;?v3fH?u=I_>>d1BL(*1_A>i^A;c(rgr zCO}lFT-2@M)ZX|aWPhNSmYUhwu@n|Bmo{gOH2XpD*}0VVTgEY*@h^Dq6<{e|m>&)5 z0rZk2>9rcer3L7?$yITUuZriF7~tk+u+nVl1a59R%aqPqcNkW1<`*2={0+X9S#;I| zKXPl;qEl5f@65Sl@OAQaLfWlGLB*2WA9q)|8bQS6B;q(let*QoST43z*DWG0rHbm! z{irpaHTN+VXB0tHxkZr=sdO8A;mXD$9%oY&Xv~?Gqb0utFBgNH4HFK%f1Kd5R}?`M zeJI)5dh4RMqu#m}R-i2HQGZRFQ7l{W2P3F%p!nM*xiog*R;imK*1mZe7fo6K~(vxjX$Yu>Y_6e|kjIhfM(9;{Wvy4xTUP|DGTAxBlN_ zl%@QiU;On6K;J}5n@i1p^`gBY3mC5AolA~)Jvq3O=YRPB?DRmF+*!T|sAB)AWvR>n z-u`X(Z|_LkGB#CH)T8Dz0wG16C;jpKyNz&B^tns$A53H}JpVJVgydLd^Xj$u1gl7s zxoyemeRyI@pP=z;f7jD6QD=o$r|GNV8a|ZLR&!o^2=_Z}6Se)1bL0h^2&wTQ$@_BK z`S1Qp{C~ff^!K;+|1ruAoQ3q90V^R00DR0*z^G*0nGR4ieNQK7VzL9Tb7sJl%7-^# za^xH)T#iB<%*5m?r_j{0DT1OlZ`D(gksS~?@!AMamBul<#4LDI|Mn~f7x#e_SZ54D zp$5(b#w0$u`1!(0jbsOoWl=~0Z;me@W7?2-!hdYn{|&<@@#t6G^?&P%eA0D)>Q6Hj z-8rEVP2ZQw-+eP=H#Q#?*^Ni^J=u+Ip~&w4k{x(MHIt=*)03Bm#7aw_qm5aHv>V{G z{N<0BeysKX{N;<2?_b76_B-@(TmJ8`zwH0@d;8n--$yAs^lfHz&M zFMqno&JLW0`|1wWjl;d{w-G|A zCYojlQB>2bz#;B>s-{lCKom8*`%(K{ila)%Yd4G#~3oUJO za~~r1MBk=TjM=0NQRcg+I}6{>z+mdvg?}?+tF@w<7HCnMu#zbiF!DE2JsxI|mD(}1 znsV@(Jhy)oY!koBx~ZEXM~l9>VQxzp*7CW+i6T|%2{y^X71n7in{=+pif5~t;i#derkfLlo&w^_hu6v+0tkEr< z%<(LpID~(H^YZ-S^oLjfXrShK%{j2E0~L~;*D!3q=Ngh>6ZFLOOQ&wCN{6jv2FGVV z)-RwOZZ9d;ql9-+HCFg)BkuLTXMYQr;T6_$SH3oMlq_{sA*}7FLG#bJhGbYLi5#4e z8Fn3TRmpsE>y;EphV4{U4O_)d-iCQJW7tGERd79A-3-aFl_qjnPRN`bd2CCWlW8mK zWRi;#hHu{u3As?1vhfU%ruke1s|U1R|DwpCh4(l+^78iftLEpsAy7Rj{eLj5gkjs< z4P*FLYQRfcD2`u!reXYV0vnBE)o9QjHBxz$#7W!_y8nVZ2hjVGeD)Pk`02&>-+31; z*e>Haz$$HSJzaF4bR?$>s##e&rR9`m&N$?b(2_|D?-(AJ0b^*ryA3n{2kh>?W@>kL y06)pn54|+Os@5jtZ42q$(;e2wvq0iY`xM)iE3;3;1!6xmZroOR za9_!TLh>FnPH519v2CC*%)Yj*mSr0*<_;sFP)R%RYb-DDFYNi?NTGoNW#H3*2+Bw> zgpko8!<>^b1{Z&a9-a6&5FA2!h8cFDKQRCfxF8fz;KEA}4TqQ+BkJQ0jD!ezr(Pct zF^c+@L;X4zcz}YCQ5OaEK~g$EvUDQ6#yIVA!?LZ0@z6Z|nx0hu$H0WJEX+4hVmK-+BG2HlWN$LSPpL#KW?{ z9(Fv$FpLo+sPAD8fQ@aEZMxJ*>J>pC{a4q@I)GfC1cqeh8D(zz z-FT8%&?82DEJiruKmsmM;9w(SUTjD^^?I1)ceZ~TTMb$9H;l#@c0C%oSsf7c6bFX- z+o|m5cl4w>mT71G@Xg8ou_eyMt+lbl{x@6AjgtLeYc-pd{lAaLw%}JRK#VY;P#I-u zkl@|hSJ0mTi-JI6Ix)f=gF}5E1upLx7Z)`k18`^{5D7S#ht$PKlnE28_c4-4Y_KH_ zFid}?dBx|_^upnrz5VXdo3|(1PoJMgee4JihFCzYCP5t!k%Qsl0<5>#!-!++FiV|I zp+?~kPJs(SwMH|f2uMHy4lZ}~R!F2kf)VG79 zQqLq^{zd&G0{g0KTp$r~3%Ra@##p5#U#5Si>VPw%snLF#bffb$Vv#_tZRGTkaQbX!=JJkqWLHWPqQ)|vE||;=q+CIXj^6Bb4|iVgm)H?f_o{;G zfr-L!doEvco~*LC@^+aJOsD2TY4@=}E)p>zO}@?dgcFf6%WiI14Xa_`&!dqGj zF7yA5X1nD7+s(#$<^S*FxwxpWz?k?Q;8>_dowPOEzGRCt!W~$tD}z;EG4{_x6u8RF zOTCsxUVc_VAj?R~)xgCA63iHrTAr&`n^qifRHh`gcCzG~F=mXo7(RnwQQ&{TdP{vI z{&6%IkaI9=IWej1@^jq3U52FbYh7hGXigypV0kQE=#E z2T3EusgL2`Q6IAaOXsM@J0RF|ImpGXS|?&x+AJX#$j|!|#f!beV_8-@Jqb--SjNEs z5)&E|$;^EmJ5y;yz!~v8>1Tf(=rPST#4n< zZKYqHs_u8TuRg0uVwP+8qoT3B&-*fAHErxLKkWw|gBqTlBdgf7--K zbxC5Aa#GdgCXy1D@=zapmrSrKWiA|!&h7Yf61;`az;NhEUvK`?1hao@UTd5WZIr6# z-kw?i?;<|xQ^Z_ea|XlPhzKv+|7o_${(pU~*{J;geLSW8pHmXJ9oVJ8fDB)w&`6Pd z#{h`;T&}Q?s^ubN#FZ~D;JNjZc$izidbAH_UZTEYzOZ(9+$4Mk61X@J(5z7Wy*%^u zU!Wu|eoF>m+5S&+y&Ql4TVHS4mHywyb4U80iI9=j*3y(nb>MSN#gg+ z(HL82l%4WA3W?fvNlFu*?5}ks{=!Krc8NfJ4;K>0ITzxDKH`7G*@?ucP%KM*r#6UG z+vTjIY`;j0LS?MUVDg=_Noze~UKWe|LatQto!fur*#GRz#%-MjSYrRz)*I#h|Mo_! zUD^Npcy#NF!jRX;b{`AWOgzC}CJbNZ3Ji$XxQSswVR+SQ5HFDz6i*h$S=l7U(wPZ( zrv*ls5rKxK632gWd|ejeA$F1j2p(||FBmWVyh2Qor(5}ox{ri2dZi8YnnPVWfRswo zoHiBm@d_4J2Tk=4PiPp%ao3^b0dEW&HIDngExl*Zmzd{2L~)=6d_POzKlbW0FRHy6I?pCh4fsPW=zwQUN@wy9U;q!>*va@M?V$Vne|p#{;(g4$sS?J z!MP;@>7>g^T?M`{%gFF(6(V zM{o&8eGl(p565>I6iB@+@<78f+P&1DKJ-j}*)yyE>6xS3y9%&O|2Njk@!xi{(*OH; z=IVd4EWYC<|D#y$$97`QS-t$oowoF=B`bfPOV0Ks<_EDM7DwgfQE}C$V}_(qF|2T{ zb^N6~Svdcx{#zsL`D7SShHqWQmizzm{%@;Mo&Ua{=LsAkAutQny`5M9;B15g=tsnJ z)rCIfoT4G-*>xZug-R!YkFe*#(4+l00!D)2s+2<{$QUbksimX9HJ(6#hw%yX=OKT? z19Fbtct!K$3k%)^-UMi%YRWD_h#7b!z?Na{9e0lfW!QKEyVUn-0PlB?!6l3v){uz0 z`WtuOu=;aIm+}4J%~y59|oTA}&VtxEz0@e|(J)Al3i3`#XED_buPOgEp4M{~N9K^8H`C zUHSied5ZVJlH0w8kzVs1w`29x&O+vpSDkOuZlKApIyDI$Al>sdj3-avAm9RdUUH=b zRKV9TPH21)&GWRQajIGQwQzj0=TB-$La$>Oyg7IM>&;&yyHuh;7t#>ptVFq2$^ z=Goi7SBx-W*<>bHtPSHRtqPxEFTY-|zNw-{tyX`7&yf8!dgc9& z9(;xanWkNsh0o9{U778rHS=wayrxWpFy8C<3_bk{ZB|d9VO~L?p)A<88kXHNditiA zEaYNNq(lXg-^WaHMO{bv486E?VhLo?kh-8pX?p<;aL?#zp-Wlp72!hC38*VuCvv6* zO#_@*R{Zd(XY|r=s;qw_%ho0RB$1>IxUvB~tecijmMiK8l&Z)%83s~zWyOnW&*O~wE{L2Te(x>OzmlrXKhejvWbJx#oAhYhE0I`Yn2dBa9v~el^ zx0@|{y;Y9?+3o86ANTTH7yzbrw!`eeg+jKb#64yQJ|tnPi!2OoK7BeueDrTTF*{(= zzFZ1-?Dpn{xtf>hN5m5cf!P6DOU-w^WYt=!8;FkkITvLnV?z5h4=kBYDExIW4FnG4yqQ0_WDJgnIN$!552H51$i)lL}Y0G?*6kDux)_hax=-6i9nGd`I^M%*Ks3r##rW(Qgt zE6>ahG}p9*^OOV0cPU5d`Iu=&TXAP|EBjvLfJ%SzsgehCBz!OLlpsP)hp8no6z~wS zm^HfmWD_kJ63=ncg`B6z8Q~M+V;TuLI7(;=f#AbYH~m5TW)QanG4YZ?ZL z^fuSptI%GH|23?wg8arMS{tiiH@8+{ts#qS&MDJwtb)DKTm?z3VQp=^NF_MuUr`-% z$eDjLE`HyS((_PD9-?T7i?i;d^K_hcL!Vur1Zjqz%t!RB%o8~sBZm2idTxB0?y?fE z5j(|-gW9Iubh&J3zp%U40=QXQ4Hu! z_5q{5tS9?dWRQqEZXVWmN*Oe(a0&0EO*-{RP|~FV@w}o(YuT${+ncLkZ*EC-wl{wZ z8b6Tj%s56#SSJ%xX-dPe)hg6alyR;eDetyRy~qzrMpf-`UBWhe9>z^e)A*c6{&Tr% ze@?g{w41&>t1GBL-UY)UWdbwlt1uTNP_FQ!xvG8Zo>6w{QRH?r&$RvbM>F?R3yP~k zAtOFwlaJ=~L#x3*y?7zn*k}~cLBW6E3F6}}$BbZJERt&bOXLW}Tf30W@Id)~vm_B* zVCnkTE)j>!wDA(BQ;&8O526DHfkV|b^S3b@;k`PzwaDWYJx}WLhum1(^+Qokk@sVmOn9bzU?Ulb5=V|TuJSN>c-nsW;def^3KeY0}tl|!!_`eL@tTlhCO+Z#nrrEXt3 zeDWAP{wl*fqyfiWhr0O3zdxF7Yb6H)P=`m;)wEA{21W2?OiTU+v<)t-Yz zG6-@Usq3Hc7K!f#fS~d4ae#l1Dpv5Yu>!k!MQpKAVT%e|+!MBtir#Flt-^Zy%b>-R z4cu?8yWd%aAP#$f-2sAKHHIoaP{jwT_yAnliEm!fiEmX-ymI1|6Tebaz-~Ows6guF zAAeAwj7O@Nz@r8o3u6MvBZ%*&@Zcg>xjteu4o{ubc!h(Z7%9tINXLKkiZ5N36J;vw z>-)*V;&$H7_{IW1xt{w&Jj4n|X-y%I41*nhlAM|;`+Ld9+0+!$&E|}Vi}(FdOcvz* z2WE6mmXFTorIKJyDkH;@IG%g>Xc4TDCSp!{e8h4ggpmfEmrtn3#53Z?0&yAAnDM;@ z@0CJ3G@J#mp{&J_OCoWiE4YMMU0-G`9JNbcTw8y;E=8M{PQlhUJ_X59 z#ghJi!3=CInt@+#Is;qP3|wsnwie95?v-(qW&~w_U&gD8!s17!ACJgjW>qwM_#=(! z>?O0L0j%tV>4om15X0^q*F~8qId$cpx+xSRflJ23jZg-HrZaF&9c;}zaE{JN30cIV zQw}+3r#I!u=Ny00EtS^RF7y29hfgzIoS^f|R@S))l>|p!2b$@C%%H5N3nL}Qm}PD*X+KU#l!lt z#lsBS*A}t8@eQvY%6aoGTeW)llGQ_D*f&}{%)QIKzS&;9d8<%V_JaGa6Gq*Lqan^9 zRJ=XvgwgiLczQpYt2z8B?S6(d#zuOu&{~l&DsMvO|M>Su^XSdqX9eGC>W5~E*eNCS zZ~*G!0@8m@z;t>AFnbSJDvKHJ9=(Hia+)Nwj;LFKsV@OjbG2o2t-VO*7C? zVuvfVQK5~m3T>1_7|jLmXR;fu3T#wh<0}Ijxvzisu}|4VZPSoo*yUJs`xAlr#T^AK z?i@Vacq8;N!ip@4@mft+1ue7=-zBtIa9s?F!m1Qz0raR~#uZ2NeZq{HpvGdHu~y-X z3TJ$;IOFz07!?4yNnE4C9~J(n@W;1xGrvA7ie#7 zUcQwC8ukjXkhrUxFgylc$$rwc!#wF8&~0DFFQcIO(s7+b>2u|xS$450<7zzeVIk{M zp}7^_-8JhLN%(_DuMT5w!a@B_g&H3kHU57RR+#aIqxn8D<7~`oA!z)T--A(s#tJl6 zpz&%kyG0?p3QXP^Pro;inMNopj9FpK?-gU-@Lt}*Vg1d!lV9GvJA9}g!D}_=BgwV) zWpL+vx}Mj#1pq(8_4a(OHg~zY|>Vf&?%dhQP^eTkxO{x6}Jdc$( zqp=F5guD}yp!VX`FMrGWEuNz0!*jSfs2dcNM!2s|NWo;{xARJ)$xmk zsIchd;#a;mzsz56wb$-MtbVNI>T!R`)xve#5@EWBb;rVAB;<1bj@3|MCvf3yGA7uS z&fb1$Y1D|Jq z@@N5m-db`GwZhL8eum}02=vI1asHmK3cx%9VEp(YZzV9_7UEs>6I&JFy;pz0`&B^M z3Zy=g81LGGH{We6c>`O8Q7eoJ_k~dxy2)9zQ7U>#Y%MNX0vS43;h2rdEux9*gN8Z1 z`IeC6w=u1^2okR|-;WpwW}(kFkr>i465PuNS;4^y4nhS7A5+Y75gy!Ha?QNLgB2cx zuLKXy4LntF@GFOdk7HIVG?;&7l){1)7_7kHHvtBXL|>$uNoA2ewHq-zP40}akKSX( z36(9_>v6J}#Mr9#C%?s9lBOJT6?mHd zq_c~CT4ZSUo6ah0-sCJtq`BSGb&dp%7rA)Hn}@}+1K)?KUDv7kktcu1oLcGc^at}Q z(NLO^qTK>8|BNtGCnnT~F2g+XMC`Zbc&u3uG3$?B0A-L95Kh?TI4E4(xDuJd57+0y zWEWD0Sp9~7-CF7DS3#bC_|K2#rE8`ZgptiS~ai5Z*NR{^j>*re8~?cXlYZBfA&Z{DG~7XefRK(ly0%5uK&N zYJYpe8e`D~vYKSxzo_n(d$m+jXU0(p>cb1F`d?y^X^b3*nyUme3}TFK2K21f_7iHR zph=ops1_3ER0R-{$_ekf=~_icl4e_rK&5a;eQD`mY(M|p);?|9`j=Ki&(TnJQ~PYY zv5I_3#~_znn)oekMJK$j6V_X4uIXR2mzHg~dVkZt6xjC{4f2ab9;s7r2kYh*1xP&3;-sM6z@$yv8W&vTZq*Z9FtjzosYC{}J+I%T|9w19U>EmM>j)#N;;edbO_wCoO8hy$FBn0-LPkby3 z>|)nP48sU9f_gsYASm=OM2K_j0SN_#F^w4r97H}6m|KRyaO4vg?a(+B9dHbT1ZaRe z1^~km<5gB!&iaBMqBz6Ll@y>eO`uZc=x z_|F*gtCcrG>fs~oV^>h7+A{?8F++i^EW2Ix)l?gG++|g&yx17Z(j6eQ;?g5D7V$2h_udlnE28_X(0nZLlQ` zFid}>dBx|_^uocL-My2;H*b%(o<2W~d)O5|46uMkLxMUUAs55N1z2yfj}gb#L7qC9 zK!d^`oQ4q+!!7f|;t_T&NtJ)FKUrbgiHQkm>s(UGL>tV^uk~Z!myMZV!DRBH(zpG? zO3x%+{zd&G0tc#VTp$s13wfS|##p7LUnYO1>VP|>nbCflcBAt&=au3(_Bk%I{S`&t zFUXfBoL$Cx0FY|kfqel18iPQm7!dUF83ZJZMe6sZ6zC*j|1kCDXoQF_-Mf`gOP=3p z3@!@c3<-CrYA53a+SjG$na)f;a-nf{m3etq%*)Z<+xPoBGp0sSyUN5|p}o@NJ-dI% z=FHa^Vv$g-ZRGTkX!2}o=8BGXWLGK^qQ)|r%$dv_q+CIX4&Usa9BjYdtFR-Y-c<$F z2NOln)=a(>JXvN*<*h0qm`u#M(jH)eJR}lAntYq@2`3_BmeX3dY|FNs&W62VOF@e{ zPOze8icA9_8=@S#grH}LdGIvj0my&qoeeu-Yv@TvJ+xW zM{&PT&cSRH#H6yz&q@Dw7?xHHi($Be>W#$~s%FHcrC6-IK zm3?`ty5HHl`mAdG%sG)zDSMZ^ucg#$cQ9fk6n!xN!5jbJW`$bP?sepB-sh71X%j2e zC5=tWNmY}ZN=j17M?LIcGQp~pId?cZx0BCl@D@G;!;vq2z4=cQ%oBg}TH}0Zqf|fl z_DuVK5Ak7-BIfai+aKIUM0nBuPiv*>|JPQXmD>N`$5Yw=IVGXjfgKw5$>24Lj10+l z41i?M!q0B4lK>wKOGC9r)Z(u_V0*j-iq~>|=p< ziyECY>eNU(QEY2eQLoy<$bw#8mBNhr3E^a$Xet@GF6LZioR8DAe0zm=noZZIv1grO zG{V*yWv9G}BBFL(($a*d`)eJEzi^t0Jt9!g$ECzk!G$EDhd6(6w_`CZ70XlKsSP64 zb~WoT-!IalP&sRIn0)7K(prz1pT{D0yCdsVCUYh2hIwfdR=HH#ICMimqA>k|pw-;_1RTFPp|#I#U7f ztiTX6BG8~x;wXQKuggL_!ftv1!6z=_CF7-^S4b%GY%5<;50G$&ue5<)bEpdkkWopS z)22c`eyQbaw|xcn0iZCXB0a5;*DE}MMQD?|3`zg+tdD$-pQ%zATh)Xn5g*Jn3XMXR z^l*mOH-O}D2$-~e1cSn0~OKed`kjkim zV^*Gs`Q(2Nw~vl~d-Ha80mT=4L*w}#mT1P31sQRgx@2?nm*|@r^{s&w59euB6>$>7B6TO zu>C5;N~4}#SwoT|;$ikhglBZQIJ#v>J4b&ol_nCpfKax+RD_BVt&@r?rDw zg-n!=Yw2wiG&gjTDK4GaLUyi8Gp5-|uNzXby{qn`=v)OxEbe>jN5c$cvB z;M@X%bhG88t^!{aO!;?(h< zdwGBEB>q$AQC2rk$znhMoEQ7aOO`_s&(bZ%XQ{SPHrV%yP)VQq9%dbQ_N)}C=o3GS zBY1?Po{x92kCVF$3Zz~Zd7x1h?Oy6nA9^Og?3vd8?99>aT?JUA|Ld#O_;0&a>;L^c zGxa}R7T@ub|4}UW6FV{EtX^^CPFwml(iMNtC1?9m^Mlv`i^J;jsJ!aaF+*CY99Fp2 zI{s3g%$@&C|E(eR12PCH!?!MDi~WCf|98c%&wt;~^8^l&5SWGP-cBL_a5lst^kU+B z>OvoKPtgGL{5lYiBc&6-huHUF;L~0b0VCmHS;`?2WQ3Kw)Y4Jt8BZX@gXDzy^N4@p zJ~_u;vZDF%g#~Xye+)EKHD#9|!VG*8V#~00k4}yRW!QKEJ2VJr2=8}}z$1(s)_{nn z`kQp$uzG*7ruv&D3cg2-6<+js)+ z5hFC_u)n*<4J%^w59|uVA|6J~q#S>ve|(J)Ak+W1d)vFO_pHFXgEkh$|Lv8v>iu75 zwf6t_@|5p`rMG(xBfI81YA5QcorNqQuR7nR-9VFHb!rkiK(^;=7*C$Se#iy#{q#x+ zsDQ6w9Mj|?n(u2z<5aWqYw7r8HyAh4gl@+$y4|izLr#5cJO$~&azb3;`3!%jr)T1! zs0|+zhu+{=fbR3Rva2km5^C>s>$kn__j`@wH~-!{DCK4$#jWIaUbovdjN@T`VJ5u> z&GXCCG*lzgnCd2H|A8bq*?G$RAit&PeMo{1aT4A6^!!Qb`wQUMRkqb9TyRAwLJS31 zU?#sJp>AvRFl6HQ-qSadKZ#;vlVAq&19!uW$RO;UHqOoOKG)6BZ}ET zpO$IfF&xkl=8#E;&NLcCG*p+%5$Dt;NM!D$kfVhEzN(;!Q!>UKoqtKYed_!4OpQ6Y z&RQ@t=XTF8aW*{&oy~61t{7s%^2toESR2M+Ruw+OZgIU{eN#n^Mx%cLpCSKibgTOv zUHA<9GEKWM3!kA|xiZ_$Y8KlXMNOFoQL@+Z8M^uv+Pt1XgQ9{!16itZQR{Zd(Yjm@4s;qw_%QhwbG?8Qtc(MUKtecfimn-T9l&Z)%8H7@HWyOn0*XZg7 zLRM3Y1KQ6Fhb*Vxo9Y_fnEA4xW*y(XeYKn%0aoxTF_g)f48oI$s-!df;;!P&DGnt~ z-NYvK3kJpOJs`x0#` z(CUwu)2r?Z4<<&FtI?CxfN1yR)vd`M9hIy>YGTtkmYi)#sA5Z#OB1&@_(mVJH#j82 z`Wcp%j!Cq%)X9G@>ct$F{L2Te(x>Ozmlp|%hejv$bJx#wAhYSB5V5iK2dClfv~el^ zcUmjX+DbM4=d|nhf85J+VE~xg*$%S<7Yf;$68D%L_>hLFF7hzA`Sj@!@!`Mm*zABw zdvYn(ReL=NW2-T#HHa5 z^(m7y*`SA>+sn{$oMmXW+soj*&`GPHSqIGRV#x6SVB5z`aJ`)L@UmR47uhkAB-r-J z0GP<)X0~;p^~)TDSnPXd2g2C*lN5%c;W4GYAd%StTP2cG5h7CPBYDT85T?DKqjvdJ-B8VVfBc{6|V$Ov2?alZAj7)E1=k%t)wd@dR; z4h3c(&7VJpKk*2KKfm4E?ZDI206fiCA3rr!?#J+_rbk9U=X^2;jChB%5SnC`%nqz* ztUNP2&|1|J&NB|A-=!R7=VK;0ZN;69&HQ_r11f(hph_Ohp$Pnm{F!}FN3q*S_VnYwl>#aWD;EPudI#* z3O6j4^TY7-{Aet+)MRU_GzDqS4A-^gevqTm}5eWy!iPSl>(#tY&p&c*C zt(QV-YAGb8c3Cen$|fOCoGf2XjG=I_fLMR4AT}jL0XpAB0v%GhJS)$>8LDL`3B~JF zQ(YQ{*cI3_OJ$B_%N6EDl#4z&FDr7I_>zX=i2S8Uw(Wmt`6{SfsiV^7R#C%$jiO7~ z-e)wB^<@9b3=&Dl&4cE4C4=S_F5#WDNvA#uE4tJtzF+oeE6y@F&c-r08=F#{osEBz z#`k4AQ;ty**2yGPTGB9Vu9WJh$~aSxly}>qejJ1qqpJ3}E@2x!kCLXPX?)J(;JIA2 zKPOxedXl|7>qJn2{0oL7$^>T8S79zls9fPkb6NX#az@#yPmy<$d#0_wKbnP~np0dA ziWmtH8-Fw>A69Js>BS4lM%yl-gOY#26C}VV95aG>xk#q%FOe%0Z=F&$!+quZ&5A^D zfu-wTy+j;x)5a^D&OF*-GKdcBhb~pu%-<$#g!k&;);y0__B@%(ldE?hbAbx2Pc&ZF zl?`22RPN=vLggUMtt+ZYW?&X-iYj=JS}ZqaYG9ATUC(f|U*fN)z5W-tYY%_BBtXh- zmd0I3b%dEjeQ`*{jotaiUHNnUXwEG-^tCHG^o`n~*ABgQ==0e&YvJG8Xs?$!mAQTC z@X2HF_{$9Qh=v@WxYWZx{{7KxTT2BHfF?Yeu4a9@Gf?u&Wzt*5ADiuE*xZ!=to95n zl0%TASY7{ww@7?100fN&j{|>v)UkqxjTJbpD`JcF8e7!Z;-0XDRPkbg?s4>*>fjT}=#|PlbPJH8vPJFX=;hC2Vr&BXXH=Q#i9^MNgF`kq6 zADGb@Sphnql}f@Hsf-MU;%MgKqj|7Knur~+tT{wa$$OSZW{?&(x3 zay=Ab?^WU~E7szwE6X9_f({r8PX3HhD2R`r+m?jnbFBM`m)-_A;n=02$4`2(dy2*N z%zY*P4A*lBlMhZHT~Kcf&wYFY!(Vdba0Qo;sO!tTg~N8mi)(*t*M(^F(ka;d#-|`X zs#wwgFPMSNc{A|KO=n=Uo`I{)z~-D8*ts%p(u|<&@5^L$QCj@S^rIo^Ppyik4}WAa zo!xYnG=P<#Ful-S6k^z$;kqaj6{oJ;(@6%!Na&Ff@nV#Npve?mQwLj%4xFQNQb87p z=u|@v+UZR>@)>_ebStH`waYAj`r*@57su%QvXylqLKVSL*MX)wAT#LT7sT*G+))&ulY2P&GJf8$7ZYF}p_)OBj8TSMLN9_r>nl^W?j5Ym0H z8K{BoH!}f`1m|XZm^I8TcesYRj|Ar4@RHrTqrC^ZWaoc4vr(*LUkbMF=bGJDvv^or zw0M|e`|3Ql+u!i&p_(__vem1HFIhd5hJB;O!_2$fYa8wPo3{!@3CKF`3?v=5hglD!ZQ%O|X$3EVPy+j4GOt`9J>s(L8*!`&q%ahWeqIGIq)c zJsg0#xPX7G6EK-v0nFY5mday>JBRP!ot!4gtV8P6VCqZ2)J$#JSZ&XfxjB%_l(Uhl z3pCSD<^zMUIb&O!JGQR@s(m}4Vk#mzA62w!R8gaf8dYSdB3)@IP?2T)Si_CG4Bgad zquk*dZPaMvt3n&q5Jqdx`}oK1XFUDhKxP)9tTASdF~3)gdBb~o`v=W8?~Z?Y^X}lGegto&H5*B; zwl9M_-_!Lx`xXHF6xZ9cx!zh3^SuE+ub8XrVDQI|vjK7VOD;7Y8gD-ycLmV%fOF+NFtwtefP8N?z+{)zDU^&^D+oru+swOoHaF1eb!Zd)Ks_pt7m`-_BJ&fk$5Dr|=yyiLah zJJMNPacMH;{JyERi9UIW1J6@#XW6n@eWlCnpXhh^`_<3`|J=7XM*Z3J0|02*ML&n8>zG?vT2!Qe9hrG4Gd|QZj-cM}RfcJl10q<7< zWowZ7NMgLJbKZQnzTgdPHAby5D%=-Fo$Ds2(MF}{C9$=nWCdjCV1;8gBDaVpt`8b! z^yXValHbO(-Xci6&U`;&Aee_f-^5}-t4MIS7-S6xYd8os9DGbM%XxTkbHO$98V}ZZ z5WW&TI5Y56!@;i{4nB@qt2)4)?ly(gWm)gG*W$$Y9^IM_SCTxcADHB;sCwJ zj1wwbaMqG!F;29>L+msuDbS$MF;n0m@{u6nAQv*zCtPTAS-K(RzfXUQxgt#kdI6L{K|r|C3CCgS+Qya0lzzCr z5GJRTI>72T{F~O&iGCI2`G^1fXntCHVJ$Vy%T1p^10^f`|7VOa%ehk=lWDUHr?xR+ zsg@CQe4G%P39WBKa?^ik&m7^+a_?V$52yOIPz>}