From d0b781d2eb8b8e9b6b2d6cca4bafeeb356446323 Mon Sep 17 00:00:00 2001 From: powerappsviking <125479015+powerappsviking@users.noreply.github.com> Date: Wed, 17 Jan 2024 14:49:41 +0100 Subject: [PATCH 1/4] Create index.md --- .../index.md | 195 ++++++++++++++++++ 1 file changed, 195 insertions(+) create mode 100644 content/post/Deep-dive:-Managed-&-Unmanaged-solutions/index.md diff --git a/content/post/Deep-dive:-Managed-&-Unmanaged-solutions/index.md b/content/post/Deep-dive:-Managed-&-Unmanaged-solutions/index.md new file mode 100644 index 00000000000..66c7d4f62b3 --- /dev/null +++ b/content/post/Deep-dive:-Managed-&-Unmanaged-solutions/index.md @@ -0,0 +1,195 @@ +--- +# this is the title +title: "Deep dive: Managed & Unmanaged solutions" +# this is the publishing date of your article, usually this should match "now" +date: 2024-01-10T08:40:00-04:00 +# This is your name +author: "Søren Lauszus Weber" +# This is your GitHub name +githubname: powerappsviking +# Don't change +categories: ["Community post"] +# Link to the thumbnail image for the post +images: +- images/deepdive.png +# don't change +tags: [] +# don't change +type: "regular" +--- + + +
If you are reading this post in hoping to get an answer to the question "What is a solution?" Then I suggest you start with another blog post I made. I covered the basics working with solutions in my Getting Started with Model-Driven Apps series. You can read that post here.
+ + + + + + + +The purpose of this post is to provide some guidance for citizen developers and Power Platform Developers when things have become a little more advanced. You might be dealing with things such as multiple solution layers, and you need to be able to dig a little deeper. Understanding the overall concept of solution layers is generally important in order to avoid costly mistakes and to ensure that your application actually works the way you intend.
+ + + +In this post I will cover the following:
1. Managed and unmanaged layers, in depth
2. Managed solution layering
3. Avoiding unmanaged layers
4. Issues with managed solutions
First off, we need to start by revisiting my graphic from the previous post, showing the basics of how solution layers work on a Power Platform Environment:
+ + + + + + + + + + + +It should always be the case that you actively avoid making unmanaged layers on your test and production environments. Previously, developers working with solutions in Dynamics would use unmanaged layers throughout the different environments. This would be for a variety of reasons, but most of them involve either overcoming limitations that have now been solved, or are, in my opinion, largely irrelevant for 99% of citizen developers. Therefore, avoiding unmanaged layers should be the way of working going forward.
+ + + +When importing your own managed solution, it will always be layered in the order that the solution was first added. Let's set up a scenario for this case.
We create two solutions, Solution A and Solution B. Both solutions contain a reference to the same column in the systemuser table. In Solution A the "Full Name" column has been renamed to "Legal name". In Solution B the "Full Name" Column has been renamed to "Actual Name".
Now, use the above graphics as a reference, we do the following thought experiment:
+ + + +Week 1: You import the first version (version 1.0.0.1) of Solution A (as a managed solution) to your test environment. Changing the column name to "Legal Name"
Week 2: You add the first version (version 1.0.0.1) of Solution B (as a managed solution). Changing the Column name to "Actual Name"
Week 3: You add an update (version 1.0.0.2) to Solution A to the environment. What happens in this update? Is the name changed back to "Legal name"?
The answer is that nothing happens in week 3. Solution B is the current top layer and is king and therefore the column is still called "Actual name". Any changes made to your lower solution layers have no effect if there is also a change to the objects on any layer above it. This is really important to understand when looking at the graphics above.
+ + + +Citizen developers should always avoid using unmanaged layers in Power Platform deployment because it can lead to governance and security risks.
+ + + +Unmanaged layers can be created by developers who do not have the necessary permissions to modify the solution, which can lead to unauthorized changes being made to the solution. This can result in a lack of control over the solution, which can lead to issues such as data loss, security breaches, and other problems.
+ + + +To minimize these risks, citizen developers should use managed solutions instead of unmanaged solutions. Managed solutions provide better control over the solution, which can help to prevent unauthorized changes from being made to the solution. Additionally, using managed solutions is recommended best practice for deploying solutions to different environments, which can help to ensure that the solution is consistent across all environments. This way, citizen developers can trust that their solutions are function the same way across environments and that they meet the needs of their organization.
+ + + +Lets go through a couple of different scenarios where managed solutions and solution layering can cause unintended issues, and how to mitigate them.
+ + + +Connection references
+ + + +When working with Power Automate Flows or anything else that could require a connection reference, you will experience that these need to be changed from time to time. This process will always be an unmanaged change on the environment you are working on, no matter what. This is not an issue in itself, however it can cause problems with keeping track of which objects are actually managed or unmanaged. Which is why I would recommend having an unmanaged solution to keep track of any unmanaged changes happening on your environment. This provides transparency over which objects have been changed in the unmanaged layer on your environment.
+ + + +Choice fields
+ + + +Simply put, if you use a choice field from any managed solution on your dev environment. You will not be able to remove any existing values without changing the original solution containing those choice values
+ + + +Let's look at an example:
+ + + +You already imported Solution A and Solution B from before. In Solution B there is a choice field which looks like this:
On top of this you create your own customization solution (Unmanaged Solution C in the graphics)
+ + + +Now, let's say we change it by removing one of the choices. Let's remove the one with three stars, and add our own choice which we now call "option 4".
+ + + + + + + +So we save this, publish all and export it as a managed solution and it works. Easy-peasy right?
+ + + +Wrong.
+ + + +First, we need to establish that the target environment needs to have all relevant solutions installed as there are solution dependencies. So the target environment will also contain solution A and B as managed solutions. Now if you import Solution C as a managed solution to your test or dev environment. (containing Solution B as a managed solution) then as a result of solution layering you will have the following choice field:
+ + + + + + + +There are now 5 fields, the 4 original fields, including your own.
+ + + +So what do to?
+ + + +If you have a choice field with ANY RISK at all of needing to remove choices in the future, create your own custom choice fields that you can change completely unmanaged on your own dev. I can't stress this enough.
+ + + +This is the same issue that we see with security roles. There are just some things which managed solutions, through layering, will still force through, no matter what you do in your own solutions afterwards.
+ + + +The same challenges apply to other solution objects such as:
Calculated Fields, and Security roles.
For Calculated fields, once a solution is imported with a calculated field, it is not possible to change the calculation through updates in the managed solution afterwards, this will have to happen in the unmanaged layer (If this has changed recently please let me know and I will correct this)
+ + + +For Security Roles, even changes in the deeper solution layers will affect how the security role will work. Therefore, if you want to ensure that your top-layer solution provides the correct security role setup I recommend copying the security role and assigning the new role to users instead of the old one.
+ + + +There is much more that could be said about solution layering and solution types, and I will make a separate post about patches at some point. If anyone has any information about changes to these topics please let me know.
+ From 4b50a2d053d36074f29248be78b87c01594730d0 Mon Sep 17 00:00:00 2001 From: powerappsviking <125479015+powerappsviking@users.noreply.github.com> Date: Wed, 17 Jan 2024 14:50:01 +0100 Subject: [PATCH 2/4] Add files via upload --- .../deepdive.png | Bin 0 -> 11218121 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 content/post/Deep-dive:-Managed-&-Unmanaged-solutions/deepdive.png diff --git a/content/post/Deep-dive:-Managed-&-Unmanaged-solutions/deepdive.png b/content/post/Deep-dive:-Managed-&-Unmanaged-solutions/deepdive.png new file mode 100644 index 0000000000000000000000000000000000000000..953cb8012d985ba20cb3f09224f6e7671dd77cab GIT binary patch literal 11218121 zcmZU(WmFVi{O${aAT@v}IWQv9-670S(ka~_($d``CDL8eAV>=gC5=)80z-^|bj{E) z#0+(R|FhP;_ndWJ?D+1r_KW>y@8|jKCr(F8nT(j87zYQ3OjSkkEe;N877h-@$P-1!BNdaoWQMf9@y|fxOKWcGC&n^=dR1dRKh)7 z*HD8@pH7a7viH@;6irLmg$als5T2oxJWtzv3b}7-$uhYcr}HdKcyskX*JylkZz+%& zmv~*qv1Ars>`FfuZ_^3V{aHkDtB(4-yvb 38v)3~SM zQQ+{>SBCFz#UZ0$tF@#f$OK33;ySvFF4kP^>p<#lI3_%BnGUAU0pQCQ(OXjq5S$io zpLmv{EB$q-n|VMY07Js(A5Y-b2X8gX6|a(`KalyozU;74o-_X&?N`9&35Tvij;J!l z&4u(=oq|RBTyHX7)^UV@z-z^ltnV$5nADc&Mj^YtysI#VGo1a21?7RPg%^Jcgm$3u zNk&V2`TGpDv~Nm^78u;tGQhC=U)bW?3-yB=twZ^Av!w!=O$}jn3XAhfBg3qe3kGq7 z#w#!wUKtj!7~9J#E1R}D*a8Y3yu}k>S+%>pL{r!*D*HR_70g@EYx)PUkPKyY;P@3v zlS|SqNcSX@M$&1ppx2G>jPL&W>ARE!H__3v?AbCr`u5UMZDKC*tmT3y&SWSzT=OBQ zBepa%I&xc ^L?Wg^a`|46_0a9^TRn$FpQb|PY9=e87A9~z^&Lm_ki_H?p;6h zAZ>Jv-nhj_rKWz+2H|e4^n1hYw@Da|WR+9)&}wx}K}`ctbHw^{yoW|9-71~uTLj pcy$T=)U-_eG60+3)66qu7|{;a6Pzckh@?Ns zS6-EIE5rmiSG;rYsB)?Btee`@7>AoEZ3w^;O7M=Fmb8WCTGz5QhfmZGmOfQD%HNh> zr{h1ciEwL@g?2iQ$xCl?f8lv aon=3V3eLs>)Zfr z%i}B;#QXi+?8-w2|M?F=;)VcCBuv5)a7kHznr&)&L}PAr`zn%$`>uNMgq4Q|KTICY zi6*AJeZtseBLBhrtPQ8YOS6CvXSiWg1l@o&GP yY=Chji`zRy`Z<1-TJ!YQM>)WE9jli7({b}!6%=}?zuM?8t jTV%R~k zzi<%p<-4{#eYjMztlOcFyno(xz0Cn!E%N?R?pLtXZ#u&t-La957T+x Y+vbQ<@-eJ+{fr4$RBRe#G$7ovU!qT2?QQ=DyKVd@ zE3Nca-{`D_gmi$tFy8&iAv_cdF>d@xUS@;c7>*;5{Z P2HY)!& z4s|y*#m6;hJb!y3CS3dBIn#@C+c`2j(!AFydnSZL45yEPa*{P$tc;1!r_DJ9TMLq8 znE pyXqt;E@>wbA zL~<3sWd3iOHU0$Lso%eV0A*I!t&VsH+up{cpf%TGmY4@aRoYc*$4yP-z4Cgd>Wjuz zk`G@C9!qx2$pU_axdt=7s|lEbTbsEyOy#gLm2RDV)V~me>$xo~wC762kqKZK(8Zox z%98P+e1uO3Y%SIVU*4TD1Mw6|;|eA_98CYjJcQ=}d-bx2d|~iTmkznfys(`U;Kh-z zlKX&un0rAyh-fg1=FNT5P7uDJrkCE!$frRmh6VISG1qF+&X5o$uVvq2l1Z@vQW#jU z$w3t3_(k!)H(zq^uN&Z}y@z?3*3#qu=pNr}7$`nCIrX1!N5}f8ID8|SYB(!vPfeXY zOdyW{06wn(-UER!p?Fgc@x`d^#SJfKuQ(M6hA&f3&Yq}T+&zy3MLTGvjW5bEdOYtg z_%BW(yp<^bOu)A-2>3e=OBiIV(?Q3oC~-g(atHsOAz~?!>Lb=NonDAk42wmW-j!C( z0Ysbok|+Z>1#CxtyU`nD>;#V+{nH03K0kPr^qV{+(I&-^PY|m;2WkAG;QXChC5xK> z`@ml#+i{hyAlsK7u}!VVn9={T1#{v@l*UKsJW3cJUYZ;_1^!n2n<@PiWSM$ `q$P*5}idAjbv_O4`pM??h8iHAElKk%R-ahWF3A!q}eFYRXegDvuN$Zh5e5Ieg zrE(`_%sxte)WC8=BJ{kNUu*jJoqlU-HGIU+ygvY#yD%9lwD?|EHvUd*l2_-9JJ)wV zY{t|}Ycol^l|xOQzKl_;<0JmHM_fPQM^h>lSE@3V4zbDaXWf+XDc#LRH4oCFrS=W= zUhaIx+`B{fT?N!%* aZcNN|X;Z6cxDq?H3 z6C0ESk*x}g)(~gi-kBtd^lO3F2Q>CyCUTzpnhkKZf6Kw9JszTlbH*(kySztKK8T!S zhxP6E7|oWp>{KzaKQ7G4mm_N4?kCnNtG9?BCy^tJ?43 z3y1^PwTw&G^`D7li1(sz^JWY&c<|efedJ_L>ELy#lvMRx#|`S?vs#`O+)|t}3*RAI zBWz&slZ7DCp!YL^+3K#dN6X963ykMJZD!G8W54j0BxVD~ 2 zC8Uk`h$((`^1y(hzZC4GdqJxC`0Mzu`JzgO(G46K01`e4!Rk^2YP-I`CW6XgKWaS1 zCv8lpWnoF(3!=0mMW^FduA5Fu!yaP9W7P$`KbfL@)9I{!K@S|AB%{s6LZv}|KUpas z?c(}BGAt6ts0 >Y}!SwfOp5+-=GRzpbeU1WjYEj_)s=ulxL> zPlXnoMjdNZOG*aKh2Cw9Zqg&GMKsj-E*LI$Hky7soh_*$UiHb!{yX8zM@eS?#=Uy! z0n@BJr?w(i7?cKzfQ0Uu{pZb(gRN}}JI2QJ1GG!t?t|hvV66{Eo^@#;Hf`r6uvL-6 zE2~%G#>4Z*a17}rwI6#>iMlwn@P!1t$dkF{`C$ohSzm&fc?(504|KIC_LmKNjP!e^ z+|7}s6JLtIyVZ@~NVaD_#1SaN1;p9@36Os~NR4B+s`|PU{-Hkfvy7AWXxnaN;Qd@} z4$|RD&&-n--5`1M8Bq}PWP|&)`8s;wtrcH+ig17ggvRsNVE(|#$6rYafn1lD)3m_u zQ#4Do711=wm$?rC6p8p6U#M*yfcpg>_NibmY(*;C1tz7R9-0;^GNng{95I_;;>Qs{ zIWt}Je>8ZZhf0741u6Peg0(f2206qQnWIj66eSwz+nCxUPKUTyTsD*RR7D`9f$Uod zoOmi%bQZ$S;fGp(a-3dCtF?n{&W-5xOn<309nRA8)J~L}fA#4X9g>m%WQP%wu5MNa zD={BvlkrSYsk{F2LE}+ptY!HFnOA2vuQL|-#%&WlP$j*&FZT%S^%(!kmtl4cypd!i zgZRcAlgE*{I}~7|shn=u7@z2=jMcgPh
Y_)`;IcjYk_v(6a41svCFrmk9UrO zR-boBv>3i_Gi7}%&x48 cN$ib$MlI10 ziV)}=Mer#dWL3loCkW@I7d)QSs&Sun+24?}3~)~uH092mXvrYaVW6A5WaXqDHRP~V z8t~J77zw2)&nJ@N+)051OLDFJ* >wHj1gHx3;i-njGfIx9{S;C?OU21A6%2{ zp3FS3cVgt92C4M;vM#*c1@ENpy?_5pe?Y|Cl}K{;+Yf#5V3|?-`iB8zAE71Uh347A zt~<-6)mL<&YTqlG7qgL`5Mn+AxYw6f8S|`jWY8C;z{irH_VWJ_^)~S9OWf7?vxnR2 zVIn;l-$F( *Ki@ ydjVA3P5-J<;CIJ*(w9XcbnR;>Hj>ZuLq_96kpX%f*`AoCqsfW-G|0 zmwUzKL%f6B%st&<(6nn!F7luiqH!-bH#xF4^GSi~EO5zk5+aDR-dCL9hgZ`Ou4-G5 zl=ZU}??JcUjXQ*<$CF1(t{(~v*z+-Q$3*(~B^M=mw$cTP3%<>9dAL`2CGLG@j$~3A zM1Qt Q^{mWo@6=@+vivYMrG4aVlQvzw?Fwv z@#y|JSd|}itnSTqea_3=>+%o~s5p%OAB|13= q___CTC;rE@f?ACW}{ot1;} zY>C4|m0ekRN(|tnGnDr %jRHXsPdBGuHwvg%qHpZe`WcB9t>ul^1;%9II1Dpk5U3!U4=;ubiKciXhx24ycuL zlrdJw9t(E}<3s+e1_2Q%Ds<|<266jLghXs39~@Wknj4-!t*+?(WOd}@KM&+79=d|* z%f(2`jIRs>%E&H?LjT9Q0HLYt2#_U+R0Q&h+gZmVDE4P9|J^BlaCeCS|DU&3r~g?! zqWFdh;BWa>HTYi0*nsdn@)SWxny}K}mloTdAbzTNHdSgQ3I>lHwH<48|9n*RykRCX z`cI6XeiWI0(xtH -xU$dSBL^1eLhjRe)4*;w z2G?_MutErra=?ko;psA3c|zDN?Iq-hV_Qkz_ob2d0FKMZqId@?gPHS%hWj5|HRg5a zVy!EEOZq%YbsgG$<@E>>Q$)uBwqG{PMJQT#K#I1k6wYjNeOCYRQTwP*;Wmd%^@4|} z7E#s?l|G!D*~(GBtnubB-q_>WbNbS`3m1|31+Ix_Nr?x)Z(d8@&b(a=hH!O6rIGbG z8%G4WPvRH#!2CLz8bdQFt2=l7Jb6P6cvP@7-(-2QPf@E%XG4e0|Bkn}GqR(%#6)|} z>0#9$xMH) I-WsGC0(Pn``LcFI5Zp2yn0tOw}3V59C zjwQ<3ZOd1kb}JNCswv;|=nb@d9i`_x?^BZL`p`i{VmG?IMe0)*cK-uBRwJ>bq{IA| zRJ~`oXm&|3CQe`_Uc)!@LXnOj^{^>WX#7ptyf%~ln-s}?hAFxadYG@=Rnww5%bxs? zd!L2I&wmnzotnd2Viei7!dvVGx2&Tf?<~8L%iOJNR}7*StP!vC#5X?t(7)vbycQoI zd^WE>uQzd=>@Sj&T0Jlv@C#)`%Kz0~rr{SC_Ay7#Nu)d2mBz?Di*p@5<@~6x34${F z%J^T{T?s4Ekng!`U5&u_dpdub9w&xlRrTx&sDNH6 FTeVZ=G9E4drM2Eqb8jL zhA4a~^n#44WlDw2&pZu%39`Qd=c!*GS$e8T>!V&UA-@TE;zhkqVk7-{C@&MyZ*j6M z)8E~6rDT!B2Mp&H%e?`TGi$xr_J8!cEV4Vs-7RF7#V5kUz^HP4W6;yY!fKNF_Zv #>7VZL_J z=im!HAJxvGi?kf2F6=heq}BIj+~kb^+4+8uW(xLuBKw%5!$bNPCN1>J#IeKJ?aEN| z?C*bPcZGD$3K`E1(Q%(&zf`}tBe)%0P#HQSktYOrwqJk(8lutKL#2D4N1AXGhI`Dc zHenZk>K5~{aM=KZyOSs}8OTm=>%$4j9&p?fc}~Z&6m|Mv8k5t)SJ9q@F40XH@^UX& zdqW+pA`7jqu~OUK(Q;}Te_=lH9&vF|VeUwZvX5R~J`hYxlxMZ#YU#8}l?}e}^u^Y4 zWpl*emt0wVrM~!P+SYNwOx^TG%dVG#oh)<8(6@n4t)zQTwNsv@TSDYVO*|?AqiUbe z#*}$qK3-liv8|t{8(rH-e#Vqej%EgV(G|StcMf@cTPixmR5H~Vf0-~GMvzA9AnV3K z8+d!CdA)zw05VwV_>tx`bdB-TFQtM>5>)&w0`G=hg-wKdg*JS<6<&BH4r6cLbV{i3 z U#xUOrxOfeoOrEAqB0LWf*00|MK1Gl~w4vZ#-1 zM%ti9eaA+Kc#JO(hT$` @2+vgr&8M^@NM9$t4OLsWA@GZ?C!*;vlhP2D1M2n1$e;kzQ`|jQn7Y>X}hEe6iNN za(!S_z_!||4z{Zh-J2cY3<`JHV;+0kIRiS8&k3B;X@BD#NC_}z<+LCn+x*c_?ZO-L zz349=1dQi;b;5ghjd={<^YxeYWLtRk&uKjnU4z}ryL;< `LWX`-YYgc0G?K=H2nEUMC`o==5beU0-Xrmfl2GoOa4o=t{fhL=iwZ3Bn6OcR5s%0(t@f0 zCmNl;Yh7ZG4{C AOa?heF7G#~)nIgRg8C@h}o2H@Cxl&jl`0+aBD z3^mqta%zF&)~$wr@^R8_HhANGak?w&_r@< uivIm`SOj0=|*FdA34`3$fuLorVB&r^p%6xGm0(AIUOw` z@J`h(b19_4qazYiEN?<)SuH>HJo6bBR={n1x5BM%k@bpj+Ib?1C+laa+L?$Y3{yfW zZ+1WXFEH|C=JfxO^_F2#{o&Uyh=7R9Ac%A*-68GJB_JgwIq(CdgrRd7x+I21a_BA* zB!r=)yAh $stWj=HO3b#z%?l z5g=~!c|4qxes?lKZt(Q6SW*oQzWT;#w=e_}mRDK-O@dMFDmAaNoa5a%oz>gD`L=5X z+#Rl1KhAYS_u95I@ezv9np$q)Xy}ABGv&mUP$Cl%?OwQbe-HyeetA;k4v+X* a;w)}4@`Gmmq2cN!Q{>qd& z<~6csF0txsiOT@}S? w2g@A z7^Wz+8EIImrmp-1LA9DxZnF`ko`~JecKyhlzi9SWek3FgDTfP4A8fykwfR3T0J6S` z=qs$nn2Z0p0E}MD&RiLtqe$*rQ46>*$^uhATmOd%7v2uA;W4s>wwHWqJ15w+ECQk@ ze?KN@vK;Y-+fn)t5rLz6bhIvM7wXrydWifCAB3;!grs`=Tnc=IRo%Vc+2m5U{)!3X z+%#KvOcCxhBO`j=jLKfmCtO6s*GF&cdrO0<6{OXwMXcYZG;Vv_YQGOt>A0A8qJiI< z2ysKQ#prC!OD6FqI#i3jv;h%Lg>yl|Bh`VfZsNN{IFzE7>(1SSk1BtLs7@cpO1 v{_m4wT2N1z*spnlyZOed! z8CAjeH!-lxlrC4h(bInk^BSiCKX6%5aHp7Am+*f)_u4)Y?`I+XQJE6ZRXv=vOvsvy zPL%`2!%KBmhJ`qkrT_Fz+4!Jq+)W+*?6=!~+dtkljf3Jzj&kmF>BU-oW)(YgVIbH7 zYYE4s{y)g_!oaE7BXIpyN6B;5j5pk$&>oxBIu{Do_zrZI^Tg5xx^N *~;LJ z19G7DP0Wet#Sd_}77x&bUs7R&omNh=TSwgc2%l!xGJXrckYii$Q9J#L8F8W@{|=1y zkyY;@EpXn6Uv)v -K^a_5&@G9=!eqE`UI?#}`1MoNe)FT-uK!YkQ^aM96oxGNe?YW=Z zsCP;=&1M84@P=7!-`2epEb3a&=$!+6MQ0NoupRs{NjE*Pv9mNE@21}fjd#YWp5Gw7 ziR~n=P-~phVMXaQ`7&JTZoDSCII*^n^p*lkGc_}BoF~thn!kDY55M$8W;?artr3dR z^^c1_+P>a9R{%H>k4UwG%UqATQit9WvP|R$qSNS>PdPNGr6TUIEV@@D=GO)e*M_^E zTO`$`AeB8Y8xkk{-#?aMB>%Go`1o>5tP>r-4Rb%0kHt}=_}oXtl3%O)0NBK#-Xg!~ zKQ|lV9r_Q0j_BNyX*Vy(rpcr|k>w%sf5Q=Iqb%9$M BRmoFtVabd+(5J$;H> z &}y^
vU 9~LP6>u?VEjT63 z>0y-~`OAFAXV?fMVkMYnSEBCM)Yb}4-UMD*omb9~-)!bv4x1;0?vWx|48HHRet8*0 z`6JNThAd&0gS8pBLj4pf_JZ{qjl)(@N}J@8-Ofak^A~TBdHaKtOpjJW;s)oz*HtPh ztZ_ t0VALl($|_IUNM32tv%$$SH27zhqZkY>cj7ate*~VCR-}DRNc8ZZOQL7XFa7Y z!mCxxboMbe@RwnMy*V=g#{E>HvMWK|t6U4ip)j Xu!1wU@J{e*2BsmEv{*IaB$@;=?%`WNNF%isqXR=CE$)$gxh*9%TE`73(V( zX8GS@O6kB^XG(d0K}%Csa^%iOo77AX=SQE&DsM9Mp{w_->oIz;X0Gd@u~3^ac&hMZ zMz5!STio#N&ZTzIyLZ1PvCopW+ Ipd>&_8w@$k;bX zQ-Rm%a%&%Ih#B+0 DZP% zzwApQz{?uNGuhxDXp-WDH3j>6bZ_{vnmV*3S~*Jio_H{`2aZ0{vcGdIMk)Ia!2G!p zyw=foWN)`Jr_su((yGVQ#fDv?*Bz;J@g0T^U$}ocek+gnGH+F&|4hA(g`2PAS9)f_ zog})& 2^ZzDiQI?<;XRg>m1hc=5Q@8|M^^Y+MR&c*&ZN zL9E|n3hSTxb @?IHKEq)HiI2%}SIH7vxv{tU;ta|ixC9PHM&fGq}~YA0!#%wBmvp8`0MG>CJ? z?ZmeeJ$rJ@Rrif@-YvkfC6LDyl_8DV#j+`|pV0)}kAZHMSj9g4)-CB_#zK+a>R!e? zGEmePTo1cpdb94g;h|w^ZZhbf>+R2E_4T~R45OA9hJUH!vF*z2hy{X!iRdceOq%$wta{Ny8}2 zWr({%$c3M-RHj*twhsG@)}~4#9rTP~XqKSl(C&n4r)c)fq%MTxJ?6;?d!l6fbxhA@ zU_2fbCdtu2{yoL)3Z6*}{JSyjub&wCGQ{>pWtjO0m~$&M{Jxr|mfU6HKaByZE ebrs2G;n24C6xcWDBhwp-C0Zh z#pl_cx6L!GoepWTW+#eglxvjTtyF;j=vXDOTqjTo4iuaA;lXcKajuE?II&7>bj&5- z=tXzA8#?$0^Z?GeWF~44X%6D(08K>`Gy^V_zFxYW30};~(RC>$m421_Bjm_IyJhqG z&=MHbKUpIFEFOnVQYY`AL?nJ%)APfD1u=!o%B B^w-}Oo zEyrs(_Dp4SA}c68duMyW9gnKkdPn5s6Nb>qOmmgA&QzJMZi{NS;G?+fd=zn`u@Lt5 zK=TsSGw@@oszhiuJsL720U;LxK(lao=7vn@?x^OK=@DY_Khze}vZenCWd-uU);uO3 zhy01t&ZeoU(Mq@TXzF_stCyqyhlBpQmgpEv-%Py=CS1Jy`SRgk&ppjX(S5^KHKEC4 z$7q{yfux@;;{VpxsT1pKG^Vgp)xPWfJt=>4b#!FQPs{v~tsX&VN7J3R5)j26wN; 8eXi_ZNRMOQQ(!r0)1UQ2+r#k$ds)RiZ^!@T%Qv2O-xQYB6hZW>~a zqT%#oL^z8+qo?DQ#e}`K#hVLwJJ>=J5DHM%1)RGFE! ztshK1FZlE@BRp*;u%!^=BkH)_krkZ2{e!e4Ae!cOcupJ#)im#VBI;mGTy>f#0^+o! zgLN@V8EhHf0xWLgmeo~lQhPO;cOU2Kr^BO;i^(GAzMand#G_+RgJ!g{w%2w|gLuFu zUPLj%G_$u*D8@7nRj`~a*R0-bMN~Io$aCGhX*}j0pACG4P)&R#HaqEZI#tngL-gS7 z&oqK9!m!?Z-83Qw_or@OE#ak;C%J6ykyA(pRyFA^PxyYLNPyJ|Y$yrN`#Ke0zy3wP z^xt)n*Frq+GG3Luw;_YIW2O+>{rCs21eWkztih8UeZ~AzO{LQlG7B9uw%)G6-MSaW z7VC#Lqif1?ih}s0FUdyDnco^3Es$JS#(^|*>EsJsKou88fn=r@Ubudm&)Qi9Sa_Z& z0gsFh*WU!t8-M9Yr}x*I*{w4`5+R*0UJAI dJA(E#IrxSe+C zcpE65100?hhX)C#&mcCHnpECKbC&3T7zmm%6O47CFe`b{qeZcJ+MafHfhg_5$DX?g ze#4Q_WqmXlem=#xv=h!}s+SqGMu5Xccejx8`TA7vOTSaS&O S%bQYoRf5^7yr+m6mqh=AMzBcYnXNlhE+X02e`nPG9RIQR5& a R@Z^Fb1;Yh_B(3H-8%&R9)VB7(QDBx3FF1BDAoY?D&s znEXa8!H~{au}_W?P20qkS$A;A{1;e%Dh?HhB=bX6rn{nd+3#`xlgvu`CYHrj8*K^# z1+j+V6u (65hwZ32qU#>1N?-s$eMgp54S#C4AK+#WY6o zY(fjk+|i$k>%AeilDd6sv;wT<)xznw1G47~_#i>`OAVS@Qnhb tkU9{71nYbPP z*`8byu?s@FG1XCxBwcfK-dWVkGH=VQfFc{**fn&qK#bs%t>gw3i@v>59j_%|N%XeX z3*}M~7O_$9Ur+E1`c+=QZ0xJdr!>-c=J=imvjeeCLg1(G!7Sqx>rv0|_aD&~7ozs! z<4fk>PHXQvmbP2I*zN0_OZALDob+B<%O@0PD;_-<4VJYhj;Lr!^j3?~{J)^nwsj zgwhs;t{M_0dk9axK4YY_0s3Jrq>!H{xvVap5o9|+Gs9Km=pAyRtu&UEew&1~usCi= zyBoJ@rCDH2i>o|*S4u8xR%E%Syp7H=v-yU9&w~BmScJMGmYkHU`BElHRf4>`daz1| z(%XRsn6)2KtDIlT&ub!b=Yb|74)S%zLDu_cB2_qI8iI`mbWRxx8C+5M6Qa{>``OS# z8LbLT2+Cf+$dEztqVSR ztYexUp@$(96CU?Flbh}Z2mMVuVJ?64mfB6Rl%L5`+wbYjHVy>c>rH1Q7a>4-x|QMJ zKoH}35Gn6L_;4m+Rz#&CGAZEgTKOYr+`Vn6t|#WtJHmtJeq2)dnf-zF3tKLAW0&7YRg{?j7XcoW9H{Jr5U2NL6eLs(66q41Q zypMa+z}Sb?_x%KwV)+DMt|kr<{de)xl4=|R)0m4rpHGgCEK9)LSQ?Vgswp%iHLX6a zimO->B!;%J8-!Z$^I`$S;4IAR4GmIHU>25Sfz$P)DzPWO_S2H|{otFFed=M))_S*9 z8EtY`Z4JMRpYHn6=w|!THxwxEV;`2g^0VGYqfGU3+q+Q-t*sS8eB56~(~S3<4#$J2 zW)QcC70(qG*rkIJ?Eg7c>fzRN6NCBj&vY@V8tG%S C*3zBL0 zrrzxK-kw!IT>9NyE&w;X!ovm9{w4iAn8CLhEB&A7fYR>Nmqp$y`c$h@pVV^E6%t-X zO<$(pTZ0s5e1DR+%I*za D&qh%%Ui1hwn`LPx%)<{N<{wMK zEB8~p-rq`V|7owKFN0Ut(Qg 8mdZebBy1eYgb=ARcZT z3Wu2cFdsKXLr8py_riF1TeizZeW|sg-iL;-xsMtSrmDEm6=-GKQx@9|!YZv2@FJzN zc;_0NvjRT0&gOjI#uhsr%00M4M}-C!OJLn*XA7ffc3NATcpyvvRDNj>{^7_eI_t&( zD0921@$36ucTUQ$uWg~{?|TV}>FDVSj-$?UB+V-RyAw@<9e!Wfd&B(_wIo@^N|rh* zsLI@j)70bhy0Jhkt6=^WOhDqIO1yZIwQ}QQ^{U&b%tsyL-zvo{&m-1{qzU^Vq(gjy zfZerU|Ly4;BsA9ALNqThX*Hoi)y-qcOCR#IzzIXmeb`KZQ0JN}^Qsy*dGy+S_0~Vh zW_h0@Z6SKpcUFBv|C{HW;i_}?|9NS|xK)L&`S&_}UUu;Rr2y+&D#Wd0s-f{@{4N*y z4Cr&V$iWy<1*H!V&;+`)r)sxe=z+y;<)Br{?h^B<**;Y9nIAiSJvL=1R;6Pji_tQR zWQvAr1k8591k$2;{rac_Ytdawf&BfP^>OY`q5~lq1=yGwAg^jpiAB+jvN&F2I-Y^l zrE8kyePTeSmAaot{0h#%&XaR7*LwGF-YGbwV|v3q`Ua!iC)Lm%JLVy}DEnA8)=y;_ z!Db!dglKsEo59c7Q-s7b(5cz<<#h#8nmRLp pGb4lY=2va0Lw749TC0a^XfD^H-4!*fWT z)~vO2qxOfggsxO)Kh4}rT^eGh+_Sv5EMJXj$T~RPIc +w?*{?S(8 z+;nQj#Vbr5ZGg}8K >o)H3(zkZZH_slEC57>tp zpf=Lu9j*N^*iOvarBtz;e^f1$yZv^T+8z-~Dk6yJuy-N>9f1iWZ<(!3v2QeYQ`@WA zeFK+qM;7^DFDV{S=3(?^*`eU2ZC3hcmQ*5JM#Nkj&_BGG?Q3+XCjC%*xc9Coo!J=^ z*1DwBM``tiB(j)j*PKnaZ HS#iOb5l9_okgL9`%b+ z1w?rDxyj%2l#Ot;zaWQ!*lKXZYdGeoe~mZyzWd+)j!|L@Pijc1aP+H zf(nCS{h+x@hi;kPFy2TYF&;TsR4FXBr5g@nn0#6{j(3-)_}2| _=$ZR`(8kBxceKPr=V13}*s3{H1KmshNTx(S zDaO69Z^q-$2vcc`ngob|unP2Nc`O!7Mg;Athb=gPwDtLmG%0 }yvNVN4>36nt}2_ ?GmB2qoHj_?G{Ur_L#X_2TW#SGgie*1=WrMgS`S zYuSZp6zjgcW;ecCSX;{0-rt*GqW*ymXIQ1z98D+DAq@zA9}^irqZR#|8??nAL#V80 z-~vsSZfx|ctWuUB!ys<* z?ha1r+8H;m{#DL6yikgyCI|0MvG-orVwizUob>r~ra~1!Vl{Oiq75K(;*Xx9T3@+J zGRElAdQ+5O!*TWoWB_HUSyj|}HvD_xEWFxL49rHSFZ^Z8o=`Z}lzY&Je-?CZliw{U zf9b<$koPnD%87zvp)Amw=w|ZuJmq=l(*mY$i8kqwdmN%r3UT6*Kg#(n?Pu??9ZdE+ zozr%ts$-s 7hJvQGGB(=(dTw8x(w|{|DE?hC2YpshHvGN-&E-*`8`waOMcaI-km2&EwN7{ zV1a?(kY?|_ZfR+1;_<&jo80UjDXNb5fnTnwQb1q+$CrHM!mtpo6jJdcsJ MQH uO9lBF z> +Ht5-Mn@Vi-C$Q2>!>eI^!MR(%V!xA7XG-;i(#9ZFTsr`Enkls9lzm_a1OgW zmoQx_7EES0ZA}0XM}rMgcb}0Dt8zD(V#J`Q)SWQ~wcN%jg*j1PI5tiD2pO0@h`HGM z^^uJ3MfHFslvQi_+eigSMIU*K(b^>6#K6Es`pZfC8B!{WkBg80bYPe|9x4CN$+yL( z-V@ASUn-lMLe{VtvN}J lxJTxBM%M*d7g)>%r(H{5-j0Syk^(?5qqitJEyTHa%X{;@qU2fekDh~ zK5}O#JxXpJoI}oPA&+HbE4!zs{-bL?`Od!kcwjMu8ZOoDtAHZFkKci;T@avZF_1kJ zv7coYIgdSYxZ=)Lq+4|LlOF1gc>McsFXkF*M93DKW|YQJ-`koKe(OQO$lC_UVB5o$ zKld``N-Fj2zV+4j${$ H>Bbu$g*=P4yhv9di-sHjmciS;++HeNyRywVS8k6&W& 5j z-?LG|XtmP;3g||AN|mk{MfYlaEp<|HxcAK?J!ROQuwKJL2GwXnQgGEUk<1rC&RI~Z zH;6?mhqpmc5ggm4H}rDDKwbUgv%B*E=)(1A$Duf`BgE5z2^xXmUckF9jH%DM_`T3R z*Gb?4!ZYojy<3$N5jL$pv_1|El)zWv`_<6VI&u9xwiDVE!u#*wh`ex{7aYlg@7)+X zHD9|P1)B#RyZep0x7wCUj^bAS8YB9XQ5WkUqH1KLKS(=|ZAzWW*Ba}>v21&-%i94T z*i2+0xu7R~ 1KcZ>d#Z?6Sm@C zZwQ6vQy->7#c>zos8JshlZp%`cIn=`IPbis4WhYdCpTrh#Y*(;u_&xOrNZa5gUt|S z9Xw9=*dVlLYXoexG+q_8MUZ^|WFnple#wH#y7(Ku3nR(5|6$5e3Pw}HJNkdG=b31I zmBci>Q*zgK#C`ga+UF=mG{pIYk*Wfo!tR>VwU$3#O#$rq9Z@@*Ys-@37up92Viy*% z%0ulA>qEy66mL~46`EPjQ)|YI#@7s&@a=jH>HpH_EgRe04X-;P_I2_-{VIh#%2Lo1 z<2=Vd|CD 4@k{`cQ{33E} _g&l5N)M~?QSsGz_X&Seo56 DayWA!@ z6y*wFn!t-^#!>2_=VU <$hCWsaJ=>~f654b@nKyC$AL?@akC~IQKWdTpbsh+`_as*W@RQQ>sIdW*T8ds zSoDIA?Q`T-i@q>I9$$_D>GCGM^?n{GEz-Gt_^T)|9;e4~t*dsOokQc->NMWd)wt~d z?`ZUgd M(i- 12`*jn>kM?s`_*Ds1Hpt@#uwGqxqoP zCN6z1e5QJF?5V8>JGwe@x|67T^Y^@XIE_EM86}eADnvC98}Wc>wy@u!qQeV&7fg &-n_RgrNj7uchN7=+wPvJX9Gft$f%T#! zjltS`L4EW9-iLeW$w=@u8T!+W;F#%nrNf%krB7!(pd$5A>XUHq2ca!U?^mh?obn=& zR~SuPvR(?Rd|Rn~T>Sgb%8)pqdH>U1BYOw=uT-G9VqQF0+!3!v1Pvs(Xz{hIlcmAj zHE|!Th?gCFJ6u=WHmRGV!S5qLdu2bS{vqGp22vi_;QnK+5U8m%A *hKx+QS_z`t~Sn=Zc3l%+M3=UE!==7-{wixW03j-G8FL6m*Df50aLS7pe zzsa9ORRv&KS7o@yKC%W)gV$xFcKxhUn8E4@o%F@vc_!fDY*%$+9H?st+E3hkwb?Ps z4W0;Kd1Lo>Io8ER*wOKH1&1)boZqoNK54>v#>9!kp9t})LfWsd*PALhTic%MyIOWY zvqPrIx{@^AU8(y0_ptqgEg@o8on~R0wax~us33l2!LvG;Cfw58o9#eQ+WDOO11w P7KgMZY1+s_)r4ZTu?3^B%c3KjW;%^fuR) z>sB9&SA#@kX$)7nw`6rNBRJZJYnq`kF+upzLk91}>KfL^q81p#We~>IRF~#l^Q Uq9Y{%~gyIJcQ9r9-D>t;cuu&?~Y^ zzLq<9vG(Kbg3BWj=87r<0%0}GE7&)x D zXb}Hp_NE6()El13_fFEUScsw*(CwS-^ipwYT%~ 0q3PB>CaeKldM;a339p=~t}^=c5ne4hd~Qus!3yyE!5O?7 zs;dLl4^nGt<9n=pVU&jE|4KrdALze }$cx9fB-UWc{5RGk2oPdqSesv{J8S!?l z2P=v;Wyq>X^DCDL*?%GNxmLCk7BB}?gL881pm*$#!kd@l)VjWAH2vmJOVARS60o|J zMde$ i-ais1RUXs)r170AHv>3~Gvow<6DyTyzO<#)$g)L0~Z@rs!q2$Wo zEBnoNB5Tp_=#u%vWvW=L$|TSq&Y60y?2$EZF~#~n1$2>D(kM-WaDs}n6UIfeHWFWP zRMgs7o`2 C+DB`<#8mb$x BDaQo60X`f zo4+rN5S3F$&9ivD($8D$ ?fWI8s5#gaTZc4}|4Kmwc8vj)g;`>RHZeC6|Ag zossdXYnv>sy9~3Ld;yFI#W_1HIb}0GEs}$+)a8z6gmBr5CW-a %AY zK)&F21e$n4CTReU&gX})25G8dY8Uy!RmCrNrsQsCT zIElLSt$x`2nc{`$SCyNyHiU2P)xWiuD)bxubo+F_t~zlFuoq|MSMq7s!`OF5;`>6v zx$hYhJqf>{EIdZv Di^pG&<^c8M0My$jt8IPD%lLwaPh#iQ8fm3)vcV(kwBrw4bv &Iz_WpgvY{p$I)GAXV%JP{ ^V{zi;U!ah!51nn*C zWJ}tewOwS%pS^AX!y)bukv5vVuYS7deHi+~1cm-bbTPZk=D4qwbc)lMI97Bcc0)fp zYVFOm=>AP_+I(W|??UbnCX;I~=GLOGdEpGSwT 5?usyrr^(m^y=aQ^L~!lFtmEL851Z>Vn|R7%Pr7ZXQwe2db_j**a((9*9;V- zJDRCbT)L@Ac_HPdt*Q1*&Q-zd`Yqb_LYwa(A(IUfKEx$*5*Ilz$4+ES{Wt7~3y20+ z7sUWq=>o={2MRypW#0qyPNK7*dkwja4xt@_Aq6k2y5Hm3Q}my^hb?{8!SkFH@bT2f zJBFw{+?!CsDo^N_2iiFAJ!hvi;(5;Mp9Kki{;9Tz=km(pI%^C zk`3quBUfACvOp4061b=E9!OqV{{|l*^2T} cAv7*dmV85+Da=w6HY1 z&BWh^Hd% d$wyHKYa}4kscJ6K5SRYw-qb3;V&pJyp81ES zKjb+T0`y%? #futI+c?qK_+kx2Dt`VJBJ1r#P`?fsvLSa#NlTG$tS zKJRZ50~&?Ph`*D+P{Qk!f$K=p_oO4wRw m=W=TJuS9qYO1T1ZImLllU)!>9 zHFGCE7;bdAHWy*i5p|>hG_m_ibfUYi&x(*UR>E}6)6_$miX PH*>0MhlK*mXhYa6P+K!vLCjz>R2Dhn|OoV&KOL~8S{eUWb2Mg&if<- zT^f8^VMD ;EKZ%tQ;I`$Vpdz0~K}kLlZU2Muq(ZeJI_lNrv{8Rtm#C~f+W z@mwXmfvB$mFIjt3JJ+yY^^E_vOIo158ql$DaPc&$+HgGn@(43HNmZ`0UUzYq;F>I* zFLxHzMK5O9-gN0h28MO^Q!KxAQM6s~!`4)>XRYR_Q+^Ol=rA`26}moB6ol>C4Ek+H zCewq?J7kSV813FUh)WNN{UFf3j2|abrtsoebpJKz_hu?DcQ)^^HDYhXI}Q1COvpG? zu{yg0yO=VV)+>I&byL0YCs-F 6v=R;PjkUHo{u=-@{ zL4X*Hv)lTM78)QEY~ao_c(-b5R3AE1u9aqLlDePKu(@}s=bF)z+!NoM5^6XD%axt3OKORQ;CA>&k0=U%8$KZ6ZId;4)USu3q@Ktb?UD zA}$R*cf(JohkUWz2-j7QdxPu0#BOOm3(FXqR2^1xHCYA?Z*OYdpB5kuY_r!6FS|~q zU6=a6CEl(Qoch{;$rwSA*ulla`Yl-`ao&B=*0KGeQB^&h(q5fD5{`}kMTcG=ELdJF zA%(B?MSneS%_`5`qO+sbZVV2+( sMP~>zV6>uvm z&cAH}e}5M}+Z4g)aw4ikw`V(}kDk~Mo^Zbx_ iQja-N#tzv^q1T?JR;RrowK9EM`Yja72N{o>E-0( z5w8o*_Dz~*DU9+(CX8YPr{DOcYS6nnMR>Q1SFs3S#Gdsojf2(38;jdgC*B}w8pj_g z?n68J^P@(aN-ZX)pcnPMwDu+nZZth+>YqZbQ0LkPXN4s72y(IO=8=kh!ze$L-tFJY zJww$?%=1um@V?aXqAr}47g}Opm3j3v!S#rYl03TpI!cV3(YoGPz43w!xy3ubhm)Bw znT?z^o`UWYWxEqK>$X8I^J{gkm5B@w!=GPutAJhqAweS|3E`H4-&MfNHpb31_9X&+ zs_Qz3dqje!=`uki-_cufq_E-ESj=NdGeycZqL zWZS-}6yKh13z1uN2(ZS!%MRS&H9k;X7;(+sme}lvT&7Gr=d=+0;7<4?X7K2cU4s!f z7oSMqMa%mZctd`gda3_)9WJeTyQexVK|^Q2^;JhIF4H^rLq+8V<6VxG8BP9V$g0u^ z7#SCg7!6#wwzC=U@@yPXaX{Tu@iOUpu*75*Xw!U~_`ZQ9WFfe(kdngMS48gM{GMVo zR-f-MK$Jm~@!DgmFkoNLoAXQgopQjJ1?EhSE1HJ!