From 2c6c67de25f366834acf18e5ec67a05cbd51e5af Mon Sep 17 00:00:00 2001 From: Stephanie Weirich Date: Tue, 20 Jun 2023 11:52:06 -0400 Subject: [PATCH] name changes for clarity --- doc/oplss.mng | 55 ++++++++++---------- doc/oplss.pdf | Bin 793824 -> 793331 bytes full/src/Arbitrary.hs | 82 ++++++++++++++--------------- full/src/Environment.hs | 14 +++-- full/src/Equal.hs | 30 +++++------ full/src/Modules.hs | 4 +- full/src/Parser.hs | 96 ++++++++++++++++++++-------------- full/src/PrettyPrint.hs | 52 +++++++++---------- full/src/Syntax.hs | 78 ++++++++++++++-------------- full/src/TypeCheck.hs | 58 ++++++++++----------- main/src/Arbitrary.hs | 82 ++++++++++++++--------------- main/src/Environment.hs | 14 +++-- main/src/Equal.hs | 30 +++++------ main/src/Modules.hs | 4 +- main/src/Parser.hs | 100 +++++++++++++++++++++--------------- main/src/PrettyPrint.hs | 52 +++++++++---------- main/src/Syntax.hs | 78 ++++++++++++++-------------- main/src/TypeCheck.hs | 60 +++++++++++----------- version1/src/Arbitrary.hs | 12 ++--- version1/src/Environment.hs | 4 ++ version1/src/Equal.hs | 10 ++-- version1/src/Modules.hs | 4 +- version1/src/Parser.hs | 42 ++++++++++----- version1/src/PrettyPrint.hs | 6 +-- version1/src/Syntax.hs | 37 ++++++------- version1/src/TypeCheck.hs | 18 +++---- version2/src/Arbitrary.hs | 46 ++++++++--------- version2/src/Environment.hs | 4 ++ version2/src/Equal.hs | 10 ++-- version2/src/Modules.hs | 4 +- version2/src/Parser.hs | 42 ++++++++++----- version2/src/PrettyPrint.hs | 16 +++--- version2/src/Syntax.hs | 36 +++++++------ version2/src/TypeCheck.hs | 28 +++++----- version3/src/Arbitrary.hs | 50 +++++++++--------- version3/src/Environment.hs | 4 ++ version3/src/Equal.hs | 10 ++-- version3/src/Modules.hs | 4 +- version3/src/Parser.hs | 50 ++++++++++++------ version3/src/PrettyPrint.hs | 24 ++++----- version3/src/Syntax.hs | 36 +++++++------ version3/src/TypeCheck.hs | 28 +++++----- 42 files changed, 766 insertions(+), 648 deletions(-) diff --git a/doc/oplss.mng b/doc/oplss.mng index 7ea6828..1e356e6 100644 --- a/doc/oplss.mng +++ b/doc/oplss.mng @@ -55,7 +55,7 @@ checker. They are based on lectures given at the \emph{Oregon Programming Languages Summer School} during July 2023 and derived from earlier lectures from summer schools during 2022, 2014 and 2013. -\paragraph{What do I expect from you, dear reader?} This discussion assumes a +\paragraph{What do I expect from you?} This discussion assumes a familiarity with the basics of the lambda calculus, including its standard operations (alpha-equivalence, substitution, evaluation) and the basics of type systems (especially their specification using inference rules). For @@ -71,12 +71,13 @@ it. Installation instructions are available with the repository. \paragraph{What do these notes cover?} These notes are broken into several sections that incrementally build up the design and implementation of a type checker for a dependently-typed -programming language. +programming language. This implementation itself is available in separate +versions, each found in separate subdirectories of the repository. \begin{figure}[ht] \begin{center} \begin{tabular}{llll} -Key feature & \pif version & Section\\ +Key feature & \pif subdirectory & Section\\ \hline Core system & \texttt{version1} & Sections~\ref{sec:simple}, \ref{sec:bidirectional}, and \ref{sec:implementation} \\ Equality & \texttt{version2} & Sections~\ref{sec:equality} and ~\ref{sec:pattern-matching}\\ @@ -84,18 +85,16 @@ Irrelevance & \texttt{version3} & Section ~\ref{sec:irrelevance} \\ Datatypes & \texttt{full} & Sections~\ref{sec:examples} and ~\ref{sec:datatypes} \\ \end{tabular} \end{center} -\caption{Connection between sections of the lecture notes and \pif versions} +\caption{Connection between sections and \pif versions} \label{fig:impls} \end{figure} -If you are looking at the repository, you will see that it includes several -incrementally more expressive implementations of \pif in separate -subdirectories. These implementations build on each other (each is an -extension of the previous version) and are summarized in -Figure~\ref{fig:impls}. As you read each chapter, refer to its corresponding -implementation to see how the features described in that chapter can be -implemented. The directory \texttt{main} is the source of all of these -implementations and contains the markup needed to generate the four versions. +These implementations build on each other (each is an extension of the +previous version) and are summarized in Figure~\ref{fig:impls}. As you read +each chapter, refer to its corresponding implementation to see how the +features described in that chapter can be implemented. The directory +\texttt{main} is the source of all of these implementations and contains the +markup needed to generate the four versions. \begin{itemize} @@ -642,9 +641,9 @@ Likewise, the case of the typing function for the $[[Type]]$ term is also straightforward. When we see the term $[[Type]]$, we know immediately that it is its own type. -\begin{haskell} -inferType Type ctx = Just Type -\end{haskell} +% \begin{haskell} +% inferType TyType ctx = Just TyType +% \end{haskell} The only stumbling block for the algorithm is \rref{t-lambda}. To type check a function, we need to type check its body when the context has been extended @@ -910,7 +909,7 @@ language above, using the following datatype. data Term = -- | type of types `Type` - Type + TyType | -- | variables `x` Var TName @@ -922,7 +921,7 @@ data Term App Term Term | -- | function types `(x : A) -> B` - Pi Type (Unbound.Bind TName Type) + TyPi Type (Unbound.Bind TName Type) | -- | Annotated terms `( a : A )` Ann Term Type @@ -933,8 +932,8 @@ data Term As you can see, variables are represented by names. \unbound's \cd{Bind} type constructor declares the scope of the bound variables. Both \cd{Lam} -and \cd{Pi} bind a single variable in a \cd{Term}. However, in a -\cd{Pi} term, we also want to store the type $[[A]]$, the type of the bound +and \cd{TyPi} bind a single variable in a \cd{Term}. However, in a +\cd{TyPi} term, we also want to store the type $[[A]]$, the type of the bound variable $[[x]]$. Because the syntax is all shared, a \cd{Type} is just another name for a @@ -1090,9 +1089,9 @@ for the various syntactic forms in inference mode: \begin{verbatim} tcTerm (Var x) Nothing = ... -tcTerm Type Nothing = ... +tcTerm TyType Nothing = ... -tcTerm (Pi tyA bnd) Nothing = ... +tcTerm (TyPi tyA bnd) Nothing = ... tcTerm (App t1 t2) Nothing = ... @@ -1102,7 +1101,7 @@ Mixed in here, we also have a pattern for lambda expressions in checking mode: \begin{verbatim} -tcTerm (Lam bnd) (Just (Pi tyA bnd2)) = ... +tcTerm (Lam bnd) (Just (TyPi tyA bnd2)) = ... -- pass in the Pi type for the lambda expression tcTerm (Lam _) (Just nf) = -- checking mode wrong type @@ -2168,10 +2167,10 @@ declaration to the syntax.\footnote{Some parts of this implementation have \begin{verbatim} -- | type constructor names -type TCName = String +type TyConName = String -- | data constructor names -type DCName = String +type DataConName = String -- | Declarations stored in the context data Decl = @@ -2182,10 +2181,10 @@ data Decl = ... | -- | Datatype definition `data T = ...` - Data TCName [ConstructorDef] + Data TyConName [ConstructorDef] -- | A Data constructor has a name and a telescope of arguments -data ConstructorDef = ConstructorDef DCName Telescope +data ConstructorDef = ConstructorDef DataConName Telescope -- | A telescope is a list of type declarations and definitions newtype Telescope = Telescope [Decl] @@ -2324,7 +2323,7 @@ is as follows: Infer type of the scrutinee $[[a]]$ (\texttt{inferType}) \item Make sure that the inferred type is some type constructor $[[T]]$ - (\texttt{ensureTCon}) + (\texttt{ensureTyCon}) \item For each case alternative $[[pi]][[->]][[ai]]$: \begin{itemize} @@ -2364,7 +2363,7 @@ can be referred to later in the telescope. For example, with parameters, we can implement $\Sigma$-types as a datatype, instead of making them primitive. \begin{piforall} -data Sigma (A: Type) (B : A -> Type) : Type +data TySigma (A: Type) (B : A -> Type) : Type Prod of (x:A) (B) \end{piforall} diff --git a/doc/oplss.pdf b/doc/oplss.pdf index 9b1ea39d9ee9010962f02f722de7385055d8ed47..78dc23c400c803af6e84861fade5183c773456e8 100644 GIT binary patch delta 132799 zcmV(#K;*yRxiIs!FpwqzHkaX52q}?J3V-lORgGu>1o+5hYj=}LoZYHq%dW~{W)2Vq zNhtH70Z2Rg_uGvIWywQNoQv3OfZdILeBBUB_6bXVzF~jy{MWM7jZ4ITK>8HdJb&?Q zzxwj#wvGF$g!8OcO5naV&jq~5WG$+!sw(>Ael*8}?yUh8 zpz4oR#ZzOQZC0X84=4v^@H~gl@+>bUefI0r$1eo?fJ6y|$VsmRy)w&XG3za|q9~HJ z1pQ2r0KQst&RF`}(<%pz?#Y^GkbhH@sqVK(6zR`{Zhbt7O6sgGz{?Shd?M?v-_Ty!;YSs9-ZxNr`uV^k-n!u zRq5EC)*}+9xUh{z=zc%xy$QYpTPXx&YXh;teUKFCXC_$mSAB81JkJ;tZ+}Jf(hsuC zSaIG7;=re}V$p$hkv?M#b^AzfKbySkD_}{>wAbMim zPu-eMGz-5vQfC~vUX|&6a|l9*rFbc*iTZ5Tc5*?ZlpLz5JrNa(2q-~OMAp_gJUt~C zGInn0XphmZwL!P!7aqIZ#8Z#KnL4yFoFJM(2PnuGPhlKFWQP_{oqy+N6Z2f6Vd4X^ z1>=$^$~0o-Sque#RjMkhYC&rLIAG+Yf~p(nd4~^~nm>;SB9KFIJ(>^HX$AaY`p1Gp zxq?_gda*gNtf!>hTHj3G$3%vF@qX$|T-3zd>CU!RJ3C@#orw8t$3u*BlzkQFP&Kj= zn6S3-L}QiU^Ss#V4u3@=+?4576B8=GncB&N50zj5B zm|+5m`M^jAlte%Yjyr~9#%=!ON7Kc9XsGe=2#p00J6%~^oPV8aV+y}){>*aOL@1Jy zr4t^-$AUrk?Tj;hW9U0KwZ^0Q*=k)v3;DRJ@^o;tccViud)x#3QBARw#B$JWW4&~G zggVnLct(PRyCvT`(+p5YbJ7!rLT!xZ&ykwT5S%eQdRqAOyESYsn_sl!#TNobXpgmg zm0ZE-$$?bY4Sx=!CRL3}u)9eR5F45V!O$27qMX?U06;Sa+NXPZx95T51=f)t5*CHf z_N_tRcJbqDh^JCmFqZJbkY@?<;S&`hArPVFhz{99}w5RHtv$3na%uc-1D0=DD<95Dh;;HZHMRDT1u)tlBt_PEfOd9E^5o=2_2 zI3E2Ex3_yhjA@fWVyt+2>z~8ybhw4S4Ta9qH=8%F%dCJwE{Yp^@--w%#_Q_(7#pYi z*k>2!1(_+XW;riI*p)WHvYMZjf!AuT(tlzy)eNu?Gk3xlsIhU{o`^rE9*`mR5V~>} zARAaveSgE`aL#!xgi$8Kb4#%fIMfarJhUY(;~cQHQkl%fH6pk;Y7O3wgFCG%nPN4t z3RZNOZSu=$1_onPFs?$c%WHr-u&gn()=*7SmPavYNiZr33+)F{%-N7FWthTYA@l=M zF@o0$k*9azL%`{_rHoq2yWWp(Y9eTdPU#|6EPtgOu%n_ERLQ^fLY}_A#R^U>R=k7} zSTlkE7u*7U^$CBBTW+o_E8&*FuBL39%cB$|wOjEtvNvv^s_p6BQrQjk<_*m-4(DlN zME}HgOWIy_hHw_nv0XYdhbALMhI%{`7G3^#;2JOL)RTQw_Ir!4$|Tlcu}*^o1o`ScKEVSY9R1VQZI& zvWE8@=r*~(`Ct5(;i^DO9L%Ik>!^mWp$rSyNVW#aEzRz#phg9-qe@;e6IIcM591w)I) zntHEY`Md2xGs?7DG9v=rj~a^j5)}MjTCtm!$BOTHM!fP&eN|0pTaifx%{b>-Uc`+0 zX!p~cQ~U=UmK9`K-_K`5e*9-895LZJU`A*HpvzwwfSMO3tD0xL`upW~iB8|gg*9hI z#w4^C$ucq53cvaY3ibcYEH8zV69`8FGcl7vJ1BqMSzB-0I2wKTui)FX3q%rcx&*-t z(l(t2nC=A0boL<$P{n3qA+qF^krfOj!brLWs zfs219#li@aA{GT9Cb1+Im;_l|Occq4V5J%7B4R3p0zm>a)Jic8g=Byl8c7Lw(u$*w zP~$<93`Z#7br^|YNTsQPaHxdb1m9|@CY(Z|BN$Fj z4>>h}97=6tDnojO(8v(>!kLJOqy~^9aytSfqnH{%j;RMhl5xx@98r=9VhEQr6$F3u z3IPvDF=(kc8Hh+J9wRL9vJ%jRBRookunYcC0-oTAmXZ?F;dv#aaKaHUrECw76^TH^ zU>~L_6`LEu!J=m{s1B}6lXP9>PiV#~i3fFRkQ(K1vT`RH+KGJ_7`5ENY)-4FJP6VGE9Wnoc`M;NcmCXOd-qmK> zWM$#;_w3hSC-3-Gpn^XiO!bhNM{1|VjH=(uG_T*kIa|2df`%Sb(WG@_s8QZhxy%l3 z%PP(D4G^oF9;MR)4Vv|(T$snQx<90ck8?AmS1FxWo}LXSXQ?FBQ5S$>7ChXyXUp4d0KIJXG?R#F@dP?5~`aKhG9<513L>P*JasAG+6JH^MS{ zVTvXt(5*qzUDUOU`rm1lr8h1gZn9$5DzK{C1_V>}t+**yF8T88rb?@4YF=JEL*|n= zudjCq6`jyw1^TOHmR&bmX$#QK3b{Nf9S<(oGNmHxS!Mn|xV{JBL+7@T=AHa|mF8LVJP`YnS(;*o z$mP!m6pY#W@?39?NZ1iObj1EzHrYekQQ+h$B~l!&^B^}5#->kYW~=GW%n3UZhb@VV zvdc>2(5YD%GwaFhwwG>icyLdx(K}?xPL_0jxy_0ec25A+0oZ>nIv07H; zvaB~Ku+^%le>=?^c*HY}cLj z@BY^nU}QtyV=sUDR?(w3eV1s#ZLNkd2>!!3meb9~T0EKf3d8mAbEltf~xF;Ix03npbPj_|W;=4w<5pDcqrc zvCMLF&}0kqLeAT#bTPohK6KiSOS(WtHV}Z4Ya| z{9+xm9cu))2IwF^lx1$xVz0Skm}{N%cbU!hnJ0&Nb|3m@+Uzq;4b#-iZN2HXbu!+5 z2_dVS3LAfLY4_5!y4&U2-Wsvxv^VwR~_H1!FUY6SY|A9n}27RLq z`kqv2y{gRSwWSxcuW8hNdsX8>duJ517Zy&gyEC{e-EsA)*}lH=puc(woIQVb$KGZI z`eteF*uK7ik3UFNZGLaNcye(6@I*_|b8`!? z6q|pTcu5y|0Xt{@=d8J=(MLxUpAw$=XZReM_#exnfh{!?0jH4@|J>B&ssb9i0@w8w z-vjA~@`+tiN5}<>5^+5N1mreMaP7t&7xWUB(ZdBXzL_sYu?tPtz}!Qw$^PO zwsq9j4)1z0GQrB5_!q02#yO&fM8H1}db zx4PPk=^i_ZyhtTGmmj>^12!w@&{#YQ#`O$zBaf>{QWiHI}zq)ObrS zALNFyC+WgkMqV5Urb6XO`p+Wv5Wp}KJ;Pz zJFJJR8*f@J{QA*kRW_ab1A+g0Z*lw3X)P0Yi~h7ogePRkWD1Gx5gK! zKSd1{2rrSMS3?Dfmjrq*HPla3LrPEDziwJJRN&FSKl`YmJ2n0Tgqu_llhY6>0ys63 zK|3jb8Ow6xxbePU;UisTaY%yTBezLaCfOVlr}mJ^0TN*eWr|b)(jM>Er(dK9#ogo6U7A;MnPzu|F5^t;yT|74 zpV8yV27ABD>mqXJOKZ=zyU(gqodrRY~-Mw_A^Qz~@o` zmNi`8@UHQeAz?h9jd#CW*>D}hzqsQ_H~>rI`<<>-^jWTc!>jv|5xq5X^!g%%!@P`t zPUbRL|3EY+YihlHLUyPEUe)6WOc(+K4!!p_T<&-Hovv}+k>OY7m%{wz1v(1W@=d26 zDS4IMlR%%W8Q@X!k;aCDcYFE>y&gZ%ZIL>h%mDn)bi@y&M+txg1{1uej4Ur!N&>Jn zYJi1hTA?N}O5?me484ED4}SWR*9#qg%rX_HSqfy(=g)@8y3y23$7x835FAkTnq|2$q8*jd|H zIfBx{@n}2i%^=uvOhr#X_(}=|leJLj5F^5D#h<~-r;w-8-0e)?0uTpAZw<>4NMJO8$Owedb zG8!dP#L30k13e4Qd`(m?cMbi2(V|29t|WHM)?Hcy?Ztm3iL#0m4kfy|ATA&JrV6D+?C!A$n`g&13sm* zD7=Nio_X%NLpzF#(@K0Gz`?K%-VXB#F|%*H#t32r6AXsjI$gH)f;^3X6IK1l3v?3e zS;xeKux8b1TqHM+0$B@V|>FKS5-r71J7xH8LjKtQ6g0_dbAXrz6-qRIyX4eeuuJIP3r2ZCNQTP5JoPU z=N!%J8baBjHQ-7e`$+g~p{nTDj&~*Tz!R_J0elmHUwN8?wy_fEWEEJ-xXSWb4KDW@ zg#|xsMZmE4nxpD?KJkhkN7M$gsO%y&wStuo;vr^_6 zq-UsIJa*Z_%Mz@XQ zKsJSY0U6G0LTWZl%Y`Xsu|9xqm@wSLxs_)?B=HQeWu|e1)oHF`U8{-Jd$;B?Xaa>I z4HUnLA;D_4?f2|YlOoP$AN+k?&2&wc`ajUt41AjA!EtbZ^*sr$84v8Jd6W2slMljW zn&oj){79_Hf#y=r`Rlt(6F(z~CVr1xmua78I($DKPf`t)DppXe-KMeVia2P|t_=-DN-ywJwJOXntzPijLP~mo1ZkrYoOqzwcup)&( z&n#6-x*N6X3}KDn}?l zcLq<;vEFg&hr3~f?8yzID1XJuzv0hJdpVh%{rBkjHLdN~MzK!UIn?eQQ3y9Ya4{}P z?n17(XzIDfIbUnp|DT1utj78S_H~+MPDUAvdvv>fJ?yL*Gr$iD!%qPIK znBQTJDq#y?pk}6Z{5FQTmHNngyGClVRD;CoPc>|aIeGv5L~RwNHK-ouvM>QN z;>t)bDr`;!iC~m%o$q|RBra{c95XEhFuQfOi7R2$`v}y=3=5_#A{MpQl;4Y-BxQv^b(sX4eO$R zV>U>_bDQLRoMZn475$7JSyPit$cDm-s73hPrDG&=+W>5?dPZ8u2imvYjhfM+S+V#m zwZ`-mBT%XKuBD8T4>RxskLJg2H#q9@;1xEoYDv#gFB*Ti@Mu69Y>?!j^^{8y?j#31 z%;uCvi?)E4oG|84dbMQODFs1-t&lK(xyvm_Op>p-kKAm;W5AAXl^W#P!0} zh6l38sVIdtRXQ|d_gIPSs>w%?pp~kli-B6(cZ>val{FFUJ?2o_TIYRBI&s8NNW zqPA!KdB$ZPp$*|URR-#+NeD)-McbUNQ1wE92EBl?ex?n9oNbbn!XLPa`o;NwAiHzU zLl??Dv+VifoG1hQXtuk`NKl@liXh9TR0WE1!&cv8m5T_n^E%3VGb-p!xk9m=Gs4j zF85u7PCKm^K|bY*QKfpxJOYz{p}=I0K4hl|@pjPwBr}8KFV65TqybZqzDBXzdq9PL zRuoS1sKP-{9@(=Tv8oEZ&u>KxDsmA-mV;Z~EXrlXnG@`F5nAW5PUm``3((fSpy;XO z+(@<6Qqt20jX#dl|0{ti@;v&RZFeGDRmOOHrN)+XP|846THex(yzel7@&(?$NE9|wr9J=?$Bn3lp++wJnqmLO^q{x3J-{o z&4gpoA)C7Qi-!HG)8&qT9nd6EUlJ8Sri4R!87f+r3KT&9zXq_bKypa#t|n0zQO(1) zN#MVre(wgZ{c!oN<2#{o|Fe{Tl3Mrsv~vwPn~JcALpoc;A+VKo9NOh|J+*JK3xAEt zX#|>vh)_OG{Skyph)VbpH87XqRR}46wOL8C+r|;T>sRoIS0zB$mt0&@%1S9!zQiw;gO$S&7!qTF z05t&K)AO%SZvz4ptjJE~Ld^8^to`-M@NhnahrhiF<@@gO)tmQmcBq0XkMqOh=@4aQ zkQdn@&x#;UvcqF@_{E!A{op5Q=3T9RGQ&J_Z`AcD{c37i zZepOo1m%`sAV9z@pUu?re8mK-Pq0&8%lJ)Zg~;sn?(?=9FP1n%`(X0JHC8K=EhM zM;K%=52Cj`Zu$+oH8l>l+-vk`&cZNWRn7W&h(ICJR8ExhiRh6A3%nWM4L(OZs74Fz z34n@EmoLVL=~2jE5yrS$q4F9t*7Grn-W%D~7s8XlF$z1_VYK z@-N%vQ267XkQuP}^z-GSEXcTFIm)p+KJQ;}?&22SywAh6DZ@v|VcjywvVzzB7{i-y z=WNV>AGRWA{1&;!aSUJrc$(U1mL7O(iA|>pS_F_Z#uv|?{i3f1Fm|lz=j!vx|=5s4hh~fIhH!W10r(&TrX}~AY z8`S?e@;EX8e+jApx=sDs0SH9V2?pghL zHkPglJ=ORdOo*B_2CqnN2!SzKa1XQCq*Qc>j)=qHf1kw2iUsI26S`5fp7a4445?x6 z8wWD0>)E2_1>eG#&tM^ZmC>KT*H1SyUX(j7in#E&t5 z>&j0716pa0E!M}6(->lk1$g~nFRC-Y(a!$yg+<^yt_^#$+%BHOsC3Ix98lrm zYYqXR{oHD?8dbT);>a}CerO;po*uvtsqS`VTy3^2>H7tkv;i~52|fCzGqi#oRrTe> zn=AfTjm_K*;dMnlRnH3fm4&9km33r)%2AC7IGo`$_n9WBPkyUG2{s~OU+Bx;o3l0= zL(Lu+OCx~(NNU9AFlE57@?^f>;X`~(Drdw$|;%;iZ?#l?5JhdfIh=h`8_X6z6!6rI5GUZsON zhhNj5w4CZ%n+5tre66Qc9DsT1(0;ns;B5S zEGW7q4PdS%x<%)yzbG_&%m8qIJX>`UcGK^?8(<%RmwnH}`HuH@0t<-l6{6~Xi!v7jLDRYK@&D^NM2X=wzYdz2ZXY5}lsa+)sTdjj?guPUmIh_I z?C{V2h#qkdkRhn`V&6M+vZ_G#!NV z{>J3jbOpdl7NzX4)1tb!YGoM`#?pdfXZ%>sMi^%}SCUnnJ&3EY&d1_}TGGcsEPDw>%&qf?1INTquMG>ek{Sg#vBhA~#ut9w$_^ zG7r47v-x%RZ1|w{9|78bpD}I!(DhpV_Z$9FyF!4UPj7w+i!TXTf zS6*w*pfWyO0b;n7o4gMPgqZXu;gZ@ zAgskyE5cpOu@kCGrP0GLa7xgePP)gyb^N2%B=A#IO#&Hx;O;XPi9jvjR~TNfJyP-Nb`0RtoIGPlGRtSbgSq%l`2?;37KRQ zU${@Fuee@WVOezW_mGKB_`>)FJG{zBGr0wlmjfY{A`T#bZgLnVDdE^ADLAr?(n&v2 zC!^B)iL58`oOQ1)*;_ImyX7FVp;07nNt!-%tne~2an-Hu&F7hEA*(eF&bDXZ097#! zvXxHRb&Una_F%#6^scwrk_Yb`78%n#_I{n4^D6pE^JrC3#vX8uK?g)-dBLzVdT$j~{xsof&^u4M9ho=q9P@FMkcVx^^a& z>&!b^$i1eP7%NvW#j4qLY7w6jZ6HnR{;PUzN!Am8XwRnW+@B8v-iYeeTyow^#;b@- zvbbGJBJ^%hD~ww^Gjy{UDRh^ljqn|*^olL2(4@}4K?4p2&g9}I5UjA}oD#NAs@7}& ziz`wN4+x(~V7Rix{OdJ$fbS|uR(F&Wq4>hsd$-h(%Y1zc?6M0iGmopX13E|=V9hNv zNwx4>Jhyat6D}0wi>&_7c%3_hZ)R~B%qnePbvZMc9!XWa|CuVse z>bzo6>!g%dN&s@M!t79Q@3bpQ(;&t0IIe=SEctxNhUdq}SN{R$MIz3VZ6zrJFgcg8 z1p+C5THSBkI1+#FU!g}CS2H3-QBr}!p*?Kxx(l>-XmAHyHV=x;*g|B6?)F|{ax@$chx73xnZVn4f%lJB!Q}Vd^{cD*D)Lg18fCoedr#^}q&oIY6bltb z-u2qM@k6n=z5cZy<=rf!AnklnQhvL&-1ukKJS>o} zD41toSDQN9?ecQN97R@c4%xYjf|MpZvJvE`Z@AMl5N zW{7c4;AxL@;P2Y*sYUV3bVEYRe5$3=Fnx4tZlf^#URnVxlow;)96 zkzG{;(zBL7JdyDZOkUC60QJyVreqC&6Egm}!%fc?(r>VlyN|3iH0;sqcDBUzwaDD& zRVmmn{=2nhKXL3P*02>#zA4YTj8hV3(P`LwB$zw`OKnk=Zs+j(y5iq{Y1nxvE1b}= zJkt8H<@TsK8KT)5NF|rT22jeX9l3>J4PoWr6wTj&PhnJ{oUar^%EV-`lAHN|ZeLh3 z4)|k+mO;Al3k&{69K8-mKKeHHszb{>=y%O7D~i0?vTNaI`z=H1vwq8AVZcZ^#wfP7 zw%BuPRh3R*Och8ux&?G_Ha9-*_O0e#ZNKK0J-Ke2lfww-Uq^QCuTT6ufk^NpzZ?>zk09JVWw0@NST6A61LBm;GcV1#olodIe?V0Qw*{MpUEv@|mEihB3w;P3S_^z8N1z7z z-6DcalNZ@t;mCQ}OXNnA?VOa_@){~mL0}B&*H8Q{YbL`m#m|N7Toi^Ta8VL*@qj+m zPA~@K8m1ndIdWwLcvdKXWNYc?fk`m`j+wyxf}PH2&xkY*6LdPIjnLqqp)k^^Bxigx z6(&x-<$&wmAuran$8H{We{ZQGBZ73YGo8gD!`Al8A+NjMr?%zB&F7Dwc;a}Vo(vKZ znQ*AyUuM)Z@L7-43*y_?nCJ}#kRI0^>^81Gta5a$6-4BdA zVK=U^ZQCUbSZO3=9FLdW;x;@vb}TNkb93(S4nt#?;V!}6gBFf&q8z$~8%0n|21%g``jXVR&DIHkH4$o~&`wLG1w4zCea!x z0+{{-D@y`C_CRpT;}Vc7%;ZXM9t*iLB0 zzfi#Ha<)t}XuZo@ZVaomu_+>NMQ#2O97b`r5GsPux13xtW* z>Wpi^F+mO2<1!>04`6Fy%MH0SKzxcZq~%T9oVUe?a(0geK#G?Domd2rN*pIRtV&fM zcM3v`@GdsozB+Q|h#3^hadJg6;~!}7dX_ot!#A>jH_~uD+(Zmn-M6;v<|+!{A~VGy ztiX(y%J6X2Rz0c&Gi6P8NGb{j{LNf(O_T@{uB}m*YYAcj=z`^gql2Fdu+4*aLi!EP z+_CZ!uo}q3Z0e*f6);7T<)JM`s0~FVG5j$QY$8-BdP@3@upOMK{sUNH3i*JH7MjqZ zIGiwlYX8jzt8ucgpZ0bto9%jT=5kI&H}fTn{g}1qCjL1qxoGs`*4ESEiNOJq1_YXh zPe?F45juvNDuEoin))#>eq0ew*F*c7Fz|0)unXG%tFzjR6zA#wXX|Pz`}Pts!FcU| z$AteA7mw7F#qXws%iPcZh(N79UG|HkZ9YVQUO4+S$|tLR``pLf`H;DJQK0^Si+nz; zRu}1XJIg%jop zTJyaO6ZTmRr_IkxIZ~{YAsuOEgJ@GI2Muoi`tm2uQ%MJ)Ulz)_9_(LEUJ7 ztj*j)u=kAKGSYC&>dk+V2_vD7pz<}B`%r`b>F5;qM#eAka+S_w*g^ddJH+94jPYvz z02m`*b>OY#i|7r1;^jr=2(O?`RvCSSwIiaJVTb5}I0JByoE1&QE%pGEGw^^J48NjV z-`m4f=#KR?cRxRo!gLW2aAO$8u*SN!?!a7? z?nWYX2ORjdyFJ?yyT+X-fL>PRa`Y|kK<`pVno`3v%K$S&Cop43eW~FRy0!>THVYB4 zc7!a)6AkvsX;eypolXudINg@N^^xybEB?LvenwNEMG*B?J*m&%+mjH^Q9bH^f22!w zoEeXe^xLq`hlZdyP@IDRjzzDNlaodJyxk#t2a)+<2ZH<&rn3geyZ@oVLlx2*x+e?l z-yQFALhv=qUw3?;q41@od$r*BR)e#Za%U@Ib0hJp$qBn>lV~Yq8l75%E*`pEk;HiZ z0#b1NHaq|`WddzxuBA;9{;5cRG{Z6~qL$RLA^n*aZdLISDoelwi_V&ih>v|DM ztjb@rvYk7dD{;K0d4su7_Ah`j-j8D)I#}*@WcOAWp8x?!xU}5vQo7I1Ras0E^8KM) zb@w;Wb!&CGx@Bg%DCsVmqe#Sn21a(s+nGxXm!03^^%&jf%Ki=x?})>szkI+i{MaUw za}PQaLCA|PvZPQ)PTXUE65n6aqZbf~H=0{c3C2X&aywh}?}{j+a!;B$hb?jA6R_a7#%GIQW_pHh1z|G`WXB&ogvS!uKQLPdcBUqUje8*8aPy zD(3WD0PWx0egMt`GM4Ync~HJEImHaOK5+YH9yH;LrcJUcnET z>r}6cmNms}?u<+4+_@6<%k`@-uSkq1A-RSkHVOSdj7bu2wR?4Q8+dE@_$zv7ns|@I zx&zi&=mZmS;eCGf@9{s^fQU$>aqRxNMvDXx89)^gm~iwcXCe>IuW=wLR|^SPL5W1V zmz>WO;gLQ*k(hLUz^~vKc|5(YtJRE58Hq^sV7@ur;mOQj=QUk{KC$?`oRJ)jZm~=Ht@#3KHjHX_PgR4)q{cAA zci0$Q-{n|65&_Zk2S0L26qCR)6ah4o5p)xm{Z|4jf9+dIZ`()~zUNn{PoaUR!rHh5 z=tDdh4=@AdGR8D8ZXX!AWD%iB4N2MZzwcKIm*OtTlca&ZMCD>FuU@_Fd-dY39#`(_ zAMf1G@Ad7wk2i#`LKJ$$TitF~m{R0>!OG)4B9yOgA69qH=dV|55;)lv{PQgT5g)GZ zZ~yu6e};vvsW1~$AJ$cK_VId~;^Me>^;i z^osaSS$vRvp;Kh~+l%ZKy8R^EhoUsIk{7vPBs*WtO2uKnPhRy7<<3k?;1@gTW4V(= zuGRrXZpc<^jDbFL_H28#rj+VQlrpD`;zW17f9ynycGY8OlI=qw_{c8&9Wz*kt?1n)-5qVl9BF8BaITll_@;C|t z|IJx-$pO{CArCOA3CBT0KDt)lzWl$m{OM9H=iMt@-Qn6z&4q;PkRi{ND()d4%%2Y3 zi-AZTBC~+CFsK_Espyn-o&K@JJcl(1a0b9;}>X1EC>93j8g@Ef8z8}_G1ln z+5?-bl7Bsj-(AYmSoVC7U4c4LHO1^EFVys9&31vlPH;j1Dno4ZWuI&05kF{*!2q~n zr!dV*r~(iw1H=q)F@TIZx!4@?BG%Bw;2e20xeN$3v@|@baY-8-*$~dd&P%lnv^P>I zR14%+9@-16?*>Id%bXipf2HZE0H^BPRTK7b+I=2JrRms5dGsVo33xSvYt!gy8bLW> zF!s$d&}iKZ{H3p<{aqhuQ#KQo6hNz{Ue3!+<1v2LQXq$BlZpra&39|9=vvkpIR&%h z1wn&Z*NleFjfAI~P|s0#{0R3JJ?&*P5t8e~)m#Pg%#I*Q%tJH?f9>1U4B*VE@)c6j zvqVJc)S)<-&Bhw0S$Wc#LPT)Qkm_P2)jZTH#X)3MCStD@Z_?&?2sdE#I?KAT4@7XS z+knxGk0GH>wgFti=(f0VeZgbhepT<)wK4>g$&lNZ@`>`kLx(|HiHx0MHZX2WTaQ-HXd z(nn{DC$l~m&7#!qbnQrXnD$?XItL*gtHZ8^35NkPo1p8WHRxbqHm3R&8loo|hRTw+ zg0X9{i4IB)h}S3(w6!UQMo~s(EZxql{=3YhjU4w)8)(_He=|dC8HKizQTS~{vrvZ9 zw|3FlKe=@tm(|W@-)JiaJdn{kl>t-~FtEkhUc2->lBN#KxbN~h%P0q^;Z;+)?o9us z!$E>A2PHooih6ZPqqPW@dDdK5E4bQ-yzX1Ug=^DnT)-if0Vc%^v|Kf~lSk>JP~Ini z8%dO*dXenHf1z4`(u@WOH<|03_@p>ZVbyA`eE>z+E;6J>`tLe8(7lxx=SoV18T(TA z8i6pk=%LW}?LeYRWn19^m7LN2ab+K^CkVGY0mODc|lY&5E|-W0puY|H_L5^nG@|1%iIjYY;GV$C~^c0HQFjm{mYkT(}~ z(90oMe@G6Z_%!qQN0CQ5uYX7UMp5tJf!SEx8cgl}79vxHwWOEHT)6DWlAyx)>?L~^ zy`s{UDvNvBM9D4!Q39^mMSjR-g;Tr#9G5lBS#??ST%|vhtMrYyIx1Xbk$D^fMZanI z9g?}=n=v4TpBsCJh&Q<>%ihXdwcEmDK#4|5e<4=5NLfSZG>AlYKdThA!dU<$JOB>2 z%9O*WZI(z#0mw^3Hrdsr>*O*f)#nF@*Acn_EsqBX`88w`RW?-TJ7t=)JmgjRM%7gu zl2Q*dX^f1q~*euz5DM|(DB3S zeSR_9h8JWt)i zw)Z57PDj0SwFcYoU2CB7vu@|Le$>S;d+Hr3+3FQ1oRLDYD|3FjvJJ^f!u&TWeE4`1 zxNWmTAY!Pk`TGHD&XDic>U3(&1fQvyf3UYd!NwfV;vnV0^ctxpTQwu1f_f} zbn+!D)r$jlcJ)JnE_{)_qYTfBh!! z>Pr1NO&ZGsafC_jT5|EfL!67koJ7<970`ith1%)vt$wzd1#D{qvPQj5y+^OKZvKJ2 z5!Vf9V3{BE^bAA@07)aNp4xIg=x#3*8C{|^9$V3<#=Ygc<#_>#(Ui!iX6FOE9^h-Ir-hMD>i1s0>S zfsIpigUDeLj227I-l*G{H$!;!pC__IVyO9AUxI?K(PkrxBL13mVCo8ZNGQk{2~iN3 zY>ORI|NZveA6tW2xRVw;C<8Y*Gm}9(D}R&Rwh?~Uub4M;t9Bp~yj|r7TV=&b9H&a! zM3u5rDJ%yw!xE1PNNTnD_2~oPwbXi7k@B(x8dn2oeEoIL`n%K4-~Hi*Z@)j>ymvd zQIdI0+n0qtaHT)1o;!AJZ9B9_mh@*UQ06q$y1_a6&W>xj&v9sqzHA#SR*jvv08wv- zVt@6|n?LRLK_v1hf^Q)5*y`N321bQ>KhT|pzPk&tP;Yhukv+l+T=lev({iVt{ABbPRj{W(Kz(vFn z^rb$fF;{Wm=}Lc4P0!sI7Z@cX0DhIs-fT6SEjwQ6k9iTYVL&4r?^FJ+~Tt*M3!+Ne(3o0L){S-QGPK7Yf=e_$&p z;_K6}2kMi0W@wtSIdLnkjfIP8Pe#?;g$xO$qyrYpQ)4H{ruEWkz4Q}zc6Zje3$Rt( zoHDdtI$0$> zxYBmL!)7(EaJ^7I84nh=DSzcsSri3cf$N_2%&raht+6t6J=b*84aUtvH_jzg1E;~e z9Xqg40vHT*0Z`QZJd0gKa6Sxu+^f6Gp+8qHqd*;5}r&Hz|nCP4HfR_ zI8TLR|=+p&8GxJCSQkP8wrZuk=9Qb)oH z86+afS6J~7io?(+jDLVvSEzx&SlXKmJhv|Np@#!4P0L?^5xU&6wnG3xSp6f{-Iw7F z3X4}wk`BBO?E=boWq)1`z}w%l6X)Jwv|v=uf*p5|c&gA{rXtI1cPYSR13-Q6C-Aa& zSE2M;^Zr}F6yNt=;TsMEIFNmq#^A-R)5zp}#vn=I&a$WYgnzy3yALuEW*LvTVQ(IJ zXt?BCv4S^;-`=$zN~3XG_giksPeq!Kt_z-M_3~1_+;U5i2q(96&^5otUawZeDY$f* z4DZgN2FjU?@Q@9SV4*0NPdXKugEhkF#YI-CISuNh0pFucdN&9$>b)ZwX!!iL!D{-- zimbt5spaoc0e=#e;9LG<8}4z2b}*f;jx4dpg)q^&;jL}6?hK1HTkv7P8`>~DbU=hN z8R86V$y1MlObAveM{e@ET%(L9)`Cm<9QX*~qUCu0=qnyWyiDYi`TSiMUs{Vg; zdh#U?4@2Omns`KL;S;{!pAPDp8-G$ATVYjQb0aYm`09$-s|H?UG#%J(i(Qi?x9FaU zZ(+f4Etx%}6Pd?0HPVUH(h1n;G`O>U=T?f27x-?ico2_qjAC@Tgt+u3xUxJBlprjb zuK#qrV1KzOvW7IYTY*A}k%D7k3jHz5hYp$E24o~s_}OT(U9Sp2Ui7QCLs=a*kOKzD zaI*1!r9iJuT{fx$2+5KNakjZeWTzmB{h)+b60Ej^m$IQ<4#B}w;4BV=492(A&N&pu za)T*|2qhNoi5_L%1Rd1-aee~YhRIiij>T)W3V%*U0{Suc4>)X{Q*b80wuNKc)?{Kk znb@{%+x}zQwr$(S#I|iGcTSzhb6>i;x~iXh@4eRg+7OtHb(K~lK`g4LC9P4BpiK-a zejet^EcIW*Rjy>w+e@;}lFb%wFc`qzgwU7BU$jQ!yCLRr`nf>vfYlWCxBWz$aC`FS zilq>U!HnhH-(&M|iZf{3zw+lU3`WW;ERPd6ta*_ELQ7A~O{y-=o+EMaOUi$ zSkU`x7QqMjM14q?P^?vYvt$ms`0&i+vV(KdWH0}cE_vE&wG3uhSnpV=bM!RH96_3L zNY(jC4a@X;LRKrxM4PZ}0Jjgt21r0dBWrntgQdo01=weIV!ny>#TW#-z~vN(8(>|5Ha!1Ky!I@pGAs{|@1_t#g4fnuItBCua1sXXOy+@2 z2U(A4fzDp>jXZ4!(ptOJOdH*X2~bN-6dsUkG~1E6MZX@A%bkGAPa~UM*6=mRX4K7y zi9rcm<7Qmlr~}g=gtj&;%-oq4061UsqIsn8iN_0!!tGFF>8~Km^}pi~H!vbiYZGOB z=&ChgBE+}v<cP?;X^?%qs39U6Tl*CmYz^>+CLe+*<;FG!!;uXB*tV2K;Lo~JaNXp$;($jvwD^D? ztI_X3T<+46gZ8=eU|?SbwA(ofH(Gkd$c-zH;c_jAL=KjQ(iNS)$YqrYGUELIwOWWy)(Irj!d+JLCisKOk+OPlE??D>}U8-9&-6JBdrpRS%!y^-gSrdQ=g=ucqzj`ZIEw$LKg-aj^lUgxoHyXHsF zIjsc2Fis9kv}mf*a7jL-%<{$3h`^L08u!<)!el6Smub^M!=Rs043UFTvvmxD6NuKO zS7%QwG(kTD6UALs=E7o4AnQxSmvxJ&5i@*E;y*!rQcEEFN93?1lC*;SW3J&hs2+4O z%JWHiW}1ZorqMiora_D3q5$&{xb+Bf&$4o*SQ7zl2>xQ_PW?MXzCCQgJ{F<*kh)31~d{ za)fXFnFonh@^x>2=>e!Od`UX80AFqzPM?y8r8);n52Z)7PTI zG(AzvGr$bWjB4AO0nNyL|fYHF18JPYX12E6Fy^Ww8Q35t6oJC`K3 zJ9}n7=4Z=p9uudg&!PC3#**MCaBckfxYYwm$k%zNK1vWl(betr>QHQXZx&_t>J(qU zd}LPIZ96qns^_AdPR~lX;k5oC7G~O3~w)Ad(`XoxIinp(sU{fa*zNFURp9?M7xn()M{5~PUK0gprn!n8V^z)af zc$RP0!it)HupR1e^m51xmhl)`)B58V>k){QwrgV4#1YPH0GO3@L3`8udmv;@e3JCbbGFAiZ}$H zw4LlJC^y<#e(o#%CBwZR=*1aja>MIWHR|=gjJ!9lv%)eYwB=h=j#wU-iwSn!@y((A z3wEcA-LQNmsl02ok0eEMR8Hce!Ma|SvCy#&zH@g2ig=uq-M8N+2_*D{zWA0-5I}6k zv{b8*hVa&{RcFj*Cc;SD*7NNY1c4bfX)%pj4W%vMlyZVfp4%!({(JSwMhQM%=w|c2 z&ycrBTjUvnc$UO7!pdI`*6{prSz>`dwtuhKz>xPdJvJ{_RSt1?LDj>jDiSz1 zqE?%frlJ`l^&Xe|FXL&BeI}CN=%FdO3X)RboQLpS1{^P!v*I3i7z0RY5`g^bw5t6F z_NQ{~dZ-j9$(zd%{|DS>JN^z*rVT769r<6$togXN@pIvDJvNWw!@cVJ5C24RL6tRry z_QS@EAXT=hUH39}F^l{BTP~&0k$-}Q@ zzceq+ZaX5V1cnw-(!Tb^q0HjFd*VBp(x#c{T*Hjk59dd3oJ}#h%DqsPUi#8AOT5Y) z<@BDzM}bW^Z#E1JV$L&(WxHShW>&|Qj~EcDBTndTJRU?7qoOKJxd3uB5^?NNB|mgh z3%o3XtT6mmj+6FmL5D+U4TN%frOL9$hRB|w{2nw%I4LtIq`kPQq4u%9tWtCkphW2A z$5>lol@fh01oi3}5~mbs=9^(7fl{a>7!qz+U2YR6ULRuT{`RD_SGw%dye$vHVJ8yl zKQ9X9{m~`A{^eTxK>!TntiUzuNP+fTVy^b2)iRDwdOQof;)7BnHr-%Yj7w$_(B*W% zDFH`~`$SzL{1He<;teXo6opNSN?Fi6+{jeN3B>&bWVvB}e>e(5z2%tftf7GSD4=rq z^w$GM&0_+Ant)(L$>uj3H#hjzrw<3B0EpsasXdPPA_X2JKL8?e{#aVN0I>eWsApY! zjeOJ69q2eSAIt@8^?Q>=Er#Yk+-%G`bkB|Ue=aG0vxy6W`?oyR4t|FfHM$m&Xa(4k zNO}Zeguc}dSdb!mwn@`d^Ct4$_chaak>h&e$!d?F#UrX!Xf?2u!!QI!S}bvb#{S+& zbCifGYuERkV89EA43ik~MqH;Ohzi66ZrB|XAl)Bli4GlZz&XVMoYgv5`((lr5g?R@ zh}x{RYw3#RL3(fu8f04f%;BQfFPGx|PUmPZJtyykC3Nxz&C^*xvMXP zzH4CVPB3yVenGLb%fp5a4&Kj81*2%2Lb>afAcR$p%8w zHxMBTa$L@rV?9nMGEn~~&I)ShnTUyqBAZrnZ%&PMMt{Uo5QdAeDvK4l@(kz@o%uCv z5VP>{?=RBVw^Ic431*bazUMY?@IOUX_dyzd-q@D`1>{i{@}49~1rNjZo;b5c1u_DW zV_7BjpMddK?fph^@6ixZ7g_x2rQwO&j5!HRpC4OrQ>S*uL-e8n039<+C1+-*+46F z0yr@B(klD$pD@{o`*JDHm(q|ypHvi*;=OM0h*ZD=J{5p3!pyJiAL;g3M*Vxjl`WN!T1{| zDN*yhG~oASn!%9Rqv_QtWfyoAT<5w5f3P1@IDLbuYXd5VXgBTx#wk(qtSa!F%VOU<${bWn%4;l{~C?Ik`Jha<$g=3-f^-^iWd|9)G*@loB3xvd&0pdZLFw>bO{CO+)hgjm;f`^K{ z2tcK2ru8HefaFZ)mehK)EjI>H;$}{n{5mD68a<0_F-#P^A?J%5{l^4v0Uetp2%~$8 zNyk=E)-<9qi{rRTBI>0eup^Ca4Kbs0_U^+VW%MVQs4+m@4hq6BK}RZOGLUBb zDL{_HYDU_tN}yz#`4$)40YcUwlg&{BSX*GkT&ePu{@z|02pLW+B9vtf<2R`3tW&bB zTy~UJi$Qgse~FS5R3GZ<07bbio<+cI%VoPO${_~mqY)=O_eG`2Tacr z{`d9cn+c}J@#^~|AEDWt@ATtSOFuDsE)SSCv+{oeCbHf6F>GwR_h1Cl{Rd(U>`w4* z-H`sApiObKsCl8$zw^K01s;Wdt0sx^<4l&n#VTd1gTye{I6^5cfj6- zsb*WnlVBbw!VZfLgaN00FYUzkqNs0;CsVQ0m@Va_A44LR@gb{voy@n&o`&sOZ325f zvan~4)ylG0#`#bN7{++JqV*k8M<_ZX5S${`&3yzuu6&c;gM3+^Y)UH72!)BqbZsxJz z>j$#MAi$&z{B~D_QZcI-Gzs&qwoMP{SLg*c7u3besi@Nhl*PrNdkmJ96B2#z(I(I8 zz+r)igsGn#Cis(bZJYx{P-~$6Ty)vTq%T_>S(R6uh6Wd(o?^8dpESKgids+IT9@+CS`m!QokOS(Il|UmU}P6sb~)e5(Zv#jC&B2e?V>N zQD9+AY>l0q9Zd{u{DNr2HJtX1#t-;(E{3n-Yu?F%bGGAd|>VM^F=T*TE3O#Zn+PxUhymaZ+=HZNAj*=7@dj8B%PAWD|>jPa7|D|ijG3M2#OljJ8>J;Yj$Cw zyiNN##W9=&Hx!^`I7|V(i#DN9*&1vh*g8mt5Vs#C|CC0QwLJiE%S?R$Y$eeTB}8T* zYAh{29+Gc6gBA1IE~*6y1KC{O&!`e*?>faeO@cX^Kw>H~8nGp6Fe+g!d?#<+f5_1o zt*_dm!+=3E$1W&UBhxmZDhW`v75Us1rqhrzS6*HlNcp3PEY- zGHGOzu8G1F9s4KsM+Tf3y3(i7g#-nhQT@B9X$|HsZh9Wzf|3$Dr`4!|?Yfj@4F-#` zVLu!o0;p$V2>DurQmt`4SJ$b`2J=e+*%0p!+yhdV0L#Y4ko>nWE0N*?!%T}uZIOk{ z;DI5!!T?$ATQaF5J&%B5pe=A3VLV3_js`$um{^)apw-*=YX*&jlaF5I-%rsbRrm+i zY14*?r-C94_Y>$_Ku|R9r2|h*t#W`aXypBy#^Z6;j|-nevwOp>spmx!i@52g(v$!smk|VAut94s!|blF z;Re&SZ^QBW82q6taf1zkLm~AB1l>Q}TC}seQw~M8?$3wixVkexx}7T@6dtbcw!FAK z!LARHPrn;bHk=0sj_xg8*m|uc>fyiazFi&Or|<1n<^pdc%+Y{D%}S}KhBI9NzgGO* z!do>**mP+6n%P3?i|eC}CXJ|#DvdHnT#Z6k#O|5Lw>bm{I8BVvRqwFNq0DbJ?n(Oq zT3wx*(>(aI(`5tGH1Vd-&Gn>h*a-5GukZ8%kV!}f5epv3sjgzivlfg8JF~H z^BFPK^XvKO*W4ptNkf_a@s!{J_aK;YVd{{E0doh@129I~2!s&?jHpBjNaCPvP)OL( z_^O+Dn;g!b!o%Bg^w-KEaF`!Ww#|<@<52I7E`l#Br3{+6F-xL9Av=)#m5Eqq| zIL9kMWnU&F1lgSwyNzTU0&EkNMzV&CWcRsSj?&s8RA3#YaGWBOVlyNy{Y`Hpu3Xe?YT6qm<&Hn^fpBjei z5SxeI_@V^Zo{YJc5;@ko7u|_+|FvInCpE%L@EXb9HOJg9(7j~(-S@}}vcC^|S)z}U zUh=TCX2|n0`Sh;pxAUy|{;C%KFaRu-{RmS?5I6HxUw^RP&Ns16G*6l3 zbJ_%64E9&rZI=$PPXlYs<+`F-B6%A{RIowGxgLB+y49c6q|$3m z>-O+f!{2N)B>iK{MDMu}vdDLDU!_e63mtM|S9TAGwcr`rN(CuKHoF>SR_QboB_#@; z>>Mp5c2c=09ZmM>*yXRyfVE4wD-7&dnNQW3HmCcqai0MIw&mdrd_mO1Z--h2s+@Hz z_)esx8KFIj>b@&fG6;?HB~Gl3>meuMVr)V393x_e9fBul z)H0*1Eq(sUY}_W2E#B%U=t1XTE@Df!9g&NZlay{@18}eHh_%sSM;XcL#%|OWIi5XT zbmoQVh;$)9w^4!qIXw+;{FggzF6a|9GZeMV>qJrARvWcNZJjjNaub6+`;mI$K+>gP zd!zB%Z&)w+`dRy-jToKxapm;J&@%iGN3}BR>(!S$lww$_t}j)4ovBqd>4o6YNM8c_ zcaN^qlRKflcsex-azZQ-2&$2ZD_c5s!u-exypB;o>}Z#?e64+O7)ofgWPvX@cAeaF zjxwP*tW#!zXEiu8Mbb#1X5Qi-9z8xyo$Oh{y|?-INJY1uIedFR()bicU^g;%|wmuR=9ipXeY4ccW3&ExN){Lu1gs?Bb5pYezikaLLC`ah=~0BwLXb3IRbbS zE9YDxxH%1X>Rsh;CF80Ocac@`!&}kD?+3t2am*U%hqvVH+uoVXa7;(o2)acvRGPs; zR9PLb0Ho6WCa!$Qh<>4_sS_KK5~|)F(CPy(eGz2S%E3wG1J|dETE16Z3V2BlHN?6q z5wXN2mSo9W<=pUhXxR&Tz8&D17XZ{K!-47gFUqfzI_TKcD%CNEzNSy;q zkCaTGC{5{40?hn?VEvKo4^gy?1;zgPZa)xp+cM6zunp0#cb|x%96>QL&83 zVAAr?2=y;NjDecpI4fiHua%f8mHz(jg@w=)$b*gXQNu?)$g(%kovB~)iI?W)Ns!qT zrRpn6)O|S3`VFuk@(`RUm{li`AEWdt=LVvJCkalYWJuo3axoUg-UA$KJ8sSkM%R%m zrB^n+1;zRb(4?Nv0nt%!Wi*#Hzq(cd&0k>f?vp;`60ubGtxkQPnp4$$(8^ zbxNs5%ry0K)1oy%ooujFS$3b(X&yv}UGUiuC{fmLN+rd%JDuXGh5Yt_-kv0~&I?gQ+VW?YQF%YN4?wS#EZPmvQL;{!iL>l%Yu$F5(lXc>PYVOa;_l@m+L z?(bbM=W3dLv;excYk%;drkv7~FP^O2$^D0BYTL_ucKs*5QD@~A0}b)?C!ZC22YZzE zI^@bqY1c{A*qrdoN|@(d6FIP*u#N4!hkaM9BXs_e*YS?qZ$qaWdzW%Db0eM`4-nQ| z$&W$c_{U#|^iBjY*NydBm+0WSxtc`D)9KY!515?MlmU5qe<>$wsn;1coR9w&G&yFV zyKG(hDLi^>?-hl1s&sDLR_ETj&PR2j>0M`C-{Pwiru!kE+94r{aFD2ip;f5P@2^1u zfhKqRT$qJtc)0&?H1;G^!hC_mqga+Ah-P$5wswZ+ox>a^4J z#WDhcN4f@L1r;qq37WMv1eE22vLm1Jcr#Mag!DiLz&6+`Ef+iae9n6i#iWW{aXPj| zAW!~0wgpi`)H<12d^VN^8jV1*;OhYRS&*l=$pOVq_1$ZBk~e!Z5%?>PhT^>>Bl>NH z>y6=ohFfgDXmx`!?_xJINFMC&SaAKjs~pb6X_kZmzl{6W_M&WMuA*80LWkP(rA_EG zV{yCU2-m9&h7!SqgE*NVx!#+DOPZI?8M-SI2OwklKZB1qFqk2mUK8lh@s5PqErcUP z(EymBIKWZ_{k(>X#?b_oT-SCc=ZhL zPmRgjP(sXIU|?tLU#`%O9pvq{ZCYxyu@L+v0p;BIu-qWIztkn4GmZ!8 za>^^9$QLR^HH0(eTQ*}-?GHcCbU78L!xpt9!DQwgE*n`Ox@%BQ1K(>Ml6ZQs2q?HO-S zUaDM_0yfk(W<$|FXvj^S%b%W!KbbEDAN@l1C7h#a;)VWk%mT+^oDin+qo;f+Q)Rjb z)b|YS(m4W5^MD@WfWTTvLcfhKApinlqld|4mUDK^l5@j?YdQm>$$70J#MSIfsoE^Q zAeJ(pE=N8^=JibMai5FV$C)8qc)eY;UqE@mqGu@549={`zv0V`6EqE1*9;e8uI4rV z*q*if`=5x;L$e>bE-?1vqekji=_`8hI_x>YNtTfsab%rG-{uV=kLx;7fsUO`-+C%KaWL|8 z)==q6Ne}nV1?WP5T(CN55&=QE_g*Nzz|BK-^M$CsoM>m;xDH}^zJ2;C5VGg8+P=O? zs|WXtvjS9f*KaJ_@}mZ%qH4-$R*URpEgLfXWWuP#N3hP3S5EZMKXJBq3ctjow=hXh z8{>6(Z5OAjDra@5h0`70@2F^2TR(I=gyxhN0+{BT3*u^dj$01iP5?YB)HJ=clYcJz z+g4SB;%~0s>Zxz+aMj<-*J zu~r6JYpk)=9R5A4Fa$I|zly2W0#XNaQ!(yb{h5cZ0J=BYNr2F4GGK6(qt!EkiA)|* zuW7QY>v0QFV!e)-n2n+7meG@Xd9b7NS8jzI^lWl$nHc&f5)cO#j}JNzS|JwPYufW~ zO$()}%AL*vnAyWm?IM$7$8-*rKDoa2j4NPzps*dB3JWNI2=1jL-!M10wnZ8!l@b)b zI3D$Xqy@~EPk=~J+Ocrz3^n{@4e`sM0$|jbE0y&zOvinNlb=)wLPLV?dVEBLPRwWG z09WvHbWr||vm0Oy_*uY6lBypeqt1zkUdGxfx{SZF_7JzEpEI~1u4*$PEwTy zVF834Zcz{e{$o7j?!%3<$6VbvYr*BpLsrpeYC^q0L3h zpxA=48@UYF2}IQYgDa#5oNpHky0XS5bUJcZQLcBz9j-;5PhXfC3_w;xKOjo{RO1Zn z!u@%0y(UBisb%#5T;YG!5{Of9bU~jnsuwWbvXHLSkM_wqllg(3Fsf(dDTKv~*~4c9 zq107m0$iM&Zc%$u87thHlv<85N(4Yjh7$% zj1cu(Kp8H8qfFd3My6|@CmB%fB8Y{l;cVGp^^LdSC073;o|7fD2gI-h(ApEPF>Z@_ z4#E`1Iz-l#qO+L?9B4?fET2VqB~U$>Z7?nwRUHN_?G0zl3?E^R??MGl-YzcX^U zsbv28k(}NOqAoN?K9nPVVvY<TRDAG~{G=pzqmI&^8GSsomFU(b#==(nwQa<{O_ z^i^dac#|eO2N`#4EzAeXkf)qBqDaZiJE#!3hbY-SWU2|<5B>N0vca$O#DJJnW*?0F zm8Mb@HAb4VXu;#y9p2t}k*e5_z6s2++4(l-?Enp$hJQ_X$f}LDTPE8zD6mBbuw@hjB|r`++Q(`!{Po<;PR14tDUV-Z8EbWqWWsu?nvEq}r+hdE;^LyH*CyPR z@J6A4Hz*n+&#dpyna*g@*=bODx1v{yDE4rdB;)6MU}l)ui5|ZOC>ODZpS;1n@Ni10 zo&k%QB?8(Z-J>T57LgJ7y7>Dmp*|{va+Mhb4|j+w!}Xso2LEajp#fg`n||k`4ybe0 z)JLB~J?2`MiJz@J;g}`aL30WePrp-~$oiWOpxzu|)BzG^J$#OXVy6GT&e)^z!NGp`3%@o60ah|a zKYyU?@XbKQO{wu0zOdLqp>e3I+lJt}%rx7fspBw=4-WzTFz>j(1On+)`&!i!^VR%^^EqT*eI>IL zp~h}Cz}!@g5gk`Rr(k}6$@NALO#Afoe` zHM}y~7rQGky=XSja#Na%x~&^gGGJ@7rJ_>s!u^7WXM=IR*vl5b_Sa$Fg4T`Pn$Nmw zwoGiBG_=GXVgGE3%;JgMihM9L5CrHFv-Q(@l~M+7ji=w9Z!8t5-PPW1Aus@UxC^}n z+n)^AjUPW(Ku(xrct!5QqtyQ4XaU3nr#0JnJ`tj-w1B%t02_4}By9P}hzh|gL z_6rfd^a3Sjkl23Q1E<8D`f=;VDrym?CUJLA|8Nf%ekN~)8UF>FG9$uMiHCyoSDUVP zr*8>w6*TEWOZ!0>45*}wui~HmIDvR$cqik3squmlbns|{r zj&8}bW#hMs6NVwdi8?b4ZTs7YW3FB6Y}&To0Xf1XX*^{DUCX_VOCE-W?ZaLI$g~PKe6uC=N%F_GjFZsJp^&zUI`kmZQ(uE}9qYCg2!G#mhz^GkX790?9#odJzd zQriHD#%?nI)l(16L0?|{b?b=G^Cr*^y0SUJB%N?x+8&!=67aEV8Bskqv!Y&nNVk~F zzarNe%2mgsY7f>iBMZik_&NwzU_>Qp+L>k6^cM9zL8<)C7dlP*RdQoMEhChd{0@M2=ev zPP@6^$Hmbpe^b0AYV;&?H8(2AIID8$xH%whv?!N`*aDb1R}`XH*oO>qv)9%^ur(Dyn+O*JX9CY>(X28 zF#01lA6hfptd(b07vFV0lbx<_bz6+zy_u&vlDPhn*mlWWtbge@p#&E8gm%MHfBq1NZB zLwea+b81OAd4(|oGI?RxT#U-}2Y(xy4wRA5iug6m%Po*rbLtW`4g&ZcVF%->&W>yt8jXkJ|DLl=!W)YV z=WgR(<~sHAG7liU#(BZFfGo|)VZ}Fc8=4bBk|39BWK?;Vl2|>cuL4=Np6M%MALLND z+V>MZDYlz~i?Mwhgk

CBnc%TjK~g=K-gn@Nvc1@ER^stu^vuuwQtePWzyYD~9Z1 z1OcSWb1T$WSS8Hc;GUqpVi!NWcOXAed}0oOJYD{}1E9Bt9bYs2OnTfBt?KYjPd+Ts zZ-d74gD@Gt*d&VwIuZeL%?IR@h_jti}A(H8e?wd`esRMlWd;NyZVCX4Q`Nv(^RYG5bh+s<`G7F3v}s}({wUQnPrEqpRaP5qd(Ag8bnd;3O< zCxw6qi56QlDg>fgCcb#EiL#hL8>T8vbU~#?=P0XGZj&$X>*RjpNQoLoz?PWt{{LjS_OEvP}#EzK)qq`T-TqSb^bjXk#?ZLNj@9wP?u`I z8yRPxmy&v@ecIWC!e(CnkEaxsT z-0wSpvAlg~>43J^Mmp_SXpthd?-5I7KwVYf!TCe*@P+(vgGBL;{yyw|=Lvw4H-VKu zfV+(}xKRgRAp*KrgfAgA#(80YBYdSe1sU~&WS^dH?q?If)=2#=pJX+P00>3!XWojv zM2->bb=Fj1gjR=g3;LIZpF!Ff!m+L!dXP;Wn5w5T&kzZh){O&6A4dz*TA4*ihA*0l z3)CK7J1aDqPsSgWTM>5SI{?tm=+@;_m7<7@Wp9?6M&yxL-n+w2NaI3yaZ>e2EFM||ZsFhMC9blVgT=Ks{0%rQoFzKw%d-^7 zyvd*Mw6h+(6Z2Z56V09IP&RG zNK92R0A3$|HkG-@1kVF{gPCB-`gLZX7ZS{#Vd)2rZX znQ7#l{B~S6c>ip^x&WMx_@mc{8M+Yv-um|aowOr{b3}0Cld7WqU~0{K~KpXl8a1Lv(o@Nn?{vQ*X=im-HwC%%QR`>y?%0H2YshsjE_Sv~Cf zFb(Ts9qlceAVr#{`GJf$2@?#p%;AgOOd-X~`^RBNbZP?cW*sW*%L`WCmdRv5xQczZ zcE6NJuSZ7G^!;dMFCXCdG*S!llqNL$pEA9Y3*((4ApX_eEk#j(+)VvU8WXHfrZkU1 z_}K`ZY}*ExzouIWec%FGu9N7}s&6_9OVnN7_2<`G(EWx77Hc+*C9mG?e-jRhi3jGj zAuftYli&&Stc6O9V;wYWQbmCP>9>s%W)xt@61Z*~b_pbtjYT7{%5x-t-GWTl-QhC6 za7tU7ep{SEZ-Na`$ss!?(yA?&?OJC3jj>K73wmJ%-ZVWL*#QOfeCISH!!UaHhXCms zpU@ftA?=X8=N>)~1jzuIM~_FR(-5eLQ+cvq_|f-Nm=N; z>a4_I`+8=YHbZ8aiKvp1^6`pxRa=fiR0r5ektRc;<5gRnK9*Ln$JCd}Z4?!w3ri0> z0KE&rRc{oH!Yrfi>o?n3=t*%O=lP95Nc=O+*mTSN2)^jKXxSz-hyLC7VOH|>b*(P*JSnS}^dHAn`gVz0vmFC15@L+3niagr`OlShgC>8mFDPCCm zz|LUib|1&WgD!ya-95Fg9^h@7;U^LaazQ*u2x#TneKb4@hE0TyBhBoKu0#q z8c4Rk;J%Yi@KJ2RU@1^*;|{?b(GY~rJ!`){RVXl#Iq)mz&xqzzh9@Fno}8O}?mSJ3 zp!>WIKy}WHIo&w{+3o_UG@>h^vS7Y_^W8dG(qEvhdRzVrt1@=KPcE~J%^_YxLds`E zd|ksCkW8S+zm`)Ms)f=RL3f^r{dn;ga)_ykfeQqB;iz!*QkHWGiGle=5#tmRhBe*B z{NB?vyva!YbLSccW|;#B~Cv9o)FpfU^g@70#KCTu^7~K z=U7O0=^$K3vDQucjc$l+>tW0@S2xxz&%fRS{MV@Dv7v%~b@EWxmtxtDRe2Ip{J937I(z2L)ci5r3eB(O1 zdPa3(I;7FFXVU9g+dtmuXhN)XmD2V?Hs!K-Y^{k}A2giH_I(he5X7Pl-)7nL8X_b=$aMZHE!6Xej)e=87o7f zJx?xE|K<3vg-!n*hsOOQm=O6=06*bzNDQjUjURnrO*Lp*ub@ zK;=ZG<;z&X^)02dA%Yo9F;o&=)+77O-EQpCjy=V6NGs~6*u}dprjOlgX8}@ba_jCz zmB1_%YA+2f8iGqoTdV6xp5e6nrq(N8_gcVRJ3TCuc-dJ;C3S7P%f{2DN9ircIox>c zIR5)_8$utRh5Xf*{yv;TMZ48{Q=Y>M;Htln{khQC#GXOuhGLxYz{EmlZfJ37AaK2e zvbkGF=C_Vl%VXZUDVZX4p~lpQy*n|TfUuH}xo@fgAx6KThaL~y?YGTxKViAsGAuR$HL@ZdPF(S4hZqT)4BY)pf{}xTH<43$cZe4zfQbHW z;EL0=$9!bn(@dxsrXT06pFL>ilIRp|r}ZmrNM_{MM!JlHk#;g}(pK60zk?DITucbu z5O#kFKQg@AE7OoWV9-#R?_u|-cqET{xO6#Oc1N+e6)Ot8@C?v!F+{ry(@FRSNDK#_ zYaTD?;Id5vB$>m#SlD&x^^w^xHxxfwH@A4mRhf2@E(lmMedSlS#&G3a+1GO?91RDo4IE$BNp zZ6X>8Mt(T+e7{=4H^zggM`)nN@M^dFU7G-ujyQjF&z$XRcF!`dIsXk?0uWj9Kj)=~ zMB$;3i^KWIcj_c-_)=j}{$3bU#uv(QRbc3g5tj+Wrj$gK8m39e?(l;U>&IkvUylpk zRVy+G*g%k|>pE5*1Vd#6w*bf97oR2L0D4uIb5Y4wT25tFb0CXZnu6`^kBPu2d@u8M z(Y%VDq*%3CT!<1IIlVau1&l!nriCqmV+&B2jf9|LPaB$)r~{YfSN7MSm{gMGdoL9eA>$85BprC+l?0!^1$ zmG^HPDMGvrTSh+2|CsSX_vN9r#U(CS#RP~E)Y~*YQjsL>X!6o<0F6tAoXT>)I`s4V_>6Cp3^ zmr*uRbU14xC*54hrE|t$CK2B<8g4U{*n>9Ye#Y`j04Sdlmn z1QbT60NL6!DL;egGeaX}b9GB{N^uOSUF(m}xk&f=7PHgjFj-`+p~_ul=)jTzdd;^d z>co%SMy4B~b;n;-5jM8Ut1n5hc*%Wd^iJXQvFetOrIWrIcFjlOVCFIMY>GDapAHk2A} zp-P1kucsG{e)Rm{H5uHy(Khp)h0R}nGCZftPu~1X*lU&P1JA%{o`uekm-bmLvO}Bx zBq6QW>YL0I3;fGWu+(OR37kVDyfh0;*)%o>K#{h!zlY&FG`6<~t5Gtr#bi;Bxm-4b zv-Qjpfm+|u0+_9xDv?7nrviWMOWPQ&z6=KBA5#2Ce5M!s&TaMTz)q*xz_0o?d#jyA z0GeUwW?~$jT1{Rd+|1JyerBl^CjT($Ab8IJS|x5-QE`dS>7pm9n8NJ^SF`VMe9<3s z06eE}IV(z3Oml<`NkDjTsL}i$*Xk0kxN#tPU3G{t@Z-1o@&N4P{hxJbEFL!ZZ&Wu3 zr+rtHIL$Jx9D>Sy7>eVsLG=Ku;URAb=uOCjP zd#vAtU)P=rM(bwhH!%)Dv?6c;24TH(Kj`@ad1fS3*ggeaIKNVTs@}Y<$<*! zheo`bJhoIkZd$?qB&jxXU)y=S^wpLd4t%wfwRhRJ5iV0|kl2Uu2SgMu2RINh9t^eO zzR4b(ZS>o!@Jd63OT6lJQSizf12zM{)z7M^h^FlVoOa1@{X?i%`lLu`H2ngNB*L77 zY8dB&h00whuq}%+5A=llXo5WXuo;;j`o9q_VV|!ePjq7}VHrkc=~ON~2Jxz@9%MAt zlXYfk>!!;0psIL|O{ft=90oyzx$OUst#=3yv{{Cww-j`v2ELS@+BQ79ox2T z+qUhFjlTcgXK)7lJWow)QiG~h>s`pQOW%c^`Zbk9th7F}7qWchbX-r74nTiA%+yjS zEp9+YB1<5-bcs1We`-kx-yv|FV+?|F_i36*C6VHbQL1cER7wtO+y6Lh%2aIsQJ~f4 ztr>mYYeJqNw`Y3D)#uo^?kd##+e0guwQ?5ELihIc+l!O_NU(Z;7Am(lm{Io+^uL)+ zigS0VHO5#-+^b?B6P?990#Ge!HZ=4zXwpbQleyXLE!r@QO2}E*^_z1iO`f8)3*|mU zjw)vZwJuEP2cj+P;ldy2#~D5(oHZz32AOF1DK(x^F76Ky9tMgxAe1H*V9H>^z{`JpOnD8@q6eSfTE~nu3s6`wI zX2=_w#&IXma%&it{9_t$R?*C#aB_GQFxwA@2UQeX;8vh&J9=a&L-0Fszpo_XAE?pT zv`YvX;zj%m_N<0*(123IVNtW)ySYC!OC-UhI`UA4kE#JWNfAOxZ1**MxhVCuw=xdk!rWGtcySBbGwquE!z8`3#BGWH_uJ9kQ3w_u zri;WXY7(iEeY+&Ip@5=K&Eo9QBfDkLku#uhPfBQof;Ept8i#58GYtyjYJMXTYt zgA64`KM}&e*N_xDUEqchyS4FE3C!Pfdqj-6(eb?7-*_}Q2X2TVN^H#x}7 z!zphybY)&tEX^0aL-w3T|9SmN#;}y@CcY((nFGlPagX2e;tFpL7=r9|X093Rmow_5 zD-wPw355`k!aIi{UiJNm&Wb#}wQgANM{b_wsMpAmKLX-jD9Clv{MMNtJMzpcXmxPe|KJ(};zL zw4JCSU>Rva6e(()gAN3hsDIw&l5_t)+r(-3S8t&x94ZInf!Cyq;-8qDw4Z&}YbJqh z+OkL$WC2nJ;@C#4n(quIYl@YD`5k!+giSE1cR>7d@OT&JFgX%^o|A+x?1Em}h!v@w z`=ibuR0Q;xH&bx#@!9~`U)`w_%cQL)4um0hZ8z}tCjPI7_CMo{dra5 z3f&a*laaJI<#UTBTU9iEjMV0)=<*@L!os1MjnlvZaLmt`Pgqcdc%%tMyk&-GhSB zvAAa1)7bKFK7_*uZ=R)fQx#TQ$ z3M*9){mfbK+?Ft-^C=b&_k6Ajo&MD1L4eMJ6>INfRhP&Lb62h8z|Ys-%oM4*BrjAv zOKpdOuXP=yKq0E|W4ei+4qaoM$xST#z;mdSieh;^)oqSZV(fdTsU6Z(rEk39{4^*O zU)Hz#KvVgU{I3*fuy|A3uyj7qQ4#qh)(&6iK%Z{tbTh)*I4ox^ZV#w0g4hWvd>}Pi zx!--W4l;igA$f8tc`eW&F?lTjw=n~25oUf5$e2&m@5lPudcYoKStp%4u8-lW{zQ$o zUA;v+GH@>x``$8!^0L;BJidxkJkSO0{qjY48tHB;fp*-{?YXdQYqNc8bT_ymUE;I%@5k6@e2MPM7UN znM%^elNVC!a~{%LVbtjDJ}BV_GGcVPC~2fGd*SorCJ|H$NI-6ePR#1xP$qq*8qtHv z%b>0fRYDYY@?E;oo1f)F2U52_TKwA$)}vI}?_lC+_;6ZrF4Pfill&-d_ka^zVEYL& zVnB8tFbh4T-S%fN;U^?c!@W07;T=(biPAvx@45^#dSHF$^Ck4M*8BAy{=CpRZu~}` zD;I#*@WBp7S4%3cq{{IAT^`Xu!#ivJbbey+a5G*PqN0@$F4#irHZDC{F5M`FgMHHe zqexV$Y#fgcvAqqHi1>V75CDZmQAYEuq4uy4_DAvMw7BAaGre5HAoIMrk3bId{=N|| zlSr!BBQ9b+48$$ilUtn55R zB1>~Qy1neWR}zEJ(r(!>MFBQRjK(yhw1}}zowvw0v$m0)TRrK$DST~cjNEUi)r?YN zP!~LoI(QM(!WlW`&l0(=^PU!7zoAil2znB0BB{Z+*;7%YKxq;|qp$$-C=lT~#3N=t zp{16RYJyE?a<7h$-O|V+Q>B#cSy^|N1ToAg(`Aj}TFcXMy#y+tXCl{Ae^=Mg@{Hj}M4%z@j$i zpysrErAc)ahcy#>&<9RpsU4q6Gb;fDCCf>4IJy%tx}zDpe4_Abr(PnvY6=<+_2LO8d}fKUhbP>#`Uwv%mf~?3%;>DbKw0tob zlYa9+`P41a2m!=`P8;O9!ESRZWwLrAX&|4LsATjRRjWyC2|8cTs`=i5VOod_X;`I^ z5f<$fJZ7**ZMskX49_1`|NTYecuW*Tu7~P(`LS{~i9+wE__MGXC_~wmrnJo&^HF}t zDp?-DOdOx{7Isq?4566ydQGUTmL{5_)kBiNP&XU4z5s(O*MFeos#+A*p2|(aSse39 zX2a=%cp|f7=|&)x;xKm^YQ*b;K4~oEg!;{R04ZO+S+lm!v>Cw}N@@OW%A7nUIMbwO zFd%InBx1b|{x)T(PPo4`9fPpYc}rLNCm7Y!Dxh(X zKEwrO2B>JtiXwt~-1GgM8>bPd`uozzi8Y#Zw~<7evn2?$z}B9srG45_{sGSbhb#z4 zF9pvy355x}WJCQ~=4~gI%Qp0H8^>|I`0()w(NEjra zlwH=4`xn`K{Jqkh_}^XOU)`a<9rId4$4~dvPWJ@7NKBq8^rKc?d;s|o+7s75Qx97k z=W;lgZ>^|{e95qX(h`D2JEj9xaMEs4V++4AMH;rWt{J#!Syw^wxb(`pe*NlAq*CKQ z9~=64&U#jZq6P`yV}L^p(_ij`KUfX&fNU;jUQ%f(#{;V5MfM1!_W4(>r^knTB4E z#H&hOtO3nc}_0pvJI1~Ah#Cv}0V%m%wkZ!Xat zY%0|>p`E4LJqv`Hrpyzqc=+L;r>PfmQtZpMF99(v%6qo)nv{Q)Vc^epVX>B9Rolh|rq`mlq1y;UMrSt=ex-pG{EiEAi zc^}mF**4a;?-#)VUy{~~#;v%a)`A#2mD3}!I+$NNKS~@o{jYxdO{k?c>;Z%O;kSb7 zBzNl!5}#D}2)9I{VW>kgduB-WxU}#4OZ$pg&^Bi{9DRy@KO8YSwSq$C)BZwJncLbf zt|e{V*SXkhdGi_K2s}d)I~?!cRN7zfGV^DB9mH3%YFc24FLj~_-0Htdz()qUtaOig zQtaWx+gNy~xgdnZndQ2IY63!tqn~{asO@Yc8gV1T;pp(0FX0KC*O5#}jMe|>)eW$e zL9J03^gvkvjrW}QM!kM z#^r@XUV{7MB3pq^uX~oWc+_)Dfux3x>Uu9(@$=2e`QdgpWM9B*9bnJ${RYSU{e3_h zYqIqcniSB@C|+M}kooW8VPZl?E&nae$!_9nun^X)C4Ki}ON4|dR#9fVD=yd5zT4jO zyV$aO7oS?V$iU2gkapiJ3N7p}h>*_|aU)?y%RBA@$TJ{tm9jH{#5oYd0=1+@SY81C zkm)$eb&Mgj70V9S3V2p94i0L`-TVgWm}IhOf-6$JN@L$+UOb0(-Omps;N0x!#~)1^ z3C<86Pw|dwI|~jt%NWT28}(1@vtaJ4>Qs`GiRe3Q zWwxoShE)ZA$gC?B!ZnsE@`M zQ|=HMY^^i+2Co*(&B8P45De16S=R(QqT&f0`PylQ2Oz{CqK*Mp2$}66Pai&ZSsdlo z5Yl+6SrlG5*Dfd46+T`$PqF}NHAUJ#x2F!8eVs058AA8Flh0QO&8?U3by{yP)V3$~ zS=5R?Z+|ADXH@O0a|_$(D)cr(B$EPICxiWo^ZX7-8^eVp_SQ2JA|h%=39l|b4;X> zT-A&A$g`FbJJj}RHs>YlScZMO*@mc*Y>->GOCA^Gw3-a%M`y0;pp%?^gyNrNnvvy# zWH{QALVf*DhqJcL;ar7M%ol;xq4RXGXHC^-U^9Os);}z8jw^Tp)+Xakm{Oh^ZDF_$ zYyoRSbf42FLhgr4zk7MkNd}Bd7i`owenjhN-=o{>WMY7|CY7p4T7CGHsQhSe{L#`b z*TD{UK+cQmZax{2-lq0X+<;%9*v`eB(aAaS6Frjg|E+GT0@(aHE{PmpO9GpFHckov z!C~;K8L(#|1E~(tC~D3sk(Bf`(7DNHJg+dDH=-P&goznkU=#mzHN|DJ^YFKQn_KM1 z&l*ldP-wgrm5ANn?LdcvXU9JC&FZ9$J>5EGzj7&`?U(?^Izwm9v5EN>lIXIxUFRnJ z<3M)s7q3qjJ7mmJqkGJ>;MpmxqvHVR2VNc!!0@=ukcRc7-d~5S32@qxSz)9+7+uH) zD6qP!tQA=57Ozk0b;2;ussdapkBt_+V8lE5y8P~LFavzewaVyBW|O7 zRq8W8BL0~z5#9~2pJRCh`O=jG=M&Lbnf&wf65vJo4i2&KJ9`d`nbI%MYQLn-mu@Gb zHR7Kq{iGFIXD|B)POF{B_rJ+zc2=ImJAVu?9-jZ>knQBP4z?x67RV=2lz{qOk{VZ)ddyB2-Ia78VlYm>M3uS&sPvHP#T z-zVD==(WztRFqoVf;CN(suk0;5h`Z3T^+mC{+hctlbg}Y_S-qg3*NTc_86s$`5OSH z-}2HnfqSv+)8UuFuHV#lQZomw3lt`0$ud-leaD68{ZeD}Q2IpU5<2>+t)5$#rP|@@ zz)QWYk%YINgUnxE&Q`p{YLDWMZSKtKUTCoNFJE}@rWI?G0^vDK4=;|Ef;X2*LN%3bMui>Ktag$g^{q z;A2@|fLuj+l|z*zk?}DwbSlrSPK`91pT8*nU}EpI(G#rD@r_U*#eS26`+#nYmE$O4 zvhwT0RUm~!`I-0_yXVEH0~ee8t&|w}9=G}Nl*r7N@{1wKRk6dfnhMK-wHh!!W%^bz zH73cpP_AN4W1kcIPdlib+_ANoWFT+1?p9V@0OD2ksLM$2Wy6q#(rP2zxvA3~x>z84 zJoH}xvE}(@fTlL(GZzy^ZUHy1YA$rK&kJe`8%r3%#+zffi4$Cw@F?wg!(Cpz`3|2} zx4pN1C*x%HRX1jJ-q+x>O#={HGU~3dG5@MR+%V@=q|E%B&MvTH?#Rop-J=NKB6FuK|Fz{10<8ssihi_`!xfb#K1N|^Fz&e06YdV#0^KChr81)MnPMPBqfnM) z=^T7+TEh)D)nhxUG7BVKdFMG%$F$9XgZl>t++4liaKy6e_DhN~9LWfR{&7D;v4x29 z^@MG>*Abao3np$tXY&~M)>+!}#CFB=f&McMVzN&;&To|GNn3&Ihwz=2`Gb&{?Gnh} zPli7k6$uDFy=F=QrLMi8`ula><-;2j8orp>f{-oR^#b1hgaK^HEZ?-d4M&`6|C-Oc z-$X1QbYsflJ$}r42dnGr=Eld}+Ho1}oxP{{S-RVhAJMVS4*3F&)y`y7Yg}L?g)m7T zRhZAZ!4WZH03ikA!xQI(B7KD$@Bj6YGpb0*;J>fngI(ehR*!dx9y9sdQg_XonihFaSiQfg(o1|HAULZ{IH*M8ThX zh6%u5W4b6qrsygS1@CdZ?89C4P02+g{k*%VW+lc)@{p0gB0JNaHsa1{Zp_O92mP(J zLW*5(>LUD0H2V4$;YKu2qkz~k@K%cMR=25JFb~u05`Z@5$u1+0WHM==(vLdsfoKB> z#DUp?<_55nDc66Ca^lRY@Se0&-(Yb5$ z&z;X(lctS+;!& z91LG~h(V$HiH&t~Pk}mHchTCX@{wZ(%kkI5cJXdSK|AD+*~Fpv$!N7CoH2h{+JV0; zi%8t3(ShWfMKqjA5uv6;+XS+ht7giLjtOgvWcOW;W0W{n)>ul&ZblXI=+7b#iq{n_ zMSxg2_idVl2QFoUX@>*c3-z9?T#Z*=LT8aN zZ`M$B+%Pt?Wh?u5C!T><=+oIS^fFF5pPQS-d?1UswBn}|#W7g+$pl!(3_Q&*4Iomb zq$-C0nwtK3xlrZUDM1C~Sg+`QD>UCY=U&@vbO7ogM&VFTevN9Ykvet4-hI6CnQyzNvmt@Kn;oQW=N-MGw;u$ukkNMKvu+EY`c zF{(>}T{B_dmlFB!t-+@$NZ#zHjy0ORH5y}Xk?v>aWO)=BZV>8jYxev|%3cT4Pwe$dnZlH2!>S;H>0f=oB#K2qQ ziy-mFj_8IWAHP%!73f$X+A=m>R}5X3kiI`nT`1YyD?fRnya@Oi1n_$Kj>$YB)1GkT ztkH6|-_Pn}kkdAmNs4kiVr|CyP=ZhFFN(Cc69=AVkgZ)}AjR;oD`cHM4Guw2oXW|k zW1o_yE2Y1aHTk`=aPW3w-o6YWvD?z?WnDE74-SE2L2SlaTRcJ;OWZkOAQRo6V3*V% zf&-a<`cKLFld{qA9{}Ds*7MT<&@2De`A9#$N>_5aD&g^QW3XsNJwuqYm#uNFDMfyy z)Lwl&3u2J!tK+GB$QbMWBZhU?i?bV2CwFTf`iSmxTggHateCv;5W@$R@@dT>6&Z%> z*JpLN*`EEOadqpkcaH|o2tL5BRY$jh^|xRFZ0?WS$=lXlHlVk0rE1pXkOp5od4?Le zCyJG(wJCMv|vEMgXXZ|zt${A09`xw z*Zru!f62B(AzPWovj`slcY7^9Mpo_!JLl;gp=h1-Yw7IanpD|;tlN~5nedaI($>8&i%EpBpM?WBSe#zdU}C|FI<~Q`STHI zf0$qL(UcrRA0&2S8Gkd537TPJOuquTHhF3Yn2jVl8z7V!AF1g3dOEj7a{$j3X9K_Q z`R?7lCL$7_-cK|09RWdayk<#TUZ|p#H4sWL6l319Ob%5wwJ7hlZ~MduMFnhm0}4n~4avfDC| zGsAXa$S{6E%lW(ubU=c(aw_f54^YnXhV=!OS#Iv+7?Oc7kT6p%emF^Xb$4F{k}P}* z&iaIMf!CV_J*&?ksFFaGw?ZPSlnq9=b3rSJwEX`E*k?-(qy@tO=jP)0KgyE-Kl5b_ z)j#*Yf@`=s?+*d|qkbg!Mm&f$a=tzRPsCs{CAJ~ugW#~y@0aom`<#NJ`k$9a5!L36 z9UU{Z6~8oI=sMmn5wm~p?(F!!1R2vwWSw}sbsDgcgwMMdCzI%wEnnL|F~0e@a~EAk z*D=Q1q@c9;10St7{(IJs`G9jU4y5WARcAHjfq$y}@JKD!x^@)%oZ}Fo9siEZo6&y_n7r zKhEEH1xp%lg)<(oJ(il7&q?i*gKl-cg&(wDoa zZoLBoNTthU8rZ~?Io2k{rQ2;0LzyWI4*1_2cq|!5>>F)S#C02?YnV2{UBu4N7k^T{ zpRNh_#{TS_jtak?E&wVUgvqlB&e91Ub+&3CUz8vT*9YpknTv+lt~S37)>^yFcfHY& zNidkDh`mLr1KjvSf9J-cm=(kBV?$H?p~b&A0(Jd>3)M!dt-JzyI_z zg(V2J4~GI#^Z;0;u)z#!&6}!`PSICf{~&p9p+rGMF=EU?{HLx?VZUedI~E~ZpRe{- zs@e`ezVF$|cr3*N{FcOrZwOsKNF=H6Z>R_b01Y3*Y`be@*2=<#`yuxMj7TrcH2&OOVLGs8D@+UV| za;>lY0_cbyq+%{-wkGWAPE+xOV*1cvzQd{ciT+MPz+vfk4=1x~|%O6gS|V z=G$sXs{Txgb`%P+c)O;dwFO$hJkwA#A=+e!0@%nO9EH-|BGHtb5)PYjK7s6f%;#dR zrJ}HY;D0%hyo(}vq!u)gze5Pjs05*7sRV)lV`l@Mp#$+kyn`k65!hvxOZvHCNFQ;`?eskw_)T0p1c z93X`>%B9eEr+8!CJar)2<<*D{hZ|s4EkLhCY$HqKy9kz&mF;H6AUHJ?G8OIaqGNHV zA!3nFM@2C7$gLyt)qh8MXwE~@Lnh)wuCM7M5{1xUf}6dO_XuPk^xp5*fnzgtqtZ4# zC7#H|B3MRze`_21ecTh&8KfX@4M$TS~$}eDWh2tI!x?}D(&yMU`{4=k0-p8MTyG2T%ZKwhh49-8|Zq`{e0Jj%L}EhtOb>1 zgNhUS7qGGlEmecu{hg}`kQ_XebQ5)|DiNK`g&vf|t0`&KB zLFNDC<n4JQm!4bAb2Mp&F>>85ToOui2=?f{3Xy%l<4;OLW*It>$-M0EKuP!#0eM zv4qP}(-EWL=5g`}|6QeE@&D`>P{baN(AFe3m;R zW)G2y&)$!_-zpnlnkhr?L`OZ)7m$Pm?+)K~!T{AfBB}mBoL7F(+kmJtS41;$?NBSv;wd1+?f}g*wrnQZUxKUalwXQyoTiP-5L{N3PO}UW%UdH9R%9C(Dr9G?1 z(<58h`-_SLJmzPJk9QW7Ekq1)uE0vBeBye&?G4dD14|du_982N2i}W<0)W^)2&1pI zo<9>=CmM|^n|`#~{A1f6HDOSLh^VqBIZDDnaZ5x3go6v@Q*Rv}HvUUgOKdI&DrJ(B z@o{57SaG`Yc90A8VuzGeHB2dx;9|A$eX2=GX}5u(O~_jw;Lgn zdkH}`1cv5G`}P^ACj$qu6Yw~_8G8k6`1{KL*8^F}`MCN*wA}a+YmLxgvKXWD3;R%| z6R|xkX#J$e`|+*xBVu;Wtr2bO=sR2vG=dO;GRi5AZ-4m^%k>SkcO%6PwX}bH@?h{x zj}Ugp?WaK6;5|_{$|;M`Yr6n$cCCep;YMoDIaq#){mlqRjq$s#1RxO=$F*OGf{%f* z5hii_NuR|O{RN|ovJGop=44eFQRt`bH^tQl#Tg<0M1q)~5j#n@);(KV7l^zx;p*uZ zl0Y#-|H}o&$SmAl?h}zF53wB^!k|emXpB@7MF-OA4!fa^WJP@4C=2Wz#KS+B_8V5N zqRJmY6e+~8RTYwb0dB=99Gu8fl75{b?5W-)ZAG{4$%3MJka^6@WNDIyRoE`>>F;D{ zg&zqKksS#-67DIay;+4*s;mw0WCfe_JAjs^3q7XJiGoL5E%FOd#c6JX>{|VB8ERX; zJYK`pBVG5<%TE*cMcl|G!h9vaO1?vxve~et(73#G$QWFgtSj2oOXdc61Y{aC zbm&vSbFew!TlMe2WkbrAENN4)V9-JwOFe-)iY7}k?+~lL*q#qM2)EknFA=9XCUM(0 z=IMUo18{r%kTxqgOP?d`-zZ*Nw_3V2%s)aO4OH-A%@HqZfwX6_8AJLAr%t^@b$g6& zZ-qXI2}Lq|$ys_2ij}d=vN3RQF#K$XGdAYXPDI=nm7SEYJhr$VVZv#6j|2$qxI+>o z*@#@7HNPnzpX00!HPC=(%yyT8N7DUE*N&@Xdm)S!pQ z<3bu^B0@?%Ow_v~Jvn?TFPTI}D$`E}G z(@(5I$-0r63(6(*c&Q-S1NFdpE4_M{`E*b$&eXv`X0Z(%-X%DU69ltEz=3r--#Chf z*L5yMCX=n3rldJm2@ia{2>I68Kk^?KWjfx|{|4M_Y+R`U-e8m{++196OtNP77Os}W ztjx^+2YwH0={T6QBl`arz-;ot+#spc+HV-xZMXr(P`8#IW*6jjJL8EZ+~~9?6?xrz z^FpxMsB~~x77^8>nJTJ+@yoxctZW#vbUwWudwBVxAR`f*#g?(;4@(cG)BKRxFTBJ_ zp8V+=$v$6KisD}oQMlalHMqSdy8VL;2b7e=;-|6IMa@Su{N5%2Xu9W|Dt^3W)zKfwXU?Zq}ethmE-EG3#?yPN?;e za`9|9*^#}X7}FCtpFgo!ZRO!p`@WlnL0N))^3-3o!1?xS)`aQT8ab&84BZz9J@Dvy zu<8KjV}z%EV5x80xWicnqlcDj949h?TeKa|0xdOgD*5v6k2MK_RS782*S=q741Oy9 z#qNYzwp?5olG0QWp@TN_nrDXP7?k5M)u5j2UC)fB!t)9)zkCS^nF@Ju*&1E^1J!p8}83gh;>kDYIFQR%>)rTFwY)+4QTjrH+(8>%xL>5<*99>7n;&3b4_&%boR1#M#1y)WgI<@UhZt0^Xiv?eS7hv zhF^^S$K+v_vKmw0)?yX|@Ct`7x6U88-!#Va2IC>0z%P8*gaJKUIUk!K;((ACG&F6| zcY$3W(0I&ZEGCtkt9p-haBxXoZMG|R8em4q@;68}3_DyHCP8BVRA9n2jw6<$PY)3q zHj=f02+B|q2?5Rwe$>#K@DHhphc7C&nHPk3`A@7r3-SuG;qG=jK&#pAip%dG7_dd*-Zi#wtWP=|6d8{7CcA}kfl(5QF0JNbZ(piaI;tGelxI>g! z;`Z<-cViah-){04t4P3>lx9F_sxOF7H~4RwOoqze)uEG7106R)BgmYeh1nt{ubL5Z z++{&FnA?QyxG}s$+$z?vg~FXibC}8OVAR_*s2y9*_r5{00zUe|F%o%%{>C-T2HsH3 z2c_GGo%#9u1IVqNf4U@I)`{l~&J1E^s`*7uQ*xqa>{6Q>C*0(dLiMnd3_*BS*qTYa z0!0v|WaUQL4sw}*_RX5^9H!*RI%%Wx`M7pd%*DO>DkD-B`TGLJ`Fqc@Gb`j<>OKk_ z3h~VgVwSB|ZG7@jx)t8B^!F%MX&ZezMI7a0r>fU&U^Y5VDd+KlQG<7X`sJ(1W%|u{ z_g@2?1ee#|3}%kcof%DfLtR3b&7@YP^SmV}DypVt?MSk+R?(ysn`>)a*Fpk)@KK4*s7Slsmn9fY(4MTCIcN)ZNX+;|b?D6>hnwZIyz zgZYGNe=XMXMF*Cf=YCB%%bxpzmX1c$XPD*-9D>IcYrckGibe$yH*~anJ-ywpW>&JP z1Egr=QoaY1JG8lUh;}C~gnuClZ{1gL(;NP*`KQ99k{eF|RP*U{5s^cn#QpGApcu3P zp|!bP)7o@F;XYnp58gh{=osofj=$URyn{w<5QOY9e;0}4H8a$FGh^e&nUP~ZHhpv& z8Jp5*hQa9)l)3ILgYNhe*tR?_2O5OMKm1qoo*LGer#%&`$gts}#E|nM$4*m)$J2Q) zH6i_LZH7@w%rntx%G*-S>GS#v^!mJFRmnIAHq^vxki}RaYQeq-5{FPLZh%(jX zu7|mWRQ%G#Ol{K_sk22`TkM7*B5uRM2?d$kBRs`7*J*5P9j5`ZJ6)6yh0U}rkL{3n}Kh&Qgdf-u*r^<5r zki#7x-k(oi@IaXfVfWPQ*C^wgF+HUUkN=*0K@(ORKBR`TB~#AN=l>be*NbM>}d`7wGTbbt)k{Z&uCf<7-Xfd@=}S3T=PHm5q?9dBd?+mmWlkeCJs zyW}Elvxl1TyT72C5YW_MD+o@8VY14bUk0!eOQQeyH;)-%R(lITOKOfJdK$+^uzyzF ze#lUoU|t^CeEMOmu^hqKkd>iyAzys)A2(K&fjdQ4sPEF(^g0owhq8Lh`*Ni8W^H!H zDFF-IU#9j3Aw$O%r+a<@0j?pYRkcb2tb>aGT$qW9BYX!w0t2p8`okvA)X^MG-lXR3 zuuspQ&i+dI`MW~1bH({6BG-;wH%|C)rtgL%QH9_;l29Z1VNIZ-HMj$7@9^|bKw{}5 zxq_TG)S0R=47?>_o(YSd_xg!lsuAWWKi~tSN>SFoVu5qFtH4%>E*|JJt$AP*%^_#X z;*VJw>>PCh)zr@(ei0`Ypg;|8#op(&QlcT>P?%`CM-BtY$4jeNL~a>^e6Vi~ZT9aL z>0(lqZp3y-)T_3Bqw*QUn1g5Xy`1FZttBE|l}!I1)vzpB$OG&yxohoH&3)!m4S*?2 zZEH#o)O1LtA=F#zF*qof$_7~AlJ!(|t=l{yI$H>#X5eJ|%fo(RGX^UAJG1AAP%vYT zo53P9lY%jkmuyc-UZmm7kE$qzTEb9z-8b7;Q6W)I*M%hMvf9_}hdBMB8Sv#&!0?(P(09#nct)t>moXEfR00I0Pnu7ls z&w0dlewf=<7L0m3F5)}6Q%8--VHi>W@EWq3H;yjZ2TYgrMRXdlwd%Eqp$3Z!jrA*< zYb-`e5#GHF62z=|Gs?nj*?Y`gCtr1xCxXVDZosiZB=~D5BH4libj9s&1O|n$Bq&JP z_!rV<3Vk`mjG4(em9`ojpa!9EJzmzx)%MH5>%>yTS*n?E@e`E{L{BP^E*qttw=Eg! z>*%S$@*b-W10S1za{B8m?qt^HeX24JWzGzYuxrMBxW!QbRGb&HOqSgkQvI>-WU1+`#!I+T zE(Ds$s{TJaxwnIw1vp6belzjHx7y5gh?b)vl6di8H!U4%n1~i?# z5zLP-V!jo2PW`1FIE8PO@iu>arLiGAfy2)qbT79~O@*gwRh`nlRJO19)=+0B?GHYJL>m_unJ(GcOVnja-OsJ`DdETMV$L1GS(-9e-b$L+(lHDQy8?Hj0h%;j2{@RqSDTNU-6W6U!vn)lIu(NrR#kah8B${_t zea&)9Ec{%A6+>n~DZR_43& zZHF)YMMbb;M-qzxR*htgs$dbkn6NQRCsiNP{Ut5=7=!Nv){wgd4Em*f24l?T&W5?+ zbvwL>Z*I{o2pJEt2i6X0!J^)mj%y9ppyweK05S-XBK-QC`=IK~Ff%+|*m)9ZeXUeothOpKTHpzW0!~IAA z=0{jJ2c&9n$?X0WiG?xkZQFThjuGhk9o&^|Q^K6@OpBb+XpD`gZ=t{sbE8N6+(2Sh(Q#+_1fGhJxvr(@0j z+ll$URLdBDfCq6+1=P&SpR^!yokygDP1)>~I^DQ1^QhM?;V$H;}mJX~QBcG}=HUm9s=T{g*vF z{vJ($gEZ%B>}D%q&?8uI{>>)a{L8gYItnZSf*7&un5?Qohn!~jzMyx%DP1Cgn5k)5 zDQ9_{!iOp|@$7#hW!u2ZBe+=o8mm@c@T{tHWuDPuiM-?;5^CQSbJ4iX=OGm!i+}2`UFgBA z^tGqKsAnY^mM`duscb_@**ylJ2Qq>Oe*bQ;yGi`3cp6J!l0K`AB;rAI?nOQH%cbl~ z=aSdi`++#O*OH}6g+y{5Vu=xbX6Y?w=|iLub_{ZRk*BlkOj>#L7ibWf9;xGGRRqo!61M@*(z0K+7pa;bWaY2ooaY|)fQtR=`8K;h z5W!+-hs0?OMU@T%f8z9acRrza$B}mbH-*K{!IL=Of&t2wC}cqk;7-OIw%zR*>}QdJ zn=sNS7d7<}x(7~?W)cg}?M&xe1Qgq~+ch!pB=Bz|PK}mE{`$$#NyN7(9KeHJFlJo8 zgFNBu%(tJITiXVFv-iIL^~07!OF2_iIJt~aWML!CIvcA~6ittT6I1vx?8kRX{clueh zp-j|Y}t2G+uohAoIZBR(cu!`*~itQ zE}CMB!?JD3nv2wt-;03$j%#6#7xoXZz%L3pEEpPRe(fUzdS)lBUtq|D1Bh`1sTY#u zETkh1d)D6xVs5(H9%|u5I+{k`vwSd;iMSGf$P0MGS)QVWmqi{nOhhd>^?el8M)@L# zNx-G`4XR-@llGt6sWX)}bw~?3mNzimOUMvs3WV$RrMqj*yS|-0y$e;6PXs=Tkl~!p zvJ#kKuNol&u%QLU+zF~b)5lTl9LsXI)?-{rS;EJ2;WF<>NR$`s*Yu^Qk(y zju2p=cpr4w^orGOfBy94>IZ7rNv~bkTNJj z7nYUuqCS(*Bt*?d3224x{W}vnCKpD9H zkmf}p*J;a~pfQP1myl_xumLP=#BjxY<~uC197|v|`FOl(O>2u|u(^Bl(F7=IHF%$% zKP?J@BZRdy*ziQ~v=w?mTQc=Y4QlPsmZJrxs_*Apud&7$#Z zsNWJnD#!EU`rh`h;C9cL(;JXtY{q+C3U9tHN;dh1`DkSJi?#t)oLQdb_RZ$?>`ye{ zdbIuESdk$hsMQP5N!0R;_*)bgCUxm`PVd?P@oWqC4BC7%H$^-0g(ELE0;2d>HD}8` zgoYjzHx#0;slHHIR5)xrLW81yULgFBtq;ZNMB#$|^brfEF1K>UThXOyt>pC^ww4ng8K=ReF=F^jByTc<^PYZbL!44 z+M;c2eX(uZwpppzwv8`##je=4ZQEugso2)7b53jbzTAiXvi2VsYpyYS=O+wL#uNeO zTr!_qBW;p|+E<#SEbv)@3Nzo@I&fiU(`tjQUt0aSW40d&vGE5tPYT)D6j3h=Pk5u$ZnJ-TXhX2Al=OjvSCiTFD&(7U(mMf)FSs zM34R}d^d&|E@S=|KpPCDAeIHfhR>_b^V>s#Lxpc2_awqm-bl|T-qa|JmQeh6Doz^>ZY>~p=rY%CaVMofPaTO)>XY|S;jkg>uZ;Ib$ zzdQF53wsPslP@2=tI51;b(^RR)%`r@lIc^MF*0;aj=gkT&*z~$VrMH3M$wgBbLbTH zBB|Z{fVs3U1tJTet(+3zNtj2jkc``ex`=%NH9aD2DMa6LP&U(M$65?j5eB7DgkG_L zOVcy6^~T)WVGyV&;XLmIprE(v?Y1e1OS;(|Kvd%`Lyqi$pw&wcrA<>kvo@|E+}ma+FMD5MO&5BgczbO$?cD0vhVX++4F9e#ov)k8rEKsXA1s^H)~4m z7m7BQ+vno&?t6uNtbYI|lA(io>Gb8F7{<4C3bg;3NMdNO^6Hl{*eH9#_T^a{2tKya zXmVP$YR@?CC?Ra+3@W?F)YA=CvDmX5vl>};(PKOKY8e9c62oPM$S$qnQzG9D@Z^&4 z@7i8siWNb7)EZ66T0o89XZ3^zF9*L3#)g0I;m;WyVL24)WK*WD zTrpa1HI)zNqUhSV2UxnSeF?9>6%(-x0&cSbt;uIr;k>($PTR>M3g}L)eLCM&A9f87 z?w4143kZCR4PkwGe`}JstlYipbxUY2D}2@(w?d*se&7H#9?+_Wlxv$|+w!N9=G-gL zNzkTA4Z9rP+b5+--1=T1R`iwzjTDt&y5z)NrD_=$!@Fu&XAKU9l}{)2L2obqLP#dK zZc19dmf0b6+L?^`6@>m1GrjJB6)Ok4a71mWYya#2V9LHOth&5RlfgnOymm}OrnzFW zrLgxneZm3Ze^f*A!rx1jB*q{QF81n$!6_Wbwag7=SMImWiosAJ;&E zrB-($(hwy@OwfzkqH4tpkcEx>gqO=Jx585;ChiAbz*+=nu+A|qu%uhx&D(O0>Cdje zvswZdPFi`S=O6FzSR~9|bh1KpQw%0q$e{Fr=a3`#3VQa&rY zc5|OU$wHFZY%@>dsL&PuImGil*umaErf2(R1v&iIb#%<|8@W{sR;Xt&z-vkCEdIG&=vQfzW_%rWZH*t z^5Of!W#WDfdBeCI`I=n_GrBo{Ki$3bufiMshDH>k5qe&{SDG7-FnnZv1~!3b zZESoiFRo%G*I?z4x?PSmIQ=bB7k4>Ne|;fC1@}W&OG9%7Xs5?r_2S5UhD!xh?q;TB6kidzFa9(7RnNFpsCOvJZ= zitdW=^Kf%p){u(!_8@%pZ_B&#;pp~sVIX57Rp|qF@IGgufq~D!qE={A-f_M1y94%q zc)cA$QUJoWlFMNH+wT1DIWxb2{`-EJ)HNUDLo-%f{FYZvh1-g~xfW!nyPU68iqRjs z(3Kj`GLHwpyW7o^pCJQiL@5whxxV4Agirwz+;JPALMjqUc>r_4oai`*+2;B8MQl)d z(~~yy^-i&IX=-tw$ldI^e;j}A`E73vs%oy}!NBBCR^2&2DRTMr67m3G39JdZDpF@j zC9qh>qEqg7P%7e^-g}tgpf(XxM(!@Uf*{dzywjjMFE0DeQ|>J*PhyRtYL|>S`Qc6o zJZilIcK68NXD|IFr|hX&s0Eq!4{+g3F)5U8cG=vagcrP;T-xqx|F~KmYf*52a%`x* zv2jP3uslK^7U+;ySa~oY1b+VlNHjh+-~c3nI&NQUx_*;2D-G#1lgjLkV)_~h@&Gyd zz-a5q+ojIk?htQD7KW~V0yv$4|B)Kers`Z`Mt_n%*zpr5hJmrYz% zK3Mv8E(a50TzsLF+e&Vex6PNonkM`L|7FKT(ZROed9i|oR+9>b(>lgmL zfE0q-F91`V5ePg`hPre7Hp0h5Q7U9{Mq%SL^WvC8k57y1s)Rloa*o;12>}6g#ir!d;;+gH>#~jKxYJ0n~4Y?UadIXcP%8`1o#)Z!IZ-*E=?p-A$5dw z*?>h|LMQ>=d_ZS6gMj^a6|L=fQ;>hK`^p*^(W+YDOUFKtI{uiE8xhuw%xPCSnrl^9 zIF1wvWrJq^o#6~YTS=V{WE^9FCNRG6NFi4x`4OAt2YOjBeVHOACygAv=Dq<{dpdeqS02aR!hd)g2|Nd}QbN&n`C8!VxX*rtX{r_}W@YtR5@F3YzNZe|Ps z=HF)iEviwVsOAz&Yw@8*fIF1NMHyJDb3$@U&|h1tE(YC2|2O4-Yci=&r-0JXke}sY zSzp&?)Y`C~(g_KgtX*8r4Sj<~Ndlm$F+CZAtI8M(JT6CCMn&dV6}_BeNceU$|LUQ9 z#w+yM9MLRd4ZAOK`;evv2zIvJ=TNy3>pi>2VEB{3D?3i0R)7QRKHwRCkoq{S1&)6D zn)ZkEgf_~Wo%ufx@8aEsKY)k=3ee|RnqbIS31<}mKbsvF2+=GmQszYi8%N(Deun}X!K8-yty_g6OpOE*pHM;mU6D04_#vh%PlZm zCR6v`yBi7|Bc;@nDb*tkF{{TFoLzr&%i?)}Z}SWR!ln0MR#NG@bGQEMbRCJgs4YuvV~SIVL-xZspm4|sphnDn z;|(x_D4^nbgpW5<;fDI>7=}bpfWzH%Ga=IY%beIt+X``6*}==5r%6T_1jx!+Bu|^K zT4^oowA4#4n%>)uB^LL(_0&7}fT6zuH7s=ygpE;Qu1ynt?Nx0kK(5&Mi|bjt6Bb@} zM;4uz2i!|N+Ffdv!-gGo)_&xIb1c@SJgwv>WNC#<;)O$1x_1|xnZ~y=61Y;DSw$~} z8+JuqPx)ElzNp|5;+F;)cQ@UE>> z>C7Y%xZw)bO4^j_cAxrCJ#X9#cKOKoPG?kcw|9bUT!T%yJ69%YP|`ZkEpdEocb!Hd zuwL9T%JcmvXBj^0;;7ABCLF6k&MCFMI*?o2Lv>sBb@EZbo>k8sDJ02kGlbRFB@EaP1rb$fO_EcA+vE}x#4y4=Z64x$j z2lE$ISaGUKYzh7cv6}2Qn1b0BH6JX;B0hTvH@;|nKM$fubyi26bmkTiVTwwsYrLy{ zWh)qj1jh8-71D60neXZkf&&7{B>*IIMAPC~KfB>G|DRvijsi49ZxU2Ps_tg(9tpc9 zVy>Tf_jX`wrJ}WSI$!9V$K4SZMY(#}C6)~px(lmY43~EdHy#9uG#_A2jbcs)4R=2} z7#zMm3wX#=@7-PDR=ft*0U*rwN#st7P`5*u0^BO z#j_=8zCkgcK&LN%WA#;iiGwtH0|K-@GeFHBG5&qcpp^W0|6roMKF?RWIvMaoLXgu+ z@8?)Nb{pJ~&p}l9zgMuf&(N`PD$id3*lKf14Lj;xY{+f;Ndt-3xU_PGg)p`&^S(cP zTq)s1r73vP=H%4J7^&(lEHELcN-_HG=Iswr!CM#1KS=@<8m2z4P1v}vFWdP@hdt`* zT*wHSIZV>*bEzn=j5xu7VsQo>7lV;~;RNsT9D};C5nF@lUi<4lG$i42zj`(fJ^R{) zn&aT>JesK|{w+aw3K8KQTpj)!b4%^B)>vShGF_;IOrkmOlIt8p69gX?ww=w?PfA|M zJKx1CGkScDgG1_u_}^)!-B#7;I+rjQLR?C&Sx{QiC3Vo;+ZV~{qi=qp4w9ml?X7J= zvht~JC($ro>zg9TP@Z<|H1fR~lwjpDUC2@1Gg}o0&k36723t$+*m~WbTAWSi-%EkO z144I#aXLcsGsjSxiSGq zLFo86B|U|N27W$8{jK4%vx>7b-Xlk+UKlK3C!E>m)z#VCPpW89jB-URk4*{mQChis ziA+=3(eVTO#ut42P4n{mz50!|Bifn!zLl5HAR;YCOKqS?+O%_VW1rgN^xfok+-hq{ zI$Q)Rh9pe{)yj9->a?;$x?@QsY>JGDlEyN9)h_J)nd4SxFqwq+riQ}wi}_^8cHPxm z1(D-P++<25LN+8%v^qo@n--{WQIt5N*R}QPPl~Kqll>lDiT(_Twezsu0d5Ap()dkF zx!#;@E?r<1yL6;8Fs`Q64K_{M^}wMvRpkcu(d;7I2Ki)eai+P-55iq$#vM&lCQYhz2}WK9YHOS41zRMf_Fz4nqG6mRCyD z#GMko#Y$R}CyNLDDp22{%?Urwp1%%?&Z!_)smMH`f;8HNKVg(sVG;5J^14(^#Z%-^ zHv?OqlSEBEMGD>@S)t|E;*TQGH{3u_gXzA&)OsZS*qeOt(Xwlg z8gbwSxFD_(l7bxx>3=igKG~J~?G9?}R+VT?u zhuCDFlY>oIg<=G*e(pwvN07GYlji_*d^h-jm=MSb)<{zg{zi?rxGYaI!5M0<+>8Bh z_dltN+eUx|R25I4CgD%4?W`Cu6-6&{&P1RiNWI;Yk8H3K8RDrNs&K~DF;Es-XLY9= zp8~|ep1VZRsrQYocK3PKWk~7C>@oy*c2dt3VJgD|7R&DibB8LE&B|Qdca{AeUJwOG z9hK4@ZLay94T{$V2h8vMM!3U-O_b+Kiq;;JEX&yKn`n znKvk^>+qkuu|5Mr55=@m0y^n7{-WBp2!3;Ct6mj&XrJ*$3*H6TdbKPnDt!Vw5w1>5XOTp?eJ>$&6I>d6*xQo-CIfPi>TGzN!G`xC}7cKcz?! z|9BZqSm38pO|XNU8ZUn6_J-fd4w-BzEvpHSI%;TW81vN07c(b{6ROWOXqj7!jdhbw zq6?x^*X<7@Em4?C{u(_OM_c%}rmiZw{igD~-st@8gBMW)B!!!ERNV&-Iq0Sm_Z+n1 zG4iYp6xUHoY5SGILaKC_(;y&=?q*}vpq zLu4$6qH?8;Y-&@^S>xm;IMSP2yrdA_ycWSNC+$Vy=AgbIiba8sX1{^u;jtRFLXLKN zLQRi!Ig9S-044ND7(MwKWxOk$Xsf=M?V|HDp}c8%SAF+*OUx@cb;NqpCi}_5iG0E?nr}&yMdsl;^jiq z_S^S+H7rmpI3stUr+n9%*V@7BY5Ctn6OV#ojPC{qLQD@yc4N_a$&tIsp%Y4vdhcN^ zk?m;b)`pn${e4{$>4D)W6fCl!<+-I`ctxDaSrn9$j zP3)R`rJPMJzXqt^c{(fd5YM|vi!ke-RA+X|i||5y5D-WHjwTEXpbS!L1AlTWm0#1^ zi7c8eCRmDiZ83?BV?V|&b@;PH*@vzY}%kc@a3~ zFsfSP?xYe7(zk-uVlk89veL&vyz- z#($(+Gl5MWa$$U^LzK&$H|`Q^&@py??;o{P6aya?2FWUjJKaNH7ykFB>xLN8#s8J}F=wWv+adwlSeoJc0^WN#YeNK@RUDtg1 zg)WM;MU3n|7IJGip)*YkE}t;%8-xGO%ZZBiy%jHlCLT{7pI><&F0Jgn7lK_dO(-V~ zh6Os@DFsQN&@#dGpu0};g)^`r5OX8pWcm5|2Qm?Yq7JU7=0PP%!L(8|v=X92P!RJL zLPIVaW1||1k57GQEH$NDrkC?C-Tb8u??hd%xsKbOetZ-lKQ*eJICkuA4d?iE@wC$( zZu5=DSY$>Z4;=eEE`uzUSLx*bk)J@wHUTqBbkw`8;@U~CP?&;NgS z0$8}1|A($D--QRx1tSc_5H8UP!xeduIry({@6=9r6w0Of+aH za{i56a^%iB;WBxT{vF!;@)biaDNF6(=jz6+I0t zlAHYPQ>g7D;%z>9P*KBiwlg=XXXoBTXJv)au4HmX*5Tutll=OMK^nJQgz-I;S~I7#{R)NS2QD`?qK!S1#yXy#wN z?7y9tz32mUrgf=pVsu!_BFnPh?AcVpr|B+P`7mrPc2heSQzM*o8_aY&2mUZ)FQZgM zD%)J3p6YYZ!~$ley+)i6&muU*X9#MY_3Xs=YO zWh{lYGO3=ZjU93y2c#=ZQVZ3~_DXnfUfq zgnnz;4ooywI`*-uDNmNBo1N>b2p4S#3r#b7%}z=mI{RNXGC_wT>d%>Qyl2VxArchHd&?5u|{5OT!4qcgNmz&%eL~`1+!m60~^TX?rE9{@D zs-py^L}u{Ld{Z;Yi63LfA+Wx#rM)wzpVnPjk<^EiM5CIN_4kIPN`xVwHR7obax>?^ z5RxVP_z2t%HrS0m!e&rVQ(RTOVsg#KpW0cTX4}L+jf08-kVCNbBH-qB6FKTZt`yq8 z7!9ULU`9a6rm!0mWe&Ra%pI|6Wr=7>qU?TL0r;I-Ykp@|5yxeFxH`Jv%cS|ab*lRX z#(&PW*E5k9!MPaMPen|I#-NUx0KWfqH0klRO4f3tCdE^K71!&J1g?rK2qa@dks>aj z6-Hxn7rCEC+pGPJM^x8LmnB(*Z_`RD#D?PTX4qTPg7VnRuWozYI1?*D&D!28QTcrx z2)Tr2`e@lwzSVVOSqCGY9J`O&sKKzD)pqL=|+n;gt_vC4KuvbPZ5Nn~0 zpl45CE4%1!TngsU6g^#0wzTLq!I*3o`S)RQ2bM#+0G)T%Ujm=qj?C$=(AOCR*sjm= z@Lr;=GSgV0`NZh#%<_Uc=-3ydMBQUi`XFC=&a~9{ly&q%*6W{Wh@GVJAW%g{SI4mI zF*B(X=4CLW0hOGYuPD2*hLpiXKqODc(z-F26YYNKCZqY!>3>2=S#SWvEx)yjLD2d^ z{`5+E{SwtH%Ob-dtiB3h<3o*s!)M5t&&u}2#rC2`rNXDBoOR;S*M>oX+IJc@x8KLM zlAPJ2nT7K>Eh6Y2{civ_|jfQ7^E%w1I7AEa-Q^jwhts8tE#Stc*SLGs-4D@ zwK?yfz%pl%07zVF@ZS8eIGyE%@j-0TWlAV}%2zbXq>uTC(>3$KzW1(5JVA%fR1fZ- z2i7N$Tf)};A?4$WFFWp^K>b;x_->s0BEUcuh|nE+LS{oZ&dn(9d^J;iW0xD_z`U^- z8q_R!>^nK8l;>8vW{NvPUt(C0Uli0pfZ^ZNLxQFaB*gg^ZdGCx4N)x^;c-}k&y!zAyvMqZT4z5+|d=bh!?DR3qcAYd&0Qm?16x3%kquZo-8=TmD z@L&uYdh?j?KJr^eku_Yc;Js9bEc^03j%;+;TsA+T&I+cZw(>7u9=_c_l`c~*`PXpx ziV4L@JerJBW%iQHx;j1kz2x1mUj{Er_8&7JPK&j3d^&YUs$YBphWblIDLdW%HeJi0$wZ8-ZAjxq#JZo^l8>uX<>cf7K8qA;7 zSBfv5^tgztep9fe>)SuPcN%!zY?p$$YIR{uBZscZ0au>;1X_-mS@OEL3cRQ^UKC-j zcj`ATzt}2VlPG`pDX}aa&o>NbX*v{;-$q#pzoJmoTTE*pXfI+RqD>6oPU`-l$Ip5L zTcXRLxb;@kjPlFMD~`r|puYjbT#8v3YusK-Gqjo=D`(s>P>e)#a&5_(i6osxD4y+E z#6?*736y7iY2=#a7cN%G#Neet3KsKV4*}QvCQs-heihrsRB+L^NC;m`fX2_}g(c=? z33JVghQW37EJ&YbMSQx?3$7MG7KtuAGU@2H9nN+MAU=bDA{Pi@4_jZ4w97Ojm(hIf z*bWA6q9PKUPik@h8Zwq<(j-K^T!Vjhq=qV)2mVSBKY5gFK`esnl#H!nV9H=3gM_fZ z+H!IpTNZ$|q3aNFw0o&s^n0iebEE)Gz>F@$v$>_qMV5QKT}m&sauR|jWXsET>L$V) zJWV+F!WefEk}**Z9!kUOxDX|ji2v(!_VV!!T?kraEEKggsVsnhvIZe@y=TR}3+k|( z0PHq4DE}BSKUtl+d;TS+*EaZsaKaN0DFQ!2xH-aIB#H60ebrH4{V~wD!lanA`b_(o zf<|>iLimmTE)F=aneR!JBaF`H*Db`30=1WNkrJNTx$pj>r>V=6bO@`@t#j$m=6OK6 zC7=~86K=R9cvxtmOQQ_TEu+zfyEoha3uJyiWOv~&8QyB}Z6HqzMk6)qVWBq2QS6bZB{JU%US;FEm>>SBCpvrB;P%D+110=`H=Ywnwh^!dn39ZW_XlH*8?MpzXl~{WFS?{_rw83$hmU^|j$Uikww7ynE7zoqj z{XP9)W|t4WF(k6rttT~6sVtA{vs)OLyvk9MC!56j)(C$0dP@uASDfO~Pb3mgZM1z4DRSgHCcn5Kj{i@=Qp=ori@+!uzi1TX@ zAFt@0I=VSGBw_J_E*U*yK)u9JV4WON1gTJ%Y3ep#yn24s&|pIxtBeHs#aYD_;y%w4 zWm{Nvz>zwXDR~ZTkQ5D#%vI$>$v=R6Av+U<+ctHdRx8&h4Eu}0xji~FN03cW81LX( zwClkfv+CRkO==P`CfG~&sC|XG=0GZs8OfYsFB_Pe9ppl&Mg82z(Xhot?-W3K!vKKdmD^DfZFA}93(8cab zEY&CGdfJkOz=vej^kD^+1wMKOy(Wo9OEL-Tn*LTNL_J9nJIUnRbAIUPG=+IFJf33A zDlM8XvtNmmr+7AdcymEsRugOBSaE+4j6*L zZS35(9$Q`oX}3%V8Ao zDRO51^2Omk8#v5b5EPS8^~gbJ?=WjPBm@nzpVTQ-8*??`Cp#lPO4u<2m6n>_n&ud8~4AD7JfaV_w4A*XC$4!6&CuS9D_1! z8-D8<9-0!F-}U8dV;V&z%S^P~J(i!H9TyL-A~BCeFJo0!R-7}wH=bt*y`SUleto^3 zO@}KvF~ftUhLGgyRhtK*(5v3chXM{sv-B7&as`HiUP)m*|9%!)-*>j7>Tet$Jpz46 z3g+Hl;_X{Pd(xRicb{vHNpGHX*5LRRpyB+&qdW4fs?$2FrYoJlaw~g*FGGV`1E|9o z`q#6VB2(h{^TR;86Zmpehh{oBTn3JSe22GX z+Q^B=o+HXioWd-N0+eK6I5+H@Y<>}2z}Fa$n89TAS*So%ErpTN2()EG$$buEHB2R> zSc%xYxu;=zML%Dj)ZeW60wgBh2}Uzxu}v3Hy_OH6ZZ;~u+nP%yyKFBuc!73S$tzEq zTI(slYTW9%AYL$C==iPb^-AFb5QETY)2%z+1*C&f^ws8>Ku71Hcp$_RKVbUKjdadS zKw0s8R^}`q15;T;+E;L{wwQyZh_y(Murr82r#(PI4gr3#y7%Z50RNEg4D%Q2{Aa8^ z&7P%Z0ju5s@D!u%#2?tHG4do^l+Zsfu*jg8PN!O03su_7!jqy&AVUg)7Xlox2~ zjU(%1yAuYE6=aZu49Jedo6T;w=Xb`mnv zf>L8Xk#Q3yDQI*un8dWa!Y!%R@W0rU`Eu#@W{aU%k@VON<9xg)hWumFiRf>c3B=hc z@g~v^vodGtfey1)x4@T@O&4V}O7L5-ymhp8f|3F^<{`~ZqE-rCGmgr9qD1auD zBJr1ckdv(kh3CjX+mG|sifoQb6XXC%bpAdgY=AUMtUk?|wHJB79%@hx(mMr??soF^ zMk!BEqdCr)tR^|-$U3RBWtNil@ROVNt^BVDVIPB1l-AmjXW;ml?2LGseje=R=u$M0 ziPvY(lrpGMpw-J~B71mm=D_e^Mls^}JB|;pyFa?F{j(?Qe2{1g|BKf43CQkpppl>C zhvl#wIdcZVYhtF8t#%Ub^85YdRlkl^b*%pS(@rBbxv&gGm2fK4af!l~yM1=^k;P+@ zCwd@O%%fxE1IWUi+7vE-cSUUO;QBjM$gRE3)VJEHJ;B2yu_2QaiYC#X(($MIeghw~ zJ7_%j#C0?r==Np|g7Z#C%~>>B9B%=70|Qb(kYzl3I`qq0;9pheBWr9T{}rvimRE@~ zM($EELmvu9+hn(|Ec+ftwIGW{N5>t?h5ll5y~`+yU%=JV?C!N3gUgAk>HRjoZ7}O= zE6X#e5xqRV`q+QPEv+Ui#Qo>y7G~DH_h0*{gq&L(d2ZdOkrAT?K-iG24rZc}*5F%k zGHLD|3RSg4pwX@ARUR=bF=3%<3U=@;L*Yo8oZv{TRY@`*1 zN2+4fLzef%A$nzNbPR$UJ8LU+wSq?Wk~1hQKcHI)Bvpx}_*mO#40u-${+jDxm`V#V605GWcYEG6L<*VR%!0<(|yPFdj{_BAmOlI33xSc zV@!1Z`df@ebdmPfbLeIz(52qy&*a&M$^$9Ta($O(?<0Po0pXpWmk|{_bUN)wG4K^C z2J4(1_;F(IQvLC&@t(6w`nUNZn6yu5G8@Qv3Et$#|0F=4fK@4!zLsnT)>XG#Ery;B za=(#{d-5+6M71fKv}}^js*(rKs~^??Mu>?+oK~3*S`1uac{@4xRnUFtm>lb!b2J#oDY_?wres9_}>T#E@uhDmy^=i;x3J zHXyAPBE%7p=R|+1IDj1>8CUR_z5zk`>}J#FI1`i{aZmv7da1r%AxE(ArlsDLU|d|9 zcd_Y6TzsrD05=h+&faQc+9#>BrV@9gCB@ z%)71QBbP)%&|BeIi>3ltE|nCKoMdFMfI#Ue@{0}Cwq_YSAK2c%5Q*GSbU>PH>xC3O z&0wN}=81-4PFXt-_aRB^)718W5^@`7xF53*}%>w=4MPEy)tsCmJ!S>o&G2??| zCt+rJevR(+EFqPhXuH3V>$0VlUgZSO_11tRWkuD*_gRPWtff4TJ%8-O}8Vfi`S2T(M|UsQ(WDdW0wRb6j_6Ao5H>#6SFqQ zJPZ`h6dH>4FXoCWrCdqL`>fs*0!6ML60hj2%}0~xFADtI>Gd0Lc*qiTo5I_oLQh#S ze_}+VnCvp;7%>hkU1V84p+p9jH$}?HGX6GR6D40qs}~_m=7SmZ0U&M)`k4N!lLOp7 z%4aYHAt^}k5F8a{GOit$O*B~bLNC$F7A{%uy}5aUHt#6k{ff6pmVv=_7!)JUi&dst z+hr#^avDhX;WTM^$KJHG&3BU;S5V|ngB2GKj^$&PQmU6R3ZZ3((3ohWt!nO~{aE&f z(a7g>rPMzd)w>?w-F)$$TxO%*Yo}sOKwmFX;B|pd;672sbv~yPyZpJ zdlwqW*88&3#MPHs2p&%>PRm5t%a*{vI7v!oV$s%eC9QCZ4r8)P1{ zb3H8zFTueX?U6BM1YE!#b^kb*j7la#J1KEHum;NDjv`L=@%EZE3uk4>UCyH%Wzdj@FZZM}9 z9dkZkT3xcEK~HeTogXKN*8O9|yi<$6f0q=c6`HLqHBl%<`?=)ljSksFe8tlmjp|wG zr7H~RXe9;N4a^kr91@`xxGe`7!IAq279aqn5y;DTVzz*Z1I(bBHxGGWju**4{4)AJ zz_)E0w836s({`Zp!)}NWzzXXVFU6PIGt$SiZH2Yhj5>-TyCCC-+)ucbh64s1^ zAlF~O0qE9KZh9Tq~L#CCg&E^L)e##Uy1Y7U{vohmAuZ-&TG#*&Bm;#ur zJ-HwW^zQB#I{i1z?ruZU%Dd(c*GBB(fd26nfuZa&_bXCsXjqdgG1t%|L;3BEQ4J;di+IA#k=N^1}NnG@oG zUl*IW#6+t(fT=o`gG@rgSOi!w9>81_JcSO?EH5$zdz0AF;l!ovXO=aBBtltfYXF;OPb8ezJCSdmNycHR)DGu4q=1 zkZgD=tkF1FyYEYSbMkx^Hgwvve8i-FO+1w;klMrDCS-S1_IcJ?|W!i9~OJ6V+A^@jgk|hdRB!|$I+P^ zLIvx}0BGNE?cI>sYNjE?kwxjuhKaBx#*b7$ewj+`O(TE~#&lqYp`6KXd>!APAi7tk zLzz%hWc<0(4uP@PoYKQ06=atb9aYxo6PJ}OX@2``*fd~C@UD;C(W_(+CyTB7EcU7oi{82ZTSFrEr9sv}D*+8-BRL zP(R37i{g$=)*O|?NyQeTmv$@#9xsSOH)Ru}D8jO&dETo$1BM^{7c>`E;K__QyjLglH!+Y-W*jD0%=B?}c>{K}kV{jL zT&#w@FYh9vd#GwW*AiMdyh3J>Ck}@*CL&`pCywCsE3&AnkxbuO(JQ`#et|1F7?cPj zz4y26GrO=IJAdxL4;)d+n1BYOp9qOj%4~#28CP4*1gv$%2r>A@F>9V4NG%sE86#oF zeL@rhVsyYNP|V=z5T_U^=a}EHP?9rvSQ3#SZI}Zy1z8D~3R{lD82()6wB@;ho0Mj?Sl8upE$72N=Z3mQ{pcHTAH(^317d z>iJcb!f{zo5ZKN#8<}YTEY};<$drdJ8~E1Tp%!2V(W~g$>_Z=pq!=2u8W zfc0PIB-&(gH~WN|>%9&l3A-8m=Y-8^vfIT1D71Y64(s`j7~*u{IyPC&dD+Ps-I;^< z8oSZp-ntYC@H8-V37B}CTE}TQCift|<3D?x6(YY{=?tT)VlSFwXfM!wutxDzQ3?>~ z#-V`IjxZjAMj4Tm18IgPOnLp713bG6ZTA!(hl?_M2UOPwY33-X5uH15>K(s3E$Bda zjUCOp$xYJ_KMBnBga}S*&SOsr^ZTZ;<{Wl&iRP0)3Jcq))_%yS%*HRlSadEq$zN&g z#~!L5nqW&+Zv+>HO|qL35Ob>9o-itF;THp4%veYnx1m|2ccU_05}G;p0_e!n$o|=F zD+8j4A_Et>3)8MyE_3PFS$C2|)Ha@Eka=*SY42nK5jG|`Wns@=lz)=aoz6#wi8BDG zn|9WyBt8*eisBePfME{6K0Vh(sRaTWZ_D_{Dgc_|!*{g^z1jFQT3G?!RUtHc=Qq%= zP@!oWHGMkC`ns36e}%Jk;NgYgf}tC37>{(RtbQEr$M3pH-aiuxVUas&Dn_03(TB>^ zZ~OAXkr5*Lrv%T*(`IlN)_-ko|9l*E7A8{74ykQ%ed{N5=SETmJc+fS_6f5=kl>YB z?!|Bty2eA4&;gauQnOe{lmpm)&`1MK7!<{djbT*VM5ITp7dqkoPTjNw^p$xS6q^VO z7~x*~b-L8|7b8*56DW(#6TM*AUiG%z1|S>8TXZ^V3TrE)&2uqJ1!1*1AB5R;jE_g| zDfOlKZn)nQ{b?(ayDpw+HuVcek&h^yEyE|BsxX>YhT4OUfGIyVaB&rjtq3VXj0XJb$tbx1Lq1$BUIo8&{8o)gdUzULF! zg}NC8se$H0TIVZzwVL^3x0)yKjkL&&1M~rq7j3%}2y7van!byz{#6rHdi)&Yr&=ZO z%M%d~7T{ynS^bmX+ys3!{|z3JA#eKs;W4oP4=IZD590s->O(wfDAAy_z+o*p2Rtd% zo_mc47QwR8%8p8+FqA$o&wmhM7+dHyJu&DgT)7Y$Rbm?A*XQ?TM{1X%{Sq43vHq)^ zp9%^BJ>DE*hKKSnI}rV-^7B+Ie{TN<=U2@RL(Jq6lT{_#l2cagh#Ob+i_4%H$UBFu z%EJL1%#z>;De#=p>mtJJPetD z=SIP=31d1LcRhQf*2{SRTXMxGX4BV*hKo5OyP!wPm9EPT=w#Bu5!Jy4P|fw;WBq{N zqY#I~+Y8Ri6xPiLRv{h0BJD#^066MIr4hlI#uSln%%sJci)EGSn$U~E(0)2&t3Hqj zBZB%vFe!kb1B4X}2?5x;{Fa5QNk}=~LC_MxWg}5gpcVi0Pd<>rWriT&oSq=qlm*7r z*dc|Ha8Q9z3A_i!1sXSlGAe<@pg>g!TE<(M2(W}ajWwtH)QN^g;INj+sn|Me|=lJ@AoG)3y5jsKuOqIsU-o3@@U4IWLub66C@=L zO0NM!>+#1H`?V2_@|C{NYyruF5J-ySl)Vx`%rj6KMo^jN?^X^1=poV0yuI{jd!7KC(@x0LOFnfXPY8&rh~)cQ-6OAXfxTQunf+U`~@-W zZxd2n6*2Ou)rbLl7zyS7(|X@YjKH@%2C*?>X0qgtLaYu*Lxdc9dkC>ZR2|}AfL+p> zC9;Q@mVoq^cteu%6kdj;@&rkePC`=iZn<26)#t9Zsw|H_+5LUee7wKhcF+HsFTYNj zA6DzDcHOad7k|w^n_rqA@qpmDP+?}!!b?K(Kndkwi)a}r7AdU5D8dYM?>cvVG|fL& zpH>Fm{%$tkwsx~^+eQ2K?rwEQ>5ZD^01kWe*Pwk!+vCgul*s9o#Mu&Jy^7cuaE3eU zh{;(gR7=bjEkPx*1Lst!AUXsasgg4zo>8bOiDR%RU4NCt0!N}I))6BGrBcfoc`Jun z&V<^SYdJf>+E;R>!nUMJh-zYXT!{_96WFiijF2RvV|jCs(S~VjP=OEA>tS|8yUmiu z5-&MzxgRR1!s8XoY4%T&V5aAm)6De=W=OlUafCx?EV4(5;Sfd>RY$BPGFQ@K^<2vs z<@5+estky>KZhp`+mMvQ1c zf1GQHk!x%HhY=8oxzZX(6Z0ssU=6i02SiJ$r1fO8uZ$9AXLG7GGXPqs(%V!rdXq}f zk%I0qG`?leLBbp+yg@D;&OC>Sb=YcRMvD&}sejW!eg7Bbwr@`{0&~hQNuNSb(x*=1 z&+8$jw}AAWwe*^f_msz)NP1`@b(Dx|*-((8pg2eCi(ZIe4vBK{(3f^?Y4h&`=J&OWqL$ZBu4w~II5TGA8M(cp{UwDAD8cl#7C(qF4dcM86zqGT}ZL^r(US2_q_G@#$yj{pmf?pxYVDb%V+Bpnt!4-1!u}#d}%krl+ARRiP_X9(6u?>sD{c zI96w!jgKqKk^DGJf=7(^T&wWYgvNA|RSpswyO#~c)IB^5#oh3m^nMj34KuN`uDj?& znv3Hz@oKxBF1Byi_n3*Xe>*#yFTb?wM}x6mh*o=#N8-Svu&8Z^RGUZ`wMpc!D6>kzkhPS`hE@lD*YP!HT7%m*YcVfmHlpnX232x?X7~< ze8GZhG@4Mq%&+g)tqq46^kp)Hu$!qEolnL%5mL7L%OLxV?p3PNdV6-+Zl|v&6AOAw zxQLy%1+L-3HbOQg$m(llTDM;ouP9SNjlm?om&vnO{kilckv4zczMe!LJwL2hPwgc_ zB2X}$B++&~U2a~}a~OB^W)C?@t%DvR>CfH(RgR@nrn~to3Y6qfAdg~~e91Z95H$zHkbQ7h~-!IZ5zaK6y z-hMQZB~~#NU0z3&YeJ=plvKo67F{l)Px0q8O=n*&|9Jb6iUF-5)(T+bX#VR7e+(ZH z7%4k~_btJ2vy@QHJA%IkH~@vDs-yUT6c@iz|u!Su_u@PQ4Q>NAD^nkXORE zB@(89m`D)NG0T&yyqVcF&H`Q$DG`E3ic(_KAw{eplCiNOqY&vhrHrIjKRzD!g(KRc z8a>zEXu_NbvJB1{ayC_5yBAl6JxIT3;N4888U~ak|6m$U?mP&W@N-9p{eYwR6nc&yAf(tlmJVv=ns$n9IBO) z`V^NcBHdFELJBv#}>{N9gZPr;?hkYu~=hLZJU^IXlNCyWxBE_wU z06vb0hLDMI9Svwsw!m~NHQI{pZk0$VAD|*CFJ51H_Ik?m-RuyQ5e0q3@$8U-7;_*y zdQRucjuXu&PlzFT9y7{;8F%_03vB_Yolrvrvt7E~6}xf)&S<9oe@~MQ$|8d7zGS1L z?uD^_!=Hnlfner9X8^Ko*F!xPc5>oTzNY~v?Znxsct74MrThgVde2sDv=s}q=Nh6D z4l5G#ULQmTdaM`fc>y7%>?IoX9kZm(@gmI-eDxl*jul2Wpa{2EZE8!0WLJYmE&ESXLomje`6B|+>rb7{OO%swky1Z zuA03-?wqt$sFQ<0XIj6&vFSOXs2C`I+vSec z*+JtfbiqEjp+9=Z{}|L6Wynsizwc!LJMuDsZeIqtBTmqxioi+Yh|=_!(&j0s^)#iQ z^#+7Pdkgq9zT3~rvI;>O1EAqAa69#=a`ak7WO5!be;ia&Czf?h54@D@Sv@sF_a6uL z-g$_#oBAlmzYj6N^W^Zw@iICTCV1KDb!rm8P4KLNQuKcK+B{a_S zRtqrgICShSBq~m5Gz~e4+VSvTv=ys1fdF$Kx0U5`0vaDJ=MBKM#o zxO7qZ-_A-n{#p(xs?EA39Rw-Pq;XOEm78kd`^7I{Ny_8@%na{1I__DCe;Ys3wEM2I zf3Jg`YnK^r{Wfd-CigJPzs;DA^R-hcp~7A8j+AOm!*tp`3Zq^r7`r%i%T-6#uG9~8 zlds;O@C+Z(-6O5S9Rv7LHeTn;thK;sucCd8Ir^rBNks(ho00iUf<4Q+fDOwg5Gw-9 zcwajS7?KSP*=f`n(iwwU3w^X5TLX3Ee-O=xA&rX;NYvWTt^DH;ezwWitNQIYaXg); zXK|YgGw=?EVqIJ<^EaO4YSVa{&d@ksROMe9zdm-m+pZPNgGIjc4~Plu{WQ>`hUr+f zMZSgvYUzyyx40C>;RG>_={Pq&oN<_=4rL2SYSd^@fRa8@FJ~YNS_FRbfTx%xe|=T) zISbp>)vA^1dQ;AQl;HfxynYIiH77SDbcw@=q2@6K_Is%88L@LarAA$xHu`|JQfA9rU&+H>IgL)I>25!)LknozPusbAt<+bW_1OLgc z>T0=Z@@1*Q(n`&J& zx2u3NQ+G!T+3k1la2sWIHmx?xg|F1h;%kqXyah#9^6LWZ;c0q(r|8j}z|&=IM{t`V z-8ZkNYYf`9;JR8aeL?Tnf3RA<3!Ka-9z+G+qC)R&+9t3`K(KFzKhin>!EAiuP)r=V z=n)4F0T2|N1zO4Hf8B8A&%>Cc1e$OBd{u!T4!!11C9$bKa4CaFKEWdfr3yclIp6nT zPxa9BDsFrLp$3iw*sDSzwzSP5-(fIl9B#4MY=VT7B0Iw<9L*=SmKobxz6wXzyF$&G+Y$KNsFx4)wh|IBE5=oSG-eJ9t|e-xo0?ERrt`2vE!BQN+V z7Y0Z@X^&tD6fE0OcSMG9eP1+POgIK;)oL}}0AkNo6J)(=4}N(sO(0r|@*3>vj=X|O z|BUv}P+x8Z72cCLku7i9I_u`Ub)Wo5;6}cJiBao?U#j-@nkR1G0N!xulD3yU(0M87 z%71e%$BlZEAHY_vp;5eQqA9LxUq zsp={|hqB~dA-N2j&FbpvdVbX-qkSZ!zg|gxzPq`4`(C@q3!msDy19##%S4j8C~>LK z#zi-~=tEr8?fFz(Z;VUh?vQu=C`=`BcdgU-+rxkL1|AnwkJmcuXUqDoIPtLMwFmyz z=0_go?Tmkl{4?UuoRSIulBpl^wk>wopKksJC)+3`ykqIR1}KbSe#XXI+3V0F`xV7x-9$qJJQ3A^)>k5ao8woYVfpxG2(A5KNvmQBraPAF3)v^66;DS1yj zAp#wE+td7e<*=E^T+$Qds~i$N*~O_fjcJh%G(TO6s#DN=@~Wc#w88-_rbap5JSXTo zB)Iy^&DG~C1#>b|k@BfXjE)is$5v^yJzjr(_#~qpd<16{#%IxEAU#GJoXVjCRM9V2 z|DyPto!P@)K<_-tZT<&VvJ)%G7ae}#dmGRm7%B~c;#EeJKiA;W%0bWtFIP#t&D-J) z4n0RAew{{kyRti|!MJo`zInou!r6f$uXk%_fUwK__YML1LZzdwPAp%JneEFpB%FV| ztn%Bc7rUV&t)GLYwzzbjWcc(bV<2hHA(4OvjTbuc^R!ibKIc_QoPn{1^ib`aQ`sGk z^m@ck=eDD_U9l~91&tpM1&DT{7Z~;HPy9Ww7S|gqv-sER%)~r@Zi}@rltO}8Um*_N zYscZz6%8LM> zxv6mGR8(OP$kz#Oyi%5W5?GMBp-kdjsxR(%WMY6h{<^FxWN6Jb1U{tcZhcvzg9^V4E%)CC0b*(3~q?dE3jq zBG-`Syr+ZEGJLJdQL~= zVUOFYn11##M*g0S>p9p+tW|XfsW7U}?J9(ILMuOqu;m7v{4&iWeoYv^s#i?)FTouz zMu*9h@bK|a->q=bAgodgHty-N^HEy4qMNBKPv9gYvUE7p*GnD=WUT>${OLIcENP0% zQj-PbF08}`Ls-y$AX0yqyI28OXhJe7cV>V@BzEW*{_w(5yTIn&*;mEpw<{cAm(>3V zKz+I1mJr?v=_9MHNP+r$2;ORu1owUl!l#*lAdalE!dv~S5FR>RyQ(M!7L`BLaIF}X z*HS0t5*oXdkg#)N0Q{RaaXk^D`_tR>(;h}%qaM@b7A%|{5j@`xx zt#F!=y^QxIp%q@3)1xixeZ>^>JinsN#Dix&*PB>xroBnvJQXOEecG>~=U6oZZ4c$~ zrR=z0NMVn8A?Uj-fTATeEESv$_;lQ=aLdv*#}$kZI!)d5R$%Rt0RkxgP_<(3Z%HmUSXr1t82o!({4(jl3Wdm)5Q$tFD@_B5zEgP+Z zy=qMZ0N6p}8a7DOLgynC{!->NI2F4ypc7O<12CY*0V>DZ_-3Fc+=-(COa)M^I_F){ z&TgreaPl(Nw1lo!x@Y_^^+UMz_h4nmTOEoXuIvbrqdI@y^mqb7fzJ+zI}6xgc6Jog zs`%8yo+_NcN`z#=fomcNO#n>y?F-I1)Jc-WKi|I{@x@^EPf6d1kUUx7$=!y90!KkXsl@N2YQ2ir8ijgDfU_T z`Q;K>>eNEwNF(i($e=6x4zx@FS^5!K&Ux50f#Q|n?eTY50JRa&-e0gVCJ`w_%I{z? zoa9*+i-WBE%VfYjNfw3D!l-;#wA)j8I~0F=tMJMJd?6%he9P$(vc!rZqyc-Hg*}(` zP|6|fC^3YcQi{PIAB7n#Y@tB5=c;>RzhtbgUsnI^$>iWaWxax1z$7bThf``P3h`zQK|+VBGxN-Ui-0oCkk6ab>g|aBF))TMDcHP_g_X5)Ts2w? zUF2(ie5i^yi$8J4EC77R8!x=TN+q<1&=LFopVhF-O zQafRZR|3gWNh_FWCWjMd{6FdIY()sS#l!_gh}weVLwzevBn&%B$rDOd>s zFh0%L%4%=v-weE}E^C^=oEC27b&v6|-Q-JejIn~~O1|PgHvJ5@Weqc;%T^cfo9Vla z_XY3RPwo<1{+M9Iv`QW==_ZjBNiATxPX2ZE z^Mr>sJOuE<{2UJ;XNUrqBOY2JD*4-Z^txQ;G10|(O5l;*7$t}^9eV0lEbxD3d7hRt zLDJ%WmNB8yf0cV$x~F#6>KGjOYx zU0u~)Bz?C z9NCEI;Gn?FnZn5UDkB7GA&v}vGMx`L3ZyqS;+Le)UoHKoONROqH8nlN#a|*EIMQnB zEH&}f@c#3`f-<#!4Oz~6 zO9na;e~Bb!uU2vb23&$fGNA$yJVt_|uA5yXHi4n0{N)(%yO$a&G2&djz)gU9EYHul zX<&82O<$9DVxqq~1%cO5;1X*cURPQuQgE@95cSbf7tVfs}a;t5ej2M zdmN)28U#XL1U)c~fY@h3bl`O&L{GQ=Pf<`1O1-8eJ;jiiVvvdC5hO0Q+X&8UL~`** zH7;8_%6-hG!Zn1Vt95`Rsvzkf6q2Bo)-*un#kAonc^GunS-*2-gUUWcz;91 zc+?>fQ3RTbj6<`)nPYHM-R;{FK4&Zy*QVBs^p|p7>|m&MyNhPC-S4XU&OPo{mYS!J zGpf?k&d{*ED((CXtGXYafyNKdu-n|a-@Je*)D2 zCdOm7fbIi222hNOu(}KlxA0{?K+1FQ1#F;MCa4(j?(4)O%8G^GAlTEfV3Um_ z3JZ_lKzfK?%JQ#~Uc6QM_&H%z=L80Ld%vQYkLjXby1WS_;-H2hgd)UbSjNT&ABDj6 zD@%M>AnTL zYd1|>zB7Xg@$d(fJ%YWzfrCd_&p;G0ihQfkv!e`zHmER|w(1<$V%;^Tf2CGVYTyMm z*-l&{ytx`wQMpwGgytASUC0cRMX~QnyG7FS!Sbyg?QYfV?^bT@4s`2fQ~!DAmiKit zqvow6S{1wgQ%~y+>Q8p7s`Cu1 zwQBEKz_>YDd$8KdSY!ds#khf7`P2eBC)bExMp4 ze_wR>mfyOs-urrCbVa^Z84rQjMBw3K{okE!5U2(b)_2x3)o!(^7H+TnZC|Y6STpg* zQh@^!$f2qE!B|(gRwI&OkmGvjX}47d;a05I5w=`I_d8_RX1gvorMIY2%lKAm7ii|V zUR|GG#9#^u9kz2}e{Z{@77V(ziPh9gZ^>N~xq1RVU7U?HX# zT;yb*{O(fU_$6X4m=)MCOsx9g*!4N*bS+O*jle}2VK6XAKQH)HG%>I%9Ufj^yWhFZ zZ9#dO{WaVXhn>aWo7zB&Au}cLP)!5zu|LkcYHm}O$^76~e|VArc^x#o{+0J9Y&*Cy z3x{&Xt!`u6+B|-!mgUlaWg)}cqjOZQ+Q3U2>LyKdo;GcNjN|dx6G!;Ou(51g%fjUB z?Wp}GsZZ;oZ`}d8A|NRGK^hKNE-PaM$dqSO*xnu39j90>VQ`}_NihM1TMd*|y;$#; zWjC1=#))+~e{^6vkubA{v16U~&uS7qHZ04N;o>^q`9F${!EyT%K7jtLe}d)9g2}}R zCpn-jHKlH0OnTqBJ*y~(>U>uXRn;;uidYEJnUAkgZB3-mH$25!0=R{mtZ6g!O{ImbD^w`QE@(uF6S`shdSm(3N9ML z>7i^pFj6#%1tMZdhUPXX381{~;3FNGr|Kr9GNYT+y9JaZ>t53~*FhV5TRytQc3mvW z?m8Sv3D$@L>_L5ou=c7>X5sJVSN{W4L2(9`u~q>S0Wp(-B@+ZOI5;ztf!`{B+m72d z5Pi>A_$@N9=1LSrNkuP6fTT?kpaJSWb&Hg?X9b z;hC8;Bm0ZP!e4y<%D;HNUB9}0Fa1TzQpx3FyVD1Q5%M71UNFfr(Cw`*M&7nV-0w+ckaf+&DN3issy<$h(;)%sI5b3+k)Xhf`TaR>PN$h8z--@-oy=A>7O83uoiJp4Q1}vbV!^_Y{||J39*^aI#%wNF zFbElBxEzpyF(7k&0g*BZ=D6D)_4a;!KFtM}0O({dd4oD*Z?jzS#MAq#)^rF37LUB` zaus+Af-1*BPK#|dV?qKLa(<2BWpD>9jH8S5L7_ReQ1?qTgk~5%&K!t%(6v}Wsxc8E z@BvFBn|66D> z$N+A_0lbz%u&sE^;xr_qB#Yp%0O0yioN`_0av5^3#d87=)y4w!-T9#~D_NUWr9yz? z$WTL`wYcF-D|de6H(Jx=9lmDA1{Q-Ehhc|pZ7$HnIO2w!wdq>B@u<%z=}f|c*4aAOH=Wji_rn{!o?RFBo{-D&-fU85?=Ut;9Z5OG7NXl_yiI-KHTuC|SDSo-HwH?D;GHdKhH-j-utTq@OlF(hLG5y!J0kY9 zYBJrlG^t9nDoG2z{qvM7!yqs*qzx}OP;+)}13hcK>$aHacRrVW4o+y4hZ0;Azobb> zc+%5tH9Ei3DT!Dj(;$djQSSrL+ z_@`3$PLI*)iQ&*Ip9_E>@Q#LiZBV%9BV^O0a$upzb4t>_CiHpt)uiY@QT$ifC;%^T z;D;odICm9cO%3dm<5K`Ln(3~hi$+WWpHD7Y?(LR;uUGU$=PwbQL1O@A!&}++`!3I? zk{F6Nw1f<127h#o9X)C&$7XcYwr0A`X6Kx%$~}MHC_cCAmvU2e<&G)+#acsm6Gq>4 z@UJ440)I@v{GsY2+ND2SO~CyfkqUUVMJ~nx27%x`-M3H;fR$r7`)7#uHY>1HqTuXq z=Q-hjdL>-61;uQFxTw0mCR|4;=0~nuonve!DS=9%1v5~IH9`j5d#ksqGuh*$4D@Dd z%)!A>vtR;bMANd#9+ty8wh)kCB=cZ!vfIn5T+O)!FO-!EdX|G}HHNg(BVM(o6Q+4~ zKYHoXttxYyfIT~5pJsEdKouQzT{f@mn^JFobN5V_9TMgagm2YzZW^72Fa=Y#7k|c5aAfxj}Pfmt<&eMP3FY`&%A3LEg7dbe8 zrg$=96|KCUFxAcx8kH&(M1Wtvh^|I9%rX^yNIJaW3OAs_-CNk$S_D3Pq+HN7%70V^ zZQhi-z!L9AMFr6=kAPl%JAsh<$#lkTdu?{igbcFL{pGLQy3oq-cU`Rq({h|mHw z+#@WUe_VuiB`C1#_Mt;Wzcc8R2lU)?58NgeUD_j9F7Gek!*q0lw1KZ-r{NM?*$`(+r}< z%-S(h>U8}z-5^{iM^`RiwL*UDxwXABD!}Yc$`L4-5mUw&vp4=K_vyUIOCZ<5(dl}u3*Ns%8( z#ld3`2YAlLscvgwkp7PzB$ID|>L29p;T_OEYf?B-=N`{SOa+0@WfZMUk@jWse-03fm6XWU%#*Q(1qA zQz`DFL?z+FY38s$jWilYdnRVD1yIJ0{(Dc&;bX6WY+0 zpXlpk%Zgaqu5ZeEPx2$o3@D?{!uQAfNJ|}#{wDCJV*(wjCG1%u{j)!ZCM)+L*4p-9 zOdyWT=8wi{f500YdqcKFeOfk9;itC48-1cLGCPgzGjTV_Jq=7Ji`YGFZe=M_k{%>T zWE>8tQGbzK&WHH}x*8J62}u(8oXOyUT@NNQu*91P_axb1b}>js`z7Qq$TXA>q@bn$Tf>g{3b2S-;^KNE4DEZef~9=mCvEryAVc<7ol z`B%#(8;F0RFIUqi9=R6Tu=895&^ojZ*m@i%-hbwmv1M^nM&1 zCvRXF`S3%IU!yb&l)Zgt;uVg?B92uMDUea-B;yAqB`06WOgw)mT=bn%ey_ypoNg0AOM2CA7>wixtcOk_sJU^xu&yM zFp}DcRO=gfK>m1RP(=44?2bFCX0TQ-0((7gwNj9Z7o9x*;0bucw(^O~gn#Tf8-D=4 z(G~ktT*OQx5vs2J)kv%9?q&c+3MH!I;=6Q_QIQIBt)@pgbcT&H6AAHodOXpGEgx-P zKYxgo@kuw)3epv%I*f3HKV({EecHhBsDZm9cg1y(lKYY-DDCy1Fkhr5{5Xw!PUlks zqn8~95QQO)yb;KAk|Jb;{UNG7D1XCe-L;S6OVAP#P(%{`mH8Ri@(!_O>Jg8duD7U6 zoG%xq3ypTZ7^<-CF>=2 z%80x}rCPwY+aMsH2T_^}I_U79zBWMevBZ>xBZPz6j^60VG|VwIgWQHGOT{1G+ngnRhI`q#KNDR}J%A z!_|UoSy(#n9aZ%hbRda+2CLMegw=872WvVEK= zrQxR=u1*F3EVo-j5{_$I_U&#=azUw<>IcWZGXU?0Nmwnxc7I$1zHf=4qha|hlE8#(v7IXCtf0cj(zR5bDj&Fr;+M+=;?ig=LZQFzv^Fb8mw<7A5ve_l*0&OV zZ!};>(+myj78(G#pP|if-q1WH-T9RRr`^aayZNMYpw2`x@+fMPB(_c|t&RrUqQfni zt5LCi|4!^ugmu1PS~@MLi#DjZW*Dq*nK%k_ z8ITk{3PC1?8HHuagv0=ZYWq8%7j*`>{?i%#0X{j~VM@W$45uN>Ouh=lp>KC^fEgYC zF&rtJiuIuiJ2P!A)qZUDWXna8E+`XGbW%|B(YAKJm49_}M!k;OSm*+bo(r9G)c&^f zWdc`--Na4tdM9c$L8}GF*s!Skk%@iR(CFD)f9mHeYAnYDH@W37xW{%*0N;?Dg$Csc zV-nvEz))%rNLsUxkC8h@gKs(6GHaL?vPgj+v@>!sVN8rNSvOUpxZw0ZcqhGK$kXK> z%G;xIVSm)psj%?5SvOzM4lQllw-_pb5B2Rvi59WSS2zCOi~ErnvcQNUgFJ$#h%`q_ ziUjuYO!8I~eA_g^iszf1lQw$&=5`YZ8m-LN&_`|bQTzI2uh-}9_YZeJ-eF%72QpAn zi##(Bnz1lx5geMk?|+Dc3MK)#AdK?h$+I?rgnw3D`d+;b{&x3QdPm;aCNUz1!UEbN zkr(FmCNeLX$Q^f7D?|eDa^=HjW1v(nMa{@BELWSTM8rk*pSf1Lb*=SL&~NEr#bfKa z(At~^-D7T&SDmK5H}wihKk#YKdC*^$-M5;jBFYXE+$sX#ZCe+xsZzS zKjWvfUl9MVb}%YgKg;bny;LI8Uo{7$KVc^aY>v4B&6RHYCEfn7dEj+AssE`?SGgdD zi-Hw0fx=0BF&C&S0Wy&h6SwX>0bC4|f#wspT}c6G4FNN^##RB5 z43p4O3j;AQIg>#O4Jg_UxOYV#($w98 zrEy_9!}jm@@z_qS#EzB3!+;n^()o@=QRGKTN{Z@&OEEjbFU8`xCOoT)QCv#+m5OI{ zDppTUbHP(xW~*nH)#}9+l1WO{6_hi%8t__!tI=NLSy9i?5r5l@%#MWcCMyQk2q;=o zK#K|rHZEEz)iOz%9H~j80BbP}#LXs;RuoL292^ys2t!jbkrahW;xfLjkTYd*90FrP zC@|3^ppf!J1G&h- zS{MbanL?kDP526oh_yr%ieVC@WNT3rvbA7{MAm{KOzFvHg64@5dM>uWP+F{5GAJWf z$gKnm2~tsj9;jFgWMjOyNekux4J6D8FEEXW4wSH_F@KebGCo$bADdW)0(D#_467V% zG4K_eev7r3g4kMY^4VHY31ltRrhyg-CJ}nZIzb|9!NjQA=+=9*7K|4Ynnj(Ob*t&c zbgwqv*lZJ0EU!j%m?45jRB{dzjrg*VwVV{{Rm$T($cysk(Io5wXzx;hNd_S9ioX+0` z_+)rL{CD_ac>a#Y%4B#wJzKhWuqIFD8d`jS(MYOZ;j)yAFIs_n=1xxB@Wu`QnZ2F4 z;f4EVwp^ZGET7J=E~ZaWemZ?}`sK^F?z`_M_540nqWqQR9y@)4S$6n#y- zB3+z+S{_fPDC&(;)*?k{CmPq>OQcg9{D^we=z}dCRi9x?RK>%tK!jdX?v!cq*XM1C zUbuHD*)Xr&@W226g3j0*BWJ7uoc{9a;^O^&tc+OI?9F{T!3E&h2~OFAVf(nb$mADZA1kZ5;vv?${HxPSx zHJ_cmnZiij@an}&H@uzxxpePayMJ~1>wk1IJjd*&m&=7|)jl`tUd*oMXVb+PW5=eS zrXSBwzn}f-Mt@L5uv{4y{_1p&ZxKZ53OBma0;5_+V6wbFj;kT6kFLey1w1cRJ=917 zHjpkyJ9~0|`Dr@8>1sLlyIPB_o+APZlNXM6gUz_eLQoG_Ky(qg4kD(vyx>kSa(@XQ zVRndp9@)eJnH3VUqB0q z1jKVdW)_6dVtG*Uht#}b2MO#!f%_c3&np`j-|wQxPE$EZ9tGK>9OjE7`1@)yjlUOu zu)pU~mbB(Q%e=>D3F{{vlMfi7R)5Scu;hePPy);}TZ&pd^39!;@ag>5tNGN&<0Sx+ z#(-~@YQBtQ*NZ6a*VlkQwP+ z3OS+_QY=fueu^LsQvL{n&d9XF&w3sT=|eQWk9bV(=m61K>52Vef*#QTo7^x>88JV1*dG zk0To@YuK+L$%YE|@@ktCZBt>g&86<3(uRE-D&68pz%V{-DorAnO@QzyDy_Fur`ne~ zX}CqDbw!nSpm0pe#&4^0)%{7@HrT=fWB9%4Un_F-cKWtANq=j^h}Z`a^?@Tr z3yqyUE8?jr;;Dc#=>Rx@-4kP{1)k+{XoBl)nFT7MUT}g6b0?SsLSgv_z~C&eWq-2R zWNuA@xXoSrv&DuLx9QSO@MI@nHsrfSWH%{pdq>)EWJ`)}!?~Jx(?*Exc(p&OJU)w7xs^rR^~?jkL;4fJ z7HcP7b~{;lypXvYtmKp3%7ODrPKSEN?igUfM>!tAZVas=eHQKm+bKxa+Szld@cz58 z$P9c{?3|J3mVb0WadxmbUK3$@ocbueG1PYN)@SJZY`ZaM_#UTCcp$rRP3b=Nj2@sb zy^ceG=|&ukE@=~O>>BdxiM-wHUeCbp95;j7MQ7A&c?7lmD91^1%W)DtaQkWZpC*f4 ze~!--j=2quift#n8jAK7rZ+cvW{wnM*Adb3$;EW}S;A8Tz9P(Uv35)`118)oL0!5Mn zyEXFQI7%wiwY;*t+y480XQZ(;jxMyLbb-c0Qiq(6=fd+HPLn1VT+-}BU5&0Qbze)c++$2SSFWMTveB=b=eic&woi>DH;9j zB1J|6@8M8f!lHOFp%Kxjd6EjbC}JawhRrJCqOy%B8repYi-~Lm3#Mcv*g%dpf|WCN zn6NEuCE{HWE~1kJL=>W-XGgJ051m*b12vG?#ws~V1cVhbS#1O|HQ0zc4vcrzg&A^yb|V!uU=zwVQk+PP z6O$8#_HztQatLTdm_lqiIjMk=p-_zs3&iY{puZepCMKIz(JjT?X%hl6f40-U@5WPm|_J=kI+Fj7?cRx zXEBs)!nOfZp=3i~BgI|=M}g)t^lX1@0)Dq`CtKMNWVm2f=(9pu=Eb?fT;>BMn7QCo zCD<@#mH=%;7_dZxpnm}k0|u=XvG*i$1?rugoJ_h`?kvH@gM00|fBpMs_&NKGNJ?D2 zIlkA{H{a|Rrs54kldu-?0VdijOo2S%^-9SX_|g8AOZE!ifirn22Vf8d9}zCl zjc0uT<8*$tbSEdSJB51@9KD}*ilBfit=hQ{!l47HJV+s;2!BV$sv{Q9!yG%Q;xGpQ znFld!jcHf_9>y|=MO#gVjvWC*2SJa>?rgnNbSKdk?H${;ZQD-Awrv~#I325F+qP|X zY}@JBU(Pw>yD#^S+Et@osvh@VW34%VlQ&@Nvn|b_E1h90{leeZ?YyIPVJG$4Uee*a zEoVRcUSUD{8Q-0=TYH;}H<`(AzB^}o$^jE|A@d9CGW?7ClZp4+{i~CgHF{jPVV<|^ z*f+4<@hN#T4B)P^&c^a6F%q#qh#_M;fsi6J_tw{C@G|3*_!5cg)a$6mSeG+$>Ou_} z!uoC)o;l!?_eg=IiBEe0Y-E`1pGjT9A-UlSDFc+z`Z`h~c>R==P#B}jWU|+(L1OPH z<#4|qKt1StnLdxtVkjT1+1!P+g5MSArfKKqk6N$`4xA^rB8+=MR8A>q6<;5H+yCtft%Afl`tw&oh^biWMaaViC=Yi=$qJ&;dE5aJq)OW4n%E+MpaF{!jeE3bC%+G z3nGgU0^Dlj5R(6VLy9l2;d<4&HfHkNajgx$vmY06y|f#(L1{{ zgFp3U+oPLfz+gaU&sfSh=U@M^Vf=RYuifgIDqd=gm1-~`0&H(7X=*D?U`Akzp+o>5 zSzP$IA(0e=k*Eoe6%Bk^@lovPy8wIdFeZW)1Z64Uw=mnhB-6S;_o0a~l_%!}ICB)xo8l*2BTz>PnT$6KhAKGq6vE3UXk~k4IUK$dShrBBB8W6%J3!ro`tApsf zRU9?W)*FXgkEe~tBUjYSqay7M=&=$yC;-kxRhRL~uFiX?QlC--Zg5>TXq@8VKI|!> z^uGk_LPsfq!xm>7F<*~Vnap;NLW*?_$rzNo-2i zDalvsBXz6Q)8|^tv*^2B%RyVKRXI)m|Ck$@^N|_{RcX_T^X7rdjaBFPY0bT5Jpp)k zXn``zBF}k|Z!oMkppWSPn6bwpBAZ~~M0%j>!a($PSJOPyDMyW;&Qc3$r2NE)d4&#w z9;VzFn`-0J#^ogpK(PO{6h${lzm3V1k{0PC&dy(*`=3Lvh&^c)tO<`c47%}R*;->roI`C= z!C70l=_l3U*wM$(+C=QOH7l*wL{<318x17ks*R4_Wt?jul~}KI#WW~3`t{hN#7e-G zMQ{loZGcH|7uluu7cvnV09YX{H2e{*UQ|exUK*wTyr}L^+62+=t%@xRutcglcxqj` z2Ph^=)*;(fhceCre7^TS((s@KNRALv@`z%~4hWzxKHlDh*V04R5u4<+TA&Y@J-q@XzHt& zGAQ_HUxh=jSpx*46l*ZSF^*RCzToKJQ!S3TX-GUE&$LtnE= zU%UhQd!1xKT}157Dlkc@c1n$EZCHEup~QxLh|D|h?i(k=+1FjXY$Lu1_{(O-2xMTIoYxYj1=Bbm20C*{%_I}Cub7UPfg@80bC08Q!D)^&z7Czzw2jH7HYBQX4zlf;GriVK!vf$__r+AaGkXg4pfL3X#Vi6>Hm zrVVx#11JR;GY?D?O9(7_6-R%mV-nl={{8t0zWX<>uQpB10HRjTPHw81K$@w+#BDMt zfq2|#Ye%ni_&dMZrhqxL$>X>zV_?ZAwlG``H-w-Q9X+=V@GJYX)?87>!i$^&pCEB0y`ttO*4> z(0!CM#X{x)NaB-O?25Td`rjM&=+_B%^sJFVo(kmOuO45}`RIOR$C%iF;Mc-pEEL$i zxH3%uT_}=~OY#y|qLFv1?#|&^6h_Wle^BPFfB!({aH6EqIYk`8=@BmW^OK1#3iyN& zqR!DE7_78w)%v5*o?~NRDrgIt5%a&&KtUJB+3Pd}f(zE<2>fNT0N}L>Nq4dcqb{>M zM*opMKUQN|$`F&&=IHFzF-cQebJ1V9m!gmW)*=8;&E9ELc-MCP()(iNe>WDm`y&$hQDD*k6>-Ip{228K`>4f%6nzr?{ zp=vYQfVwoZ%6d~JdyfMMG>)jKiP$xu#XSh8jHzSj_wTXJq24uiL!swv{PES0OxJ7x zrP{oynNsi(HFD^qd(3@}qX-&>p_l$=1kB~%wL;s`n&2&G6{;wxgJaDOft0mlZdWa(0Vjb#ftgG3eJPNgK_`Jw0Xf-4Y*Fu(qR=Bmw#>lB z1-QlGitbFqB@G<(nn{r6{6KUB$4qvBhP`T0t3A^)ZEKZ1N^6rlkt-3l^tdrLc1N$o zI=iK?95_$w@ZSz<+DgC=q#XH#Tkp9J)gfxd)shq$EFvhXx^O zUC^N8LyZG#ur2pP$IlZtNvqxQSfDhHDB$%ZoSa%rYIHBz!Uw)4xi(pF@YgS4A z?T$*qoQ6~`AA=%jbgO@l&|e7+7D@G&*wZfJ`~Cd#nbiWVN(RRi&R$)t|LyH^!2-v2 z_h=UDe4nbVS*2E~R4b&O2vGo#_308qDuI_kQjdnX7jQ;|{`=8~OZKPjK0EmL-#@Nc zWJZp3WLAvNcj!2*yn z%OR|IG3caA;tKdsq{?vB=jMFTV#Dl+oEmTMB5yt2yK9Fwd{4#3&ZllbMj!KB4|x`ca_awmxJ!z+dC+Lj~KApNa@w z`@nJgN)c&+Z9~xXg_LJKo=nMXapU2F_Yds0AQp_bDC6seqi87AW|`LxG|}*}r5Zql z^KwA#Re|_)pKQl<=m`O%^2YCA*qQs!$9yyq_w#QE9-o9H!7})Oy$Lu*msukP!3h2@ zu%{6XTrX$gFE(N+F8ASw8T4QU2bEJJsUR6u*#i@}IB2Qqa$h0}FI~z;zOBmH2QDmV zH6VtGUg-)yHpgxhzw#VigJ4>XcfS+P?^Kvqxas-xoB`Fq1;V*su}$lCr##C6G8EF4B>Xc zMMqny{smnR1VZ?8Mdlp#3-YQo`P#KS=>pz zmhK#x%)rU`yq*j}`+fh4XRxAP++aPH#WTEFJ*4g2hHyX1u*Ye1#ZH>;s7;WnzoGh! zeX0-3;lZ9wEqOW7^6w)jyH(EeMX0fnS1^F`Vj)awd8xEMm~y}8%qRli6(4-ny4gtq zqt*^UK%)c{+w!|(n}@gGEo)#*+DYdX8$)4#r+Tugj$iP0e}LoE(@0Ui3Oo@=w4uUUG(z97+t2YmgULi?}y06~^X zV3^DK>0t@FW8U=BSloT>cXbT{k1H}}dxn32rp|`WYb#uV&w521S7I54e~ZGuWP+C( zX%y_OA>ANjYx!|@S}S!ImY)hBI8TCjPQ zl;p#;ucb0qz*KPFYsJZIK}%vU$q^x(G>bXav`PIS&JH>nCHNH)eWzeJ^EcHA<~RTV z5|^(=sDbW|Ri}nEO@#J$p`R{c9G1X=WY!?YF&K@6fnJEK_To)^%?&@a$Ix1QN_VYx zH0&*(6VY#T0(KQh?-7Wr-;?e~i3iVgH%+@Rrh2;o%uc*KO#Lp6hS2xJb@q~2_8Pt5 z@65ZE22Te;to9byXF?*mP?n1%t~Fx7ND)~y|A!nZo>Y?!y4Bw`hs*%sz(3J9+GZgt zM;fO+S%xJreRjCE*@K7y$VWt|D9ntBh{d1#;PMX?#PC5xj1~T$-(U zmRe4ye*@M)$>csm*k*O#iKADJ*liPAdS*NdPunDkQX?%F*#GI;-}?r^zcb5fJ?K@c zT9V=;OE(unz;O?*?~J_RV!g;)RCXb;OOc7!MMo@t{cc^wEb6M+uZ6{Aa`shkHX#IZ z(sp%j4k!=5in{havCr?2ov}JG+Ws} znynwbbk9vKl5=8U8ajDoBFJI9WUCY`7}c^+USl9Y!_hBiPS}T04}u~x?{@0- zC~?H{J-*&_C6q03>4yb1<6H+$4ME*XnhLRE6?{8;(sZ+eIkO@)hIy9t%O47tcenP5 z6~Xs(oF4yjoAO-?FMo z-Riok8;4_An?mHM7%(4sB3-#3gKBAEpJ~DxHD!DxUxixE#<9Ul!^ypzy4X=|E-fn3 z#hG$-eDLrDfmJvUd=-M!BZ3C{&j-ecZhAz|nmmawqIW8x<1QquvWN5u4JlKSQBklv za}eM4eQLgg%1gj_M>a4n5Wq5Al*|3@ed`MZA*rIZ?sQ@oTf#or;)A00x%FxoYr+J2 z!evkq=&|YDa+mzzjDf(&$30#ryLO`uG&J&#k;vIIZ^s(l^GoK&d3#n`PzxL%F?#J; z_$cn!=(tHs+hHI##$iDrZT)bcux7y*IKB^?sDX~<*teUe5i2{*44`G(vlOmkqyMiL zhtQguYr$d52@I;EPjXi`l7)7Uq+{1^r5Tu6nS8#=F?_E5fQJ5Hbio=PaS)S_sGPTz zH|6lcIc_du*lGg-Q2^*m8Akr7pP!LTcTyy(Xv_$BXmS087K%sov{D0sxSw@{;}GpT zbS03^D{!K>4gnhc7!YN{w}~)9@CG{nHJ^|hNM+#MQQEGkc7z!~WMKG{Z$6e1f2h^d z)#9W)@%vF`?bmfn6Ox%#a*Y@SAGxqmN@DMBU=0-zdVCY-ZTua-x@bWTWLbIBKvf@Q zBr6-1H67?YS8v2*)f^Inp;lxSon{^)RD&V7zGX;TJHQu*wdj*RU zP;H9_Tzo7^^%c(--gCrzy@z*&FB=mPJ(+H~CfqUOD=NOx8x@mF-$;s1?%8iXN?{0| z9;teK4Tjqy)B}D`PtoIjr(O~=^DyOc)-Mzr)L1!{?Qgk`;XqA|xK?sox_$K%cX+g_ zMg8QC$QKbA3pn1OBAPdh+CAPJjQ9egN7Qbn3ubh5tDs3xU7zhVx*;Nt@@c&C?yQj( z(2QqKK{7IdUED-@6LHzyk1B%|BURY9KFd!f#uN@NkAm*^ua{IU5?2HI=uZ%_M8i*% zy3409Je0NE?c_R~^UyTRbE@DzFTzQgZ>~P{B2Ii50I0{`%7?pA1nTWXlO96IbjFL) z5~H3izLH9t3XzWScI*Ml$n^H4DpnVD7OmsHf1TjxF|rWui<{vbhz~E==;pl8PgaG< zoA8P5-y_51-U9>dnol7|X4sAWy^w#Ijx@<~nJg5*n9t2$c~PsD^kk+h7cB&uLzx

4y^JO3~WS%_{g^2uquISk)%i) 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 IB}Gq03IP}4g#Z8m delta 133349 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

sEv(~ zxx#Cg86NJCJipT=D~v*qQ>(=dpdUDWa?>j~tcgRpunhomoTX1|Ed8-FrPO$gg*XF1 zbB>=l^xS*?4`Avi(h6m6WOHHOV_}2%w^SrtHaDD5uMLMB!mTmj^=rHFlmeeJo z499r?MH5Nj!6G45tGWW0?~-cX|Bfq{J z0`fo;=#Z2t-o5RvsMED;=RxbDFI(*TIFwg{{K@pN0t6*K3^6^9c)fW)uag)RjBq&9 z^BGMC7@ZiAoL{4I3ZL93o}A8R<7bDCzcW9m7j5k3r!iHuSGwu*h&>zVUto%mMwdU% z1T0hdJoYkw9TNx&TwIJ_Zz8`p)A_AmLJ;v)jIi>R0pIY;3^Rg_h}K3}0GXWMXc&`Y zS|UMw!JyR~xuS>D9^m1$?LG8uc|9ys0j{|-1)1Y#mP`^sg)RA2)Xgz$eqK5W$TW|p zhGy$?l9zx8pV~ZjGnuZj1|(pzqx_Q=8#UJMsuTHtUve-noBzSAuzQ@(lT_p|rXq)8 zOjMpELEv9pRPWhfC(~|TjatH?*O3p-b?jgMEGvJ0ua(R05iahjGc{>nhJtvmFsVB? zse93rsZ-DdE~jMbk`fWtI`fz*91s`jM@Y4WkUCk{&2FwPe3LZeOO<5`;W_Jlx+;?_ z)#NmPjvou%EHm?rzUm};BzI;K9EGU3`aCCZmV~i7R(={=#3v%4{kg-bgWw$a3z!Wg zqV#bT4}`>(^_iq|*28F5hwb>V+a{}|M6knM=0MV>o*KVE1F;;)_bEvg_({?yq*D!a z+8vvt!e5W^?=BZR?i`D|{nvEJB#5doqt)lB$Pv|MQ9WMwP z%(@gjbZ!xzYDPUr;qe2UTlBoc<~ByDGgnI$*fT4FCJB%5Ahac=1t5h})hkfbvuzxu zW1EuTHXCo4X639sg@n;sAl1Pj*D}<9CM7{-RV8Al4R6%vc!V}!^r-xIeG3^}>olOZ zkV8nQQ*9vr@VrxM4PN6k)!u4N0&yGdhn6}g*m29K&5KQ3R84%NhL7snlDQ#-DZ7|) z7VCBVDyrf~rqo>(Y(UGBa%0taxT$=Yy2!fYZyM_wuY;Jitvbky_zTyS#RyD)vx&Ws zPSk1F#DYT)n@!U7t~q#bVm4&@6&m8R97E;FTgli>yo&b944Bs#5VW-`hDK3FWrAVn zP5&+`y2^+hRQIZXsX}+Af9Z6PQ7b^96=3D6A)P!*pJEk#0yvSaa#XJ60_r|#JR&UwXN{Uxkh@SQdKb%T}d zJibtQ<$rOWU98G88TrpU1=?GBzMpX3XMOhkZND0=d=8=fX=`+X>hWTK75TSJZelDR za+gDLMJxMGrz}p@at2&~yayJ>?T@DozyVJh9{|~CRAYTp>_)Sp02CtJkVEmOH;o(0 zj6))t?=(8}Xa-lhcA!$;Jg$>o3CY5C9~VEL`1r?($AspsMpcLw^W)OQ)qobt${S6sRey;lHGTnw@V8W?f0?{Zk9tN$2(ht)4xby%mR%D<}# zTpae~Yzhw}r=m6OEKYs&J9=hCnok z1j#R|M6GZZ00|F(!<};F@M@iH5mEs1(vS^FO}P%IF{M5~AhMgGKkXsq*N`c$s-e2x ziDk}mpI6s6DpIk3-CN!96#Itv@_*5f}sTVq; zcVCi#tatZqE_8gidlKK^mO=EcTLzbB_e4rK%8~t*f5t_SXy|qVIBdr4cr>8r-|%t* zZ?0sVHmh@Q9=wd5!usfwB$8@O$^!ysd*z4^x;Z!U=M*5)+#&V)R1XTn~7hL1U%B}WP&mPvM^ zMDV^FBx#QA5rB=9T}q|pkE_yL5Do$FZoeRHB@`3^pFtq>NIN$F^X|j{0X?%B36t47C<8b)Fqcu?0VsdHT3L_WHWGgK zujoe&Frr0L7X##BW5k<1k_GI^28(2|(5ThZg4I$-hi7Jged-`}jXa0f-j`{zcooUw zS6`JT*xl@c-Jf3ttKaXgUcG*+qMZ>YR`KrYu#;MgBu;m6lnAAx-PL~gtM^mW7Z-l0 zw0CSSRO;PcLM@EEvPOTY^7^A~&a=*zvO25oyRzdB+4Y4F<7n_l{8QK&>Y{|f?Zv;Z z{`x8qMuAp=hz$Gztv>7?i2erphGwR(3Q*4&I+3QN08RFZ9j~^lA|cf{x-EVm%C_k2 z7FhS|Hmh^g`N-l!(@wjdFSXLlS6T@jtDP^UFp)dTvU-Vr(g=SQ>T!2X-SzE|_f0D< z{76RL73;8CI!U0IxKZcQ2c5I3;+~87qd>%R?AhZs@6U8saF04lJl=UhKOZhs;=yG> zLktbRgj?pyM{X$(_gwFfSp!T^6A!Z!9;&`xhEJ+3#Hom8n?`{lP91j$NqSo9W;u^B3>&GmQ@P$}yy z&x@`rud71v{v_;68oAuxzb;Y@bHGqIiBpC%-gD)cP0tS{saH3BnHPJm@ZPaw*PLvJ z=D-qq;3&x2o8eT{I7i>vaSiu540Ya@c!k`vw(~lp^{s!>p)g^%)EVpD{o!*ICZX}x59XI8h{ zV^LdFgUw|vEv(Um=eXB#7lL^#fKSM(lDpvBBIJLKz2AZ;_+^}MxwaKqI67r58{6K( zQ*Bq}8v)5JHfQ4sms`qPAFI|N9V&?+oy?y+jdO{;w4}Qo zJ2=UuZxePS`xOJ_i(1wJ=X?$uUH~JArtbvP(?$9J30&% z*H?eXB;X1pn7K*4_vNXqvKD4cLl3EiHdaaL04OUbOOy`nNEv>~Yn8!1@JWQ4KoEcT zS)Z*vB#MjQ0v*;RVc#XnBCi|xO1MXMA-(QVZxRF1NsW8E^`h_YS3gpb_wAPO{gCII zj)&Sqxc?V;r6>|fFuJr&%BI5@&I`6<_YQw>i}>jvH`Hw0@Jom&j%Zk0SC9pWwT`zD$KqQyy`}-aPcsaLKn~1#b?2d)K-L zDvaB@-*QX9e-bmgE_kBV>vQ>f%PoaOf^ElrapKq57pv893ND=|!@G5;fpR7zp`&IG zm?W@4qn>pt%78V(=*2}=S$#8PH$Z=`{4iDC6+%q*!I2C!e16+tHGO48*5I(z@b4i5 zBr3tT{MR?+3i04Z}kRL^wl{32e#B9t9Z< zR;Wg9^0r)~j3?HDbNLeZ&~VXeJb&~Rk0D+v%w#_QEb=d{j1)Q6g0&KnGTjyWk z?VWAgw(Xi+6DQlY@vcv{ZQI7=rm4xA?8&yfzrX9;=Qxvj>SoStY5B@Kn^B)H1h_g zu>4PWfy$@-cc|7pS0*EH0i1><20ncF(Kzu@(?7YtVVZ`D1BDno>==g?PJ?hoNmuGen)Czu_ zuQ3TPzZ;4PlJi49k%~zM&<8oSDpp%|3TGccyvaN$F}TZQiW&-rO|!5`ANCn9BzO;9 zX@>3>K(xu`k|RNznp~lkbau#;5%$(BsKwJ@Qo?|R8Ibk;f}}*fc#E?PO>g?1G&8K1 zxo4>OJn}3xy$IPjie~_yGG@r(4D3b2op=_uo@niGL^w;#RN4j`5D2oSbbRAV?x&`z z@ZLbfWsmI3T?P~JgSA>oBW1oVu4G(G#-vUEBGA?L_1b}Ds~KWJF35?!7FQWCV|oi1 z0i~fx;T^;0fkM+(JSsrTF)QKYgf)V8S_&*iTd)Aqv@QB=5l z$QMSfco%mhC}~Oq?5zP(?ZPwF{*~eJJ?8Nw=Ur_TwO|i!RFFMs!iZU)tMTpd#2Nh- z87!UC_LfRHzx4*MPF?p@pyXcndXkKG9m}zf)a}ut<=##6mT;Hx&B{)W>F6`3Q$RnF zrBGO zQGDc?hv7uBebc-L$(S7(Ywe#N9z$3w z{#CH>vm{v{j%3&aWu+tt!gJ+H$TEU@o2Ute3K7z)8}=ez!|&>@{HjZPk)N7z09fMP zgvo;A0o^CEEb;&2PGU1fs5OB4RA27r2l2?bz!>n#DHu!f4buF3QM;vkHro`-ELU`@ zz*(WwRTZ3M&qv@TD2JPMzoVOSJUL2;}Ao{KfpkeJL0DGsVvZ(_WRHwiTNV303gTql^{+lot8lHnwhp-hcRnGa>8vweN$Q+8rRJAEnnV5D zoB9EFhFwb4rd6>k8ygO4^k#M&zpM!nt9W@MroJa_T+VaJ6??7canZc0H^Um>QBs9*^>2bGx41_1Sw%x{c|_GsR9=4#83Hv|@zb4hg09 z^psE4Fpza9?`fQvSaB20_LrV}JwxUGXC5`VIzlo;b50SQMW3>4U8c^?CFs$X>>>9W z)7D0Hi#Yk|ill!e{ovmg{5RY#eEh)7lvj2~fjq6gP+j|U;eK1~Ysmw<<)d{_I9W`X zZts)8Hu|kuUAFobl0F7lHJRCcv5jRW+ETsEj`~BGA$x{0h0&FiD_yBae z-YsbFrDzVa7%afW22nge6zn8M9CkPF;V%^pM2V2f!OJ#E=gp1 zY!8{+%IvMMHwO(3vDP`tZ1SeLgt1=QkgyRLl%t8BG_XH=P6#xWN#X?=4;=%Ny4L_! zx@VJJ`JBTgC75hQGt19`BTRIX8vx|gyeYi8PF!F?L(y$l9X+kG{3P|7Df{5_3#|8k z(I6#5fd6iuE2?dZr;#4VdANYKBEUxA>2SqHknfHZGFGEDl#piwh99o;Qy1k5g2=uW z<70`aZy)(?c#ZGRFLiyRFZuz=-`bTfGwNiGaglYz-*0_t$UO%doEYJ<6o4YH-hf?p zQp_UAD;VnU4890@;<1Dhhgc$CG>C#Mp;|2IDc88{AQ#>LY8ddm643<_P7|V(Z@X{i z9{p{niDtZxd=q?HLf&k|(s#yhh;@-sZb62ym-qGWyG0C7B1&Evo*$ri4~#_lU(?lT z@khOixk@7L9|R#@8A!7VQ-Cv|rc{l?$}W%O_lbs}z?Z1+b1R{vf?*-hePW@Os~CEM za^J30l0Dfao9?93U(ibkDI|pvFGwCTb!$F98$l>M}1vQVNkrX!Q*sk_G zwo~D~B-(lK`#6IH^MW%sVf#5eo*$yF<@) z5p(tN1#*rCp_8VS)PUFHUouV8Z%^SDU>G$NR>QUSaU7k^@b;1g^s( z;2KU5UNVv~b(E|?xr!KK91nMsD8|Yc^%jq7xFMf1Ht|FqnK>#DzRA2P4+-{!IY_NE zR4UmJ>kO@7!~(#TH!1oU(MEL@K&3#`DyWhP=I-L1LP4iT7k5|7~G;91q8rIcpxdjV1L zyXX2Waks8v`hJ`TZW zlG)v4c}uOte@}=fK>ColI-hT_fuhujhIWJozk`=9ZTUX;NWF>C`9ShsHfB$;B=!Z_ zI-r*?{`@7!ZlIqB(P$CHENAbQUok@T15wjj9t-bBzxZ|0sP2Nj<2#j3_*kEye74rnEz@Ac{thPHC@!^Tk zwIS&@5Q}k;u-}T4V+W!GA-J|M==iQFR~-GXOu^;*bh{X;vGqCqCp`K=304 z_$2t0Ka7pVs2zGb%XITiKtB}M{-G_hyDSTjM4tu>*G>#IN6+is)KY^MoMN(4H@fmb zJb>IO!4$mk>He@VGkys6Gyrav)iqVJ?IY2dBry4~bU3^us>M|Mn+K!24QlN#t~Zr7 zyHq)=x9l!i&zA_vu&SX|lRz{n4J$jywaiy08jw;NnENhJBb9v&+PieXg`)dsT zIRf(!S}>P3i`YZ)69U&s&^OR0ip79ZNPXD8q=ej}eeU7*V*!{Obd+Gv;&!vXq*QhT z$<#;xFBU{hi7@cVLKhxHYLyAiDpdhrCKs{G1#I2esy@h@8j9@_Gvbqp8Pr9UWWczo znIbtH6hyhoMSuY21GiOi!oq|i#sFSCzhtnU%XhTT=-~c->x}Q~NffC-PJwFqZoHwu z^uDp#FCMw;+&IA~>i9b#(Y-aPV$EIrd(82od#|nSAx9U7(Tvcl(cgpkPt*EDUV}|QNGqiq(RpT}{m*LvCuPsYolB{eyf=j=C=tBR;sj)z!Lh*Hy>>;pI4)wImKC|DG zDEq`imX=Vz_6H=Y(>bEcjGvb6B6loC%W{B<0YM9;1MnC!rRSoU+wV!Ks{ll>F67j@ zcFpVNkwdmFU*L`uM;s>QVZavM_n;Q}BmUxT&6ktMMr<8#DC8;tM8GExVX;m0f)pb1 ze3uCkR~HUz7@o(4AsTZpf)z&u8bTs1nH)WsS@72wz7og`mKsEeXB|4jya08|{ zlp#HRgXCG8_|0i$uf`h88}MT2L3>Sxu?-3&7nZQ`yaXWe&mJKqWaHa$$!D=>AJaJC zcX`1Z+MgfvUv<($LDELhP+sa)9h6FKmGOJRzggnGOOb?Uyx=tPv5cLxYVVsLxwsZ; zjfN{!XJl(idHU`S(jj(uQiMikZ0mwOuUfo`1il&WbnMo6*)}5702wN%IJW;r;QVm5 z=Yye*{q4F=847OILM+E|y5^3Nd3@yL!>~Dylt)k+leh0tN$x}sR!XQ<=Uy*Y;*Cs~ zIQ}GjaCox#{9O#3K4@@?8Wa)rQuNuN2=3DOWEkTEEK$%Pp>1@PNW<90j7uV{M#B0` zh7g9>hS?5gb|W9mf%a94CXV49W4PHSHNu1Anhtyg`dMe!AFX^YWBoXZKTU?|*lVA* z(2=7qTQE2LEH52Yk48NByxsn5MNlLHcbv0vnloY4MlpS9wueDui(Gk2BH0p6MMG@1 zjz|rPFcT7#6HWEuJTdpYP5yWJh%8_qKI&e98TAbT&aDF)@~{mq z^IuLaVxw==vbTZA4D>3+#@}uZR9q3C?J($$RMdx4BsH^C(^Uvx>BDHAbLkHj{kw2D zvJ{HRwL<~8k_qfMqGoK;U}q(fp-i$+m~`1uOQ};=m5@S`1jc1+0*Xmplf{tWzGZl-8-6E6R!;$Y3jYCM7^88Z7%l3xNp*oyg` zT}cT>;^adnmdCVjVfBm3}}Y6)VRFd1c#K`jWnc#AWa)- zZA9Sh4!w3`qmwP4hnGc~xyvP(OTkee?-z&4pjeW{FnuY}WYe#Bi4GD-alSL5;ilqU zTIfas-i$#In-GDvN~6M99)04lSYp;5+Fhh2y!HZuA(EfA2UKjFu2n9xwi)T5Yn>R> zSei3hZm&rY)T|ECiI@i6IT?6)Oh|H306V}3Z6-l~$dS3^noUeJ8J_VKm>sdZJ3j6z zOlX+9|{}fhtgJh$slJ7%tKBIiCzax-0SUhTa)1zl_Fcaq841 zBG0s&+#q{mBO(gj{e~B)-=`nG>+*bv#fkeT#dX2AW$=|=vQPHzt*GA+V4_bCVdYnV^`Qh8PC#IEWxz3My#oi)o- zwDFTX9zu(UttVtERmqwow|9Z9vqq`qvx4F@ zlv*?d0tG@1-j#;rV--v+>VMr}7<1N0c+igYtER=x>WG_W5Wo2?ouTXbZ+~;!hL(g7 zysn_M$z|szfcY5J7J`2o7o9*R4m?v6AT#(`ioC7aO9fQDjG3=S^jLsC{s667TT*& z$Q(#QQ*#ks*kLA}w_}im20?ll5B-Wf_>o(}2(i-5C zHe=BoRvS0S+)@_-YS%b6p+32a#`NReJ_YTZ{{U%26D*CjF7Z0(W5&E8uHP6> z2pyF_38}=C1>4BTrYjdFphmJhs$(;ul2=avs1fXwdr=672aJ;MEA*@$BxHCHY*s&q z!~$8f-NZ9flaur6g}-4HdI9;44?f*X zM<>g`_qH^nE^<}xtqC@Z`q<8pzU`6m`X0YE;0PJwS@QPHB*x<1F^9sI!K&srx9@jd z=jx{Fz-7=N`r_AzaRd(CIZDD`)E`!3cd*u?+Q8G_UE2hPm$-*?lTcl(uZU>EDtG_q zo2m6-;Vp97?|o3L%sT=WwK9ZDcfJ~S+ijmf(J1r(gD&LcN{QFQf?(syP}%%1mbCPr zdA|P(J+Q!tTr>;f$3G&-G9PpkJc^`#}ORU&z} zb3U>BMO*BenzQHA!sm0#Usgc>PJ(}5Pw(?#fXLmXo{d$;U(O;T%wN<0#mb&sJ-f04 zeh2=`odJ5@Pja3lP_5k#f5Pwt9|EFMi8Y~QyycX16ymo%X)-WQw0L-yi%ElCvd%Xj z|3vpBG{||J|(~iFIe${E^BZb`^em+1sWh zA@RZ68GYa<5v$L#Fjr_IlDGKmXFdiXV z+}8fwo{Br~<9<@oa}1JCr0$hK)T>F_mtdGFoiy3adKhUk@XtmZZ!r}$5gZKdXbA(G zt0Q~up~q$G0w$r|_aG=)u|WTX!~DIW(475*O78w8QR2IkvA6u5%3l)Jo~hJ$8n=N- zh4F3H=eXR=fK9xBQ?_OW3<0pX^J;E4GHNN|jy%=BqldQKTK){?VP^ciRXVU8n2>6S zpL^XcUmWDQmff_Ooy3_^`47mWu3lTbe3;4~S7fJ~k}!yrS+D`{hr5M;@4~NW>_a-z z%uFumO<0fQErY-i!_cnDs7fWyXTQV2gXL`WERee#+z%zn_A;=qGywY9aybVQ@kER! z5KwBlE!9XW{#(o%GsffwB-b9GG^^}4nO-4a^3N20iy)tIVG>FoW}B|%gDRzwQW5ut zcH9OZG{PtsnFj>cs3Y%gSkPMq_})L1uhAc9Mz&BNk?7}`v1Ivnq3r3-aJ_$JQfjIQ zeV!&Kb0H#|3-2p-WB``T$49O}IxDfB)9z8oj`eG=M8m5pNw z@r^^(nj@N=XfZ2iW_&y#-1?P%ct}U=d6DnX%eu2SdM!y>s&Q0poI$tyFr`#wST(Dz zSVLyIbJ*q^v>Y@bQ?XX+oa4_xqVVH3Xu^tB47RFqLe?kuv;e_OoyPNdjPZho*625& z%iB~O<-)+?^RJqXx9mqE=$|3BNDLU_ANsN0*3h)}4P0dPZr_`JLTX07BSm`E8ru5$ zO*|$@^+RR6fwYflsJDAFEFyB@pmZnS+E?U*HLP1h?kW3aROf|3J zk53UEtFyNR-GGbsv3=J?eld*@f7e?svnwu`ebLTul-inX5_>0wy|()7$08iDGu=49 zow+=WYcp9e8J)w>=oNg#{y)yCSUTz~9S_mV-gUg4i#NK-Ru}r+g-Xwn2}~|$?fS)P zBFW0ePp>Mh>$ZBl!68Em;5t3q;WAng7PEM0IQOa<1%SmYc5^ATqfYF4G{?Q>grw?ye{8st`={29 zpXD>A6c@7fSp;hpc6JzVR1Q#W=mxcUvi;4^y!i~J%l$*K_TzOUfj**3#Ay*qjJk+Q8=QlJW&1Ew+hGz_X zU_#KI9sjw}9zvbGs3kp_MIiokf!WYsd>^0nE9cA9Qk6+OZ-4dS+0uV6KjmBmdg(C- z*T8D&1~V4w)Zoxx+B_ZCU^1i(u_sojuZearM+0@_7>+UNKgbPtG54uKcWAF@(r-!1 zyfI0AZaD{hxsZ(AiA6u9@hM#p{2|2X+Dl+;2MaxyT(hrh}jcyD9ePX7Z9E%dPh=+ug9C ze6#LqE6*GdB}^&Aq6_(js%)M1TUy0Mnuw+7J~P2k2>;nN8bE-dHn0Gfj&Xj5XdV|l2ETj;o;=*&}C2Nr4Q~U34hc&s!vZ%07j$c z#hoi(f3@c=4|S-+BP2?%y95eQqtjHE$ZQwR;?*m9eJ?xSFP88e_q z*vhAmr%aL{5|?qnk7G3q*%wf&WDo+RSeTSw=g1%sqn*{4E#Um#=f9EGXM9t_fL0u} z|7HZAl31M3?VQ0Jfa8HQc@L`J2NZCna0d_VxeOR29LswZsdqKx9uW5s%LN?e6!k|0 zpnjn94$%Y<4dXXo!mx&%;6f7q{qGTLJ`VdE)bl|MsiZWWy&@$Mu+cM7uX~R!s9eZ5 zl^OsMHlYjEia?958;qXK-pZGSq&fhfEAa&iRO@Pi<3uGj=n)u+?75MK1*A!!p@<;9 zn~({c&RZiE(f6DSbmoWQwU*BQdZf^coZX1?oj*`BHaME>{7Dk+B^uBlH3iEnNS@|8 znXRtvEZyCso=H2{%O6+UJ5D;RfCu#?$9ii9bUJ87Ox zx6+D84=f%6*Mes6{PhF9->Dtk?FTkV8>CEk_Vy=B)P6z*i+MXr6*MX4}av$RkpnL_%;Gk_)^6&hzt(yk&| z`jh?bU^r`EHB}rN*2+Nh0RfS_8avJmrjQdKNyB3y9s1E+SM>7BX3Y*8+Lsq zE3mf!!{}fVdF!n&Ao?8w)lhwwtc)9q5q3W^;{Z9(32Ac`dFBsTd|I;K`5 z1kz4^a?pU5yXesOVStR`hTP9A>*PYOj^^1^i|Df=(VO|Dcs@Uu2@6+mEl32jU$x;U z0|AjCKV9JI^${A0mB6#P^??ca>`;m;JP%ZOwtRH>xJ`tWa;^i{$1G_`$9@tOGLtO9 zu*`hwn-Xm(k_1z63rOML3ti|8d}UFL;_mezo%AE8fjiQ86VQ}>eVDttb&{_cBkRo5 zxh=w_o4e-lT-$NKx{>k@9eSMH4$)5UU2K@X$n$Ge&grtbHVTK2H|f}#g$^~Rqm;ub z6Q_h+BG;CDAY4_Ew?#4kyA|(P)66iB3m=kzflgn;X+7|*68BT;H$JjQr;pn2-RI%ukfHp9@FZ16@+(#REAK=$ zRWoabXzn#a#Ptu$J&Pg>`7GbvVWCVLnf#JK=yJ#_ls;XF-K3)w$-4TL^F` zSo`D5H4NWKSLM0fzD7v~&Y$9}SV4+U1t~jh3QT(d1g5adNSa&%$poU3&3LXxLS%Cr z*_5IylbXD1#QPm&Bo{6wPA@}bF~A*MekFz(1LQRJBQ_)m^@&6ao)qCdE$^HUStU8( z!HrVds5+Vb(DFA%KYvam;R@JLT$w`IK4I#{5FtS`Qjw!uW=^N6%z2h?*f@8LDSs^~ z1u7DmV74)qJywxLuVEFN%UKr)A8XCci0atVwb=zTK{D$40WwB21P`zfS5N6>PyWRSff1>jGz!X@Etu}jP|ih%*u z+UJ^!d)}r;i79l+N;olX{+hM+w|wI?M%(5$Pam68N2H&iK#wsQ<=b44CuF-tEnXbVcb?q}o zJ#XY?CjXvoA_)}Kw8)fqy^Rf*uk76m3_>|_?;G;=^ig&0WF1_D`pW#-dV1p17){na z1A18=JAXliW4Cy69Oe2DU(vyW!ZM_st&!ky40nY|Qf&AZE|hv{A{QrJxBD5!D@d)B zmG`9)cXWEnO8yfXNhGPn8$E_;O-Cjj+fo9r8=$wg=G8;>^b;uhbb7{Y{<~ezq~`Bg z(|thYuI`X!h(dV|!hsM`drbF+LsXG7prnW|a&Y|2r6%9$+KXFNKJ(U$k`uah`Ya@3 zmbEZ;wEMp3V;GOiK55a5-><|(meq3cFTf{fo@+2`w|pr_mcvk@kL4?k5|cqdUBxZy z5dSenYU-H_WkHL~x##0-l0Gr6u}4*`qoc6KyKY({2eK$!rmq?*31Q`m_HK&_=#){; zpyd2hsy6(m3(?o+<(}M#%m;_dJ?-zJjJ#dTF7~{32_z(sYkg+QJE+?8uMQ8cW4N?* zclw+cC;ia!wR&kiG!E9ql0&r6h6I^N116R2AW?t*P=yD{v|$`y^LCw}bZEZNG+tx$ zWb7Ujr{(WwBdfI_g4CCfZZOGepey%B1ax381axb=W_a*Tdp^At;odFP!`5qG>Yi?} zy}f^mmgqhSbapn|JT0yU>7wy#pZ4UTar&U;9u;Rme$vJ8qie@UZMl+u60QfF5B9dwcQ%!g5p&81UEtBVL!jYIIy7Xic^5E)=Cq8Tp@KG*7f)Gb5 za!BB{BW~_h@sDT`r_NzW7BWERk1++Py+#&oFI`-w@qr$5b>N%E>~Jt1R#X5b_f2yEHB&=NGmBw)Y#S`0>?dl#bW0?#d;8tmu4Xrhp!?K zlAi=&8dvVH%CY}1l`r}$(K^gM6-ucI_?DSG7!#pa5?Acs2r+KO3zPo_!auoTh=6b@VtX4 z2)!RURV{TErf%qH16H)D60b115^6o#`-ypwk}8k6)M zH+fbGmJ{0=aK6PnHU7l4$^JIv-eY@deeOy3*-O@{+=OFl_T+G!L{%i4txiDF5Dw?hTRHAlOUt5uK`Uk_F_B>l-K z)qkwNeH>vhW~=R|+Wbs*U;hHRfAORIBTyBkKKa`@-Z8WUL{6hf(7}Za)_}aS5F>dz z9XM1nXEo%xl45Nr@XtdA=;KX;q+)!z<@sM&3Jidmzb}V@{FowH#B=xyc|OBph#4eh z9ay15h)5?|-(-Kk6Iq2($#V*q!g$gz{Ru)9De@~ZcVTbzcwD4NG`D(}(lb;uZm zywq^_3_CLqsg+d*5~qUWYthEx*#o2W)AO~7zT)Wq*ocAszcX7I=Hv~}du`Wmmf|M% zv|SHp>Kp*%bdjG<<^Jtb^w14W2jX3eDyRzh6NI8jL|5SXe)?V=0nzir{Mh~wSM`E6IO)2ue%>2AD)*G^^Gye4)Y7QE|&iq*a^&`bD%(HKV%HmMs z72f=#(Wm$+O`{Ke`9f_E{^$@KICe__M8j8E4&-PEZfu;c`y!>JTaL=f_4-Qgb#K%{ z8W~N#{}lBe3|+wWvU>jV10@tJn zBB9)e`xukAX&lm-A2&Z^!@bV_3uk_{GT_e9#ogtm{)~-}Dx-jRZjGko16RED9LP3; zSl&|#dMLo)=@VbPK>n?Xpbjaq_!Y6(53lxyM7qp0V7wZ!XvP>X+#W!_G)0NiF7U_E zFa775Lov6LVo>|f1moS&*G8saKn$|cu(Bu@+C4;nGV3WMKL5LyMx1eHexTS2wj$Uh zo#E}2x;MAx1!jb3VCf^WL|KPU!9xMhjuF1Tf<13%d5#baTc_55XCCc&PW|z(fI z6HQE(P35rM&+5zfF^D@?Zun?Ct;%8C5^P!HC`2M@^jf=_$F>-WTGRU%z*q`>J;4sD zAUGGb9qDU~!!xX7ck%9V3jcq#=m@VZ_Cg~xz3`HhwS8r(BS$wN@P@eU#mARN_O+{W znqmV%yoX)&1rbjfBw?7O`)e+_sCgrWA(9yj>_*EwD4Jf9w*mj0c4L1qND!da1WnSEzOs2ggxHlJY zc0{#;|6k(CVEB~k{m7a=^#%0?Q16%Y^UD14CiRE?M7AIro2e;5z?;B$V9;}Cut#$i zfP6+^p*21?+$by~96{E7<#7bl6aKh8u|bY3h2@Iqwq)KnpkTxTrs*Of?k+h`2e_LE z$OZFS1_*jqEihkYf~?ThmI*Q z&g3Q^oh5n0LXbRun}Y*8cF7^1A8u}Kj$bZ%IG@EA77Rb18}bZDRuP0biFn(=2NNef zHFe&?k2sf`_}6EwMvACmBc= z5YSlyzIpHAY*rw@zROedD-C8eo646X5}UB@4FsdP6sBgF>mT=+FxZ=`Qmf}x`sdVY zLp%-s{@uvj_99utGcmaJR^i38oY0vXsoaEDSv!LY~JjoAe8Bb-zi@YW=Db*HAWR^Xh@)mRPW$+BtJAxXLKd z95=meDw}@}H%GS$C8Nz|I?em$-|$){tEt|x54?psO1X+yM+Dr zo3~GdCv^+5!yEc2WYFGiXSoBY_!#2F8JA2zujj{fyS`lC`c%UeQiQKcdcfA^Mu}LT zHU~e!v|qU7?dnDB%%|t*$KBakjTLKYmX4(v{!G1-r38KY$O#h|%*bZ5_Ha1U^wM$sF1&Pk7jRn3$tZ#G z3F?|$ZTMQIsEfBy9AIS`evo=c@DbI|J5~7inDZ@{A6X(joA*!D!7SL3v$R{tK~ADblYFDUfZ zE0Lj6Ao4Z74sY=F`&2@)JfDC0B}$L}m~ zM3aHRoYlEmQS`xw4-rzzi!>;co(g=~bkFlfaINF{fYO5Er@-v~sKFk@DmD0+;UEwB zLvjzV6kXV`%1j$$H*lXNQ027kVNKN_y$bP2gB!tn5JD@#UhXFmcICxCg4hafKJ6W0 z1pY^7N*IzpG$6{HLz(STOdF$h#mj5evwwULyKZle*G>^5!Zs>_yR$-b&Mt#p{&n+U zwLTxteFzTc33}o03y0vM3I)NOR-tsJbzaxJD;sEnu3e?8F4|%l>mrq`o)}Kk=HFqU z-Va2CybE9P;|)pkO^KpP>alN_BPCt#;)_Z4&ulSNiok;n#WwSiHs{_9Ljl4+gwVfL zcQorbITSU{;Mh1RZ54$gOfKF^WO%AK@bgeZ@-yi2myO8P_rOqw-M%$N0Z)* zNB1H*U-ut64=~g|f$%lFDzG?~mMNH+KxV3?8(laJPO+kF;b1n;_om3`>_g{{pc#fS zg!LnEQ6NoA5A|V9ZV_~d5SDxVh!#*0!o)#M}}z9ifZt77L5oVjAm=vgf+__lxk^)K^p zrS^Mm0(~dYsn;3Nf*FKnTFG?~py8gw%XL}{0wODdsn-s=nbN1FH3Ga{y<2Z+B%?N=Fr`BNID_h1KODzHDle2;7? z0W1qN#iZ52!^xNW%JF`ME?<@XGiXeruh^5L;px5@Lilvk*zqqUU>X9% z=*vh{TZBkMU{>?Q&tK7G3zSa^yOV?FfY8w;dWV1qFk~=xUu|_+%eKoiJR6!5{3bAY zeofMDhw+l};Ex!zNA`n}!OyEFD%t=H{{B2N+Qpp@ct+X6(w!4~a6^Y+G$VRrmCqGr zL=iuimt5ChKJQVRJfD$G#+~#KDZ!~2&lhrW!lNz`Jzf7J<95P6SZK;xp)g`AD+#3S|I!grmHFH7&INdq0r?Ww9XSRh$mo*r~DbfpswZ}iv zhc&(Y8iHR+bNU*bR8mchtM~xg9E?sF9ZwA0! z7|f>V{MKeW@x=%+cb)hUaX^251&WS2R6*kLU+~{|4cs5tW85;4EOlJ;` z`6$lmf+6-qXlDELZ>vIj3gPRy{b^>}UX^{MMV+@EL)=2|+DTPts1z1ocrKze%rjFx zoiVE0jtK?HFgJ9%iCJVbc;3SmPPYcmi$uWAg+B&KCN+5N$&0KFmc zu|sLa>Ir8wA7CP8T%mMs%gOZvB|xqu$KK2Dx1-yC<%1Tg4Vud8^*N9;#O(y3PJ*3* zyTZtwl6GK)_OfR9$jAf&&mFxtErPEb50gS!R`J0GzN3L~99|62T0@06_9 zSV1Mbw)o-a%++gf(!XMr28?Neo}FlFe@LwG+Gs&u#EdHGm>lhBuTAfPLTC?Xx;!Q^ z93^1-Sp!latxIWS!`fnS9K4bU+QzV`uh+)5-JpW?+b*Z~f0Q|e>@f&Y;14MDK|(3e z65F@7Y9Y7RAGQ2x^t}!B;KgZm+THoXFeb7xjcV10SWRB-!SJAz3>4At3}&6-6yq#k zRHfUM%pa(Hpq`A_Pq==KP}ZU9sR}n^x}DzBL6;~|6-_f?T3-`^tuoXwG(7_j&H`T?gHDr9k6bEV^%Mm33@X+vr{O za(nyR5s&w)^W9Im0K~z9^9nxKtR=>gk`Do!2YS9vGbBPjCPdV%A*hJ4@yQUJEa_T$ z1b7j;-YV-{7404C>T-YcH+?jegp;a5=O%Aii1Wu466Z8BvbV8UBEGdY{$ypPgm=R# z?ITslDBgigTwVUBMrW++sz4f({LBX|D}@&+mvtixRM|YF1BqK~!h>9Z z!@d38VUhB_%LcZgqV6;xr!b)V^6MHA^Hy5Dp8vvl$ef1atM1Ps9N$uC#NIN#Mxa+K zHF7SbXb3Q`@J}!LUs(SkShI%x>7x{c!bxH3Te*=l(ZCxK5uPR~31oDwiJU-Z7CHv0 zN)iXUSJC}Cz=KSz1(N5i>h^ues5%pGNx3>A9=%rH)|2Chj=nf!FC^9 zMEMzr&avM7eb1Gqy+4YO+Fzk>T28eb9 z0tQ#Q+(Nc{xeL!GMxL?gBsGpW31|r>(HcB7nQG}tsPOq+4)zd)@-|$yU9MMG&@7(` zJQR*i=1zGThJHhSComdX##CpDPOugUC$_x}yjtvisvFnM(5CMx-mhn!tXoNEadylM z1z-VUgb!R-NjQ*wKc(cnEk>$2in+0ATyp97DbSr#&PGa)f3N#;6S-H46le6g zLx$ALj~qv!pCF|~fZwkfM_;OLj| zrKCasK{N3mlfuir6{UKE4s#^7dl6twp2W}VvBij4zFDU*&j(yt*o~U>!;M!w0`_Gdp8pRK%g^&a(K`r!uK!_m|A)`{um9^edf%HCU4_a(=Dt$J4_U7NC(MlVn6s~bq%Tf6nX)rcB>YuR?{ z&~j>s(=IcyEi-U%(vqlRYagG;=1ZNZZGT&;*f9$fvOJ5E*C>=|`t1F-Zht_*D56|!JVxT@;bC=6` zG7ineHh1TF`d`{;5!;tjG`O9-(iJ7DQXtb>?o`8opo)OCa+x0|alr_UnRvHS7O~T# zU6!v*u6>CEU1>hq*t%U_Z751wd$OWbDFQn<6|y>WmU_ePRta6FVFib^tw!FrDF*Ne z)AeAhRJ1l5huI~?iH&{TZvZ51WqWT8_yNioG`{$lT4|6s2rBk+;zrJ7% z=!Sea!bmzbVEVho#iY~Befyz@V@o(ZKEANZW%dT^R60^CkC{4dDFXTizij-k*A@n@ z_Wo5FENAgQ0;$~*87xlmb(qI01@aKweEt~2C!>?|R?4Ys#u25GeSqZdCHQ}%bc0h> z`~PiPa3(x@Jow4n!**dARboBfgNRSZsCQNAL#~a`A~lgU=2bQ~I(B`{26F*j+O>Wc zvS8o1qSg$85(V@hVrWsU8{2|WyeQWxGL1Fam%)uamAOpUshhLKALm8CK1g4Rc&SOo zz^g(HuAfy7Wg;O4=71ZP#;2rr*Z|rkUxrn`z=o+PJ(!0&%m}9`cq$!xTuZ#Y!|13z zm9d|e0-Y|DvhoYV$Do`L9!zdTGpN?aBNoO#{{4*^Fldp!R5ml38Nv>a--ZQ;3JhdK z-^x0(LTzQK5WF^qhzmMknE$Qz(amg4@9v>lAMe#7UZA4x!~mbgWhTVbm6SGAg9sRi zhrbEMC;-`;jVpchho} zuEaeMRilC=%fW~q*pKEW^{kUqBPKFz)(ADac@ zamV~(+qP}nwr$(a>6!D-S+mx;-RnY&4f-c+n#Jd|BIFfHq z-EI2sYiv}K63NQ@^V-Kp4Fm=m?-C=!vhDWf5m9mX79`$6Wz3&e8$>$9V1H8y8%y{; z{!NWT?dUtf$HJ)GIFirWC?D%X&~`1|?Af~Sw*@5CTksGpwMeTy#G*$zqKd=f+hZ)E ztwn)y4ApaeQl~?g)<*ND3lat-vmny+rztv$S62>t`GRS*IE6B_AVePhiB zSk<8YedDPM_3osC)LNA_>E(nQgyAC8UMdVf)v45+xTod5KvIFQB&B(ej}lNueyaIx zA_1&@gdHVgjif(@@B-YgfvQW^{I5(_$Auh@{Vv_V)GhWO5<}Nu4yF5n^_?>~VC~{X zZ?<)noNI?7veoPpWZ0Gt60clYmdC!Jv4{E2XKGBFD1%CHyOry243YXpxC4v;BP2_8<0#}hlisqm^g{gRgr6h0EVuRB^KG>hRH6d8dM zZIM`RE+G|u(r~$W7@8Df48G3{5u512<8ufs7e_s3JQxw`68H3&6Ok#k+4nB2y!coc zc>cuUn2pt~a2OXShErPOhZyogcL2opkcH0~n#`~G3VwPZr5>F8&@^LVkE_6?NJW=B zHO6w-M~G0Rpwsv{bo-S~AFHc-a>yrD#ZFKAF-~a3Hcn`@Kn$tod6n$9S;Yzm3BPRl zA2Hq+4H!w}_dF3FY*-|L32>IR?SuQ}f*sT0!KjxCmb5sW%=%B-#L(a7qW}u1U3##< zdMNN_NDdd2u=KP%UvwyH1-<4ZKAw8-a`g7yJfi$R+1j$lB~l0lFl@eu4>V$;t0tB> znOFuE8v|JjdPU_I8|^<+_^6@3F^2A}+LhSxUuf}!TRtc>(=O#|`Zzv@73p4&C!K>C%jw+TWyX?z=a9jyIj-kY6wNVpHPLAdniCv?wlR)tnlpDz5n6cBiB78+(-u zW4>Hc{zlWtJOA~Zx9ZDcV%la>O%#@7>=;Cs@E6oN^RH6m#wEaNMK(40n`b;O?xndb zW{1-vB0*tf?9olT1%oQYKPd2G%b7Cvd{RZ~N6}f+^Vq$zFFRFo8SY<#g_FJf!M>J< zO$31CuI1!lJ-y&7K>PcGC-BLs<-0?q&a?YZ1uY$Wyv3=iRe*WPGzP+tbG{nFGhD?u zCRC}&OWyCv{RBX`M2<$0<~xE6K47F_ET=YW(SKfhdv*!9+iWPSM3yjHG$NbPlmjcp zRd+`$#EmXq6VrR%lqBJlPo~WY)5mUji{$bkJBxTRs%7E&a4N(g*E#iQ(1Q38Rj{xH>X+sr+fc9=k&)?7z?(YsbcHyeBs2RDdaa4VV+dN5@{WQ9~*+R z|Ey}YPwP9+4`eVKtt8RDWaJMh=-g~!ciFlL5i8hDi9M5m9~;VTH*55oHnFrck#s{| z)Kh5y*M?L`zu+uHi8J)tj-aCjNZl}?9?0g8FBxF9iGMG^VF%MsODPlL!PIf2EE-U^ z%$ZBgwGq_m>BK(zTj?(IPR=yo++{T6!-dCs-IPDd_ll;GZTodLqF1ce0h&K_;&k~A zR6CO?a8Xsw<5gWjsW+=AmhFtcPIirKp%*{1kVUBKdyDbN+s5<0U5I@TKHQ)0hagha4bl|H zS1>>yr7M)7kfSptldESOD!)5spH$4K3w+)Bg@;uVFT*Gtn0z0B!^MC_CUyzdl?v4f z4a~F^!b(w*roS))0OEcTJvzFdAO6DH*$Ns=lv-(`)ZiC&WAD%V3n#p5f+zC7o{^AG(rljU+)Qh4PE|(6;1st^G z3KR!2NVk`fnv2Jx6_*>~^}N5*!7)vDPiV%dGGp`gzV}uOgC$uiuSUSx;w9dw(2~cXl-tp+Bkc*&|+TxF3rNfbRFqe{uofuOASFS7@CZw2-lpL+Q^Bio)W3f}cb^-x|Ab_H1g8{oP)sYNCfws9ucspaPItmvwE_&v2n|@WG zn^PYGgho{@+t38yPW#SY^BU;*E3acB*fB{>Ix&<66FyF6*!Pa=VG??#0v!Y$a|O}7 zj?a9H+lc$$p29*2RJz#n<+1mF=pi!&l-|QjL(}jNV8(HwtU>|5oDqR~sW5qcwZK>t zB%yg#b4Hwet;c8Vi}aFW1LxHfRnHS)>He*)&qG-L?ks_Z56V)C$#L3M`0(yh5Vc=z z_{>Hc-$51TYR&PGfVn4me!+q1_uIyy$T_It4mn6LN2*YN(gN@`y_^uK)fE~WWuGj| z*$G#k?1)d^sF>LfCX(UpvV&@w8+7aU5I(ga#UD-ov1?O|YlDFFSO^-|R(a%cR~ljg zR4aq!Wm2H{2KV*eIAzsuCzrZ@J+-ORq%)5Bc&pP)(va*17Q511SgUX9*{SjB!?>3d ze?%m#1!OaC+WGfo!{~m;&vxlR>2d<5Y)F8dQa${eggyAxLlD}@d}$Yh8NjPgL(LkK z#>C(_jPG7*HSlqUr}0sjQ{LHbUwc{sCdl%Iv`;%ktBNWhr`SU!O}E^RFD-XLSUFpv zPl@!*EU`g~F4Sa*AosG=!wRK(sS76^j9Ye`Ou|+4l#|- zkn`i&#O;{Zm|8&a^1PWunW_ReXN0eORos?x&B$= z<=Q5A^Bewfs~g3F9RCl=$i6Q#tnx1fw;C570bAWiJJnQ@=y+qm`(z?`BDO}v&lg(T zs}En^;oKMyIfoM#vKQzLX4ukZq-ZFrn8@WRIGY0NTfY-p$GU&eTDf~#C|wtA?*seyR$Gs!$e_z}goN$5L6$d`;tgp2fae||7L@|TQrD;xIRa-R z3*ThhA&fjeu!bN2e$tVuZPpPpvc^|4^miJC^|ohXqoul+E;!uKjM0M)Il5aE>=g*n zLGdFWl>DpHDU44G;(@WkQ1S0}=!GW8m>|PwMof=R9v;g)r}#SfP4uh<$t^YzsNU4jZjbkd)x@qwI?W&3|VjSra&i0-lWa(3&Af|H#UX9uoWc^hF#Q|sulQ|9`q^!j*~>9`5NXH z!=&545hx+oK+(^s!1V;_&F{-4sHZomju%_vt7S1lY~&;7LqTtD}DL3_}vb=&w_Hzv1RE@G&QPtZ8y1*OG+7Qvwr?ExC?eudoQdAXT!%SRrE z8rX{Eukw>XdyTpV;7QrTIb``3;JS4?P?EPn_DWw9#(eE&jT&m~q69LQWT>KpHhgg3 z!d)sL{*|XIT|eS5LgMo~HtU=<1MQX5(R5Esnp}Iy-IPve(9(*t`fuNax|DMFROZuO)qEXh{ja9J7p=D^J=#Rt{nFD~|F{1-Cf)RdzP!#a~D2#{Ju^Zv+D!jIYXTE=M zgsTI3wcKV{7+dbV{zh3onE)~4G2tb4WF_+Bk7pDAo{2TdnJa+KyJa(u=Wj%)|B94_ z9@t>?yvhN(++DQl3>(ZGw+y#9{aAlTkW^H!ia^)`%3wb_u6;g(5zwU=k)G@#)aC~~ zwoyT@9Q+Q>L!vku!5=#0dhreOwjlG;JUH91f5%cm@XRCC<7mFr zK^bl-l^lX##N6jDUXf*B&M5WXEU2z_yWRQX4d_MC`Bd0UEG*G%ZHhy1<7C&EX~p~( z2iY}M_VgN%Ysna~#nsAf@DHq64$%dikk?X(8}~-`;H}##u)#s)!sNe{(oUXFaGlzY z8!f;FcN1@|vYux2l4rFOvZ=+ zI$|QyeR9jL@s|I9O0DYG{{M$+Ru(2AMxy`PtKj90!-WQA{>O^@??&mCmUIm1e?sJO zzUVD)rz^)utAgw<2+;m;u>mWB9);P8o<+889Y^EPuVmA@ zs_CM;Prs!aa6VG6nn8H;(>yPCG+ouKRl%E__EYMh)O?Ld&OYx9T9y2PAl3x{o#F+j z-(1p*CcpRi;CEe+JriBi8AuL0v-PBtL;Q#uTLD*|iQZ*SI>~-^AMg~v-pXskd)eGJ z{K+fKiJ26=fKE`UK#OM3;TNSqs6?xfLF`yh&Y89WtU0SHyLO7-si-)wB-l4YfTb6C z&}SPpIAgFYaJ0spqzjnut7X{Wm|xrwI?#a&VR-w7ca%p1W`5m$6s@OF8K$%fA#irm zp8H+HWo({0-*Ej4(SH({>;f;rpPrns8=JMU@C59~kAkX)@<+Y9&xt9klUYb1cvD^~q!J+8HIS z8bZPx=4l!`6~@zHnuRfv?)@1_7Os*&!D9^vJiKXKg?Af;X=ZIVQd+4T53|@9o;O#> zofumLFs&*ldl>CcmIp`VA8FZOLrTTJRv%U;SiqJumQT0}5;YuAtTB?b`Y%ogJrmbg zgD(I>a6O3UhVn)qN?(o8D@YKK;1KzAF7hNo_`y-_i@mZnidpj&R7-v+#7?<&<_?7e z_-oT^J+l?EEv{iv^||*XVNSVNiM7)zE|)2^CLwWQXM^Z@_X3A2Bc9Lx(pVK<3XL;; zZWEsVF^E0P@&9~FSfM$mG<2bf(4w-#3K?q*-(rLK;|dEZAgYKqo2yb}D|kpPQx9@j zH!lq*G**y9y&jJbpO2P}VM;@JU0gj1@L2I5{5}o>VLI0E#!I}u@?4!B#ACLIxjs_K z6k!B1OE*0b>XQn4(Nn9*$X=)*9~CYB(lYAH_7#ALCr^4s`(+X36CP>}4_A@7ujWKi)@5tqBM8W?rI6_^p-bx?iWodn2%7 z@Ds#sYlgquCpy50o^*2-s*|_F$9zPR$0@w8Obm0BFxOVp<=JR{zOq-omkt3sc z_hpv^(ez4HhLtYNFzt}LGf2=^^nk&iEU*i&k293`IZCqU+jz#9Dgm<-w9%gqql7(Y zDE**}mKpfeC%DQX!dM*(a3j6wWF04gAqTd~%I8G8vTkwGcVSaOnb*CC1x1IAgDk16 zHq0(4_!XBCG`N(qjTi?wh*^$kO+W};5t5Z-P67~=XYW@GihxHo9YmHibHc-7e%S~b zL`_>u7UZoApf^)LTb{PxHmv5*SSrP`#Vd51vb2O&hsHDD+eNqmE|K&G;Vd+~DBF9b zC*TP&f_HtJC4dfleH10U;r4V{@os~(C6-%{3%sPPZ%;DZ=|KDMUd_hByuq?6xDZAf zTri>>!36(ZZ^1~Dtm#WFO6%~m_jIZDr4olbdj*Y*+&lrozs8q;purqscgYlq;-)UE zh_01=VUbe(c6EIL0eR(pnIi1iGb+5|@;4wt5|#T*JKxQD76n`o(TIEE?Ctjgf%}-N zk>2pM=Bg&ax>G@|p`n7Iws4{MV7{fD{6&5hbNal+u-8}D3@@$%J9)7MNqT8ejf~8+ zp?NB1{}RUSAA2MJj!!}g-lLKYODu8OL}31v3%R1v6@V?kS3(3gY#eryRY!fAUnwm- z!OO8FlN*BR^n&*5uRo^Ug=%N!i+_q!_?`7a@#I*J+x1&J9<5YaTXOf^<2nDf)rB*I zTE+nLnOF~@@$6={K-60$6wlg^54O$R&u#UYIOtNa!BU3t@sZ5HhFHgk7rP)oDPXFu z*!K%r5R`iZmXZ^R(Ip5TPUQv;6UKEN&IWObhrniSKVq9d-#{v>%z*4keT- zoHC=Ei**Ha`hw%@NY;}-A~rh~VNb-w)Tq%$QjvKwP!CnQu{=r(<#HEvGzC}w=@i;_ zrA%gksq>+wgkfC`K^9F+LM8~+4N1}oI~@8$;tCCq8Y_~k7tYP!{^PYKFNUJ=5u+7l zk4%q=R%S68Rr-a;Ic|s7UYct}hysma)AQyR#RLX-rHBf!VM^^c5c2k!!NAHIl(Sf( zeT#GO-PSYvJ+{KcA*MthP@-tgsI-zz%_1qlQ!qo30IM$7@e)TlEk6fC=`AO9eIP4F zF54S-&{ZOy8bcp9s6hKrJY*)N0>K(i?M(hKiTsVUP6YXbXqyR&jDaug!z9Q_Ep6I~ z+@>l=6I41y9xD&QojPlcEtiHJ=YHFIKiKG(Fd`+jD5ROvC=)%tbRooCft6d4QBMkB zAAfoJlH>*zKG}pbXDoo{li}M0D0k-b7aKGs8+3}i68-lv_xXP4u)*Mqvw343dF%DW zJ2!?nBi9?V9#6l}qjgh{z=s9O{flqeN|5oFIS2g{;!UW-Uh`5XlcBvd?Ij?A$mNtZ$% zRs21866tM1Ii{e*#ekh_9tud*+X-8F_g{5D7sw!0TeRr+#+pbOy=l`SKx6)c!vZ&>ihxpqFsG-p}Jj<}cwtX+H=`6V?Por&L|d zYioZS1`oyW@6UCfUy?CqI5;M%C^+BSzowLpqx7(dB+ctU4u5q1Sl>g{SA05_F=^CC zF+*V(9eI5}0pf6a#_2YHdglr(%7K5WoM(KoP4HJ$4>M`;qr( z$;R*Ji4#KIzRhh;f6=1{`0gp*M@Y~fE`EsJpmbzab05kwuq15s`uWBYURW-Aa01f|u zs5)8Z{4aS<_@5OyRu<0xr_W&+WK3<%oh*o0n79%gl&Jwz|1|mm`+u*>&A|`C?Zjwa z5^I{UYl4kl7yIGG11WC&)efa|CUf_=zfl%bLL9H}FfUHnlFpD-95UkTp$V@hP;+{k z!NmdebauRb{!*uv$UOFNZqaA53^Vj9N+Q-NUD~pJI(WaTLcdU6z`sA%;CM4{!KI#h zKTFPV1|S$$+gq<_1_3%47nb&1wLjKe#hRk5{yjZD;>n!aXnl=+s=?nc|1eT#eQTyY zr=fL_s@~YypcmNw_IjyV3jV!c7^p9v8E$PGcSyWLqTd5zDx{ek62Q(gtO!{WD&O!{ z-cC&b)03AY?%yM@Z5z8JIs72#OH91%8nOWo(8i1#Wtu7XBglr7&|`cv;e{Hjsra(A z@Q5BMekQrlNB^6(7t>1_mqBrhQ9QA~GPZub%jN&pJ|6ddV%MZ&xgS}pH?)Z|v?zr% zwI9t+Cru}WQg-!+Me_;bUo!6DO?!x9fE?4n>=&kF$=H zP@fJ8my<0RzC)!W$eZ0CH~(p}!-q=%&`hrOE0cR|7MUEfSqQMig*_eCe2jhO=akt= z&tI`9<3-(&jtI6*hom41?JVmOELkq@=|@DBQq_l4d}x&^q0a$1HMD4x4BsDma_M(* z@eG9U>oM(259Lex(qMH&Z}V7n@Odb|qF#}#3;#3?A5MF73+B22=JODC#9!kakm%;; zz3~J4kvy~Z54TMm2qM{t)U{ChtqZP*f#i!g!dZ&^&%@Us=4t~$=}g=?B!uWdxC_Y8 z9WrGOcLw#SZVkcXNa9e+)N{S#Dqqxq6paej5n@@AoPGWy65H$+RmHrSwj!a5EAjzZ z(yVlJQg3h3bWJl>Wx}o+WP3~ls^&TyTZ<(o(F=CyspgRnUfIO{7@azon2AQqb=73p z3o;;JK_mJlLs|8|ZVu1u@IBEF`gsL%wt|y=+$1nho4uIgxrai`wwG~IHsyLDdQz?oeqm5l!#H(h~~w%hxEXnpsHwJ`%wKF1_RuU{k_HUghDEgY_??dF7Ocm(!7j zNBCTr1mmm$I&=&L$Rlyxz8(3a(B+ZlVBO+9)K@D^&dt};m^s-MO}sY;WBsa@0OQMc zJ*Sv+H2Q4|aT8PRiC~lKgtEVOKTh>#bY>QT7U&)4w#G7+vPKN}cwO%B5LH16&O?z^ z((c9Y+f<~KdA>?gXq~r2fDmP0p6I|aPPs=u$i(ggazTU!e8iG_gP(ip1N*oT81aDu z;E;8?Xn1=BcEIQ1a06cslv05!cos-Hz!bl`PfKkVXFkX==m=RqANq+Cgzt=DYZ{D{ zPM@}j%ZtVumdz!_jXfwPxKiI=0xRMlM!S*4j;>mZ&PU_GPF-ZiwE`W8g8a;t`+ez2r z8UgTkH9=tD=(j=&a-+H5(K{NZhs_>Q>2U+#HpY&mF+ePm?;eF`QJrVwQCM2Ll6-IC z>t9lKasKBR@pMUyb2Z4N5kzZ?gGzsbEIntLGKB-B!&%gI8r0Eq23AGw6$#veVB}(Fz614qU*Mj{0c z9k8dho4QYsBWc*v3MA@u!skK)N~Ywnz~<*;(Z9+&2T^$M+vrC9F*hjJKu-XxU2qHq!fc{$u^YZjKxJ zoeksO?=mDqWWWy!nZ_l6!^Y3R2>80s&yX*dKW{CE@Iv4{lReBP@b8DY)BEJ%z7)z) z4+aU!>8qG^*~N5UE`^oe``+**2-pf>$ldKPLAMvd!`?~S5X-3Dvabf6AW>h9J6Qv( zkB&2Su269UkW*TnC~%@DUkcrG1fSd3)@HCX3DHn8KcdW2?@1g zEZqx^kmQ#@RWe~CZjagMIcm4yx;;!$oEZU|2Ck>T&hX4nb~w8Z!D`*Q0rRsVmY&>) z7Kr%U2mOeVTqkZ2d63Goxn~Zk1ILM2gMY4*Xo9uF@uZaGK>fW-@4g%#PDne zk4?w-T0)OzjExQ8yrv>vPknba>qSquQ{KfzXW@8boe+I^;~fiQMU~$xxb1O1vEsEH zGk<`BL=F9}yqxlqR^mh)q|VSCr%mhBeW(U|2*>KG_)3@$IgR!EVhVnHg1Ep^w+?FV zu0zfneTmsHw2_okh949H=3m=paK^XDZjog=FL`N9Jzopp=bx2Fhb1uJBuOW|0hc~Z zKogA}3E)AOCCCXx3@~8yf%T10fcIgqZa=DKSmx!sbpME}S-Oo{K&}>VIqRxyv>A%Unl%n`zX-Jn4G?YRE335iMQNm=;BI23JpqD&``r< z`4#l&Sr%w4`f7O&_h1HVyVcD8+DZX{z#ia@{+EgQkB4DlVNZ$sg2hd_0R@InAv6Yt z1!ZLZPq}j_UD^(h17+mqf!b{oZ<08|ZU8D4G81eS+3yPoWnG7l40!&lOr046q zyyOV3$TBP$VpPZ?URPJSlIHtD2z+c98=68K)t{v)t#=YKi@Dm*oT*L~HJ^j){!rJp zpCzro11W%7RSg(J)hS!%*E@geG0TIs)-!L!-8A4#*fiFuh{>Xo%)B!MV6gO2PHWT& z)&m16w0gk{n^ltZ?nMob9- zoxX^5iol|u1To+*_vfHuKZ;cq0ykc5Hk8>ppZ2q@lGe-j5$@G6XIE#|pHtVbOteVx zA5m7VTzRO}44FekS4dUSOjqKlykhKPypcmU?HTa|=A@EY9bMg2EdpHziNe9T&HV^` z1$pD8X-)LMzWquipNZDz6FuZWi9YRdq zV1bvAbCp#EZ;kEJiJVE&5WSA`T&>ORC=S5tVIKd7tldaSiNGtCIXO~Krauh}EP*CD zl8Rk*5swcJw;@!%C^(%IcT5g|4P8G_K_Vq0TWN52xx{s+S@Vf!C)yI2aH64t*mpSj z5z6FP#x2R|B3UtdgTYaSrY!18hpw-VpSu!&dpWBA8%s-8-Czo4FlkGi4@>qH?+Q@Y zD|Kk%exp{SSGBy8j_T#F{F0#g^C2MMxIBo#ThnUt_P&4o`MGsI!GLKoAd1`7vT7Hp zLAE;CcNVH|$51_0p>Fnt(*+%z%I_Hk17>_l!C9T#vL)K3Y&*s~LNdI;(b@V1_96N8 zNK&ydgQ_FV`1uKeIn>`V=0s%21quMl+;z`~{MTAD86Atuq8v?oxB}yPhz9P^{&8#a z{xNg3k(+!UvD43Z+L+2&IbImv`M&u(5V5esUh%|1W$5Ve73awDyIJd}@vXJ1&7;ONnj ze*k3bes*gCy1L$L+tM{UTrX}`1S)&D?iNIY+-Kh@OZ}fW$r~L6E-g@*eQB`Q z0zp5C>HQc{~~D=|&CtWjU_RvD`zK_NmV%p&k_WAgLC?wYI8lOdc1kz`bD! zaN~tNZoFZV9LPdj5u{QG`SN{xcRt$vxsoa75-P~4tE}pB)7(>z$Eze*)!%&FBti`Y zqWi1s)Q-|o_JeO|b%3g4p)@%LhMVE`%VA?(d7gm|R9wWNc9Frt^k<}Y!u%&3>+Ak= zeaW>w&5&qspJv3;kKNTGb$lh4)(t;n$PDSy7n5A87hl_yE_l$bZs7}ajizmN9|-)> zVu`SbC1#h%RZxMZC}hff^08qo2QmvQa#l&W<-$IAao+jDAf!RZMFft8cdGrh4~pk<%6^H+(vJ9s$QPVo>|7jNU=?&u!U2X|E^Sp^Ek(Y8LZtEv@Ut;GAI z*E$vjgXpjF0fW%f%#ygOm;sUhN~Z)Mj{}2K!y-*T!~ml*!LpZv!Kpu#-oW?Vbmt8{ zdHHPvJ>AD!c2CY!E97DLlh17?D=ruJ{pK&bk9a%41E<+qKqKxMbNEfOQN$>RQ3@h| zQq-lT$~*=XDn|qCQKL19<7iRZeDTU{!<#RwT&|jM#liW(ILsNoJw2Qut?~(LVm;P1 zs`M|xT>ynzn2IL!%`e>hKs&+4@W>y@B?N22o;Bupqw$<1(%u8vOn>AueK{d}L%3ks z$H=yX$Dg5$e`nt+6hnyd$6jsMjYLWbGh-cv+B9AJx==$1{OHwWA0}6x zHAV2kO7?pb#W4}>dF_Cstl6+kbI^MH{;%K81ptl0Yby|!0uDZ+QXax)Eth?Tx^oHCa4t%*_>lnTUqUnM7 zyKsggPHK>yW=&DsDt~L_IYqQg?)KFk1;6b_QcI_oht-%(0G#;=1>HgN=qpz_OZT(A z4Zz(FJf>(f=*zq{A1e(Bxjlq0nQXW+uit~a+;1M(WM7)1F1hjtuUvs=@E=0vG}rwt z-I;KT$K)Ewi$ULu*=X4_6#HHonWeCxSSQS*LDt3~r}#&-cHxQ7d5Q=j8~+qyBDGv?2p?di*7Hnrh=? z!P-^M&)J%qmRs{uaWMGP=D zA?aQ(;5+_$J9|FdJ7c7-TI2<6IQJ&79!o)LopG{|wCaN24D4VTMP>`Wsh3a>qYdh-hkAE;5JAx^Obl*8Q8qu_JRd&bL%1;PW7)%$v%s~i zVu!#cwx&K1=`{NG8Gs{D6Tl^;+hGf%-IM#S*#EtL!A1<=MY}b+rzQ~09_%lbCMXM2 zPU4S|sF^5npLD8|Q?WMTNb`Le48lb3c=U_ZOb0wtKuB1Tq}75-ruM-rx~?;zAx2Zh*2#?T7nRZ5nM;3+m(WW?KyQ0uL23Uk zeoj9mWkYxp@O+3H8$`W@gfNl>C!{anK^Dvip9!-?XECdmcdPw<}Av)@!}E|oF`z{1_Tv++ubK-9+hd%0A)$RC?X53kM@Sp|Fi!Q z)iaE9b)$s5V$f2xE}F+ZIVKc5GX2l#HLs4|Z1Tp`{K*v9rWj*rSft6rM~v5TsOA39 z;;cDNXGvL)CX{0TcLdqB6^Hj%Rj9I-L^REkP(%r^|xpt;1sm^!d>wyv6>K574*_h4sAnnl)d zIO3g(8b1Lq2AwB;7Qe6N;K6hQ^DG$?hkj!?H%Hb6+x2oq3| z=-7ngt4YEdmlrW}giN8p3E>hKXQ7zCYj7I=29&Yj)$*_x+GQGkk3c^!v zu}=c(K2qKxHFaV){Watuqp&Y*XvAB&(MD6VFt5eKDC0K3Nn6_7Cd$ozR@_c&A zx`pkJvrcR}uMTn$8#>D6i&_~>N`J#{iZ7T?ailJp-N*js-Yl~-Hk_}NC8$*SKJ z_Z?>STZps@jtq(VogpW6UQH7i8TD%z$xeB;*{2W=E=w`gl-NllMg3s ze8)19U{KhI{wr_Qo5>icyM@MK!=jYSyJ8$`+3VG-O$-)|Wex|V@M>(jJR!@6mq5F9 zm9Czv&z{0Ple1@Giy(W5Mr5xP!(DbNyTa2Nug9~_XtA0Y$$-!+Ix*`7QS}{6IeMMy z)AWU-l1^_8GN8ch_2P0}MKLwIxIwK8%kitfPTd?LJb!>Gm9A;7W-!Kv_q6MggrDmw z5r4_HfRVE%9E#wPY?Z&lN3*Kdk@RPpo!p8{Kjbo-cn!Wp53?^l>)3Bq#|0U*R({!T zA1{3o_ekiJYytuWfboPBsAr%>jOOX$5VxCjx1F3ejwRt+x|w@DjE! z*{c%#eo+@glF)60g?iAC^jS!swfI+?_0MkDhFTY+lKPe5#fQXl^C-j*b^40kv`pobDNW| z8p3S31poHu?ej9Gr`>(=uXNbxt-Lb4n`%EGt1v4~!y%t=U1g`OGkD&4&1^}WxrU1R zExQM0PoM4WMBAK9`p^K3jVfKgJ?UR;^sHjt{S<%z@mNcj?k_-)K`pMdEre;h$k8ET zWnIgkj;x9#<@ZL{i3#{n1v`r znXmvB%GhwOWg)lc99YtiY(%E0qkOGA(kd;^y>-`4{PkIx$d+AAjFOXrOM&u^cZDji z{!!xMmLuJR{m`HrVyxOiB|)!SOexcsP&W*bIdTd>g@OfqQcWOlQOc^Mk!iv26_egA zGW~dV#te1R{pMlrKv(t+8c=7W5cdq6N^}4YSxJy-cTko!m-zOzR2qUE(6(+*8X`io zV4c&v-2&X&HbHP>A^VepW=)HzJwKlObhi!+N7!M|_OqDmq+@**)8G-A@$E7$+=nT4RvNocw<1i;IBO z1QA)8uX3AO4FHm{2v&ZK1Y6QF9p0^!1eo_6Z=Gg^^+({aTDqbqgo?zW9SC?>#(wd8d4Dvx?%n%cNNXSq&lItK~o<0{+77urc? zfN3!Wh8dpmV4*s?oqwZxADm6xFVQJAnCs*pteDdgmvNNN`W357)Zv~_MV?kYQDFHf z{9U=MF3Yl`o=4&4h{yThqm+1~tHBOhA@rahf8~@wXOXuxPF5Xd-jLstx>E^2zXu(` z<#|6t{#t`=DKHSJ_h4zdL(3#5%xyMHb@u%Mk=6gHJC(#A5x~=+vharg2fiyz&GFYa zs9a>D_W#nC|06HiYEkLw0lx@pDFxie!KQ64BJ@@gaWqUqmqertXR9 zolBic_{`0}MKyEAMju$N5*5)t86%IzZPj2*xenZ z8FDa(CvB28mZlj_*odv%5H-{6iz6-Py2>!bCmTF?gi;P=O0LA^WkSUCdWKjUiuRE~ z*{70)YZu+rZ0_5~BG|4~0Wh}IFP!s^7pEa*D5a$qt0SGoWu3W{aWDZQs@rPIpwtyC z9XKZE1AcBGHy80(nOhu_#I&r^O$7Pxn1Mz{kV8zsq1UOooCgl`fA?Y;?8afjQWZd_ zNswQYZV)@HbLPI9@6M5^QM|;}2`(<@w}feu?};h^7!~&#))dvtfXpz-#t)ab^7^HK z5S{r4b}I`(6kj2Ck^2M+QzpVOL?q!&6PS4JSYfs3a2!hVRR6t?dRrGnMwG@oh@*W7 z)#SP%C0eGQ?c?vjf{sf5H}#q$D^Kei%PX)E!}`9l5D_aBHI`|gPUj7!XFr#MpYMzBt7+dA6Tg?#=4r?1^35BZA0@wi8m zN~{xkC477qg0bwfGq7qh#Q?wGi$d}yi{mAgAySBwz+L5I!hdG!oP8b`>*J;^dn1ew zji`^O>a?IrlBMJmNR@^XrE)BwX`m0C5bDhI4ov#@-3lFU01xH1+xekW*p9QlzCQkJ zrHPim9DPU-6W79o4?>f zAU8&4>JWn&O`JU2OHi01^5aNh{UAi$;MVu7a~Du!{}Q2baQ^^R{4%GXBkA=P7jIhC z5y-$Y2#SV429Q$~6G-=ghvD{6Ry?!*oh*qF z;BRGzOO~hZ9WQScD^=#Qq2Pbf6Z6zC`php|j5={(=r04gwpHKpG$uSK{o2o`QI$;H zHs91*C1LZQ%&#e=N=w|+s&mWSf1PmR&}a}4sb-7BM@TpBVRug0uT?yt^5_xJ$p|I# z>O~>3z5I^#IFzIUpv(iOZsQ61OC?h?UrxPrG*Ha3ccOKbV?=fsVXfoVdk5#Pk43SWlKhR5{DU#_#=@U#$fwei6UJdGTzd`#q83{O8PQuZaJ7)& zN`4&@SBtY~*LF(e*kL!!P#Y`Ix@#={{l~w+6Hs7w3xoDTeMrr5?*@?AE=x0+l|{8I z{nH5D++rxKLHWCL3lhxstT&9u<;{8BJsT(i2*#~4;YQYvZyhlIa(sz|JMzmt#(+hO zn)6M^{Y=Ka@3S@$neP`X+J9v`M1qDNGE78XAgrDt@B5(fu_`P^eM-oaTqXs%!#n`X zxom^Q9n0)KBAVAp5<+m^tN2RWZpm~JVY~}NJ&pL)_;s47m?vZ$6^rv)Sb!#^; zH@GrGhmn&3#Q>Oi<>7X5nFOG$;HuLOmFU7CRZ^ph({i}-rsIlTUg22?JWvOj;f}B`cgp1 z01A{fp0SpL8Y#U8Uh&!6QYG{n z##qgy1PU^oxwG1hZ&r(wZiM)Sx~p}YTj1}QiICXGf1WvI{nRq2jVmU54DlRaE+p%g zH8BgF&X^ILYQHg1Ql-BJ;^m$0Ls{g0-H&}tFFjB$)^rD6qpwXHo{?_yROAFh`P~&3 z@?ygF2DF=gZo2Pl2m5g%<`jb06Kpc^k&2e*ZUC(-m;uQ$i2Uz7xq)o9iO1l2zTUZU z7Nigwvy`K>(y5CJc*rZwi*fjiFZJP4n_-dvRzzex8{ z)jge4kqe5>S*9-K3|2F$2*Ok`EiVrW?y6p)6V-h5#%i@`4LacM-g<5otrRBXFB<^V;P334mO_JYI;5Tg5jlV>1en9Bbo(*iDR znO7TZRCc0X>;Odep;tpOn3CvUI@E<%M%8FrlwQofJ%2_Gznrt4noF1_Ax;ligO{uyTlb>uW*-8@ykp`m3WpTWyK6 z$>HnJ!zyr{#ndN&QNq(pFIxSr`eO* zFYZrmi+A6bvh6&;|C{6_*G$8w)Sbk4OmZ5YOTNf$KtN(!jR1*{X5lkVVCcnWqC2Hg zqbI-@ZXlnc+a?F-_PfjB`mP^weWjjPTSRMq{*i%9{9*$hCDca=XSK)I;)<+eTuhkb z-cZ5yh4V>?C5)3Y%wm++^mb2uy{%I_{}l+O&bnyNf_)FFj8jW}o!_0^;Us`%awJ4V zY~k=n=jSTpzhJqW!|f?TQY-WuQi%1wX7lGymH8Z+)0odJ$e=lBO7tlq5DQemrg6AFE8%m-wDQSY{UyF6EMtidjDI-{%!;MG~#Y% zo{Cl$MoFoGB+;$)mc8ovZf0glv;oQgd=riA$5b=JSnYyWNFQTLpt}u4mPjwFjv^H* zg9*8uv?KO>xx4$GdY-e?3{5PV5Z!;?nGFcA0gU~hiH6Cn3_qC@BZ~q@-xcY!z8S$n zbMC}N2W|&8<@LN2NEHa~c0Cd`uc^F#um`(%@G*_ps{ATx*Xr;X&A_I1bEIt5ZDK=Z zsWwXZ^Ijtj7)GEbu|B{H-i8zRkze@m{vz1UjGXP*hX5tRC{b?EpUcCdR~e_f2?NMS zk#}WS7qZ+v7d?IXF0@x`@KtPj`=xQFjdAc``{qYQ4uqnzU|(f({b`kKAbg_aY#Ol9B&0Ye0T;1lSPOeb8z~-*T>#Z6%b21SMNc;W3qf?ksOPCPn zrDQ1Hkj_Vb)VN>gwKo~@r$8GURRU?VGQ{wG0^Kxvy8Iv@M>EAy(LBOGRYx)LVG-!)L$qYjY^J5s zCmb9Z(P1DLam^_?()j^IhOvQ}V-*53*Mv=Z=N8HeXRE~*u`Djn2q}{9t3Y3dv*phB zbw*NdcAFqIIn%UQUO9jNgMvAKXUqnV--BIe`H>ba4DtO2kMVN^1nw+SwP2X(^2wKZJSHm`nY%0NWNz2lL;>146d4xJZ~! zR%xlzq~@4~Mnv}ijNkH z5DD)V$3f=!IDU|1GR42(Rr1t{b`w0(dF4->C#ce*FqR*eq}jMA$VI-5ibo9%iJ)q~{?=atDXnET%MSfnkGR4~vLbB4C{ zbeB;qAgvR>TSpTM?GaQO5VA?5A@i&mtO%0M-#{BT%ZLkQppaBMS;st>0txx-Tgvdw zkCDnwMpB4NLM{f^w19RGJ9mB((oF86yfniN9KaP#e{rdY)h-^g_oMB0+3XlDhqD|6 zqY(VaRg`=w@tngnR_iQ^VW*>O^5!gXrh8?$lx+uzMa&Q3%O-jv$XyMH@p%iDloNrC zse?syJMAn#y-<2hMxwfFFQ!7y`?Ra)tDqa$zs6(jBUoBJ(-%`@cGvMK%-sqOU)_Py z1EL|ad!aZ5l${%XpzQzg&&R}w%b8(T#X8+bSAd*C>Y~!l;3+@9Jq~3B%Y=%X7AW|R zfNKCcw43GaTvq_D6JW^{ouC{kVXQ!bQGV8GNqdDEUvVxXac+c+=16p;w0dD=#X&Bw zwQ-4-3d$YTZk|w56?eT(Do)cS6zuRv1UTM*N7~w zNJg^YBz6fA)?muwz9NUVlffDt1=@{S8m6xevV^YVUm~SY_gYATb4;hAUy3+rQi}18 z7DuOdW;N5yL%?asX}y^%hP~dXjnmwjOQ1w~Al$6p3Vsx$kY|DJRoq4M{oG5d3eY)C z%xbTfUN6B}nL&Dnb9OZS2?8lfV4dSIgtC^!taR;owD)b74#B?!c5bLsb0mKIY0E35 z(#-5-`X*uG1O%1HYdgD_yjXt2`_jY6GQ%Q-w<{f(ds^PI?G=uR=sw^DcNXqSV_2FM z(TIbTM#5FP2>~~Cv#RcNfaq*O(w{F?LIP7@ABQjUoIZZuefUUX=TV8gP?Dk5Uc7ujNA+=sHTT!s z@p*%i`Tc_!gw_dOX?;kfmT{sXKi}ImJTevY3p$FjB^v))5t|m+p=97FN~y~(`XUEn`Dtk?^DkHA*gwAe z;EgySmwwbj$?I{F%3s04p!9x$MB$zZCe0n9gRyY@HSLO;2LfZeR`7~@IFPGAbp^}~_xiJpd#zmr)(?7Q3lJ3zO*mdA0m`;k-bg%Gu zn5kF+db+yWKS>hR`y#&=R;+JER%Dv$R?btHh*DLoTRqUeT8vj$ZB=o7o60w`U&^ru z(mZql<)LUmB(a`5iCK(p#8!xYbf(ArZ6b|QHTckV9l4zW@uG6iVtKXZVse3WATo(+NFZ>m>OdyOti3#}j|l8A#)+A%BRZC#v}r z^O_rwU&usoQIz-3R>|%eQZ$-eRF_WIA)WtK>5PkOY~cFW;9aqb<&Te2EwKaGP6PMu zoLlL0SUVUJtJIC-dvp*zugg+_96RIARTy?$pXadgCvT8u8UG85ZRpc^+H#nQ3DPhu ztA#zQ|CO8gipfT47^-=9A9=YUz5^$W!Z$h~C9IRJs?HU*qUe5O8J{TYFNpI83{+}L zu{pNw@kJ*~DTdqbizmOVIGW7V*Wj5)#<)X$T{ z#+X)@oP--k(Kn2*qC}_KB&(e;wjrTBrV4X^J<%oW=_9h2NelZeBY`D<{3Y^IOqoVj zEd_h0l+48QQU;x>*NjJZdb>}9jX4)+!kD{5g#zm$R@wfm5V7Lj$sWezQdJG}e&4Mp zhm>vCf#nK%-TU})3?G>9dw`%D+x)qj+-@ms$_R5Fkc+f{05&4o0%0`kE>7r6Y%72h z_e1R7V-Wt@89I2x2x59BxDJX{(?E!%$N*C{^tj{vVvxbzJS>j-;bp-0k_#J{+MtE( z+!#VF^XUa0thUC(h9aiMqrPI}j@d5kc@aZ3GQaqHH}|$Ph1m9I?12j?xN;v@K)WgM z+rm?dIsb4BhBy-B=+nM37=-&?n7t|>=$N;b2)#PHD$EAvw+59g;@b< z1qp{Jafu@@1s^UJ#nHR=`^y9%nKerB_7Ub+VX?&rXYGrg>7fYcuXt*|L+Gu|nSR^H zo|(!Aj+26gRy@fDGpdK@J=H|U^p0-k*GNvO+DHUQ)FZq@5j(dr?|wkz1P|;_o?deo z2%sT-Ayp6%F*k^XMJzeb!tX1}yoW^Fh5YMwqK~e%ifpzkU{Vn<`^o{%g6H1=(D1eM zt%A%3K8tGY?;;6O+es7L?!FG@^?v)!`0_h~jw=~*if!@uEmMjweV9}t+TkrkAfGVT z;l?4p#dFCPqA;WsRe8=}%4b_*j7YuiCFf?1!=5Pal80`0=h6(lWukY*tTfV*fj)ng zF_f^(Zl_1mx-6-~MbQ8kOcScnC$&7OhD?Y|iDf`cgh0_@9V(W@+Rh(2JC+bH%yvCB0(Wc4i>j7H;qEH=adz9GXU>|)zvnM=DJ<^ zeWM?{plf2!7Mh z$H9oSDbDpGEv5qq%1r(-t(caDVnA( zE==uD>@f8yUhQyGDx%%Q$;Z;hLUq9wHb&I22zNSjimC;yCw&UVKM56Kl`}7D zQNc?-Fsg;?riQr0tRky|+g7|T_mzbc@682z%%`0>7rvhb;oKHqIR5zdCGBufe7>a_ zKh}G>uK59uJ#4GW`Z?dYHZ=;zgXG(WxnFen;GFZy!m;8 z6cGmOkp4fu1Jhcl=NV)WS@wF&9e)QYC&WyyvJt#QUHM$B67tnL;QPs@Q^gkd3=z2q zv7w;%+Y9ND88E7^l|TQqFwkmw(YE%GE{mOV7nK2Q3VD?x?Jq$nU3jK}LpQ4x!HjYX z9VHBkpVPkA?!DSq;wz~k^#hFkNXNS`(MjTi%ZjAg@CY2ec=?EeKtONFaZP*|!OsU4 z`kFU65dm@S%|$Vf+rTx~!Ps_bz0H3jN_<0ks#qFXC;wYplkgxUOi?a4=m&x(*jgBP z*mb~Le1RsEq^SZxmIuJRp(H*dIjVD0qM@qw=(jo z;K~)&&Nv;!bk_W8yo(r{VHWUATx_%T-JOm~kx6?|XiQB{M`Zz&VIG@88d6Ttet|e= zT||iCL`*_R>f)^>yo?pAWMP{wjVKjidt3j*E##L&=N=s+<-|NeH*FN@Kyp}xQVy`M z4w+==B#-rSHkUx;Phs*+YIy2w|4&cKmknrCFsAmAGgBB8wWHoIv8A@TN$oL{cnu^aKzR#;XI~pQjx{>*=kNAic;q2#}6nrdBSEdmONPdK_}J0G%EW zPkgf|`JZ*fOiLXh*brn93lapB{mA)4ULDUDl^PT32U62qKkO#VqB>^hpk*k0d2g#X z=h7GE51J_SU6TQcHoC(Ur14PuAE*-R7B8i#21~@kEx(Q<=+irEkoDe_IlbQkk84p@ zU2R94+|k?25u2;NPtBy)@TXWk)|J~{z3sn>+tldKwTF&eYN;Mn`Wac>)Y&>UpVTPc4}{Tc`x3MdoQ`%-6)?86v0z=eh9xIwh|FCFYy7zVTB3rl0vbV$XPA*rT;DM zb9;E^&gA*bQ?ZVQ-<+-?Pdu-XcF(fur4cM$BU?6I-(c=ht>5}CmieO3ouVyQbldf= zUw_fwO!UIy@(tlxBGyjMwenW2yUga+?(NDLV4-UyC*|(xAZY+oaxS1C4U}P$JF8gO+Y$(*s z@Mv;&WfmL9)!}-anbauQ3}$B0yw=M{|6~7ioB#a$$ryT6-v+AG)%j4sLLWi~FIKyO zZaG>5{3s3pw}MuIkx)}_h0p9%WthW@&s1hY;dZdHfocTh`q-?@e(Y*DD`G zbz|0CG0N(#I^G3T4aZVaZH;V}_CBX8ggdAcCZlv6d=Au8q$>|v9?w4~gluYOu+%#L z?h}ZMf?se&D+g)TH-r>sj%Er38Eo$}{X79T1}}%{mLuS-5=Q8oLUqD@;N-tBkTv5q zM^O$$qk6!i*pT9=l}AgU5){CU0Fj*!O7=D&rqc%h^rvHYBb^b+bwr0I-_OH(uG5Fg zb`C@V&mb+D#;5V@bXA&#NH(bOT^A9zeg)orx*?o2hHrZ@>v94&l^cv?$1z6DLSTLF zbGs*hept0;Mv@#(xQo&6k9sj9%@75DkV>W0$W5Q8u`JrehvTg^pfm;uSb>9$vKOw& zM%0M1SMyRTeBQ=UU;X3JO=BDQ=btpj0iWGuNwnG_ih^VCC80FWBXr8%z^SzcZn47 zWf|6~5NVH9WgAWgQo02e$)f2lGCVhlG!S;_fsH9+3!Ez2U$zD)v7nk|n0KVzS-tX5 zLYdb)(`zK;nRKw^b14$;Z`s#YzdZWy@;w*xyCE8enx=-+@)o6DSQZ#QQ1w+%)8CU2 zIlKpr*(_~doGmVzRmP>7%YfPWM;{Xg1sb0zxST$3o8k-JmrgSIUP0l~r~sQxrGYD| z)hxCNs>hM{#snoZf$Nz+Cv5XGiot#g#mEWo#n-AM>>4o zwpdbC1>+sFWFbHPapI7)SlgwiOr@~;y}M#tk1!L;YBT*_#6m3jw8)F#E4}qUR+q;m zZMZjuy91RVJ+~AI<(;cf&(<*~!`P$0w{@_0E$WJ3gN{Kbe6ga)`7doMo!FoZWyJcn zas!x2EZR*yy(!&&C4ff4SPbd!wgT|4N6?M=^vslts++SH5D?bTA6V&8IiN|iFIeJI{k=kgHkq~=3P#< z$!sd4)8*=7UvEv3L>R`4G}UYt;8V-uuFVw};ZK&0c30XbN|79>I5tf5hJ`X=?@xJj zpZ+4;q44}PvdZ(^pbbG`1H7UkvyIN}EJItV#rZMunPPWaU?-VLtq5kp_1zo~H(!T< zTz3e=e`x~-=zqcnaOQs+LzW!~T0m>_AFBfi*zO_IB&bEIom;7YcWw2yuy^;?v55jx zAdYl%RJJkQ!ylRc@i=+VBcxi$ueeA1%9=nMS@?WI&ar#uhgsbXpx<7(uXDK*tJi%K zPZ)P;+N{av#?nr&nWsQ!Rn+*GICwKB>nsp2XNXhv5gVa>>MnS3*A(pN06(tQ;F`%^ zpUd!(T)mZuzw(Jm2VW;1p=Uc1>S*#!=eDyI>G8!I8bv-S$J~icS$iVTLR2ddb!ldd z=O0ZzY|0-bC1jLa?!B42JfSDJ5wn+Akr5JHP58`at$#zt-3h$%oEk9;M6J3DFyQ%$ zFKv2(19WB_GbLMEI__0nz@mQsMG)=HDEJnO>9)aM3$)*SmX!TtJv&{DEeHjSNWZL37KBryr*-*>es$&o9lx3HXPF1(Ehg z<)f=*DiKC_VDP$!2}`o3Q)DZ^&pUNx(Ndz~dp6TL zkRq*vmJX`+!ps)`99WE`ZOZAigBC%1fg{T719IjVyz6tFo$Es8vL^wF4F;)ciLBVD z;w0%WjLQBh-sDlc2JxV~Mi6>70fxTF0!o(6?6|!#9!_rHEErtT8v+x-z`Ul}@)JY+ z%nkX*R?fvGU;pQ>`6Q88JC(0=qsh$1fC#dFUgTg1D&t(W;2j$g`WLI!}Wr__vG5nd%rLBK*7CDM2Ds6DZ0@Y=t>VBw_o4 zsVOLs=r)2*c6u@nCk4yPCUWI)Lij15-P0$%`J^`^rbARkqfkh!%bIYU$sVDcOA@H% z>%r-(t%Cz_%HZ@b;!fm>a%iLZgdru0EaUv;RggSU0;M_HGsS@|D@6YHqNg!xCx~s) z%rxRIIUc+t356bZ%)y+t6Nlf9{RNzgYG(l(Qy2%;!ksJKK~F)YN*ZL{H!=2Un3w`E z=)!e+xn${r6`e;I2FQArb{*xkVCEhr_tN!xTsm|9@FhMz!&ItG3)gs4K3StD2*WD-E4 zB8pErmm$5|st#s3iX%?XppeE?qOeW2rQiN>-^%W#kWvD-Nd2-LCQ&h2YLd@2%}cE$ zwG7v`rH#~k2m=ft#n)tu8%Cy7{SJvK^%qe#dKgCr9sH?pd#Mf1Fp@0g%azYKPXk9~ zB4pc}ZFbnNg0N6yi)`~&DF<|uYXRDdllGew0y5?FF;Ur@K-%~LsAb&53+ zVyMU8UhnQ)@2`EcC&0|#5h1ux1=(p!6=u0RB|Irt*2FVhm&%$Jr?@yPzl<4h&Qx$f zmI9UQfEbnL=Yt_?D=G|$U;T4FtQ5oF$z6Ib2{ql`l`du23siO_^er-1vjBMI1kOwv zWl{rL{W#PzN|9PHJ5Qh`W$A{nQb*Crz5X9t%<@f`J3>%}Joe4!+!XI{WBlCL+AU87 z-3A?b_~yGhn)CRqad4`i__3Wkp)udNN%zFPi;;au-*8iDW(CjYdGzPxkb$uqt4k0H z9k_r8`RTvoQ(;}C`FAys?*Mc0-51Dp61oDt=~`TtE6zxRJ_Qeq3V($dnYG#d7kIC$ zx@M!En~55#ZTtD)&Zd4OIE@}x|Qqh<6q zwADeUw)%p$0tG@FT^(+vI+RgD`%F(R~sazXW&9#;D+}PF3E$>22M4 zTl4$fZ?OAUI=k~IRQtUg2rDl%U3{VuwgFslOcI9$-Ds{$-^{ls7BptvARbi3l539( z21Jc9xnj_5wasVrVS~=gUnN1yNDns$A7Iu?>xz6UfAo$;WcO}}9v>x<@AK6n6IEYI z(o~&W7;OvGyfjs{hGG~u`RFHnnui)}oI@8EgG$V2zscqanK45S!Aa6*2mbWvyEl3} z`r3Gwhy2fgfsOe;);IS5W9Z^e#O_O83L5NYNAVqCWkv2fb z=r)I>P&QGxw>+Jv(x+snY}P>F92jfX{qs!h6-2sVum8i6t@AB^ejOfdj?DDyh|}MO z^t7(hwU`8Ln5zEDjEsIu%5c^z+fGHP+q{g}l$f=(BRTz)b zhja!_P~mE>m})OsfY|T^_Sk5ZT&Pf6l0BWfBMY6EYHtYCV|>DD*0@!sTcqqkFg@y#Q`xH*b+I%h=xHZwL<$r2j}h1(Ai3 zKQ02zD8LYgOL{S1ovO%CzZ0KJUWxqrwl{r@5lzO&D0b?P2T+!=kbEa6bC3S!n1a#z z^Fg%nk;ZnX5>ekifWsCilFK=zXXK%Z)C@=Zu<(s_!COI!Eg0wW?V0BQevM|<$UhoJ zs}ziEpAG4v?K(3D-UZ2kw-#I8l@fgBSL>vkY^SvcUg(|J^KYMS6?{|PM13B z?l0*UV+`{~S;RQ@vU5z;4h11A3t5>3Ng_(-jdGxcWFf1bZR9sQ6{-0O|F&)mmH=4l z@vQA$ZV?vacxq};Yg_C!rB*b*(cs&Q)cXjn>ZyoiC%~T%vDgUOh#VR;O3WR}=U9`# zT9l=Kkmn38C?F97;o@l6IL77Q88d`|GxSSh0v>+V`g(BR24{3!uM=#|kUJY$O`&rR zx6tJ*@H2ut_OXPOrrX%#oTAIv2w7(j}0tWw;nyw@$h&Ld-wyDj-r> z@C@X07x4Jm1L3oBT2A6PBQ6KL4yF&$=MQfk^4vhW9d5}V7~h-qaUe*`*s>NzVAxb2LTE>^B?^63Xq|y; zL{*8$8+yJcC9MmWt6nS|BTuV1VK>*+WcGEsC-EtQmae1Xd!V{0-lM9P`z%`tbd zqAIvRy7V~yaO+xS&!C>t@j@_ayHx_UX zK!Mw$&bqgTYi*z2=9-c7!5&~Gpfe801R%`mMlBr#&oK|zJNH6}Q2n2}r${fi=&u?= z)B|N^fDr0rrMA>(4WCDfF?ocN&PES+#;lO|X;DELb94E-nWSmS?H%>`4PTwHhZ}c| zSdS$3k!>BG-Hbt*?g;xozo(C)xlPR1b)Ak!A^c_2t4N(H@u`P<#IN zdzYck{B`>4*Z@{U8pRva!Y24d4e0!8kB!Lo4HdiPHiN=U~vXTrDw=n7Xki>Al+TEY+maqnl{7(6Q35!zV&_(9r#L)z_7 zHvX87yx-CHoPbJ6Kn#8TlX+|9#>}#6>wqf)c;6ciwxVuF1(z1g7i zj&$x5ZvLt7OuM(mfx8dfZH6-CEv;-+U_>i+ssa{AwHulPAU4tB&wcFKaNEQ}Mr$6C zt>^g_LVJr4h+^P6T#eW#OYJcgf_J)KfqphG%+EA>- z`m-g|gjEkce5gH$GS)Swm{dgdq!gj#=-mcfyUx@Om9zQ#Tm{%cytHNR3zb|J&F5`J zc>N*d8hs(CBQr8QACj#iJz3Ln+ilA5edHA!3ej>S7Vb7ZrK~5IWSz;1Wj)$o`VHe& zd>y3sE!J_NT4qN@t{1;WG5p&DL@j!XeO*~ZExW4tuVT?+Z#ddt<^eYVhbRVF#(Byt%&8qstw{7uk9}{ zVpX)2X@NDXg997xvLv4ARl#8`*m8L#&5hEIV|cCSR+2z&nXHcDEjJhclqTT z%&_-w%#gHrh>~h#1BUevEAT%~18p7q{Z>rBnHq=fpN3P1>d8|^la7v+TZ=2?H-Iw3M2HZHuuQ^E}v$CE}rcg zBOwK+6s_j~6K*vp*ACu{*F2#;-=%4p0Y|W7e`mH`{@v(198R8;uN`-YdRVhv^d6Il zb0_Wb?RaZj+&I(T2evpb)mGqWol-^ew>DV0ahXGM+c5c&8jZreS_>lW6wNdT6_m&^ zpIBU4S)Y@c>O)4wuFMgTbKtJEAx)_bSH1?LoFbDG8^4S}8eJ!0wcVX$_6zKe)os!` z#R@T*K~98Q>c#%g530G3A8Rx{14jBl!xl}pxNV3MrftIjs1&Q!lZ2S_vR<2QRQbKm zsq@2V2xW@5Qh6J^z%F>*3_l#O2S!*`}0c3BcaCf)9-H# zsB_Cw&1bnAdRqf zg4~8~Kr6;bMMD^os^+Dm9(JgFXcWzO_xUREGV6O=Qf`xy_SGxYmAPWN8M5`1U$c!J zmdgDz-Y_{17s1)Kv!<7XFAHgibKt%X#WCV1Ct={|Vb>f2VE1o^iSKSq3Sm2GEHF6e zyUU7A6#Mz&fQN=EZ|i84(=oyz8KtswxPcA2V8P~=k&QYGvp*EJV7BXy2-dlgM&jqg3m73&qF(z=;Sh$$RZ!8Qwbz- zEdzHItO@@aK)F=vEW9q+BN`7K`Co%}&vw&R1-@A6!7N>BV?^eABcd(tJn{vvnWEUe zXgT`=D|o~2uX2mKHB*m`-%W(w{6BXZ(P?pBLE^rtXZ4h!BX;xMkeD=@d1avY(UB5-j&pYTIZi23>fU1JUh8s@g@Hds0HqPR`3rSIY?v z+t$F?sQ8*>@VcyJFr8K~*vpOkZ-YWNC)w);fa#9Ac+Sv$AV-6EZw&o2pxcDO>d)QL z`Xnt~u2~I!QhjigGFR{&dmJo+gq-EpaqaxfxpQy;Han*f^_Ycjudfckevd@ zNwNQ@HzQ<#8{N%9SD#7QpHLFP^Q%hj*np8q(4e*2mQn-lHucD=h-4FvRAYUAC``$x zDQM`b?nlYk*_N$9b+oZ8IRt;DU;Fb&v}80pMKJEcFKUZkH~I6U=+JqTt(|TIK-47u zaM^P5Cv0`LdF*dycnvia1OB?1r^!63pM3H}zDyNOvDFm=0cWXE;<^qs!tSLp zK|}*D9Tv4AbNy*9m!N*QPVNZ?0VP&&cdbs?8zOs54VA3bh_*#6ymb~PSTV2G zKcX;U^0p@abkBe#!K*o9OHkbkL>1gv!9d?SG~7>f!$k{74UHsL73s~ zp~LH0Fi4&TP57r~g(Yb(JImiBj`};l2{$|g67U`(Bc=@Q*>>q!{*hpmytf$7>!ACh z6GLHEC(wa?b#AgtXSR?<1FzoHVeorP(9|Vv&&7d@_C0MGCo9mnRQX&;Z5oUu>KZf$ zSHSL@5)$Cf&K0DQn20J^0?eMpoyTCh1>4tl&J^of_KFOlGNDI3UJLVq@GaV2&a^RI z4~M6D-p`Mme+CrVM3TF4lmz_)AKz&v2Z55z3Be6L3_vu`)$+a2eo=!ZZ_}!B(qknR zk}U>G4ay_iwcX%y7b8Ry97eBrtb6Lj=F0EKw_uo&pk#Snnr5+}fJgWLWmy}|-++_%` zh($f))-KEKReRBUZyEZGRt-1@cD`#0TAVdIkjdV=E?P8WA&K-??|#vhS!NtwWDI({ayf-80$Hc=Y|&@$JJl^&W8(MZWMJia3-XcN5MR$HMps90uOAer&SoA7 z8}>+EC!IFE;wz<80=lWN5a=*VdBGf2_ZRes^hl??L>>-=I_k}{n7K5f{*x;MO*4Nl zAX+BJPXX23;Rz0A2@R=7FG);&3_k1;tTA|%mtQtfW-D*SfYRV3g`>qAoXrIUyGPh8 zp&L7q53GSM?~U&JiSGLbf+(0H-;ccMnp8YnNMR{?uO(+uD68X@L7VijebpYj-$bZz zjoto!Bk-^O*$_Bch2(wB)8l3Vg-7%WVrSfDE!Nuy+<#hehE;0Zu1dQzLMy=s!G@47 z!F~;?@@le3Y7Dl$kwD>I<)`TWEI{PmSsSHs=)azUD}9bgshAsGp#g#b z`&b!d9yoAJ&mx$?CS|DdU6X9s>U#(mcLL^M)>+GED=O1kX#ZuV#2(gE$4MA;aCUZ{ z{|}i&V*P)td=?%K&j0B`b!l%a;q##Q%^2*CJc8DYJU&B<{<84iP;ZyTyf5q!;}5Qd zT#T0(BWwEl@NJ-A$LCxuJfWCfOR}eC+n?FT9r3P+cB5CNK3(BXsE3F*b zfHWmPl8@{tQ6nAA(3eP(%GUlz1ct_R)?lnSAk40@|7znCt50LBUUUg>i(Hn2ip0D-o}k zs5^;R!Gd$w!X2Igd7SVGWvistOhPE;1#^pO3N(vp5eg9=6LB;aL#|sMqj-tH6Ev_1 zC~K)_QO?3lSF$=B@dWNelKx&36!HFXPc&F|@776}(gA$(;brbevH-J7-O&CW64K6W zab%Iix^8+E^1;wC7~0A+u)e)q2nJXUthHj)C@IukBRWt3luejua9{^_$a0ukKRSe$ zF8u(W-Vo_ANcm#$o6m_MMilPW5UP$ecQ{Tt_(`CDK#~L6#5C%^&$Z+vS%4%dSad{1&-iq)qhth&=!UlmQ=2n5z2N)>$h1wufOyXH(@QL_fCP?Qh5-#Iw5I`R_k_` zTX0ij=b|G-z3_+=S$B;xNl{_!A+#b*PrCoQ;RqT4g=hRL1)b)u!o9Y83>?O7G`G-|t%=!B`yN$1(L+<)#1+1J$Dmrz<GH9D}8TGr~QMnKekaA5X8Pyw%uKn?9;c?G)<~f=k%T z`z=!dm+QAcf1F{PnQM-Ho~@zkzk9XacJk-C4TQ_RrnXR}O9ND3#C7PpOTi)DXwi_1 zsGf~5@_m*vu&Bt)mzEb!?uJcG6gyM?^zpJEt~H%=c~&q z56!;~7Vi|Bcq%?i1;1Z02XL4hPeSN($BqheZze#nMLV%rXU-BD)!p|Jx>>vDmv3jx z#PrYir0cdc={LFxR6W_-XXr%MP_kQZz!Yb``d+Y7QdbbB{eXE~b7F*$vf%7Suu(e! z>TOB6EeRY#3@QGLt#gXbENYi^Y}*~%wr$(CtuMB1bkcFhwr$(C)A7l__t|@#i*vEo z{hDKqF>BU*>#0v9T_Voi0OmTRNhl7?uxali6Z)kX)nwmtbJL&{X*S%18FXv$*D@Dc z(xgLW6IczTAqFh%3T)i)h~_`-`tIju#robCCk5N(9ceT^6rK!D+Zrp!6p%;NUNmhI zUNm#nKNyN5uEO{(M9N+h$rmsAeq+4Qm#nKO_A|;zz|UMu(J;xgvY!f6&@-isA4QnSF@>XOfcX z&C5kymm3Oyx@b2hcDiV{7=-^O7=nw~7_0k9quJ3cB_56M57o2cd`!_!9lBT1A4v<_ z?wQ4pP9$5mu5YUA&x?3b;Y%biqTa&@+u6<1Pb}DYJS*0?A6dJ3I?kTeAW&Snu~f=e z^u!5_epgmDcj;YfEG>E7qi_BR~tAdgY zK|6Q@Xyclvl6)rUBpqsAU@G)4Rw}38o>DgXh7C5#U+?5&#duQb>=sq_J-lw`d$FU% z1KHyX=-TS?fm#M_R?1dKUMJcu#LVabbPNIR*Ky_9ysjg9n0QAZzfL4YUo0CFah=U` zvaM=)?AP6S?OskiPUDyW+xeGzGu?|1u^3v{meJ`mZ-qJ&#Ye==P_}=p;a^{EwmL>O z{M}l%tE#r@F2|uP2v~@(+7;9>#l-@rMVi>>KLul1;lyJ})AvFRQ$FTW1O0}*lNrE@ zm=Q()7?v&w%CNwRFH08A3MDNE8!P!=Css;~>T500ux;;WB~Ki8OETYUx& z!(*?{rtaHlD?XyhDK4&kbd!qFI)qgxri)B#Mco;>{Mx!Zvscz@EQ$;o`rqFtsP>Dc z{F|brCKLkElBUVg{)~FxblQ(FSR@}+9WA$3n#X*+S-2Uha@4Y&C}$r(rJupBhs2GJ z&D6Yo#!rSZFU!k2DM&uMHoq^x&>8sVOX`s8C@I z>hy&EL-bIPJp0d;8ZgIyk$bpU|8JoANL$9?uob!cUBgmA33LJPPHu`=bCQ?``WcBZ zA{fsdGh&l&V||R zWs{P1nNoH2DN<~N|465(4j$6B=~DC*_n2!n|GT4}b!b zm@(YW!OBuhKrMA*{&Nupm6WXTj{K#xzh62Ly~9BHXa*hn3gp`DrV=NfGONNv}7t3;aOn~8wX(6!)Az?O?vjlXI%cyO0#mLaVqDM}mCw+n2 z+^5byWo^(=H~6kC^Igdt0Qg~Jwyvt`E!jqS*B#Cm3w(CdoLBgSIGyJtxI9)XgSgRQ z&qRjMBax$ESf-{H2t-7NpL|<`MSG_K2UnI;2S}4}qbUVFF>AbY zvyQp>``hPg4>3SC7h1?xHCs{>;hj^sWYOk6q-^L`3<96z3!f~EgV|By7Tdan12UI}qi?)hRltr(`Khu$44V(v8}PC-@b45={+ zPjG&tBG8~b=>HOf@Q#9oZx>8Ze#QawoB4YmyT9+KF63I_o25n~h3Jl#@OWd40FE#< z^Kg>v>^s)T1uzw+?j3rxv-_!|U^hihkqEP7b@bspM?f;bM2>@FQ*=bUqY#qM2jTMT zM}BSL7VgFyEnhQo;6}fnYY>#@gFl?kq6Tr+J#NOy1$JIfh{+}i57u8|VWNkELH&V& z0tR~Jw-`?!WdFHdBhivQE^p{&<}?vu{Baf!fQ>D326QSs?0@k)+wKS8-Yez_3yrIX*?Vv=RTd_WW5N6hqaI!FGQ4p{6zMU!U_PPY}3deb? z4I_IrGW(DUDg+;94dbaA*u9W7*Eru{~_1Sb`c~w37Ify zndqv(gp93R1%E#b`#Qw`R#BuFP2j5roSFgg+%X5lF@RnoQ=BV_?UFhfFFY=mOt~mt zcx8W;a1i31((S5vwiwv5%fZcK0l@=8H_9ne0Yxp;#0?Jtd$nY4=2|O{qcUScOD-&r zw@$mex#6BpD*1!|;+e=i^K!Z~cymJk5%sYoS^i_+`=lT*J^DFWvjUwc2egC;{03Cm zyKgwx9p;qo4;WL0$iC=14QQU}J27NP{nDFpYZwZX)PSd~tpxqE@T3xv+{gB^gpx;j z4&c^2=xcHoN85hAn?zYDhYxyr45MU8xmpsQZ(Q57^*9=Cb~52oXld5NY$Yls$(TAM zU06V>kd)e$nwmey0a&eHS92?h3!%&1)XudB_TwOu{tes~+L&$ZpyQ}+p>O6mT8?x- zdaicc+Ec-Tym8bULvfaoxuz2AvGbHv1f({UM0?+@RPxc(|>}XCqvJ z>Gwlo1g^4}k7jrv^C9Js6w6+Ffv~}GC1Nkpg0EQBX-PZ=QvS+i^e*7eUW65Fe-kg zwp|oO&}K~m`WV3)XYMtmNzAM~fW>AOfkZ{NT*H&{wBSn@OYMZZp3TN`rCoNBj$sb! zI7N2G;uVsjA^IQ`Y8KS<>@GEdFSE$DF^P;_#WzBE_kcKXYc7_>l?00x<%TccMhvo`$sSH@Sy;T@6|TENRV&(3-GEMlkk#LYNpv_>(4=!&j~rp`Hjlc1e+hVjAzr*G$5J!)^`pRc^!1 zqq3Up(*~lfYyH+S7vS;=rURBZJdjTd5M>!n!Z9`Ya`6kP zNrDoukz{>Ua4>Ir#z(_9Z_+k#J61<=M2et5?fKP;Bo*epoqjci1HNI*`qvW4uF=LY z)dN)TTh6ff`>OlV7LP9PfQ0LJ#ExSPkiRN_IqjaV8mP8v5Htr96q+Zc zi3*_ws>n0XIsBP4z&H=J;z3JFG$q(_7-wni)R6yaZa+Jah*`pOJ3R8>Fo##hkDit` zH%MSfO|RR9SfgWl3@#OX{lfgAbUHTNzGdMx6#mKY8IcxsvE!Ovn|b9317&m~dlTe) zn9bs2B}3okq#rxG+1fM6O4ZS}7>G>dw?4fgoh9-=Dif$2KyqPmTTbZN`tfv41qF6B zKwmu8$4)B=7o{V~Vo>oR;o)$~-xq&O!h9t#!$& z6HJon_v12+ILs+#?GyMM8NaJqHl@@0Yt+eY`wU(dfRiZfI7A`=2OF>qaSMK;LcRcK z(i{uS2<2&}u%HWH1zz-WWW=8TbkJ+uE&P zo;Ou4x;=Rb%FcA^jX6}hoyA`c_@A6IW%Q1r=OJ%mq>Z-wX&dia^|>vmoEpJZ9)*wc z;SSjV#0vEyuWZIpmYR4&^9MS~T zTYPPrzUv}BDE2eb;3=XTq+eL;RJS{S^2L<_8t<()nFw%5jsi~H>FNQO^qrfMiH85W z>D50|zV7;CV^)uLS%S2m9c3RLn}taI9KWmlEEL%5_>$~-oOw1)*UCTp(8cju(`bAj z8!pyO9A;0ZA!%X9iJ4vUN`KKA7)k!E1g^{_xO%iKg%n-aiPo;`hz9N(G*u%1{19=( z@`1W5y=_N33`KuUL1LR|2(1*g*k3 ztOYeqf=>{sg?MIU5nQxh`>RR!Bzb=Kw&Q>v?XBHBqD4|lpD0$Z$>1->zO!lf@AyW8 z_rt%l?d?`7E7oLMx}&Xa3o5r(b2OHXDS6!19wB>XZf489G&QzeMx{w~IlcQT1EQkr ztvW0M;O9h{#d{IeE-hni{p+W7Qg0v}oso6tT6ED?EJej*9qf1Y_{glNK+7vA@(J_Q zz5Dyqaej90?4%WZPY@TXsUPPtXQVRqc{6hy!ORB!$3JrXqaAuHEkOwsK9mKjtM*PS z>}k%^qXCKu3+X_&OLGcvRQf`1Qr-#>Wuwv@m=mD=fW1$l)=GA;|~UyrF* zfRFY;PL)dL$*kfNlZ{-tq|;y9hpn>(D4NuiI73B$uZrtsaXEI3^qVkmn8*>PWm6pL z6>=00H%I)G}JYpo8Skzg_2g!E+7Xq52~p(K87fygaZe9qsThEg1>At= zeOFzw8$p+)&pfwf^o@^Ei&vG))_d;0o|Ts|n@g{Ipg)zSV)vRFryRVo2?@NV0G?a2 zD;+ejVth&1`-di}+nB@|FZSi!+uuG?9S~-rw@1-P2O(#?*ClVMgAo+%{oCF+a_JlR zcr;=E#X=yepMM*Y@ztSx7fvzwIzX<2iVX29r=;x(hIIbim$^#Z9QBK9tsk#Qwj)KY z^1xrYo4KVkn(c?a9*;0th$G@z0o*hL?IL-f-eKBKj zm($VSfn<9vGR-sVzg7~T31SS8w>rvboT%dASt(vzC;}BwSaq}FdE-9R3Jgb>cLWNu zg!cnligyt1$;Xk0m`dK;9eS3@t_dZw&?UV=4nOWXa6F5GArJiEUNAYo184$3XoAn! z#RkQuLP!{2!@`6n#Kb>##=Nf>i@X2C0Ue}eK?{3fc~vV4sS7 zh0^G~HgF*zf%prcdwgMuYeUL|;CjjAe-R4(9$OIEyCd>VxfMzYSGm1t!BJ=)Uj`ct zxvgmrkD@HQx4w-3oB6xe2v9I}r5bcNmQ41)hSjgSVBd=RKPUaFA@ zr1iQgD1kAK9H?8>W2BwKzh-Raz|fsK8`CqE3Z1J&zT26D&FPUDM4{2@P3qp=n${f^ z?J`XNuJ4L80s2O)O+wUH@e=sruVI8~j0~j(?3A`r15NTyG#ah&J(q2oBHgXEv;Sq5 zg3O`E7}S*P+$}zK@}-Q#|Au`MhO?oyFBDD%S8OZ@`V-RC$E!!FCOkI3T#6op$Q?WN zsBUTrzbk+urFS- z!NiK$D`^;f0g`z=uznp3d*n@na$rP|2cUApkkIqA6B~|+^j`g>rZZl%Pg%AMU>Ego zqBM(Y5#8xEQ{Rqq4>XsAh;Ep)RTOG4mkbZjbbyH=*LArjFp598os>MsYoAjGT>0=? zU-YE&2~ZFN<{^Q*oSS_JMhggZs}+q{3ER zi5BY6P#ZnKj&ek2HdX`#Xa#j391jfiIh_PGV?-!a;&pe0lp-7vd}&N?YZqRkS?h5t z4*)ao^Ad5l*SX9lalC4e6YKM$d#c>Y9=c~T9tdf!1)W3&gpj&AmY-GGA=+J#)>-vnIcpZ z#!#sO%po;!AIP|we$;YZH9lOQ{s*gWyEmfu<`pE^d*cPZzw?ST`vg^Nmd(btD-6) zBamVx(31nGd|p-e2+0I*F&9J7R!xRn9r_}PAi~^AHJuC~^Qt29HQ7tJD6i~-Vf14` zUPP$TM?GlbHigk2X?fFT{#~A9R}H;Dvh4l49hr~x$)vzaQhX*sj~_f_a00adQJ?9? zM8N2vtUqx}r7d7ez>$`g!@(%B|4WTwo-pu0UiX?EA+ULX8$0fydP4XbaDSp@G^3cc zl(p@TP5i4^vVv^Qd+2q)0$_54Pu5y2gz|N(}3K(zvA;E^-<% zu_;&O1>iPL-y zK>poqSU8Y=M*actA)L~#^Pq@~C>a1hUO#<;*SuX*0h+fSw+PIsq%`jh8TR8wENl2x zIDxanfK;{&;CYa@d|j@c&}!eTbw=P|bfq3!2%?Nr^Aa60NJDrz`MZq9P&Vg*6|}_~ zIt_>jCCNG^NWci#9u2aS)T~*q`*2J6fB*-zz=`xvSWn<`l5QAw7Z?jhz#3HwHVqd_ zz|H7y$v^voB4UDAfs4TR@xbJQf{;cvBIiIL^O@`+05PEJ6sj3ukOUIpRuY&pP+1_n zv53>%g2+tN(8N16VW@dwJnT19&R@2yiQB6Y21)#Wb&vV<*yl2{i;n@(JK&s-#Y>x7 z*2k55pC`fK6ua{gCZFqg!&Die;wYU!*IcO2(nPYWte2(G+5zf>34>@xx!sgPA}J5s zNvQad08x|%Od2j32;Cr2=HDR5ywhM>YD;=R*}aM?Umtk44e2=4O#43ufLy|pW>%il zLhpGZvH#3Qsh=}wT!Qttt7%%X&-&2_ zfzf=(jthtcEUAjqFbQZSNjz!Jf@hl{tN*$XAZC^m@swV9a9AHFCA~BS(J^OPK8#Bl z289S~0Ia{*Jq(8^P`OVKg%iB8K?}?|a`^ij*}(>k;U8R+OraF6Bxg+AJ@ina zOod#-l;IG8vlf2{GQ7>Cc(_v2T+?Ya%z?oBEwS zg~q(+NP=jACB%EPw2sGEn`j>IvGXL-?R_=f{BlCI(PSVvWiU0a)L4 zjRcFFuuvES34i#(_;#OTwTB1no9Y2t@SUXL0siXp#-;@!@T@zWziZp5kySgDJp)k8 z&T5GL{^d{&a)N=9JU5H5#Ml1TBUOD^h2yG4a#Cu8N2R*~LdXDdLzR@YH$Xk?Y>B!4sY`(clT{0C;~)9&~KxuR3U6W`(}8aqvR{%}9Q%oZk{Gf-RB1 z05>5I5Aaql-{3Vr)UX3p@Y9}uZkaBZ6_9;}W+S!-L}q9X~-9GNEhptw6^EM2%^Y#bigdG&mBmLD=yP6uunNpjyJ^ zzM)x?nDwC9h-X@2K4}dFmff&ZuF;@KNr9?Msn*S?e((1e4~_qoc*;HP?jHD3+%Z~N z^vD)*^KDS1-R2;F$rQD#2Vl5P(Axl;8Qkvd^zIccM+9;jhxk`6CKu&E*)tCq>Z_o@ ztyJ0CFnArg4=dA9G>x4?H({a~XRSi2samT6|NM%{)}}3^oNJ(0371A!2(A}ydY{cM z6Ymx5T3>yrcJ6^`J%-#(u}$@wtNA2(zVLs7N;r=&NtaY4J}hKrV7`6YOb0YEYZ{#F->J*C$WFm zZcDJWr5+Y@)>PrwxeCI#F>90$?4&`ZcDW%b9OFE}672 z<+{)ByH#}(fQEKy01M0O2!?yR)3OSQf1~fmx+Z`9G?;sLU*nY>T@{CZ^4r|d_0&7K zzogRbk9s^G@SxfvMWj3fztk*0FQ^7X9pygB&e=5&jb9xJTs5G?v0<7PD()u0A2Nb| z%xP-WcKc*XU=6kri1+Fx0{sAZ;A)R%tr0_p+%=9jHgy)u0A{{4O*e(Rt@?Vu3(b{F1yb9=AM{NT&EON<07L``VG6&{5!Av5U@_2(-CWGwr=K!n+tg5{ROs= z!*iGNFUE^803zn&yM@2y2S*kT(%4NiWfA>DDWIupLSJWl?!Q9p((Nbv&A1NKTk33V z@c?wouj}6vC2$V$%SvrgpbT`2av3GO)!AQIBL{^P2)CJs;sX9Baw_lqU9I?TQ>4#E ze69xxZSoX-h{rik?Tq39l3vWAc8eju!ZoRplOMT=0OSRpm4WqT>PP;$Ee#L=Jk9h% z(1A`>>oEL_#vXK*M@`LRioN~zog;(#zhei_WFNrZjbG4dGoZ->&=gdrTGrBA;~9_L zZa(Tt2urWkSQQmsId3b8%hxSz@{^w>cUN5ep#meqHj|Jr3SCno8eMQwOw(M%1tu`T z3%l*4076^8i>F(aVyUC+els{_ovU~;!{@96@Lz4)=iY4iemU+dmC!=E?=t+(zAzHH z=a!-mYmw7uml6_+~oV`S5T21!En4Doufk>R{seuPgCZP$be% zRgSWnk|9fsp#D%|uttm(c>D>EB?A*ejQfSXsO`5Z&bTuAm&69g4fbGz!9E9n>) z9^R)88z`G$n(Ug?j(nz`>)(C!S68|F?5G0=QkVJyvgvc@c(T*@A$tZn##uHOm$0d^ep~ z6B22gZ4jxaO zR_0o`9}-EaU*!=k5ELG~#-LFb5xi1!*S7pL7iU`gmS^7FqY5D3iB0>~{r)%)j*u81 z7>X*Tm6p7c2xe9R1xsdvRHAUMxhN@%$xtFU89o?=RW~$56BF{8<)rN8C)iAVE1Oa- z7RqiZIIT#x&dGs$&Rttih0wUq`dO>`MV=HYIJ$k4nqQ8N8pk?Yoz25f3Egi6{fVhG zR2fk!?XAKlH2`o#1$H^c+9Cpw&!!0-K2Sl@%yDA|b=DL2lPhS-^;zkr!#;nAPg*nQ z*){tv5(fSF38>9pqlCT(oob7$>gD|C@2A^M@Gg@dQXNAP3dZwEXIDoy7f2Ptz~F@K zLs&q?ac|%vQgHuCK(Zu;*#1VJQ>2G|Q$h@)FalN~1i;Wxck)l#WCn=MhZ&-`PltbJ zHY^?VXu1A8d8}m6lry+j@k^=t^;N;(SaTK=5ja#RXZS5^W1C6j z*=xZpzR#qCop3TTyLTrS(oKO)9mqZiN?of<+E9usqJOd+T>g=sN=9}vX`MnRf*AJZ zKgnX@J3zBu5MMyPn%9O6r#eDmuDR!*6owpN!^l{OTWyHCW)$dXB9k1Ys3Auz$X0%W z$Vy`5#%DYN&8A2&zZE0WEm@;X>J}i1I+Cz@%d0SnoHm4m+BqD9?F}<`OT#3C<9${! zk>%@WX>d1+_9qD5yD6c z?7w|Hr_kwjS2{c1Qwcny+P+>@w0vD-UlU&xro-;h6b?1L#&8my>f)GS5B$1+h4p*l ze*hL5Mz#n_b~1TCIX+s}C3Xt!XgWDTJT;D7{t^9R!6*^r*4_OSvrOOdp=IFn!66Eq zlmwBunSWTmD7pVU_Zu^yx8E-z2ib$l;!?AWVdt(`@{|oAV!J(7m+12ihlDb9ZV8}S zM>zRbm1b4x8}zPan+DotL2@}l?X`W&V*uG|Wkc0ppr1h|NS;o`@X@%GTs%F%`Ayqy z)nsi5q314+!bQZ&yT1>)=!B`~^Xx0Eth`fQ^Z`If zQSWAOujy?&eR{3b6pFl7mtfhrVBVL**|BCf#wQ2-8y>q~J+IkE)@cb*eov*&%QqQTATovD)Z z$+)988m(ZDWceMh%NpY}V858UkMi?_H41@E+5RWKSZU35ZSrPNToC0)(;ZgnE0r0*r18E z>(ia*zZw+KJgTzaft>c=3;;8#@Mlhf_SHZ?27e2I*CY4a7OyA?+V46GB`5`S8DXZ+ zMScrpDO!}7I!Wf(!JzIhJI|crLcBy2hyYxksF6kcj`f1#E&kEd`nlxf!mQ}a6e{`C ziEmV*nal}^ID8Xct~wYCefbFMlUF#{RP;um9$yTdSlbLT>W`>LPe31fwP0vZOYy4q zEfT-d{Fyw>HU-W_mXMPH=Z8{k_}| z!4{IaXh9d&1`>Z;#Mp2>6JqeVdQ&4_n**|DZe8}>c1(OrP3FSPfAi8=po2yb=hRia z1^g(QV~QjQb=E$<7I6D@hrFIC2W;p^-w_r9JO?}|!^9z<8k-Jz0rn&n^S)2l7V0FL2 zUoI z7Em$f>oY=CsPGMr!URk92t#aA{!NTwU4QiXgObWDRwVv^H`V{yQ#t>OGQrOJ-(|^N znp*J(t;qg2274{7fou|_Zr3uk*``U*31C7vqXW|*N;+?3l|@6i)32$Y|&?9 zruw!OKa2@CU$r5_hel|2Kqu_s_egjLhl5<>m?}oL=Y!*_rHvX&X*Q>HO5NOX;p#`@ z=TEn~#k`#hqQI}a5kHTf2CZ7ZLPP)-#o4o;;Xw1nt4TbnM8+JiulfDN+>^x0y#yd7 zwacb5F5F9|(Kb8%??iNi;=}^eP8(wIx96{++cWFUMva#aD9;`I68M=H0f7(f>gEM) zv&0C*?4V9^d8KWzBeujf4EXOAIR?-Z7=ov%B(lCd?p1z9JvmgW-zPAkA{yT7H` zW#u?J|BarPdH*{hOsBK;X79_0`RNMjO*|ddXDDJ=@F@^)t=-L2vz1dk68gmpjOr*rKgpmYxMLWu}2~Fa<0ku#p~3 zHMOlPtNa2mmRJ^=7K>XH#jam9ZsRE|pl;pkaC%aY=w%iY%>CmPE%d z5=jl+yRQNeKxcW9iL=n>vVtEJy6}2IgOEm_2gY#<3&QugCBBh(3m_nXQelas`H$Y| zq?nHrIcyL2(FTH1Lrt1nfc$AP$KJuk*QL`s#KW`7*oECH#Q+>ZOVAwjYLw2aSw@3x zVM>Ma1V9oSA7E-$U-$_Wc;Y7`lG|0#@;t_yJG1B6#ZASNwGF(ztF(_&F|ANPoihzwi?bLB%2IB~OM*u;+_~H3s9ZOG3PO(towS}STIhNX05!Y)1!6-QDjLI z2eA8$VgMGl5g@`E#Oxn!_M6lvPU9sOr8~C@1mp43>ODrCnI&?3Wmr@{V=I~?dqdfY zOm#!UA(N9XIDH9|K@DdXw6S2X>pg1^sGu;*cDqhS86i6fg;c7PbhFCkA4+5m;mO z4B#RtvfCUbo&8J=L{Qkp5aBEq2uEEF5q=@hn;nY9nU?1dZj6nA>wzxWQc#VUCISmYv5uAV|Al-620Ju?2HC$;Kav%hxJAiX17^H7X*`)55)ln;^L3J~P7gs~j?gq&6 zaC1PTh#Jp%5HeCB5>36%uSIsy)%C#$3MfWnSmE*ww>LrWMb zUJAX##ZpE}(7fytVq7^3&`r3MCg87-hcZ}qWoF@?IY_u`PYGRFES$KMVgJgi{E>+| z<3{P`if%3rjIQWiG*cia8&0y~X$_6=44xk7FtE6&{SJ>cnWclO;lKh2{4oX&P}|Jx zvBu6FFU8hfDrl)615Nf_ap%FbDC|9!eKKpaJaWyCRu&J>W?b1HT23`E0T^EPGv>U( zpJ(&FaIfmA0?j9wiGT1!$uKP|^|88XD`L_qI!(`VS!a^MsB{@oQNjq3Cj-HSq4-Oi z00}pJribPC0j&VI3I%#ge^RJanpu0SrkQ~if_Tau!JvR$0GtFusjYt*lP2&;y0t*W zim8kmmKsaH9gsXRL_Y}jvr9i3?_-uo6h8R zg4hwKEk8GjSCTqSyc@nTlneoSys+0@!$EfE(pRXFgv z0pFTkZ2F8y1i4k*wnx)O&u}%r{np!*FqdSn8%L2O@r;U6RxO5MxwG)2f$63i$;O^} zp`oC=ej2zUM`BqX+}YGc? ziDwIw0k#=LDb2wE7}U07bv@70esX?@@924W{}kphs!}eaam5HwJiAas14xT~)jBuH zh6d1U@Z&L{p`DeNoE-%oS)-y>5Xy9qHXTa{b(o!$^isT~E);ml9^9&xX4agJYEWW_ z%+LQ`o7ZwO833!eb4F5yBl{b6pA-+)*P(igP-5;Wabqe8C=v~sz|l{|95T)a6Lh!r z=K9{>R23L2%(483ZGMFAOe<1qPsosuUZ>#gwAlbvrlrd>Jp>%7~rtv zBL#xK(j4mR>|r|KwDkv5>k(I3W-_f3{UcuG&lJknOFr!P+r`265<(sHNsTj&d`+zM zCC3!-Tsqh}U_S$QHfL+f|J?q2g%`;W8qfC+kKR!b5F9wokCZDoFqi-*pQSEr`KxdY zQYjmvhX3fD_zBV0>z}MjsKxabql)C$^z+1B6|Jm)p~k0mP=>84+zv$&{GG1V7IAD$zR4HI@cwn}cICbDeI5^J#O<*!Jr3>}}(*S

hb(9iA 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≀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 ZX+fANm&zIp9Sk`zG&eK~B_%~qMhbQK_IdyS diff --git a/full/src/Arbitrary.hs b/full/src/Arbitrary.hs index 2fed103..c068c6f 100644 --- a/full/src/Arbitrary.hs +++ b/full/src/Arbitrary.hs @@ -6,7 +6,7 @@ module Arbitrary where import qualified Data.Set as Set import Test.QuickCheck - ( elements, frequency, sized, Arbitrary(arbitrary), Gen ) + ( elements, frequency, sized, Arbitrary(arbitrary), Gen ) import qualified Test.QuickCheck as QC import qualified Unbound.Generics.LocallyNameless as Unbound import Text.Parsec.Error ( ParseError ) @@ -18,18 +18,18 @@ import Parser ( testParser, expr ) -- | Round trip property: a given term prints then parses to the same term. prop_roundtrip :: Term -> QC.Property -prop_roundtrip tm = +prop_roundtrip tm = let str = render (disp tm) in case test_parseExpr str of Left _ -> QC.counterexample ("*** Could not parse:\n" ++ str) False Right tm' -> QC.counterexample ("*** Round trip failure! Parsing:\n" ++ str ++ "\n*** results in\n" ++ show tm') (Unbound.aeq tm tm') - + test_parseExpr :: String -> Either Text.Parsec.Error.ParseError Term test_parseExpr = testParser arbConstructorNames expr -- View random terms sampleTerms :: IO () -sampleTerms = QC.sample' (arbitrary :: Gen Term) >>= +sampleTerms = QC.sample' (arbitrary :: Gen Term) >>= mapM_ (putStrLn . render . disp) --------------------------------------------------------------------------------------------------- @@ -49,18 +49,18 @@ genName = Unbound.string2Name <$> elements ["x", "y", "z", "x0" , "y0"] instance Arbitrary (Unbound.Name a) where arbitrary = genName -tcNames :: [TCName] +tcNames :: [TyConName] tcNames = ["T", "List", "Vec" ] -dcNames :: [DCName] +dcNames :: [DataConName] dcNames = ["K", "Nil", "Cons"] arbConstructorNames :: ConstructorNames arbConstructorNames = ConstructorNames (Set.fromList tcNames) (Set.fromList dcNames) -genTCName :: Gen TCName +genTCName :: Gen TyConName genTCName = elements tcNames -genDCName :: Gen DCName +genDCName :: Gen DataConName genDCName = elements dcNames @@ -68,23 +68,23 @@ genDCName = elements dcNames -- Terms with no subterms base :: Gen Term -base = elements [Type, TrustMe, PrintMe, - tyUnit, litUnit, tyBool, +base = elements [TyType, TrustMe, PrintMe, + tyUnit, litUnit, tyBool, litTrue, litFalse, Refl ] - where tyUnit = TCon "Unit" [] - litUnit = DCon "()" [] - tyBool = TCon "Bool" [] - litTrue = DCon "True" [] - litFalse = DCon "False" [] + where tyUnit = TyCon "Unit" [] + litUnit = DataCon "()" [] + tyBool = TyCon "Bool" [] + litTrue = DataCon "True" [] + litFalse = DataCon "False" [] -- Generate a random term --- In the inner recursion, the bool prevents the generation of TCon/DCon applications +-- In the inner recursion, the bool prevents the generation of TyCon/DataCon applications -- inside Apps --- we want these terms to be fully saturated. genTerm :: Int -> Gen Term genTerm n | n <= 1 = base | otherwise = go True n where - go b n0 = + go b n0 = let n' = n0 `div` 2 in frequency [ (1, Var <$> genName), @@ -96,15 +96,15 @@ genTerm n (1, Subst <$> go True n' <*> go True n'), (1, Contra <$> go True n'), - (if b then 1 else 0, TCon <$> genTCName <*> genArgs n'), - (if b then 1 else 0, DCon <$> genDCName <*> genArgs n'), + (if b then 1 else 0, TyCon <$> genTCName <*> genArgs n'), + (if b then 1 else 0, DataCon <$> genDCName <*> genArgs n'), (1, Case <$> go True n' <*> genBoundedList 2 (genMatch n')), (1, base) ] genLam :: Int -> Gen Term -genLam n = do +genLam n = do p <- genName ep <- arbitrary b <- genTerm n @@ -112,37 +112,37 @@ genLam n = do genPi :: Int -> Gen Term -genPi n = do +genPi n = do p <- genName ep <- arbitrary tyA <- genTerm n tyB <- genTerm n - return $ Pi ep tyA (Unbound.bind p tyB) + return $ TyPi ep tyA (Unbound.bind p tyB) genSigma :: Int -> Gen Term genSigma n = do - p <- genName + p <- genName tyA <- genTerm n tyB <- genTerm n - return $ Sigma tyA (Unbound.bind p tyB) + return $ TySigma tyA (Unbound.bind p tyB) -genLet :: Int -> Gen Term +genLet :: Int -> Gen Term genLet n = do - p <- genName + p <- genName rhs <- genTerm n b <- genTerm n return $ Let rhs (Unbound.bind p b) -genLetPair :: Int -> Gen Term +genLetPair :: Int -> Gen Term genLetPair n = do - p <- (,) <$> genName <*> genName + p <- (,) <$> genName <*> genName a <- genTerm n b <- genTerm n return $ LetPair a (Unbound.bind p b) instance Arbitrary Arg where arbitrary = sized genArg - shrink (Arg ep tm) = + shrink (Arg ep tm) = [ Arg ep tm' | tm' <- QC.shrink tm] genArg :: Int -> Gen Arg @@ -150,7 +150,7 @@ genArg n = Arg <$> arbitrary <*> genTerm (n `div` 2) genArgs :: Int -> Gen [Arg] genArgs n = genBoundedList 2 (genArg n) - + instance Arbitrary Epsilon where arbitrary = elements [ Rel, Irr ] @@ -158,10 +158,10 @@ instance Arbitrary Epsilon where genPattern :: Int -> Gen Pattern genPattern n | n == 0 = PatVar <$> genName - | otherwise = frequency + | otherwise = frequency [(1, PatVar <$> genName), (1, PatCon <$> genDCName <*> genPatArgs)] - where + where n' = n `div` 2 genPatArgs = genBoundedList 2 ( (,) <$> genPattern n' <*> arbitrary ) @@ -169,7 +169,7 @@ genMatch :: Int -> Gen Match genMatch n = Match <$> (Unbound.bind <$> genPattern n <*> genTerm n) instance Arbitrary Pattern where - arbitrary = sized genPattern + arbitrary = sized genPattern shrink (PatCon n pats) = map fst pats ++ [PatCon n pats' | pats' <- QC.shrink pats] shrink _ = [] @@ -182,24 +182,24 @@ instance Arbitrary Term where arbitrary = sized genTerm -- when QC finds a counterexample, it tries to shrink it to find a smaller one - shrink (App tm arg) = - [tm, unArg arg] ++ [App tm' arg | tm' <- QC.shrink tm] + shrink (App tm arg) = + [tm, unArg arg] ++ [App tm' arg | tm' <- QC.shrink tm] ++ [App tm arg' | arg' <- QC.shrink arg] shrink (Lam ep bnd) = [] - shrink (Pi ep tyA bnd) = [tyA] + shrink (TyPi ep tyA bnd) = [tyA] shrink (Let rhs bnd) = [rhs] - shrink (Sigma tyA bnd) = [tyA] + shrink (TySigma tyA bnd) = [tyA] shrink (TyEq a b) = [a,b] ++ [TyEq a' b | a' <- QC.shrink a] ++ [TyEq a b' | b' <- QC.shrink b] shrink (Subst a b) = [a,b] ++ [Subst a' b | a' <- QC.shrink a] ++ [Subst a b' | b' <- QC.shrink b] - shrink (Contra a) = [a] ++ [Contra a' | a' <- QC.shrink a] + shrink (Contra a) = a : [Contra a' | a' <- QC.shrink a] - shrink (TCon n as) = map unArg as ++ [TCon n as' | as' <- QC.shrink as] - shrink (DCon n as) = map unArg as ++ [DCon n as' | as' <- QC.shrink as] + shrink (TyCon n as) = map unArg as ++ [TyCon n as' | as' <- QC.shrink as] + shrink (DataCon n as) = map unArg as ++ [DataCon n as' | as' <- QC.shrink as] shrink (Case a ms) = [a] ++ [Case a' ms | a' <- QC.shrink a] ++ [Case a ms' | ms' <- QC.shrink ms] shrink _ = [] - + ------------------------------------------------------- -- * General quickcheck utilities diff --git a/full/src/Environment.hs b/full/src/Environment.hs index 9b6e2b8..99c9a3a 100644 --- a/full/src/Environment.hs +++ b/full/src/Environment.hs @@ -90,6 +90,7 @@ emptyEnv = Env {ctx = preludeDataDecls } instance Disp Env where + disp :: Env -> Doc disp e = vcat [disp decl | decl <- ctx e] -- | Find a name's user supplied type signature. @@ -155,7 +156,7 @@ lookupRecDef v = do -- | Find a type constructor in the context lookupTCon :: (MonadReader Env m, MonadError Err m) => - TCName -> + TyConName -> m (Telescope, Maybe [ConstructorDef]) lookupTCon v = do g <- asks ctx @@ -184,8 +185,8 @@ lookupTCon v = do -- all potential matches lookupDConAll :: (MonadReader Env m) => - DCName -> - m [(TCName, (Telescope, ConstructorDef))] + DataConName -> + m [(TyConName, (Telescope, ConstructorDef))] lookupDConAll v = do g <- asks ctx scanGamma g @@ -205,8 +206,8 @@ lookupDConAll v = do -- Throws an error if the data constructor cannot be found for that type. lookupDCon :: (MonadReader Env m, MonadError Err m) => - DCName -> - TCName -> + DataConName -> + TyConName -> m (Telescope, Telescope) lookupDCon c tname = do matches <- lookupDConAll c @@ -303,13 +304,16 @@ extendErr ma msg' = throwError $ Err ps (msg $$ msg') instance Semigroup Err where + (<>) :: Err -> Err -> Err (Err src1 d1) <> (Err src2 d2) = Err (src1 ++ src2) (d1 `mappend` d2) instance Monoid Err where + mempty :: Err mempty = Err [] mempty instance Disp Err where + disp :: Err -> Doc disp (Err [] msg) = msg disp (Err ((SourceLocation p term) : _) msg) = disp p diff --git a/full/src/Equal.hs b/full/src/Equal.hs index a274132..d9d641b 100644 --- a/full/src/Equal.hs +++ b/full/src/Equal.hs @@ -22,7 +22,7 @@ equate t1 t2 = do n1 <- whnf t1 n2 <- whnf t2 case (n1, n2) of - (Type, Type) -> return () + (TyType, TyType) -> return () (Var x, Var y) | x == y -> return () (Lam ep1 bnd1, Lam ep2 bnd2) -> do (_, b1, _, b2) <- Unbound.unbind2Plus bnd1 bnd2 @@ -31,7 +31,7 @@ equate t1 t2 = do equate b1 b2 (App a1 a2, App b1 b2) -> equate a1 b1 >> equateArg a2 b2 - (Pi ep1 tyA1 bnd1, Pi ep2 tyA2 bnd2) -> do + (TyPi ep1 tyA1 bnd1, TyPi ep2 tyA2 bnd2) -> do (_, tyB1, _, tyB2) <- Unbound.unbind2Plus bnd1 bnd2 unless (ep1 == ep2) $ tyErr n1 n2 @@ -56,7 +56,7 @@ equate t1 t2 = do equate rhs1 rhs2 equate body1 body2 - (Sigma tyA1 bnd1, Sigma tyA2 bnd2) -> do + (TySigma tyA1 bnd1, TySigma tyA2 bnd2) -> do Just (x, tyB1, _, tyB2) <- Unbound.unbind2 bnd1 bnd2 equate tyA1 tyA2 equate tyB1 tyB2 @@ -82,9 +82,9 @@ equate t1 t2 = do (Contra a1, Contra a2) -> equate a1 a2 - (TCon c1 ts1, TCon c2 ts2) | c1 == c2 -> + (TyCon c1 ts1, TyCon c2 ts2) | c1 == c2 -> zipWithM_ equateArgs [ts1] [ts2] - (DCon d1 a1, DCon d2 a2) | d1 == d2 -> do + (DataCon d1 a1, DataCon d2 a2) | d1 == d2 -> do equateArgs a1 a2 (Case s1 brs1, Case s2 brs2) | length brs1 == length brs2 -> do @@ -132,7 +132,7 @@ equateArg a1 a2 = ------------------------------------------------------- --- | Ensure that the given type 'ty' is a 'Pi' type +-- | Ensure that the given type 'ty' is a 'TyPi' type -- (or could be normalized to be such) and return the components of -- the type. -- Throws an error if this is not the case. @@ -141,7 +141,7 @@ ensurePi :: Type -> ensurePi ty = do nf <- whnf ty case nf of - (Pi ep tyA bnd) -> do + (TyPi ep tyA bnd) -> do return (ep, tyA, bnd) _ -> Env.err [DS "Expected a function type, instead found", DD nf] @@ -161,11 +161,11 @@ ensureTyEq ty = do -- | Ensure that the given type 'ty' is some tycon applied to -- params (or could be normalized to be such) -- Throws an error if this is not the case -ensureTCon :: Term -> TcMonad (TCName, [Arg]) +ensureTCon :: Term -> TcMonad (TyConName, [Arg]) ensureTCon aty = do nf <- whnf aty case nf of - TCon n params -> return (n, params) + TyCon n params -> return (n, params) _ -> Env.err [DS "Expected a data type but found", DD nf] @@ -219,7 +219,7 @@ whnf (Subst tm pf) = do whnf (Case scrut mtchs) = do nf <- whnf scrut case nf of - (DCon d args) -> f mtchs where + (DataCon d args) -> f mtchs where f (Match bnd : alts) = (do (pat, br) <- Unbound.unbind bnd ss <- patternMatches (Arg Rel nf) pat @@ -241,8 +241,8 @@ patternMatches (Arg _ t) (PatVar x) = return [(x, t)] patternMatches (Arg Rel t) pat = do nf <- whnf t case (nf, pat) of - (DCon d [], PatCon d' pats) | d == d' -> return [] - (DCon d args, PatCon d' pats) | d == d' -> + (DataCon d [], PatCon d' pats) | d == d' -> return [] + (DataCon d args, PatCon d' pats) | d == d' -> concat <$> zipWithM patternMatches args (map fst pats) _ -> Env.err [DS "arg", DD nf, DS "doesn't match pattern", DD pat] patternMatches (Arg Irr _) pat = do @@ -263,16 +263,16 @@ unify ns tx ty = do (yty, Var y) | y `notElem` ns -> return [Def y yty] (Prod a1 a2, Prod b1 b2) -> unifyArgs [Arg Rel a1, Arg Rel a2] [Arg Rel b1, Arg Rel b2] (TyEq a1 a2, TyEq b1 b2) -> unifyArgs [Arg Rel a1, Arg Rel a2] [Arg Rel b1, Arg Rel b2] - (TCon s1 tms1, TCon s2 tms2) + (TyCon s1 tms1, TyCon s2 tms2) | s1 == s2 -> unifyArgs tms1 tms2 - (DCon s1 a1s, DCon s2 a2s) + (DataCon s1 a1s, DataCon s2 a2s) | s1 == s2 -> unifyArgs a1s a2s (Lam ep1 bnd1, Lam ep2 bnd2) -> do (x, b1, _, b2) <- Unbound.unbind2Plus bnd1 bnd2 unless (ep1 == ep2) $ do Env.err [DS "Cannot equate", DD txnf, DS "and", DD tynf] unify (x:ns) b1 b2 - (Pi ep1 tyA1 bnd1, Pi ep2 tyA2 bnd2) -> do + (TyPi ep1 tyA1 bnd1, TyPi ep2 tyA2 bnd2) -> do (x, tyB1, _, tyB2) <- Unbound.unbind2Plus bnd1 bnd2 unless (ep1 == ep2) $ do Env.err [DS "Cannot equate", DD txnf, DS "and", DD tynf] diff --git a/full/src/Modules.hs b/full/src/Modules.hs index 06901a8..1888bb2 100644 --- a/full/src/Modules.hs +++ b/full/src/Modules.hs @@ -27,7 +27,7 @@ getModules prefixes top = do data ModuleInfo = ModuleInfo { - modInfoName :: MName, + modInfoName :: ModuleName, modInfoFilename :: String, modInfoImports :: [ModuleImport] } @@ -57,7 +57,7 @@ topSort ms = reverse sorted -- | Find the file associated with a module. getModuleFileName :: (MonadIO m) - => [FilePath] -> MName -> m FilePath + => [FilePath] -> ModuleName -> m FilePath getModuleFileName prefixes modul = do let makeFileName prefix = prefix mDotPi -- get M.pi from M or M.pi diff --git a/full/src/Parser.hs b/full/src/Parser.hs index 153cb95..856b0e3 100644 --- a/full/src/Parser.hs +++ b/full/src/Parser.hs @@ -34,8 +34,8 @@ Optional components in this BNF are marked with < > terms: a,b,A,B ::= - Type Universes - | x Variables (start with lowercase) + Type Universe + | x Variables (must start with lowercase) | \ x . a Function definition | a b Application | (x : A) -> B Pi type @@ -55,9 +55,9 @@ Optional components in this BNF are marked with < > | if a then b else c If | { x : A | B } Dependent pair type - | A * B Nondependent pair syntactic sugar - | (a, b) Prod introduction - | let (x,y) = a in b Prod elimination + | A * B Nondependent pair type (syntactic sugar) + | (a, b) Pair introduction + | let (x,y) = a in b Pair elimination | a = b Equality type | Refl Equality proof @@ -69,38 +69,56 @@ Optional components in this BNF are marked with < > C1 [x] y z -> b1 C2 x [y] -> b2 - | \ [x <:A> ] . a Irr lambda - | a [b] Irr application - | [x : A] -> B Irr pi + | \ [x <:A> ] . a Irrelevant lambda + | a [b] Irrelevant application + | [x : A] -> B Irrelevant function type declarations: - foo : A - foo = a + foo : A Type declaration + foo = a Definition - data T D : Type where - C1 of D1 + data T D : Type where Type constructor, with telescope + C1 of D1 Data constructor, with telescope ... Cn of Dn telescopes: D ::= Empty - | (x : A) D runtime cons - | (A) D runtime cons - | [x : A] D irrelevant cons - | [A = B] D equality constraint + | (x : A) D Relevant, dependent argument + | (A) D Relevent, nondependent argument + | [x : A] D Irrelevant, dependent argument + | [A = B] D Equality constraint Syntax sugar: + - Nondependent function types, like: + + A -> B + + Get parsed as (x:A) -> B, with an internal name for x + + - Nondependent product types, like: + + A * B + + Get parsed as { x:A | B }, with an internal name for x + - You can collapse lambdas, like: \ x [y] z . a This gets parsed as \ x . \ [y] . \ z . a + - Natural numbers, like: + + 3 + + Get parsed as peano numbers (Succ (Succ (Succ Zero))) + -} liftError :: (MonadError e m) => Either e a -> m a @@ -213,7 +231,7 @@ wildcard = reservedOp "_" >> return wildcardName varOrWildcard :: LParser TName varOrWildcard = try wildcard <|> variable -dconstructor :: LParser DCName +dconstructor :: LParser DataConName dconstructor = do i <- identifier cnames <- get @@ -223,7 +241,7 @@ dconstructor = then fail "Expected a data constructor, but a type constructor was found." else fail "Expected a constructor, but a variable was found" -tconstructor :: LParser TCName +tconstructor :: LParser TyConName tconstructor = do i <- identifier cnames <- get @@ -239,9 +257,9 @@ varOrCon :: LParser Term varOrCon = do i <- identifier cnames <- get if (i `S.member` (dconNames cnames)) - then return (DCon i [] ) + then return (DataCon i [] ) else if (i `S.member` tconNames cnames) - then return (TCon i []) + then return (TyCon i []) else return (Var (Unbound.string2Name i)) @@ -264,8 +282,8 @@ natural = fromInteger <$> Token.natural tokenizer natenc :: LParser Term natenc = encode <$> natural - where encode 0 = DCon "Zero" [] - encode n = DCon "Succ" [Arg Rel (encode (n-1))] + where encode 0 = DataCon "Zero" [] + encode n = DataCon "Succ" [Arg Rel (encode (n-1))] moduleImports :: LParser Module @@ -336,7 +354,7 @@ dataDef = do name <- identifier params <- telescope colon - Type <- typen + TyType <- typen modify (\cnames -> cnames{ tconNames = S.insert name (tconNames cnames) }) @@ -403,11 +421,11 @@ expr = do mkArrowType = do n <- Unbound.fresh wildcardName return $ \tyA tyB -> - Pi Rel tyA (Unbound.bind n tyB) + TyPi Rel tyA (Unbound.bind n tyB) mkTupleType = do n <- Unbound.fresh wildcardName return $ \tyA tyB -> - TCon sigmaName [Arg Rel tyA, Arg Rel $ Lam Rel (Unbound.bind n tyB)] + TyCon sigmaName [Arg Rel tyA, Arg Rel $ Lam Rel (Unbound.bind n tyB)] -- A "term" is either a function application or a constructor @@ -424,13 +442,13 @@ dconapp :: LParser Term dconapp = do c <- dconstructor args <- many arg - return $ DCon c args + return $ DataCon c args tconapp :: LParser Term tconapp = do c <- tconstructor ts <- many arg - return $ TCon c ts + return $ TyCon c ts funapp :: LParser Term @@ -475,7 +493,7 @@ impOrExpVar = try ((,Irr) <$> (brackets variable)) typen :: LParser Term typen = do reserved "Type" - return Type + return TyType @@ -494,11 +512,11 @@ lambda = do reservedOp "\\" bconst :: LParser Term -bconst = choice [reserved "Bool" >> return (TCon boolName []), - reserved "False" >> return (DCon falseName []), - reserved "True" >> return (DCon trueName []), - reserved "Unit" >> return (TCon tyUnitName []), - reserved "()" >> return (DCon litUnitName [])] +bconst = choice [reserved "Bool" >> return (TyCon boolName []), + reserved "False" >> return (DataCon falseName []), + reserved "True" >> return (DataCon trueName []), + reserved "Unit" >> return (TyCon tyUnitName []), + reserved "()" >> return (DataCon litUnitName [])] @@ -552,7 +570,7 @@ impProd = <|> ((,) <$> Unbound.fresh wildcardName <*> expr)) reservedOp "->" tyB <- expr - return $ Pi Irr tyA (Unbound.bind x tyB) + return $ TyPi Irr tyA (Unbound.bind x tyB) -- Function types have the syntax '(x:A) -> B'. This production deals @@ -589,11 +607,11 @@ expProdOrAnnotOrParens = Colon (Var x) a -> option (Ann (Var x) a) (do b <- afterBinder - return $ Pi Rel a (Unbound.bind x b)) + return $ TyPi Rel a (Unbound.bind x b)) Colon a b -> return $ Ann a b Comma a b -> - return $ DCon prodName [Arg Rel a, Arg Rel b] + return $ DataCon prodName [Arg Rel a, Arg Rel b] Nope a -> return a @@ -626,8 +644,8 @@ pattern = try (PatCon <$> dconstructor <*> many arg_pattern) <|> do t <- varOrCon case t of (Var x) -> return $ PatVar x - (DCon c []) -> return $ PatCon c [] - (TCon c []) -> fail "expected a data constructor but a type constructor was found" + (DataCon c []) -> return $ PatCon c [] + (TyCon c []) -> fail "expected a data constructor but a type constructor was found" _ -> error "internal error in atomic_pattern" @@ -675,7 +693,7 @@ sigmaTy = do reservedOp "|" b <- expr reservedOp "}" - return $ TCon sigmaName [Arg Rel a, Arg Rel (Lam Rel (Unbound.bind x b))] + return $ TyCon sigmaName [Arg Rel a, Arg Rel (Lam Rel (Unbound.bind x b))] diff --git a/full/src/PrettyPrint.hs b/full/src/PrettyPrint.hs index b3e6060..ace78a5 100644 --- a/full/src/PrettyPrint.hs +++ b/full/src/PrettyPrint.hs @@ -226,13 +226,13 @@ levelLet = 0 levelCase :: Int levelCase = 0 levelLam :: Int -levelLam = 0 +levelLam = 0 levelPi :: Int levelPi = 0 levelSigma :: Int levelSigma = 0 levelProd :: Int -levelProd = 0 +levelProd = 0 levelArrow :: Int levelArrow = 5 @@ -250,7 +250,7 @@ instance Display (Unbound.Name Term) where display = return . disp instance Display Term where - display Type = return $ PP.text "Type" + display TyType = return $ PP.text "Type" display (Var n) = display n display a@(Lam _ b) = do n <- ask prec @@ -261,7 +261,7 @@ instance Display Term where df <- withPrec levelApp (display f) dx <- withPrec (levelApp+1) (display x) return $ parens (levelApp < n) $ df <+> dx - display (Pi ep a bnd) = do + display (TyPi ep a bnd) = do Unbound.lunbind bnd $ \(n, b) -> do p <- ask prec lhs <- @@ -271,7 +271,7 @@ instance Display Term where da <- withPrec 0 (display a) return $ mandatoryBindParens ep (dn <+> PP.colon <+> da) else do - case ep of + case ep of Rel -> withPrec (levelArrow+1) (display a) Irr -> PP.brackets <$> (withPrec 0 (display a)) db <- withPrec levelPi (display b) @@ -301,7 +301,7 @@ instance Display Term where PP.text "if" <+> da <+> PP.text "then" <+> db <+> PP.text "else" <+> dc - display (Sigma tyA bnd) = + display (TySigma tyA bnd) = Unbound.lunbind bnd $ \(x, tyB) -> do if x `elem` toListOf Unbound.fv tyB then do dx <- display x @@ -330,15 +330,15 @@ instance Display Term where dy <- withPrec 0 $ display y dbody <- withPrec 0 $ display body return $ - parens (levelLet < p) $ - (PP.text "let" + parens (levelLet < p) $ + (PP.text "let" <+> (PP.text "(" PP.<> dx PP.<> PP.text "," PP.<> dy PP.<> PP.text ")") <+> PP.text "=" - <+> da + <+> da <+> PP.text "in") $$ dbody display (Let a bnd) = do @@ -382,23 +382,23 @@ instance Display Term where display t | Just i <- isNumeral t = display i - display (TCon n args) = do + display (TyCon n args) = do p <- ask prec dn <- display n dargs <- withPrec (levelApp+1) $ mapM display args - return $ - parens (levelApp < p && length args > 0) (dn <+> PP.hsep dargs) - display (DCon n args) = do + return $ + parens (levelApp < p && not (null args)) (dn <+> PP.hsep dargs) + display (DataCon n args) = do p <- ask prec dn <- display n dargs <- withPrec (levelApp+1) $ mapM display args - return $ - parens (levelApp < p && length args > 0) (dn <+> PP.hsep dargs) + return $ + parens (levelApp < p && not (null args)) (dn <+> PP.hsep dargs) display (Case scrut alts) = do p <- asks prec dscrut <- withPrec 0 $ display scrut dalts <- withPrec 0 $ mapM display alts - let top = PP.text "case" <+> dscrut <+> PP.text "of" + let top = PP.text "case" <+> dscrut <+> PP.text "of" return $ parens (levelCase < p) $ if null dalts then top <+> PP.text "{ }" else top $$ PP.nest 2 (PP.vcat dalts) @@ -406,8 +406,8 @@ instance Display Term where instance Display Arg where - display arg = - case argEp arg of + display arg = + case argEp arg of Irr -> PP.brackets <$> withPrec 0 (display (unArg arg)) Rel -> display (unArg arg) @@ -422,14 +422,14 @@ instance Display Match where instance Display Pattern where display (PatCon c []) = display c display (PatCon c args) = do - dc <- display c + dc <- display c dargs <- mapM wrap args return $ dc <+> PP.hsep dargs - where + where wrap (a@(PatVar _),ep) = bindParens ep <$> display a - wrap (a@(PatCon _ []),ep) = bindParens ep <$> display a + wrap (a@(PatCon _ []),ep) = bindParens ep <$> display a wrap (a@(PatCon _ _),ep) = mandatoryBindParens ep <$> display a - + display (PatVar x) = display x instance Disp Telescope where @@ -439,9 +439,9 @@ instance Display a => Display (a, Epsilon) where display (t, ep) = bindParens ep <$> display t instance Display ConstructorDef where - display (ConstructorDef pos dc tele) = do - dn <- display dc - let dt = disp tele + display (ConstructorDef pos dc tele) = do + dn <- display dc + let dt = disp tele return $ dn PP.<+> PP.text "of" PP.<+> dt @@ -464,7 +464,7 @@ gatherBinders body = do return ([], db) precBindParens :: Epsilon -> Bool -> Doc -> Doc -precBindParens Rel b d = parens b d +precBindParens Rel b d = parens b d precBindParens Irr b d = PP.brackets d -- | Add [] for irrelevant arguments, leave other arguments alone diff --git a/full/src/Syntax.hs b/full/src/Syntax.hs index 2b570ca..6b0221d 100644 --- a/full/src/Syntax.hs +++ b/full/src/Syntax.hs @@ -1,7 +1,6 @@ -{- pi-forall language -} -- | The abstract syntax of the simple dependently typed language --- See comment at the top of 'Parser' for the concrete syntax of this language +-- See the comment at the top of 'Parser' for the concrete syntax of this language module Syntax where import Data.Maybe (fromMaybe) @@ -19,42 +18,45 @@ import Data.Function (on) ----------------------------------------- --- | For variable names, we use the Unbound library to +-- | For variable names, we use the `Unbound` library to -- automatically generate free variable, substitution, --- and alpha-equality function. +-- and alpha-equality function. The abstract type `Name` from +-- this library is indexed by the AST type that this variable +-- is a name for. type TName = Unbound.Name Term -- | module names -type MName = String +type ModuleName = String -- | type constructor names -type TCName = String +type TyConName = String -- | data constructor names -type DCName = String +type DataConName = String ----------------------------------------- --- * Core language +-- * Core language of pi-forall (Combined syntax for types and terms) ----------------------------------------- --- | Combined syntax for types and terms --- (type synonym for documentation) +-- | Because types and terms use the same AST, we define the following +-- type synonym so that we can hint whether a piece of syntax is being used +-- as a type or as a term. type Type = Term -- | basic language data Term - = -- | type of types `Type` - Type - | -- | variables `x` + = -- | type of types, concretely `Type` + TyType + | -- | variable `x` Var TName | -- | abstraction `\x. a` Lam Epsilon (Unbound.Bind TName Term) | -- | application `a b` App Term Arg | -- | function type `(x : A) -> B` - Pi Epsilon Type (Unbound.Bind TName Type) + TyPi Epsilon Type (Unbound.Bind TName Type) | -- | annotated terms `( a : A )` Ann Term Type | -- | marked source position, for error messages @@ -77,7 +79,7 @@ data Term | -- | `if a then b1 else b2` expression for eliminating booleans If Term Term Term | -- | Sigma-type (homework), written `{ x : A | B }` - Sigma Term (Unbound.Bind TName Term) + TySigma Term (Unbound.Bind TName Term) | -- | introduction form for Sigma-types `( a , b )` Prod Term Term | -- | elimination form for Sigma-types `let (x,y) = a in b` @@ -92,9 +94,9 @@ data Term Contra Term | -- | type constructors (fully applied) - TCon TCName [Arg] + TyCon TyConName [Arg] | -- | term constructors (fully applied) - DCon DCName [Arg] + DataCon DataConName [Arg] | -- | case analysis `case a of matches` Case Term [Match] @@ -128,7 +130,7 @@ newtype Match = Match (Unbound.Bind Pattern Term) -- | The patterns of case expressions bind all variables -- in their respective branches. data Pattern - = PatCon DCName [(Pattern, Epsilon)] + = PatCon DataConName [(Pattern, Epsilon)] | PatVar TName deriving (Show, Eq, Generic, Typeable, Unbound.Alpha, Unbound.Subst Term) @@ -142,7 +144,7 @@ data Pattern -- | A Module has a name, a list of imports, a list of declarations, -- and a set of constructor names (which affect parsing). data Module = Module - { moduleName :: MName, + { moduleName :: ModuleName, moduleImports :: [ModuleImport], moduleEntries :: [Decl] , moduleConstructors :: ConstructorNames @@ -150,7 +152,7 @@ data Module = Module deriving (Show, Generic, Typeable) -- | References to other modules (brings declarations and definitions into scope) -newtype ModuleImport = ModuleImport MName +newtype ModuleImport = ModuleImport ModuleName deriving (Show, Eq, Generic, Typeable) -- | A type declaration (or type signature) @@ -175,11 +177,11 @@ data Decl | Demote Epsilon | -- | Declaration for a datatype including all of -- its data constructors - Data TCName Telescope [ConstructorDef] + Data TyConName Telescope [ConstructorDef] | -- | An abstract view of a datatype. Does -- not include any information about its data -- constructors - DataSig TCName Telescope + DataSig TyConName Telescope deriving (Show, Generic, Typeable) deriving anyclass (Unbound.Alpha, Unbound.Subst Term) @@ -191,7 +193,7 @@ data ConstructorNames = ConstructorNames deriving (Show, Eq, Ord, Generic, Typeable) -- | A Data constructor has a name and a telescope of arguments -data ConstructorDef = ConstructorDef SourcePos DCName Telescope +data ConstructorDef = ConstructorDef SourcePos DataConName Telescope deriving (Show, Generic) deriving anyclass (Unbound.Alpha, Unbound.Subst Term) @@ -229,8 +231,8 @@ unPosFlaky t = fromMaybe (newPos "unknown location" 0 0) (unPos t) -- | Is this the syntax of a literal (natural) number isNumeral :: Term -> Maybe Int isNumeral (Pos _ t) = isNumeral t -isNumeral (DCon c []) | c == "Zero" = Just 0 -isNumeral (DCon c [Arg _ t]) | c == "Succ" = +isNumeral (DataCon c []) | c == "Zero" = Just 0 +isNumeral (DataCon c [Arg _ t]) | c == "Succ" = do n <- isNumeral t; return (n + 1) isNumeral _ = Nothing @@ -244,24 +246,24 @@ isPatVar _ = False -- | prelude names for built-in datatypes -sigmaName :: TCName +sigmaName :: TyConName sigmaName = "Sigma" -prodName :: DCName +prodName :: DataConName prodName = "Prod" -boolName :: TCName +boolName :: TyConName boolName = "Bool" -trueName :: DCName +trueName :: DataConName trueName = "True" -falseName :: DCName +falseName :: DataConName falseName = "False" -tyUnitName :: TCName +tyUnitName :: TyConName tyUnitName = "Unit" -litUnitName :: DCName +litUnitName :: DataConName litUnitName = "()" -initialTCNames :: Set TCName +initialTCNames :: Set TyConName initialTCNames = Set.fromList [sigmaName, boolName, tyUnitName] -initialDCNames :: Set DCName +initialDCNames :: Set DataConName initialDCNames = Set.fromList [prodName, trueName, falseName, litUnitName] preludeDataDecls :: [Decl] @@ -280,8 +282,8 @@ preludeDataDecls = -- Sigma-type sigmaTele = Telescope [TypeSig sigA, TypeSig sigB] prodConstructorDef = ConstructorDef internalPos prodName (Telescope [TypeSig sigX, TypeSig sigY]) - sigA = Sig aName Rel Type - sigB = Sig bName Rel (Pi Rel (Var aName) (Unbound.bind xName Type)) + sigA = Sig aName Rel TyType + sigB = Sig bName Rel (TyPi Rel (Var aName) (Unbound.bind xName TyType)) sigX = Sig xName Rel (Var aName) sigY = Sig yName Rel (App (Var bName) (Arg Rel (Var xName))) aName = Unbound.string2Name "a" @@ -367,11 +369,11 @@ instance Unbound.Subst Term Term where -- '(y : x) -> y' pi1 :: Term -pi1 = Pi Rel (Var xName) (Unbound.bind yName (Var yName)) +pi1 = TyPi Rel (Var xName) (Unbound.bind yName (Var yName)) -- '(y : Bool) -> y' pi2 :: Term -pi2 = Pi Rel TyBool (Unbound.bind yName (Var yName)) +pi2 = TyPi Rel TyBool (Unbound.bind yName (Var yName)) -- >>> Unbound.aeq (Unbound.subst xName TyBool pi1) pi2 -- True diff --git a/full/src/TypeCheck.hs b/full/src/TypeCheck.hs index 0b59abe..41bc42e 100644 --- a/full/src/TypeCheck.hs +++ b/full/src/TypeCheck.hs @@ -39,7 +39,7 @@ checkType tm ty = do -- | Make sure that the term is a "type" (i.e. that it has type 'Type') tcType :: Term -> TcMonad () -tcType tm = void $ Env.withStage Irr $ checkType tm Type +tcType tm = void $ Env.withStage Irr $ checkType tm TyType --------------------------------------------------------------------- @@ -53,15 +53,15 @@ tcTerm t@(Var x) Nothing = do Env.checkStage (sigEp sig) return (sigType sig) -- i-type -tcTerm Type Nothing = return Type +tcTerm TyType Nothing = return TyType -- i-pi -tcTerm (Pi ep tyA bnd) Nothing = do +tcTerm (TyPi ep tyA bnd) Nothing = do (x, tyB) <- Unbound.unbind bnd tcType tyA Env.extendCtx (TypeSig (Sig x ep tyA)) (tcType tyB) - return Type + return TyType -- c-lam: check the type of a function -tcTerm (Lam ep1 bnd) (Just (Pi ep2 tyA bnd2)) = do +tcTerm (Lam ep1 bnd) (Just (TyPi ep2 tyA bnd2)) = do -- unbind the variables in the lambda expression and pi type (x, body,_,tyB) <- Unbound.unbind2Plus bnd bnd2 -- epsilons should match up @@ -69,7 +69,7 @@ tcTerm (Lam ep1 bnd) (Just (Pi ep2 tyA bnd2)) = do DS "but found", DD ep1, DS "instead."] -- check the type of the body of the lambda expression Env.extendCtx (TypeSig (Sig x ep1 tyA)) (checkType body tyB) - return (Pi ep1 tyA bnd2) + return (TyPi ep1 tyA bnd2) tcTerm (Lam _ _) (Just nf) = Env.err [DS "Lambda expression should have a function type, not", DD nf] -- i-app @@ -101,11 +101,11 @@ tcTerm (Pos p tm) mTy = tcTerm TrustMe (Just ty) = return ty -- i-unit -tcTerm TyUnit Nothing = return Type +tcTerm TyUnit Nothing = return TyType tcTerm LitUnit Nothing = return TyUnit -- i-bool -tcTerm TyBool Nothing = return Type +tcTerm TyBool Nothing = return TyType -- i-true/false @@ -139,8 +139,8 @@ tcTerm (Let rhs bnd) mty = do Just _ -> return ty Nothing -> return $ Unbound.subst x rhs ty --- Type constructor application -tcTerm (TCon c params) Nothing = do +-- TyType constructor application +tcTerm (TyCon c params) Nothing = do (Telescope delta, _) <- Env.lookupTCon c unless (length params == length delta) $ Env.err @@ -152,13 +152,13 @@ tcTerm (TCon c params) Nothing = do DD (length params) ] tcArgTele params delta - return Type + return TyType -- Data constructor application -- we don't know the expected type, so see if there -- is only one datacon of that name that takes no -- parameters -tcTerm t@(DCon c args) Nothing = do +tcTerm t@(DataCon c args) Nothing = do matches <- Env.lookupDConAll c case matches of [(tname, (Telescope [], ConstructorDef _ _ (Telescope deltai)))] -> do @@ -174,7 +174,7 @@ tcTerm t@(DCon c args) Nothing = do DS "arguments." ] tcArgTele args deltai - return $ TCon tname [] + return $ TyCon tname [] [_] -> Env.err @@ -185,9 +185,9 @@ tcTerm t@(DCon c args) Nothing = do -- we know the expected type of the data constructor -- so look up its type in the context -tcTerm t@(DCon c args) (Just ty) = do +tcTerm t@(DataCon c args) (Just ty) = do case ty of - (TCon tname params) -> do + (TyCon tname params) -> do (Telescope delta, Telescope deltai) <- Env.lookupDCon c tname let isTypeSig :: Decl -> Bool isTypeSig (TypeSig _) = True @@ -218,7 +218,7 @@ tcTerm t@(Case scrut alts) (Just ty) = do (pat, body) <- Unbound.unbind bnd -- add variables from pattern to context -- could fail if branch is in-accessible - decls <- declarePat pat Rel (TCon c args) + decls <- declarePat pat Rel (TyCon c args) -- add defs to the contents from scrut = pat -- could fail if branch is in-accessible decls' <- Equal.unify [] scrut' (pat2Term pat) @@ -233,7 +233,7 @@ tcTerm t@(Case scrut alts) (Just ty) = do tcTerm (TyEq a b) Nothing = do aTy <- inferType a checkType b aTy - return Type + return TyType tcTerm Refl (Just ty@(TyEq a b)) = do Equal.equate a b return ty @@ -257,7 +257,7 @@ tcTerm t@(Contra p) (Just ty) = do b' <- Equal.whnf b case (a', b') of - (DCon da _, DCon db _) + (DataCon da _, DataCon db _) | da /= db -> return ty @@ -274,20 +274,20 @@ tcTerm t@(Contra p) (Just ty) = do ] -tcTerm t@(Sigma tyA bnd) Nothing = do +tcTerm t@(TySigma tyA bnd) Nothing = do (x, tyB) <- Unbound.unbind bnd tcType tyA Env.extendCtx (mkSig x tyA) $ tcType tyB - return Type + return TyType tcTerm t@(Prod a b) (Just ty) = do case ty of - (Sigma tyA bnd) -> do + (TySigma tyA bnd) -> do (x, tyB) <- Unbound.unbind bnd checkType a tyA Env.extendCtxs [mkSig x tyA, Def x a] $ checkType b tyB - return (Sigma tyA (Unbound.bind x tyB)) + return (TySigma tyA (Unbound.bind x tyB)) _ -> Env.err [ DS "Products must have Sigma Type", @@ -301,7 +301,7 @@ tcTerm t@(LetPair p bnd) (Just ty) = do pty <- inferType p pty' <- Equal.whnf pty case pty' of - Sigma tyA bnd' -> do + TySigma tyA bnd' -> do let tyB = Unbound.instantiate bnd' [Var x] decl <- def p (Prod (Var x) (Var y)) Env.extendCtxs ([mkSig x tyA, mkSig y tyB] ++ decl) $ @@ -416,7 +416,7 @@ declarePat pat Irr _ty = -- | Given a list of pattern arguments and a telescope, create a binding for -- each of the variables in the pattern, -declarePats :: DCName -> [(Pattern, Epsilon)] -> [Decl] -> TcMonad [Decl] +declarePats :: DataConName -> [(Pattern, Epsilon)] -> [Decl] -> TcMonad [Decl] declarePats dc pats (Def x ty : tele) = do let ds1 = [Def x ty] ds2 <- Env.extendCtxs ds1 $ declarePats dc pats tele @@ -435,7 +435,7 @@ declarePats dc _ _ = Env.err [DS "Invalid telescope", DD dc] -- | Convert a pattern to a term pat2Term :: Pattern -> Term pat2Term (PatVar x) = Var x -pat2Term (PatCon dc pats) = DCon dc (pats2Terms pats) +pat2Term (PatCon dc pats) = DataCon dc (pats2Terms pats) where pats2Terms :: [(Pattern, Epsilon)] -> [Arg] pats2Terms [] = [] @@ -639,7 +639,7 @@ exhaustivityCheck scrut ty pats = do -- make sure that the given list of constructors is impossible -- in the current environment - checkImpossible :: [ConstructorDef] -> TcMonad [DCName] + checkImpossible :: [ConstructorDef] -> TcMonad [DataConName] checkImpossible [] = return [] checkImpossible (ConstructorDef _ dc (Telescope tele) : rest) = do this <- @@ -659,7 +659,7 @@ exhaustivityCheck scrut ty pats = do -- constructor definitions, pull the definition out of the list and -- return it paired with the remainder of the list. removeDCon :: - DCName -> + DataConName -> [ConstructorDef] -> TcMonad (ConstructorDef, [ConstructorDef]) removeDCon dc (cd@(ConstructorDef _ dc' _) : rest) @@ -673,7 +673,7 @@ removeDCon dc [] = Env.err [DS $ "Internal error: Can't find " ++ show dc] -- | Given a particular data constructor name and a list of patterns, -- pull out the subpatterns that occur as arguments to that data -- constructor and return them paired with the remaining patterns. -relatedPats :: DCName -> [Pattern] -> ([[(Pattern, Epsilon)]], [Pattern]) +relatedPats :: DataConName -> [Pattern] -> ([[(Pattern, Epsilon)]], [Pattern]) relatedPats dc [] = ([], []) relatedPats dc (pc@(PatVar _) : pats) = ([], pc : pats) relatedPats dc ((PatCon dc' args) : pats) @@ -692,7 +692,7 @@ relatedPats dc (pc : pats) = -- for simplicity, this function requires that all subpatterns -- are pattern variables. -checkSubPats :: DCName -> [Decl] -> [[(Pattern, Epsilon)]] -> TcMonad () +checkSubPats :: DataConName -> [Decl] -> [[(Pattern, Epsilon)]] -> TcMonad () checkSubPats dc [] _ = return () checkSubPats dc (Def _ _ : tele) patss = checkSubPats dc tele patss checkSubPats dc (TypeSig _ : tele) patss diff --git a/main/src/Arbitrary.hs b/main/src/Arbitrary.hs index 1a17007..f52c322 100644 --- a/main/src/Arbitrary.hs +++ b/main/src/Arbitrary.hs @@ -6,7 +6,7 @@ module Arbitrary where import qualified Data.Set as Set import Test.QuickCheck - ( elements, frequency, sized, Arbitrary(arbitrary), Gen ) + ( elements, frequency, sized, Arbitrary(arbitrary), Gen ) import qualified Test.QuickCheck as QC import qualified Unbound.Generics.LocallyNameless as Unbound import Text.Parsec.Error ( ParseError ) @@ -18,18 +18,18 @@ import Parser ( testParser, expr ) -- | Round trip property: a given term prints then parses to the same term. prop_roundtrip :: Term -> QC.Property -prop_roundtrip tm = +prop_roundtrip tm = let str = render (disp tm) in case test_parseExpr str of Left _ -> QC.counterexample ("*** Could not parse:\n" ++ str) False Right tm' -> QC.counterexample ("*** Round trip failure! Parsing:\n" ++ str ++ "\n*** results in\n" ++ show tm') (Unbound.aeq tm tm') - + test_parseExpr :: String -> Either Text.Parsec.Error.ParseError Term test_parseExpr = testParser {- SOLN DATA -} arbConstructorNames{- STUBWITH -} expr -- View random terms sampleTerms :: IO () -sampleTerms = QC.sample' (arbitrary :: Gen Term) >>= +sampleTerms = QC.sample' (arbitrary :: Gen Term) >>= mapM_ (putStrLn . render . disp) --------------------------------------------------------------------------------------------------- @@ -50,18 +50,18 @@ instance Arbitrary (Unbound.Name a) where arbitrary = genName {- SOLN DATA -} -tcNames :: [TCName] +tcNames :: [TyConName] tcNames = ["T", "List", "Vec" ] -dcNames :: [DCName] +dcNames :: [DataConName] dcNames = ["K", "Nil", "Cons"] arbConstructorNames :: ConstructorNames arbConstructorNames = ConstructorNames (Set.fromList tcNames) (Set.fromList dcNames) -genTCName :: Gen TCName +genTCName :: Gen TyConName genTCName = elements tcNames -genDCName :: Gen DCName +genDCName :: Gen DataConName genDCName = elements dcNames {- STUBWITH -} @@ -69,23 +69,23 @@ genDCName = elements dcNames -- Terms with no subterms base :: Gen Term -base = elements [Type, TrustMe, PrintMe, - tyUnit, litUnit, tyBool, +base = elements [TyType, TrustMe, PrintMe, + tyUnit, litUnit, tyBool, litTrue, litFalse{- SOLN EQUAL -} , Refl {- STUBWITH -} ] - where tyUnit = {- SOLN DATA -} TCon "Unit" [] {- STUBWITH TyUnit -} - litUnit = {- SOLN DATA -} DCon "()" [] {- STUBWITH LitUnit -} - tyBool = {- SOLN DATA -} TCon "Bool" [] {- STUBWITH TyBool -} - litTrue = {- SOLN DATA -} DCon "True" [] {- STUBWITH LitBool True -} - litFalse = {- SOLN DATA -} DCon "False" [] {- STUBWITH LitBool False -} + where tyUnit = {- SOLN DATA -} TyCon "Unit" [] {- STUBWITH TyUnit -} + litUnit = {- SOLN DATA -} DataCon "()" [] {- STUBWITH LitUnit -} + tyBool = {- SOLN DATA -} TyCon "Bool" [] {- STUBWITH TyBool -} + litTrue = {- SOLN DATA -} DataCon "True" [] {- STUBWITH LitBool True -} + litFalse = {- SOLN DATA -} DataCon "False" [] {- STUBWITH LitBool False -} -- Generate a random term --- In the inner recursion, the bool prevents the generation of TCon/DCon applications +-- In the inner recursion, the bool prevents the generation of TyCon/DataCon applications -- inside Apps --- we want these terms to be fully saturated. genTerm :: Int -> Gen Term genTerm n | n <= 1 = base | otherwise = go True n where - go b n0 = + go b n0 = let n' = n0 `div` 2 in frequency [ (1, Var <$> genName), @@ -99,8 +99,8 @@ genTerm n (1, Contra <$> go True n'), {- STUBWITH -} {- SOLN DATA -} - (if b then 1 else 0, TCon <$> genTCName <*> genArgs n'), - (if b then 1 else 0, DCon <$> genDCName <*> genArgs n'), + (if b then 1 else 0, TyCon <$> genTCName <*> genArgs n'), + (if b then 1 else 0, DataCon <$> genDCName <*> genArgs n'), (1, Case <$> go True n' <*> genBoundedList 2 (genMatch n')), {- STUBWITH (1, If <$> genTerm n' <*> genTerm n' <*> genTerm n'), (1, genSigma n'), @@ -110,7 +110,7 @@ genTerm n ] genLam :: Int -> Gen Term -genLam n = do +genLam n = do p <- genName {- SOLN EP -} ep <- arbitrary {- STUBWITH -} @@ -119,31 +119,31 @@ genLam n = do genPi :: Int -> Gen Term -genPi n = do +genPi n = do p <- genName {- SOLN EP -} ep <- arbitrary {- STUBWITH -} tyA <- genTerm n tyB <- genTerm n - return $ Pi {- SOLN EP -} ep{- STUBWITH -} tyA (Unbound.bind p tyB) + return $ TyPi {- SOLN EP -} ep{- STUBWITH -} tyA (Unbound.bind p tyB) genSigma :: Int -> Gen Term genSigma n = do - p <- genName + p <- genName tyA <- genTerm n tyB <- genTerm n - return $ Sigma tyA (Unbound.bind p tyB) + return $ TySigma tyA (Unbound.bind p tyB) -genLet :: Int -> Gen Term +genLet :: Int -> Gen Term genLet n = do - p <- genName + p <- genName rhs <- genTerm n b <- genTerm n return $ Let rhs (Unbound.bind p b) -genLetPair :: Int -> Gen Term +genLetPair :: Int -> Gen Term genLetPair n = do - p <- (,) <$> genName <*> genName + p <- (,) <$> genName <*> genName a <- genTerm n b <- genTerm n return $ LetPair a (Unbound.bind p b) @@ -151,7 +151,7 @@ genLetPair n = do {- SOLN EP -} instance Arbitrary Arg where arbitrary = sized genArg - shrink (Arg ep tm) = + shrink (Arg ep tm) = [ Arg ep tm' | tm' <- QC.shrink tm] genArg :: Int -> Gen Arg @@ -159,7 +159,7 @@ genArg n = Arg <$> arbitrary <*> genTerm (n `div` 2) genArgs :: Int -> Gen [Arg] genArgs n = genBoundedList 2 (genArg n) - + instance Arbitrary Epsilon where arbitrary = elements [ Rel, Irr ] {- STUBWITH -} @@ -168,10 +168,10 @@ instance Arbitrary Epsilon where {- SOLN DATA -} genPattern :: Int -> Gen Pattern genPattern n | n == 0 = PatVar <$> genName - | otherwise = frequency + | otherwise = frequency [(1, PatVar <$> genName), (1, PatCon <$> genDCName <*> genPatArgs)] - where + where n' = n `div` 2 genPatArgs = genBoundedList 2 ( (,) <$> genPattern n' <*> arbitrary ) @@ -179,7 +179,7 @@ genMatch :: Int -> Gen Match genMatch n = Match <$> (Unbound.bind <$> genPattern n <*> genTerm n) instance Arbitrary Pattern where - arbitrary = sized genPattern + arbitrary = sized genPattern shrink (PatCon n pats) = map fst pats ++ [PatCon n pats' | pats' <- QC.shrink pats] shrink _ = [] @@ -192,26 +192,26 @@ instance Arbitrary Term where arbitrary = sized genTerm -- when QC finds a counterexample, it tries to shrink it to find a smaller one - shrink (App tm arg) = - [tm, {- SOLN EP -} unArg{- STUBWITH -} arg] ++ [App tm' arg | tm' <- QC.shrink tm] + shrink (App tm arg) = + [tm, {- SOLN EP -} unArg{- STUBWITH -} arg] ++ [App tm' arg | tm' <- QC.shrink tm] ++ [App tm arg' | arg' <- QC.shrink arg] shrink (Lam {- SOLN EP -} ep {- STUBWITH -}bnd) = [] - shrink (Pi {- SOLN EP -} ep {- STUBWITH -}tyA bnd) = [tyA] + shrink (TyPi {- SOLN EP -} ep {- STUBWITH -}tyA bnd) = [tyA] shrink (Let rhs bnd) = [rhs] - shrink (Sigma tyA bnd) = [tyA] + shrink (TySigma tyA bnd) = [tyA] {- SOLN EQUAL -} shrink (TyEq a b) = [a,b] ++ [TyEq a' b | a' <- QC.shrink a] ++ [TyEq a b' | b' <- QC.shrink b] shrink (Subst a b) = [a,b] ++ [Subst a' b | a' <- QC.shrink a] ++ [Subst a b' | b' <- QC.shrink b] - shrink (Contra a) = [a] ++ [Contra a' | a' <- QC.shrink a] + shrink (Contra a) = a : [Contra a' | a' <- QC.shrink a] {- STUBWITH -} {- SOLN DATA -} - shrink (TCon n as) = map unArg as ++ [TCon n as' | as' <- QC.shrink as] - shrink (DCon n as) = map unArg as ++ [DCon n as' | as' <- QC.shrink as] + shrink (TyCon n as) = map unArg as ++ [TyCon n as' | as' <- QC.shrink as] + shrink (DataCon n as) = map unArg as ++ [DataCon n as' | as' <- QC.shrink as] shrink (Case a ms) = [a] ++ [Case a' ms | a' <- QC.shrink a] ++ [Case a ms' | ms' <- QC.shrink ms] {- STUBWITH -} shrink _ = [] - + ------------------------------------------------------- -- * General quickcheck utilities diff --git a/main/src/Environment.hs b/main/src/Environment.hs index 14440c8..948ab55 100644 --- a/main/src/Environment.hs +++ b/main/src/Environment.hs @@ -91,6 +91,7 @@ emptyEnv = Env {ctx = {- SOLN DATA -} preludeDataDecls {- STUBWITH [] -} } instance Disp Env where + disp :: Env -> Doc disp e = vcat [disp decl | decl <- ctx e] -- | Find a name's user supplied type signature. @@ -162,7 +163,7 @@ lookupRecDef v = do -- | Find a type constructor in the context lookupTCon :: (MonadReader Env m, MonadError Err m) => - TCName -> + TyConName -> m (Telescope, Maybe [ConstructorDef]) lookupTCon v = do g <- asks ctx @@ -191,8 +192,8 @@ lookupTCon v = do -- all potential matches lookupDConAll :: (MonadReader Env m) => - DCName -> - m [(TCName, (Telescope, ConstructorDef))] + DataConName -> + m [(TyConName, (Telescope, ConstructorDef))] lookupDConAll v = do g <- asks ctx scanGamma g @@ -212,8 +213,8 @@ lookupDConAll v = do -- Throws an error if the data constructor cannot be found for that type. lookupDCon :: (MonadReader Env m, MonadError Err m) => - DCName -> - TCName -> + DataConName -> + TyConName -> m (Telescope, Telescope) lookupDCon c tname = do matches <- lookupDConAll c @@ -312,13 +313,16 @@ extendErr ma msg' = throwError $ Err ps (msg $$ msg') instance Semigroup Err where + (<>) :: Err -> Err -> Err (Err src1 d1) <> (Err src2 d2) = Err (src1 ++ src2) (d1 `mappend` d2) instance Monoid Err where + mempty :: Err mempty = Err [] mempty instance Disp Err where + disp :: Err -> Doc disp (Err [] msg) = msg disp (Err ((SourceLocation p term) : _) msg) = disp p diff --git a/main/src/Equal.hs b/main/src/Equal.hs index 54e8699..03e6ad9 100644 --- a/main/src/Equal.hs +++ b/main/src/Equal.hs @@ -22,7 +22,7 @@ equate t1 t2 = do n1 <- whnf t1 n2 <- whnf t2 case (n1, n2) of - (Type, Type) -> return () + (TyType, TyType) -> return () (Var x, Var y) | x == y -> return () (Lam {- SOLN EP -} ep1 {- STUBWITH -}bnd1, Lam {- SOLN EP -} ep2 {- STUBWITH -}bnd2) -> do (_, b1, _, b2) <- Unbound.unbind2Plus bnd1 bnd2 @@ -32,7 +32,7 @@ equate t1 t2 = do equate b1 b2 (App a1 a2, App b1 b2) -> equate a1 b1 >> {- SOLN EP -} equateArg{- STUBWITH equate -} a2 b2 - (Pi {- SOLN EP -} ep1 {- STUBWITH -}tyA1 bnd1, Pi {- SOLN EP -} ep2 {- STUBWITH -}tyA2 bnd2) -> do + (TyPi {- SOLN EP -} ep1 {- STUBWITH -}tyA1 bnd1, TyPi {- SOLN EP -} ep2 {- STUBWITH -}tyA2 bnd2) -> do (_, tyB1, _, tyB2) <- Unbound.unbind2Plus bnd1 bnd2 {- SOLN EP -} unless (ep1 == ep2) $ @@ -58,7 +58,7 @@ equate t1 t2 = do equate rhs1 rhs2 equate body1 body2 - (Sigma tyA1 bnd1, Sigma tyA2 bnd2) -> do + (TySigma tyA1 bnd1, TySigma tyA2 bnd2) -> do Just (x, tyB1, _, tyB2) <- Unbound.unbind2 bnd1 bnd2 equate tyA1 tyA2 equate tyB1 tyB2 @@ -86,9 +86,9 @@ equate t1 t2 = do equate a1 a2 {- STUBWITH -} {- SOLN DATA -} - (TCon c1 ts1, TCon c2 ts2) | c1 == c2 -> + (TyCon c1 ts1, TyCon c2 ts2) | c1 == c2 -> zipWithM_ equateArgs [ts1] [ts2] - (DCon d1 a1, DCon d2 a2) | d1 == d2 -> do + (DataCon d1 a1, DataCon d2 a2) | d1 == d2 -> do equateArgs a1 a2 (Case s1 brs1, Case s2 brs2) | length brs1 == length brs2 -> do @@ -137,7 +137,7 @@ equateArg a1 a2 = ------------------------------------------------------- --- | Ensure that the given type 'ty' is a 'Pi' type +-- | Ensure that the given type 'ty' is a 'TyPi' type -- (or could be normalized to be such) and return the components of -- the type. -- Throws an error if this is not the case. @@ -146,7 +146,7 @@ ensurePi :: Type -> ensurePi ty = do nf <- whnf ty case nf of - (Pi {- SOLN EP -} ep {- STUBWITH -} tyA bnd) -> do + (TyPi {- SOLN EP -} ep {- STUBWITH -} tyA bnd) -> do return ({- SOLN EP -} ep,{- STUBWITH -} tyA, bnd) _ -> Env.err [DS "Expected a function type, instead found", DD nf] @@ -169,11 +169,11 @@ ensureTyEq ty = do -- | Ensure that the given type 'ty' is some tycon applied to -- params (or could be normalized to be such) -- Throws an error if this is not the case -ensureTCon :: Term -> TcMonad (TCName, [Arg]) +ensureTCon :: Term -> TcMonad (TyConName, [Arg]) ensureTCon aty = do nf <- whnf aty case nf of - TCon n params -> return (n, params) + TyCon n params -> return (n, params) _ -> Env.err [DS "Expected a data type but found", DD nf] {- STUBWITH -} @@ -230,7 +230,7 @@ whnf (Subst tm pf) = do whnf (Case scrut mtchs) = do nf <- whnf scrut case nf of - (DCon d args) -> f mtchs where + (DataCon d args) -> f mtchs where f (Match bnd : alts) = (do (pat, br) <- Unbound.unbind bnd ss <- patternMatches (Arg Rel nf) pat @@ -253,8 +253,8 @@ patternMatches (Arg _ t) (PatVar x) = return [(x, t)] patternMatches (Arg Rel t) pat = do nf <- whnf t case (nf, pat) of - (DCon d [], PatCon d' pats) | d == d' -> return [] - (DCon d args, PatCon d' pats) | d == d' -> + (DataCon d [], PatCon d' pats) | d == d' -> return [] + (DataCon d args, PatCon d' pats) | d == d' -> concat <$> zipWithM patternMatches args (map fst pats) _ -> Env.err [DS "arg", DD nf, DS "doesn't match pattern", DD pat] patternMatches (Arg Irr _) pat = do @@ -275,16 +275,16 @@ unify ns tx ty = do (yty, Var y) | y `notElem` ns -> return [Def y yty] (Prod a1 a2, Prod b1 b2) -> unifyArgs [Arg Rel a1, Arg Rel a2] [Arg Rel b1, Arg Rel b2] (TyEq a1 a2, TyEq b1 b2) -> unifyArgs [Arg Rel a1, Arg Rel a2] [Arg Rel b1, Arg Rel b2] - (TCon s1 tms1, TCon s2 tms2) + (TyCon s1 tms1, TyCon s2 tms2) | s1 == s2 -> unifyArgs tms1 tms2 - (DCon s1 a1s, DCon s2 a2s) + (DataCon s1 a1s, DataCon s2 a2s) | s1 == s2 -> unifyArgs a1s a2s (Lam ep1 bnd1, Lam ep2 bnd2) -> do (x, b1, _, b2) <- Unbound.unbind2Plus bnd1 bnd2 unless (ep1 == ep2) $ do Env.err [DS "Cannot equate", DD txnf, DS "and", DD tynf] unify (x:ns) b1 b2 - (Pi ep1 tyA1 bnd1, Pi ep2 tyA2 bnd2) -> do + (TyPi ep1 tyA1 bnd1, TyPi ep2 tyA2 bnd2) -> do (x, tyB1, _, tyB2) <- Unbound.unbind2Plus bnd1 bnd2 unless (ep1 == ep2) $ do Env.err [DS "Cannot equate", DD txnf, DS "and", DD tynf] diff --git a/main/src/Modules.hs b/main/src/Modules.hs index d405cdc..c50aa01 100644 --- a/main/src/Modules.hs +++ b/main/src/Modules.hs @@ -29,7 +29,7 @@ getModules prefixes top = do {- STUBWITH mapM reparse toParse -} data ModuleInfo = ModuleInfo { - modInfoName :: MName, + modInfoName :: ModuleName, modInfoFilename :: String, modInfoImports :: [ModuleImport] } @@ -59,7 +59,7 @@ topSort ms = reverse sorted -- | Find the file associated with a module. getModuleFileName :: (MonadIO m) - => [FilePath] -> MName -> m FilePath + => [FilePath] -> ModuleName -> m FilePath getModuleFileName prefixes modul = do let makeFileName prefix = prefix mDotPi -- get M.pi from M or M.pi diff --git a/main/src/Parser.hs b/main/src/Parser.hs index ab56d60..c4e8de3 100644 --- a/main/src/Parser.hs +++ b/main/src/Parser.hs @@ -35,8 +35,8 @@ Optional components in this BNF are marked with < > terms: a,b,A,B ::= - Type Universes - | x Variables (start with lowercase) + Type Universe + | x Variables (must start with lowercase) | \ x . a Function definition | a b Application | (x : A) -> B Pi type @@ -56,9 +56,9 @@ Optional components in this BNF are marked with < > | if a then b else c If | { x : A | B } Dependent pair type - | A * B Nondependent pair syntactic sugar - | (a, b) Prod introduction - | let (x,y) = a in b Prod elimination + | A * B Nondependent pair type (syntactic sugar) + | (a, b) Pair introduction + | let (x,y) = a in b Pair elimination {- SOLN EQUAL -} | a = b Equality type @@ -73,39 +73,57 @@ Optional components in this BNF are marked with < > C2 x [y] -> b2 {- STUBWITH -} {- SOLN EP -} - | \ [x <:A> ] . a Irr lambda - | a [b] Irr application - | [x : A] -> B Irr pi + | \ [x <:A> ] . a Irrelevant lambda + | a [b] Irrelevant application + | [x : A] -> B Irrelevant function type {- STUBWITH -} declarations: - foo : A - foo = a + foo : A Type declaration + foo = a Definition {- SOLN DATA -} - data T D : Type where - C1 of D1 + data T D : Type where Type constructor, with telescope + C1 of D1 Data constructor, with telescope ... Cn of Dn telescopes: D ::= Empty - | (x : A) D runtime cons - | (A) D runtime cons - | [x : A] D irrelevant cons - | [A = B] D equality constraint + | (x : A) D Relevant, dependent argument + | (A) D Relevent, nondependent argument + | [x : A] D Irrelevant, dependent argument + | [A = B] D Equality constraint {- STUBWITH -} Syntax sugar: + - Nondependent function types, like: + + A -> B + + Get parsed as (x:A) -> B, with an internal name for x + + - Nondependent product types, like: + + A * B + + Get parsed as { x:A | B }, with an internal name for x + - You can collapse lambdas, like: \ x [y] z . a This gets parsed as \ x . \ [y] . \ z . a + - Natural numbers, like: + + 3 + + Get parsed as peano numbers (Succ (Succ (Succ Zero))) + -} liftError :: (MonadError e m) => Either e a -> m a @@ -235,7 +253,7 @@ wildcard = reservedOp "_" >> return wildcardName varOrWildcard :: LParser TName varOrWildcard = try wildcard <|> variable -dconstructor :: LParser DCName +dconstructor :: LParser DataConName dconstructor = do i <- identifier cnames <- get @@ -245,7 +263,7 @@ dconstructor = then fail "Expected a data constructor, but a type constructor was found." else fail "Expected a constructor, but a variable was found" -tconstructor :: LParser TCName +tconstructor :: LParser TyConName tconstructor = do i <- identifier cnames <- get @@ -262,9 +280,9 @@ varOrCon :: LParser Term varOrCon = do i <- identifier cnames <- get if (i `S.member` (dconNames cnames)) - then return (DCon i [] ) + then return (DataCon i [] ) else if (i `S.member` tconNames cnames) - then return (TCon i []) + then return (TyCon i []) else return (Var (Unbound.string2Name i)) {- STUBWITH -} @@ -288,8 +306,8 @@ natural = fromInteger <$> Token.natural tokenizer natenc :: LParser Term natenc = encode <$> natural - where encode 0 = DCon "Zero" [] - encode n = DCon "Succ" [Arg Rel (encode (n-1))] + where encode 0 = DataCon "Zero" [] + encode n = DataCon "Succ" [Arg Rel (encode (n-1))] {- STUBWITH -} moduleImports :: LParser Module @@ -365,7 +383,7 @@ dataDef = do name <- identifier params <- telescope colon - Type <- typen + TyType <- typen modify (\cnames -> cnames{ tconNames = S.insert name (tconNames cnames) }) @@ -435,13 +453,13 @@ expr = do mkArrowType = do n <- Unbound.fresh wildcardName return $ \tyA tyB -> - Pi {- SOLN EP -} Rel {- STUBWITH -}tyA (Unbound.bind n tyB) + TyPi {- SOLN EP -} Rel {- STUBWITH -}tyA (Unbound.bind n tyB) mkTupleType = do n <- Unbound.fresh wildcardName return $ \tyA tyB -> {- SOLN DATA -} - TCon sigmaName [Arg Rel tyA, Arg Rel $ Lam Rel (Unbound.bind n tyB)] -{- STUBWITH Sigma tyA (Unbound.bind n tyB) -} + TyCon sigmaName [Arg Rel tyA, Arg Rel $ Lam Rel (Unbound.bind n tyB)] +{- STUBWITH TySigma tyA (Unbound.bind n tyB) -} -- A "term" is either a function application or a constructor -- application. Breaking it out as a seperate category both @@ -458,13 +476,13 @@ dconapp :: LParser Term dconapp = do c <- dconstructor args <- many arg - return $ DCon c args + return $ DataCon c args tconapp :: LParser Term tconapp = do c <- tconstructor ts <- many arg - return $ TCon c ts + return $ TyCon c ts {- STUBWITH -} funapp :: LParser Term @@ -516,7 +534,7 @@ impOrExpVar = try ((,Irr) <$> (brackets variable)) typen :: LParser Term typen = do reserved "Type" - return Type + return TyType @@ -538,11 +556,11 @@ lambda = do reservedOp "\\" bconst :: LParser Term {- SOLN DATA -} -bconst = choice [reserved "Bool" >> return (TCon boolName []), - reserved "False" >> return (DCon falseName []), - reserved "True" >> return (DCon trueName []), - reserved "Unit" >> return (TCon tyUnitName []), - reserved "()" >> return (DCon litUnitName [])] +bconst = choice [reserved "Bool" >> return (TyCon boolName []), + reserved "False" >> return (DataCon falseName []), + reserved "True" >> return (DataCon trueName []), + reserved "Unit" >> return (TyCon tyUnitName []), + reserved "()" >> return (DataCon litUnitName [])] {- STUBWITH bconst = choice [reserved "Bool" >> return TyBool, reserved "False" >> return (LitBool False), @@ -605,7 +623,7 @@ impProd = <|> ((,) <$> Unbound.fresh wildcardName <*> expr)) reservedOp "->" tyB <- expr - return $ Pi Irr tyA (Unbound.bind x tyB) + return $ TyPi Irr tyA (Unbound.bind x tyB) {- STUBWITH -} -- Function types have the syntax '(x:A) -> B'. This production deals @@ -642,12 +660,12 @@ expProdOrAnnotOrParens = Colon (Var x) a -> option (Ann (Var x) a) (do b <- afterBinder - return $ Pi {- SOLN EP -} Rel {- STUBWITH -}a (Unbound.bind x b)) + return $ TyPi {- SOLN EP -} Rel {- STUBWITH -}a (Unbound.bind x b)) Colon a b -> return $ Ann a b Comma a b -> {- SOLN DATA -} - return $ DCon prodName [Arg Rel a, Arg Rel b] + return $ DataCon prodName [Arg Rel a, Arg Rel b] {- STUBWITH return $ Prod a b -} Nope a -> return a @@ -681,8 +699,8 @@ pattern = try (PatCon <$> dconstructor <*> many arg_pattern) <|> do t <- varOrCon case t of (Var x) -> return $ PatVar x - (DCon c []) -> return $ PatCon c [] - (TCon c []) -> fail "expected a data constructor but a type constructor was found" + (DataCon c []) -> return $ PatCon c [] + (TyCon c []) -> fail "expected a data constructor but a type constructor was found" _ -> error "internal error in atomic_pattern" @@ -732,7 +750,7 @@ sigmaTy = do b <- expr reservedOp "}" {- SOLN DATA -} - return $ TCon sigmaName [Arg Rel a, Arg Rel (Lam Rel (Unbound.bind x b))] -{- STUBWITH return (Sigma a (Unbound.bind x b)) -} + return $ TyCon sigmaName [Arg Rel a, Arg Rel (Lam Rel (Unbound.bind x b))] +{- STUBWITH return (TySigma a (Unbound.bind x b)) -} diff --git a/main/src/PrettyPrint.hs b/main/src/PrettyPrint.hs index 13c319d..db9b837 100644 --- a/main/src/PrettyPrint.hs +++ b/main/src/PrettyPrint.hs @@ -232,13 +232,13 @@ levelLet = 0 levelCase :: Int levelCase = 0 levelLam :: Int -levelLam = 0 +levelLam = 0 levelPi :: Int levelPi = 0 levelSigma :: Int levelSigma = 0 levelProd :: Int -levelProd = 0 +levelProd = 0 levelArrow :: Int levelArrow = 5 @@ -256,7 +256,7 @@ instance Display (Unbound.Name Term) where display = return . disp instance Display Term where - display Type = return $ PP.text "Type" + display TyType = return $ PP.text "Type" display (Var n) = display n display a@(Lam {- SOLN EP -} _ {- STUBWITH -}b) = do n <- ask prec @@ -267,7 +267,7 @@ instance Display Term where df <- withPrec levelApp (display f) dx <- withPrec (levelApp+1) (display x) return $ parens (levelApp < n) $ df <+> dx - display (Pi {- SOLN EP -} ep {- STUBWITH -}a bnd) = do + display (TyPi {- SOLN EP -} ep {- STUBWITH -}a bnd) = do Unbound.lunbind bnd $ \(n, b) -> do p <- ask prec lhs <- @@ -277,7 +277,7 @@ instance Display Term where da <- withPrec 0 (display a) return $ {- SOLN EP -} mandatoryBindParens ep {- STUBWITH PP.parens -} (dn <+> PP.colon <+> da) else {- SOLN EP -} do - case ep of + case ep of Rel -> withPrec (levelArrow+1) (display a) Irr -> PP.brackets <$> (withPrec 0 (display a)) {- STUBWITH withPrec (levelArrow+1) (display a) -} db <- withPrec levelPi (display b) @@ -307,7 +307,7 @@ instance Display Term where PP.text "if" <+> da <+> PP.text "then" <+> db <+> PP.text "else" <+> dc - display (Sigma tyA bnd) = + display (TySigma tyA bnd) = Unbound.lunbind bnd $ \(x, tyB) -> do if x `elem` toListOf Unbound.fv tyB then do dx <- display x @@ -336,15 +336,15 @@ instance Display Term where dy <- withPrec 0 $ display y dbody <- withPrec 0 $ display body return $ - parens (levelLet < p) $ - (PP.text "let" + parens (levelLet < p) $ + (PP.text "let" <+> (PP.text "(" PP.<> dx PP.<> PP.text "," PP.<> dy PP.<> PP.text ")") <+> PP.text "=" - <+> da + <+> da <+> PP.text "in") $$ dbody display (Let a bnd) = do @@ -390,23 +390,23 @@ instance Display Term where {- SOLN DATA -} display t | Just i <- isNumeral t = display i - display (TCon n args) = do + display (TyCon n args) = do p <- ask prec dn <- display n dargs <- withPrec (levelApp+1) $ mapM display args - return $ - parens (levelApp < p && length args > 0) (dn <+> PP.hsep dargs) - display (DCon n args) = do + return $ + parens (levelApp < p && not (null args)) (dn <+> PP.hsep dargs) + display (DataCon n args) = do p <- ask prec dn <- display n dargs <- withPrec (levelApp+1) $ mapM display args - return $ - parens (levelApp < p && length args > 0) (dn <+> PP.hsep dargs) + return $ + parens (levelApp < p && not (null args)) (dn <+> PP.hsep dargs) display (Case scrut alts) = do p <- asks prec dscrut <- withPrec 0 $ display scrut dalts <- withPrec 0 $ mapM display alts - let top = PP.text "case" <+> dscrut <+> PP.text "of" + let top = PP.text "case" <+> dscrut <+> PP.text "of" return $ parens (levelCase < p) $ if null dalts then top <+> PP.text "{ }" else top $$ PP.nest 2 (PP.vcat dalts) @@ -415,8 +415,8 @@ instance Display Term where {- SOLN EP -} instance Display Arg where - display arg = - case argEp arg of + display arg = + case argEp arg of Irr -> PP.brackets <$> withPrec 0 (display (unArg arg)) Rel -> display (unArg arg) {- STUBWITH -} @@ -432,14 +432,14 @@ instance Display Match where instance Display Pattern where display (PatCon c []) = display c display (PatCon c args) = do - dc <- display c + dc <- display c dargs <- mapM wrap args return $ dc <+> PP.hsep dargs - where + where wrap (a@(PatVar _),ep) = bindParens ep <$> display a - wrap (a@(PatCon _ []),ep) = bindParens ep <$> display a + wrap (a@(PatCon _ []),ep) = bindParens ep <$> display a wrap (a@(PatCon _ _),ep) = mandatoryBindParens ep <$> display a - + display (PatVar x) = display x instance Disp Telescope where @@ -449,9 +449,9 @@ instance Display a => Display (a, Epsilon) where display (t, ep) = bindParens ep <$> display t instance Display ConstructorDef where - display (ConstructorDef pos dc tele) = do - dn <- display dc - let dt = disp tele + display (ConstructorDef pos dc tele) = do + dn <- display dc + let dt = disp tele return $ dn PP.<+> PP.text "of" PP.<+> dt {- STUBWITH -} @@ -476,7 +476,7 @@ gatherBinders body = do {- SOLN EP -} precBindParens :: Epsilon -> Bool -> Doc -> Doc -precBindParens Rel b d = parens b d +precBindParens Rel b d = parens b d precBindParens Irr b d = PP.brackets d -- | Add [] for irrelevant arguments, leave other arguments alone diff --git a/main/src/Syntax.hs b/main/src/Syntax.hs index 1fc817c..e2cf303 100644 --- a/main/src/Syntax.hs +++ b/main/src/Syntax.hs @@ -1,7 +1,6 @@ -{- pi-forall language -} -- | The abstract syntax of the simple dependently typed language --- See comment at the top of 'Parser' for the concrete syntax of this language +-- See the comment at the top of 'Parser' for the concrete syntax of this language module Syntax where import Data.Maybe (fromMaybe) @@ -19,43 +18,46 @@ import Data.Function (on) ----------------------------------------- --- | For variable names, we use the Unbound library to +-- | For variable names, we use the `Unbound` library to -- automatically generate free variable, substitution, --- and alpha-equality function. +-- and alpha-equality function. The abstract type `Name` from +-- this library is indexed by the AST type that this variable +-- is a name for. type TName = Unbound.Name Term -- | module names -type MName = String +type ModuleName = String {- SOLN DATA -} -- | type constructor names -type TCName = String +type TyConName = String -- | data constructor names -type DCName = String +type DataConName = String {- STUBWITH -} ----------------------------------------- --- * Core language +-- * Core language of pi-forall (Combined syntax for types and terms) ----------------------------------------- --- | Combined syntax for types and terms --- (type synonym for documentation) +-- | Because types and terms use the same AST, we define the following +-- type synonym so that we can hint whether a piece of syntax is being used +-- as a type or as a term. type Type = Term -- | basic language data Term - = -- | type of types `Type` - Type - | -- | variables `x` + = -- | type of types, concretely `Type` + TyType + | -- | variable `x` Var TName | -- | abstraction `\x. a` Lam {- SOLN EP -} Epsilon{- STUBWITH -} (Unbound.Bind TName Term) | -- | application `a b` App Term {- SOLN EP -} Arg{- STUBWITH Term -} | -- | function type `(x : A) -> B` - Pi {- SOLN EP -} Epsilon{- STUBWITH -} Type (Unbound.Bind TName Type) + TyPi {- SOLN EP -} Epsilon{- STUBWITH -} Type (Unbound.Bind TName Type) | -- | annotated terms `( a : A )` Ann Term Type | -- | marked source position, for error messages @@ -78,7 +80,7 @@ data Term | -- | `if a then b1 else b2` expression for eliminating booleans If Term Term Term | -- | Sigma-type (homework), written `{ x : A | B }` - Sigma Term (Unbound.Bind TName Term) + TySigma Term (Unbound.Bind TName Term) | -- | introduction form for Sigma-types `( a , b )` Prod Term Term | -- | elimination form for Sigma-types `let (x,y) = a in b` @@ -95,9 +97,9 @@ data Term {- STUBWITH -} {- SOLN DATA -} | -- | type constructors (fully applied) - TCon TCName [Arg] + TyCon TyConName [Arg] | -- | term constructors (fully applied) - DCon DCName [Arg] + DataCon DataConName [Arg] | -- | case analysis `case a of matches` Case Term [Match] {- STUBWITH -} @@ -134,7 +136,7 @@ newtype Match = Match (Unbound.Bind Pattern Term) -- | The patterns of case expressions bind all variables -- in their respective branches. data Pattern - = PatCon DCName [(Pattern, Epsilon)] + = PatCon DataConName [(Pattern, Epsilon)] | PatVar TName deriving (Show, Eq, Generic, Typeable, Unbound.Alpha, Unbound.Subst Term) {- STUBWITH -} @@ -148,7 +150,7 @@ data Pattern -- | A Module has a name, a list of imports, a list of declarations, -- and a set of constructor names (which affect parsing). data Module = Module - { moduleName :: MName, + { moduleName :: ModuleName, moduleImports :: [ModuleImport], moduleEntries :: [Decl] {- SOLN DATA -} , moduleConstructors :: ConstructorNames {- STUBWITH -} @@ -156,7 +158,7 @@ data Module = Module deriving (Show, Generic, Typeable) -- | References to other modules (brings declarations and definitions into scope) -newtype ModuleImport = ModuleImport MName +newtype ModuleImport = ModuleImport ModuleName deriving (Show, Eq, Generic, Typeable) -- | A type declaration (or type signature) @@ -183,11 +185,11 @@ data Decl {- SOLN DATA -} | -- | Declaration for a datatype including all of -- its data constructors - Data TCName Telescope [ConstructorDef] + Data TyConName Telescope [ConstructorDef] | -- | An abstract view of a datatype. Does -- not include any information about its data -- constructors - DataSig TCName Telescope + DataSig TyConName Telescope {- STUBWITH -} deriving (Show, Generic, Typeable) deriving anyclass (Unbound.Alpha, Unbound.Subst Term) @@ -202,7 +204,7 @@ data ConstructorNames = ConstructorNames deriving (Show, Eq, Ord, Generic, Typeable) -- | A Data constructor has a name and a telescope of arguments -data ConstructorDef = ConstructorDef SourcePos DCName Telescope +data ConstructorDef = ConstructorDef SourcePos DataConName Telescope deriving (Show, Generic) deriving anyclass (Unbound.Alpha, Unbound.Subst Term) @@ -243,8 +245,8 @@ unPosFlaky t = fromMaybe (newPos "unknown location" 0 0) (unPos t) -- | Is this the syntax of a literal (natural) number isNumeral :: Term -> Maybe Int isNumeral (Pos _ t) = isNumeral t -isNumeral (DCon c []) | c == "Zero" = Just 0 -isNumeral (DCon c [Arg _ t]) | c == "Succ" = +isNumeral (DataCon c []) | c == "Zero" = Just 0 +isNumeral (DataCon c [Arg _ t]) | c == "Succ" = do n <- isNumeral t; return (n + 1) isNumeral _ = Nothing @@ -258,24 +260,24 @@ isPatVar _ = False -- | prelude names for built-in datatypes -sigmaName :: TCName +sigmaName :: TyConName sigmaName = "Sigma" -prodName :: DCName +prodName :: DataConName prodName = "Prod" -boolName :: TCName +boolName :: TyConName boolName = "Bool" -trueName :: DCName +trueName :: DataConName trueName = "True" -falseName :: DCName +falseName :: DataConName falseName = "False" -tyUnitName :: TCName +tyUnitName :: TyConName tyUnitName = "Unit" -litUnitName :: DCName +litUnitName :: DataConName litUnitName = "()" -initialTCNames :: Set TCName +initialTCNames :: Set TyConName initialTCNames = Set.fromList [sigmaName, boolName, tyUnitName] -initialDCNames :: Set DCName +initialDCNames :: Set DataConName initialDCNames = Set.fromList [prodName, trueName, falseName, litUnitName] preludeDataDecls :: [Decl] @@ -294,8 +296,8 @@ preludeDataDecls = -- Sigma-type sigmaTele = Telescope [TypeSig sigA, TypeSig sigB] prodConstructorDef = ConstructorDef internalPos prodName (Telescope [TypeSig sigX, TypeSig sigY]) - sigA = Sig aName Rel Type - sigB = Sig bName Rel (Pi Rel (Var aName) (Unbound.bind xName Type)) + sigA = Sig aName Rel TyType + sigB = Sig bName Rel (TyPi Rel (Var aName) (Unbound.bind xName TyType)) sigX = Sig xName Rel (Var aName) sigY = Sig yName Rel (App (Var bName) (Arg Rel (Var xName))) aName = Unbound.string2Name "a" @@ -381,11 +383,11 @@ instance Unbound.Subst Term Term where -- '(y : x) -> y' pi1 :: Term -pi1 = Pi {- SOLN EP -} Rel {- STUBWITH -}(Var xName) (Unbound.bind yName (Var yName)) +pi1 = TyPi {- SOLN EP -} Rel {- STUBWITH -}(Var xName) (Unbound.bind yName (Var yName)) -- '(y : Bool) -> y' pi2 :: Term -pi2 = Pi {- SOLN EP -} Rel {- STUBWITH -}TyBool (Unbound.bind yName (Var yName)) +pi2 = TyPi {- SOLN EP -} Rel {- STUBWITH -}TyBool (Unbound.bind yName (Var yName)) -- >>> Unbound.aeq (Unbound.subst xName TyBool pi1) pi2 -- True diff --git a/main/src/TypeCheck.hs b/main/src/TypeCheck.hs index f076065..620c9e4 100644 --- a/main/src/TypeCheck.hs +++ b/main/src/TypeCheck.hs @@ -41,7 +41,7 @@ checkType tm ty = {- SOLN EQUAL -} do -- | Make sure that the term is a "type" (i.e. that it has type 'Type') tcType :: Term -> TcMonad () -tcType tm = void $ {- SOLN EP -} Env.withStage Irr $ {- STUBWITH -}checkType tm Type +tcType tm = void $ {- SOLN EP -} Env.withStage Irr $ {- STUBWITH -}checkType tm TyType --------------------------------------------------------------------- @@ -56,15 +56,15 @@ tcTerm t@(Var x) Nothing = do Env.checkStage (sigEp sig) {- STUBWITH -} return (sigType sig) -- i-type -tcTerm Type Nothing = return Type +tcTerm TyType Nothing = return TyType -- i-pi -tcTerm (Pi {- SOLN EP -} ep {- STUBWITH -}tyA bnd) Nothing = do +tcTerm (TyPi {- SOLN EP -} ep {- STUBWITH -}tyA bnd) Nothing = do (x, tyB) <- Unbound.unbind bnd tcType tyA Env.extendCtx {- SOLN EP -} (TypeSig (Sig x ep tyA)){- STUBWITH (mkSig x tyA) -} (tcType tyB) - return Type + return TyType -- c-lam: check the type of a function -tcTerm (Lam {- SOLN EP -} ep1 {- STUBWITH -} bnd) (Just (Pi {- SOLN EP -} ep2 {- STUBWITH -}tyA bnd2)) = do +tcTerm (Lam {- SOLN EP -} ep1 {- STUBWITH -} bnd) (Just (TyPi {- SOLN EP -} ep2 {- STUBWITH -}tyA bnd2)) = do -- unbind the variables in the lambda expression and pi type (x, body,_,tyB) <- Unbound.unbind2Plus bnd bnd2 {- SOLN EP -} -- epsilons should match up @@ -72,7 +72,7 @@ tcTerm (Lam {- SOLN EP -} ep1 {- STUBWITH -} bnd) (Just (Pi {- SOLN EP -} ep2 {- DS "but found", DD ep1, DS "instead."] {- STUBWITH -} -- check the type of the body of the lambda expression Env.extendCtx {- SOLN EP -} (TypeSig (Sig x ep1 tyA)){- STUBWITH (mkSig x tyA) -} (checkType body tyB) - return (Pi {- SOLN EP -} ep1{- STUBWITH -} tyA bnd2) + return (TyPi {- SOLN EP -} ep1{- STUBWITH -} tyA bnd2) tcTerm (Lam {- SOLN EP -} _ {- STUBWITH -}_) (Just nf) = Env.err [DS "Lambda expression should have a function type, not", DD nf] -- i-app @@ -85,7 +85,7 @@ tcTerm (App t1 t2) Nothing = do let ensurePi :: Type -> TcMonad (Type, Unbound.Bind TName Type) ensurePi (Ann a _) = ensurePi a ensurePi (Pos _ a) = ensurePi a - ensurePi (Pi tyA bnd) = return (tyA,bnd) + ensurePi (TyPi tyA bnd) = return (tyA,bnd) ensurePi ty = Env.err [DS "Expected a function type but found ", DD ty] -} {- SOLN EP -} (ep1, tyA, bnd) <- ensurePi ty1 @@ -116,11 +116,11 @@ tcTerm (Pos p tm) mTy = tcTerm TrustMe (Just ty) = return ty -- i-unit -tcTerm TyUnit Nothing = return Type +tcTerm TyUnit Nothing = return TyType tcTerm LitUnit Nothing = return TyUnit -- i-bool -tcTerm TyBool Nothing = {- SOLN HW -} return Type +tcTerm TyBool Nothing = {- SOLN HW -} return TyType {- STUBWITH Env.err [DS "unimplemented"] -} -- i-true/false @@ -155,8 +155,8 @@ tcTerm (Let rhs bnd) mty = {- SOLN HW -} do Nothing -> return $ Unbound.subst x rhs ty {- STUBWITH Env.err [DS "unimplemented"] -} {- SOLN DATA -} --- Type constructor application -tcTerm (TCon c params) Nothing = do +-- TyType constructor application +tcTerm (TyCon c params) Nothing = do (Telescope delta, _) <- Env.lookupTCon c unless (length params == length delta) $ Env.err @@ -168,13 +168,13 @@ tcTerm (TCon c params) Nothing = do DD (length params) ] tcArgTele params delta - return Type + return TyType -- Data constructor application -- we don't know the expected type, so see if there -- is only one datacon of that name that takes no -- parameters -tcTerm t@(DCon c args) Nothing = do +tcTerm t@(DataCon c args) Nothing = do matches <- Env.lookupDConAll c case matches of [(tname, (Telescope [], ConstructorDef _ _ (Telescope deltai)))] -> do @@ -190,7 +190,7 @@ tcTerm t@(DCon c args) Nothing = do DS "arguments." ] tcArgTele args deltai - return $ TCon tname [] + return $ TyCon tname [] [_] -> Env.err @@ -201,9 +201,9 @@ tcTerm t@(DCon c args) Nothing = do -- we know the expected type of the data constructor -- so look up its type in the context -tcTerm t@(DCon c args) (Just ty) = do +tcTerm t@(DataCon c args) (Just ty) = do case ty of - (TCon tname params) -> do + (TyCon tname params) -> do (Telescope delta, Telescope deltai) <- Env.lookupDCon c tname let isTypeSig :: Decl -> Bool isTypeSig (TypeSig _) = True @@ -234,7 +234,7 @@ tcTerm t@(Case scrut alts) (Just ty) = do (pat, body) <- Unbound.unbind bnd -- add variables from pattern to context -- could fail if branch is in-accessible - decls <- declarePat pat Rel (TCon c args) + decls <- declarePat pat Rel (TyCon c args) -- add defs to the contents from scrut = pat -- could fail if branch is in-accessible decls' <- Equal.unify [] scrut' (pat2Term pat) @@ -251,7 +251,7 @@ tcTerm t@(Case scrut alts) (Just ty) = do tcTerm (TyEq a b) Nothing = do aTy <- inferType a checkType b aTy - return Type + return TyType tcTerm Refl (Just ty@(TyEq a b)) = do Equal.equate a b return ty @@ -276,7 +276,7 @@ tcTerm t@(Contra p) (Just ty) = do case (a', b') of {- STUBWITH -} {- SOLN DATA -} - (DCon da _, DCon db _) + (DataCon da _, DataCon db _) | da /= db -> return ty {- STUBWITH -} @@ -294,20 +294,20 @@ tcTerm t@(Contra p) (Just ty) = do ] {- STUBWITH -} -tcTerm t@(Sigma tyA bnd) Nothing = {- SOLN EQUAL -} do +tcTerm t@(TySigma tyA bnd) Nothing = {- SOLN EQUAL -} do (x, tyB) <- Unbound.unbind bnd tcType tyA Env.extendCtx (mkSig x tyA) $ tcType tyB - return Type + return TyType {- STUBWITH Env.err [DS "unimplemented"] -} tcTerm t@(Prod a b) (Just ty) = {- SOLN EQUAL -} do case ty of - (Sigma tyA bnd) -> do + (TySigma tyA bnd) -> do (x, tyB) <- Unbound.unbind bnd checkType a tyA Env.extendCtxs [mkSig x tyA, Def x a] $ checkType b tyB - return (Sigma tyA (Unbound.bind x tyB)) + return (TySigma tyA (Unbound.bind x tyB)) _ -> Env.err [ DS "Products must have Sigma Type", @@ -321,7 +321,7 @@ tcTerm t@(LetPair p bnd) (Just ty) = {- SOLN EQUAL -} do pty <- inferType p pty' <- Equal.whnf pty case pty' of - Sigma tyA bnd' -> do + TySigma tyA bnd' -> do let tyB = Unbound.instantiate bnd' [Var x] decl <- def p (Prod (Var x) (Var y)) Env.extendCtxs ([mkSig x tyA, mkSig y tyB] ++ decl) $ @@ -439,7 +439,7 @@ declarePat pat Irr _ty = -- | Given a list of pattern arguments and a telescope, create a binding for -- each of the variables in the pattern, -declarePats :: DCName -> [(Pattern, Epsilon)] -> [Decl] -> TcMonad [Decl] +declarePats :: DataConName -> [(Pattern, Epsilon)] -> [Decl] -> TcMonad [Decl] declarePats dc pats (Def x ty : tele) = do let ds1 = [Def x ty] ds2 <- Env.extendCtxs ds1 $ declarePats dc pats tele @@ -458,7 +458,7 @@ declarePats dc _ _ = Env.err [DS "Invalid telescope", DD dc] -- | Convert a pattern to a term pat2Term :: Pattern -> Term pat2Term (PatVar x) = Var x -pat2Term (PatCon dc pats) = DCon dc (pats2Terms pats) +pat2Term (PatCon dc pats) = DataCon dc (pats2Terms pats) where pats2Terms :: [(Pattern, Epsilon)] -> [Arg] pats2Terms [] = [] @@ -665,7 +665,7 @@ exhaustivityCheck scrut ty pats = do -- make sure that the given list of constructors is impossible -- in the current environment - checkImpossible :: [ConstructorDef] -> TcMonad [DCName] + checkImpossible :: [ConstructorDef] -> TcMonad [DataConName] checkImpossible [] = return [] checkImpossible (ConstructorDef _ dc (Telescope tele) : rest) = do this <- @@ -685,7 +685,7 @@ exhaustivityCheck scrut ty pats = do -- constructor definitions, pull the definition out of the list and -- return it paired with the remainder of the list. removeDCon :: - DCName -> + DataConName -> [ConstructorDef] -> TcMonad (ConstructorDef, [ConstructorDef]) removeDCon dc (cd@(ConstructorDef _ dc' _) : rest) @@ -699,7 +699,7 @@ removeDCon dc [] = Env.err [DS $ "Internal error: Can't find " ++ show dc] -- | Given a particular data constructor name and a list of patterns, -- pull out the subpatterns that occur as arguments to that data -- constructor and return them paired with the remaining patterns. -relatedPats :: DCName -> [Pattern] -> ([[(Pattern, Epsilon)]], [Pattern]) +relatedPats :: DataConName -> [Pattern] -> ([[(Pattern, Epsilon)]], [Pattern]) relatedPats dc [] = ([], []) relatedPats dc (pc@(PatVar _) : pats) = ([], pc : pats) relatedPats dc ((PatCon dc' args) : pats) @@ -718,7 +718,7 @@ relatedPats dc (pc : pats) = -- for simplicity, this function requires that all subpatterns -- are pattern variables. -checkSubPats :: DCName -> [Decl] -> [[(Pattern, Epsilon)]] -> TcMonad () +checkSubPats :: DataConName -> [Decl] -> [[(Pattern, Epsilon)]] -> TcMonad () checkSubPats dc [] _ = return () checkSubPats dc (Def _ _ : tele) patss = checkSubPats dc tele patss checkSubPats dc (TypeSig _ : tele) patss diff --git a/version1/src/Arbitrary.hs b/version1/src/Arbitrary.hs index 8a6ea5e..528eac9 100644 --- a/version1/src/Arbitrary.hs +++ b/version1/src/Arbitrary.hs @@ -57,7 +57,7 @@ instance Arbitrary (Unbound.Name a) where base :: Gen Term base = elements - [ Type, + [ TyType, TrustMe, PrintMe, tyUnit, @@ -74,7 +74,7 @@ base = litFalse = LitBool False -- Generate a random term --- In the inner recursion, the bool prevents the generation of TCon/DCon applications +-- In the inner recursion, the bool prevents the generation of TyCon/DataCon applications -- inside Apps --- we want these terms to be fully saturated. genTerm :: Int -> Gen Term genTerm n @@ -109,14 +109,14 @@ genPi n = do tyA <- genTerm n tyB <- genTerm n - return $ Pi tyA (Unbound.bind p tyB) + return $ TyPi tyA (Unbound.bind p tyB) genSigma :: Int -> Gen Term genSigma n = do p <- genName tyA <- genTerm n tyB <- genTerm n - return $ Sigma tyA (Unbound.bind p tyB) + return $ TySigma tyA (Unbound.bind p tyB) genLet :: Int -> Gen Term genLet n = do @@ -140,9 +140,9 @@ instance Arbitrary Term where [tm, arg] ++ [App tm' arg | tm' <- QC.shrink tm] ++ [App tm arg' | arg' <- QC.shrink arg] shrink (Lam bnd) = [] - shrink (Pi tyA bnd) = [tyA] + shrink (TyPi tyA bnd) = [tyA] shrink (Let rhs bnd) = [rhs] - shrink (Sigma tyA bnd) = [tyA] + shrink (TySigma tyA bnd) = [tyA] shrink _ = [] ------------------------------------------------------- diff --git a/version1/src/Environment.hs b/version1/src/Environment.hs index 1b5e63e..690ee09 100644 --- a/version1/src/Environment.hs +++ b/version1/src/Environment.hs @@ -91,6 +91,7 @@ emptyEnv = } instance Disp Env where + disp :: Env -> Doc disp e = vcat [disp decl | decl <- ctx e] -- | Find a name's user supplied type signature. @@ -212,12 +213,15 @@ extendErr ma msg' = throwError $ Err ps (msg $$ msg') instance Semigroup Err where + (<>) :: Err -> Err -> Err (Err src1 d1) <> (Err src2 d2) = Err (src1 ++ src2) (d1 `mappend` d2) instance Monoid Err where + mempty :: Err mempty = Err [] mempty instance Disp Err where + disp :: Err -> Doc disp (Err [] msg) = msg disp (Err ((SourceLocation p term) : _) msg) = disp p diff --git a/version1/src/Equal.hs b/version1/src/Equal.hs index 3499193..9fbe0c9 100644 --- a/version1/src/Equal.hs +++ b/version1/src/Equal.hs @@ -24,7 +24,7 @@ equate t1 t2 = do n1 <- whnf t1 n2 <- whnf t2 case (n1, n2) of - (Type, Type) -> return () + (TyType, TyType) -> return () (Var x, Var y) | x == y -> return () (Lam bnd1, Lam bnd2) -> do (_, b1, _, b2) <- Unbound.unbind2Plus bnd1 bnd2 @@ -32,7 +32,7 @@ equate t1 t2 = do equate b1 b2 (App a1 a2, App b1 b2) -> equate a1 b1 >> equate a2 b2 - (Pi tyA1 bnd1, Pi tyA2 bnd2) -> do + (TyPi tyA1 bnd1, TyPi tyA2 bnd2) -> do (_, tyB1, _, tyB2) <- Unbound.unbind2Plus bnd1 bnd2 equate tyA1 tyA2 @@ -49,7 +49,7 @@ equate t1 t2 = do Just (x, body1, _, body2) <- Unbound.unbind2 bnd1 bnd2 equate rhs1 rhs2 equate body1 body2 - (Sigma tyA1 bnd1, Sigma tyA2 bnd2) -> do + (TySigma tyA1 bnd1, TySigma tyA2 bnd2) -> do Just (x, tyB1, _, tyB2) <- Unbound.unbind2 bnd1 bnd2 equate tyA1 tyA2 equate tyB1 tyB2 @@ -75,7 +75,7 @@ equate t1 t2 = do ------------------------------------------------------- --- | Ensure that the given type 'ty' is a 'Pi' type +-- | Ensure that the given type 'ty' is a 'TyPi' type -- (or could be normalized to be such) and return the components of -- the type. -- Throws an error if this is not the case. @@ -85,7 +85,7 @@ ensurePi :: ensurePi ty = do nf <- whnf ty case nf of - (Pi tyA bnd) -> do + (TyPi tyA bnd) -> do return (tyA, bnd) _ -> Env.err [DS "Expected a function type, instead found", DD nf] diff --git a/version1/src/Modules.hs b/version1/src/Modules.hs index e8cbe2b..8462be6 100644 --- a/version1/src/Modules.hs +++ b/version1/src/Modules.hs @@ -25,7 +25,7 @@ getModules prefixes top = do mapM reparse toParse data ModuleInfo = ModuleInfo - { modInfoName :: MName, + { modInfoName :: ModuleName, modInfoFilename :: String, modInfoImports :: [ModuleImport] } @@ -64,7 +64,7 @@ topSort ms = reverse sorted getModuleFileName :: (MonadIO m) => [FilePath] -> - MName -> + ModuleName -> m FilePath getModuleFileName prefixes modul = do let makeFileName prefix = prefix mDotPi diff --git a/version1/src/Parser.hs b/version1/src/Parser.hs index 16e6395..55b5252 100644 --- a/version1/src/Parser.hs +++ b/version1/src/Parser.hs @@ -27,8 +27,8 @@ Optional components in this BNF are marked with < > terms: a,b,A,B ::= - Type Universes - | x Variables (start with lowercase) + Type Universe + | x Variables (must start with lowercase) | \ x . a Function definition | a b Application | (x : A) -> B Pi type @@ -48,23 +48,41 @@ Optional components in this BNF are marked with < > | if a then b else c If | { x : A | B } Dependent pair type - | A * B Nondependent pair syntactic sugar - | (a, b) Prod introduction - | let (x,y) = a in b Prod elimination + | A * B Nondependent pair type (syntactic sugar) + | (a, b) Pair introduction + | let (x,y) = a in b Pair elimination declarations: - foo : A - foo = a + foo : A Type declaration + foo = a Definition Syntax sugar: + - Nondependent function types, like: + + A -> B + + Get parsed as (x:A) -> B, with an internal name for x + + - Nondependent product types, like: + + A * B + + Get parsed as { x:A | B }, with an internal name for x + - You can collapse lambdas, like: \ x [y] z . a This gets parsed as \ x . \ [y] . \ z . a + - Natural numbers, like: + + 3 + + Get parsed as peano numbers (Succ (Succ (Succ Zero))) + -} liftError :: (MonadError e m) => Either e a -> m a @@ -256,12 +274,12 @@ expr = do do n <- Unbound.fresh wildcardName return $ \tyA tyB -> - Pi tyA (Unbound.bind n tyB) + TyPi tyA (Unbound.bind n tyB) mkTupleType = do n <- Unbound.fresh wildcardName return $ \tyA tyB -> - Sigma tyA (Unbound.bind n tyB) + TySigma tyA (Unbound.bind n tyB) -- A "term" is either a function application or a constructor -- application. Breaking it out as a seperate category both @@ -297,7 +315,7 @@ typen :: LParser Term typen = do reserved "Type" - return Type + return TyType -- Lambda abstractions have the syntax '\x . e' lambda :: LParser Term @@ -398,7 +416,7 @@ expProdOrAnnotOrParens = (Ann (Var x) a) ( do b <- afterBinder - return $ Pi a (Unbound.bind x b) + return $ TyPi a (Unbound.bind x b) ) Colon a b -> return $ Ann a b Comma a b -> @@ -414,4 +432,4 @@ sigmaTy = do reservedOp "|" b <- expr reservedOp "}" - return (Sigma a (Unbound.bind x b)) + return (TySigma a (Unbound.bind x b)) diff --git a/version1/src/PrettyPrint.hs b/version1/src/PrettyPrint.hs index afc0490..ea03155 100644 --- a/version1/src/PrettyPrint.hs +++ b/version1/src/PrettyPrint.hs @@ -220,7 +220,7 @@ instance Display (Unbound.Name Term) where display = return . disp instance Display Term where - display Type = return $ PP.text "Type" + display TyType = return $ PP.text "Type" display (Var n) = display n display a@(Lam b) = do n <- ask prec @@ -231,7 +231,7 @@ instance Display Term where df <- withPrec levelApp (display f) dx <- withPrec (levelApp + 1) (display x) return $ parens (levelApp < n) $ df <+> dx - display (Pi a bnd) = do + display (TyPi a bnd) = do Unbound.lunbind bnd $ \(n, b) -> do p <- ask prec lhs <- @@ -270,7 +270,7 @@ instance Display Term where PP.text "if" <+> da <+> PP.text "then" <+> db <+> PP.text "else" <+> dc - display (Sigma tyA bnd) = + display (TySigma tyA bnd) = Unbound.lunbind bnd $ \(x, tyB) -> do if x `elem` toListOf Unbound.fv tyB then do diff --git a/version1/src/Syntax.hs b/version1/src/Syntax.hs index eacafae..d40b561 100644 --- a/version1/src/Syntax.hs +++ b/version1/src/Syntax.hs @@ -1,7 +1,5 @@ -{- pi-forall language -} - -- | The abstract syntax of the simple dependently typed language --- See comment at the top of 'Parser' for the concrete syntax of this language +-- See the comment at the top of 'Parser' for the concrete syntax of this language module Syntax where import Data.Function (on) @@ -19,36 +17,39 @@ import Unbound.Generics.LocallyNameless qualified as Unbound ----------------------------------------- --- | For variable names, we use the Unbound library to +-- | For variable names, we use the `Unbound` library to -- automatically generate free variable, substitution, --- and alpha-equality function. +-- and alpha-equality function. The abstract type `Name` from +-- this library is indexed by the AST type that this variable +-- is a name for. type TName = Unbound.Name Term -- | module names -type MName = String +type ModuleName = String ----------------------------------------- --- * Core language +-- * Core language of pi-forall (Combined syntax for types and terms) ----------------------------------------- --- | Combined syntax for types and terms --- (type synonym for documentation) +-- | Because types and terms use the same AST, we define the following +-- type synonym so that we can hint whether a piece of syntax is being used +-- as a type or as a term. type Type = Term -- | basic language data Term - = -- | type of types `Type` - Type - | -- | variables `x` + = -- | type of types, concretely `Type` + TyType + | -- | variable `x` Var TName | -- | abstraction `\x. a` Lam (Unbound.Bind TName Term) | -- | application `a b` App Term Term | -- | function type `(x : A) -> B` - Pi Type (Unbound.Bind TName Type) + TyPi Type (Unbound.Bind TName Type) | -- | annotated terms `( a : A )` Ann Term Type | -- | marked source position, for error messages @@ -71,7 +72,7 @@ data Term | -- | `if a then b1 else b2` expression for eliminating booleans If Term Term Term | -- | Sigma-type (homework), written `{ x : A | B }` - Sigma Term (Unbound.Bind TName Term) + TySigma Term (Unbound.Bind TName Term) | -- | introduction form for Sigma-types `( a , b )` Prod Term Term | -- | elimination form for Sigma-types `let (x,y) = a in b` @@ -87,14 +88,14 @@ data Term -- | A Module has a name, a list of imports, a list of declarations, -- and a set of constructor names (which affect parsing). data Module = Module - { moduleName :: MName, + { moduleName :: ModuleName, moduleImports :: [ModuleImport], moduleEntries :: [Decl] } deriving (Show, Generic, Typeable) -- | References to other modules (brings declarations and definitions into scope) -newtype ModuleImport = ModuleImport MName +newtype ModuleImport = ModuleImport ModuleName deriving (Show, Eq, Generic, Typeable) -- | A type declaration (or type signature) @@ -211,11 +212,11 @@ instance Unbound.Subst Term Term where -- '(y : x) -> y' pi1 :: Term -pi1 = Pi (Var xName) (Unbound.bind yName (Var yName)) +pi1 = TyPi (Var xName) (Unbound.bind yName (Var yName)) -- '(y : Bool) -> y' pi2 :: Term -pi2 = Pi TyBool (Unbound.bind yName (Var yName)) +pi2 = TyPi TyBool (Unbound.bind yName (Var yName)) -- >>> Unbound.aeq (Unbound.subst xName TyBool pi1) pi2 -- True diff --git a/version1/src/TypeCheck.hs b/version1/src/TypeCheck.hs index 932c6c6..23d0455 100644 --- a/version1/src/TypeCheck.hs +++ b/version1/src/TypeCheck.hs @@ -27,7 +27,7 @@ checkType tm ty = void $ tcTerm tm (Just ty) -- | Make sure that the term is a "type" (i.e. that it has type 'Type') tcType :: Term -> TcMonad () -tcType tm = void $ checkType tm Type +tcType tm = void $ checkType tm TyType --------------------------------------------------------------------- @@ -40,21 +40,21 @@ tcTerm t@(Var x) Nothing = do sig <- Env.lookupTy x return (sigType sig) -- i-type -tcTerm Type Nothing = return Type +tcTerm TyType Nothing = return TyType -- i-pi -tcTerm (Pi tyA bnd) Nothing = do +tcTerm (TyPi tyA bnd) Nothing = do (x, tyB) <- Unbound.unbind bnd tcType tyA Env.extendCtx (mkSig x tyA) (tcType tyB) - return Type + return TyType -- c-lam: check the type of a function -tcTerm (Lam bnd) (Just (Pi tyA bnd2)) = do +tcTerm (Lam bnd) (Just (TyPi tyA bnd2)) = do -- unbind the variables in the lambda expression and pi type (x, body, _, tyB) <- Unbound.unbind2Plus bnd bnd2 -- check the type of the body of the lambda expression Env.extendCtx (mkSig x tyA) (checkType body tyB) - return (Pi tyA bnd2) + return (TyPi tyA bnd2) tcTerm (Lam _) (Just nf) = Env.err [DS "Lambda expression should have a function type, not", DD nf] -- i-app @@ -63,7 +63,7 @@ tcTerm (App t1 t2) Nothing = do let ensurePi :: Type -> TcMonad (Type, Unbound.Bind TName Type) ensurePi (Ann a _) = ensurePi a ensurePi (Pos _ a) = ensurePi a - ensurePi (Pi tyA bnd) = return (tyA, bnd) + ensurePi (TyPi tyA bnd) = return (tyA, bnd) ensurePi ty = Env.err [DS "Expected a function type but found ", DD ty] (tyA, bnd) <- ensurePi ty1 checkType t2 tyA @@ -82,7 +82,7 @@ tcTerm (Pos p tm) mTy = -- ignore term, just return type annotation tcTerm TrustMe (Just ty) = return ty -- i-unit -tcTerm TyUnit Nothing = return Type +tcTerm TyUnit Nothing = return TyType tcTerm LitUnit Nothing = return TyUnit -- i-bool tcTerm TyBool Nothing = Env.err [DS "unimplemented"] @@ -91,7 +91,7 @@ tcTerm (LitBool b) Nothing = Env.err [DS "unimplemented"] -- c-if tcTerm t@(If t1 t2 t3) mty = Env.err [DS "unimplemented"] tcTerm (Let rhs bnd) mty = Env.err [DS "unimplemented"] -tcTerm t@(Sigma tyA bnd) Nothing = Env.err [DS "unimplemented"] +tcTerm t@(TySigma tyA bnd) Nothing = Env.err [DS "unimplemented"] tcTerm t@(Prod a b) (Just ty) = Env.err [DS "unimplemented"] tcTerm t@(LetPair p bnd) (Just ty) = Env.err [DS "unimplemented"] tcTerm PrintMe (Just ty) = do diff --git a/version2/src/Arbitrary.hs b/version2/src/Arbitrary.hs index c2c04f0..f55cc2c 100644 --- a/version2/src/Arbitrary.hs +++ b/version2/src/Arbitrary.hs @@ -6,7 +6,7 @@ module Arbitrary where import qualified Data.Set as Set import Test.QuickCheck - ( elements, frequency, sized, Arbitrary(arbitrary), Gen ) + ( elements, frequency, sized, Arbitrary(arbitrary), Gen ) import qualified Test.QuickCheck as QC import qualified Unbound.Generics.LocallyNameless as Unbound import Text.Parsec.Error ( ParseError ) @@ -18,18 +18,18 @@ import Parser ( testParser, expr ) -- | Round trip property: a given term prints then parses to the same term. prop_roundtrip :: Term -> QC.Property -prop_roundtrip tm = +prop_roundtrip tm = let str = render (disp tm) in case test_parseExpr str of Left _ -> QC.counterexample ("*** Could not parse:\n" ++ str) False Right tm' -> QC.counterexample ("*** Round trip failure! Parsing:\n" ++ str ++ "\n*** results in\n" ++ show tm') (Unbound.aeq tm tm') - + test_parseExpr :: String -> Either Text.Parsec.Error.ParseError Term test_parseExpr = testParser expr -- View random terms sampleTerms :: IO () -sampleTerms = QC.sample' (arbitrary :: Gen Term) >>= +sampleTerms = QC.sample' (arbitrary :: Gen Term) >>= mapM_ (putStrLn . render . disp) --------------------------------------------------------------------------------------------------- @@ -55,8 +55,8 @@ instance Arbitrary (Unbound.Name a) where -- Terms with no subterms base :: Gen Term -base = elements [Type, TrustMe, PrintMe, - tyUnit, litUnit, tyBool, +base = elements [TyType, TrustMe, PrintMe, + tyUnit, litUnit, tyBool, litTrue, litFalse, Refl ] where tyUnit = TyUnit litUnit = LitUnit @@ -65,13 +65,13 @@ base = elements [Type, TrustMe, PrintMe, litFalse = LitBool False -- Generate a random term --- In the inner recursion, the bool prevents the generation of TCon/DCon applications +-- In the inner recursion, the bool prevents the generation of TyCon/DataCon applications -- inside Apps --- we want these terms to be fully saturated. genTerm :: Int -> Gen Term genTerm n | n <= 1 = base | otherwise = go True n where - go b n0 = + go b n0 = let n' = n0 `div` 2 in frequency [ (1, Var <$> genName), @@ -91,7 +91,7 @@ genTerm n ] genLam :: Int -> Gen Term -genLam n = do +genLam n = do p <- genName b <- genTerm n @@ -99,30 +99,30 @@ genLam n = do genPi :: Int -> Gen Term -genPi n = do +genPi n = do p <- genName tyA <- genTerm n tyB <- genTerm n - return $ Pi tyA (Unbound.bind p tyB) + return $ TyPi tyA (Unbound.bind p tyB) genSigma :: Int -> Gen Term genSigma n = do - p <- genName + p <- genName tyA <- genTerm n tyB <- genTerm n - return $ Sigma tyA (Unbound.bind p tyB) + return $ TySigma tyA (Unbound.bind p tyB) -genLet :: Int -> Gen Term +genLet :: Int -> Gen Term genLet n = do - p <- genName + p <- genName rhs <- genTerm n b <- genTerm n return $ Let rhs (Unbound.bind p b) -genLetPair :: Int -> Gen Term +genLetPair :: Int -> Gen Term genLetPair n = do - p <- (,) <$> genName <*> genName + p <- (,) <$> genName <*> genName a <- genTerm n b <- genTerm n return $ LetPair a (Unbound.bind p b) @@ -136,21 +136,21 @@ instance Arbitrary Term where arbitrary = sized genTerm -- when QC finds a counterexample, it tries to shrink it to find a smaller one - shrink (App tm arg) = - [tm, arg] ++ [App tm' arg | tm' <- QC.shrink tm] + shrink (App tm arg) = + [tm, arg] ++ [App tm' arg | tm' <- QC.shrink tm] ++ [App tm arg' | arg' <- QC.shrink arg] shrink (Lam bnd) = [] - shrink (Pi tyA bnd) = [tyA] + shrink (TyPi tyA bnd) = [tyA] shrink (Let rhs bnd) = [rhs] - shrink (Sigma tyA bnd) = [tyA] + shrink (TySigma tyA bnd) = [tyA] shrink (TyEq a b) = [a,b] ++ [TyEq a' b | a' <- QC.shrink a] ++ [TyEq a b' | b' <- QC.shrink b] shrink (Subst a b) = [a,b] ++ [Subst a' b | a' <- QC.shrink a] ++ [Subst a b' | b' <- QC.shrink b] - shrink (Contra a) = [a] ++ [Contra a' | a' <- QC.shrink a] + shrink (Contra a) = a : [Contra a' | a' <- QC.shrink a] shrink _ = [] - + ------------------------------------------------------- -- * General quickcheck utilities diff --git a/version2/src/Environment.hs b/version2/src/Environment.hs index 7311484..d715a05 100644 --- a/version2/src/Environment.hs +++ b/version2/src/Environment.hs @@ -84,6 +84,7 @@ emptyEnv = Env {ctx = [] } instance Disp Env where + disp :: Env -> Doc disp e = vcat [disp decl | decl <- ctx e] -- | Find a name's user supplied type signature. @@ -211,13 +212,16 @@ extendErr ma msg' = throwError $ Err ps (msg $$ msg') instance Semigroup Err where + (<>) :: Err -> Err -> Err (Err src1 d1) <> (Err src2 d2) = Err (src1 ++ src2) (d1 `mappend` d2) instance Monoid Err where + mempty :: Err mempty = Err [] mempty instance Disp Err where + disp :: Err -> Doc disp (Err [] msg) = msg disp (Err ((SourceLocation p term) : _) msg) = disp p diff --git a/version2/src/Equal.hs b/version2/src/Equal.hs index b019e72..87daa09 100644 --- a/version2/src/Equal.hs +++ b/version2/src/Equal.hs @@ -22,7 +22,7 @@ equate t1 t2 = do n1 <- whnf t1 n2 <- whnf t2 case (n1, n2) of - (Type, Type) -> return () + (TyType, TyType) -> return () (Var x, Var y) | x == y -> return () (Lam bnd1, Lam bnd2) -> do (_, b1, _, b2) <- Unbound.unbind2Plus bnd1 bnd2 @@ -30,7 +30,7 @@ equate t1 t2 = do equate b1 b2 (App a1 a2, App b1 b2) -> equate a1 b1 >> equate a2 b2 - (Pi tyA1 bnd1, Pi tyA2 bnd2) -> do + (TyPi tyA1 bnd1, TyPi tyA2 bnd2) -> do (_, tyB1, _, tyB2) <- Unbound.unbind2Plus bnd1 bnd2 equate tyA1 tyA2 @@ -54,7 +54,7 @@ equate t1 t2 = do equate rhs1 rhs2 equate body1 body2 - (Sigma tyA1 bnd1, Sigma tyA2 bnd2) -> do + (TySigma tyA1 bnd1, TySigma tyA2 bnd2) -> do Just (x, tyB1, _, tyB2) <- Unbound.unbind2 bnd1 bnd2 equate tyA1 tyA2 equate tyB1 tyB2 @@ -93,7 +93,7 @@ equate t1 t2 = do ------------------------------------------------------- --- | Ensure that the given type 'ty' is a 'Pi' type +-- | Ensure that the given type 'ty' is a 'TyPi' type -- (or could be normalized to be such) and return the components of -- the type. -- Throws an error if this is not the case. @@ -102,7 +102,7 @@ ensurePi :: Type -> ensurePi ty = do nf <- whnf ty case nf of - (Pi tyA bnd) -> do + (TyPi tyA bnd) -> do return ( tyA, bnd) _ -> Env.err [DS "Expected a function type, instead found", DD nf] diff --git a/version2/src/Modules.hs b/version2/src/Modules.hs index b47166b..3637feb 100644 --- a/version2/src/Modules.hs +++ b/version2/src/Modules.hs @@ -26,7 +26,7 @@ getModules prefixes top = do mapM reparse toParse data ModuleInfo = ModuleInfo { - modInfoName :: MName, + modInfoName :: ModuleName, modInfoFilename :: String, modInfoImports :: [ModuleImport] } @@ -56,7 +56,7 @@ topSort ms = reverse sorted -- | Find the file associated with a module. getModuleFileName :: (MonadIO m) - => [FilePath] -> MName -> m FilePath + => [FilePath] -> ModuleName -> m FilePath getModuleFileName prefixes modul = do let makeFileName prefix = prefix mDotPi -- get M.pi from M or M.pi diff --git a/version2/src/Parser.hs b/version2/src/Parser.hs index a12caa5..4957156 100644 --- a/version2/src/Parser.hs +++ b/version2/src/Parser.hs @@ -33,8 +33,8 @@ Optional components in this BNF are marked with < > terms: a,b,A,B ::= - Type Universes - | x Variables (start with lowercase) + Type Universe + | x Variables (must start with lowercase) | \ x . a Function definition | a b Application | (x : A) -> B Pi type @@ -54,9 +54,9 @@ Optional components in this BNF are marked with < > | if a then b else c If | { x : A | B } Dependent pair type - | A * B Nondependent pair syntactic sugar - | (a, b) Prod introduction - | let (x,y) = a in b Prod elimination + | A * B Nondependent pair type (syntactic sugar) + | (a, b) Pair introduction + | let (x,y) = a in b Pair elimination | a = b Equality type | Refl Equality proof @@ -68,19 +68,37 @@ Optional components in this BNF are marked with < > declarations: - foo : A - foo = a + foo : A Type declaration + foo = a Definition Syntax sugar: + - Nondependent function types, like: + + A -> B + + Get parsed as (x:A) -> B, with an internal name for x + + - Nondependent product types, like: + + A * B + + Get parsed as { x:A | B }, with an internal name for x + - You can collapse lambdas, like: \ x [y] z . a This gets parsed as \ x . \ [y] . \ z . a + - Natural numbers, like: + + 3 + + Get parsed as peano numbers (Succ (Succ (Succ Zero))) + -} liftError :: (MonadError e m) => Either e a -> m a @@ -276,11 +294,11 @@ expr = do mkArrowType = do n <- Unbound.fresh wildcardName return $ \tyA tyB -> - Pi tyA (Unbound.bind n tyB) + TyPi tyA (Unbound.bind n tyB) mkTupleType = do n <- Unbound.fresh wildcardName return $ \tyA tyB -> - Sigma tyA (Unbound.bind n tyB) + TySigma tyA (Unbound.bind n tyB) -- A "term" is either a function application or a constructor -- application. Breaking it out as a seperate category both @@ -323,7 +341,7 @@ factor = choice [ Var <$> variable "a variable" typen :: LParser Term typen = do reserved "Type" - return Type + return TyType @@ -421,7 +439,7 @@ expProdOrAnnotOrParens = Colon (Var x) a -> option (Ann (Var x) a) (do b <- afterBinder - return $ Pi a (Unbound.bind x b)) + return $ TyPi a (Unbound.bind x b)) Colon a b -> return $ Ann a b Comma a b -> @@ -456,6 +474,6 @@ sigmaTy = do reservedOp "|" b <- expr reservedOp "}" - return (Sigma a (Unbound.bind x b)) + return (TySigma a (Unbound.bind x b)) diff --git a/version2/src/PrettyPrint.hs b/version2/src/PrettyPrint.hs index e3560a1..b11f872 100644 --- a/version2/src/PrettyPrint.hs +++ b/version2/src/PrettyPrint.hs @@ -199,13 +199,13 @@ levelLet = 0 levelCase :: Int levelCase = 0 levelLam :: Int -levelLam = 0 +levelLam = 0 levelPi :: Int levelPi = 0 levelSigma :: Int levelSigma = 0 levelProd :: Int -levelProd = 0 +levelProd = 0 levelArrow :: Int levelArrow = 5 @@ -223,7 +223,7 @@ instance Display (Unbound.Name Term) where display = return . disp instance Display Term where - display Type = return $ PP.text "Type" + display TyType = return $ PP.text "Type" display (Var n) = display n display a@(Lam b) = do n <- ask prec @@ -234,7 +234,7 @@ instance Display Term where df <- withPrec levelApp (display f) dx <- withPrec (levelApp+1) (display x) return $ parens (levelApp < n) $ df <+> dx - display (Pi a bnd) = do + display (TyPi a bnd) = do Unbound.lunbind bnd $ \(n, b) -> do p <- ask prec lhs <- @@ -271,7 +271,7 @@ instance Display Term where PP.text "if" <+> da <+> PP.text "then" <+> db <+> PP.text "else" <+> dc - display (Sigma tyA bnd) = + display (TySigma tyA bnd) = Unbound.lunbind bnd $ \(x, tyB) -> do if x `elem` toListOf Unbound.fv tyB then do dx <- display x @@ -300,15 +300,15 @@ instance Display Term where dy <- withPrec 0 $ display y dbody <- withPrec 0 $ display body return $ - parens (levelLet < p) $ - (PP.text "let" + parens (levelLet < p) $ + (PP.text "let" <+> (PP.text "(" PP.<> dx PP.<> PP.text "," PP.<> dy PP.<> PP.text ")") <+> PP.text "=" - <+> da + <+> da <+> PP.text "in") $$ dbody display (Let a bnd) = do diff --git a/version2/src/Syntax.hs b/version2/src/Syntax.hs index 71c286a..dc39f47 100644 --- a/version2/src/Syntax.hs +++ b/version2/src/Syntax.hs @@ -1,7 +1,6 @@ -{- pi-forall language -} -- | The abstract syntax of the simple dependently typed language --- See comment at the top of 'Parser' for the concrete syntax of this language +-- See the comment at the top of 'Parser' for the concrete syntax of this language module Syntax where import Data.Maybe (fromMaybe) @@ -19,37 +18,40 @@ import Data.Function (on) ----------------------------------------- --- | For variable names, we use the Unbound library to +-- | For variable names, we use the `Unbound` library to -- automatically generate free variable, substitution, --- and alpha-equality function. +-- and alpha-equality function. The abstract type `Name` from +-- this library is indexed by the AST type that this variable +-- is a name for. type TName = Unbound.Name Term -- | module names -type MName = String +type ModuleName = String ----------------------------------------- --- * Core language +-- * Core language of pi-forall (Combined syntax for types and terms) ----------------------------------------- --- | Combined syntax for types and terms --- (type synonym for documentation) +-- | Because types and terms use the same AST, we define the following +-- type synonym so that we can hint whether a piece of syntax is being used +-- as a type or as a term. type Type = Term -- | basic language data Term - = -- | type of types `Type` - Type - | -- | variables `x` + = -- | type of types, concretely `Type` + TyType + | -- | variable `x` Var TName | -- | abstraction `\x. a` Lam (Unbound.Bind TName Term) | -- | application `a b` App Term Term | -- | function type `(x : A) -> B` - Pi Type (Unbound.Bind TName Type) + TyPi Type (Unbound.Bind TName Type) | -- | annotated terms `( a : A )` Ann Term Type | -- | marked source position, for error messages @@ -72,7 +74,7 @@ data Term | -- | `if a then b1 else b2` expression for eliminating booleans If Term Term Term | -- | Sigma-type (homework), written `{ x : A | B }` - Sigma Term (Unbound.Bind TName Term) + TySigma Term (Unbound.Bind TName Term) | -- | introduction form for Sigma-types `( a , b )` Prod Term Term | -- | elimination form for Sigma-types `let (x,y) = a in b` @@ -101,14 +103,14 @@ data Term -- | A Module has a name, a list of imports, a list of declarations, -- and a set of constructor names (which affect parsing). data Module = Module - { moduleName :: MName, + { moduleName :: ModuleName, moduleImports :: [ModuleImport], moduleEntries :: [Decl] } deriving (Show, Generic, Typeable) -- | References to other modules (brings declarations and definitions into scope) -newtype ModuleImport = ModuleImport MName +newtype ModuleImport = ModuleImport ModuleName deriving (Show, Eq, Generic, Typeable) -- | A type declaration (or type signature) @@ -232,11 +234,11 @@ instance Unbound.Subst Term Term where -- '(y : x) -> y' pi1 :: Term -pi1 = Pi (Var xName) (Unbound.bind yName (Var yName)) +pi1 = TyPi (Var xName) (Unbound.bind yName (Var yName)) -- '(y : Bool) -> y' pi2 :: Term -pi2 = Pi TyBool (Unbound.bind yName (Var yName)) +pi2 = TyPi TyBool (Unbound.bind yName (Var yName)) -- >>> Unbound.aeq (Unbound.subst xName TyBool pi1) pi2 -- True diff --git a/version2/src/TypeCheck.hs b/version2/src/TypeCheck.hs index 2b98117..c042f53 100644 --- a/version2/src/TypeCheck.hs +++ b/version2/src/TypeCheck.hs @@ -37,7 +37,7 @@ checkType tm ty = do -- | Make sure that the term is a "type" (i.e. that it has type 'Type') tcType :: Term -> TcMonad () -tcType tm = void $ checkType tm Type +tcType tm = void $ checkType tm TyType --------------------------------------------------------------------- @@ -50,21 +50,21 @@ tcTerm t@(Var x) Nothing = do sig <- Env.lookupTy x return (sigType sig) -- i-type -tcTerm Type Nothing = return Type +tcTerm TyType Nothing = return TyType -- i-pi -tcTerm (Pi tyA bnd) Nothing = do +tcTerm (TyPi tyA bnd) Nothing = do (x, tyB) <- Unbound.unbind bnd tcType tyA Env.extendCtx (mkSig x tyA) (tcType tyB) - return Type + return TyType -- c-lam: check the type of a function -tcTerm (Lam bnd) (Just (Pi tyA bnd2)) = do +tcTerm (Lam bnd) (Just (TyPi tyA bnd2)) = do -- unbind the variables in the lambda expression and pi type (x, body,_,tyB) <- Unbound.unbind2Plus bnd bnd2 -- check the type of the body of the lambda expression Env.extendCtx (mkSig x tyA) (checkType body tyB) - return (Pi tyA bnd2) + return (TyPi tyA bnd2) tcTerm (Lam _) (Just nf) = Env.err [DS "Lambda expression should have a function type, not", DD nf] -- i-app @@ -90,11 +90,11 @@ tcTerm (Pos p tm) mTy = tcTerm TrustMe (Just ty) = return ty -- i-unit -tcTerm TyUnit Nothing = return Type +tcTerm TyUnit Nothing = return TyType tcTerm LitUnit Nothing = return TyUnit -- i-bool -tcTerm TyBool Nothing = return Type +tcTerm TyBool Nothing = return TyType -- i-true/false @@ -133,7 +133,7 @@ tcTerm (Let rhs bnd) mty = do tcTerm (TyEq a b) Nothing = do aTy <- inferType a checkType b aTy - return Type + return TyType tcTerm Refl (Just ty@(TyEq a b)) = do Equal.equate a b return ty @@ -171,20 +171,20 @@ tcTerm t@(Contra p) (Just ty) = do ] -tcTerm t@(Sigma tyA bnd) Nothing = do +tcTerm t@(TySigma tyA bnd) Nothing = do (x, tyB) <- Unbound.unbind bnd tcType tyA Env.extendCtx (mkSig x tyA) $ tcType tyB - return Type + return TyType tcTerm t@(Prod a b) (Just ty) = do case ty of - (Sigma tyA bnd) -> do + (TySigma tyA bnd) -> do (x, tyB) <- Unbound.unbind bnd checkType a tyA Env.extendCtxs [mkSig x tyA, Def x a] $ checkType b tyB - return (Sigma tyA (Unbound.bind x tyB)) + return (TySigma tyA (Unbound.bind x tyB)) _ -> Env.err [ DS "Products must have Sigma Type", @@ -198,7 +198,7 @@ tcTerm t@(LetPair p bnd) (Just ty) = do pty <- inferType p pty' <- Equal.whnf pty case pty' of - Sigma tyA bnd' -> do + TySigma tyA bnd' -> do let tyB = Unbound.instantiate bnd' [Var x] decl <- def p (Prod (Var x) (Var y)) Env.extendCtxs ([mkSig x tyA, mkSig y tyB] ++ decl) $ diff --git a/version3/src/Arbitrary.hs b/version3/src/Arbitrary.hs index d94cc10..eb47ab7 100644 --- a/version3/src/Arbitrary.hs +++ b/version3/src/Arbitrary.hs @@ -6,7 +6,7 @@ module Arbitrary where import qualified Data.Set as Set import Test.QuickCheck - ( elements, frequency, sized, Arbitrary(arbitrary), Gen ) + ( elements, frequency, sized, Arbitrary(arbitrary), Gen ) import qualified Test.QuickCheck as QC import qualified Unbound.Generics.LocallyNameless as Unbound import Text.Parsec.Error ( ParseError ) @@ -18,18 +18,18 @@ import Parser ( testParser, expr ) -- | Round trip property: a given term prints then parses to the same term. prop_roundtrip :: Term -> QC.Property -prop_roundtrip tm = +prop_roundtrip tm = let str = render (disp tm) in case test_parseExpr str of Left _ -> QC.counterexample ("*** Could not parse:\n" ++ str) False Right tm' -> QC.counterexample ("*** Round trip failure! Parsing:\n" ++ str ++ "\n*** results in\n" ++ show tm') (Unbound.aeq tm tm') - + test_parseExpr :: String -> Either Text.Parsec.Error.ParseError Term test_parseExpr = testParser expr -- View random terms sampleTerms :: IO () -sampleTerms = QC.sample' (arbitrary :: Gen Term) >>= +sampleTerms = QC.sample' (arbitrary :: Gen Term) >>= mapM_ (putStrLn . render . disp) --------------------------------------------------------------------------------------------------- @@ -55,8 +55,8 @@ instance Arbitrary (Unbound.Name a) where -- Terms with no subterms base :: Gen Term -base = elements [Type, TrustMe, PrintMe, - tyUnit, litUnit, tyBool, +base = elements [TyType, TrustMe, PrintMe, + tyUnit, litUnit, tyBool, litTrue, litFalse, Refl ] where tyUnit = TyUnit litUnit = LitUnit @@ -65,13 +65,13 @@ base = elements [Type, TrustMe, PrintMe, litFalse = LitBool False -- Generate a random term --- In the inner recursion, the bool prevents the generation of TCon/DCon applications +-- In the inner recursion, the bool prevents the generation of TyCon/DataCon applications -- inside Apps --- we want these terms to be fully saturated. genTerm :: Int -> Gen Term genTerm n | n <= 1 = base | otherwise = go True n where - go b n0 = + go b n0 = let n' = n0 `div` 2 in frequency [ (1, Var <$> genName), @@ -91,7 +91,7 @@ genTerm n ] genLam :: Int -> Gen Term -genLam n = do +genLam n = do p <- genName ep <- arbitrary b <- genTerm n @@ -99,37 +99,37 @@ genLam n = do genPi :: Int -> Gen Term -genPi n = do +genPi n = do p <- genName ep <- arbitrary tyA <- genTerm n tyB <- genTerm n - return $ Pi ep tyA (Unbound.bind p tyB) + return $ TyPi ep tyA (Unbound.bind p tyB) genSigma :: Int -> Gen Term genSigma n = do - p <- genName + p <- genName tyA <- genTerm n tyB <- genTerm n - return $ Sigma tyA (Unbound.bind p tyB) + return $ TySigma tyA (Unbound.bind p tyB) -genLet :: Int -> Gen Term +genLet :: Int -> Gen Term genLet n = do - p <- genName + p <- genName rhs <- genTerm n b <- genTerm n return $ Let rhs (Unbound.bind p b) -genLetPair :: Int -> Gen Term +genLetPair :: Int -> Gen Term genLetPair n = do - p <- (,) <$> genName <*> genName + p <- (,) <$> genName <*> genName a <- genTerm n b <- genTerm n return $ LetPair a (Unbound.bind p b) instance Arbitrary Arg where arbitrary = sized genArg - shrink (Arg ep tm) = + shrink (Arg ep tm) = [ Arg ep tm' | tm' <- QC.shrink tm] genArg :: Int -> Gen Arg @@ -137,7 +137,7 @@ genArg n = Arg <$> arbitrary <*> genTerm (n `div` 2) genArgs :: Int -> Gen [Arg] genArgs n = genBoundedList 2 (genArg n) - + instance Arbitrary Epsilon where arbitrary = elements [ Rel, Irr ] @@ -149,21 +149,21 @@ instance Arbitrary Term where arbitrary = sized genTerm -- when QC finds a counterexample, it tries to shrink it to find a smaller one - shrink (App tm arg) = - [tm, unArg arg] ++ [App tm' arg | tm' <- QC.shrink tm] + shrink (App tm arg) = + [tm, unArg arg] ++ [App tm' arg | tm' <- QC.shrink tm] ++ [App tm arg' | arg' <- QC.shrink arg] shrink (Lam ep bnd) = [] - shrink (Pi ep tyA bnd) = [tyA] + shrink (TyPi ep tyA bnd) = [tyA] shrink (Let rhs bnd) = [rhs] - shrink (Sigma tyA bnd) = [tyA] + shrink (TySigma tyA bnd) = [tyA] shrink (TyEq a b) = [a,b] ++ [TyEq a' b | a' <- QC.shrink a] ++ [TyEq a b' | b' <- QC.shrink b] shrink (Subst a b) = [a,b] ++ [Subst a' b | a' <- QC.shrink a] ++ [Subst a b' | b' <- QC.shrink b] - shrink (Contra a) = [a] ++ [Contra a' | a' <- QC.shrink a] + shrink (Contra a) = a : [Contra a' | a' <- QC.shrink a] shrink _ = [] - + ------------------------------------------------------- -- * General quickcheck utilities diff --git a/version3/src/Environment.hs b/version3/src/Environment.hs index e3648e1..13cfe86 100644 --- a/version3/src/Environment.hs +++ b/version3/src/Environment.hs @@ -86,6 +86,7 @@ emptyEnv = Env {ctx = [] } instance Disp Env where + disp :: Env -> Doc disp e = vcat [disp decl | decl <- ctx e] -- | Find a name's user supplied type signature. @@ -216,13 +217,16 @@ extendErr ma msg' = throwError $ Err ps (msg $$ msg') instance Semigroup Err where + (<>) :: Err -> Err -> Err (Err src1 d1) <> (Err src2 d2) = Err (src1 ++ src2) (d1 `mappend` d2) instance Monoid Err where + mempty :: Err mempty = Err [] mempty instance Disp Err where + disp :: Err -> Doc disp (Err [] msg) = msg disp (Err ((SourceLocation p term) : _) msg) = disp p diff --git a/version3/src/Equal.hs b/version3/src/Equal.hs index 0bafc32..9cc755f 100644 --- a/version3/src/Equal.hs +++ b/version3/src/Equal.hs @@ -22,7 +22,7 @@ equate t1 t2 = do n1 <- whnf t1 n2 <- whnf t2 case (n1, n2) of - (Type, Type) -> return () + (TyType, TyType) -> return () (Var x, Var y) | x == y -> return () (Lam ep1 bnd1, Lam ep2 bnd2) -> do (_, b1, _, b2) <- Unbound.unbind2Plus bnd1 bnd2 @@ -31,7 +31,7 @@ equate t1 t2 = do equate b1 b2 (App a1 a2, App b1 b2) -> equate a1 b1 >> equateArg a2 b2 - (Pi ep1 tyA1 bnd1, Pi ep2 tyA2 bnd2) -> do + (TyPi ep1 tyA1 bnd1, TyPi ep2 tyA2 bnd2) -> do (_, tyB1, _, tyB2) <- Unbound.unbind2Plus bnd1 bnd2 unless (ep1 == ep2) $ tyErr n1 n2 @@ -56,7 +56,7 @@ equate t1 t2 = do equate rhs1 rhs2 equate body1 body2 - (Sigma tyA1 bnd1, Sigma tyA2 bnd2) -> do + (TySigma tyA1 bnd1, TySigma tyA2 bnd2) -> do Just (x, tyB1, _, tyB2) <- Unbound.unbind2 bnd1 bnd2 equate tyA1 tyA2 equate tyB1 tyB2 @@ -115,7 +115,7 @@ equateArg a1 a2 = ------------------------------------------------------- --- | Ensure that the given type 'ty' is a 'Pi' type +-- | Ensure that the given type 'ty' is a 'TyPi' type -- (or could be normalized to be such) and return the components of -- the type. -- Throws an error if this is not the case. @@ -124,7 +124,7 @@ ensurePi :: Type -> ensurePi ty = do nf <- whnf ty case nf of - (Pi ep tyA bnd) -> do + (TyPi ep tyA bnd) -> do return (ep, tyA, bnd) _ -> Env.err [DS "Expected a function type, instead found", DD nf] diff --git a/version3/src/Modules.hs b/version3/src/Modules.hs index b47166b..3637feb 100644 --- a/version3/src/Modules.hs +++ b/version3/src/Modules.hs @@ -26,7 +26,7 @@ getModules prefixes top = do mapM reparse toParse data ModuleInfo = ModuleInfo { - modInfoName :: MName, + modInfoName :: ModuleName, modInfoFilename :: String, modInfoImports :: [ModuleImport] } @@ -56,7 +56,7 @@ topSort ms = reverse sorted -- | Find the file associated with a module. getModuleFileName :: (MonadIO m) - => [FilePath] -> MName -> m FilePath + => [FilePath] -> ModuleName -> m FilePath getModuleFileName prefixes modul = do let makeFileName prefix = prefix mDotPi -- get M.pi from M or M.pi diff --git a/version3/src/Parser.hs b/version3/src/Parser.hs index 63c02be..122f99a 100644 --- a/version3/src/Parser.hs +++ b/version3/src/Parser.hs @@ -33,8 +33,8 @@ Optional components in this BNF are marked with < > terms: a,b,A,B ::= - Type Universes - | x Variables (start with lowercase) + Type Universe + | x Variables (must start with lowercase) | \ x . a Function definition | a b Application | (x : A) -> B Pi type @@ -54,9 +54,9 @@ Optional components in this BNF are marked with < > | if a then b else c If | { x : A | B } Dependent pair type - | A * B Nondependent pair syntactic sugar - | (a, b) Prod introduction - | let (x,y) = a in b Prod elimination + | A * B Nondependent pair type (syntactic sugar) + | (a, b) Pair introduction + | let (x,y) = a in b Pair elimination | a = b Equality type | Refl Equality proof @@ -64,26 +64,44 @@ Optional components in this BNF are marked with < > | contra a Contra - | \ [x <:A> ] . a Irr lambda - | a [b] Irr application - | [x : A] -> B Irr pi + | \ [x <:A> ] . a Irrelevant lambda + | a [b] Irrelevant application + | [x : A] -> B Irrelevant function type declarations: - foo : A - foo = a + foo : A Type declaration + foo = a Definition Syntax sugar: + - Nondependent function types, like: + + A -> B + + Get parsed as (x:A) -> B, with an internal name for x + + - Nondependent product types, like: + + A * B + + Get parsed as { x:A | B }, with an internal name for x + - You can collapse lambdas, like: \ x [y] z . a This gets parsed as \ x . \ [y] . \ z . a + - Natural numbers, like: + + 3 + + Get parsed as peano numbers (Succ (Succ (Succ Zero))) + -} liftError :: (MonadError e m) => Either e a -> m a @@ -279,11 +297,11 @@ expr = do mkArrowType = do n <- Unbound.fresh wildcardName return $ \tyA tyB -> - Pi Rel tyA (Unbound.bind n tyB) + TyPi Rel tyA (Unbound.bind n tyB) mkTupleType = do n <- Unbound.fresh wildcardName return $ \tyA tyB -> - Sigma tyA (Unbound.bind n tyB) + TySigma tyA (Unbound.bind n tyB) -- A "term" is either a function application or a constructor -- application. Breaking it out as a seperate category both @@ -333,7 +351,7 @@ impOrExpVar = try ((,Irr) <$> (brackets variable)) typen :: LParser Term typen = do reserved "Type" - return Type + return TyType @@ -405,7 +423,7 @@ impProd = <|> ((,) <$> Unbound.fresh wildcardName <*> expr)) reservedOp "->" tyB <- expr - return $ Pi Irr tyA (Unbound.bind x tyB) + return $ TyPi Irr tyA (Unbound.bind x tyB) -- Function types have the syntax '(x:A) -> B'. This production deals @@ -442,7 +460,7 @@ expProdOrAnnotOrParens = Colon (Var x) a -> option (Ann (Var x) a) (do b <- afterBinder - return $ Pi Rel a (Unbound.bind x b)) + return $ TyPi Rel a (Unbound.bind x b)) Colon a b -> return $ Ann a b Comma a b -> @@ -477,6 +495,6 @@ sigmaTy = do reservedOp "|" b <- expr reservedOp "}" - return (Sigma a (Unbound.bind x b)) + return (TySigma a (Unbound.bind x b)) diff --git a/version3/src/PrettyPrint.hs b/version3/src/PrettyPrint.hs index cae8fbd..4643053 100644 --- a/version3/src/PrettyPrint.hs +++ b/version3/src/PrettyPrint.hs @@ -205,13 +205,13 @@ levelLet = 0 levelCase :: Int levelCase = 0 levelLam :: Int -levelLam = 0 +levelLam = 0 levelPi :: Int levelPi = 0 levelSigma :: Int levelSigma = 0 levelProd :: Int -levelProd = 0 +levelProd = 0 levelArrow :: Int levelArrow = 5 @@ -229,7 +229,7 @@ instance Display (Unbound.Name Term) where display = return . disp instance Display Term where - display Type = return $ PP.text "Type" + display TyType = return $ PP.text "Type" display (Var n) = display n display a@(Lam _ b) = do n <- ask prec @@ -240,7 +240,7 @@ instance Display Term where df <- withPrec levelApp (display f) dx <- withPrec (levelApp+1) (display x) return $ parens (levelApp < n) $ df <+> dx - display (Pi ep a bnd) = do + display (TyPi ep a bnd) = do Unbound.lunbind bnd $ \(n, b) -> do p <- ask prec lhs <- @@ -250,7 +250,7 @@ instance Display Term where da <- withPrec 0 (display a) return $ mandatoryBindParens ep (dn <+> PP.colon <+> da) else do - case ep of + case ep of Rel -> withPrec (levelArrow+1) (display a) Irr -> PP.brackets <$> (withPrec 0 (display a)) db <- withPrec levelPi (display b) @@ -280,7 +280,7 @@ instance Display Term where PP.text "if" <+> da <+> PP.text "then" <+> db <+> PP.text "else" <+> dc - display (Sigma tyA bnd) = + display (TySigma tyA bnd) = Unbound.lunbind bnd $ \(x, tyB) -> do if x `elem` toListOf Unbound.fv tyB then do dx <- display x @@ -309,15 +309,15 @@ instance Display Term where dy <- withPrec 0 $ display y dbody <- withPrec 0 $ display body return $ - parens (levelLet < p) $ - (PP.text "let" + parens (levelLet < p) $ + (PP.text "let" <+> (PP.text "(" PP.<> dx PP.<> PP.text "," PP.<> dy PP.<> PP.text ")") <+> PP.text "=" - <+> da + <+> da <+> PP.text "in") $$ dbody display (Let a bnd) = do @@ -362,8 +362,8 @@ instance Display Term where instance Display Arg where - display arg = - case argEp arg of + display arg = + case argEp arg of Irr -> PP.brackets <$> withPrec 0 (display (unArg arg)) Rel -> display (unArg arg) @@ -388,7 +388,7 @@ gatherBinders body = do return ([], db) precBindParens :: Epsilon -> Bool -> Doc -> Doc -precBindParens Rel b d = parens b d +precBindParens Rel b d = parens b d precBindParens Irr b d = PP.brackets d -- | Add [] for irrelevant arguments, leave other arguments alone diff --git a/version3/src/Syntax.hs b/version3/src/Syntax.hs index ca8e0bc..2e0a49b 100644 --- a/version3/src/Syntax.hs +++ b/version3/src/Syntax.hs @@ -1,7 +1,6 @@ -{- pi-forall language -} -- | The abstract syntax of the simple dependently typed language --- See comment at the top of 'Parser' for the concrete syntax of this language +-- See the comment at the top of 'Parser' for the concrete syntax of this language module Syntax where import Data.Maybe (fromMaybe) @@ -19,37 +18,40 @@ import Data.Function (on) ----------------------------------------- --- | For variable names, we use the Unbound library to +-- | For variable names, we use the `Unbound` library to -- automatically generate free variable, substitution, --- and alpha-equality function. +-- and alpha-equality function. The abstract type `Name` from +-- this library is indexed by the AST type that this variable +-- is a name for. type TName = Unbound.Name Term -- | module names -type MName = String +type ModuleName = String ----------------------------------------- --- * Core language +-- * Core language of pi-forall (Combined syntax for types and terms) ----------------------------------------- --- | Combined syntax for types and terms --- (type synonym for documentation) +-- | Because types and terms use the same AST, we define the following +-- type synonym so that we can hint whether a piece of syntax is being used +-- as a type or as a term. type Type = Term -- | basic language data Term - = -- | type of types `Type` - Type - | -- | variables `x` + = -- | type of types, concretely `Type` + TyType + | -- | variable `x` Var TName | -- | abstraction `\x. a` Lam Epsilon (Unbound.Bind TName Term) | -- | application `a b` App Term Arg | -- | function type `(x : A) -> B` - Pi Epsilon Type (Unbound.Bind TName Type) + TyPi Epsilon Type (Unbound.Bind TName Type) | -- | annotated terms `( a : A )` Ann Term Type | -- | marked source position, for error messages @@ -72,7 +74,7 @@ data Term | -- | `if a then b1 else b2` expression for eliminating booleans If Term Term Term | -- | Sigma-type (homework), written `{ x : A | B }` - Sigma Term (Unbound.Bind TName Term) + TySigma Term (Unbound.Bind TName Term) | -- | introduction form for Sigma-types `( a , b )` Prod Term Term | -- | elimination form for Sigma-types `let (x,y) = a in b` @@ -120,14 +122,14 @@ data Epsilon -- | A Module has a name, a list of imports, a list of declarations, -- and a set of constructor names (which affect parsing). data Module = Module - { moduleName :: MName, + { moduleName :: ModuleName, moduleImports :: [ModuleImport], moduleEntries :: [Decl] } deriving (Show, Generic, Typeable) -- | References to other modules (brings declarations and definitions into scope) -newtype ModuleImport = ModuleImport MName +newtype ModuleImport = ModuleImport ModuleName deriving (Show, Eq, Generic, Typeable) -- | A type declaration (or type signature) @@ -252,11 +254,11 @@ instance Unbound.Subst Term Term where -- '(y : x) -> y' pi1 :: Term -pi1 = Pi Rel (Var xName) (Unbound.bind yName (Var yName)) +pi1 = TyPi Rel (Var xName) (Unbound.bind yName (Var yName)) -- '(y : Bool) -> y' pi2 :: Term -pi2 = Pi Rel TyBool (Unbound.bind yName (Var yName)) +pi2 = TyPi Rel TyBool (Unbound.bind yName (Var yName)) -- >>> Unbound.aeq (Unbound.subst xName TyBool pi1) pi2 -- True diff --git a/version3/src/TypeCheck.hs b/version3/src/TypeCheck.hs index 4bb3bac..d182cc9 100644 --- a/version3/src/TypeCheck.hs +++ b/version3/src/TypeCheck.hs @@ -37,7 +37,7 @@ checkType tm ty = do -- | Make sure that the term is a "type" (i.e. that it has type 'Type') tcType :: Term -> TcMonad () -tcType tm = void $ Env.withStage Irr $ checkType tm Type +tcType tm = void $ Env.withStage Irr $ checkType tm TyType --------------------------------------------------------------------- @@ -51,15 +51,15 @@ tcTerm t@(Var x) Nothing = do Env.checkStage (sigEp sig) return (sigType sig) -- i-type -tcTerm Type Nothing = return Type +tcTerm TyType Nothing = return TyType -- i-pi -tcTerm (Pi ep tyA bnd) Nothing = do +tcTerm (TyPi ep tyA bnd) Nothing = do (x, tyB) <- Unbound.unbind bnd tcType tyA Env.extendCtx (TypeSig (Sig x ep tyA)) (tcType tyB) - return Type + return TyType -- c-lam: check the type of a function -tcTerm (Lam ep1 bnd) (Just (Pi ep2 tyA bnd2)) = do +tcTerm (Lam ep1 bnd) (Just (TyPi ep2 tyA bnd2)) = do -- unbind the variables in the lambda expression and pi type (x, body,_,tyB) <- Unbound.unbind2Plus bnd bnd2 -- epsilons should match up @@ -67,7 +67,7 @@ tcTerm (Lam ep1 bnd) (Just (Pi ep2 tyA bnd2)) = do DS "but found", DD ep1, DS "instead."] -- check the type of the body of the lambda expression Env.extendCtx (TypeSig (Sig x ep1 tyA)) (checkType body tyB) - return (Pi ep1 tyA bnd2) + return (TyPi ep1 tyA bnd2) tcTerm (Lam _ _) (Just nf) = Env.err [DS "Lambda expression should have a function type, not", DD nf] -- i-app @@ -99,11 +99,11 @@ tcTerm (Pos p tm) mTy = tcTerm TrustMe (Just ty) = return ty -- i-unit -tcTerm TyUnit Nothing = return Type +tcTerm TyUnit Nothing = return TyType tcTerm LitUnit Nothing = return TyUnit -- i-bool -tcTerm TyBool Nothing = return Type +tcTerm TyBool Nothing = return TyType -- i-true/false @@ -142,7 +142,7 @@ tcTerm (Let rhs bnd) mty = do tcTerm (TyEq a b) Nothing = do aTy <- inferType a checkType b aTy - return Type + return TyType tcTerm Refl (Just ty@(TyEq a b)) = do Equal.equate a b return ty @@ -180,20 +180,20 @@ tcTerm t@(Contra p) (Just ty) = do ] -tcTerm t@(Sigma tyA bnd) Nothing = do +tcTerm t@(TySigma tyA bnd) Nothing = do (x, tyB) <- Unbound.unbind bnd tcType tyA Env.extendCtx (mkSig x tyA) $ tcType tyB - return Type + return TyType tcTerm t@(Prod a b) (Just ty) = do case ty of - (Sigma tyA bnd) -> do + (TySigma tyA bnd) -> do (x, tyB) <- Unbound.unbind bnd checkType a tyA Env.extendCtxs [mkSig x tyA, Def x a] $ checkType b tyB - return (Sigma tyA (Unbound.bind x tyB)) + return (TySigma tyA (Unbound.bind x tyB)) _ -> Env.err [ DS "Products must have Sigma Type", @@ -207,7 +207,7 @@ tcTerm t@(LetPair p bnd) (Just ty) = do pty <- inferType p pty' <- Equal.whnf pty case pty' of - Sigma tyA bnd' -> do + TySigma tyA bnd' -> do let tyB = Unbound.instantiate bnd' [Var x] decl <- def p (Prod (Var x) (Var y)) Env.extendCtxs ([mkSig x tyA, mkSig y tyB] ++ decl) $