From ef7b03cfb2ec2f4cd40a4291c8278e040c60b6c5 Mon Sep 17 00:00:00 2001 From: Milan Lenco Date: Mon, 18 Nov 2024 18:21:30 +0100 Subject: [PATCH] Allow to use network port with VLAN-subinterfaces for untagged traffic With this enhancement, user will be able to use VLAN parent interface as an L3 endpoint and access the untagged network either for EVE management or from an application via Local network instance. Some changes were required to allow having SystemAdapter assigned to a network port (physical or bond) which is at the same time referenced by a VLAN sub-interface. Previously, this was not allowed and resulted in parsing errors published to the controller. In terms of the Linux network configuration, not many changes were required. We simply allow assigning static IP or running DHCP client even for VLAN parent interface. The only scenario which is not allowed, is to bridge network port and at the same time use it with VLAN sub-interfaces. This means that accessing untagged network from a Switch NI is not allowed when the port is already used with VLAN subinterfaces. Signed-off-by: Milan Lenco --- docs/DEVICE-CONNECTIVITY.md | 2 + docs/images/eve-vlans-and-lags.png | Bin 100675 -> 123257 bytes docs/images/eve-vlans-and-lags.xml | 288 ++++++++++++++++++ pkg/pillar/cmd/zedagent/parseconfig.go | 60 +++- pkg/pillar/cmd/zedagent/parseconfig_test.go | 195 +++++++++++- pkg/pillar/cmd/zedrouter/networkinstance.go | 8 + .../dpcreconciler/genericitems/netio.go | 3 + pkg/pillar/dpcreconciler/linux.go | 49 +-- pkg/pillar/dpcreconciler/linux_test.go | 105 +++++++ .../dpcreconciler/linuxitems/adapter.go | 20 +- pkg/pillar/dpcreconciler/linuxitems/vlan.go | 15 +- pkg/pillar/types/dns.go | 11 + pkg/pillar/types/dpc.go | 19 ++ 13 files changed, 740 insertions(+), 35 deletions(-) create mode 100644 docs/images/eve-vlans-and-lags.xml diff --git a/docs/DEVICE-CONNECTIVITY.md b/docs/DEVICE-CONNECTIVITY.md index 589b950426..faabdbb6f1 100644 --- a/docs/DEVICE-CONNECTIVITY.md +++ b/docs/DEVICE-CONNECTIVITY.md @@ -108,6 +108,8 @@ EVE supports: - VLAN sub-interfaces with a LAG as the parent - VLAN filtering for switch network instances. This is actually a feature of the Switch NI, VLAN network adapter is not used in this case. +- Separating VLANs from untagged network traffic: VLAN sub-interfaces enable access to tagged + VLANs, while the parent port can serve as an L3 endpoint for the untagged segment of the network Both VLAN and LAG adapters can be used as ports for Local network instance and for EVE management traffic. diff --git a/docs/images/eve-vlans-and-lags.png b/docs/images/eve-vlans-and-lags.png index 21511eaa0802b4cd3df8aa334eda0a316dab2e4d..eec356e85434a40fc1473791c06692d84992c93f 100644 GIT binary patch literal 123257 zcmeEP2|$eb`=6Pbq)Sm#QM#ndbf3EKL%J`c`_PnX(p^HOi0(TimD1rTOow#I9Wo+9 zI*<-Zh(zlDeW#fB{ zv6o+P7}yr3DDNaMJGU($L{LUkN=8~-QUvVL_i)>c16Prjl#&F0rNAaVuKLn~RUf+;%B(nYnGQxBz#LfVqv}>7)f^bOj|f z!L^~kGTNj!1HbsW_>#^w122aLw};--%YE)tLu;&=j%L^v*RXI4Cu0nD{f2PYudhbF zrf-;jfQvtNJ@tIy!RJZhc;MJ zjOpBvKwE9S+=H-l$12K^9uL}X;Nj(oCEpo{aqbLX7xKZR4S`q}cULYW&z z@?ZwwaNv3rGNas0KFBvr+rtMMYw|df?gJF(|9|dpqY?0%ivK5<)Ap9q)VA{3Y$IbH z;h|t+t`uNpPS&mv7oT9#kk5@&U{E+&g9C8Ee(oNSgn*uEg<`#eJS_cP+@QllfqH>$ z*dSjY@Ec@oz?MVHwm2mJ$W$N2?OY?mSa0owzE0&tr>DE7z`|3G`lqM5T{ z$OimfK92-xaDWX4d64v)xap52^jS{&9yni*pn!02S<>m!vZT=^S%s7g>G#mjIwmhg z+J>djFBv7$Mi-J^d;WH9=&651_TU(j>iqHZLyqw)4Vzc2;J(nUDWvG(4orw7R9rw1 z7UzlcbMevryjAN5HwCQ8@aBPb}GNQpw=4*tSCqm zis)d}{cwIj#eqi$+w?#f0GsBF+Wo5|Jp9}#_RqcRJg)t_mMlMa>US-f?6d#zmQ2$3 zg|9aN&-^K`4>adz>k>)n{_(m*dQXa|V63VCjbHj46d+Uo(Vzew`@3fU7a}_OZ-Ro1 zxWYU^fwYMd)5(&yEu5f0PAxwJ^Pd(JKw$kdm~QU0KLB;#Gw*Mb1xfHnTl2I{t zKSu79*&>AE&2V0TxA-mj_$_%Q;}=PiyvYhU7Y#{gLAdn$X~lPLsr0pVe0|Hg!1^a{ zDWgryXMRhu{&-|aM-$VU?;ZJL*^lBke(I;0%Ad0o;#q&Kp~%Yv666ou?k{U7QY5te zHyX;pCZ^1t_E(yUwl)-1{*k64P0H&3MpOCvmcOj2kdsIXK<+lVw+&#!S zWFXsia|1{Iwn^S|Zr9wopq4VX!NyqA1Y86XJ84eQQuRr;eG<1b`Ezvg-7t84$(AwkK3 zF2K4r8JSSX2B7diDpoE;UiuppF8|A-@CC$5e~&=;ZWTX`5t%{RWjS>;c{#^Gmf1lpB=HS`0`ZGND;6!5}i|KJ(`ej-xH z!ag|AqW-Iqy)xwXM{-2~cmpzlMUlEoksU9kJCOU_W4UnXUh-UqUjc9Yw^9=6A7$Cd zQvK)KHEBe?XV<{|zb^OuGwfPMa^5IEuU*Uk+%P|H7D1BV&#~&yvlupju4agU{ec+` z#KWM@1n3;n75;-pg}*Y3ATgYjS;V}9P7H>>bdaC-wdNyuo7gyp$D~N^ghk62u^Frjb1m$$VmN}t+Lk2^|ZQ|5A(#ha35?ZH3f%CpQ z(T@IvNJ*2VB*mpAB}x1a2{E9FTJrzM9Dn5Q(EETPp=gvOBMjW8O@ZXepFi3I`Li1m z$?Oe9^Z~RrY1}AW+UFwALL{ZWrmbbj%{>%2k<4UM!bBO8zK|vO^IHO>|M8sEoa3PM z2IMsPd-LO@Nt8ZiaF{>wCWYjGK6WIH2!-{68FGJQy$i8KEB#fww+uOCe8+mp`QZYx z-f!y*z?**Cbn$C>Q(1Y^8~l3mAhi)w*vGt_3Gf%+mpa&mvLi+B?G5Q?+N*8{ttL!dq2?`LFAMDb?0 zK(C;=^*mg0K|wfQZ~(>Z_ODTV5Hu@Z%O%i%ZiS0YUSZH030mKvf8t5?F~GiFW$oj;tR6@^f(JpTet?B}Ac?fSDudDn<7CnF;z8m^oQ_d2#ZjHHtK9 zK5Bj8k#jP?Ahix40cAiU|MDk;(SP7@ew2EbB?YK|e%$$%diMu#8A4|Bn)gC1n|(e1 z1{6@|-hjfk$rKzV++2XRO=3AIhJJwteIg(vE-U$^ZU3i0^FOd{5>)&ynE2nZ?QhEl zf4J=AFJar{ApOhPHrd-yK&d}0asCR@n6Je7Yj|2&KpR0pj#3)m=K7yu?XMt>`3juB zh%`uWi$WT|-eQPKUoZV4GjFkm><1{3h_tjgnG#tz^%^qEz7W93f?2!@nnC#wT@X=P zQCyMa70F8YH>`;`&t2yb+%LE+qU^WC$WMdsfM5TiCTb|KQBcKmr~L=u0wRAG3?};r zFDR;@^iwS6+q?d{7DFPq7ea(tFc$L<&SF5f$=9j$-;l-3bJt(jVir&l;@>QWoQhM< z>H2eh2&C4BuRnw!BmFb7nECGd>skz{(6SI>%)eO-XzK^u{(sM2z*kKFex6Kbp1c0C z_ClU0w-D@Q!C<$p$uneVQ@uEl)Y|MJtSm;Yul|K%)3RzdzJWHIyI_1CqR z1yt?-H;ei2M;Jw!pJ6fc-1XPBm<3erUoaN)&#lGCDoOo>EM~sD{<;=Js`pbg#s&oh z`$20Z`{M$@awlKU)CuwkgTA&$v8>9M4JLj#KWJe@%E{xTP2a4m^7VQwzpbh`-&e@L z?3Di9SsZ`i+9-+&q**?sdFE2`Bo>}xW&nAz0A;T&xg&bMfB{Y3)D!&U^2%TTfhzJm zR0<*Mf=T8;#wIv-@V~DnWBu=lSb#@;NnDuge^|OoAOsV2 zn=D0k2i7mZ9IC-C99-oqu;+MU^vS6khsX6#}n;XIE%U>@G z@x8Sq=7#1^t(-}+qPcKBmm$x)aweHOg$8}@Fd~2c$BzB;%>6&}wU!^b_UAj0n%gBw zHF*Uk68Azf1zAPX@8lr$*OyCV$+7YGZu!e%CbICqutw6lh+j-=ruanh?|iKIkG`e_ z;r97Hbo|?QjRBVU?F%=QpDd=>O!0N&uY&xScxpbxMG5h+F7CKcpy-h0|E_uch1g3@ zO6u!Xe&l6-!}=8do9yB#qw`Px#?8EocK_q4&pEC5${&9B6It_)6{!?S>4fJ!j#z;C z5x4l&s&7BM9Ls+ltfq}QkLE?`BJZ}sQ10spxbQNFR(d4%;R2A33YzFDhSi9}{n z*e*Fhd||t!oQoWnD7$QajyOnVJ_>QnyEHBk&^Jrt{+B){^xu`-*Pj!TQIwwV<6`qJ zj=K;)JMwRP_Izv151uyZ~5yn@7D{($jo!sUjg>c8Cg71L?SW&J_GyS6a2CUCPhjv7DCJ3zZUlM zEKEjDTtV~0-q_JJ}c83 z-aD8ysj<0L4_O9dD?nI9(V4+TH7I^LAi|tNXx${%I{eiR@=-=`E&6=gZ%>5wN1@r` z*)VmRk|Yx@WIw-bX#T~uqf;$-9UH=ur`FCY7c<3VRNKP`KbrO=V8m+$mHoHvSh217 zaujOvWpB>&dzII298l0zR|;#jJGF}|^UJ5yiA8+4VbmJCSTK0x&PeVn?c*xV7;10h&~bjOk^kkd-!wK45vI6b++nSVQ&R(# zP2cL>ef&?eJ0=!C*}iP>a`Wtr*zP4f*#i2>WgpF_XOC~Jz0=$E;yCQC|?ZLGj9h zC-&!-eZ+g+uDFs{Y?$#ucC`XiG9o_yOwe$8p85_)-K)h$Sw_(b>4NKw`di}!H{U%r zqFUM9`wAy(YR=Atg*z8&CzPzqsqoL6?A@WRsDG`|;tR3DMVaO4`e-(dKBzvmb<)qP zyY6HRDh%%0cL_QBF6hZpdDn3bE;^W9o^q(kvl|D5ZkL+cnhuLumGPDsWu-?>y)Kuf zsv%gyL{u*)b6YZdUriSr>Ak7;@z|Xc4jYdjRd(jQ_fee&U+3Q+1H(jxuwY_)7PoR* ze)$Y%MGCa(bpjQ9y3Eee4d$#2cc~2zRJ$uuK$Re3dF0Bm4X2-$?USW1$ z>K$(?-4Fq>9mx|p9vy@FK;Ng;9L|TQeOf{7=>$WSSpkt7amr#-_g1}soFKv4;!5v? zOqD*h>BjQm+odV2Vm8Lh<-Cg-l;2Knx9{tKqnSPW8PMbBS|?J+!Oh&ix|tccnd`$E zU(rg{Esrl$aPeh7XEpa;&M}B~0%8Uk#r9#{WNiUw>0+&ik+eD+xYh<4 z&@gZmh#K?>ZFCojdVM*8T_RiDq26Gy{oufk*^f?%@nW{P1S|m&Y#nTxutLF)8KZM| z>ipr7FRe0LxIjAry|G64wyq~Onw6z7o%Xi&nzUZjPX0DT2sLnLIl!bVM5PtkyZBAv z9Ir!0?ikXsiLN>n`Fc+bs(rje?m-NJ|8+adN~tfsGHn@n^rB5S_E#9iGKtfo5%sK^ z5BK@C?0J3U)5po2#miP3^fZL;l;;^!45Q0a+@hs>zvbc6%RD=*2wIES$1E<=qGM`p zx@Eq+YCJ8H7R~Rv?}>^*@he%5bH-Qo^L=T0(Hf!}SQdlo(OLBF`I!$Lx|Rnh8)qRXWho38i8M9 zSEZpz-(7G@Hy<%O^RY6KQ$}yKNnTkW(x_)`j)oqmyQdSqR>Bo!{jdvPDRKcFGltsA z@8PJiLcb0M=4Zh!Zf}5fIcrVV9UFv&J1xswQf^VQH=Fw;{+Dr4LkD`h zv}l%#3!1OfDfw^l5QCGylbq5O-es=>?3i>Hlk zd-rHj!Nta{lR7DQUVPO{4AON|JK^!*p&iLI=x*y}{CL_675+S5J$norFSyUedraJ` z^FUB!e{>tD$f=u)Jh4))7if2v#*J-`o?vd^@M5_?xHu*MOVgq@h6C4S=zEQu1=AI< zAx2(AE1|&fCij=JgNyc=fa9*HNdVDq{p66+!-i>zm+|T-PNw5e#P>~Ued+khG&I0N z(Ux`BJmf5l8_ix-20eSlbhpx%`c;590R~>@oe~(+`_EslFGfzUnP3+{hc%gf>9$2b zi(3zfMR4&*Y_~23$Sl~fF7OM*IL-Ec;hfCEyi}t_zc?#@E|;@VSJG-w?F%6yDqsZ{A74!HxRT1}H~I0p%uRy_c(0vI zXy#`Pz`crCm6_qsfS27jcG2dsWP#AK&`oC$v8e2ITo%e;tjY%-yMJ-LL}3{AWXLGy zena@_n~$hCyWKHx~6E!WTqt@4Lr_%UCtA{cna>q;u1vwF2(1IUrjY z=g|@1{Kc@G74AdhTW&11kX&t=zsB~2y}5{hMB_v{9($`bZDqjZn1k2Dn&ZZY)Ev@< zOvM?O%cf?D*|wd&sdjXGO3332i@oljDnSUQsJxDEczbtaNA+e~!!-W5jfN8w%*Evm zuP&{S2D%nL`6!h8VZ9zEPj#zJ)69p>)xBY_9s>;JQEXf3n9iq7qtBCg|7<8uDQGBF z{f|O}%Y#%vzv*1#P&q z2bW>G{0tTOzIeCOY~v^l9@pzg!??WIZ#+#}+NG6xpZbobzSTyP`1fGgo~EeJq`qwW zXp-7~>x6?cQUu0Ac=>wZ+H0UH>%efb!C=ns-#x^YIG>9_2=|{DCTQ(ufjpBr4KRC) z1IpU;8X2w^_Zk-I?4f>x#KV}+Z2MT_^8jzSbhU9Aznu4-vci_j4{^XQt(K&Z?a#1xsg)|!?LwD3Ez-gE z=S03RrnDtyI=V3F#|>exin{BzXup1T<7gk1BX-G3mDG-sbr1$+#Vc-~u6unzBlF_X z%BG4MIJ2p zScZ5#lv*#O@eYtk2o zs=T_ejHxfmcdWO$@)C8dhG2SK!NtQVYNChrlF}ub-fPWFzcCfT;IViE`r?Bv2i$-< z-P#2&6E-i3-3yB@A8LuFDls{@HrY3*4uOrfLc!>DvaF6{e} z5vE1-G7j$gB;erD5(Tfo4+9J{7Eg07#K7h1A@%0Hc#T-Se3ful2fas!1?-+1V_DV= zjGlDTqThOKr^6;qtV>Q-pUM}pXpLpd3T&Z1|BDCJ>rQ#z9LuHG(A~|%&5DOYYvlB+ z%ToMk7(De992;Gh#O@SnzBc5=(A!svrMp4gV!Xu!V>7tdvTipj9^cXnlgWE1R@qS0 zVZ_W?q>q954>4{!0N}UFU@Wabxt+Gf~UO54WhaBA^&&9uESvH+@|Dl6>M zgjX^aZ{-!F4%GHocHI&Obji|7yuK9KAO~Ax7OaEQ-p!Qdb^C~jfa%}_doz2>WjHN5 zl6B2>c_BRQY2@2C{o zS8T7t-aWee&QV*_DW|?oJZ6Y2W#`yEtV>}jZkLlqs^BSm0L-}xbeYxXN~TE08Vvr* z=#1M=)OdS~O8Y_OQVry#Gl7H2%XxUUQ=ScVpE=##5N>&n&58{kROZ-NANjt2cSQs( zzYMcf%qz*=Ai#*pm`^u`zjp#>3RMt=y26$D zQ-MNwNhix>1LU*?EDFJM=l!Wm&mUB8h9cnQ+%#&*zNq9#`-UJ(=@z-&)(+}Eh-RyUBesccrMwD zHYW~5^_(o(5UyC%r6BryjE%`q`b&-=NTsuiSO{w$H}C;Wh$UZb7~F!FhogPi-@!CjvM`2y45qir zdtfYgF*@ui`{G`okAHDNTPe4{1|SP_uPZs7 zn8t|eOc6^x)d`(_Pj<{q=>s=hk{HqGB{{6C^JeJQ;l}$a*oOeit&bSXrPC3CIY&<{ z$waSEi>&i`ShL=dh%skcz&RxMGZ)E4+Trqw)t)!=9hS>t3)B+f zAwmBA3=;enYZMlNSAAj3i{V=z{DR|JLR+;Ui9+&=GJJ$C)HXlAtiF*~W? zM=!h0jLvMV^{a4~Zn?O*vhfIiQsA@eWl6hp`I>OEVk#XF9euMO|2aPXi zxiz5p;KcCl%Tf~n5m>uR^Jn$rXl|6J9#QBe=`6pfdhykX(bpLQh5QIOi?N!gR+6@qt6Jxg}i-K6HoVB%hDwf*C$!tnjm zr5%j@!BMDobM~|lwKK|&TJ&z7@WME$M_ma}m~lP=u=J)1&Iq?S0eqSD(QJ?aXzSA7 zE4S1yQ8_Db#Ymm{eroVg);*-NE&v;yo1&QN^fZfUIlc`XR@k; z6^7S%3bRPz7NSY)qZxB|9aTOwAR3|p}`$m6+SzQzZ3?k&)Ubl%=3f~UL16^p# zFjW(QD31-NHyHw?+Sv>4CkWhg8W^)HfH%sFp8fFlIX3~Jmv>^AZ@fK9YOpO!j9UmE zwR>eF1NLOlu!T~@L|F_Mwk$FBV+K&12hT3>;j8AP0aHtqaBL{+(Aw0VCz2s#YQwkD zC!a0qiL{!Tj7M8>k(HStwHo{Ta((+Dp6Psj`d&0GI`KIAcjQ5^g)_sgb(r5qmFl~Ut&nMv0n zt*7PL1~^B~yRkw zjGfs$5li2~pu=|W*al07C#|Ou`Rq_yaA~4UaVa~#`?iWqdzar49>lwxr^!0Ih=-XQGjt1O%);W) zWL4>?>e2M{L4Bxt$$GX{ z&Cy%Nhfl1#mdz=vnAQ1Y#;<4EROZOu(t}jyE?G13TJ$^E+;Q22QwPtVv4k&UgW+KtIt!70 zt&7nO>~_0RP(Yh_+1m?8=khOgI1ljt*rVEF=W_=u&PP+l35JecNN$(&=E@wtJ=^(u zHBSzo_NlA2y&q`M?FY}6mW=syw!bRldsuy~OfzMO>CRe!W}By0AKp~)Vf>WsnIKeU)+*OgURag%#{`eEhcEE*Vzm!^VW-KfA z$2O-eox(R9J9v2-)2-c!Ts+`7a)Av^(XouJ}V(3@Z1@ zt0$p&Y~p5bzeP;l*-O+6mN8;pJleW$tLsU9?nP18hi``te0V#Hr%k_H%|-Cpk{=a| znrT$Oe}L$9cR^majHBKyb_Kr0sNlmR&qLc*L)mV_)UyLn!araeJ>;Te%e$PaoCg~w zyxS^`-7!p47gJEUgdfeUbgOY|=v!r5tW?;z^T5uNfCd=Y3YWPd?a@}Yv{Z6H2bo^k z^ufrQ1Fiu`>_?Ndo+ijOwi>g%cLmVSSI!&Izx23Qh*T?cD2&_8#`031u^FwZnGiB+ z;%zmHe@lB8-2E7n@FjJ2rpJS zgten}d4{6S-9p_WomY4v*b=;jy%#?3TA9IOQ-bU5BP%cm-#og7y3U4?^$xNMe56*n z&9L;g_|j9GJ0{yB zve6rlL{S@y_iq3ht*JpA9h;RX?(VTAmaeZRi*yqzde2`&Fsk{z-(mGJ3{Y2{FYODF z9cs)D(QW(y0a^-LoZNOcWHfX4O5+!BlZhY}03~i>l68@-fXJhtMcv`V6x@~NUo(NF zFODB#)9KsHa`nbCJOMY8A+$qB+&&B=6TVmI;Mz}z&)6L52oS#QeI`>WGqS08cb-z9 zDgBP_3MKml8%MF`JIA-$G4V7VPCBsR&7~`>R2ZwunOxL|Fo$(n^1E zV+!<>xgJ(u*{Qrd?q;d^M^=maiIp49zN@#nu{y=7d?{Pe5Ivql<$a#sc#0Q|#jAlA z_e%$^Nu*pW(DZc64I4>A#it58sg=+uBpaLw5Wz2Xo>I}G9~AKI9EqJ64qQzGOvC+j zche`0kg+wz;h{RZVMC7GjS(K5-UmH-@#CYumyZ+kLbx^H1_}Zm`gwxa*qB~m5>MbS zdmT8KRsrDD4zZVXXxJK_W^6ucdZdHA#8~h79i?M8hKsVF?=xSQu*Z*KBvMaW z^+NNc&{iU!d)*AcPzE;bPzJ38f`hWyCKIenTm@GKU6>h+=K_TMJGD8y`acdoX2K}y zV}|tdVo~{p7b~pq$!3%`V%ps-&_(O|E_hmWQ*No_^@^gR;cXtTF&SJTBX7cOpRV@q3eUtm9HCu5~i{w0)Gn((bn zH|~r?XUkyB5?;rP)?!XS)7&RN>SV3QHelrjScRr$q5C_Do~8!!G-As!Pe5JoZo~%F zjau|a*`B?(YDoe+W)7laQ9Z+h>mz7kRBajgs#|Zm-Yn{aodxj$iaTaR(2t%K?kTS&6dCVRJr(gb`1n&F6|}XGXf^fd z%%??|^{*C<^hVV03Iqv1nh^4$PQ+Bbab1>!?wdszS)VW+y`=hrB0b5O8efI#rDbQU zX-gOFm!j9z5hV8lU|DV)SFUKNIC}~B#&!umV!}~n0bGMvXZ37XEb5)pVU6}w0)MJ^ zpp#YKEE}yX{{8zWDFaZA!Fm?ZD%kMZGj}!vu-*Y`p&Sp3YJxIWug7A-~cT6+NDvA{HzH59utM>+*@1nJM4QidX%vWwN zBA;DXNmmYay_)TNK!wnCp|bf|Iv^62Yj$4N*~PHYdT+d6%rFzC;JiK$cV|Vm4xDvI z!NvB2wZ%U7RRe}QwuQeq`95HvZ5vzTttywbqm8MmCU5`|l$-0=h`GNJ81iFQ_h#Gx zH@qVWp`@*qpiyySn|U;^RsujO7wE+IvWXp;Vk+*;*U7Q6R0$KrNe)b_-&eKPsC z8))R)F6>#xhR>DtO1BZ@U!Uj;R|h=n=KB%LFkwQ+YYB*+CBwIISvzJMB{GBtGapnR zt}JIlyFPrLE;uFoGX6k?1ug7cxuvPs;4Ki5CbWZ7w>%Ly*t7I1e*a@+5$6`*db-9A z?HDs^id23ILg{o2ievNhy9Y21uQM=mnVTQH613tial3q7^wX*ndf5I)Qx}gDi5nYG zQgSJ&f5!ucd1f=~6;42pSon@5&{4Bsra>|Ts_0{i_X?bvw_`-E*z9L-F}#{9)h5X@ z3P8zgAk=lGCI|6!%X$?HE`s82wb0PX70WTzeQ6A6z?1SF+Ww&&bwBmt;f5Y9`V=bN zE*emps_9d)2OtMjoD1X7IfBj^plp+Shwr3-Rzj-XY7^;hR$9G?cm)EY(-=zGfO?AzN(tt5WtIO<|ex-k0#cT5o**C#iF&Pq0O?E;=*bP#J zZ!(?)0{_I_>usFNFm~nQmyaM$3On0kqlZDXv{@=>vdEvYFfr`mf4*w@_5d3b(oJi z7*u#f*AF(?Y|_Vjh>0e6g8Gx}MBOw7x_RA7X5tbU$40r+ z0heM?HWk-SmPaKO=-TV$4P48yRcOX~w&$fm4Caa_5LF1+?}02^$20&54WkjrBF%)Z zM8z$q^FS-fwY%yag~(XlfZm0YJ9`MzrJ zDStmuY0dpyyHnfhDX<+8w&#Q@e+rd+xD|jD}Ujv{ZfqEa=&zGEa!-U`p*mBVa zA+s}OONY++#iGtR!nckdBD6X_KX+dz9ucw|6$LLdgCAa>sSUK`L_|cT!dVTd$3wWK z$f*v7A7YnW+dzBI(i=2zV1@~Ar3&Km#a~|)IwU+4i{;d!?`@9(xlH+;GT<3|YLn&f zFMkO_b)-2B6BjmvbIWpK!rsePB?d*|U8~k*UoWL<4L)>sw@647>ccCLIpK@D6#Tq|=YE>F zDDEktR`=%V)x$;bi6f=EBPVX@(^-0=9uq^i{5*6xRGJhIZX9UK>dc7f=6d<)tiprd2?KhSTb<3T z4l01+L|mq@dFv^`gdo#|m8ua?VYkxQ;%!hWU`532q7yh9_w{?313oc0Z5N$%i1!K8 zSg0K=QUz2rmU(j8;gX{Xtt+zX7>Ra_LB_z*8pc$YtQoiqRGOj~>)v$~?mF5Ug*xqd)8-R1JVAJI z;+}0#0r5t;V`GGL;4|akgHfyx3bl9BIbR0@uxiK5G!wQzQssRQ#7j}9)$Ex4RJ+PF z-`=Lu5e-#tjpTIN`1n_RKV>8PnN z7pzsO-Fcj{+kHVZ(n!J*r(KWEhKACkT{kWvOf#;Kx2v%SL4kQaEHwzUGL^jC&9lAC zSvQ$W$#rN{0&jQHHLhW@XDdi;S&;fK?sUhUEE-`fGTp_v;@Lf`#pvnul!HWMd_ani=(~;WV?P8!JwHM{!+U9zeGnUXQ>Y*KI4-l@sLi^ea5W=C|a>mtIJ-rYq z&g*}RI+p-Sz_nFc?AM*Ja2Zqkp&@p!u#s5V!g9+}(VchK<%nOExv3%mbTb3^=c5TL zIC9Q;QuCF>*Ja&G2ZvI>!e!+hVjEW4c2Y` zEW5YY6`X%Rbg#l%tk&fiZLqE)TC{KIqkO>FG7N`#(l%m%e$+* z?L8+kZSzLH<%lIAeVo}Kdq$#RoX%m%SFDR&c-#2IvC&QM9fSNNQ$cmP1`zf-`?3*z z&r4pM7wP&b_F!z8eZ)Z3U~daTo~sv+?7Uz_xlkcJ5lj|8uf7!gd#xd z(>=S41O^u$e-~=A0=+b@I<;%*>8_;g+P$cqu?dyCqQj1vF?xu0kcKz<%HlBlAwuih zux?#R{t;j)GZjmC4LU2VJ0~R~Zyp2D!A6V=^JE#6Ic%wMDS{F;dd_k}t8M3WG%9TQ zPGP#@!zv$!4tw8Qi_cXFKNV55bJrdITxWhGt;yRh>(v81;5>ahUcb7`LvMsXVsa4k z_M9$PM>6xlLT&oQB=&s!{)ELYr^_&hOXc9+fW&i1=20J$+!tiKpOM`PRF*9X7q9|& z$qKHIM4x=!vIQ_|<>~iNdxmlqoHd|_Me3{u+17Ye%Vc&BXl#LLX68w_E6AO2i}>3Kh(4M@>M zFO3q-|CyL`D9~p0NcMBJ2u6Q|NNT+31QJuAZXy0E6*kNtH8tMke-DP;(n>0Au838i96@cI<2J z6Bk&Du@m27FbdM};_QSBMs{M#Wk^i97Ge5g2CqppC(;OjU=XI?V$RJ76vHrG2H(;Q zUuEW{hYNGvnV#29;5STP)wW0*7lq=e1^sIywmn)25Z9zy5@T6^3k;x@(mP^LZEmSX zRYBa0!yK5(AJuLCb8msu4c9@B>nltJZATz0WTPE{QhnJo%ibBQb zYUnKLFf>!8=7p&s^ZErUED&BW@yZ54y$1ae^QTx_y%e z3%8Wa4B6=v*ORD0ucHPFC^*vC5Rl<2?fy+6|5V>op70;lR;0=PaCR0RoO&4 zYtl#V=JlXri77j_tD|?U09g?t>(!x?McW99(V}s5y^C^PmdBy$)O2*Hoz)Yi(_$Xe zp#c;xEcKNBzlM>wl5k35v>9TQI*X6HNxt4BaS)y6{6~z(#WqwF}6z6>)+++DcoW8Lry(~9%A|V@2M@^4;A3-g7Vwa)p^`poA z;_?1T#`uUs=awHL@Y}UL3~UC8uRVLa=ygzF8OKGF@21L&q(0FfaU%@eEp0jIX|#3Y zd%@~AKwF}#wkGicRMR%f|FD1Mt3%X(Q@C#>YFr)L+p3Vxadc=E$-CwYkAKn1CV z#N>uv$k*q`+pUS0bxBYGD#?$#5q?1)VqBVa!Cg(%cN8LxvK{OE&$+aEP-C2rfc9@x z@t$em^<$KRUv!xdT=wf}*kCOzg+SY%w}UTdZc9in?>gj&=u|E#!s%jNbmZOh5)2iU}({)J#B#@B?zuf|+;Qhl!riJ03@g z6!Tt?VTkOM#DkZ;wh`AT2%$DmoL#>Bo`cX+UV%x_7<6}glHun@BuQP+dX+2PQy;u; z%DzQepnJt_?bdB^+mzJ+MxJg==PZB#%iPthtlX71K=-&G! zr`;ce2DvM3n&leZkP8dl#SFb0C*d(DWf5x%z#}(4EI)7@GyosB&@$W08a&XScI)^? z1<<{{uV2bR*(6WVd|!d}F}qtYr2tgPPNf3HLJj1!4Uh|Nv33Lun3SX1Z6Q;vOMNj{ zDqWZjV3*ZEM->B)n!PnP7i6}B$=zDe$UfTROoJcyGwrWtE7T1;E|jv1&McY$D$D$` z_ig~th{-K+4@=a>vaEc5&f>-}cq;fv|9 zovUL}F4cJ|9AG@Otbml69TYQ;fYNz-s*5y3p>FP)RZ9f$tOWJ=es)O!P&L(NKu7H= z%Ol2x!MvLLM?sdHCFKqb!^)Zt^vv1}NoXaM#qr@KLt>U+As( zU4>2pUIP?HkcDyTF9kq->W-Te(e9OiPUIeTD@)eGvQ&t9-e_2iK6WeXutl^YTiAGC zG*rX$r%JxVT&xJ{&Dv8k1r4hXY(*A41Y`)*YbCv7CK5CQC9w*d@!DXcG0)PvIlNqa z-hPonlM1rm(i2e!aE&j9L0)AwkP5D12;kztr^((N&A}Qj*+i) zL2G}L=z-xEp3w&M?>F@6Vl_?a1#qjh=mjcHE+P65dx$9Ll)0lPfTyiyI~~##i@G~< z?N)izMr05+8Y1(#)FSObe+~a4CazS_&S>WtF)VmBUsbvD;|^p2OIxe>#u{UwR;9cb zp(LME+C83TO`li4y;3Y8hR}NDKs=!}-ung7|4Z5eLNM?xL-j3Ce)GL}?4U$pT=j>5 zAW>#9Ji$`OUwiwDw^+AW;mB?dWvU-xeYOZkEpb!TrB)aO zrD1c0K~UJvxR}6BZ^38AEnr2cZ)4b2}JA)?PZ>J(K`g%5UcZ| zP+__e0BD8K05ase8u-|(MM;->7dWfVusQtA5ia%Z_MAa0l>&4c0l;3}<%nyaWwK36 zdjM~y1EqY>sw)0=nIys=A)#Xnvw+#v*)Z;zxWk+WdM!JT+U6Wte_+>hFW0MEvLu`w zy*n!eopyYx7JRZ%6$=V{tH5-bwyNwT2<$Rf0L6_RY1=1*17Zkb$T6oyw|WSMbMci& z1>%t{$bz^x^v&n#d)Q%YYmdcKW22G5G)oL7VO6kVf+lkN2uyoc_3)aNO>8jqyBGJD zrN2yaHmwH?0K|e&j~$|mO+)OYVNCDc{t=y+eC31oIk^tdWoK3K0yNtQg3SC@MV!)( zmmAerjPViZ6txppuisx5Fd6>(>B*9-5uhCw>d%PI7A|_Hk7Y5xc4KGt0Yn5oZsy#v zo%GyRFlU%uUz{)hV*8;Mg!-$FZK5!VpwsI?FIXv)Tow1>HAU?~?~A+ZgRl9OZZo(p z1j@f{LvpMu1khSrIu!@~Z3_ThCi-a^TWeQ?EzHpdiapjGLo3;%Sl8D1)1cPY5thj2 z35dJyM6GQAV-&4xkpC_Z9|s27PFQ^R5d;lXUN*S2Uh%*r9p2}@Mb=s&{J7(3|N9+m z0A_AFzl*U(xdEv9(MdUA3+uG8F2|d=4$_5{L@^0~D%;=?-96z1e;T%vdrClIq?{+d zf*>F^ap;4*Yr9V&lF@wy+om7LJsECMoCP91nu6(A}Oy*`2^$;cjaDFRRDqPqFlo;YpmaGD? zV58y$;173O%f93QUgCDTfH}OG&7WpjJ2MrPe)^#}@#4U}wA%+6g!5czqT_l?S1zLc z!OPrc^*^z6>7J@qYXfexzR44g>__&rN0({j3WN7qO@H+~tr+orgyw%AyP~MTwFbo{ zyAjwGVxvKJ=~5N15?f^nf^1hh6b#T@5g>M*7u_Gq5Q}=|bv2C`8vut! z?ErOlOTdLRkgnjKE-#9qwyk+y81ncqHrje{aZM+LNfhM!gP34oZp9h9*Uz}0lr4YO z-rH9EXbZ3<;1YNFW z05D-MOJ8b?bt$al+7CSmbZ`N5F#d5j58L=Lm;hR3^HV>FuCI^N2GGIZPWKJOxv8L) zmO@Vgo>_{k~I zg)>W2T@d>5-KYnk@t~=9^m>D-kfN!ulhqV>RG`#=8_29OZxJUHfmAge@bR2duCezB zj{y>b(C9t@7Q4@eni7i<4{IwyH|Cw!Z{c{3sfPwvAM)ZD%;0u~&1(+PhBAjCSH{Ea zyBoLLhOF-r4DWa<#f?c^E@uR0nehTvKL={=2hHSyTi?A<;}$E7GY#PE0fmdIpcmvR zhArEHpt^AD6$M0@+XzJt=$`feNga9l zODQ}OZ$~;a{2tXC0zY2@N=K)5%x+im?~4MnTrX^P0DUgmZIz4^q#lq%*E*mGTaPdD z)J7I)6cixyIY1ZZ;A=pPS6qn&)rV_Z`+R^37F-0Ro*-aXE$~=#uUkcNfcw^KntHYZOwdVfJJTF8y1#zQ zx{TFH5J_)QVpLLa5zJFyBedMO2Qx4;2SdUT@*SL$=699Zqov>eW%Gy$D3#J)o({iHS$;m~%H&>KVv! z3K@#JBlN!bdY;nl&AwlV;2>KI`y()^R+x^BHWyJh-kQS%HGnPwhSYao1Nov{u8#)S(KBAr*wF{`0%9 zfnL?3Js8l$S#E#k)Wk^VHH(vsdPs2Qa@OtKFteFSplgGErZuJsLlJ}n_&0T zpm4u+0Cf7i#;nkyuPk}JSzC*~`KgW9!fBFkgy^IJ;xEsqYzMv-Xv<%GfP$o~<9)P^b{w2@st^Bq$l# z4)cOsF}}v#qb)P7`%K_9K(wMAjI`+24OGAFo6(}zp$#5=(77csUZpKp>hRt*^A3~15z0pZ0frPr0H96(A62>vME0g9L z^7!v~*fo@(96F|xpz^wSDd=!K)hFb3nMQaS)8r-)0#(jx1)0R6`0D-n*7_2YNRx*F zAnL5i$yKJULI@w90`&_cke*UCc)kg##oprgi1ZS~w^({SeexvEKu7lJv%~HpvKQ9x zuLQ(3>dMq1<^bVUFAKIR`G-+n94IT-TtJUy}71b&=J(Qf*!*)d}w^~Ar z{&eP3MJ?>P3^2zU#7Izy7t4ecx}@{5eWSTE=qm0gGZ#3Q(P8ErZLkFHtih>Y?8_Us zR6#7h9{j9guD6q&HQ=Mmi77z*tu@MDtG*{V8Lz=(-wTiB9YH8WMG1_b_J4P-%G&{k zMr}4ddHLy$6;xKv;vcS6dzLr;p|h*d=)SiBU2Jg%BrYXi7-WJ z+yqvCEtOCEj%L4VlyDKKB~{QVL$kmDrvoy@t*d|mIr7wj;x5b`K>p&s^<@fRZh({K ziW{JCs+Yh5x8%deN9jJ}TW$dYd8*F~cQ+u&1}82Z^**oHz`;h9>PUNo=*v8IS z0C#x`maQUc2^jW2R)@L?rV(N61VzG7~nLQfNSi zjG0Pg3K=8g7E&R*%yTkD##CfZ=9y6VuW#o$&wJkA|9yYY?|l07Jg1{Q-1q%m_gdGw zu4}0e#R0_eeEp>hkh?K?ih!IQnX8PA9Xm$FCIpGMF@pxQ z(71Pl93N4*4wgyc@FG;`Npr$>LP!?sZhn!dg8u3RPpGgv1igsSH&pNA=`ciUUMrIS z4kvdJsRQGi<{OsCgQ9N}`yNiSdH5h-ar(EMRz&8~$r$c;1*=h5k{vS(P)}ZKL~s#k zF&jBHsVVuX7kYC691D#SlJ;O|j5#vaSGc;8jn5p@%b~0~;wEz+C2f_6r~9zCIVi`@ z_BX5mEruQU;W?V(99@mHcf)3o?6QpN%?GM?WSBW{rQ=ofJ(3)_wc2ViotjrC&CB*) z;cdLROG&eRSM<{ssh89G7ssp)xSIncRLd`PtTDljT>QMb1+JNVkV~HNHGrq7>gKbH zPkNi_PpY|71FtUy(i1Soa_v1fcK0|#WBT%>Z*;7#QRg2-LCM)$4P~D{E)jQSQ(EOZ#L{@=_jScpk8z&~% zPf$t_XMc2f5GraGN1sag4Wvs$p|RLw=kTv^TG?WuQ<5~(M5m;D+%d&LzM7j3qu!s! z{QC+wtj@7u6kk(Vl%n)11K*_=so9sH9rW`_S`{}3f@>NlBAMX9Nm%q$zdr(+aO*?m zC}p+=*imRpKRd3aR!6MRPcT7fQ%Gu=arQ zpD*G=t8;9S0LGPWxi~Zzots@@hc$)(QaWXT$X*WxJ(-0`5pm?0VqsA zh?4DItwFi6;Or>{X=*3U--XO>LnNQ?`CDJ%PlGsxdym@VISB~v?|+0&&ts$;3?d<< z-Y2(Gw^zI00cpckXz)Lmpy)KKTWh9x{>cqmtMo5=ZSFib)ODhH=y+o-Hm$e0dyaP!r9s`FB|`c_eUW`K#%*52DzE}t7=cJ@7o-w$;1kv&`uCA6?k}BsoqbvCCYXYbYn{l z5ibsa>tqdR#7Ac2OSX4{SZVgT4t)R23z~qZJUf-$`r77>)+3j3!AGHxSQIhlmOU*A zi;3y6{&QoAj=q?h{be7jurd7X?A!F$5MxM%aRbD>@qK8DZ!PxF%#{Gm7?S-oo{R3T zBZ#Oqf9>#aYk9;L+Js!j`NC;W1brfjsf z%WI6~Sa#TcOZ--zOCp2tv;X8z2D36L0>hUl?~pF7_x!??cM%){(z5jNtzIhCbs_U{u-J>nZkrL zWRJ&4E%0F5?E4TRen>2CO0iy_YW)scpgZZqj32Z)kbn?pnF^fbFh^lBD8Ue_6sMp+ z4IDE7;;a0aS)oId>i(}s4zi`czF0goDJiz(J!Yf-0OPI7X#;5CTMLUtJ`;`j3~7M< zu`=X`!d@q$_38S$viIfQo*V&4Jcpxg?Gls^AGHDC`2-kb>V-=?95^wv%LoD~B?sIi z@$U#Uh&oXRZ3LTE5QlX@l6Ms@hC?dU3=ILZGx*8?xYYsd0OBNZpruedkf}QU5^K@@ssf zOyGrZ0uFjsiW|Po>;JcJqoGQntCkm!sx-vM1s8GktHW)objHi6?8dMNv2X&H7VXR5 zk5_Kdyr8Ga>m}H{uz-ls^BztL;+Vv2gOQX4DbH3lwmo!!yabq{7NY-u7eN!qW;jtT ziou}~XBp+k@jx52IQxHjTK=x#!;Xp}d)7q6@krz8uN7u~Kgk44}b8^EzMB^GsaPb>&Ani__CSW7ZeF|(2prpLyxM|P> z3NyJOfX|(y3i)db5CecKghW-0+7Z(pWb88ZEO5SxA>aIWQ2EEFLObO+J8|`^D(!)z zzy-|i9f^frdr(1kju6D7diqd)k?2CufomlKwhD;|FXC^bMsMbHd-0R7GnBjTO?6=H zPz&Kz;3dMH>C7IKZ6y+^0!0)JUOXbp6Q>!1TZUAVyj^Ngkz6KXbI~1Yx_Yp^fXpK9%R432- zls*{&-T%uSs*eeX_62BFtVMK{Wv)+;KgFEPz55}!cSED`G4;6ibwcaZ+UQQS|V-0I(+Xb zS*Sn#}DT|9v`{BHo-$OawO zHWm<4jxm}C1?<{($LAeG2g|B7fF@W6dRz2v!GXb;UFu~Zml9sLy%-z|9y>+iWeo@; zMq6sNb~9F@HSF0rmte9}GO-NVBw~c8+ws)U%LKJ}p7%w-q{~#9_*l(&z-CN!Y2({W zX3zIe#QU2c8@)dQ^8H151pZ1J0v)svciwyGotf$9{O}O)FNxOC}*=u zU`uVqH1KJq&P^eDczbbph_Ds3WW_fEYQP4n@der-yA^y)hGP0)ednAfTjUmd?E#Pg zrN0{|OJ^@ZA0fg*iAVXN%O!Ej#98WdoR5QE3W zK1#0p6W18d7u;0qyGdUfQ5;WOD-xNoFZq%=98l-0?T*}7BC|~i>nWMxb2`1`0U8#&`5WM3@crMfh5QxWc zz4KkhdxF=~>)Ea1Nkd6%2IPjxZdW&BSWXbtG7WUUfDGmu|H-o_{&A;Wq!LGvW%3_e z)T7}OSH12HpXN{|m^|~4r2P_#i1Zvzd8Ia!P1R{~q-f!|Fz`nd6u1U+h&g!OB)@?> zM$$sC6p&^@Nb#`tH^*vapEw~zrbs6s47mgEE&YbU7uW-ew`xQLxw6kqigG{5-BydG zr~9qWKw%=G;zxoTWZ@uzA}G7L4_>@>4;Hvcx-X{{3JMVr+0u*-5?Z|*8dafCW{h*F zn;*$gyo+Hy?V>2IZ?*MDPX$G|Q%ywo072V5G~I{OUpX|?WfqBm<17AbESru)lUg@k z*ixDSANWjlXVj@g1H{hc^8$p}w=p|uaW9bykL!mNt+yX^(svGJUPGgUW=P$XAh#e) zeE9>Q&2|qWsoDSz{`(BZ{sj~ZX5q}bb)#cYraV8z($@C^tUT_dW4%ZILxXzewdZ_B*oe@uUf^llHh^!8A#8;dv$`7|eU5f`&4a?2&jN3< zt79aO1EZja1n@!eZ%Bjp+ND1QeKd1;Z?ly`Oe|bW7iIs#qD$PuQ9hsdeyuiyw-_N= z!%!Vdj)u8V!4V0~N-qKV^}t`*sX81+I`HvHk)GA=r+` zGraHF81)|hZpc|x0Ucl`(hrLFLpNLf>^RhdyU$YUVYkJ<{a>mIhLv7>NEPku;vRZX zI&VfufltD2Ps@OliC?cPhVsO;m(1wJW>@^2%}Y3RFshf*`FO*@PP)X%eP^DzZxD=3 zO`4$6;Rbquwl$Lq2P@&R^oV0_B*JU6Dgq<{{H4M!&G>4-8GYv7L9G>xrc~FT2vB)K zmVJ!*Lr`gEFhS+sBMJS5x@&G3xc#NPhJwTfSCstskFqj4+se zZA6*tf)%8;k@^qkuDmA}uKu_vvK-_p>O1fw>F(v98jI&{eiz$wnBq+kzj{IT%Och@ zW5}?&dyywhk}-LiwZi}G`o=+5SAv4!gBL*+N0ym^Q}a#-W4r5=Y2|lgu{xQ0C+^7e z@jq64f!iGQ{@797vWUI9m)u`-&9!95arOeDPM`l}9s&pbwc41dwz>a6ZPi<4lT-CK zpog1hbcFY4-8XtwruY?&eL9rFGR4;qq=QkrY~dDXp=X&*z#RQ!y_Zbsso;+LIrMgrhKk-FA-@X!VaQD1c#p}sq%rXOF z4(f8D48lg)#3HA1&WPaR+`*uxglM#MnuqyV+}hJd;xhtP6JdpTSf6b2w&$kBgOrl> zqiZ1~oI24D-E+h?2R~9)8chET=5&I@J7*(bIqZ0%X=n*yt`MG}t-(AcuD30O>X;Gl zmNs9{k9z>;&9jQ_+^-<+*I)a7oIOOFw=jcXl?>Z}*WAcRgKy*9p7ZecK8zt_t?mb-g3kxY1E)P zS{E7fm7fu8nC_KeFO~7lMZ8@c6mgb)lm9}g*826c9)Yu2FZq{?aX;sz09`t$Iyua? zbX*wrxAE~L;(9Vy18sxntLy=pQ{{Bly1PPmcJy9jpu8<+*l_{C^+y+^8+9Y8mi)vM zIr%AAO*z3F4Tq;pK){UuDCV#EruH*O+P$I^uUgZkoTs+w|MUpT>^`eTL2_73t5uoS zJm3)EOlX_>&A^2=I~TOY3*Gk%1n#5q>Jm=sPftqXQ+l~&d*AovIe!xPB;zfvQ$VCM zk(=&daA}-;nr%jhKd5&**eW*4f5ts>IY4h*A9bza^H%=x$n(hwb=Mh>-)XKEZ_l3 z&Fpv*&ttYg-ya|2Y<4`q&@BgNe;b#=bZXrm@!;T)cWo{ggL@TygczV)tppx;r!xmG}~jz%{f ziNFy|e;BnJ*nE#x-DP6GrRt0ZI2G8KT&+>?J>1R9x&aPNl0!4*Atrdkes~H#PN9n$ zh%W8)@4K>U6r+rdk|+AeKm|{JIP*ILd@NQ89th)t4LMx0-KNd6mGK#NsN@P{&Zh-V zJ>;E%6CyxDqF-Y7HG+cj-~oksOLb)e- zfZ?1o+3lzHYcauhc5UtQ2rdZ*8{7!yY1ESbNe-&- zRbiyf%8=?R^LHPlz69{%OXP!3J_zs8dJ893d8xfvb4AhWq8%!NcfB&M@$ua{dQ; zlN=j?c8yGy0DJi~zfL~`2>AJ~Su)H`xoWM*Z9bk3I^GnD0}*sC(L?OOl3u^Bo};rt zbx8CJd86fbDO+)pW_La8a; z{!oY4!MH|u`XDPPgLnT)+)9> znA1watrWLG+^O?T+$-Pe(0xNQN(mI*-kPt{!%^+#%6GiRxV02@IVx7aT{2{hs8=4S zlk*$u)!w+|#84a@jav(Fv8ejjswp2LAThcA?ii%#XYo&Dun1fs77zv9WoLQP6-z`7 znY8dV=%#8^_>CC~+}cdteG@Q|4BztMd*tcwaD3vBF^oDcc15I4;g#fr-sZ+%WVv~# zxCI2*E7&M|bDa8eHz3^dsi{aQQ!tS<JuTl4EEJLDkh{Gi0)ne0wJI*s*e{nSY%vex z*&;7GUHcYR^9@@WIofG*Z}hc01yr!EuY}=FAz@!*?PuxKoj&u>!{f(yhoom9yWsD- z{Su+tUJqMVP|Rs<*NJzdt`DEA0-s)7o_i>RKdhtiZcPO~KC@w;&_SDo0+=8ulsnmu6+ zoWFB+Us_9ns*#xw>gyL@8?>$GHbc)RZS(K#ym8H+Eq!ugB73#T(&_fX27kv_xnga~ zv_ZFoTFa@+RUWIc5<9hbem(Il`Fi>5C70p{&@`Q9iB93JNkQ+O?kp~haCn%|@jj15 zA^Cjk=kbe27gQJ%FNTph4iywXU#B~(%jLZ~p0v#RR%cQuY-siRiI@BXhnYNeH@1?K z88Gh!*a6=4=;{<+g4?_5E#lhve3srU&C4WNbq`X3@g8=c@SGXxfcDQEnm~$bx47Z0 zsqM6Gz+eMf(J`If%;s_YlW{w%Uni=FdQT{|fJe3OT>@Zx3lFtWLLWc`QtyZBCWP0X zv`enta^~AlUMjYE6yRkOkA+9X+Iy7X35>Bn zr5sdvd#o{d1M66l>BZ!zcjQoQ;{WVPUQ|V|{X~CA|L@`1vX#X&-pu&!WtrlJ8dZwl zuR0qAB!Yefn9>k!Ubm>v-+J|BWZ8%JNP*v#GEhgFb%ZP5JvreaC9fQZKrj9p(TLE^ zdXQMW$bOFq@rO?HdT9?m^vaC*a4(C-MOm#Z=PMP*lx=i0DSn;o5lchVvTOa}*oU&x zRag=7eqNM_6%+N|?a5vD<+xGtb|AWZ~khioWHpMBzKkI zp-2H^$PhzjeJ7z7GfFc;j?T$|@y!G&L!-76V3BauFDZVA#7w7omyG*%=)2fMzC6Fp z72WM4FeH$7Dx01;;aj~p;C|F}_suP+%cm7a4lKU-*%zA#m}mvM?$>Z8X^cC!lu=$C zd}1hYohbg)h@Q*i1O=VWx?ewM+#a=Ts6XKo<@6Q?Nac419L%XbqOy4u$iC{WED`P# zv-Hh5>8}JAp7Q0~g;1ES5=BHt``L47Iupef+j#DTSp5IE^x%E=^f;54@?8?y3h*Ez ztrgjN;2&KXDO&jo0MAFOrs}$lH}GZU3LmeGu5BIDS1z4Hli}l1p=0Q$9fc-0p#rNK z*F-~JmmZZ}d||iA@OBEOq=|V3f#|^!8>LHpv@YEGUX+&y)V4?|Mun!;!(!tT*}#j6 z))`nM&r$b0xIcqfWqYFGwZ{*=w#QPZ#}$)r9uC)EasS=i;C|TYRpqu_eMgeTrawQx z#GgAQS5`u6r_GpUOmsjE0y=nBT(GG0$T49y*P=Av3_5%D`t+Q$$6x*lT>Mv-m=tOG z^Z9!$yaJvyj{=_l24lamwUprVnTdz-t**l$Ao8HvII+xcB{Y6 z_NjjzxI&pQCw$1c{ym^!^Yv!dQ=_-u7FC|p3Fniy#H-vFBO}M0b_3M*_FA&0=|w?8 zd_L>s&KL*N{Fy@1SrIvcK56g~*x3I{FwBgUeUVG=2x+aNklyaeOiEBmAohFFP4{S= z@kK=(?-}@K5%)Q^ZN(X2gg0lk5#npkIa&z)rVx>Rrt5&s{QS%-!yCJq?uV>+zW@-Z zRs6$w61c8rHFpu@8m44@YV1$LmCqe_*IoCXnP=C=lNpIP-uReGox=7EzF_YfT^zwP zOuL$f6Ss&e0wKTB7bH08jPKK*r%9#tM5-v#9i4Hm%+F5GjdQp~@NS~$r|xejZ(k}h z(r6;b4$KKBWD|2R$F1i7dP>BCv8A;A{Xh!ug__vN{$0(h`(Kws3no7*r5V3gI84Rr zt`|CJJvMqZTAAMz#o}&F$Rr>8G?}nK1dXAz57>1V??{xJ?RK+jQ*oN~O#&;7wLtWd zso&nu*#?QdybhxppJk_ei@h9g6-4&jAKp}|x@=00&wg&`S0a~ID%aOpzPoZR-_G&J z=iPtdT0VBmk5umW=BiS{>PUe5LC>~%j>b>lZ}|tS%ir{Pn>fj4R`k7x#;G6nxm=UC z@OOKO)laj&u3)JnSKnutpY;wrAvJ8NKy-UoW6umZ^NGFNb8VPdggFtmcT@dGdr?#2}yyZ0G7Ad-9qiz{@FGi_Bt z+8woDX1=|qdb+8gd(4nYNpw%gpIoGW>Lnw$Mt`_7@omt*u3=w9RP;7)qT}BXgMrJi zd@mFnnl}!{Ksqv<>R);Ra?=~0lu3qU!U6YCV?LsjY_$eCs{IwNHhYl5eaj>-sojXI z*5t)OR`%Nh78*ZK4cnHzb6%jR@*cxJK1Aoa;gYNmPvy-F(REPj;gJNevnP-gX$GUj z{O%dfgR;Pco|>IHvvvsaCKNdH4XdA}xG|uw#P8Er?x^oPUSB71zx58Zc1;YG@J@sJ z*0{zi3`Ii4mI!sAp!aqgoBxM3-)q<_;aZ!fQW^u=A5YG|+RvzTv+(OS7a7VDh7Z{%(*5e=fPa?FZG{u$EluaO&m=9cjGdxIVsgD3j?0P_tL(IKTXl3NILTfRJggm3i z?s(J#54I#z+x}w)_=Ng1TJmNkDksk~#ej3b#R)O0pFzI|Sw^?YY-Tj_svsvgQA)sX zfF37Puer1MR%&lvW=}gRj&JK-3mz-yPQoTu+*FFPAHMAz3dbaKcx}5X3A5wVtJ5i}YJu^qKu|(km-i(Z?WiZXFu( z#UzD3>`^2`K9!wligaa)(Nj}o=W5yQZ|s&1)^RMYT{{7qukV$d#F${kDf7wRVi`xL zb-3({+ev4VWh;OnN@k5-52+dfZ-^X$z&T19W*>0T`LHfOV?-Fp9!B&&D?7_CjMf{F z98@af!WYYLE~E9FF~{_iRu@d-k3Zs;@$%l3Sxu@t%6NQf$iCzO^dBtT|EE^&DPcE+ zccynke&t~=ha4_K_`ts>Ll%)SW!0vv+0q++|M076J}$6)-KkPyA{EgD8hJg!5hC?5nI$x%b@TS9va-Haw@sc}Iisv^ zOY>EH!c|slksCLX0})B^&u+mHWVZMMjV>!MGEh1_&Lc)93N$+3YEyv81Gh~_Kf;&t z{3O6G3H^nL4{Y9u*K3l*z%yMIu;7VDxkcO5`FY{W45U##>xjAqv}gj4$ZrW) zWWPue#{mMNP!l?AQZ~LH7F7ItPWWp20d9jYEr+LX@0K^Mh26;aJX}gp(lN<@+NUGa zZgyq1y>^E(-=zNLg9p|nNty})JGp}*o4xNmdTWP_-Z;>7B#GaO2HoKKuK%a+0BR~n z)6jFqs!{BbtGFA9T^ip{nl$#MgPoIr54!@PGb`|KOw(axg<&nTfBC70WxuJFfB2Wb;jem^u{>lReNs3&vyT-S+|#R z=TZ(FK6ZFO{iiNbaQW`bLFW^XYEGB=)ZLWxF*;O?9#*>kOW>$WRI;In@ulm>`7UgW zJcE5Sn9dv8U!qzUiXRc4bG9=$_qZC^A6zp>RDU|d|LvGH#}-co>P6#7pS~e)zepxb zz){}zH2b0pbVaU$I4kzn(;Q-3bzt|H%9@xQDc^uxtT7Ae+dqF!ddi=sECg}!yYEO` z%V+zVtPuZm2x$~BaRjGX6P1XgmG>;bs@-j1Xn>%P6@9u2I+4!}>`fQ9x>TLb@~m)^ zqL*vYV+LNWGID~!et@@!hBsCUwogCao~_z?^z+f>z(J@7%+&P%866wvY&^W5A7UzSie0b zmy>_<-Bwy~fkyr-&a0a_j}z4I9e;V2uDiz=rNc<68j#mSI(%obN5MDefclI3Oyab@ zas7Vd^5=2qKGb-%I)p(V>#P4UV!&2{PExLz_FWpVn+yX|E+a#b^6lBDnom#;xf#Se zKp#RN?A>!|+Z}CZ%zTx3c!T?NG65qCRi@j`&1>tS8?E*H$H*lGHi)KNGo9M$O0B&fHORVEe1*+o z0Gp_$cKS*36xHbyyBdKOb*8sAi;k&eb|h(FVxMw4YI=LhA4QqDwx1Us!X658p9%s# zSM4BFLucVrJ&R8Q+R+D7V6Ipx{9n(4%N@!VU3Hm6LB?<6XPC;>xf6iFDHpBuGPR|u zYk20-%U{^{9vb$nhmUTNVBIU?#Sa7B)#ZK9o4RlR;%Rx-)vhFcE?DE}nCtVPRaxIl znI94qKb0A3VOuRlX)wE`mG@DK5#MqAod5BJwjN}_C>OaK3~|Ulf?YZnidcF{iDw;^J3iFzVfewkF`I}r0k{t?6e$@F+4~&{#x@%nu zW>R^$h}2ZKZEBJiFVc-Ll|(=KToO@iA-`)_v?*MDUsvqXWaA=E-%w(E*x&r9T-7=L ze0f5nWIhhf9>9iq{~Kq;Y$7b0WLh2m_<crD!vDhL+iaX$TX%6CpKvXQmh+@=$DE)4X1C0C!uOl;bd9=;&@kG%?hK;}x_^(} zQ2aIJA!_|_f0ShpU7629aLGA@ehwLPrKh;((D9h$cEjOy#C^A7%ujIYF%XGUtWBx2 zWI}tTT}BJd&>8YSOSV?crF;mnvyVW`YtU5!?9F|}&$X)KR2!$vD0xFE=0O$u8Z46$ z`O?yOgUz`5%%=~n6~3F-5P$Tojp(eP!>aneYvsJ9ppEi{Hpf+9+JrJ6yOzKwy!7RE z)ErrW_>Hm*eg8on349_hm-kwjc^j2DO7)Y;{CXg;O%hT3cZkjNiP@rG zS=V7)s^@ve4R=>+R=4i1gU>LhVg=~IV6K8O$Jp5N17yko%#Gj{8GU}~r2w$mDn^Xo zd=ov>Pe5|8RQ?fH+DID%B=|A~Ll<_Wg7<~)isyP8@JSpVzP7~@m&BRVrM|JR!!oq< zQtG{6TF-F_T)wjB^j_836l`>7W40cc)bz`&dHG#kH_MeTeW)FWx&riGAZt$ikm zk&!&Bjl0YDfen$%iCK&4tH0}C1u~O2x1|kH;CzTEs^+Mx)WbS}r|N1JQ}LtR?$_zp z0n?YNDh-!QSyz=j&B+-BQuoUJ#}2iR>Hl8T-PnJoJM)c=b-SUAy!~E_rlX6Q%1Z(F zYFZ}O(Xk79e8wDYkJ+AII#rc-mQy(6g8)2in4_Cr=zngg8k}kUiaJ9~C8wtIWUM9i zPA)DY5XCP{uU0XC=2`=|o@oOgIzRAWA7h;eY~=kkGAF9`b`_eQ6l*^%V4}Zj)qpg! zT#LeZfWxrLIuV6mhbP?P=kekA{MU`8QbN|31A{&}#AB&MHcpzIz|0f35qMe}%thRlUVyEBq5#a{4Z=zIwCL(YVrvF*vvb2l_1jO5R~6q)UY0z;mTV-Wko4Vub$moi zE;GwRJh!`Mr#-S;9-D-b9+J|g_$3(G-<(O4A0~gHY!n_R%WBATk_$%Q>y5_e!4VWD zg(Il06qSgI%t=R6pea1?*}z7?zq{;;TyKUqVSAVVd_=xCf0zT z!PKb6Ymo=&uH8b-WEL=~4*MWANsUj~hqyHoFInN1)l2)?jr>p3o__O$dsA)PY2(%3 zn+LACRot=D&+i~CX@6}~q1D0Ryy5s>rLH@!<|}^(jdetHs-jJ`Rl?ckd;QIU$^5Vf za7eDucOjuLU*~^2Ho0*qp05NlGf)8!c6pyTDWU%9)n!5OuclKv=2Rwh(OO#4;P&;=drF;XpFWR;<_%P7RStXz0k$H9%~9KzU7 zka>5<;!W)`d78{>INJNs$eloucW@mTVI~&D8QGI{!YY;DwL*K}tDcgBeC+@+MnvFa ziOWR&9GskLpGs^>@`-bKp2)bq3Om6ee98^xD$}_4?b!n0Lzu;yEPD2Llqa zMfN9)40AkZeNUYWP}lYhlo;`?^ZoV4-Jhwc%&+T2k#W(BvB1SF|L+L}$GQZz6>!5Q zy3z8M2gWs1mrc8J?+MIU)Vg7k!M%1#ln}YX5>YEmt?qEIy3QM6e7Xj1xx$~ct6+{Z z^=juQA8n?!T-F~I{6Z#mbGK3mBQ@sTvR01s0X-bz-B)kr)jF^K{>?LDy`Co=1S z_`V@mZ^C`W2U8V4Idif|-|UrH{XDkx!_%#!Qh`e&oZ-K=b9RD_m6PxSS zhzQN#nIf2Ku3b~8UGqRknb0%Z5{KYh*foz|WG2lOcyY9&mPiZ%##N|eux0;Njl=KS z@9rbqj=p!kjwDt3=nuW}SzDlx__eh8#ld%f|C8M#6=%CgZ2d5Gf?|}?}l!y|q;tKdSpHj}Kv%VGT zuA<=Tx^nnyS*U6%df!NAsHeRM__o6-$Mj=~tmx)okcc(y({4)wNE7nG@ao-&-t-_# zzD9=fuQjnmlwwBWxu>+SG1+ikwK(;wskVmk_c$jpT)39X7sVbGnIWP@=WKUhqq5{$ z`kd(EoIj+knRXI8V*cNcec5kgtD4#}&Q&}(2tU!qG94JVVkXsf$ww0Bp&eCtyPS}g z9iJ9WPLPPw64w=%)zXeiwbhN(>R&kJm-g(heGr?7>eD}y9C-jzVb9L1uPg57hnqK9 z;?2?Mz^~#P4%ygJ}`P|Rb-{_ z@HN4PNT(2`Bg#c(HK3}^D0pi9p)p21I+7&;k1S5vh%Os63iDA5Gw>ywQwHVXzbV~C zt|LY$`i$+8=!#4NBnx!<1$b2RL~|RW>sCYhoBf}4e4YNJwA1OR^jj$1dpWuGd7)5X z7RZ+iE)mP^495-rj4ceZ`CJ%lb>~S9j#fL$p-#?cj7yn-Ya$viKTOhERA*Bh z3Nv$tb-xFJ33(L}#HEwI9fU}42r6^m=@=O!MgmPX83Oae6GpBu_x83t50yFr@`0&? z;5dwl!_1Q^Fd|YeeIbbfsra@dVoIms83*&Y(SUYg-6q=yWH}ekg~zZ9U(jRazq`K^ z4|)SFfL^vKt~3hxUE{8Eify`kpw&1it1e8aetc#;$!50uq3*2*AUIgOQ4PYhSi9ZJ zn27@qm|z^+_Pv5Nz;K}1)xbw_g;W`1D{L!G8^MSl@ENi-##?OR$ZF841@|}0uORww zWabPA9hS{8OJjAG;L5~Bff9-Xp!iG8fVJl!$rz1oBaDZ`f=Bi)3pUUD!#8vk zNCcb>*Ma}v1&WEQ5cFV;bjkcXLzG|Sx5jg7ZoN4V6C+r;6`gw7wJA>9#K5DQc`B0` zd6mC@Vde0(quNV?bnyE;^nen5;3L)!S^UQz^ zEyO3g7Dfqu=@C*;xD1XH)Rkx`$<7XynQusS-bk-`{P!BdN)o~Iq~Sof593Vdc)QTU zx;i=o@@Jk-C+LXKkcOA{$mulaha((i>6@Rk^F({u`KI$1IvD=P#-AI}B28PYN_MNyiMjdepGYZA4 z-w@3JwXaE;y#}krASe@?Bc?MOH85yjv(` z0AIMXe}468f3pX6Dek|v8r>*J5QmZ(^T~sh`$MtF^cdB34M3;OhLa;qTVBU7UiOUN znjhe8Q&WHK7cq|25M=mdgVBgC&6f^oW06i=e_nWvi!$t-VFLjm!pLmCwFB@jUr6M? z5hblaho(;OEncYqI+oq7#~ zKQoY1B-gA|>mWLtVj51VUwjO!2N)pITJk1 zvoykWAl=rc7?$j0y`syGamLpwvuz?csT5e7?VA#15=RdG_Cc36#%S2>F|3e`NNXH1{pGT#iFLEpyOEp0j`dii<&h5J_?W!w)JuPxhUK-)P#omUx(* zHQpv z8NT%Y-e<^F=;1D&beTe+JBntgm{n3WR^P)PvFhynbz%PfdA|UVS6RcyF8t~E^D_lQ z^7^2k=Y>pks07@B9DJ)5pZf2mH3EjRJuHdM?7Gbw{yVb6|1nBLR`j8xU&NnmcmB+O`ZACk|A%i4py_2o1UbFf z?7}CU;MQ;N1Me<=zw6aM_Z*EZ_bdE=0~yrU`f9`tFg|Sw3V+?S|9b9~rQtlUhyX76 zFT~@2`$6~~n#0I%?2k)Xw4=B(a7>vJ5V|K{-}uMo;nUh;!)k8)KOZ%Me#FJ!ed)8f zH>+DoBefIE$3y0$dQZ;-ka-ct>VmK5a*YQ?Kbawh$XQwz_0KmO2guk>hC2?07z_Q# z^w$FpCl|n8gC&4_p`kCmC8(cyenswwbv=(8OdeFh5xZQJyYeh}+!@E<9)bRY{joI-pz==NgpAW&mj{blCLA(4`@N(ya z(wT#mgb0C60Lez;pq9S=@X>n;!G|*+vuqjw&R)#cba^5~q?+FfB!lm`0lm#{^CdP7 z){yAEOtp%bdKH*avIy>Dj z`w=&933wtAVuSVmpev*+*WEuV{M=o}5qK#kqC%eNop|uyVqHR(@`Vczz%)k(ZfQP1 z0`qX_Lw+wQf?^z#^v%?ZsbVTH_L2{_+H;Uf=EO0`6Kp?lYO4GrmMIg2oPk?BwaD`< zwKj#>XM!5Kd=1-zWJ1n=u6M``7ZgSr5Hl>Ggw~K?IxxTxU15_Y|K~BIB|Q#r(0DPw zI0OPtGwSnGK4Aj+H>a5X+fm@+g&&&9kSXbTg238MbK(6QOq=b7|8>E_O{;7RF^lM$ zz-7w&{ml$-8&}kwX+9TyZ~SM>K(ot|8DO}6)cSgTN<>-5AHSfKh-ymJjQvxd{QD;f zAT#F>GoHWBj%3!vcX;6=>Isuv_-|{_p#?uA`=h(K{24%;4r2Q`IMVm$_wDJStNs|I z#QRfLKD0$D+29F`O#2yR64KQA*9-8g!(R>Kk^f-8FKpz0sHUm!+_cyvNdP%$9kKy1 z`C-8#Ybk=roud?HH&=mV^eWUf_x~NEsm0(a!cR8{Z^^;AkqS+u8)Jw9LZ@ZVqoWXW zvr@a3DPMCoK@GA|w-!odw19RL{nMZm>3>cF`)49P;ZTK!J9&AyQqDw-QUMPAaxZq? ziC@@0GUaJFbvAB-`|tg3f*XTov?|8IArTdCp#Ag~!0L{#t|%HodCfVCF9a{;Bl~y2 zbA!bt@^;}oc`{#vE78aig4tl&V(O#Beva7)Up#FJYr=nBTyeDU7me(nc%0&bituC5 z+#J8KkAlwyh;EXJOMCW=Ut{6JSxxOf>l^2XytZr4OU`FF^zt5LYCn{&!5`T_NM;R(gWJ^g_il&kz&=!Z zuynNZ33KEm%8iKib9l|l&2r}BB4q8^8dZb)LsJOWL}IIq?b%fa4=jv{5h zP4}+{0c`}EsU>%t?Wr_!2N3pC=4&YP^i#ED^lx3xsR-ocMS#gqVXAgP1RmjprfMJ!mwdMIMrb>ec|F_)| zTsh}A+BvbRe{B&vd}T6%)yFMHm|X{s0C(p4I21UkB>^G23kJFh!8E?d;7-;B!#ZX_ z_0P{M%+Ax_-;V`|4p>19MKGcvBVeP$s6N2ABVDGX|I(|U1g||KP@O$HdKyVdOLFF0>Zypx;#bw$ zuWC265f7$op*Ek~2sry*@Cnl@5Egj_KtEyc*?%?YDj6YQ^$;S>s=Up|i!`ovAS5T7W9t z)Jnw#mo}#N!C>9*FDu3pz=lr;;t)b6GAh5OD?53g4p)h8eL(scJQg~^;QQ*rU=bqp zW4+y%ufwR4>4jYBU9MB1{TvJ>pWel!LGME$KTLrWvX^M&(*{ctfCQx!F(?VDzZ#W+ z$58?_AYstn!*QMYOi*^U5T{HQ0-nwLE;rG5F#cvFj(;7K|g`02**7#HM^0 ztL2VVn?L0onvZs;sStz7+M~l?)$d!8sk_}4y zX=uEwgD{;z6O3zY;Ts(-)zF*B31|B=$kM?4NjxgvgQ7Y4Ux{rTwQ~p`xOv^_XgeJw zgpB0sVX0rKUaVy?ZS+%}X@$vT->ZIP4#e|CRPw>B#pKd+bYAi8IRJYn1TL_qLm#E* z?>@@E-WIZv_gy!2|L(kzHVgU5JgC&6DAy)!_6NUaez1prTe~|IWmIabvU-7`F%ya? z0Yu6k%_@Ise`mQkWlHTX#SKN9+&p2p>U<{me9%z!JXUkI`xpTkJm-qWzi~E5lzfPt zMYW^YyRU6s(Tcz+tFYepRk?)N3%JAhN=>DN;Ge;sPY{Rf3YTv)z*tXAcd6EjV&fEf zaaM#j3^vnn#(1+5-e6PjKfb}k8eAiBCG@I&K?aOi9m#3Tz!c5sKra4X!sPp{rxobG z2dp)byupz&Fg~<87SYc^ETVdvG9K1R;{Vv5KkFnQd?D6~2ORQ;1s|9z{lZWT)cmO% z@K#Q)H+L@pY*U=uW!7HntF*h4Xb~Z)XiRJ795P646@ZAJfB$Sa8WMD{Ei$g1Fa1Kd z3s#O;u+*$(BVDkZh#9F3;hbt#xBUE*J{=a)z9p&d0YD3OL0A9o5J&h!HhvCCBBN7G z|8!4cSp}D05w0*W5m2%yibSDeetz?T3{{ewEFOi#D+F8u0@YQpfLTB3j2DXlDV;E+ zd~2ih=x5MTL0Fh6CiTs8I)+=5CYS(l>Fj@XS)TQ5s7X%m9q3|c!yuIzs7)U_?MSI7N}OR^=`MM*^FG0)l7?Sd_L5fL(*il|x{* z;`#|1QYr)Ozp*Fw$Sn%7QhLBi>;&n>Oi@8*zw;HqsE2QqYJP>!qXmogr$6|QZDxeV z2Y}OnAfd}o9+*!F2!CjWCb`QL`06}f7{zMjCM$ZSvxQ1M)Df*SVRT#uDp z+Uv}Fq$q$Gi7bs)8H-d-5Inu)4g<>;3GzSD)17Z^(-x%uGhbR-DXufN_>30!^<|!94)n#gt)de_d!xKKrTpwTqDIJUfuzXxtiO zlsI&Nhr;Wa>H91eqb!KQ6)t_NF?&S(;}F<2?Vvft0$zxCp|a*&nITfAN&d(RX7vcb z=>!(7*!4VOI)6ktq?CY@{SpBpMJhB;I4! zeLv50KfmAq|GsOzYqeUdb>CdqbzbLnp2v9{-_Q5J=~O}6Gg1=vS&Tt)|Di`G!Mdl| zyCE4gvdQU13gU~3?1$`ZMt>dvXCNclju$_nHCkaTnAtq~`R!2vCeyQ~)#~xi_Y=Qb z{a-5T8Y#}PbE$hM+HXJr^4GYf;m^hI)i~O?|Y|LHDxI$gTL{_7`DLjcXKY zSB!K7hJyfFC7eP8KLJTcxekd&bB_Y!gj85gKCAhvXeo_{{rpMZfh>ZKHw&5W&i5k_hW(L*{A*+K4DN;WnoYt`haES*4r~mc>m?U} zj~a8{1){zZ2rgc`Tj5tA26`6D=}_iPH2g|mRYcLe4DMK;MT-h$F(StKQa9}U5+A>< zF)L2WyEuk7t9Q}IkSuG?fMw06SA~AC5`IQ!B?Mug&~i^mu{?{o-Ac;t6Dc~$#2MX7 zN~pE=$8>;vy|ET+p<#r{YiNRm!de*UpYkUd>#67K&cBnhucRoVKvSd(xF?*$YS9*n zqbfC^PofMvT5fqnW;m7XOu|7KJ^Ca0N1QZ1${`dGLJ7MOz1SFSyCKNY!gemcbSvRw6YS9ebw=Z9g56Y(;hWPmt=IMwl~0aQq(=8fLf-828Z8?> zG9!^x6}cUkjg$77TV1 zS>idhjC5ZiQ|AyqkgLO*N`uxyg`+S>+7je^iLj#LNh>Pd1DIXPUgODBdMGzo`@dB) z{m=B(v5%_MQ0jWI0R0R{@XQHHSeF>v?+s9fR;*4T-ybQH>QfmHCI;dRdfpKk*t>LE z_G{2_>jasW6{$?3i$vX`8svE$r??GC7Y)$r3EMG z$)3DWBGQ@gvdS{0G+vv#V`hj3z zkt0$#lQr_8KqVD{z{ZfnGn2Ylq()$;Pwtor)RTV~wu3kClP~6h$CWi4nbhs0Nji(> zn1jGL9Rlk`jY1fWYZU3iVj3Pr$21;_BT$q9?D=$j+MdGp4^eS0{*Y$48b9+T^s4H#}uJ6B2AhjVHgRcV-jx ze;4Wu*xgP|~$h#%FWJ`$@ctNq9#7rzA zG%9Y+%9LbRv$s9kRYS{ZS9>QU&2Kie9~IDtJXW?MgH{VEIO-Sl z(fvx-l2Q<95=o^lM2$YG@eWLgY6P*h2Z`ZDcnEXW{H`NUSs1)LyB>c(?cq0`GKvSU z@7w~)z1 z;k`t$L|esMBKDWV{JpA%dm7qyu4Tt}Ifmm$*eu>>1m{PoSCDh zV}Heb{uLrIX@E_yc>PRt!vVzr!rH<+-O?p+v@&TsvM=OEyQC@gr(eC2dh;;@)j`u| zIb_GaFZCT>{rG(KJp$7G(!!CM$g@gWXcoQpQDgt}Q_OsinH8fh4jIZXJY=^KxC6zJht*(FgOW5UIL3;1+EzcvKrqVA zG^rYmGRH@*F|q&9I!{lyJ#|$&hRRB*Bc6FUzdfEw@4zs1M|063YP6JzBn5*>EgSN{ zg8ZgERw>z@K%L?XN7sP!bnJ66+3Fo9dGEkMGs-f;M1d_W3;OPc_J$=C z7Cc6B4HgxIEke15m?S#x>xWLgFmb+HuzgFc*zAdfxTzqN-sr9pJ9o!skdS0}NxP|y zi_x*yL1SjNY~?c~hBWi+-PFgFUM~m)DI^Zu-Ly*?_@ehq=b(JZ(*Rh2^IrM2oj+aN z4S{Hd<||+6*wSZB3%UP@Qxf32N<(3Lc`_BU)+qBR-L7jZVe!$n&|6mh&7TcuzU^$dZvqtsztv zbYIX6nVe?zRtZ`?MnOkGnT~W%H=rk^U~^Hd2Z-|v=F!i6<|fOofFN6>uawgKXDe(M3GBgMs-qG=GhEsr^!Xj z2iYy9X^H72P0CBPaaT|CwnJEBkS1%{{Vfp6VX0~EzRATQD`5w!F;K2$s`y%N!tolXu|hOPl>CnX}ZHpw~ht-T?-BuEAe>1Yw_!@NxJp{nwaM- z!Xvw-6Y_oKwAa`&)1Kdj9nkUAIAjOgxguRMkt@4ZJO-J>&bI+b!re0%%yJI0a!TE9 zs^b$#J1dVr_;A_i3Fyp1svou+(7!o0j-7s5SG|2YwRR8m3a)0cw$g4&WImeKj;eE-T~`i!*%;!YZwzJA z;=yi)y;cUlzxfJHfS}L4#ZiRj;rXag;e03;{o;M2pFEk7HdcY|GAIj{YRr72*>BS5 zXjP_H7h+&1V|JT-z0(rKuB+1angZp`oOOu~%@Y^aoq9hO^Et@6I*Qs$;qa_4B!tGIXu z_n?I6&Iu7B#loG0)7`sg%LCaDUEOedZ&CqA-RgU&^9Qdq)IN&uVmxx63v5~+Tg%)9 zMy3A3g4wUyBk+N$?Ofy&l7!ZC}xyhT< zd#F=N-(IrVJhFR5{(?$t4;_6_#SWOmFN%)o*Ym*}ClN%yz-WD&8vzzj_pQy||jSP}lY$IMR@`Zt+z|w8Ku%`lxH73SMK~r7In=XJ;)E2EV2VYv88r z1R@ZIQD@DLb!t0673h}jxA{1j->S0Eh;^;jW`sqt3e9X}R*vnqcyWWnVC}3J%c)Zs zK|2kOa&3P!=6>bI<0}%g$8K+%jBB;ddzp#bzZ;JK@Cuy|gKT9in^gHw^K<67SP5Dt zZNfVkk|X3gHcfXj+U5o`YiSx_(21rpz;ShsG+-sf7AOFTZ&(vK@>)U7m=EW6(MrBXN<}kzy55b7FNx z6n>xA~5x!iTSK26W0TFWdJ1n&Sn9Kz<7>TxS z8otvvG|ZS% zW>o!&Tjtur`ITi2+5cQH;v2BjmqPYE_3$VuOy&G7Lwd~wGNdvk^`O&k+-Of0r^tbU z*T|~_4+|~C!H$}=mE!O$3#z=?(_x4JDW5B6e5naK+K?PV3v;}`2m^Y&?A2tR)iC!_m#cN`Ij(W&9l}T)ym(u7&$z9$sc$VQEjaoE|gq$V_vzXdK(Qe@Dj*^kByn>Agw`1IXl zJ(9$PPnN^W&957Lh-in~0h$94^#45x)5p6C?+frL2p02i z_ywVOyyn`*o6K-e<}2v)8jf)CnH{fUoc61IYST>S{qk(0-WwTD&0qAxK3HK}h_-96 zO}Fq(O)H_p!4Xr~NMnonp4imTS_$ncIM6JWI|m$DKnQ*W!<*0jpZ(j31%*!!_F&UR zZFZ0qxZ@Hh&%F0W&aCCC{iN3gxkp?4YdfuLeFkLIG3hU}h86{aJ%ta{sw|jh_BqkH zz3!}UIzQ%e5n0~wCJybjcs1MzV?R<^R+@E3hdvXzIpHD9`=cz)rHUeIwND@32=&L> z6nt)(z2=ra_TLP+kSqGj!&Ucn)U4bt?^l=rkskhS|0^C zk^TGck+d5ToK(xF=?7cNFf5gEN?x4hGRh%*FUqy+XYpkqt8sh(YBjFGy|{?{#9nL6 z#i}=Tj(coDEl!$THEN?;M09g}7v1HARNWUh_9`s9O_-k=0`4*Z2+MN~A}B(^NWL6!R{E z!rjK6iaM#bMIkS~`ZB0cwV-!swE4Ubb<8 z;94QPAx9k4Dr7@{aHf(GsEfjVzShNxlG!G^M)_wVJw_QNT!MP0Iv%o(ugP2a$<^RG zUpMF#cPEt?3Ttv;pRy8c2D=(QEOveLm&Y3OYK|2Kzsn;~FIt~# z`YP8tE-pk%RF^B?nESdI+Lk6!J$`yb!nP*tvHAJZJ31CZJ>=_r_w7dJ6{}}GG%c6P zrY0LxI@6;Yu!RrvihcyO{vLaC3O0)h-ux*LqM?o*xE;9CIjwBIv?QVXSmwlg$HZ)n#U%rE4()i(qWq&et6QTBAwHM)*xG+lJ2cs9SM1USOs+;t zyg8_U?@_#FAG=U@`JxkDAB`59fH9usS&CMhVF8Sah>06T_<^)hxAVQG6@+{d^eu96 zfi&bD3$deB@@R1s$|Q(ZJHaP9HJOuh2a;)PhAe1tlN46T6x95FGb+hMQoUze-1Si6>Ui6@yOV`HX{LTT`1-K?aUbNkT|qNdMK3b%OK200VLPERt)y6d}Z^e{11 zfti>87~@j~OYR}fFK$ZL)(~s;y4r$OUhi>%HU`Be!wmX2rHK?Qh^-{ffs0dP67_dY z?&9ic)Auii7M5J=D$d}Q`x?IZYu&BUMFw&~EYIPb{m$EDsZn{?p;1T_0%8v8Itx`_ zb#hbJi~vTawJTQVdlBN5Y6bij)C$&R8$ZuT7)UujyXJSY^@dJnx6s7U{4_GjF9mL<~qoWnQsMTwsH zdaxvZ_9Aoq%)L$UZQPn)H@NmXtD0}jZZ}ZiyIznPsf@mToYtbL#b`4vh*^OPL?^3s)OmWuQw>vU%Dq{YD~FzBR$>IkY37d`zGs) z%Oi^dJsD5*%$MdkM*2*xZ2hp{N$_>0$MrUju{Z*Zf2_FrtI@xNZov69{JbwcROa2N zW&|)kItkoQHB)X|*rUcn>@Uq_DjD++o^eme)n1e~3w}_x;i3H3i2r*>On;}!%cmCq zT1w`Nkx65--1#x~qXq`a38vbOP6dQmHrAl)PyI}q6RDxNv zZTNt$uNh=^eu;4f4TxJB(Kn~ED$)*CEXQ5v_-JOxfvUVjav~DIAt|ne7q`gqIU{z$Chwve0Pf87eb@~_C z_>TnOKl9*vws_y=DfLk4M1v=ajSQLQS8m56->xyW-OFdq`$xgQ6KZt9$BQ9@32#g`I^SvXlvQ?8{n*$^)LgClz#j?BQr^X|1movRS+9 z!EKe&;cKcQnb*+10U4wR-TLH(dh_xRzCO-*Wbt(1lt7?kSpIOi#cRtO`~y3-j~(wD z<$rl&R*@m@^p2)D7K6s{n6~wJts{Qsn|adf{CmQ|lZcuBfwhX#kt;3nXM*)Ys_$pO znZD!mS5qJ&=N9fikbbG4S^8Y1ENM6PI#M-w?NvI<@ttMOEX~u;>|6Ggtv{`M_&jvu zeQC05P8=;`3tgqKsG)K}R$|N!mTo^?I9mHjl?f|1J~9+^2CIwUvHxybae{e}gX07; zGj-mr#($X80DCVZ6plAIq%^k==!>q@FF1Q%;|=vEeyrs(d@- zd*bePK2D!peqx$C>qaY7+FT#vxX9O~xGUxkvfPbyPllALmzi>TCjauZ7~kEWQ-^1{ zGwFyeVTQ)cqnBr?6x$pOn|Ib8D*iYDGbHbSO%eZdhWu420i;E7CV}Y{xcGNmtGTNB z!^Q?5`I}pN2BoxnYk{!z(_1-Tg5qN_=yx9KP~Vqjj8zp7F_~q%Rs_WSA72^u;0*BB z2LV7-zHzzm!56HJER4N#IyGUdxAH0%t@3d9lKT1lCciFR6*ahV;$;?&qd(?-8nKg4 z`F|~$cjv0h&Nc+km(RT4T06EHB+&hC+iz5PYtAeC0j*x-FcrP|lh+#i`Vrb#** z(6PHOM9NPCDsc8kWT;7*KjeFGHqhD|EzL@KpX)>}kf?7JA+450>KV$p9)n7Bz1ifG z`Ngta()yOEG5^`FAIE3!%OB6Y%Gadc$Fb+B%^`n&(9V=6@`}VnJ**0l)Jf+wJg^s0oim`MVWXv&3a8`p1t@2+fsK8f;VwS% z6BFU;m$AkZdrnt@!ziZgd6~gyy(6fzI1T|^^6}#PNlDq?pC7Dvs(tib*WtZ@n^JZU zY{PJm^h4hlwdFgkQnj|>e=;A;dLZ&VU3bhO`z{dVr=CbX!Cw{og3Lf3>hP5ZVLLA< z51Sq-Wb@6C>YpH!_?OliidCTe=k?X1dDHA)YEfxrh&=2dCF?Q#>L(ZR(tAPL09r4&Fw+;gB>%35wwehsQzsyPejG;W(Q_H@oP&QFygTi+kP?1mOp z)i<;lGm(J25J2InQ^UvFFXuCUa>2(zP~21jvwCFdWUk=*ec|PM{4>sGOVwu07kq77 zUE{HSG8Icb;H1x3@Axq<~RkcOdk~v61jtTyo zrzfd{(xge+b8A=t|H3?J?|piI0M@iKT&wvYg-KPIp&Y;X?z|EQB@1VmyNv{gC_*w3RAH|30XRhOkhKXK2Ucm^DK|CO3BA%J!@zCHfZa;}sr zXRu{7+;w^zlXLv?=a=`1b4Akk&j0MR9-3SEal-_skY{5+AK$(^0gJ^!dD5*x^?#iN zFUStgE?gy|FMX8Yb2GrRF!%8tgxygvjqgJAh-z9zo!^`R<}mB~+M-?%InP$sJWg6D zZ&7u+-=O;FG5Z58TN~!hXU}gJuT~1)>x(^G+E@GSVEwJprY*_2+_0{DA$#$U0|7t2 zcQ`=FXGaPgFzoaXZyJx$!$6gSLiitxE698uLDTQRW|+SVntr$H8Q&84$P2y<9)*vb zV!>2itSRwRT=JoZy?6ND2S#V=fkLeMdFSnKm-|8oZnWhedVhF;PuA(Z=bMaXzn+5d ztjns!28y<8eU!FJy8y2Hy{BLLymZU*QAM6fNleJf2iCXJGq(DY*~j1M?|lDx$hO4e zbc154)5ifwB)XAwb-z6Y{@Qs<;uSu)-Y@x|BKI>BAgX@OvP#yBcoVps7D8A&G440W zrRdcdx}nxQ(_Cn4rdGSczod%MCekhbs_LXTQIfh4Q0Z`Rc5vgV-rmjX-nu30p640y z78Qx4^41N>|7D#d5zQQgR?q{>+#I|rEI@RI(o1l&9`8;xvsywJyEu`ui4puiIo+OA zur4et1TVY*X~e>ffc<4!sOJB$Xwl-$?@2itsa^3y>uF@P(~$i0!aDBWvgQ-6yNBDJ zjmx(6{ZQrF)-})nCSmybb=p$a-RmcUnO{#TFU@)!+g>^3bVHg^KI4IfN8fKh8=oTs zAR{_$E9d&(3mvHV|1j85N0KM52z(>XfU=>8;BtZVKPKJClBD3HaA^Y6BMw%qfi;RMgDPgATj`Tr|x6@~V$q zbR4z(;-W=&!~z`$LBY&w6YdSFS~4VjcQ(J5UNjWQS)BUrvk<8HE`Vi#BgwgDE>qN) zuOk`LM3u^a{1C~D7U)6)=tAiV-NzpDoU3tYb%9P!QJH&hoOMwG|29wYpaJug#P_t6 z!_rw#LrC5!2V+UzDJ)1pl3r>3ydbt@_)EW9?M}7eVA_yLnnzRyLiFqV^3_?#7sl5+ zV|NXtoq`ioRsY%`2>(^ahr|uy^P9RmBo0=WN z_8CaVLITI&1If7-qn8XmIi&W>1np_2@57J{oYIIT`0L7(lI{dKfvd%qACwfUd9MxS?Bw`j4Uqa*x3!M%ghe(e z*XWnX6gJfA8vHNP#Iv3y@xNbmHXrM6rV12hO=Q5DR&-qs-uQO6s}*(l^uU`=wg^|P z|7mS}ShY}~JZ2ET%Jcb`$ZiYn`+UEo z+pv;)Qn4=I`IR3}_~)wobNE<~hBONNhXKp~Suc`M3C+3WJ#bU84;i3EPP!3uGsszs zp@w4CrO}>ZWJP9^UHKe~1MU2BUkk6#8R}_Xo zxB6d}CH9XhMyPY;M%KCC?4lzw(!f&k)65}3os=|IVFNwTm=eyttC2r9}a~O(UKU~+_#`;J@r*k=P!Sh$z|!b$7Q?IkEijg1eqM3-1_m( z8zkF1Xp*H#BX<(#;X?pC56RDzzdo61r)5pTfsdVe%3$AL1Sb=cNc`8xaNQBdj%UO7 z^kxl!aPMft#h=W>$Ujg}{eq1z(@W5u;1N`%ui8@=B#Ov9rixFx&%oZnD+5 zVtm&wOHGb3%uXUhDp#<*m4@lr6KzkznIREa&<;r((9_gH;NLMr3jA4Eu)(B!px{^* zkE^iB9UVqcL(3FvC)tDZg1FqYT-OztT+LGyG65LWA%t&Tz-KEi<%?A$Bi|oOlQq_C z>K5b-9ujgsZyP;tkkIkc=XO3F)P957ocNqGXvyV~mXoq`TFB`qD!_Q{dHg!Ptf!jaK%R{qIrtLI} zsjZk4p;6=q9~Zay_9dfOI*z8K{5LGDHlyi;6drLcB#=STXS%rsu)s3iB=VLRvmD*-xfDrmxA5>i-!ND zhmSV+GmiS-SlnhS{JN9x-8U|~7lPvP`8?uh{W+YdSoJP2$Tw!E&bv(|$k4x|jhRnT z!qCFv=>q{%uCuovh`uz{R@f_dizLNf#%KaHx*^T#DN->Kw21n^lFp{<@+F3ddi`d3 z^bN?w4}k3VyZs{FH%h1{7AJ2!@ElDgqV;PIKPWv9ihUhX5YUa<2i`J@-#AqXR^*_w z?D8(hJ$7k2_V!KLU~@ye(=7-@8b?Wci9Tf{p>~&N@AfA# zdV^$a>)~0Y>}m6leIsteFYbTWUE#@p^}SdiPqjFlxBMLhi&Q!~~xzsS!b-_okA51VHo zTMj`5*DMOYCWDjyL`I?nhUBKnCUWwX=~j??e^xLRD;iTZh*ZJFXwX`DVHc6sY1I|SgISa8{Lat?MhnrE0%cKyfo#65BJjCn%WIt2xa0`LnqV+ zEsr7JZUYd|EdjQw*I<8o>)nf~XTg@afvdUxZ`6zmkV^Slg7LW5o(KKZS_s21+D zjE)Z0=zy+v&2+NQH}ug7N}tToPSe&l8uCVCQfg^8M$TPt zI`QeYpgC^S2{{wU6#aA$b>miWy@k~vM;&y7YQw%%Y<`$$C%iM{Wsq!R;&vO>4){|J zxDDC(9bzQHB)>TOL$#>px$wr3FRm&-!+1pR%EjD|d7<(__6< z{rU`C$5mt|kneD)tf7+Zd8s*!tXPY}HkD;hkq=Iwxpvwyop&0_`J9BeG{4~|Yz1T} z^wuTYZ-0P~dcH+yv5NH&CZ(xX$HHbv-K;!6wwbnyNHHnBz^`Lw(A9laT{D(ubAlaxaT1Oo3F~(01 zT+$!5-O|8icbvK*Z>Vj{63k*FC=MnjtN|Uf7fHYRr9sF`d|#1leaMhiE4xQ|(Ly!T zL!b9&b2j?D{a(CfB$$c+%wPjLF}wM1tki|Xe$jVcg@XQ$f@GqysG~l; zwb5T5`x<{6Tvs#_-~G+NeWM~_AoQGvGV1aK^q>8$1vt~QO=tNRczOF2m~;q%Jp>R< zYn9-D9W1Nbf=GXkRDpo9~X%Zq|0Z)ZRnh2kDfrdDV_`67JGZGE3OuB>3V z+QQ1H!p^ApszusyX{Nru7w=r(mQ2o#-U>GuT$5?ukr7rfQW{)20+^`a2c|!hMTkV8 zQy-@L_ml)QsYlI6x1@n~JR|s6!L7^EEWH?g;-RPZLy5l;+Z!6E%=hoV3AVV3`KgK>~%B!GFHxX+mn z5j(mC02-J<6DN|id(SAclO0K5;gK4Q-xl3`1|}ojU#aQ>m!#|U0Ps5 zPc!xutO0AEku$6C*Es$)ngZ~K;@g`p*})5YLhVoFjUl4(B}t-xAj!W`#R<|1l_h$4 zm87_k=Zz-P7i*iGz4qZBk3k*}56DaL;iE5Hk%jZQzCXesnUEuqFZK^iHweZ9>=?hi z;DLEO;lp5X7(lEX{nY5c#_P}h@seBsXj5+Xz{qRc9T9z@4jcE`ilCyu=INh1o5H~D zgLkRCH{5HzFRu z?YGQ5oA`ejut>nf?BEC|3JJo%Cbx6)1HHXzU@H9#+y{#RBfIv;taRHF+)AH;S!viD zAd2@zJ15vkQ%~Sc=w%ZF`bi^3qhFV9gtT?fmb zXHZaN^>N`lX1PB@%v1x+Hu5UE=9~WBMm*q0Oa)zNjsjT0LRqFiE?lh5YMei5^b1(T z8>V-3w!St5sgaAk0(VOIAc7)vdkg=XTiA0jAD?6$z8na|C{!j2z5%Q=oMYJDg!)z47N;JOLMWAi6j@03P}ex;YI=a?1h#q^+5d zAl42M0F32(fe$4i#V>dd{@E{5NS8iv4)u_LaSMz^w*UGOz04)BElX)Ls9* zN(7PqC&_DHdj4GV9;Ms$n7x*&)DM+xfk2!Y&ISjHhw<=GJcX2n+3-=h0jc=$3PTxuWKKqRA z$2q_4$BsrIFgYxp&ONV=Pv>5JZu-}dX2I3ZZPf<`!qb8O#-hXHYe*df5-|m+l;~z| z5@WwS2T(nvj_5iTvuh*9A+SHo@N^sp_n@hPqq=&eP)7(sGKZ;idoHK|al&+-ZQ90i zY(qp<1i_{?xbfWNV|yPn0PfPkk6*7s%Q`!m!H?pz$qj%Vz?n-JI@e?X?c|Xdc{}#; z&IMn9j`4C);fH>|q|`qyLZ}~bgU$olx;{oQHx%!omePIjzH6UM-`+oe^W<$c`^Vdh zl5Zac)=Z%>U~rWxqu0GpB#v^n+x3RM2+7e3c>vbs7wnvy^0|&g9T?3O55w_naoA+@ zb^jPq&@x4e<_Bqn?X2kL9C3=O*_Zjxb$(5=wV^@gmjtAsQOCFruU>j%Ejn;LF&9Q~ zn3i%x9S%}nFGp(}50hjgBwHwwrqc9AW-_uzeIpEom*<+78!m_J|aInpi>CwciwDqQWtPSpLt zP9P}MNc1WM*_kAtR?LHOG|6BI%zKpFQ|@pNfK&1zXtI6-nlIsADtusAm}q@O0;9nz zrqt2u63a-W${WacQYL%>mo1WTa3=209280;g%1wAVWfmH_(YE@3Txr8HmF%opiY02 z!iMtig*L|hjc3F*cX~-}vq@mZ_m|2`y$1uw1+49SV@bA1@lUueIiU}+DzY0SYY~lG zA+jY*xC(CFK0p`=X4cjAe|3!ljE=k2dL z^}vYKZyCI0p&Q99wdh>_!Wncr1H3-{kO*V#viKIy z1XC^u|99lL2LCE@>*Z@9&2ZHrmv2WQ9Shb;-@!Zk^N7adUq4RWnrT04Om?DkcXIF7 z?dqR{jh@yRQXF2A_+K1shveUzZV~)87FEq3Q>rlJOF1I`SA8?#ZjVqanBI08sj$R3 z)N1RHl?#ygP!juCTOt=jofT65`hnhTy)l?Rybyfw{ZDZ4mj2IN@gSWBzHV)N2GfQe zCFw-P8ptHsMSvshH4=Oi72O62utcs)tbAaE8$Lp$I8pd`xsx7ea{wPH!@_nxy{u3X z%HLKtPuD^AkpWZm=sW!F;Kg!ckv2W42!-Y*!Zr+!Sr|X?HPvls<>UcXi1)+Cv{}XH zVTx$kzq~1LTtg*|CknM@+~s7Hb@pK#uC{-d{Owv1GifCj$rt*4uMq>V6G7l*wzdXe zpvosed z75HL(`WvM+dRN{M@k;#)J7Mri<(4)MvZFejjiJEMevrK|+Oq}TSr=4q0>y3seWI!6 zQ*jvRQXeoZS{y5AH=g}hAk@hk1Z=76>nhu0zB5{mES(0?3Wrq=bZS(;;AK{zmJ?f zDF-k0H&8oqc}aDFgw$sK7gAgOIr63>A(Ld-@O`<9*-iiG7Fa|OPCf9V5ODU2V;S)W z564C45@yx4G&QE*P_1}Ewu0Ym!W5p8Xm#Iv@{nP!%-}n8CgoSS?(4}@kai+j&_#Xb znm?C`q+#Ms%fg)M18?_+7;$Jsdf%4GkogjnyaJw>{@A=R(_@&C~ z$&R2w#9flGTjbwY~dKqZZ+%5m-)8@vi z#RKo24Y5L??u{DH`+IgEz%2bR{XdT+6D#R=Aw_nR_PVAaeay41!ULu6))0SlvnbaB zsH5i^mNhhesqeqAVwKXWmyTBIo&v`?mSKM|H>fqb#q}38tL!HuAXLjZ2GHl-p=;Hx zKX9b(OY0l8Mvrphlc+7rT-*m*D8)7 zn5JmTW1a5;5dJKK`x9Hy9k7RZXw16=jvIdPO`U+BcLn>}T=A!jM@CBQj27==$%r#Chm#TQriNi-nL%o6lf+~SSGIW*oqog3Lby>D{Juo3eS?< zCh))M*?w?1F50;Fx*=QTQoWtuGvV#CZ4it2jp0idc+TokkDvaKoe*g!85?tB`YRAB*53w(S0V^$wK^dSJp#4c@EOim9pT{(zTXkdn&W7?*%j%j} z8b;wN6dD$A9NCTuv|4cm01>hXB$Twb#FxaY{QPoH$(hp8P}9`>NZcFs=mxS6;OFn+ zMHxw{9`%VifgypaR-Un*d>kPjsl+}-F-YYb_b+s|G)^zg`1mi2QU1uXNU?1&V>ln4 zZcA#f@b8rZYXduA%aI+@DeUUKYfb)1kk9?rqR$MjL~<*T4uni$x59N>9LkSEekkyL zzzw4SEO(qG4n;v$egJ6x0gA5`mDNNR#-J#E35<`weT9WM7r0QJR@OqHazDVk8

G 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 literal 100675 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 C5O`St diff --git a/docs/images/eve-vlans-and-lags.xml b/docs/images/eve-vlans-and-lags.xml new file mode 100644 index 0000000000..adfd6baa73 --- /dev/null +++ b/docs/images/eve-vlans-and-lags.xml @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pkg/pillar/cmd/zedagent/parseconfig.go b/pkg/pillar/cmd/zedagent/parseconfig.go index 45c42bff96..77b6789921 100644 --- a/pkg/pillar/cmd/zedagent/parseconfig.go +++ b/pkg/pillar/cmd/zedagent/parseconfig.go @@ -825,12 +825,50 @@ func parseSystemAdapterConfig(getconfigCtx *getconfigContext, config *zconfig.Ed portConfig.Key = "bootstrap" // Instead of "zedagent". } var newPorts []*types.NetworkPortConfig + logicalLabelToAdapterName := make(map[string]string) + for _, sysAdapter := range sysAdapters { + if sysAdapter.LowerLayerName != "" { + logicalLabelToAdapterName[sysAdapter.LowerLayerName] = sysAdapter.Name + } else { + logicalLabelToAdapterName[sysAdapter.Name] = sysAdapter.Name + } + } for _, sysAdapter := range sysAdapters { ports, err := parseOneSystemAdapterConfig(getconfigCtx, sysAdapter, version) if err != nil { portConfig.RecordFailure(err.Error()) } - newPorts = append(newPorts, ports...) + for _, port := range ports { + if port.Logicallabel != sysAdapter.Name { + // If a referenced lower-layer port has its own SystemAdapter assigned, + // skip it here and let it be parsed by its own dedicated + // parseOneSystemAdapterConfig call. + _, hasAdapter := logicalLabelToAdapterName[port.Logicallabel] + if hasAdapter { + continue + } + } + newPorts = append(newPorts, port) + } + } + // Make sure that references to lower-layer ports with a SystemAdapter assigned + // use the SystemAdapter.Name, which differs from the LogicalLabel of the port + // when SystemAdapter.Name differs from SystemAdapter.LowerLayerName. + for _, port := range newPorts { + vlanParent := port.L2LinkConfig.VLAN.ParentPort + if vlanParent != "" { + adapterName := logicalLabelToAdapterName[vlanParent] + if adapterName != "" { + port.L2LinkConfig.VLAN.ParentPort = adapterName + } + } + for i := range port.L2LinkConfig.Bond.AggregatedPorts { + aggregatedPort := port.L2LinkConfig.Bond.AggregatedPorts[i] + adapterName := logicalLabelToAdapterName[aggregatedPort] + if adapterName != "" { + port.L2LinkConfig.Bond.AggregatedPorts[i] = adapterName + } + } } validateAndAssignNetPorts(portConfig, newPorts) @@ -925,6 +963,16 @@ func validateAndAssignNetPorts(dpc *types.DevicePortConfig, newPorts []*types.Ne port2.RecordFailure(errStr) break } + if port.IfName == "" && + port.PCIAddr == port2.PCIAddr && port.USBAddr == port2.USBAddr { + errStr := fmt.Sprintf( + "Port collides with another port with the same physical address (%s, %s)", + port.PCIAddr, port.USBAddr) + log.Error(errStr) + port.RecordFailure(errStr) + port2.RecordFailure(errStr) + break + } } if skip { continue @@ -984,6 +1032,14 @@ func validateAndAssignNetPorts(dpc *types.DevicePortConfig, newPorts []*types.Ne port.RecordFailure(errStr) continue } + if len(l2Refs.bondMasters) > 0 && port.IsL3Port { + errStr := fmt.Sprintf( + "Port %s aggregated by bond (%s) cannot be used with IP configuration", + port.Logicallabel, l2Refs.bondMasters[0].Logicallabel) + log.Error(errStr) + port.RecordFailure(errStr) + continue + } for i, vlanSubIntf := range l2Refs.vlanSubIntfs { for j := 0; j < i; j++ { if vlanSubIntf.VLAN.ID == l2Refs.vlanSubIntfs[j].VLAN.ID { @@ -1003,7 +1059,7 @@ func validateAndAssignNetPorts(dpc *types.DevicePortConfig, newPorts []*types.Ne for len(propagateFrom) > 0 { var propagateFromNext []*types.NetworkPortConfig for _, port := range propagateFrom { - if port.IsL3Port || !port.HasError() { + if !port.HasError() { continue } l2Refs := invertedRefs[port.Logicallabel] diff --git a/pkg/pillar/cmd/zedagent/parseconfig_test.go b/pkg/pillar/cmd/zedagent/parseconfig_test.go index 958f3582c4..7af5a84ccf 100644 --- a/pkg/pillar/cmd/zedagent/parseconfig_test.go +++ b/pkg/pillar/cmd/zedagent/parseconfig_test.go @@ -6,6 +6,7 @@ package zedagent import ( "crypto/sha256" "encoding/hex" + "fmt" "os" "path/filepath" "sort" @@ -362,6 +363,40 @@ func TestParseVlans(t *testing.T) { g.Expect(port.L2LinkConfig.L2Type).To(Equal(types.L2LinkTypeNone)) g.Expect(port.WirelessCfg.WType).To(Equal(types.WirelessTypeNone)) + // With VLAN sub-interfaces configured, the parent interface can be used + // for the untagged traffic. + config.SystemAdapterList = append(config.SystemAdapterList, &zconfig.SystemAdapter{ + Name: "adapter-shopfloor-untagged", + Uplink: false, + NetworkUUID: network1UUID, + LowerLayerName: "shopfloor", + Cost: 5, + }) + parseSystemAdapterConfig(getconfigCtx, config, fromController, true) + portConfig, err = getconfigCtx.pubDevicePortConfig.Get("zedagent") + g.Expect(err).To(BeNil()) + dpc = portConfig.(types.DevicePortConfig) + g.Expect(dpc.HasError()).To(BeFalse()) + // The number of ports has not changed, just the shopfloor ethernet port was + // elevated to L3. + g.Expect(dpc.Ports).To(HaveLen(3)) + sortDPCPorts(&dpc) + port = dpc.Ports[0] + g.Expect(port.Logicallabel).To(Equal("adapter-shopfloor-untagged")) + g.Expect(port.Phylabel).To(Equal("ethernet0")) + g.Expect(port.IsL3Port).To(BeTrue()) // This changed from false to true + g.Expect(port.IfName).To(Equal("eth0")) + g.Expect(port.NetworkUUID.String()).To(Equal(network1UUID)) + g.Expect(port.Cost).To(BeEquivalentTo(5)) + g.Expect(port.DhcpConfig.Type).To(BeEquivalentTo(types.NetworkTypeIPv4)) + g.Expect(port.DhcpConfig.Dhcp).To(Equal(types.DhcpTypeClient)) + g.Expect(port.L2LinkConfig.L2Type).To(Equal(types.L2LinkTypeNone)) + g.Expect(port.WirelessCfg.WType).To(Equal(types.WirelessTypeNone)) + port = dpc.Ports[1] + g.Expect(port.Logicallabel).To(Equal("adapter-shopfloor-vlan100")) + port = dpc.Ports[2] + g.Expect(port.Logicallabel).To(Equal("adapter-shopfloor-vlan200")) + // Add adapter for "warehouse-vlan100" config.SystemAdapterList = append(config.SystemAdapterList, &zconfig.SystemAdapter{ Name: "adapter-warehouse-vlan100", @@ -372,7 +407,6 @@ func TestParseVlans(t *testing.T) { Addr: "192.168.1.150", }) parseSystemAdapterConfig(getconfigCtx, config, fromController, true) - portConfig, err = getconfigCtx.pubDevicePortConfig.Get("zedagent") g.Expect(err).To(BeNil()) dpc = portConfig.(types.DevicePortConfig) @@ -381,7 +415,7 @@ func TestParseVlans(t *testing.T) { g.Expect(dpc.Ports).To(HaveLen(5)) sortDPCPorts(&dpc) // VLAN warehouse.100 - port = dpc.Ports[2] + port = dpc.Ports[3] g.Expect(port.Logicallabel).To(Equal("adapter-warehouse-vlan100")) g.Expect(port.Phylabel).To(BeEmpty()) g.Expect(port.IsL3Port).To(BeTrue()) @@ -530,6 +564,24 @@ func TestParseBonds(t *testing.T) { g.Expect(port.DhcpConfig.Dhcp).To(Equal(types.DhcpTypeNOOP)) g.Expect(port.L2LinkConfig.L2Type).To(Equal(types.L2LinkTypeNone)) g.Expect(port.WirelessCfg.WType).To(Equal(types.WirelessTypeNone)) + + // It is not allowed to use physical port with IP if it is under a bond. + config.SystemAdapterList = append(config.SystemAdapterList, &zconfig.SystemAdapter{ + Name: "shopfloor0", + Uplink: true, + NetworkUUID: networkUUID, + }) + parseSystemAdapterConfig(getconfigCtx, config, fromController, true) + portConfig, err = getconfigCtx.pubDevicePortConfig.Get("zedagent") + g.Expect(err).To(BeNil()) + dpc = portConfig.(types.DevicePortConfig) + g.Expect(dpc.Ports).To(HaveLen(3)) + sortDPCPorts(&dpc) + // underlying physical "shopfloor0" adapter + port = dpc.Ports[1] + g.Expect(port.HasError()).To(BeTrue()) + g.Expect(port.LastError).To(Equal( + "Port shopfloor0 aggregated by bond (adapter-shopfloor) cannot be used with IP configuration")) } func TestParseVlansOverBonds(t *testing.T) { @@ -717,6 +769,72 @@ func TestParseVlansOverBonds(t *testing.T) { g.Expect(port.DhcpConfig.Dhcp).To(Equal(types.DhcpTypeNOOP)) g.Expect(port.L2LinkConfig.L2Type).To(Equal(types.L2LinkTypeNone)) g.Expect(port.WirelessCfg.WType).To(Equal(types.WirelessTypeNone)) + + // With VLAN sub-interfaces configured, the parent interface can be used + // for the untagged traffic. + config.SystemAdapterList = append(config.SystemAdapterList, &zconfig.SystemAdapter{ + Name: "adapter-shopfloor-untagged", + Uplink: false, + NetworkUUID: network1UUID, + LowerLayerName: "bond-shopfloor", + Cost: 2, + }) + parseSystemAdapterConfig(getconfigCtx, config, fromController, true) + portConfig, err = getconfigCtx.pubDevicePortConfig.Get("zedagent") + g.Expect(err).To(BeNil()) + dpc = portConfig.(types.DevicePortConfig) + g.Expect(dpc.HasError()).To(BeFalse()) + // The number of ports has not changed, just the shopfloor bond was elevated to L3. + g.Expect(dpc.Ports).To(HaveLen(5)) + sortDPCPorts(&dpc) + port = dpc.Ports[0] + g.Expect(port.Logicallabel).To(Equal("adapter-shopfloor-untagged")) + g.Expect(port.Phylabel).To(BeEmpty()) + g.Expect(port.IsL3Port).To(BeTrue()) + g.Expect(port.IsMgmt).To(BeFalse()) + g.Expect(port.IfName).To(Equal("bond")) + g.Expect(port.NetworkUUID.String()).To(Equal(network1UUID)) + g.Expect(port.Cost).To(BeEquivalentTo(2)) + g.Expect(port.DhcpConfig.Type).To(BeEquivalentTo(types.NetworkTypeIPv4)) + g.Expect(port.DhcpConfig.Dhcp).To(Equal(types.DhcpTypeClient)) + g.Expect(port.L2LinkConfig.L2Type).To(Equal(types.L2LinkTypeBond)) + g.Expect(port.L2LinkConfig.Bond.AggregatedPorts).To(Equal([]string{"shopfloor1", "shopfloor0"})) + g.Expect(port.L2LinkConfig.Bond.Mode).To(Equal(types.BondModeActiveBackup)) + g.Expect(port.L2LinkConfig.Bond.MIIMonitor.Enabled).To(BeTrue()) + g.Expect(port.L2LinkConfig.Bond.MIIMonitor.Interval).To(BeEquivalentTo(400)) + g.Expect(port.L2LinkConfig.Bond.MIIMonitor.UpDelay).To(BeEquivalentTo(800)) + g.Expect(port.L2LinkConfig.Bond.MIIMonitor.DownDelay).To(BeEquivalentTo(1200)) + g.Expect(port.L2LinkConfig.Bond.ARPMonitor.Enabled).To(BeFalse()) + g.Expect(port.WirelessCfg.WType).To(Equal(types.WirelessTypeNone)) + port = dpc.Ports[1] + g.Expect(port.Logicallabel).To(Equal("adapter-shopfloor-vlan100")) + port = dpc.Ports[2] + g.Expect(port.Logicallabel).To(Equal("adapter-shopfloor-vlan200")) + port = dpc.Ports[3] + g.Expect(port.Logicallabel).To(Equal("shopfloor0")) + port = dpc.Ports[4] + g.Expect(port.Logicallabel).To(Equal("shopfloor1")) + + // It is not allowed to use physical port with IP if it is under a bond. + config.SystemAdapterList = append(config.SystemAdapterList, &zconfig.SystemAdapter{ + Name: "adapter-ethernet0", + Uplink: true, + LowerLayerName: "shopfloor0", + NetworkUUID: network1UUID, + }) + parseSystemAdapterConfig(getconfigCtx, config, fromController, true) + portConfig, err = getconfigCtx.pubDevicePortConfig.Get("zedagent") + g.Expect(err).To(BeNil()) + dpc = portConfig.(types.DevicePortConfig) + g.Expect(dpc.Ports).To(HaveLen(5)) + sortDPCPorts(&dpc) + port = dpc.Ports[0] + fmt.Printf("%+v\n", dpc) + g.Expect(port.Logicallabel).To(Equal("adapter-ethernet0")) + g.Expect(port.HasError()).To(BeTrue()) + g.Expect(port.LastError).To(Equal( + "Port adapter-ethernet0 aggregated by bond (adapter-shopfloor-untagged) cannot be used with IP configuration")) + } func TestInvalidLowerLayerReferences(t *testing.T) { @@ -799,9 +917,9 @@ func TestInvalidLowerLayerReferences(t *testing.T) { dpc := portConfig.(types.DevicePortConfig) g.Expect(dpc.HasError()).To(BeTrue()) g.Expect(getPortError(&dpc, "adapter1")). - To(ContainSubstring("Port collides with another port")) + To(ContainSubstring("Port collides with another port with the same interface name")) g.Expect(getPortError(&dpc, "adapter2")). - To(ContainSubstring("Port collides with another port")) + To(ContainSubstring("Port collides with another port with the same interface name")) g.Expect(dpc.Ports).To(HaveLen(2)) // fix: @@ -889,7 +1007,7 @@ func TestInvalidLowerLayerReferences(t *testing.T) { g.Expect(dpc.HasError()).To(BeFalse()) g.Expect(dpc.Ports).To(HaveLen(3)) - // Scenario 4: interface referenced by both a system adapter and a L2 object + // Scenario 4: interface referenced by both a system adapter and a bond config = &zconfig.EdgeDevConfig{ Bonds: []*zconfig.BondAdapter{ { @@ -921,10 +1039,8 @@ func TestInvalidLowerLayerReferences(t *testing.T) { dpc = portConfig.(types.DevicePortConfig) g.Expect(dpc.HasError()).To(BeTrue()) g.Expect(getPortError(&dpc, "adapter-warehouse")). - To(ContainSubstring("Port collides with another port")) - g.Expect(getPortError(&dpc, "adapter-bond-shopfloor")). - To(ContainSubstring("Port collides with another port")) - g.Expect(dpc.Ports).To(HaveLen(4)) + To(Equal("Port adapter-warehouse aggregated by bond (adapter-bond-shopfloor) cannot be used with IP configuration")) + g.Expect(dpc.Ports).To(HaveLen(3)) // fix: config.Bonds[0].LowerLayerNames = []string{"shopfloor"} @@ -1142,6 +1258,67 @@ func TestInvalidLowerLayerReferences(t *testing.T) { dpc = portConfig.(types.DevicePortConfig) g.Expect(dpc.HasError()).To(BeFalse()) g.Expect(dpc.Ports).To(HaveLen(2)) + + // Scenario 10: System adapters referencing the same underlying port by physical addresses + // Note that we allow only wwan ports to be defined without interface name. + config = &zconfig.EdgeDevConfig{ + DeviceIoList: []*zconfig.PhysicalIO{ + { + Ptype: zcommon.PhyIoType_PhyIoNetWWAN, + Phylabel: "ethernet0", + Logicallabel: "shopfloor", + Phyaddrs: map[string]string{ + "pcilong": "0000:f4:00.0", + }, + Usage: zcommon.PhyIoMemberUsage_PhyIoUsageMgmtAndApps, + }, + { + Ptype: zcommon.PhyIoType_PhyIoNetWWAN, + Phylabel: "ethernet1", + Logicallabel: "warehouse", + Phyaddrs: map[string]string{ + "pcilong": "0000:05:00.0", + }, + Usage: zcommon.PhyIoMemberUsage_PhyIoUsageMgmtAndApps, + }, + }, + SystemAdapterList: []*zconfig.SystemAdapter{ + { + Name: "adapter1", + Uplink: true, + NetworkUUID: network1UUID, + LowerLayerName: "shopfloor", + Cost: 10, + }, + { + Name: "adapter2", + Uplink: true, + NetworkUUID: network2UUID, + LowerLayerName: "shopfloor", + Cost: 20, + }, + }, + } + parseDeviceIoListConfig(getconfigCtx, config) + parseSystemAdapterConfig(getconfigCtx, config, fromController, true) + portConfig, err = getconfigCtx.pubDevicePortConfig.Get("zedagent") + g.Expect(err).To(BeNil()) + dpc = portConfig.(types.DevicePortConfig) + g.Expect(dpc.HasError()).To(BeTrue()) + g.Expect(getPortError(&dpc, "adapter1")). + To(ContainSubstring("Port collides with another port with the same physical address")) + g.Expect(getPortError(&dpc, "adapter2")). + To(ContainSubstring("Port collides with another port with the same physical address")) + g.Expect(dpc.Ports).To(HaveLen(2)) + + // fix: + config.SystemAdapterList[1].LowerLayerName = "warehouse" + parseSystemAdapterConfig(getconfigCtx, config, fromController, true) + portConfig, err = getconfigCtx.pubDevicePortConfig.Get("zedagent") + g.Expect(err).To(BeNil()) + dpc = portConfig.(types.DevicePortConfig) + g.Expect(dpc.HasError()).To(BeFalse()) + g.Expect(dpc.Ports).To(HaveLen(2)) } func TestParseSRIOV(t *testing.T) { diff --git a/pkg/pillar/cmd/zedrouter/networkinstance.go b/pkg/pillar/cmd/zedrouter/networkinstance.go index 5464b0f00c..cbfbc08276 100644 --- a/pkg/pillar/cmd/zedrouter/networkinstance.go +++ b/pkg/pillar/cmd/zedrouter/networkinstance.go @@ -167,6 +167,14 @@ func (z *zedrouter) updateNIPorts(niConfig types.NetworkInstanceConfig, port.Logicallabel)) continue } + if z.deviceNetworkStatus.IsPortUsedAsVlanParent(port.Logicallabel) { + // It is not supported/valid to bridge port which has VLAN + // sub-interfaces configured. + errorMsgs = append(errorMsgs, + fmt.Sprintf("port %s with VLAN sub-interfaces cannot be used "+ + "in Switch Network Instance", port.Logicallabel)) + continue + } if len(newPorts) > 1 && port.Dhcp != types.DhcpTypeNone { errorMsgs = append(errorMsgs, fmt.Sprintf( diff --git a/pkg/pillar/dpcreconciler/genericitems/netio.go b/pkg/pillar/dpcreconciler/genericitems/netio.go index 28e4172d33..40dafaaf13 100644 --- a/pkg/pillar/dpcreconciler/genericitems/netio.go +++ b/pkg/pillar/dpcreconciler/genericitems/netio.go @@ -19,6 +19,9 @@ const ( IOUsageL3Adapter // IOUsageVlanParent : network IO is used as VLAN parent interface. IOUsageVlanParent + // IOUsageVlanParentAndL3Adapter : network IO is used as a VLAN parent interface + // and at the same time as an L3 endpoint (for untagged traffic). + IOUsageVlanParentAndL3Adapter // IOUsageBondAggrIf : network IO is aggregated by Bond interface. IOUsageBondAggrIf ) diff --git a/pkg/pillar/dpcreconciler/linux.go b/pkg/pillar/dpcreconciler/linux.go index acf50567ac..43ce725e67 100644 --- a/pkg/pillar/dpcreconciler/linux.go +++ b/pkg/pillar/dpcreconciler/linux.go @@ -954,7 +954,7 @@ func (r *LinuxDpcReconciler) getIntendedPhysicalIfs(dpc types.DevicePortConfig) } switch port.L2Type { case types.L2LinkTypeNone: - if port.IsL3Port { + if port.IsL3Port && !dpc.IsPortUsedAsVlanParent(port.Logicallabel) { intendedIfs.PutItem(linux.PhysIf{ PhysIfLL: port.Logicallabel, PhysIfName: port.IfName, @@ -965,11 +965,15 @@ func (r *LinuxDpcReconciler) getIntendedPhysicalIfs(dpc types.DevicePortConfig) } case types.L2LinkTypeVLAN: parent := dpc.LookupPortByLogicallabel(port.VLAN.ParentPort) + usage := generic.IOUsageVlanParent + if parent.IsL3Port { + usage = generic.IOUsageVlanParentAndL3Adapter + } if parent != nil && parent.L2Type == types.L2LinkTypeNone { intendedIfs.PutItem(linux.PhysIf{ PhysIfLL: parent.Logicallabel, PhysIfName: parent.IfName, - Usage: generic.IOUsageVlanParent, + Usage: usage, WirelessType: port.WirelessCfg.WType, MTU: r.intfMTU[port.Logicallabel], }, nil) @@ -1007,13 +1011,14 @@ func (r *LinuxDpcReconciler) getIntendedLogicalIO(dpc types.DevicePortConfig) dg parent := dpc.LookupPortByLogicallabel(port.VLAN.ParentPort) if parent != nil { vlan := linux.Vlan{ - LogicalLabel: port.Logicallabel, - IfName: port.IfName, - ParentLL: port.VLAN.ParentPort, - ParentIfName: parent.IfName, - ParentL2Type: parent.L2Type, - ID: port.VLAN.ID, - MTU: r.intfMTU[port.Logicallabel], + LogicalLabel: port.Logicallabel, + IfName: port.IfName, + ParentLL: port.VLAN.ParentPort, + ParentIfName: parent.IfName, + ParentL2Type: parent.L2Type, + ParentIsL3Port: parent.IsL3Port, + ID: port.VLAN.ID, + MTU: r.intfMTU[port.Logicallabel], } intendedIO.PutItem(vlan, nil) } @@ -1026,13 +1031,14 @@ func (r *LinuxDpcReconciler) getIntendedLogicalIO(dpc types.DevicePortConfig) dg } } var usage generic.IOUsage - if port.IsL3Port { + if dpc.IsPortUsedAsVlanParent(port.Logicallabel) { + if port.IsL3Port { + usage = generic.IOUsageVlanParentAndL3Adapter + } else { + usage = generic.IOUsageVlanParent + } + } else if port.IsL3Port { usage = generic.IOUsageL3Adapter - } else { - // Nothing other than VLAN is supported at the higher-layer currently. - // It is also possible that the bond is not being used at all, but we - // do not need to treat that case differently. - usage = generic.IOUsageVlanParent } intendedIO.PutItem(linux.Bond{ BondConfig: port.Bond, @@ -1077,12 +1083,13 @@ func (r *LinuxDpcReconciler) getIntendedAdapters(dpc types.DevicePortConfig) dg. continue } adapter := linux.Adapter{ - LogicalLabel: port.Logicallabel, - IfName: port.IfName, - L2Type: port.L2Type, - WirelessType: port.WirelessCfg.WType, - DhcpType: port.Dhcp, - MTU: r.intfMTU[port.Logicallabel], + LogicalLabel: port.Logicallabel, + IfName: port.IfName, + L2Type: port.L2Type, + WirelessType: port.WirelessCfg.WType, + UsedAsVlanParent: dpc.IsPortUsedAsVlanParent(port.Logicallabel), + DhcpType: port.Dhcp, + MTU: r.intfMTU[port.Logicallabel], } intendedAdapters.PutItem(adapter, nil) if port.Dhcp != types.DhcpTypeNone && diff --git a/pkg/pillar/dpcreconciler/linux_test.go b/pkg/pillar/dpcreconciler/linux_test.go index 8f129cba9d..b6afb12e9f 100644 --- a/pkg/pillar/dpcreconciler/linux_test.go +++ b/pkg/pillar/dpcreconciler/linux_test.go @@ -857,6 +857,7 @@ func TestVlansAndBonds(test *testing.T) { t.Expect(itemIsCreatedWithLabel("dhcpcd for shopfloor-vlan100")).To(BeTrue()) t.Expect(itemIsCreatedWithLabel("dhcpcd for shopfloor-vlan200")).To(BeTrue()) + t.Expect(itemIsCreatedWithLabel("dhcpcd for bond-shopfloor")).To(BeFalse()) currentState, release := dpcReconciler.GetCurrentState() bondRef := dg.Reference(linux.Bond{IfName: "bond0"}) @@ -871,6 +872,7 @@ func TestVlansAndBonds(test *testing.T) { t.Expect(bond.MIIMonitor.Interval).To(BeEquivalentTo(400)) t.Expect(bond.MIIMonitor.UpDelay).To(BeEquivalentTo(800)) t.Expect(bond.MIIMonitor.DownDelay).To(BeEquivalentTo(1200)) + t.Expect(bond.Usage).To(Equal(generic.IOUsageVlanParent)) t.Expect(bond.MTU).To(BeEquivalentTo(3000)) // max of VLAN sub-interfaces vlan100Ref := dg.Reference(linux.Vlan{IfName: "shopfloor.100"}) @@ -881,6 +883,7 @@ func TestVlansAndBonds(test *testing.T) { t.Expect(vlan100.ID).To(BeEquivalentTo(100)) t.Expect(vlan100.ParentLL).To(BeEquivalentTo("bond-shopfloor")) t.Expect(vlan100.ParentIfName).To(BeEquivalentTo("bond0")) + t.Expect(vlan100.ParentIsL3Port).To(BeFalse()) t.Expect(vlan100.MTU).To(BeEquivalentTo(2000)) vlan200Ref := dg.Reference(linux.Vlan{IfName: "shopfloor.200"}) @@ -891,6 +894,7 @@ func TestVlansAndBonds(test *testing.T) { t.Expect(vlan200.ID).To(BeEquivalentTo(200)) t.Expect(vlan200.ParentLL).To(BeEquivalentTo("bond-shopfloor")) t.Expect(vlan200.ParentIfName).To(BeEquivalentTo("bond0")) + t.Expect(vlan200.ParentIsL3Port).To(BeFalse()) t.Expect(vlan200.MTU).To(BeEquivalentTo(3000)) vlan100AdapterRef := dg.Reference(linux.Adapter{IfName: "shopfloor.100"}) @@ -900,6 +904,7 @@ func TestVlansAndBonds(test *testing.T) { t.Expect(vlan100Adapter.IfName).To(Equal("shopfloor.100")) t.Expect(vlan100Adapter.L2Type).To(BeEquivalentTo(types.L2LinkTypeVLAN)) t.Expect(vlan100Adapter.MTU).To(BeEquivalentTo(2000)) + t.Expect(vlan100Adapter.UsedAsVlanParent).To(BeFalse()) vlan200AdapterRef := dg.Reference(linux.Adapter{IfName: "shopfloor.200"}) item, _, _, found = currentState.Item(vlan200AdapterRef) @@ -908,6 +913,7 @@ func TestVlansAndBonds(test *testing.T) { t.Expect(vlan200Adapter.IfName).To(Equal("shopfloor.200")) t.Expect(vlan200Adapter.L2Type).To(BeEquivalentTo(types.L2LinkTypeVLAN)) t.Expect(vlan200Adapter.MTU).To(BeEquivalentTo(3000)) + t.Expect(vlan200Adapter.UsedAsVlanParent).To(BeFalse()) eth0Ref := dg.Reference(linux.PhysIf{PhysIfName: "eth0"}) item, _, _, found = currentState.Item(eth0Ref) @@ -927,4 +933,103 @@ func TestVlansAndBonds(test *testing.T) { t.Expect(eth1If.MasterIfName).To(BeEquivalentTo("bond0")) t.Expect(eth1If.MTU).To(BeEquivalentTo(3000)) // max of all higher-layer ports release() + + // VLAN parent can be also used as an L3 endpoint for untagged traffic. + dpc.Ports[2].IsL3Port = true + dpc.Ports[2].IsMgmt = false + dpc.Ports[2].MTU = 4000 + dpc.Ports[2].DhcpConfig = types.DhcpConfig{ + Dhcp: types.DhcpTypeClient, + Type: types.NetworkTypeIPv4, + } + + ctx = reconciler.MockRun(context.Background()) + status = dpcReconciler.Reconcile(ctx, dpcrec.Args{GCP: *gcp, DPC: dpc, AA: aa}) + t.Expect(status.Error).To(BeNil()) + + t.Expect(itemCountWithType(generic.PhysIfTypename)).To(Equal(2)) + t.Expect(itemCountWithType(generic.BondTypename)).To(Equal(1)) + t.Expect(itemCountWithType(generic.VlanTypename)).To(Equal(2)) + t.Expect(itemCountWithType(generic.AdapterTypename)).To(Equal(3)) + + t.Expect(itemIsCreatedWithLabel("dhcpcd for shopfloor-vlan100")).To(BeTrue()) + t.Expect(itemIsCreatedWithLabel("dhcpcd for shopfloor-vlan200")).To(BeTrue()) + t.Expect(itemIsCreatedWithLabel("dhcpcd for bond-shopfloor")).To(BeTrue()) + + currentState, release = dpcReconciler.GetCurrentState() + item, _, _, found = currentState.Item(bondRef) + t.Expect(found).To(BeTrue()) + bond = item.(linux.Bond) + t.Expect(bond.IfName).To(Equal("bond0")) + t.Expect(bond.AggregatedPorts).To(Equal([]string{"shopfloor0", "shopfloor1"})) + t.Expect(bond.AggregatedIfNames).To(Equal([]string{"eth0", "eth1"})) + t.Expect(bond.ARPMonitor.Enabled).To(BeFalse()) + t.Expect(bond.MIIMonitor.Enabled).To(BeTrue()) + t.Expect(bond.MIIMonitor.Interval).To(BeEquivalentTo(400)) + t.Expect(bond.MIIMonitor.UpDelay).To(BeEquivalentTo(800)) + t.Expect(bond.MIIMonitor.DownDelay).To(BeEquivalentTo(1200)) + t.Expect(bond.Usage).To(Equal(generic.IOUsageVlanParentAndL3Adapter)) + t.Expect(bond.MTU).To(BeEquivalentTo(4000)) // from bond adapter + + item, _, _, found = currentState.Item(vlan100Ref) + t.Expect(found).To(BeTrue()) + vlan100 = item.(linux.Vlan) + t.Expect(vlan100.IfName).To(Equal("shopfloor.100")) + t.Expect(vlan100.ID).To(BeEquivalentTo(100)) + t.Expect(vlan100.ParentLL).To(BeEquivalentTo("bond-shopfloor")) + t.Expect(vlan100.ParentIfName).To(BeEquivalentTo("bond0")) + t.Expect(vlan100.ParentIsL3Port).To(BeTrue()) + t.Expect(vlan100.MTU).To(BeEquivalentTo(2000)) + + item, _, _, found = currentState.Item(vlan200Ref) + t.Expect(found).To(BeTrue()) + vlan200 = item.(linux.Vlan) + t.Expect(vlan200.IfName).To(Equal("shopfloor.200")) + t.Expect(vlan200.ID).To(BeEquivalentTo(200)) + t.Expect(vlan200.ParentLL).To(BeEquivalentTo("bond-shopfloor")) + t.Expect(vlan200.ParentIfName).To(BeEquivalentTo("bond0")) + t.Expect(vlan200.ParentIsL3Port).To(BeTrue()) + t.Expect(vlan200.MTU).To(BeEquivalentTo(3000)) + + item, _, _, found = currentState.Item(vlan100AdapterRef) + t.Expect(found).To(BeTrue()) + vlan100Adapter = item.(linux.Adapter) + t.Expect(vlan100Adapter.IfName).To(Equal("shopfloor.100")) + t.Expect(vlan100Adapter.L2Type).To(BeEquivalentTo(types.L2LinkTypeVLAN)) + t.Expect(vlan100Adapter.MTU).To(BeEquivalentTo(2000)) + t.Expect(vlan100Adapter.UsedAsVlanParent).To(BeFalse()) + + item, _, _, found = currentState.Item(vlan200AdapterRef) + t.Expect(found).To(BeTrue()) + vlan200Adapter = item.(linux.Adapter) + t.Expect(vlan200Adapter.IfName).To(Equal("shopfloor.200")) + t.Expect(vlan200Adapter.L2Type).To(BeEquivalentTo(types.L2LinkTypeVLAN)) + t.Expect(vlan200Adapter.MTU).To(BeEquivalentTo(3000)) + t.Expect(vlan200Adapter.UsedAsVlanParent).To(BeFalse()) + + bondAdapterRef := dg.Reference(linux.Adapter{IfName: "bond0"}) + item, _, _, found = currentState.Item(bondAdapterRef) + t.Expect(found).To(BeTrue()) + bondAdapter := item.(linux.Adapter) + t.Expect(bondAdapter.IfName).To(Equal("bond0")) + t.Expect(bondAdapter.L2Type).To(BeEquivalentTo(types.L2LinkTypeBond)) + t.Expect(bondAdapter.MTU).To(BeEquivalentTo(4000)) + t.Expect(bondAdapter.UsedAsVlanParent).To(BeTrue()) + + item, _, _, found = currentState.Item(eth0Ref) + t.Expect(found).To(BeTrue()) + eth0If = item.(linux.PhysIf) + t.Expect(eth0If.PhysIfName).To(Equal("eth0")) + t.Expect(eth0If.Usage).To(BeEquivalentTo(generic.IOUsageBondAggrIf)) + t.Expect(eth0If.MasterIfName).To(BeEquivalentTo("bond0")) + t.Expect(eth0If.MTU).To(BeEquivalentTo(4000)) // MTU from bond adapter + + item, _, _, found = currentState.Item(eth1Ref) + t.Expect(found).To(BeTrue()) + eth1If = item.(linux.PhysIf) + t.Expect(eth1If.PhysIfName).To(Equal("eth1")) + t.Expect(eth1If.Usage).To(BeEquivalentTo(generic.IOUsageBondAggrIf)) + t.Expect(eth1If.MasterIfName).To(BeEquivalentTo("bond0")) + t.Expect(eth1If.MTU).To(BeEquivalentTo(4000)) // MTU from bond adapter + release() } diff --git a/pkg/pillar/dpcreconciler/linuxitems/adapter.go b/pkg/pillar/dpcreconciler/linuxitems/adapter.go index bab56c5a36..9dfdd37396 100644 --- a/pkg/pillar/dpcreconciler/linuxitems/adapter.go +++ b/pkg/pillar/dpcreconciler/linuxitems/adapter.go @@ -29,6 +29,11 @@ type Adapter struct { L2Type types.L2LinkType // WirelessType is used to distinguish between Ethernet, WiFi and cellular port. WirelessType types.WirelessType + // UsedAsVlanParent is true if the network adapter is not only used as L3 endpoint + // but also as a parent interface for VLAN sub-interfaces. + // In such case the network adapter is not put under a bridge (and cannot be used + // with Switch NI). + UsedAsVlanParent bool // DhcpType is used to determine the method used to obtain IP address for the network // adapter. DhcpType types.DhcpType @@ -56,6 +61,7 @@ func (a Adapter) Equal(other depgraph.Item) bool { a2 := other.(Adapter) return a.L2Type == a2.L2Type && a.WirelessType == a2.WirelessType && + a.UsedAsVlanParent == a2.UsedAsVlanParent && a.DhcpType == a2.DhcpType && a.MTU == a2.MTU } @@ -75,6 +81,10 @@ func (a Adapter) String() string { func (a Adapter) Dependencies() (deps []depgraph.Dependency) { var depType string var mustSatisfy func(item depgraph.Item) bool + expectedParentUsage := genericitems.IOUsageL3Adapter + if a.UsedAsVlanParent { + expectedParentUsage = genericitems.IOUsageVlanParentAndL3Adapter + } switch a.L2Type { case types.L2LinkTypeNone: // Attached directly to a physical interface. @@ -82,12 +92,16 @@ func (a Adapter) Dependencies() (deps []depgraph.Dependency) { depType = genericitems.PhysIfTypename mustSatisfy = func(item depgraph.Item) bool { physIf := item.(PhysIf) - return physIf.Usage == genericitems.IOUsageL3Adapter + return physIf.Usage == expectedParentUsage } case types.L2LinkTypeVLAN: depType = genericitems.VlanTypename case types.L2LinkTypeBond: depType = genericitems.BondTypename + mustSatisfy = func(item depgraph.Item) bool { + bond := item.(Bond) + return bond.Usage == expectedParentUsage + } } return []depgraph.Dependency{ { @@ -225,12 +239,13 @@ func (c *AdapterConfigurator) Create(ctx context.Context, item depgraph.Item) er // Return true if NIM is responsible for creating a Linux bridge for the adapter. // Bridge is NOT created by NIM if: // - the adapter is wireless: it is not valid to put wireless adapter under a bridge, +// - or if the adapter has VLAN sub-interfaces and therefore cannot be bridged, // - or if the adapter is configured with DHCP passthrough: in that case, NIM does not // have to apply IP config or test connectivity, and it can leave it up to zedrouter // to bridge the port with applications (and possibly also with other ports) if requested // by the user func (c *AdapterConfigurator) isAdapterBridgedByNIM(adapter Adapter) bool { - return adapter.WirelessType == types.WirelessTypeNone && + return adapter.WirelessType == types.WirelessTypeNone && !adapter.UsedAsVlanParent && (adapter.DhcpType == types.DhcpTypeClient || adapter.DhcpType == types.DhcpTypeStatic) } @@ -357,5 +372,6 @@ func (c *AdapterConfigurator) NeedsRecreate(oldItem, newItem depgraph.Item) (rec } return oldCfg.L2Type != newCfg.L2Type || oldCfg.WirelessType != newCfg.WirelessType || + oldCfg.UsedAsVlanParent != newCfg.UsedAsVlanParent || oldCfg.DhcpType != newCfg.DhcpType } diff --git a/pkg/pillar/dpcreconciler/linuxitems/vlan.go b/pkg/pillar/dpcreconciler/linuxitems/vlan.go index 2a4de9ae2e..ffd3f3f852 100644 --- a/pkg/pillar/dpcreconciler/linuxitems/vlan.go +++ b/pkg/pillar/dpcreconciler/linuxitems/vlan.go @@ -28,6 +28,9 @@ type Vlan struct { ParentIfName string // ParentL2Type : link type of the parent interface (bond or physical). ParentL2Type types.L2LinkType + // ParentIsL3Port is true when the parent port is used both as a VLAN parent + // and a L3 endpoint (for untagged traffic) at the same time. + ParentIsL3Port bool // VLAN ID. ID uint16 // MTU : Maximum transmission unit size. @@ -54,6 +57,7 @@ func (v Vlan) Equal(other depgraph.Item) bool { v2 := other.(Vlan) return v.ParentIfName == v2.ParentIfName && v.ParentL2Type == v2.ParentL2Type && + v.ParentIsL3Port == v2.ParentIsL3Port && v.ID == v2.ID && v.MTU == v2.MTU } @@ -72,6 +76,10 @@ func (v Vlan) String() string { func (v Vlan) Dependencies() (deps []depgraph.Dependency) { var depType string var mustSatisfy func(item depgraph.Item) bool + expectedParentUsage := genericitems.IOUsageVlanParent + if v.ParentIsL3Port { + expectedParentUsage = genericitems.IOUsageVlanParentAndL3Adapter + } switch v.ParentL2Type { case types.L2LinkTypeNone: // Attached directly to a physical interface. @@ -85,7 +93,7 @@ func (v Vlan) Dependencies() (deps []depgraph.Dependency) { return false } // The physical interface has to be "allocated" for use as a VLAN parent. - if physIf.Usage != genericitems.IOUsageVlanParent { + if physIf.Usage != expectedParentUsage { return false } // MTU of the parent interface must not be smaller. @@ -101,6 +109,10 @@ func (v Vlan) Dependencies() (deps []depgraph.Dependency) { // unreachable return false } + // The bond interface has to be "allocated" for use as a VLAN parent. + if bond.Usage != expectedParentUsage { + return false + } // MTU of the parent interface must not be smaller. return bond.GetMTU() >= v.GetMTU() } @@ -235,5 +247,6 @@ func (c *VlanConfigurator) NeedsRecreate(oldItem, newItem depgraph.Item) (recrea } return oldCfg.ParentIfName != newCfg.ParentIfName || oldCfg.ParentL2Type != newCfg.ParentL2Type || + oldCfg.ParentIsL3Port != newCfg.ParentIsL3Port || oldCfg.ID != newCfg.ID } diff --git a/pkg/pillar/types/dns.go b/pkg/pillar/types/dns.go index 3ca83159d6..e648e4d04d 100644 --- a/pkg/pillar/types/dns.go +++ b/pkg/pillar/types/dns.go @@ -362,6 +362,17 @@ func (status DeviceNetworkStatus) GetPortAddrInfo(ifname string, addr net.IP) *A return nil } +// IsPortUsedAsVlanParent - returns true if port with the given logical label +// is used as a VLAN parent interface. +func (status DeviceNetworkStatus) IsPortUsedAsVlanParent(portLabel string) bool { + for _, port2 := range status.Ports { + if port2.L2Type == L2LinkTypeVLAN && port2.VLAN.ParentPort == portLabel { + return true + } + } + return false +} + func rotate(arr []string, amount int) []string { if len(arr) == 0 { return []string{} diff --git a/pkg/pillar/types/dpc.go b/pkg/pillar/types/dpc.go index bf1dc3f1ea..82b18e085f 100644 --- a/pkg/pillar/types/dpc.go +++ b/pkg/pillar/types/dpc.go @@ -15,6 +15,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/lf-edge/eve/pkg/pillar/base" "github.com/lf-edge/eve/pkg/pillar/utils/generics" + "github.com/lf-edge/eve/pkg/pillar/utils/netutils" uuid "github.com/satori/go.uuid" ) @@ -306,6 +307,17 @@ func (config *DevicePortConfig) RecordPortFailure(ifname string, errStr string) } } +// IsPortUsedAsVlanParent - returns true if port with the given logical label +// is used as a VLAN parent interface. +func (config DevicePortConfig) IsPortUsedAsVlanParent(portLabel string) bool { + for _, port2 := range config.Ports { + if port2.L2Type == L2LinkTypeVLAN && port2.VLAN.ParentPort == portLabel { + return true + } + } + return false +} + // DPCSanitizeArgs : arguments for DevicePortConfig.DoSanitize(). type DPCSanitizeArgs struct { SanitizeTimePriority bool @@ -948,6 +960,13 @@ type BondArpMonitor struct { IPTargets []net.IP } +// Equal compares two BondArpMonitor configs for equality. +func (m BondArpMonitor) Equal(m2 BondArpMonitor) bool { + return m.Enabled == m2.Enabled && + m.Interval == m2.Interval && + generics.EqualSetsFn(m.IPTargets, m2.IPTargets, netutils.EqualIPs) +} + // DevicePortConfigList is an array in timestamp aka priority order; // first one is the most desired config to use // It includes test results hence is misnamed - should have a separate status