// ============================================================================= // Generated by efx_ipmgr // Version: 2025.2.288.2.10 // IP Version: 7.1 // ============================================================================= //////////////////////////////////////////////////////////////////////////////// // Copyright (C) 2013-2025 Efinix Inc. All rights reserved. // // This document contains proprietary information which is // protected by copyright. All rights are reserved. This notice // refers to original work by Efinix, Inc. which may be derivitive // of other work distributed under license of the authors. In the // case of derivative work, nothing in this notice overrides the // original author's license agreement. Where applicable, the // original license agreement is included in it's original // unmodified form immediately below this header. // // WARRANTY DISCLAIMER. // THE DESIGN, CODE, OR INFORMATION ARE PROVIDED “AS IS” AND // EFINIX MAKES NO WARRANTIES, EXPRESS OR IMPLIED WITH // RESPECT THERETO, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES, // INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF // MERCHANTABILITY, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR // PURPOSE. SOME STATES DO NOT ALLOW EXCLUSIONS OF AN IMPLIED // WARRANTY, SO THIS DISCLAIMER MAY NOT APPLY TO LICENSEE. // // LIMITATION OF LIABILITY. // NOTWITHSTANDING ANYTHING TO THE CONTRARY, EXCEPT FOR BODILY // INJURY, EFINIX SHALL NOT BE LIABLE WITH RESPECT TO ANY SUBJECT // MATTER OF THIS AGREEMENT UNDER TORT, CONTRACT, STRICT LIABILITY // OR ANY OTHER LEGAL OR EQUITABLE THEORY (I) FOR ANY INDIRECT, // SPECIAL, INCIDENTAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES OF ANY // CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF // GOODWILL, DATA OR PROFIT, WORK STOPPAGE, OR COMPUTER FAILURE OR // MALFUNCTION, OR IN ANY EVENT (II) FOR ANY AMOUNT IN EXCESS, IN // THE AGGREGATE, OF THE FEE PAID BY LICENSEE TO EFINIX HEREUNDER // (OR, IF THE FEE HAS BEEN WAIVED, $100), EVEN IF EFINIX SHALL HAVE // BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO // NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR // CONSEQUENTIAL DAMAGES, SO THIS LIMITATION AND EXCLUSION MAY NOT // APPLY TO LICENSEE. // //////////////////////////////////////////////////////////////////////////////// `define IP_UUID _4c19f37180ff465ca20760e199a0613f `define IP_NAME_CONCAT(a,b) a``b `define IP_MODULE_NAME(name) `IP_NAME_CONCAT(name,`IP_UUID) module gTSE ( input mac_reset, input proto_reset, output rx_mac_aclk, input tx_mac_aclk, output [2:0] eth_speed, input rx_axis_clk, output rx_axis_mac_tuser, output rx_axis_mac_tlast, output rx_axis_mac_tvalid, input rx_axis_mac_tready, input tx_axis_clk, input tx_axis_mac_tvalid, input tx_axis_mac_tlast, input tx_axis_mac_tuser, output tx_axis_mac_tready, output [3:0] rgmii_txd_HI, output [3:0] rgmii_txd_LO, output rgmii_tx_ctl_HI, output rgmii_tx_ctl_LO, output rgmii_txc_HI, output rgmii_txc_LO, input [3:0] rgmii_rxd_HI, input [3:0] rgmii_rxd_LO, input rgmii_rx_ctl_HI, input rgmii_rx_ctl_LO, input rgmii_rxc, input s_axi_aclk, output [7:0] rx_axis_mac_tdata, input [7:0] tx_axis_mac_tdata, input [0:0] tx_axis_mac_tstrb, output [0:0] rx_axis_mac_tstrb, output MdoEn, output Mdo, input Mdi, output Mdc, input [9:0] s_axi_araddr, output s_axi_arready, input s_axi_arvalid, input [9:0] s_axi_awaddr, output s_axi_awready, input s_axi_awvalid, input s_axi_bready, output [1:0] s_axi_bresp, output s_axi_bvalid, output [31:0] s_axi_rdata, input s_axi_rready, output [1:0] s_axi_rresp, output s_axi_rvalid, input [31:0] s_axi_wdata, output s_axi_wready, input s_axi_wvalid ); `IP_MODULE_NAME(efx_mac1gbe) #( .VERSION (16), .TXFIFO_EN (1'b1), .RXFIFO_EN (1'b1), .TXFIFO_DTH (4096), .RXFIFO_DTH (4096), .PHY_INTF_MODE (0), .AXIS_DW (8), .RGMII_RXC_EDGE (1'b1), .RGMII_TXC_DLY (1'b1), .INTER_PACKET_GAP (6'd12), .MTU_FRAME_LENGTH (16'd1518), .MAC_SOURCE_ADDRESS (48'd0), .ENABLE_BROADCAST_FILTERING (1'b1), .LOOPBACK_EN (1'b1), .APBIF (1'b0), .FAMILY ("TITANIUM") ) u_efx_mac1gbe ( .mac_reset ( mac_reset ), .proto_reset ( proto_reset ), .rx_mac_aclk ( rx_mac_aclk ), .tx_mac_aclk ( tx_mac_aclk ), .eth_speed ( eth_speed ), .rx_axis_clk ( rx_axis_clk ), .rx_axis_mac_tuser ( rx_axis_mac_tuser ), .rx_axis_mac_tlast ( rx_axis_mac_tlast ), .rx_axis_mac_tvalid ( rx_axis_mac_tvalid ), .rx_axis_mac_tready ( rx_axis_mac_tready ), .tx_axis_clk ( tx_axis_clk ), .tx_axis_mac_tvalid ( tx_axis_mac_tvalid ), .tx_axis_mac_tlast ( tx_axis_mac_tlast ), .tx_axis_mac_tuser ( tx_axis_mac_tuser ), .tx_axis_mac_tready ( tx_axis_mac_tready ), .rgmii_txd_HI ( rgmii_txd_HI ), .rgmii_txd_LO ( rgmii_txd_LO ), .rgmii_tx_ctl_HI ( rgmii_tx_ctl_HI ), .rgmii_tx_ctl_LO ( rgmii_tx_ctl_LO ), .rgmii_txc_HI ( rgmii_txc_HI ), .rgmii_txc_LO ( rgmii_txc_LO ), .rgmii_rxd_HI ( rgmii_rxd_HI ), .rgmii_rxd_LO ( rgmii_rxd_LO ), .rgmii_rx_ctl_HI ( rgmii_rx_ctl_HI ), .rgmii_rx_ctl_LO ( rgmii_rx_ctl_LO ), .rgmii_rxc ( rgmii_rxc ), .s_axi_aclk ( s_axi_aclk ), .rx_axis_mac_tdata ( rx_axis_mac_tdata ), .tx_axis_mac_tdata ( tx_axis_mac_tdata ), .tx_axis_mac_tstrb ( tx_axis_mac_tstrb ), .rx_axis_mac_tstrb ( rx_axis_mac_tstrb ), .MdoEn ( MdoEn ), .Mdo ( Mdo ), .Mdi ( Mdi ), .Mdc ( Mdc ), .s_axi_araddr ( s_axi_araddr ), .s_axi_arready ( s_axi_arready ), .s_axi_arvalid ( s_axi_arvalid ), .s_axi_awaddr ( s_axi_awaddr ), .s_axi_awready ( s_axi_awready ), .s_axi_awvalid ( s_axi_awvalid ), .s_axi_bready ( s_axi_bready ), .s_axi_bresp ( s_axi_bresp ), .s_axi_bvalid ( s_axi_bvalid ), .s_axi_rdata ( s_axi_rdata ), .s_axi_rready ( s_axi_rready ), .s_axi_rresp ( s_axi_rresp ), .s_axi_rvalid ( s_axi_rvalid ), .s_axi_wdata ( s_axi_wdata ), .s_axi_wready ( s_axi_wready ), .s_axi_wvalid ( s_axi_wvalid ) ); endmodule //pragma protect //pragma protect begin `protected MTI!#e;@xIi7[-HGzLj~uK$ABr$Zn-[=27Ae'i}@{^NE;{e6lAK?nvVnanL_/'ua3cAXKuv?3BaD V;$uMGZ,%lwJ#*+[[o_n=['CW!Ul$HUl_T{3A=O#}Ev@;7IVvZX$s#;\VpE[%H'vCO]}}q/ovC!l,oQ$?;'vGBX1nmXY~Kj*j{pzRA]n V!wX^7Z_$2+bff}dCJuu~\uOs;>jln,es?E>K,'BmaC5ICU5x{5;mG\}Rnzs$eJ+BnzV-sAz1?G7iA5KCa'VoPO#OQCi3k^;3u#saCXAeuE TOu'G-'-UA5#YE'*,+\T,#7>}D=VuWO_$*r'\TkY$}<\wlGbn15[$Q3u~C^$xYn~$VvDNI!URHG{ JkT{szJ[?~{UB;Y-@[;ZR~{ulXEX[6a[#7QR_+f7m1RNCMOUxTMETI#}I}WkC$U~C>G?VCn#l2#d FqOwj{HRU<{-X~]3zn']e=1Il~,[}7veO>#r*H[JZe5a=2Vl?sYA]*),gjlBZQp*TIlwG1ruYxoA HD^GIY;Vzn>3[r[5\O=,3#+{vSm$!*U>erKI\^*?rom1W['Y+Dv+R,VAv?=+mzKj,_kw\X=u5;XY amx,Z7az#=CU]'*iTU|$'e#mxn=kpBv\m5ir[n~4%N_a,=}2l$us_777oK)_n_!;\vu*~lXROEj~CiU [$'#q7+WsACCv}$wUX5VX@pe}YeUZ9[R\wDA_u;s?>HD!>#H_'zwVHs$,prY<\dpk~JYAjzZ]e]+ lGs\Hew'1?<]x>vaG_eA-[pC+K}7x#C>*=]F{H*!JrOVizi'<};U-*O5?GZJ0opwmI[5^Ua\O~}] KK1![G3sQz{u!]9mz!JKRzJz!uvxIaXEa3pETQV^IYlXE[w.^@~A7m=Ze#-3@epk,Ie@+Gi^|%~+ ~u&3^ICv#snHwIi\!'YH^I;]CG!7[7RVaK5BlU<)kA-J~CvHvW1=#U-_OpmlP2{o~*,_jzCOm3\n ;9)A]VDRzA*?7<]O^l}Bs7'wQ{=iXAJ5pj5]luYJns{}!xrkCtR$a>[wG@C!7+G;3UkvYY=ww,w1 v**J>kvYjYyr'Z*3N{e]\Gr'_}p@~-nTlfXCul:\U7lL2_zpPs71ie>Qp$>,v5jBm9s?T7Vu*>]B hWAYQyX$E^CQOxsXlujE#;TT<<(rT$Q?aCIO=aU:bOioaDQ+T(U5]^l\=uY!zKoYIBy^I_~sEk1i GZ$rXA7x<-;k'kxr,5#zCo>BQQR2aA^mrrr#,oX7{nZ:@Q'3=m]esHIk'r1Q",nEu6J6Z{++nz\],u1!.Vr~}eGnwIx@DhOEW7p$2CjQ[^EH@KaEJn*7A23xlO1p!DuQ< Jo_xuvOs}rH;j,vJ2wO;@D,1H.z5}upz1!@[U5)G?{7.zvJUSK,Ea!>}oKrOs:2[,WU{O}~E-{r1 WK+$wxQYv~Y[_<3\J-x1{k7jBs1ZEp-AO;a]?7G!BEkjRr"EooEiBC*HQp@~>J_7!\C1OUG$u0I- P-{+3>o;Xs[=^e3WrAn15+~3,YD$^sn#,!p[QUKe>] ~E2,l@V1>'*lYIbo-3$[j@}iNo~=Uh\_?xO+=G*zeZ=T;*x!no@9<X\}v[OjQu7Dn,?@l3[YZ'uUz?{7YD*aa^wBvjX'ZXnzwD-E,^!uj^,pF=BI2sDV ChEpJ+Y_zRI;eIHs~1\]YBUY[*i>{-v3mRR4sk1=Kj^skUK]B;o5JjErW_Y2o31sn$1kE~2njV{K gO]H1,7^#::&Ym*-#\;E}{C]kQr;R?};$QTKt3-ul7T!kB,7@OpK#7^aCwvkD{},^5rA<=sT];v- YVeok>CV~;DW;VXBVQ[BeaCaB'7our1rKsZp]lIUxToE%UTHJ $[A7mHRT=BEu7jYKn\Bk'Q,>_QwYVJBrrwK!j,>2K5oJ0#HHl1uR]l'H+jn--\-a;,KVkT}7Ea1? l@]HA[iw};CA?0,woQ}D{Ju,nKW<1Wj\p{FJ>CwJX}pD3@{,uY-~EOaI+\k>}$x~5?H!I,GYsI?b xmJE>T$EKA'L&uQ-HOZX$>nBof*w>Xu}[QtG2XCl@n@W_mI4aT^J9MaK6Aj}ap7YQiw~U# x1w\1O7js-B1AlK2*7KK][zu]-~iTJVWn,U,Y>Ri{I$DW$,<_RR2=VwT}Jz#{+$%ga>==Q,n}9*z 7n^;wQDTQU5OTpV5GwE};K_t__p}ue5ZKRp]Oa3[+U*OY~o3o>mR1$$ut3{W'+xlY'DQr]t)_Or, P6^I-I!rw+ou7"n^7@-]{]UwB[0-o}oEu!-l_CJ,b D3]]w^~3oi `endprotected //pragma protect end //pragma protect //pragma protect begin `protected MTI!#*=C_eX;er73ZAUn>TT_GeCE'6KYE@T-GiE#+BN"iwAueQz#\xW]Zzp[RZXwuDUlkU27Us5* J[x?I2TX>YT}aap<+1$'Q,AmOoXA31,['>Kjr7oe-p#]>l~z='mVsX^mE$pKATo*D?7J=?[*rJ@o [Cdp{EWu}7pD^!=sWO~G!}ANTavv]v1?Cw~KkEQWL@xYipr5wwA3mo-E[luM<5G76-sDA>BsBx77 pA<3;T6#wo7hHXU[#ar+[Z&1i@R}[{unaUBV2ITE5*#aUTQY^7[V}YaJ'1HuI_'+O1AM[x[}o\Qj 7#=K1rpw-="l^r2=ynD>[W};3=m@>Kx7#[i}#Qx}j|;1I72T{ZB1+=1i$@>R'y_;B>Y:>Ijwp]?2<,5Kz7_VGGnZ@Wo=sH5^u}Z-WKY"pjG{>jUKIOy}$1ifm^@o{QA~7Qk{so3E !THu$--s~{BBY6+1$'Q,AmOoXA31,['>Kj[oE2-]C]w<'~^~WRo\Bm1N6#n,BV+Wky>>2=-ov@/F Xj-A}k$YSk}rU@5klShh.v jSwRx_=\-C73,Y4!,lQ1AI >B%>l?BnG;#a'?@VkB{RW{~}vo7?^k^N-QrxF=<{VeHomwTYOu{>Y?T\Ys*@#Q*m\n[$+7,7V$?1 '$-IOfn1;nWD~2,EY+nsIVE-T{7s[H!z!QpZ;!z@GESe<[oUR}mu1_Q:9i,J1zRmBUDe{;p]^Bim 257,jRp#ZwEA3W5?DCk^vC*[+lD^K6-EHJ*nW3I+sA$BB=1CE19W\]sIT=7]^G\z9Rkp}=.oIpDmjDUu^aA]nez;[}5lEC_^U[YsrBk Hpn1{?nnCRtG1e;5CMA51>p#5AwwE!$rmW+w@$l2{uGxW3Q?<{1mHUIW$@KXsXdxezk1*VC9mnQ^ ^OssWeQx=$nE.t;+{Trm~^oQ7XBB2kxA?BOKrTeCr7\;2Y-*~5};R]_}$Rz-5QBYG1W[\T-,mCA's:U>!njpHv<[2k~pmOqir7l/i*Ep\^ VVKor@Y~Aa{YUA~wQpe^j;BI?xB5v?ki>nH0,{Vn v$eGCpU-'womJzlaiHWj/]=Y3y.?5QZnVziw1;r#RZ\7 <5wOpR5~Rj_mEXK;GxYYp-5LCe?!3Dn2 ^D#pGar*Jr2[uE##I51r3>m[waA@Bkn]l>v^\1'#01Q1{uR=X{U<=uO?UY9@pz# [>{I3@jQ]-9s1zm*xG3L'IRlP9NE>RKkl\O2>WKG7[W}Y{G2[}*[sx[{TTAWp~Q]1>,5\>5?Z+luJEouQnu=ZD{,]vpYs,~v\$/Z_]=k}Ou03a2-< XKJ{a=BeZ^\Qx>snp\5?V^5A*5*=nzlB?ATXo3soK=QB+TpE@Y]$-po8q"2H}Uxjuv^ @ui1UDGE?BcC=Tu\$Xv$Y>n*u,Yv;}_bx6Ei1n1Wn-=AEYGw'DwwY;sTZCa-7]el,]q@UUYsEl1nnQZ@Kv'n[=,2#+'A?wT;+D\7Jy3C\?'D-_e5z!Tn 2{oQ_GE>oD2Ea}O]4YSdDjuTwRa2U'w28KR!l,$&^5vxJV$je=V AiQ'oX+][v05AEqj;QTx+YuL7Uh%zXQoZRIp-{_'X1#uz|x<@OQ< `endprotected //pragma protect end //pragma protect //pragma protect begin `protected MTI!#;,_@!{KEi^ril'A?olZx@EIRar\~Xa]UFl~*7|"BZ,D,,_<+HWr_e+[o32s]e_e$E3UZ'}? eBp#^2$+>YT}aap<+1$'Q,AmOoXA31,['>Kj^kpsJa52o/}mnpcY5RiFQY]Cn-5Oo_}Y[*nUl>Ri'~*zXj*\jwH -11WYpZrsNEKYoJVzQY+VBf>DAGOvDv{szn;TQ\YzlY7ka}^_!XZTJ;QJXE^Qm]V~+##n1ROUQG[ -x79?]v*wI+R,OiwBWEmGG'{Y+*U=YB;l+u7l5$@opVz]e+}p$noJXl3~\e?la^I#h?$IzHw{=[siHieK~Ok~Hlm{AN' X-HUDTQ[^E3HV2k}kXjI\B!::r3~$Vjl]Y5XxUNIm*UxCAwawo;U<*2f?XwFO;]2W[h^dM mCEE1*BZ `endprotected //pragma protect end //pragma protect //pragma protect begin `protected MTI!#Crl^]Q3n5XwJ'5x]rIvQHEIRar\~Xa;;Fl~*7|Q~zeIGWO$vjUGZjv\3-LTj@$<,m};Gla+C$Vr*Duxm^;j+~Y@K[-m#r#rJ'veE'7_KeQe'eRr-iTI22];pVG_@T7a3A 1n7IP\^aT alBn?Z8q-8In$kJT]{'2e]@U!5Fi5r>k+'k[TpE]u\$$~rA<]Q*DYw!RAIn,eRwwr^_*jJE]!@VT p$<'B{EC!n$gP[}'e@DJsGaxO%YH$Z~CY'I6%=owE5UOJXEa$v@J!-10=?oDnl7;'+aK5<{25r~$ JTrJBeX+jYxHs}+;7{mJZ]ZG7='GklakiXaZ'paJo$#3lmj,XD7='v5#g{xZ's2EvVs?~5HEz=w7 {j<=^**5@5QKRr}jX,$}r5]^$z{}+}x[#[\u]\7KuQ]Vsk!= 'KQjuzlZ*xD3Tx!aGum+sQIm{O^'#RXk0E}2U-]T[YIrG so$pH'UaN1l^]m{v,UE>5*<^?D'3+3AC5XeVOlW]\jzi=mJe RTuciDmkx>AYl^$AR[IO1k33BZIrzOu3Cjpo[pTsEmY]uE+xR=T3CEC7O*ewlB}vIW+-]rzB*aQX IxxIATD~'I?YJ>z=TB#!QXDsxjzm=o+=l*YY"FB]Z{k{aIz'xAv\^pTzC;zuTKk1jT#w;@l!$mAX B\a'K~Q;QSjriw,E7o#e-2vZJQrQ_[%,~ensGe=-_*-=D?I_zXJDHoUI>nDmEBOx>^@Dw[,#>'=^ 7n;uXe@1B\^ElnKx3W=$xJTs>x>'BY}_YkaJ,s?6~{QGP^$$]5*K+~B>J^%ECIZHaTkT$#*u=o@OB{$N[Cx=~Y;}y)n{ w~law$Hl+n;rVToC+xRW7Rwo1#[nx!Hxn_'><'3j\]J\CT${IO1^WtjV$saR?7^y'sB>DT]?HUd$6n $puezro]aDC^2^o[JIXB-wU8aHH29>aNI;jJC?DRa ^s!a2Y-AH*{nu]OmoOpUoH[$rA7-IJ[ws/i1iDoKmsk7v7;E>X;@UB~!;\E*'}VXRT<-wD\3XAH\MlNBWurvB~?Q@-K)''aGs[23G\TXG\1n>D[u*al[OI-A'<+}W 7T#?AwVk9]?s2[$Vep&sr{+BuoViE@;5iBE%S7l=YG_JVmI;_x3QEWesRlibC!ABs2\Ijw_]Ii=,Z{+[Q~JeQu1uM[WamFEl,u}iV\Vs aeB25T*XKrzCU#O2+{z\[~Mcz2EmO'vi[vT3=>=jQnVzeAsQi\}QDIAa*}BQ_tIZY[e'>XM@[#{9 {{5I^2U^9heUCO#T'[{YVC}wr=q'6Q];vPHO\{CXZ!]YZXRn_\Vk8'RRpw*ou$GKYRIG}I35Eo>G !\ZlW\!'a.QwvupQJv1>l-Oz^GBWvTwBT!7eA*poEaYUCv W7%?H^WBdH/W$wuxZ]'QGXoN\Wz}zO__7I^Q?w}n[}^@]hs*]ussYT@7]G0z\7x7ZVZ7#XYpBHHCj[+K[{ AT=eEp=\pYXnwQH\3GWV-Dso;7UoYY[T9Je>Q^-m[U*Wwp?I{kBr,!#lB[F[*aW\VwYUlk_ve ;#GneT_lrrv!!=i'[a_HXxX+KDs<]]]zA<@eEe-jm$~E-@>^Sa-_s\;[svsBIk,2Yn*Yp9R-{uk< +#JjuKD;$sTnvmo?\R@p'aZ'a![;Ur7{}!uTB@neT#{Q}iIdm=op_v{ZOa*C\a*#G}KZ9i<{]Z>I #,Cf[?sI'~Q#iz,2*x!*5c-jp^F"epC}^WYz>NRlKUV?CTw]px2w7{Q72QU,up1{;sU{W2T';YBB eCBO1{WBk[ZlIY11Wwel$wJOKu3nKsT<[NYs*iYk-,p 5$k![ `endprotected //pragma protect end //pragma protect //pragma protect begin `protected MTI!##AT7WBH3;8ZX+=WY;?}a7,]wA?7IY-+t&wa1[yN}-[2o1WQ!+E#1^5D|DksiGZD]Mv3Wx5< j*VTm[rZ,%lwJ#*+[[o_n=['CW!Ul$HUlIC7BA,O#vGi[wp3xag7Jl-1R7IwsGr}?RJ|R*#I~n7@ (FoC1Dre5U;IKH.t(e2~w7K@zG7n}}lSIQeZI@'2j|VY~O2[{p~V)TnW@$R25|BB\2Pze-j|~Tpp 7v@2RR1-XY[OEBuZmYJwv!}[oj_#W5R-bq9Z6:JT{[}<\2E+H*JHKJDG=<$$1GD kw#'+ze1-]kIO{-xzvW,#~n'ijJ~r@$GTQr_=],J\za^;VTu53xo]!r>Dj[[e=C%i{jZCZI.Im>R5uGR#$k+B9eZ}H&):vIi[IiJx'<_QN~wB'r_e{I R\$jOAX}QUA72!*+r_xD}EDtawl,=sY>!nl,{TKW}iD@72_J*WGAEQp>l-o[SV\+;^lzmBx\V{E' }?we{yIlKkaGTFI\+E~RJ_Zjr-1_peOZn@p1Q,I~Z}ljlWlY^[#}>IV>$j6s?@ooCkKLvWA,B UwU}Hj@XYaw#eu{B[X''px3_GWrNC+l17]KI1A@uJT,sblUX,DTnak7WRzJO]8iwrKRr*krHI=V!C]rmp'zE1VFDG[@H vuI!-E3}msvVUv?uDo^WeVul1iQW'_kWD+Q8]@JG>xeW}\p$h3Y*xCk,o@jIuYs7*X\^J}s=Z[k> UTBo3O?Tpj2,RziXx\,Aa$X5_o-RY$v7qs;Ewl*UOm'Z=HX2I/'\:|[2+;^z}R:k'Bv rkY1lUzD$OOW'*k_onoG8-=j5z+u_}@'iQ?Z@U77v~aTopT~'CXpG[j?Xvm*VuDO<#1w[[k+?12J \\$,u^5U\xpon7o+n,}JZxE7wJ[@Yl{Z@bQoQ>r;Vu5\VK=>rAQ~vZ*-x=dl4"gJ-X]VG+D-G_21cn+_ajWZATsH:ru$J$2OD$QjGCl-CAsuC#jls}2e3H6@,s3kjUnrjZn^[=s9]5o-P]*p<(kYkT%MO[ ?Ckm{CoWR\,'4~r;5 zT<'k$_rPlwJ#*+[[o_n=['CW!Ul$HUl1U<@BIM+1a-iIAH-Xzi0[3oK'3e_]W=5AO<'3j&njzGo U'X\SR3*'s@QeIg}mUoE>~=S1@3Ac"4bA},\=>n2{Uu\r1<$\'sJ3l!*j_XEzaZx]e]U>A '!r{O@e2z'<>s;eTp,7$YGTwJY}a^ZD2xl[#@zHo~j{9UsT~.-w2X^e}K5TujrvQ-F?{t1qE"}k$_|s>>7L5d?+aV],T2=;*Z+XQCYx*>G1G>wjQ^-U*ZrR#UmoD=u^weZTwX, Ena~A!<*VAUx>~mrRoxIiEx_^[_^Q1!GY\#QnEW>\sKhkUUID?<'a-l2]T#wDkrTERg#]BOG>$s^O=J=i-*2}s#?x[[WrTr1WKl RCDn,=Ymf~=\~=u73UD<'x]Do_apje*,DTrV\.$zT1>[~a^!AaBA-U<][K{I'em]KGT]\Z,p2?RC VmvlW\G+~->AuCqaTeQD3Uz1m$CQwsa1#JzDe5C;},B}\4Tz5{V#3,RC5e+7A[<^KE?zrvr_mwV{ <~Z56*ko'Y;1e_[2aX's[:3_\nInHK `endprotected //pragma protect end //pragma protect //pragma protect begin `protected MTI!#J[kZ#}{]Y<,WEjNs7z3\yCnJ?[Q#~,[k[6EtEuJI6lXRmnpjT5nn[6}0^!R2;]Q[9^@2Ken C?pHQzvjk}]irz!w$wIi@DFzx^QI}VCXvopV'[QNP7uZzs@;ABHQ1RXBYQ+ji:eBA{Gn5kp;]#l' kQ'ZQis+O?r]WT(&F)M"3.M#j=;Gj+XtOa\VsH,ivO'=T[OG=[-oarAsy]Bv{;VQ]=xR{;l{V5[w 74DA{jxx1D$pr\lDv7rHA_3^7IxeG<1o+k@[\*K>'[3_dTxlHw]>zp@uOnCmQTIxH9TXX+wj5aQ! _WI,?zJsXIr+,YOBU{!pIs~|v;@+]7QTpj\Jf*X-x/e7DJviDYYqVu_aJC2_WUnB-Dp-_KZ],\3E ~]X^\9Ip;@2>sz_5?'wxm]bYX$k@<'s/r$nV#n*s\m>z-s5k@e$r}bJOAp;lO5Zl7 +>Un'<85]piC1RR]V$>J oTK^_mC@_K{$V{7HG;UtTr[V$i,Yw@>E'=jGBeTl<$v ^-W^neQ2Y\<'-_,l#_V2YxW,ZX2Xz{KCrUv!5X+Y1eRXB+3R$HuI2IV 3'[H*,pvrxRGI!Cv[VD}'rZXzuIsejxn[HQxi{jBQwW@0Q'me#}Br3>^DiI?,vGRjVs\U)5J}Af5 @l}/o+a^u7*uH_TvI#~@[{Bp]*3IuB2kn$IT0Ei+Bi+\[,CX-o[2UVzD*rT1lk]ID[;HaEBI~*** 5vV+Q=rxpG*QJI'=e~DBiE5[Iaaln3Lnr]jHRQA5aKICiWuj2A'r5pvB=s'wC{aOB~r;^\#7i+RE 'okpYCEo^HvYeB57~,sWB}^)+>O>q]'TOKo+TdrvmOT-sV#Dks*7VVTsR$lm1<}I5-w1in=a-~r! ZaV@n7Z1X}*{}u<{uDwto]?aaAw^]2I_GsYUr,'T8E{_psH[T2s*GpJBG.LsD;T=a>I}H+Tt{vG@ [W2l{^JU2Q;aU*r7lul[1_u+fY2'Be[sx'EzZDrva=mvz}i@zpw;DX5QZvHpKExCU4lXZA;Iv~D@G+'>E1QUCX-Q;$]~{QoKjAHI?OHGvp=ZQW;$oi:,HQVwO,]I*z_Ovsn*1R@I-5Te jv\q5DAz61>K@IK)DRuJqwjr7Jn[e!;L-[D*F-vZjVj2j#F1ope(V}XJ=3u+?[lGBJux=KO1bRroY:^aUzmR1C=$R{m$]UH1R\}E7$,~5plv,?RTV+jNOCio= u5W+wlvE?}B7BBT|,Cv+^wJ!|Q?vOouQ!BRXa\\Y@bRo?TqY~e{x#AKBI@A+Q;o^Tj['G_lEAH-E D?kx;~B4E[5\gnswkJOB7M_YmrR;J,,LnsoYB,<^ eCK}r*CJ7zp0z{a]%2{[X +5QmBk+QIA7{'C{DBKW<^p!urVi~RkEQne#,pxB#]=OvIW;BOAZl2;3TTGrsQK*J>Ro1?QO_YEIj E*[[wlT5&5VVlzi5aiO]n)!X(AHZz#RG};^ sW3(z1,+8UOi!W}YE3H>E!_{'r$B;R;<'mCjv[;77c1>Tj7I]EjR;KIUQ1:Q~R{pwv-^TJBhrC!C R\i$CI'-DsZUkO+EtuDI}*'iD2,ua*;7ltAl[mrIua#O7u]XH<1a}2+D'> ID$Q|:Qi5;I\u@PB{v1AAXsrjmXO^k$iO5,Imwj2~*^exJ pjUmCDRoRI\Q;zEvy#X\GY!=7EXjn!kCV~++lCDA7_w7[s$9.Rxvx7o~3=}'U[KlirEs}9!^i#Y>H$3C=?v3GjU5ZJK '=O[aRQkVns\I3' [?s[DnJq|>jv>DY+Tv{!~?5X]iv2u@_~RlkaRDYBwKeWEwYG}AQ0]e_{@>5!k};zeU{Otsp$3Ep{ _vJQ*I!*@>r3=/=l#r0nHlROo]WfjI,Q}XmjT}[r[zE]kl>X1s{{#7lYC1^Q,[mRVjvlOnpw2CI1 z15H7noXp]zx%vUU-CGkW2oY*_!^^-*1r1QW>)XIO{ATK>J';sYu[azGkjJQR-C*XpWGE@71<17CK[ ?{a^55x{5EBj^XOzV\RKj9CBK^ZT[='\H3DB,ev@vC{O~p>Ozo}W>{*e$TurVv,J}1#G$'~XonV7 THW-+!l5GvXp~l}?n=\vz~CIvQYH_#[GTl[7_GmGDK^Ew>W$rY<>TXebksY#.(x2E~$zjasll-uw JR]v!CUjYz,ApDPwYAO'KO*'np,*1Wp\Z;v8?s+@,jJ+IAH,a<'TU^OJ[VW1=!W}gk7-{37*GSr'jo?${pFf=7I;'EzXLDGQH 3V]J^ZZRuGr^eI@__+QrvwWU7 z#,k}r0;wX@j#w5{OunZ^G>%FNRj*ox;Ds-sBuZwCj}*npUBTvkGo5-OaW_li @p(rj-BBXT]l^]Ym-\r!C3j);,7$l!!axk~*~wDQYor!wjj#,inBJeW5RmKu@DYwnw3{,_mU|$*s J_}2avrl!Bq[^XW)<5<3j{$T3}aZ~z[nkrw=wnCV:$YxK^7Hx]XxO(I}1\V6!+lDrz>3XxE=^GDi U[13+,so6Oms]m_[!-^'\SkOYI1=]lI31e#r5<-+~E8~ATB$aC@3o@~GJ1KHrKjj7-n7jO'n-{zA$eUeY[],WEuY>F2Y1OrE XA^BIX~_jn{s[+uGK7Bk_YaDRWw;XY!uz#_4OGw{ x<~52n77#W}v{ mHX--[!oQXY'rJ;BmsCa\l"KYJJ-YX,qd>C!z-e+JZ-wzBe]zT9a<_g_pX^*7##$KTuYr7x xuG~5uZ;G2~EOZR;(<'?BYOxoI}Ol?E=zA^HxqOEX=sIZC,\IXiY>D$A1+XTrw~a]QT5]w^uj\'Y KUe+^GLw>KCWCpXY\HeTEDK>s1X\kxa@V@JGEroAnoAH_ G^Qob]oXeBGm*M*w+5k]:3r'lO2J}ouO~'&pzCja<<~=,$3[kHDOxajsI;_D]!EQ5VW:RR3@2Qev 0BiVYuTR+b_+T7C~}^e1+XbOC]vK\2sJ5GQGJ{m'<{AoHeRZ\A73eITRGA!Z_{W_J+JD_;oHGU?O Z;7a_=K:]35Jn>7^l3DAe'w>Ox_YpA~5p#Qpfgw'[[om'_|qRI-?r;~$|_2+\kB=DL `endprotected //pragma protect end //pragma protect //pragma protect begin `protected MTI!#VEJ'R$IWv0GBq{sOk-Gn-lArsmD+*+E#$AY}[^@,?t^n=?IjOA}T,?%FPzpe$uUD-CJ_eU$ jmjum[rZ,%lwJ#*+[[o_n=['CW!Ul$HUls5QxGR_#^xkUUp~T+HU[7K<&]JK*N5[i#IUAA^0Se>Q GOAKj7!ZV_s!r_^T1,UrXD!;p^-^m7@R';;5XJ?*^zuOz}]*]<#W'aTPpkWk~G@kaEYH)uY]WI1{'eHKUn_ =-JpAl\>HZ{opARz]Q!l_CCU{v,*~2-YxVolE5$anY4Q2QDOzeA,T=!*@v$s\{ZpBGHPFs{W_lH1 #]=YG[\pj2Vi#z+-{&f>Ym,[@>p'+w>n=K=BC{-aG=7$Bkl7kARTBk\nDm3vQw#7QXmi51nJ<{ow EHap>R}lRJ@nr7+:_f~HoUE'2m2>'rT}Dmw\Y}'ul'2$HJH{$^_R?YZ(o?3sjl>;jRWl5KCkP--H >!-$RgZY]-&7k2?_ZE<&=Z!~3^!-Gp#ui_lTz7W>ox3r_k1;y>}3[[OXmh,_^I!>z]RsY?*@~[mx !?ri+'OWz$j_e;V@RoVAo{/F-E}-#e1put(o]=i'B*vje=O*1U*QAe$va^A}=Y5'W3vX*_]s1ZT# <_Rm_mxYH}-UY4C#@K'75r--,]Ua_X~'pkE${AxF|RJ]mX1aQ_\-Bieks+GmRw!kEm{l~j7s[OO'2]HrFNzV_2y*z*7nHr2Y7p#M0#7Der_avba1C,[VUnZ'AT[gWa3>^Gir$nT~> E=e/HeK]csz@\vrU]CjnTYi2uIKr7BToo\XIZ(@x;7ln+D7[T2+sQ#a7H3Rh}YZ~R-W?AYrDS>6h s<7ZD[B~Ra'jF-{^o::#+~r3ww!erOz\3'\a>vAWxRE2Q,pevsiH^lAA.Gn^2+Bi~]xW#rEz}vRw _7e[EI#$xV1v[FDEH-q>G}7$!>mgAjQ1njA>c?7OO"6cIQ+]yTYnU^'+@Bk2D/*H++(aRpkX+z[#$ZW7KIE<3\EE\jHj']ZE?m}#^'vAj#JI?OrTuaQUZxoj;QK ws1uBa^En<}+DA=~\-@(XswJpGvTR^7^=!p_t_2Y>l3;pK\#<6=9cGx?AB#Q?#n_sjBT-l+T?V=> xpWW~BWX>\Ooe,2EQ@G_wKo\E+\0$u2'=KX'(Y$BRcf_EH2{Tan'X{s]I@HpTpGf[=J5B#m~Y>n[ gWCpY]-3OHp\Kux'',{11IHReb{7nC_[uZ!5+RRr7wl@OT|VoRp'5Y#7slz<}T[x$T@IG_C]@*G@ v_jD?7o[IQjGp\<>'\~'@@\o#G@~msx*E{n;T>r,C$v'vC{2^C@I^ GZABWs2$O}joe+AvW,;1,?*(v[A2$w;?Un6L*}G#*\^=>O~xgZaD'@_kx]$v,j}v=h,aG~\[\C$s B\5rkBV+OiEo{s&GZ~sIr}_Z[D!\RmThC[IZ5Ow#OCVu[nHa#o{,3Gs}2r>X7JY7o}E\!xQ*u>3- BZW~Hj@=VoC~Ue[YYp']Sx\\e>AGB[zkHvEK'Wr'>e7H'aoRs;p=n4(3},piQJ_o=ZVwT_e^\I~D n}vj\5}l2Bak\p{!_754z[VT:]eA2#Y7eyceV[V{jZ;ao#?IWW[wxC[7@K_q]_,,~tTQ\AP:zi-Q *_xDYTQ>^weXnnGmDY^1jx(X\3-p1w{ka;$*AY1Okwj3-2]k*~xjz12GGHHHa +UDD@jW,D*1xoR$QlC;TB{fj[ol{eVGD2Xr2{'m_}W\('R{:~*>@$Enn^1u}'p\i=p#R}?<'EXTe=JlC|~p o@Dlv#z+j$6xnH_VZxKA=s>*eeWQQkj}2RnEJ*~LQunR}1WR_mm GC{,2XAT>B_o^Tn}{*$^KV?lOrD=i:!_ETz^ATx7zs.;vVevoiE:j~s3.~pQ,<>a,TwO*TIuwxTV i#^{_Ol@'p\pu='-@T_3rl=5YP4GIu*R!nk>^I[*C[,nC,#se{D$-5w?^T[tr$K=z_ZZEYQ3KT_DA5m[O7UBlRsQW[Vi\ACXQaaor*U 1w3^!=D=cJU}BuD=-lmlr|^nu[;'xxAU-Ck{[7Ga{Kio,UdI%ip-7lmo@?a^}AG,la'GKG\!]d[@ K5HXx'jD;[}F~p#CEsA#ZrvDYV2zu_@*GxZ\lnI?7^xQs3w~YIE-{CR^z3j~lqa>j?;k7?ak%=C,pq)pM*>sQ*p>KIwIpNXIvvv;-Dr*CrIX!?t er-'WH$u!BBp5/iHY^uECH2tr,_;6e?={krZ1vv!#>oBT5kJ5z"z~xH^~2u}GDKmsHDEC5i@@#Qn-!]\X['x^Ix{C-Hrw--{-lVDpWD'!rT7WAvJ[ARC}+J#} ={D=5#7RT3',eROVA<2o{}EiQRZT$p$p=+IBgl3$uTn7OB+KT.j*>xCV>B=3Z'aY'jV}EERpIE^e _^1MS@[sCCmj7Rp,}hua$1.C-K?mEw_Bj2k<}tr}{G&uGu~/B*2TRO=~|MrRkszRZ;fAn*AaDam. IVX2#o]O[WZ_rXBBO;7_$HC&e^@=c%ma-~s}>jwp*zI,Xw5hA7W,_KX$=M7_Z-~\*$ ;*VX7D7\$@+s![ns5pWBO',+o{5ZT_#7Aj{A!<~IY{wx*CrIM9Uw*Jl!+Qq}z[jrww{1#^O$;zI] {V-AC~z*aj,E1w-I5l}?lr^Bz^@>]E"2}UYZO<5B?{\W]~;\\^J)kQ+>Q11{_l^2y?T1E}&zGk= *BKan*ZkX,4jmXpB>Wv3\1-YR-TV<,>ZQVRC\H-u'aI_ZuoQ[7W1JVZ=i{!+X;UXE5<};\sQKw$n Bx_<=mocY;TV]a^[vevJ=vipfo{X,u,OV$\Z*V}WD^#~sVW2w]#D>x!U15$E]vsrd'[,sH_o2QHC$'JW ,U,\$xxz3p2*CRIV?T1u!dBeGQ!B^GX&/kEQ!@RXz;zYe1wjXD\#{ T?\o,=}sowxVuJCVUxCx#3-D!P=prrTs}3nVRjsY}_J>,m+@lGA5wlerU1U#} -Ea'kQYwraO~_~$][,DYGw\EQJ$pjV5RZ#f?]x;.=i\H~9kx_uDZwIfUo7ep<2p#s}15\1J';lB+Ek7p-r$rp^J{@x_>,x>JxeB7zK@K3*'?WC*~^WE#1z_Jl+Z+$B.RGRB,+ }Et8kVKJ3<+I]7#aYepElYi1L!>@u}+,Y@SGA,\EB*1-IO7ZvI5{vBe^?T'w><4;>@jYer'*o$+UA,$R~Tj{xw }jz-z1C3UZdx]uKQvuH2oe>@]zruY?xR>oB}Y]~;oRn&>WW+ji\C.;'HwQ3rB1s?O}uz_p?Vo#nG'Ri@,]5pa,]># ?oQpa\>f55 ^2W_TC@OH3o5xKZX,I?E#'pQ=\1X};7$XlG;VKu>j}pn<>1ap=$C~usK[-zj1DV?vaUH{@[_@,-n u[r}-zjlAi=#CvGCit1*7r|<6FB>r?Yl_,.=YBo7}aEUz,@_T1V|d,k@e>-T@uw$XtWeWl}R[pC7 ?~mnxwq7svVX}}~sYHU75}R-e??^kuGS5a[C"\eHurk^Z]cajZ[?E[IMKRT*I$ikwG5]1ao'Ar5X Ck+\,eO7zV+nT>K;:IG{J\U]As5{Iv3'Vl@YX^zWoXIRuOIAJ}zHLsu2$]wApRG_~'YQi1ivDlH[Kr{$Ul-xun$Gr BUu}CHT'iI1}%#$5l+[?+6rpT2G=zp.![-wj;QTDGRV=JQnaG{~JIGonj=CRT2C$=^sXu,r3;Q(T{<7~+$}Y3[v{6%*A7kNr{+Z-s@ 5oaeZse7+ITWs-=zOz3R2$5+rxDj'h_eO_5mvpPlnn}2QJsHe?l*]71G;YUOnET=+}DF$wKAt,jG zQrv_=XICI~<'oG}B+1G{07jUxtK^j_\spaBk,[gBo,s'jDRErZs=m@zk+;[-ae$N1B>kW'!]BTV spUCKGi^;5V>j;LRoEx-HjKYZAuzWGY>U$7NRzx'JV}}%DWjvYwajkE#u-jZa2nXxq2j}n2+nEz\ VzZQ.I3!u#R[1OisV==^BDH]zj]UDSX*GEDiv1=#~eU\snGK12^+}CHnHK]-rn]wQpVW;;?,XY7Y ,]=a3]_@Wa2o^-W^G-q<}=w=R$-2=[TRmoR 'Z{A}$1xXaE31okn^TIxp^zl?Bw~+Ua'21IQU-5euvjU|^^,?*1QBC!_ao=uE,$E=;Xu$6<,;Y/Q!zplTR}rB1H:KXZ*IWlstA+r7AaV,2D3$o5u!ID#K\r@51C^D|*piJ4 u*x3B?'?C@j\'Wr\DG=7v}E+<_!pv'-WiA_{i'=@GoQT+RKGPRupUv+s'#v$n;I$uqAInwo?+1lGImHY3?[@$]W}-jo~@vww'']R1!u^{{owAj}$-5J~T[>zBZQ;];B$JaB\1?j;w>1+_i$TUnzQJ*>KHjk J\ar_*}s7O,uIw[IaU}s7 _*T*i131zQToxY$m~|WXYWJs}saAAQEsuCuVZD^n;=C#vsZCBs#]Ispyk=]#-DYZuZ~IlCR\KUWDVz;*\p ZIsJ.YN1a1Y+1,\VIE;gAz2;^}13F1w,Wb)C_ZxnYl+QsBU*dj2GG!$^#GqH'$Rl#m-RRGrGE^2V _*o<4OREp:BinCO[=rB_Q525SV3uxria_<]]pKwO'zDuOe ^Y5v)+8v;Cll5pHmRxk}sKrk7UZC5=-unZ?}#>TT**To]m]I>O-$V2r~EVD*el<{+YUaw{{$HKQd JQ\TlzBzqvVTYBHZzXCTGVi,[%D*@sw+Z#$TEZGn'[A+E2F=;-3t7#C'?C]ze5~O1\Un)-p+'3DQ Zn$CDVoY33x>~b+RsZ![1T0,eiEin=;e>E#,CU{T=2l5o}@$H-BE{]krK_^#1b=B+{I-7iX'_@+X3VjI;-[@mI1@ aXiRZWrQQADKZ*ECirnwHXn]nr~pw2C>7?}32aP_z^H&[55Imzu>TXVOnU$*Ih+a},E@3_cQ@{O~ DWly8q#^r'lH@Wz+rwGUnm>G,wHA31[Z_?u57;cl7isWopp,mEW?}*>>1BVo ^j@1=I[}ZJlM:zj!l_W$rfe;GA[GI7%Im~XjH3Bx?n+?QZvIXS2HU;1?JChe*1j#sn~7x}[<9UT!1Y*}#c;TTmZ YIs#QKVL@-;\8cxWY~'a*E?a^z$xa2*w1~]!5vjKC'>Ol%Ii3];>~D>D'o*kE\f+H$~iG}53\}51o1ZW$mRZI#ARK7ai}Y 3Q<]A?BB?vzDAonn>UEQa=EI1m>Rkv:rl$xZjJw#R}3@,z> F)Y]Txe1U++,'impe_^!7YeR}>$V!-ZA2nf*lplDv?_m']+)oi]Ww5awer{G?=;[]~QOd0a1m+Gn ]V~^^>-}Ra-U]EBzKeKsCK7;DoB.OWA25kDKWaJm{w5G.OlmjRzT;V@zoZ>VioG2OfN'=u{C2=7p3'v ^w-;1GmI%Cn[]*B5oWn=GGuUl,]>WGiaEXEHw1UXGir;XvRX+zC,^wwW;\1!a]JH2{YX[,3Y,T<- R!]K@jo?B[@3ICH=50]aQ58~o5_%3r=I*ur,J+3[QoujXQVnuxK{\we+fsQaup;Y}\K-H5WZ_KwG;npXaOCqo!Xm@r]=[WAe}z^\Res<-AK[[Ej@/}vov;]IC-3Hg;'s5=T$OCEE\j7#w(G$k3r7<#k7nGr7^@vuAKivR$=rG*vVYI\aT,2-pU}nGeo!2}*; p@V^\_1CHXeKJT>Du==m0Qj{x~H>}u]v'Vm+*,7X!-a>]*7ZuopXXsjKRz7Rp}uOH4m\k{ rKAAS*UWX\BHT@x\'l-ZEW+e2}Y7@2rH[X5J37HT\7Ge]c>X7T_>Tln>ZpeknsiVu1YsiIq?*l[' m1#Brz@tD=keXp{Ck$ED\+ZD~sXv^,^-s\HoC\@D}TIG,^iw8~,OJ396{zCrVD=$D#CrkBU*@sK# jU'~'YCm[!r?C[\ksrj~l=2w9ICk'=,2Y*Y-!Ae_l[3eHE}}=n{OY7Oev,-V]yM*W1^!_VsIzXG5 1]}rD/IDB^u_@'p[$2|3p}UG7ur2vT@VRJwzsnxl3jna$Gs]iRw-\kW;C1,Go~^ sUU?2$]^;5HTK[]=F1KZBJCopqwx 2TD[WRx>@Hc"lXJ>MHCWmzRvVr2DvPJw!nUR_#?n>53^'?QC^{1ZIZBLVGIIzm$Bwx>@wzjjJs2' Z*a3px?ZRo1n}IVR{v-7jPvw~kT.Yj 7Y$pZ;[AIU5D-_1!TTw>'U'l@,J->\W+kG;$pfzJuR,Y-$Un5e;-VRYwETpDl1Z<^-'#$79vZV,5$1Wb*eElmj~jE#5Aje^mn+~ssXV Bp2n*jXR_e6_G\-RtzZ7=u^R5]7W>N#a{W^U$?vXG!nnnuV[*~G_lzRV${v?7llB>'ea-mXO\ R2$O@l,eRQ{m}wV7*^5V\;pvZ@Wo=sH5sV}Z-WKYk]DB#{^X'mIDGT}T,*yeKJr*171%=JYuC =}x-TZnp;,+|EfkQ'Be-e]iXa[zx^QI}VCXvo=Iz!'Nm'i>l_$wB2YUjX}BJs7'-(E4$\-3*Jp3O QQu^zIJNv#@*x^Ix1Hz!$x[@wls~Yxm'um~5_5QtqgVjHo8I?W{2vr^EBkrH[H+&mm#RR[nT{3]'W-s$j{] 'GBu$OO2+K'oZ!v\vQ?mTvY#z-YQBU*^!l?[KV5z},ai_@=gn{'o5v@@xW21iYr'eGW]T=dQ*kER 3!Z^'3@=X*RmIwAdrQ@O$vBkj*;{wRu#[BJ2w[i3[a,3pQV2m Z1-]}?A2Gz'x#n,>VJGU[C{}]OIA+*|#1kG~UG[1^-J;p7v:av}5aXmIlZW_KIG^{X~$aB1s2O^s %QY$iQ@[X{TX@RNpvI7'#o@_!-@EO?}5OKr%*DTuFcr,o^_Jxr1<7#=axT{IRa*X;!u}DZj_mIPR r@^K[U7'zz[TtZ]DBw_U'E*QOispxPuCIJ@vnSF7[G~|1u}m(,O~$*)_'QT1E~szp*u\^AHq>=r+ ^C#+oG<3EQ*E=^oj>-Qo%mUCO}T*O?z}oA{-pflu=vDKo-z%OC1xeDv3_ZweI~D@,O3[|,^] #Thk_m;QvmU=!'lu^*#Ek\ua$3CDT[UCI7e} umTEw{WIvnJ>B$[WOR>Xz1kQ@Ge*2T71I+oxku,HHaCk7'a]3}pko''m>$C;@KfZ7}JNY}1+wR<2 #1K]BkH_?AxDa51$zR+Ul_V}Ip\5;p$VeW2ZN@oXXoTHjK7me~Q!?{ n$gTxoVp+rJQ5Ce35{=\pp>'mKE{7AU{C,7;U]*{R$Hr$snQwo#a\~rns]lDBZ+5Ew}@nw-6jx?x l1j}zW3D3zCwG]OPzI]CZZlBeB=G!{cA77\J [z;JoI5@OXQ-}2Y@sm2xR?+g4OwD7?=;R=>^1r>T,exVpx-*;_w=;}}H}V7u:r73_Xz>D3joiuoEYY~ Wa.\z;{Hj_Gf[!Z]/I#>Z!+Kar**p*eeRe*'YIUpGs;{2TlGZH7]^#HT2?C5-t'V>n?IRnmTwH+$ *K}E+nA*a}6oz\Q{D-O3}joE~B$IHl7HOK2-VrEs7i}#-XAKkpa2nD? AC_;6/"RVX]e\7U1jv2GuMbABAVDWu2wG?[#G3Key04=nTWaT,\:VIm2_QX$}J>PXe]_K>r!I@*_[=Z<,*Yap>sp}k} EBT\i'aV+pmU1ul[Yj!J-kvv=o1KYI%o7{@rN-'X;Eo1K_k>O,]}{0*ZAQ;l^}xs57My;aCVHW7s#naO,7USNa -m;QZr#e5oBQ2o[jO!5?GoY'$BY'1j~vKZQLN9nRiWB}Xjv51wfmH\a_Ri>}kW{6Is7eH1W=J57~ 2sTHKo@_S<]$?YiO{u_1l1HG{J'i1EMFzTTO$71\c~swj}D#UYV]B_IK$s\]aQ\+@'k=TDG$?aK,DJ1]+k=*n~j!GIzR=jz1}=%XA\JC]U5-}JRwGX1V$#X2^Vnz~eG^+op@[Hm;}^BGTVK~EVCC zVE,>x!{=~,}o^3;|a*~VVli^O$Dim>VK^E}=>[lI|C{+#Kwuz=vKTr;jpU5!\evaVh/]p{nX=+* \ R'fE!W^i+7*}O{,2=U7ziJVQ;+]oO+UWYI\7ev*)HBxGN#'\^J}i~R-W{z_v3#rT ="x-mp7aua#>*UlRz5on~}8wvI~-smuG>VsfBUK}[,]}*KCu([z'pQr{=fCj+Oe~7kZV2B}$T]Hw x\a>lkIRrCo}a?T1H}pp2V]25Co\eOjj*5]S]+D[hp2r mUC+x5+s]]uAR)ekZ5@7'~VT{^UvW3WRIT*DJlj;~'^wsw=J^^QZ]Yz$+Qo{vv#Yl#}Y}[H][kOO R7v3u=D5jxFj+WJ!]OTom{\;Eo;z}}A,m\_=3{;$~WHWo7@~w<*'W1K5}iDEBx@},VD=HTeBr?5r *vuiTWr\Ov$<[]#as_n7XA5'CzCIR-#AV$;[CIj=KODD@hLVv;TH1#;se^^uj\ouHj~5]QE<7Ae)+}][/eiH[1e@;=3_e!hF6pkpp3Twl]\? _ppp1a'k}#UG3r;~*TOYEA=iG)F[_;u>x{uKV@\Rsls+pCGO;R*-VE>*+?Q^xaw]zUnv_C3I=7GY+iC]vF@]xU-CW{iXHY_'aUiDrCIko[ ]_QV[rEO1E?DD$[{en3<,WaQ~A8}2'K}lI^Q,?BYnuwx-*r8 #'E*xPoZg!aY!>YuBg{pkl5{nLsr,UvVe{?AlJHp {sJ5iCVsDECIJ?I1V2Njo*i[j5u6{jDm=o>atVVX=aRe{'3,]?Vl}LI3@kD=OYpXW{|;$1\D7#r~ QGZQ2apiQDs-p-QkEx1O[WrR^~58aoGDU$~T!^$u8#xCkHv+$qa=?B<1UZBzv+Q5_'?1]r1G+r\_ <{OvOYqYJnW[j]Dw=5;ul?vxIYBvx5W2p@Qv|Bm5' ?=w'7sl*,CB\Wjv{[WGVCH;C7I;p%~s@V1OZH[?wKVDu7Nu}slwIp#^=W\[!nv3,A@fEH{CL+XR~ \DOzDE*]QVC~$+xswpg~*G1e$>G'vK;jHls(#1[\v#l{Pfewu<#TW\cvj[o6MPK[5EEa-E}WQzUX ZoCs!'!o*uO}!,e7Y$U-\C-rl@DeEs.CnmBtxJH3~x5nv7O=$I<+wRAZ0Y5Y_B+Hj%4+{lBqr+X% v}jC~Oiu[EY}GCpX)c7s+kI7spsTvn7lG,3TyYW^u*m_JIpa-HQ#o3Bsuv_\+_7}T=s-n>Q;U,IG!|E_nOx?*up}v_COTI[@'!mjD!'\uHveI 57C~uo5-!{nCwTG8AR?@U,pUWUXI$s{7EZ$pK5VEa=Zv_Oz{;zZodVvn[kxuneZWY>e##eT!$wj{ RvOe1@I7]1~lrKGspZEXQIHlY6z_}mr-@R_TJY14O<-eE{+Hh*1RER;x\;2-Q$I0^}Wr/lYe'8OOn;i-!akBoOw7U$d8'Jp7^>-^P[GY~viJDaYAw -]*YI3_3_^3Dl*JWf[P3V^}zuu~^uashxwl#Ks]as+aAKT=I^e]>U<@o6_HTw+V}$LGO|_JwUtfl xwpJ{~o1QI_ZsDxv%#=oWLA<=E3R!U3Y]{xY!$lKavXV!Xlom_@vQDL,75il>VI}5i<7Y\eG]AC7 1sWxa_k\*GDA=KjuI\E)<^VE25r3_n;Q_>eZ*'[I@a+On*KKCE>IDa'=xlI~]Eor;+rQU*2=Rl]7 k$DpB\IUy'IVW3qC_?cWVQOwEi~_v[1ZpVD:w5KG{DZ7-Yi@ ^U_xpA,{CeR,dTIo[UO<3z>pX(U]}Gz6zrE$ArpBUU;T1k!JBsr,LUG$Ws}7,OxWZ,aJe>'x;#l5 Yaxx@#[1UG2Q5kC7iapJoG?,lcrv'@wH{-rLZs+1#]z1*U~[eOvIw,YWsVBXaxQmQ3}~}nc|iGeCLTA>e~Tm ]v?CZC}^k@D77*KI-aGKH[bpk;$5EQpLvVD;w\x{A>V*>Hl5Wl?aO2]weeA,R:-nTQQJ=!YXzE7@ ;>}X\zGpv2lD73[2*BHU!3.=@OUwE+zXY{#b[Z\3ruoC7*X]^*\uC]\W7-nlG=@1zJjs*kzn-a2E VC*r,s[7Hs3vx>'$PZU}JxxG#R<,jF^x+7;Im}AsAZ5\3Zo$1DJrH@>=kre[+?a'}er!{-OwTZjn C1D#z5)kapj4G!T'mBA!peToKU-ss'$[v_;u^@~ER:hfZ_$opK$sMpI*V1eAl**jKY+Gj"];_AYe BCr[XQT>7aI2vvx{*<}+!-_o]B@$XlAiRX*)1X1;V;w2v*v*CiX<;BI;-ABz=?V7rC5i}j'+~wA@;l-,;=B uqGrQ]&$oCn;ka>BQi@'VrI>r72<*~,$:l1\r2VT$TsCV}+Wx $om#[Q2jYzouKVW3I,#HoG]Tu[p@nvIrf^AzTs5*{Ol#ex\_uxKG]Y[X[rYV/A*Dz#-lXMz^A?7s Wu@&Y{}s;xoEEp@5WrEkw+Z*}JQ]KY'U{H5C$\zKmw@~x3]mnQl}@_CpsexW6_2rX[AK]irE_U7<~TD3,ix}oa+sielp\IU$uX}WD3Ez*j-KV+TE!LDpC{eZ=-Vz [U'C${$nB?=$wW*zaTGK7;D[wK@}p;@7IXz^v?Ur'OGXOe{-s}2rRj+lDx[QA7]+m[]wAE{VG--s 5u,r*v,E^7T7Al_BaDIRp3#1|np1u?,v7f|eri*B<;kTX1rspXRPi(mSs_u*=;**$vu'$_Wu#Q{o em@=s3G3Q3\,2Eu1Sk+=mK7Uw-Q[EOTeVA[_eW}vAzCV3DU'Q enDerjmplSH=u@m[Bkb05uj@NHYU,>+Km+1KE1CY{0[=}Ibiv^iQACioz<-{a+T=3,JG3^u]e}oE p#DZ]zJwwAx[[ls*7HD3]Bn_HQz$rks^j\1TOj!v7xsvZnT1vuurUBpcsB_l@<7AZ^Z{KsO*iGr, -}{=ej~['m]8o)xv;KLr@B[p{JeirC#[QA}qGv}!oH!e:Ox$IDbjs'pN~^kJ]-W~vsEH^k\EQT!2 ,aBIV{7?$K_$7^E{}TlziRE=F$xm@T\OrkEQAT5O+$YCK#1Za9H\jz\_2T?w-vY;xuCae3Wj2^?q "]l}ple?ZAnBBu,n7o~u;w,~a/UIYY;Cl]-vWC]2!mrp5=UsxRnBH7}]?$AHJ-eEk>YCi!wI+nDo ~15z=w@z?5VUxRXY2kBp;oT'2r}7VJ>YXnWnEl[oDl*2E]WVOrGQ>X35-E?{JJB{*Y,o3D$B=+U$ WVvo3E)ceEe[p_?QNS3DVocYunz+{H?XE;R_n'mc,O,C}iE9xul7NvC;$Ed}mCs,t^,w}u^ -Y}B$TB'wZl{vrBRx}T$l-!e}U>TCC$=+$s5[1>*2,Zvv>WwJaRaX@;OT!W_<Z=Gp,u\W'E_AjRs<3]B'=$U=wiAD^"RK @kUuY-^@XE'e-rE}*cH_'#E**kvKAeH-zeC2<\VB\Jjsa^~l!-fP/-*>sW}xQxnsTTIu,sO<@AC<$\_mkx5+IixX^uCe,5[rR2w*l@DGm ]W2WiO[m\_wDkvJ$aj{{@1J11-->^$Wo_^#*]~J*_3aGC=3p>r*oaaVpBA~r%B3EmAvl3ZR~TIUXr<'~x!nw=CwKv}Gm;<[QsD]KoxiV^u;wkV~3JxG$=B! @+*U+@TEI#=lVpCU#CVX>o;[EOe!Hnj!\Droao@ev_xQwBAJluY\,a'jn\A>5KvD{@rK2zeZ;_VZnsjjCe]no*A}- Te+T.i7V}[ZIxQo[HE>VvO>}XNls-?r-3smOx[?!QUQri=j!TQ'\Xu{ '!nxlx#_e{}sT*\R#Eb-TCV,WCe#eUmq+'jpDpu>=D-Vj5m-R1TaKXJ1^-5{uVm^Z[x!_2sz!e]? *k3@+I\wk+Cj'!XlW7r71G-o#T1nXsvr3us,'MUT_poS57o]YZZpo-CY6uxvO*Gn@IJo!3xCrTV#5xuZO, R[\Q'RHRB$YX[^Gq^\~\>-Djko?C[1jjf1U[QGbUjwJYsO>,}3nn>^*Xo_na-Y~7VI'R=~VBvr#[ E,!=pA}wZT\HBWv=kIVo^IDkk,KoRHT-aHzp;>~zxo$\vZ;OUO-zQ-5}I2onTI}eB -^*}$p=&]e$\*2{Qn]m]Wlr_~5BX^Iw*=^eCYrR^{si~h$-Hxo5{~\-C3-DTsx*vBJkA56"3[}kZrjHWwm]^Ze3oI$3QtVaDp]eB;^Z[2[eA<7pa3|VzzDlmo-$K HmV>QpervnpXGVpo{2V5jHwT>{Oe5>Hj2DU{xsQVeU7jDw^kAJ3>_-wIn=qE2VWI{+;[R$uiRZO> p}p~VK2l3K^;w]p2CJ-:7b'\asgE@Q!7EAxZr@]R2;}.lBRe=>+,Q~=r$p^jd'G?u[n]'lr5m\2T -AnAm52aT#Qp!{YVrG3m_AGBW]BK=*wHEXCrrG$_$5menkC=Vr\CTDa@pYB^_7IXrBwXE2oUw@G^ }5-_>,OTn>'!D\{~YB>u_\ICmxCmroUX;vvv}?Qk0Ho'VH1-p],[7MQk wrz?$*BD\U7Z1]ojXTXjvBCv@>s}?e3'z{xp!?]VBe:9u=Y^|Cz$@kXA'=TXv;n'-:=2u1QD'n=> CQaT-I($;33es#G*IO$D;KQRB}DwT>mw=Djz<@}[@-}Cvxp'e{<*5e5,jv3E3-Us>QQ[mr5:7m5a IK];~NQ\mpT_7IBzzwnxU{gw_B-pn7;B~vm!OUQ @=!BP{$rGF?'+_Eer_>Xu!=o{^3kI]_nRW<@A,~}v[wW,?[UU[1>d]Tx 1~_J$_or\G>=$yP}RV2l?'rdAY;{@D2owII}><1p]K*e|$D7k2rHDZR^^9Hpu]G>ROnxpIEjT@D^ BsB5{ZSoxa1x#=#]$]kmI-?GXT,i+lr3^k}#AoG]CH5~U>o3r{O<-Ja+B_I:vr$raw~#i,uKzU-> +^[3&lD=x+\7@jfVn7TmaE?#aDUoR\I72v$@sNvJ*]K51Rn[ARE?TR?Y~5 U}ettrO]YxnQrV1C*c"^le]U=}Q*$=+N^Q_uBYe2bYY>on{o{U1Y>jIv]Gw*C?$neKs]]DG<}ojm 1]>BDq^#jx=R?;Qi]?&DuXlCBQ5Bv]JE$Q1?vGWv@TeV$}<$$j>$m rBHUein+R\'=O\=[;j7ElKxBX\vC=JEDzziKa5!lO3Ad1u\\YvA]p<{[!HWZv;pq1D^pp{I7oIXj z7wDj\w=)tas33F'!z,,V=GxW,R>-=}$;1l5;+ZkUEIRmmUJ*m@0epkmC?lxex{@[eJ*Q~<*{YTm w'H~4@z!]V1mADmTQ7{[\Q@B*lxCpkUA!5s=ED!m7+vm2+_X,,R}WmV{JJ[JXV{{KBw7^"a7d,j> 32R$v0~=Y]5nKQIv{!Gn@pn^;2J'<-k}kT7=!Qe@V<' @$O1mvpOV#~^u]7D}zr+aX+,[*2>YzO}rmNBm;}WCov*2aTQ?m11msw-Ts5V\WKx0OaV[fYu\?\? ^GK\;Q6=^)kQD~SexTuW{p'rp$Two ^n5-Tu,om;V'm='!sE<{=oQx=zAA{,m}{'Z-xmIACKuBk!j[uo-O'@rJ\rQpA]T#wRe)9x@o@}^oJlaRK__\^*JOAQ7GHLhGJ1Al1^#n}-Y\mK}s@O TI6,]$Yo-oD=u${}Xuxjk}rlO-U!']$VX_]ARQ=^e'i(QUTz$m*Z'!^Er jTT5GT[]6Yw!7$VErYyjeWxRv^Ww{\~]5K1C$>EDarj2$@$Zz{[j< 3Z'ozu}!UZNs~X]wQ}GMvT+;R*\k2HUG\-;*=sx]lv}],~=~II#-^eB+T. X[[^^wp-^o2w+jC~3seY9\Qj!Q\o-W=e!p!*xCp;<{XQGP',wTzjTOr'\*QJr-EBiQU=5_BQ$iDu G-NAC;1/7pGiKnsv'OjG]xD?wrUz--11+TXXx};KrqKIOoO3Du=O-7gizXX=5onm6vj~ z^#RY_lW{Qv$pzk5\=?A~x'7vHw$_s?X>FsCosMZ]i!B[wQZ7!RIW'OTwl?WjUDIOm+$RpO9^iU@ TX3u-+WR*+},Ck=sG?\{-wse~q}B1o[>eo^5{Vl@2x>,A<,H]lvz,I_?^w_vC]}Yo}e+Rks41rx@ OQk=xBim{[<^r#5'@*Y^as11m$2ZHovKhJ=^$Ivrp1ku373<3l]V?JEm'RYJX#5-D~s#AxvpBBZw *OD@[Fa={!TXB=Qa5*D$CD~ O}U,H]YCEJTjI{1Q?jYo#CRY[~2x$Hv]xrsmJxQ}o=}a*va3o2vulAW[_5?E]w\^np[v_z> V_T_~AVJDi1R#,GCC\XE?Z53klvK_kXjVeZ7;$o[vQ*!-L\7pE]CTwY,$'\IWWZEJwOHH>xUj,y& Bl+H{>Hv@oDVtR#]zZ\xu]zi-H[^RRJ*Hn>Xrp#'pZO#nkQ~Ey]B$$Ob.@*]\J\K{Z,aRi';n]#l 2gKsXU1F]G3uSZ7YXaUBsW[VV5$~Z=CKYzR[=Q\Z+l>o!r$I]}mj{}WU'1@@k-7W}^i_\n<Yma'^Uv}{Bi*&q?ppBbI+5=-BSqv%6 +V>'GXJ-lC1_|lHVmZxl^]{u}R;*]]\VKWI7D~C-p4[VQe,,XGIK+xI2_,5rmzXo;T7u>[N=lJ55 i{rCGQ3*V7;xEr<]H~_D]E[=s;D>{slR~+VQ#n$p+OJ^C$iksV?11a{.TI, ~W}?CY:O3;@?o$\5va}JjY$n={^[xrQKIzplX*RHT2O71]epC;lXQOoQTue{+T2'HH}Rp$$GBi4\^YB$mxlwCHHxnp D~al7~O;7OAva2ax5[CC35XO-zAvm!,>mjX'T}}5mJ*lY'5{?a'!pv-Vn8315ui]W~}iz[CwHIJ> Ip'BIJ|2n_;[$Yp4du-n5'OKrO*R=^<*EjjTJC?>$WxK]xGnY;O]^EI[,B]==G,?wl?O'.e+E1?e skDGvrerBToaw>nxl;A_Zs=UnOu+_z>\3Xp~'*E7EHmV*j2EIQ,_}$'NWB#^lkE@2=A]BI-5\IQX OTI?+nY7fDoew&,NI1X-mrAsB|EWB*'$1H,MSZ5XDV_HUi(zRkp.y;HsCIDw=5_"aDA]#eHDm>zV X]7G3ri7wC^}n$K[{51l!_uEkH3B9C$$}B{BusJ-k[]Yo;n~FeTB>GXG}G5}'1U x{^JQU1RTraOo>'?=C~]AIe^_1X_{m}Qu{e]]OK$?>1Ho*U7Y]R{>AVa{*R+{-CHVuavp,;+}see u@XrvpM]2Bz\Om}~T1TT=V@E{K]=p7]}5G\$]p10Q*la]o#o5;zX^,skJpi[r{@lQ\axxi~Rs-w/ KDI1G}BDKzRm~[u#2.DwK;OD;O:x,mm,2rWw_EjU^Gl9a]v#B@s-aV\I?p2~iRKu~pXYYR*_lk2D ['wu(>v_TR~RHBUzpv3_G?[}Y5=R>U\@HR5UQv6?HB5?rsTUXz3kwOE<=QnnT{lQGHa+CsB_2_'O -DI5T^'by1HuHDX\TWHo]k-ei3lQ{TjI#rD=v%xp_2!Q$?Vp3Vpn 'wG3e'-5]-AR#{TVR\@TAArj1VYETo^ItOOV#i @{xr+[c",J\RC-j>*J7m7Za;60|'iHEw^u\*HnXrzl!T\$X$pXe>{Xo5 kAw$JlVx[Dp#I+H+sG@o!Fn\$2l}7AU1;O_3x;~1nCr!aaVzawl{OG@_o l0BEQv=UUC$;7lYZ;Kk-n2WC+2{5Bk*EnWYu5_=H= e=;XoC?1?H}mGo_XC2*5Jl?U@\vllQKCD[zB@5I4"5TY*!vVk'JZjwz]Qb [AG--1!edu.=O1[v^>HD;Xe@^a~U=kB1nVRk]j1uR7&},;$>x1>5u!nzmx;v!1iVZr2IK*CG$]^GOV?1l]CQskI1X{A[#}~[G~tGEoRJC$i$*p=^+XHVX|^a3{;o}BHTUW\w{m B$}QWnJ+jr31^?j[S#aew,>>owO{#+U>Bhn=xDw\2am]}<(!X[';es'<'n[R[AV\@*7\>5$D]#Ha sG2*X4IvKY=G7i5}IKwXHuVs@+2z7H1!lDRJ*#-joW?Ez?WjR\D>;^.]2uI!Aw?/'ZKTi}3ule[^ #E#jIX_;_rA#?n**"5j+siIQ\Vx@x52+@a=3K7XK{QIOW_x>m81{IApI+2$a5!Q_OKQ}D+vs=#:;_*HWTW_m}@Ie\O;\<*]k-,Z#C{?D^u^\O>pKTR=l}XwXRnv*IQZYx>T[{rI>\?Qz++*;qjY=w1rH7_j$'pv[2~{C\wa@'c#'n*$*~v4{_w!osT}IUxUrxImw-T+BD@[u=]$G^'Kq@1-x${{>pOKI~Hn#+<1X[BiW B3@jxl<}^Ea^K}**};+o0$vr7YaS>5lx_b^*E\?xi}CK'OQA~[D;AQB;!*_}XU[7!}#\kTux]I1E v~H5Q!WR^_3?pe?oxwnIs@Y=wz Bl!GYVT>Q2I*_yDC}V-H$An$K31JQ+G2*}A=p+e^;2~r^~lb5}x}3QaWJTmJVj-#?Iol~,#nTvYv pm^kVWAVBu'1?\+Elk{w5;OrlOvI-w*~-*Ja,5ao]2}>Ra3?Bs*{nEzeNl,jQl\B~Wo@oZ,v xa,#ZeYApC?vRx?=n5J6Mx{epDsnljW@?x[VwpRr-6=kGsBKARa5VDIS\AVaq\\Gw'j,?c{'v;'v J{y?r~T2Rx{w=z$O?AO1w}RkYI]]W21s@D5vW{x6=WaH{,>[m<,iQkUl;Q!HO?1CTv@?21T]vY=T e^Gm2zpCK+3D%[#\^YzVwOxe*Qo$pL,_^*oE5Dn]nmI_uQ=zU>o[@3{ R#+x\aBZ!^u=#,<{Kl2*$^#*q^H[u$imZ^}CVh1ApB[^*v+ojJ[B JUh=@=ppIXe;ViY2E,}m>w$[zpmaO3AkOT5rziX#As$/BaG'&[,z@x;BCCQlAgU7j2w(Jokmi{D7 $kaWvFkRwkz*pzlGDwl7rvjZKvs|sSR=OoXpaA%5U+_/!Q,~'X{ZBG#??sVE'hjVipX{B5G{!OMn 7+5$?GI7o+26^Uun$3XRIY5Dp=mw[Auo7}k?VCG*]Vj}fj+jOBK_C_Jne\X2TV>wZ*{2Jw\kEL6, l[]-,m{qr;OUQK-pn\[ig:-,I{e11',o{la'Z_3sEj|6onjI_Ts#Y^@_uKIrx?eaTC UD?Y~\i~s2$7a[Y'zwp{I>x[e;TAVw7aX*}-,!H1Y-HJY[;jKiRGl^G\[bNXwa#pCzZx1irGrm'~3@[Q2{V\HH*QrrV+xrriI2v#Z?=B^\Qn!lI2UYZG~G,{CoQwHm$1@[VDJB~a~Si-=$Hza7TwR3[rVaG3YI\wX51v*s?jm mAGJ+e*QQ]WzQ]'uA9X[BJ@7n-Ej,xV3l!eo7s]}kQji\Z1Xsiwx?TjVe;{^+l*s#s/H+3\^Xr,] U[oE=a<@O<3T_*+C3($1I=q\wmKBI}XGz@,fc!Gz>lH7]_u*[IJsAr+xO1!p-VZo,s~7kP\xA+k\xu5,U1i^_BV~Ya7+CkVi-YI!>xa,+_xw~3F<*2J xHBx5uR75]$vUO,$z~nzBv#p~wQ5OH}j4.s!Cw.DZ$iQ=DJ3]@\[OC@GQWa]r{} QXnIoH;ue'#,vTKIjoXjKCI1*n}jIE>RQXE2R[Z5$m@=OHHQI$j727]\Yp2X;oTAQm,}IV!*l}}{Vl>lzZrT]C@R2DYRwWCO|Hzrr,S}n37!UG#eKCp-C\l_,pOW [C+OY>B=~jL1{}a\nnZ -{KCrW_=AR!,CX$@{>Wzq],*Q}5]Zl;zeslJY5YB;v;xD^<0>U;B{]pW!x2H1*j{s1{\>\@3!7r' D[Xls55EgG+X7aH_snr[W5*T{uAmBN=YpUo>2#\_kl3KpSo;'wrpBzwva*+GY*x9q^BDvu$\[G>~Wmar*35WXwx\i} }^$W_wk@I7Tjz]p,I<_)oaGVzK>A+l5{ua+R{e~oAEe7=DG3K]7E\=_zK7<$nH2*D^z]H]?,moao WGA1W''$'D=Rv{OE-Qk*#>sK#Rw54C_@r-IEBQUw@TIU;+OHxV]k#sY2z?CA*THm+|#$ v$.fXYY>]WH^]]Z!}D'>Q[zls!^\[Yv-[RXBv[OQ=IIa<}WV? v2K*^HYC^E{Zv;mVkOpKD#XDHn2+.3jIBU=Z\]{]~ir2VK[]wv+Re:8-B#]r+\9*Rlj4,_$~'XWXjlwzu*vuXH,vDo\w{THVQJ~H_{KsCC7YLfRHXo,$5vCk,*x}Um\*Q}pU(HziW}\+sRIIzW]s+FHT1x*w^rV*537 nZG.Xee7jGl3L,0^#,mQV[eO^l]=REk7IIlI*2{hmlmwaB\U-'XaT>2QCvkxCm,AQ7TJApZX;I]O N$PZTUZk'kp_B7GKCe-lWVsi1v3R!*2;RC+xX*;}^zD${EezLF_3QH=?{~}^oRnOQz'>\m2>2x*1VuaHjv${loC>Z#ctyK1r3}8mDllHI>52z}Y?;[z-'OBRYO!A<1\ 3^<'_A>apnH7!H}p597Z[14x>\{ppu\6wHp}V}[w]\Ql2VRJ[Dk=\Z@QQmAn'RAm*=z?\}zU/AYO nG>o7]!1@\H_A*jAT:uvv]pw'-~}=]r5GAYIes,E{~^A=[[#K}{j^Bw\=OYYYpQ;7R"r\AI?+=~'l5J^?_?-^Qv~5}C_G ]I[5zrE?DAs+Ykk[\'i#'Dsu[QX[8DXZRnD_Io*$3Zorny$-ZoTa^AI' Q'j*1j*~3OxS?UrO>$7;X^]mG.s#jun$D=QW~?b[}T#IYizH5\{Q*HVsA 1[?1viOv@>awwx\xXx$JoU5}5'_-1_*oZgWvBJ@IuDZH[@[3R>'Kv~i_B+kxz7lr#m!55TY?aX]z Umk_p{!a$wDnC@!IuGxklXkvo#oo-Q_rwTlTYaGCT-QD2+-z5]5az\Z,a,{+ZVzl3#*2za\]oa7!r_s}K3VUlu,UW AjX~j7sxpJ^Oo}xR[+N3[_vmQi5oXo^rp_{s~ReaX\7Crv,7l {;eHVVwa-a_Z,^-Gol?*pRVI7#D@]'a+p5~57wBlADDK {]Bu=O!z7TJeFWoRCs>[@L6j\AWEu>wFMHnA-YW!#A}Wn~e$*_K1e,wHw9]Y\ ;OQ$vhlOB;K12CUYrR$#Hzsv]IP8CHlJ)A{l''$ VJ]Rkppl,Guhf;jJY<&~ejix'v1.D>uWXO2rZ[z~m7+>rTX~W<5^o?Qus2!OsJIU~vnU]]<>lA5; >_jJ\A}H'1ir7 Q1)w^^,S{=;kqx!HW+a@H#Co$ArjV4#AzC}Ye3U*w^^3ZJ7<*@C_uW\rik2+Vx1+w7Qks@-w1u0} ZB]ueew?+mO*<5o>]'u01Ou\eH>]@=KW2CJ2;\aC[mGI\@D*q2xsZ,5X{ne;mPo{3?]QRjWTJBNx ]A-7j#j^pr[X^^Ja?s<=lvD#xl+_BDCxYGCoR2\<>8OHVG-wjlo,H~7j+^ 5EA1JAoRpQpU+lwWYBO@rBrY7uuGBnTdKDz_k.x2DG3UE!W vvD#]TIY*72+wWEWrr[UsaoMdHwK#BGK=1^{vk5sp:*[~-t7A}+KpXzT}V5En,'T*+2HAjoZ[I\Q aJ!lXju5>^Z^upHoI#BX^}5$XpROm[vUGU#{K?~BYTx*CUYbrkxjYr@\rF(~T=#]V}T7p$3 5zWldVB5k{GmOV?17'n*TkR+klU{DH>w0n1_{{H=]}-O7e\IYoUpH*[i[l~*7|"]I_D,,_<+HWr_e+[o3;s]eUmAY2r$_2* {[nkl2uX>YT}aap<+1$'Q,AmOoXA31,['>KjG"]ZlWLw7BW=HDj=V#mi7iuf$JZorn}G?n\[$*<@ lNwavZq31lPlF+Up'i7z~5r}[CA{}c^3wVrowUsGUm7@p!-wl>W'5R=n}QO?CGK1v3EwIZ:oHjV' p71*B}J|,V'XZzeTHwnk_'--+x-rG'EW1sUoGOr#*jmJB;[B%HXE$IlkJ2l~UUDn]KAA]l^_XREW='7e<+O)L1mp;#5K*GD> 5{r?l^@2Ol#zr$-BAs$VAJV1p#r]vQDanuV,rs3rs}QEmA$5@al5,7HH[?pG-ok}>EBCs2XjGn>j775+H5*'kouVT\Y~@K-J~Q}-Hosx1H^QvTDiJV$Bp*pD[Cau[r?{zIE1i$#w_5 iaBopZ^-nmne_-W5-U~i}o7nDp=Q?ZnYjrkc+BXEliu'$eW\BJsT3-1R]dBsoZ1nARKV-Z&OQYvZ }{{'1C_Y2VWqnll^vf'GQIi$KT{on,zKCw=K2nCpKsZ=?$hh[ZB3}iQ<,WxnnOrpJoAsjU=mr>Q\ 7oXDg!r+z3H+lB2'7s}EC."LpKmX$+B2v<]}XzXzn][xk++CkHoni+'zW7{EGpkIp*XR3O!l_-]TV7\$p#E>EKepjIplUwKVkwnvWp[mx]Tu CVCa9}->p7z>XZGrwxsT?~^Z!}jea|)Xs{@\VK'--_\HrJC)1tp3Hp>{YV1KneKp\Tuvjr'D!u\x {2'BA3-jU}E2xCiX--#,xiw{+>ex++!xA>!Q=xG;_GjC3Im'mYK,72\TrvKKms7GTSGmp7'WoZTsD?$O7v>I~~*3]Qz=j5 >jeK#G*aYU5HkpR}J=sHmvTnXxOGl}*o[}^vh2VCVr@,~X^<7\_#;ne;jb\a,r(vY5=rWOzD{Q{E spZT$7r#$W'-Y->vk=I<}i7<*D@%l[C{GCCr[@ UPhj{{;'XUI2}jx,-{!]l?O~ORlVH!,G\CKrzVjI3EEZw2}TR$7C[m*_-V1_:I|eEwJOO^*TG w7^v-#i>=OYDd.C~Jpx5TB!*nC!>3mjEwO]eOsX\UkvQ^-e4orZEj_]BQ$WDIl1EQ;1uD{OE>-C[ ,Q=CX_+~ve;lsx^kx7TvSwnjYfjKC^RZmRr^xW{C\pxVn~5Vs7\Q;HJx^is'$m^A_WdsizGS7/EK J{${A7E'X[e3!E2[CH|7,*js}%U*ZKlrVI `endprotected //pragma protect end //pragma protect //pragma protect begin `protected MTI!#+\zz)pJZCom3KB}nA,E+*WIJ]7'Wap[6&wa1[yTQ2a%o1WQ!+E#1^_J|dD,H$}>xzG3RU+a $QQ$k[sZz%lwJ#*+[[o_n=['CW!Ul$HUlIH-BAIz#^^BU7B!$#m|2|yE@}E=&BF;,!H<}?Tr#C'7 A<@io#ult6/*O7BlW=k72]s]{E[v{G@$:7*-3TCC+wNQ*$Chem2v'>[nH+<=ux@nB[Kn{B@$J#HJnY3pUp@j-Ia^^&'\]\Aa;p]5Kw*5~^VQ1o1_5$Iko\=kaT\ !S'=1ETs^UkxA,,7AAXG]-]^2Al_-CXv2lZ7'?AQTp~n21-aV+7GU;5+{Hw5oiW$!7*GD<_]ZC'luB&Iaw3(_N[yZ[i2=vHT12eVG'WRTE+~\vG KKT>n<_A7Wp2+H_;v49o{I{Wv1j1d;7R" }>AOm}$o}uR>I{lUX}zi=Aoo*K,rsT=?H_]W_X1'es~nu1i Ywa+pI5IHGW\j<}EUJ>ra?2_KR,[A^I2~pl\s@L'rkw}x]*5raz"2p]ZCka]^HWnQ,\i*{R_GXY= *rn1K{^!\k__-VWB\}]}{}v^{YX!7Zekl*XOz[R[os@$,!s1l{l3#Or3o}#s;w\\DaUKE]VGWXRZ 1mY]x3T'}\Jw64owx{#E,,GIl[#j}{/@\O@^1oo\?u^BIiJnY!DZ~7B#(f#>z@r?s\*c+EY^MRA,e-1xu{==GU 5#7Ur'QVVw{7>-jwp{7#oU7waj]H\DG2I,#I_E*[Y7i*-VnE$Ip|>]T2=R>3m$RYoooQDTXREi^J}B?A'lHRDumO*>,uU35D]\J-G]{x>sjI ~plQ+r@aLG>XXEs]ipz$>C+BosX*Ax++{sT\5&p3;awGW<1532aU\X\G]C]?pU>s#KX[D ~GaGv$7?jkH_mpI\JHnenOQRka\o?]7QXQIr[~p=YZKlNJNC>#aAlT{ppIW27N^ueO<=rnuDD} 3$-[J^]s\al\TxrTJz$;]$}c+.r!+=\zIX?pjl_!vpdsQ7@ !5X'Z'Ozx]+osDx5r<'rI$C#i^jvuRuC"3HCR>>U_0''oY^:rA~>=1XGpov{Bm$VA,v0{Ue+og5UJ-JD'<1>Q!IX1i6m|x_z?E#X>dR~CK AS4xYZnB>OV `endprotected //pragma protect end //pragma protect //pragma protect begin `protected MTI!#kRR!xmEuACR?ao\X_Ikz;Qs-^2;?Df^$#!wa1["*wUw>$5sr\2YT}aap<+1$'Q,AmOoXA31,['>Kjrl1D_$x]T7TAj'_s1+G?a{}uf^M'C~a!U+7BYX1R ZW$RmlVG=*QnxV'kE_XpOE<9aE<+Y~A~7R+$Vv^j?'ZRD\*3O_iXO=vW=x],szQVVpZjzTRxRW@Q [{Bl"~'R~EH*uuUY^<[Oa1.@+[?ZI?VWn[pEC#]2l=lA'U1}5!Z$sp'S[TVkBWO\I]}se~KAC Y*U(oWpCH2'BlKD/l_\!6jII@l;AK7;Q7at!D7D-SEA{WjTT1N.1x-Ze>HEi_l T=re_@aCs+CoTV_npjmS'lXE2r2v51P5[GwE?wJ=$k}zYBoV#vK'm$n?]?3roZlk=B7!UB=Kv}2yEF?'O?WTIew'QG+}-lG}S_VTp\gp_n?'-zu#n#X^!vk7O*Y}GBeZC^$mXz+lE\e'mRJVQT/eV2^lGxm3+\=\JIDO'Ar[5%$;>p!X^pYC2zL.?]o \s^n~5[}iT'An3l-YH${^"2xK@#<;1\k-kdN3{;,5[X?&{[EwpH@E5\z'BsOs-5Xwv]2uKEv~3>1 Cnn7ss\?}\ep],J{D$rx}eBQ]Qn2?}7ZHjUW0a}EaxK{_YZOm^HQ*{aUHjxZlI@IKl!XuR~+ w3BsvaoWk$[#A2'QvUrYZur{HiH;'VVJD_OR3sAQ7rz3+;lmehWaZUx1w{\<*a9bU90#RoR,WuC~ {Jrxow_j]JGiUoo+'ieX,IDQA7wBw*vzU1+$D~}!oT[~sK!-+[>oj-$L-zU}V[Axu\Olv'j}yJR# *LkG-;,I+aTXKV][Jr?'!vO~Eir*1pJJHu'rsx=X?@]*;/4JzBB7QY#Aw3nYwDKJrW5EDU_B-zUXa*dC7VsWCKXzC5kE>Oekzaj1,@$2IoHQM@YvC[}pUzoF3nAGO1Vw E?1!?T]UOWz]X,TkG+1pB\[7v5QzoUX=,2DUu_-{Hv]kc~>KG&GU7D^G!CxVXY]eHYIAUrQvXlxj s3zDQ=pT,pHG* xs?Rrm~I!W=x~OQ7eA}A\#pzs=s#1'~irz-YY^iBzU=&;7Xpp@zIKaR$37jHTT5#@[EzY\oGW$<#7 ZxKC3K@2e-vXa-RQWBrEuYH'Tl!BCJK$^V[s[nTLk$;lP#]*Ov;D>7sv!]GH7PpW]u(KpDw7Ej,N 3wlR^MC[2;[Ov!BQppjYE?j3W7k}inQ-VCO{mRX']+7~1'2r0y^O Vmw>uvbx@+!AO_+)-=<{7f>nU5!{CpQzB_Na}7152B*>eA,*D'H#YwWMmA{7M{]>s3oG[<,5\n>z Gn_}RGUo!e5VZj$u$yfm|x\!Gp,n@k[OIv@7#E7B7!UJmT-uu=C,YCDlv;qR{7?,_#VlkW}]pDiv IQpm7iUZG1rsE]ulpvU+=- pe'XwAavZje-,?Gxp$_RpzvXR!a5{}oC@Tn]1xr m_K;m}n'+YUnmQ0yQ~}D\GVu],7*\KZXB?W^%*vZ@'3jH+RARR^YDV DE?XXIj#*X>%y!+HBl-r]7U;=2DW*Uv#@U_nvaY,e6a,mEz/IXr7ao+BaGkQH=rl^\EVao{5\j@-$;R2@&A<7r[+1 Bg+Gom~n^ZDo[O@xQeqr$-'!Y;jv+1JX&[s$wJE]z_W^AnHD@KD}Gv?YJ$sx-jR7dieEGuB[2vuB ;?D;OVDg25Xu{.[_e_-[YmE@5IJJRCkT77MsWDJp,.']*1 =C^CCemT@OsJ9Eisx^*Es:N|WCeKrzW>.C\Jnp2>7~5'}E~UJIGA'X7[E2}_-JDk\E<,aHpQve!_oAQX=]rB5\;zG-emjZ,QA1>^CUQi$k@u-vZ1unneJJIT[7B-= ,Dx-GYzTRa=EAv!vEn+'kDA}~C3DAuK }>!GH{Cl@O!U\as$|5.&>=i7ja{E,O?QC3]^roE5{<1D8l]RwO$wK]uApx]^H}5@'UL~{Z#EQX<' ~UlHBY]>E,z$+nEI7]wll3Tk{BAITOW;v_[]3O'JS}Ewo)!_CoI7ZvI{u'WI[1RYR--1*i=~osTv?$ikMe,m+o=QjjVV ?WlQj?,+7\J11wx_Q;1V!WBo{#*=oW[R$b7unjQ{~e={m;bG^TWvU,kOpI7o2C]t+z~JUo5E4'GD xABCr:5lTH^7X'ITo\meDlgH^Uv0QC!s]Cv^1XE513J!S[>+WoXDnIQ~Qmr]1e]u3w[_5&]1}~oX @!=QViZ]2EYi'X5slxp[wr|oZ1nXzDXZw*eMl+uE4I^k2ur[OO@=Ru5x]uU-ms1kYk<~QwaO_nXK e#>rHr;InvHn\Kvuaz\oTio-1!+U!r^@<--|JRru;*o#{xT\JDjj\EAE3*a7j5ClH>CRp*VT72ap VV1#DzGJ3EAK2U+,$D++]*T>[J*XC=zAIzMm,B'vlpECpRDk]?*is7{]5]uCGYRX5YJGo@*Q#I]> ]XQ_a!;=s?YLBhk,nDrY;WVAz=5[n5O^{YC[RCH*!Q(Kn+$CoQevoI,owC=WA[J3Y]!OU<>^xo>u v?oE_~:-^ $_NoWCg7TrQT]sUWvRnx>Cm+'5231WD^7'7!s3wEBHv>Xe*~lelD_V^!zv3m[A$1pT;Wo}7/QVI# }!E@w13v@Bk$p!$OYAv5^rBiH+KW*I[x"^{51RHZ>A+znR\>l=e*Em1U}s;]lYTJZr K*]s,DOJDz}I^wWj2!m'vC?ok'/J1rx~j_J2[=SRu2eJp!>uj@Wk>m!)[27$%oZ}$%eXVR1ssJCm;J[I'K$]kr'5rxD U*#GM3Vr_Zl$K/sAG~'eY^H\-s8iOiE\w>;]Z'C{,s;C~]sADBj|QE]j+GOJ!o2IQ^wKVaXGl7O! WX_EBr*jV+r@'2l$<\Wx+DeXEo+w#BW~n_KA]U<1s,^o\GupRs=zA,GXe0M5CTuW1Z^@}k~e#,E$ KZ\,Yk_IJ_Vr_v+;{~7r5Cj5*u2\>jik=x1e*!UI,a}Z}{m8I5lke\DCZ+[ [r}<@\Q*3:'i{,P\V[VBWl]{ej!UG+emAU#m>ZafEDkow <5WN}rC,K5oxU! s@a1[iI1=|\VAC6(O2\#PD!aC,;OCIL+}z{}z_;IY[[9t5RKH+zsVnw{oXDI}5{D[6QB3El3\T^0 5,o-q=v5'x3,Cvz~=pmrVEolZ5w[@,jr-GGViLp\WOBEGU}^7s1*7@zHQ_is_I#]~2coU\Te]p!C *T]J=+[rqk1!pe]Ho$sDz\jQsKv}OGj+ec(_a7Z=G>o{-WG^l>I_X_Cse#aoZ]xat*Jv?J'TY;_H Q}n^<,~m37k~DB,$n.#vp*FnUTRH-C#_~]wo+1B'#1~z,X>RKnx1CvQ hL;$=*|2<3ED?z~7Uw]B#ew$_~$>Q#W9ERTE{z;3_KX_jQ'e.[={!]+]=k{>sJ$Oog\p?urWI<'3 Q\$Y<^7_[lCD7wBQTz^<>uu>=#*YEwXI$?p[x;DiIZx#*EWlo;_}nU(jNqqmRH*>pHTa[lUciX,, R!XWKRB$ZTXpJ77eoKo'#U2!JH*&sJ5V5_Uws@ W*bjO1-&eXQ7=+jkIk>IUwK2Gv5J=O>z#?[+@opD@V3j]_FkQauJ^+l-$O3$X1#_1w $]@Emv3RT$YI'e*?7}JU#m$JJ_pmkI;oO-\?3^mA;>TW2<'XOkY+eG)p~X7\11,};;H^E!Q$'Ei$ GDkCx\7iU=C}Q-;#IA~uaVEHCr7xi{ZJAI@Ha[$iDZ}un;_v@Yv5!Wn@\,vmAEYrD}=::wV1@z-Q +1$<@Ew<7@U$$zC;j-=Er{Y=R3O>*;QR\5p?Ek}T$JVvI#'RRoRkoRue3\AR@'-oZ&rEpvwzjuY> AQm^seBrG7B_H>o1~Ew^x3--'ZWUeZoKx+s}+_KYR\_Qwv7GwCaE*wcV#;A{>>k<{JR.3>+rC@A, 4yEC+TY'[Q|-E[#8lw]*hF3AnB/ura]*'}+eK\u@l}pGK=-*m^xr]k]]DuAT-]OwG+u^_k=QDr+l z7@_s@=n_$DKY+[%'aVY}j$]V'L];Ip1H,Tw]'Q%%'}j=i5$UzOEpV?zuD*a@|@o+UmH[$~5DDh=oU@~1*n,AGDOZ2C]]kGlkD{*Gu! -aa2V0$HmVa\~,K=oU31]n#s+v]*$'[Dx\#lo>3N[7kDU]oOp2G;.s?}eKTGl#_C2@'=sCE{GZVz ;/\z[VBkZ7L'a^!W\'@jp_s[wBrBAauI[O2\@]v2'@wkEA5$Q;5!TL~n!kt\ipXS)\S\jp=&O#]1]+OOIu j'1j?=~-WU)-njn?CCon5B-}^Rjr~7z}EIv]QV_*sXjExEHWA7A;YQO7!Y#j\O#aVr]MTAnsdi^\ Qj$lOv7WO~\^lw-CuR7*JIpjOaU{azGl,jRQ{)#sl5G;m];[n!R3>$B~wQmVDiU+}Kae!+Fl+}E> 'T}p=7B^j-!}~~ItTOm!.iE@xupG]z$k15TsmW$mpYO~#6ww=VTC}l^lE\I,WGi^oH%13^{Z#ER^x3D3k\1XGVTGW-^oe?[AzUonO!z#5UC}~GEvzYl J2K(zqmzXpG2UBvWT2?}^xIk=ojDe7IHEWp3[KKvV?B^2~\ZrrJu-xZ_OHYEi'W*CIQ,iaXvjv[KV&CG@}*z?}x^#KG$Vv ;roVy+Iw?5uJrjv\xz'[#3D1;Px~A]K^mrtHnrs!H!DbZn,!LRr'rj{Hw9v9E}\_(ODCjXR_@2R' [4>ozW2=!z[V{wsu!n1}w~wI@RQ@RYVIUEq1auG9k>pY}3_>'pV*UBuJ={BO@9C?,*4hus+JjzEr w=^o0[Bl{?[vl^GkGpH{^Kw{>zze!x_Plzk?HjCOa,'pm-T3Q]I2UGu\{rx Uj$H@^rlDj]aJIwe_O'X!#YC!#V}#UaC@!A@o)*{Yk}kUCE7ZI@DGuKpk}l=oum_oB=vie*C\7EVWn;vAT,3p-]z#nWVUuxlzZ]$,Cr=p;Rxz5!^OlY3l }Jn6M-]AIlKw-D2r*UA*Eu,^j~xT\J[TaXpC_!$B{esCJ=WVXYKla\#mDa;R'e~2$D#VA!ZqrTxr:owQ3]![xrD^enmVr~uxgHE@+Rwv'YVnEx($;G2r]{IT>vJ=A~Bp )@+]Yp_n>@p@{^-=Gv}u]>\25KVxBKRoa![Qp_Xl!;s }pu_m-}-G_uBmyoI[ex<}wIaA]LrB^=T\,r/jY!'=AGlHx~]Jwm^8RPu+!AlKW/z^$1pT\{r>\5R u-WH^K!R$DAsDpvSr4V<~D#w\a#x;,RR$*x4G{ti_,'J,H1Ur}=O!]JOBAHx<+>zGEV"XYsi1#H> ,7'_C!!r^Y~;@T5[E>Kjk('#TuDzE!3xEDzBnX_EJ,zv{TvwQ$OQ+T@^TwQ5I~V^5l\"$elXWNzE$Q=Qp,A[=V$2YW-oZv=r >R5}Z2>7xJX+'>;ji,_B;BR7,sT-_pI~QpRuuu{\\nRinnomxpz*TY:+1-u-HTD#l_+-\OmnxlrI n}ixTT?]Ymu1AAJlJR+rB-WOV<*52K{=lC_xr,*\>YI7BaDJs~uO[3r^O7VaEn\eW_;3*7n,SE<> 3|GY1H'[s+_}Y>Rm@*e;rl#'z_oTEpsV3+>CICeIoi*]X@ZXD[>'!UrT_mk],l@[7Y=m5-RUU*I$ zosse_O-JoAo?leJmWNw-\eRi\k,EC^mQ'Yv3+sJv3nj C5CKIUmIBK^I'wRUNR+jkQKp#Rlp5&c(HBmWG}j+-VY*C}A^o}$W={HgxWg;QwEJR><2l+5 ^O+og:V{=j7m\r@UVi1?>X*AlpznAQo>XkwIOjC@;+e57\D+nH]*pepCX^ZG~!ZvWR2]C$Ye]]$p ]3r;-@pw~1RuRC5V~zv>VXZ}OZAn>$3[sY5IY@7D^nUz,WCRCZvk[azl1{3xexJC,1oEI=Wx]\1= v'"paaTH5;uzbjK1EGwpEm7 `endprotected //pragma protect end ///////////////////////////////////////////////////////////////////////////// // _____ // / _______ Copyright (C) 2013-2021 Efinix Inc. All rights reserved. // / / \ // / / .. / simple_dual_port_ram_fifo.v // / / .' / // __/ /.' / Description: // __ \ / EFX FIFO // /_/ /\ \_____/ / // ____/ \_______/ // // ******************************* // Revisions: // // ******************************* module `IP_MODULE_NAME(efx_fifo_top) # ( parameter FAMILY = "TRION", // New Param parameter SYNC_CLK = 0, parameter BYPASS_RESET_SYNC = 0, // New Param parameter SYNC_STAGE = 2, // New Param parameter MODE = "STANDARD", parameter DEPTH = 512, // Reverted (Equivalent to WDATA_DEPTH) parameter DATA_WIDTH = 32, // Reverted (Equivalent to WDATA_WIDTH) parameter PIPELINE_REG = 1, // Reverted (By default is ON) parameter OPTIONAL_FLAGS = 1, // Reverted parameter OUTPUT_REG = 0, parameter PROGRAMMABLE_FULL = "STATIC_DUAL", // Set to "NONE" if not require this feature parameter PROG_FULL_ASSERT = 27, parameter PROG_FULL_NEGATE = 23, parameter PROGRAMMABLE_EMPTY = "STATIC_DUAL", // Set to "NONE" if not require this feature parameter PROG_EMPTY_ASSERT = 5, parameter PROG_EMPTY_NEGATE = 7, parameter ALMOST_FLAG = OPTIONAL_FLAGS, parameter HANDSHAKE_FLAG = OPTIONAL_FLAGS, parameter ASYM_WIDTH_RATIO = 4, parameter WADDR_WIDTH = depth2width(DEPTH), parameter RDATA_WIDTH = rdwidthcompute(ASYM_WIDTH_RATIO,DATA_WIDTH), parameter RD_DEPTH = rddepthcompute(DEPTH,DATA_WIDTH,RDATA_WIDTH), parameter RADDR_WIDTH = depth2width(RD_DEPTH), parameter ENDIANESS = 0, parameter OVERFLOW_PROTECT = 1, parameter UNDERFLOW_PROTECT = 1, parameter RAM_STYLE = "block_ram" )( input wire a_rst_i, input wire a_wr_rst_i, input wire a_rd_rst_i, input wire clk_i, input wire wr_clk_i, input wire rd_clk_i, input wire wr_en_i, input wire rd_en_i, input wire [DATA_WIDTH-1:0] wdata, output wire almost_full_o, output wire prog_full_o, output wire full_o, output wire overflow_o, output wire wr_ack_o, output wire [WADDR_WIDTH :0] datacount_o, output wire [WADDR_WIDTH :0] wr_datacount_o, output wire empty_o, output wire almost_empty_o, output wire prog_empty_o, output wire underflow_o, output wire rd_valid_o, output wire [RDATA_WIDTH-1:0] rdata, output wire [RADDR_WIDTH :0] rd_datacount_o, output wire rst_busy ); localparam WR_DEPTH = DEPTH; localparam WDATA_WIDTH = DATA_WIDTH; localparam RAM_MUX_RATIO = (RDATA_WIDTH <= WDATA_WIDTH/32) ? 32 : (RDATA_WIDTH <= WDATA_WIDTH/16) ? 16 : (RDATA_WIDTH <= WDATA_WIDTH/8) ? 8 : (RDATA_WIDTH <= WDATA_WIDTH/4) ? 4 : (RDATA_WIDTH <= WDATA_WIDTH/2) ? 2 : (RDATA_WIDTH <= WDATA_WIDTH) ? 1 : (RDATA_WIDTH <= WDATA_WIDTH*2) ? 2 : (RDATA_WIDTH <= WDATA_WIDTH*4) ? 4 : (RDATA_WIDTH <= WDATA_WIDTH*8) ? 8 : (RDATA_WIDTH <= WDATA_WIDTH*16) ? 16 : 32; wire wr_rst_int; wire rd_rst_int; wire wr_en_int; wire rd_en_int; wire [WADDR_WIDTH-1:0] waddr; wire [RADDR_WIDTH-1:0] raddr; wire wr_clk_int; wire rd_clk_int; wire [WADDR_WIDTH :0] wr_datacount_int; wire [RADDR_WIDTH :0] rd_datacount_int; generate if (ASYM_WIDTH_RATIO == 4) begin if (SYNC_CLK) begin assign wr_clk_int = clk_i; assign rd_clk_int = clk_i; assign datacount_o = wr_datacount_int; assign wr_datacount_o = {(WADDR_WIDTH+1){1'b0}}; assign rd_datacount_o = {(RADDR_WIDTH+1){1'b0}}; end else begin assign wr_clk_int = wr_clk_i; assign rd_clk_int = rd_clk_i; assign datacount_o = {(WADDR_WIDTH+1){1'b0}}; assign wr_datacount_o = wr_datacount_int; assign rd_datacount_o = rd_datacount_int; end end else begin assign datacount_o = {(WADDR_WIDTH+1){1'b0}}; assign wr_datacount_o = wr_datacount_int; assign rd_datacount_o = rd_datacount_int; if (SYNC_CLK) begin assign wr_clk_int = clk_i; assign rd_clk_int = clk_i; end else begin assign wr_clk_int = wr_clk_i; assign rd_clk_int = rd_clk_i; end end if (!SYNC_CLK) begin //(* async_reg = "true" *) reg [1:0] wr_rst; //(* async_reg = "true" *) reg [1:0] rd_rst; // //always @ (posedge wr_clk_int or posedge a_rst_i) begin // if (a_rst_i) // wr_rst <= 2'b11; // else // wr_rst <= {wr_rst[0],1'b0}; //end // //always @ (posedge rd_clk_int or posedge a_rst_i) begin // if (a_rst_i) // rd_rst <= 2'b11; // else // rd_rst <= {rd_rst[0],1'b0}; //end if (BYPASS_RESET_SYNC) begin assign wr_rst_int = a_wr_rst_i; assign rd_rst_int = a_rd_rst_i; assign rst_busy = 1'b0; end else begin `IP_MODULE_NAME(efx_resetsync) #( .ACTIVE_LOW (0) ) efx_resetsync_wr_rst ( .clk (wr_clk_int), .reset (a_rst_i), .d_o (wr_rst_int) ); `IP_MODULE_NAME(efx_resetsync) #( .ACTIVE_LOW (0) ) efx_resetsync_rd_rst ( .clk (rd_clk_int), .reset (a_rst_i), .d_o (rd_rst_int) ); assign rst_busy = wr_rst_int | rd_rst_int; end end else begin //(* async_reg = "true" *) reg [1:0] a_rst; // //always @ (posedge clk_i or posedge a_rst_i) begin // if (a_rst_i) // a_rst <= 2'b11; // else // a_rst <= {a_rst[0],1'b0}; //end wire a_rst; `IP_MODULE_NAME(efx_resetsync) #( .ACTIVE_LOW (0) ) efx_resetsync_a_rst ( .clk (clk_i), .reset (a_rst_i), .d_o (a_rst) ); if (BYPASS_RESET_SYNC) begin assign wr_rst_int = a_rst_i; assign rd_rst_int = a_rst_i; assign rst_busy = 1'b0; end else begin assign wr_rst_int = a_rst; assign rd_rst_int = a_rst; assign rst_busy = wr_rst_int | rd_rst_int; end end endgenerate `IP_MODULE_NAME(efx_fifo_ram) # ( .FAMILY (FAMILY), .WR_DEPTH (WR_DEPTH), .RD_DEPTH (RD_DEPTH), .WDATA_WIDTH (WDATA_WIDTH), .RDATA_WIDTH (RDATA_WIDTH), .WADDR_WIDTH (WADDR_WIDTH), .RADDR_WIDTH (RADDR_WIDTH), .OUTPUT_REG (OUTPUT_REG), .RAM_MUX_RATIO (RAM_MUX_RATIO), .ENDIANESS (ENDIANESS), .RAM_STYLE (RAM_STYLE) ) xefx_fifo_ram ( .wdata (wdata), .waddr (waddr), .raddr (raddr), .we (wr_en_int), .re (rd_en_int), .wclk (wr_clk_int), .rclk (rd_clk_int), .rdata (rdata) ); `IP_MODULE_NAME(efx_fifo_ctl) # ( .SYNC_CLK (SYNC_CLK), .SYNC_STAGE (SYNC_STAGE), .MODE (MODE), .WR_DEPTH (WR_DEPTH), .WADDR_WIDTH (WADDR_WIDTH), .RADDR_WIDTH (RADDR_WIDTH), .ASYM_WIDTH_RATIO (ASYM_WIDTH_RATIO), .RAM_MUX_RATIO (RAM_MUX_RATIO), .PIPELINE_REG (PIPELINE_REG), .ALMOST_FLAG (ALMOST_FLAG), .PROGRAMMABLE_FULL (PROGRAMMABLE_FULL), .PROG_FULL_ASSERT (PROG_FULL_ASSERT), .PROG_FULL_NEGATE (PROG_FULL_NEGATE), .PROGRAMMABLE_EMPTY (PROGRAMMABLE_EMPTY), .PROG_EMPTY_ASSERT (PROG_EMPTY_ASSERT), .PROG_EMPTY_NEGATE (PROG_EMPTY_NEGATE), .OUTPUT_REG (OUTPUT_REG), .HANDSHAKE_FLAG (HANDSHAKE_FLAG), .OVERFLOW_PROTECT (OVERFLOW_PROTECT), .UNDERFLOW_PROTECT (UNDERFLOW_PROTECT) ) xefx_fifo_ctl ( .wr_rst (wr_rst_int), .rd_rst (rd_rst_int), .wclk (wr_clk_int), .rclk (rd_clk_int), .we (wr_en_i), .re (rd_en_i), .wr_full (full_o), .wr_ack (wr_ack_o), .rd_empty (empty_o), .wr_almost_full (almost_full_o), .rd_almost_empty (almost_empty_o), .wr_prog_full (prog_full_o), .rd_prog_empty (prog_empty_o), .wr_en_int (wr_en_int), .rd_en_int (rd_en_int), .waddr (waddr), .raddr (raddr), .wr_datacount (wr_datacount_int), .rd_datacount (rd_datacount_int), .rd_vld (rd_valid_o), .wr_overflow (overflow_o), .rd_underflow (underflow_o) ); function integer depth2width; input [31:0] depth; begin : fnDepth2Width if (depth > 1) begin depth = depth - 1; for (depth2width=0; depth>0; depth2width = depth2width + 1) depth = depth>>1; end else depth2width = 0; end endfunction function integer width2depth; input [31:0] width; begin : fnWidth2Depth width2depth = width**2; end endfunction function integer rdwidthcompute; input [31:0] asym_option; input [31:0] wr_width; begin : RdWidthCompute rdwidthcompute = (asym_option==0)? wr_width/16 : (asym_option==1)? wr_width/8 : (asym_option==2)? wr_width/4 : (asym_option==3)? wr_width/2 : (asym_option==4)? wr_width/1 : (asym_option==5)? wr_width*2 : (asym_option==6)? wr_width*4 : (asym_option==7)? wr_width*8 : (asym_option==8)? wr_width*16 : wr_width/1; end endfunction function integer rddepthcompute; input [31:0] wr_depth; input [31:0] wr_width; input [31:0] rd_width; begin : RdDepthCompute rddepthcompute = (wr_depth * wr_width) / rd_width; end endfunction endmodule ///////////////////////////////////////////////////////////////////////////// // _____ // / _______ Copyright (C) 2013-2021 Efinix Inc. All rights reserved. // / / \ // / / .. / simple_dual_port_ram_fifo.v // / / .' / // __/ /.' / Description: // __ \ / EFX FIFO // /_/ /\ \_____/ / // ____/ \_______/ // // ******************************* // Revisions: // // ******************************* module `IP_MODULE_NAME(efx_fifo_ram) #( parameter FAMILY = "TRION", parameter WR_DEPTH = 512, parameter RD_DEPTH = 512, parameter WDATA_WIDTH = 8, parameter RDATA_WIDTH = 8, parameter WADDR_WIDTH = 9, parameter RADDR_WIDTH = 9, parameter OUTPUT_REG = 1, parameter RAM_MUX_RATIO = 4, parameter ENDIANESS = 0, //0: Big endian (default) 1: Little endian parameter RAM_STYLE = "block_ram" ) ( input wire wclk, input wire rclk, input wire we, input wire re, input wire [(WDATA_WIDTH-1):0] wdata, input wire [(WADDR_WIDTH-1):0] waddr, input wire [(RADDR_WIDTH-1):0] raddr, output wire [(RDATA_WIDTH-1):0] rdata ); localparam MEM_DEPTH = (WR_DEPTH > RD_DEPTH) ? WR_DEPTH : RD_DEPTH; localparam MEM_DATA_WIDTH = (WDATA_WIDTH > RDATA_WIDTH) ? RDATA_WIDTH : WDATA_WIDTH; localparam LSB_WIDTH = (WADDR_WIDTH > RADDR_WIDTH) ? (WADDR_WIDTH - RADDR_WIDTH) : (RADDR_WIDTH - WADDR_WIDTH); localparam RDATA_WDATA_RATIO = (RDATA_WIDTH <= WDATA_WIDTH/32) ? "ONE_THIRTYTWO" : (RDATA_WIDTH <= WDATA_WIDTH/16) ? "ONE_SIXTEENTH" : (RDATA_WIDTH <= WDATA_WIDTH/8) ? "ONE_EIGHTH" : (RDATA_WIDTH <= WDATA_WIDTH/4) ? "ONE_FOURTH" : (RDATA_WIDTH <= WDATA_WIDTH/2) ? "ONE_HALF" : (RDATA_WIDTH <= WDATA_WIDTH) ? "ONE" : (RDATA_WIDTH <= WDATA_WIDTH*2) ? "TWO_TIMES" : (RDATA_WIDTH <= WDATA_WIDTH*4) ? "FOUR_TIMES" : (RDATA_WIDTH <= WDATA_WIDTH*4) ? "EIGHT_TIMES" : (RDATA_WIDTH <= WDATA_WIDTH*4) ? "SIXTEEN_TIMES" : "THIRTYTWO_TIMES"; (* syn_ramstyle = RAM_STYLE *) reg [MEM_DATA_WIDTH-1:0] ram[MEM_DEPTH-1:0]; reg [RDATA_WIDTH-1:0] r_rdata_1P; reg [RDATA_WIDTH-1:0] r_rdata_2P; wire re_int; generate if (FAMILY == "TRION") begin if (RDATA_WDATA_RATIO == "ONE") begin always @ (posedge wclk) begin if (we) ram[waddr] <= wdata; end always @ (posedge rclk) begin if (re_int) begin r_rdata_1P <= ram[raddr]; end r_rdata_2P <= r_rdata_1P; end end else if (RDATA_WDATA_RATIO == "ONE_THIRTYTWO" || RDATA_WDATA_RATIO == "ONE_SIXTEENTH" || RDATA_WDATA_RATIO == "ONE_EIGHTH" || RDATA_WDATA_RATIO == "ONE_FOURTH" || RDATA_WDATA_RATIO == "ONE_HALF" ) begin if (ENDIANESS == 0) begin integer i; always @ (posedge wclk) begin for (i=0; i 1) begin wire [1:0] bin_1; assign bin_1 = {gray_i[WIDTH-1], gray_i[WIDTH-1]^gray_i[WIDTH-2]}; if (WIDTH == 2) begin assign bin_o = bin_1; end else begin assign bin_o[WIDTH-1] = bin_1[1]; `IP_MODULE_NAME(efx_fifo_gray2bin) #(.WIDTH(WIDTH-1)) u_gray2bin (.bin_o(bin_o[WIDTH-2:0]), .gray_i({bin_1[0], gray_i[WIDTH-3:0]})); end end else /* if (WIDTH == 1) */ assign bin_o = gray_i; endgenerate endmodule //////////////////////////////////////////////////////////////////////////////// // Copyright (C) 2013-2020 Efinix Inc. All rights reserved. // // This document contains proprietary information which is // protected by copyright. All rights are reserved. This notice // refers to original work by Efinix, Inc. which may be derivitive // of other work distributed under license of the authors. In the // case of derivative work, nothing in this notice overrides the // original author's license agreement. Where applicable, the // original license agreement is included in it's original // unmodified form immediately below this header. // // WARRANTY DISCLAIMER. // THE DESIGN, CODE, OR INFORMATION ARE PROVIDED “AS IS” AND // EFINIX MAKES NO WARRANTIES, EXPRESS OR IMPLIED WITH // RESPECT THERETO, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES, // INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF // MERCHANTABILITY, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR // PURPOSE. SOME STATES DO NOT ALLOW EXCLUSIONS OF AN IMPLIED // WARRANTY, SO THIS DISCLAIMER MAY NOT APPLY TO LICENSEE. // // LIMITATION OF LIABILITY. // NOTWITHSTANDING ANYTHING TO THE CONTRARY, EXCEPT FOR BODILY // INJURY, EFINIX SHALL NOT BE LIABLE WITH RESPECT TO ANY SUBJECT // MATTER OF THIS AGREEMENT UNDER TORT, CONTRACT, STRICT LIABILITY // OR ANY OTHER LEGAL OR EQUITABLE THEORY (I) FOR ANY INDIRECT, // SPECIAL, INCIDENTAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES OF ANY // CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF // GOODWILL, DATA OR PROFIT, WORK STOPPAGE, OR COMPUTER FAILURE OR // MALFUNCTION, OR IN ANY EVENT (II) FOR ANY AMOUNT IN EXCESS, IN // THE AGGREGATE, OF THE FEE PAID BY LICENSEE TO EFINIX HEREUNDER // (OR, IF THE FEE HAS BEEN WAIVED, $100), EVEN IF EFINIX SHALL HAVE // BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO // NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR // CONSEQUENTIAL DAMAGES, SO THIS LIMITATION AND EXCLUSION MAY NOT // APPLY TO LICENSEE. // //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// // _____ // / _______ Copyright (C) 2013-2020 Efinix Inc. All rights reserved. // / / \ // / / .. / pipe_reg.v // / / .' / // __/ /.' / Description: // __ \ / Parallel Pipelining Shift Register // /_/ /\ \_____/ / // ____/ \_______/ // // ******************************* // Revisions: // 1.0 Initial rev // // ******************************* module `IP_MODULE_NAME(efx_fifo_datasync) #( parameter STAGE = 32, parameter WIDTH = 4 ) ( input wire clk_i, input wire [WIDTH-1:0] d_i, output wire [WIDTH-1:0] d_o ); (* async_reg = "true" *) reg [WIDTH-1:0] pipe_reg [STAGE-1:0]; integer i; always @(posedge clk_i) begin for (i=STAGE-1; i>0; i = i - 1) begin pipe_reg[i] <= pipe_reg[i-1]; end pipe_reg[0] <= d_i; end assign d_o = pipe_reg[STAGE-1]; endmodule //////////////////////////////////////////////////////////////////////////////// // Copyright (C) 2013-2020 Efinix Inc. All rights reserved. // // This document contains proprietary information which is // protected by copyright. All rights are reserved. This notice // refers to original work by Efinix, Inc. which may be derivitive // of other work distributed under license of the authors. In the // case of derivative work, nothing in this notice overrides the // original author's license agreement. Where applicable, the // original license agreement is included in it's original // unmodified form immediately below this header. // // WARRANTY DISCLAIMER. // THE DESIGN, CODE, OR INFORMATION ARE PROVIDED “AS IS” AND // EFINIX MAKES NO WARRANTIES, EXPRESS OR IMPLIED WITH // RESPECT THERETO, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES, // INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF // MERCHANTABILITY, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR // PURPOSE. SOME STATES DO NOT ALLOW EXCLUSIONS OF AN IMPLIED // WARRANTY, SO THIS DISCLAIMER MAY NOT APPLY TO LICENSEE. // // LIMITATION OF LIABILITY. // NOTWITHSTANDING ANYTHING TO THE CONTRARY, EXCEPT FOR BODILY // INJURY, EFINIX SHALL NOT BE LIABLE WITH RESPECT TO ANY SUBJECT // MATTER OF THIS AGREEMENT UNDER TORT, CONTRACT, STRICT LIABILITY // OR ANY OTHER LEGAL OR EQUITABLE THEORY (I) FOR ANY INDIRECT, // SPECIAL, INCIDENTAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES OF ANY // CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF // GOODWILL, DATA OR PROFIT, WORK STOPPAGE, OR COMPUTER FAILURE OR // MALFUNCTION, OR IN ANY EVENT (II) FOR ANY AMOUNT IN EXCESS, IN // THE AGGREGATE, OF THE FEE PAID BY LICENSEE TO EFINIX HEREUNDER // (OR, IF THE FEE HAS BEEN WAIVED, $100), EVEN IF EFINIX SHALL HAVE // BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO // NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR // CONSEQUENTIAL DAMAGES, SO THIS LIMITATION AND EXCLUSION MAY NOT // APPLY TO LICENSEE. // //////////////////////////////////////////////////////////////////////////////// // synopsys translate_off `timescale 1 ns / 1 ps // synopsys translate_on module `IP_MODULE_NAME(efx_resetsync) #( parameter ASYNC_STAGE = 2, parameter ACTIVE_LOW = 1 ) ( input wire clk, input wire reset, output wire d_o ); generate if (ACTIVE_LOW == 1) begin: active_low `IP_MODULE_NAME(efx_asyncreg) #( .WIDTH (1), .ACTIVE_LOW (1), .RST_VALUE (0) ) efx_resetsync_active_low ( .clk (clk), .reset_n (reset), .d_i (1'b1), .d_o (d_o) ); end else begin: active_high `IP_MODULE_NAME(efx_asyncreg) #( .WIDTH (1), .ACTIVE_LOW (0), .RST_VALUE (1) ) efx_resetsync_active_high ( .clk (clk), .reset_n (reset), .d_i (1'b0), .d_o (d_o) ); end endgenerate endmodule // synopsys translate_off `timescale 1 ns / 1 ps // synopsys translate_on module `IP_MODULE_NAME(efx_asyncreg) #( parameter ASYNC_STAGE = 2, parameter WIDTH = 4, parameter ACTIVE_LOW = 1, // 0 - Active high reset, 1 - Active low reset parameter RST_VALUE = 0, parameter OFF_ASSERTION = 0 // 1 = Turn off PULSE_WIDTH_CHK assertion for a particular instance ) ( input wire clk, input wire reset_n, input wire [WIDTH-1:0] d_i, output wire [WIDTH-1:0] d_o ); `pragma protect begin_protected `pragma protect version = 1 `pragma protect author = "author-a" , author_info = "author-a-details" `pragma protect encrypt_agent = "QuestaSim" , encrypt_agent_info = "2023.4" `pragma protect key_keyowner = "Efinix Inc." , key_keyname = "EFX_K01" `pragma protect key_method = "rsa" `pragma protect encoding = ( enctype = "base64" , line_length = 64 , bytes = 256 ) `pragma protect key_block IjzmeF2ACtI8q/MHPcSQakfCyuQSUgg747Z3U+BWZdCStFbqF/Rhg0VPl8JT+91V o/8Ohsiw6GnpSIX69XazqGYmhEjb+W7W2ngBYentEXdSyzUYvEbr8i71cL04f1fE El78uYgSvjFwoDyocXOVYk8JA0v7y6WnabkL02lAqASKGQK55nzfKeUVbJHKHjAY kIT3Nf7JWK2NVVymI1Zs5QttwrNgKBSqoiPvmy4+16bTQMx4R205Bb4rT1MqSqIc /5U5/Z1e1tZzOqoEyhfcMMKW0emdBIdByNvteK05ZATt11Uzj2M/Vn1r9KmYd0h1 uYJaS5tuGEuFInBHa7oO8g== `pragma protect key_keyowner = "Cadence Design Systems." , key_keyname = "CDS_RSA_KEY_VER_2" `pragma protect key_method = "rsa" `pragma protect encoding = ( enctype = "base64" , line_length = 64 , bytes = 256 ) `pragma protect key_block ABJo/BvEH9XbZrt+xPOQ2C7yeLcnebDlRELbHyCdXeeNkZRVZ9m0ie+1HufS/I+3 fC63lnVTenVdf9s4tm1RLd5VBkmFb37ikgaESy2aRKWsdLG6x2OyuODoMDRCjYUa rxhnwLWh5E55yR3XVZgM2k7/NPP2cTL7iOSCjH4No38siNjs4Fapyc4FFq0TOsQq PMqsZ5jgmM+ZT8cil0wMt5tpdEOwvchbe1GcZLIhcIFLD/Gb2XtP0Q0QkOlNzuiL DNyobLTjDkV5si+/23Ng2E7tDq+SX+vJP4ciI63kXtsmQdn1ff2Y64ibNXJtpu/w K3OoKmk3zFeArSsql8B4/Q== `pragma protect key_keyowner = "Synopsys" , key_keyname = "SNPS-VCS-RSA-2" `pragma protect key_method = "rsa" `pragma protect encoding = ( enctype = "base64" , line_length = 64 , bytes = 128 ) `pragma protect key_block RAoMYYsrw2j05cvQ8NR0lCh+Ia/OGVfdwZqq0pwIkgDzO3Z7ol96oQmQzFfIQY/M GzEOFdYJTfjnxPvhSPxT1tpq2Fgx6PbC2FMWFtN6/TrG/s01ifIWIZ9Wrfo8Q01l 6XTAESHR1htrOOx6AiDHAQLOlBb0zgfZjayGJBRX7FI= `pragma protect key_keyowner = "Aldec" , key_keyname = "ALDEC15_001" `pragma protect key_method = "rsa" `pragma protect encoding = ( enctype = "base64" , line_length = 64 , bytes = 256 ) `pragma protect key_block YclPuIbYLW/ftZYybucr9ooblGFkJDcdUWf6kCJBGKpIRjItUB3LdSwcREekRWqf RGiSRFoyrOTiScT06zZ4fkm+PEKj8O3RU1VMMzDjuEUqkAEELJHNOH71tCSC6MWk 1dop7MZy8BSXhzg3W3RXIA8IGSJRDibliv+SjkbUzg/WceDI176fJmUwGUji93Tw Zu2vRjA/RTi3ZMzS/2Z9YE156hpipJ/Cu6ca8V3y5Kt6DX4fcCS09xESr6soT5Oz eKRExN7wu8dvYMUuu1YgCVVR47BBDQi3wdZHqlq1PLaycnNOwBPLOAzA19Hefh/0 2HflB1HYKxojQCcZU7qUgQ== `pragma protect key_keyowner = "Siemens" , key_keyname = "SIEMENS-VERIF-SIM-RSA-2" `pragma protect key_method = "rsa" `pragma protect encoding = ( enctype = "base64" , line_length = 64 , bytes = 256 ) `pragma protect key_block fMvC6d2jTMqMqGFzPCPWt6pV9wRUCG4/taH3Nfn7RcekdiLyXQEQgm1SN+X+hkbx Pu7552vaw2ez4j3zrTk2vRPnDAsxY8GidEnkJcULi8kiia9Xy/ePFLxOJHHigkiB rU7uwrFblcYYBRwQjhMhJDowyR9HVAonxhOWVIlYagtABxLYlNdDEn+N4yPLVCsr XUWy1E2L5GUFFNQffENN0iyUaKdWAKGIqgIZK1sB3tVOPVsULetSoyzRErWPNZQD e5jbBBNZGyQQWgOJkOfy280ekoUUEZajqtB1jDvE3k8kbo4rzvr7yTkhSzLqjGod B2Zpo2FQ//YDRSAaEa9ksQ== `pragma protect key_keyowner = "Mentor Graphics Corporation" , key_keyname = "MGC-VERIF-SIM-RSA-2" `pragma protect key_method = "rsa" `pragma protect encoding = ( enctype = "base64" , line_length = 64 , bytes = 256 ) `pragma protect key_block TcmE9lQROafuvxGWP3fMVxDoeaiMX6ALoT3detg/qWZ36+yPTc/t8N7/DtSx17Ze vr6iBb+ge3aAzWAq2QHyVfgVV15dvW/HsOXXTh7UqExiO7Dxa6nHXuAhYMON6NP2 ihfIRSvdnrL2ufvg7A2rCHGAqnr6cVnRLfhNJxtA1lloQbJEtlf/CWNblDxEfyw2 06l3l8pp1rS0E4tMqagmOr+yhNSpcS9vQswFltqroh6kNIE64zKri96HKkRFLNlP fpsN7plEpLS54SxIMmh8Op+w0a/jXVOxxD+FLepsZWfGiNksENgu2Xo6TvZIQUUN ZoPzFCMjGk5ZmMyIlytNCw== `pragma protect data_method = "aes256-cbc" `pragma protect encoding = ( enctype = "base64" , line_length = 64 , bytes = 4288 ) `pragma protect data_block 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 Ei7EaFpheCmlTJyxUg8TdA== `pragma protect end_protected ///////////////////////////////////////////////////////////////////////////// // _____ // / _______ Copyright (C) 2013-2021 Efinix Inc. All rights reserved. // / / \ // / / .. / simple_dual_port_ram_fifo.v // / / .' / // __/ /.' / Description: // __ \ / EFX FIFO // /_/ /\ \_____/ / // ____/ \_______/ // // ******************************* // Revisions: // // ******************************* module `IP_MODULE_NAME(efx_fifo_ctl) # ( parameter SYNC_CLK = 1, parameter SYNC_STAGE = 2, parameter MODE = "STANDARD", parameter WR_DEPTH = 512, parameter WADDR_WIDTH = 9, parameter RADDR_WIDTH = 9, parameter ASYM_WIDTH_RATIO = 4, parameter RAM_MUX_RATIO = 1, parameter PIPELINE_REG = 1, parameter ALMOST_FLAG = 1, parameter PROGRAMMABLE_FULL = "NONE", parameter PROG_FULL_ASSERT = 0, parameter PROG_FULL_NEGATE = 0, parameter PROGRAMMABLE_EMPTY = "NONE", parameter PROG_EMPTY_ASSERT = 0, parameter PROG_EMPTY_NEGATE = 0, parameter OUTPUT_REG = 0, parameter HANDSHAKE_FLAG = 1, parameter OVERFLOW_PROTECT = 0, parameter UNDERFLOW_PROTECT = 0 )( input wire wr_rst, input wire rd_rst, input wire wclk, input wire rclk, input wire we, input wire re, output wire wr_full, output reg wr_ack, output wire wr_almost_full, output wire rd_empty, output wire rd_almost_empty, output wire wr_prog_full, output wire rd_prog_empty, output wire wr_en_int, output wire rd_en_int, output wire [WADDR_WIDTH-1:0] waddr, output wire [RADDR_WIDTH-1:0] raddr, output wire [WADDR_WIDTH:0] wr_datacount, output wire [RADDR_WIDTH:0] rd_datacount, output wire rd_vld, output reg wr_overflow, output reg rd_underflow ); reg [WADDR_WIDTH:0] waddr_cntr; reg [WADDR_WIDTH:0] waddr_cntr_r; reg [RADDR_WIDTH:0] raddr_cntr; reg rd_valid; wire [WADDR_WIDTH:0] waddr_int; wire [RADDR_WIDTH:0] raddr_int; wire rd_empty_int; wire [WADDR_WIDTH:0] wr_datacount_int; wire [RADDR_WIDTH:0] rd_datacount_int; assign waddr = waddr_cntr[WADDR_WIDTH-1:0]; // NIC wire [RADDR_WIDTH:0] ram_raddr; assign raddr = (MODE == "FWFT") ? ram_raddr[RADDR_WIDTH-1:0] : raddr_cntr[RADDR_WIDTH-1:0]; //assign raddr = raddr_cntr[RADDR_WIDTH-1:0]; //assign wr_en_int = we & ~wr_full; assign wr_en_int = OVERFLOW_PROTECT ? we & ~wr_full : we; assign wr_datacount = wr_datacount_int; assign rd_datacount = ASYM_WIDTH_RATIO == 4 && SYNC_CLK ? wr_datacount_int : rd_datacount_int; generate if (MODE == "FWFT") begin // NIC //assign rd_en_int = (~rd_empty_int & rd_empty) | (re & ~rd_empty_int); //assign rd_empty = rd_empty_fwft; assign rd_en_int = 1'b1; //assign rd_empty = rd_empty_int; //always @ (posedge rclk or posedge rd_rst) begin // if (rd_rst) begin // init_set <= 1'b1; // end // else if (~init_set & rd_empty) begin // init_set <= 1'b1; // end // else if (~rd_empty_int) begin // init_set <= 1'b0; // end // else if (rd_empty) begin // init_set <= 1'b1; // end //end // NIC //always @ (posedge rclk or posedge rd_rst) begin // if (rd_rst) begin // rd_empty_fwft <= 1'b1; // end // else if (rd_en_int) begin // rd_empty_fwft <= 1'b0; // end // else if (re) begin // rd_empty_fwft <= 1'b1; // end //end //if (FAMILY == "TRION") begin if (OUTPUT_REG) begin always @ (posedge rclk or posedge rd_rst) begin if (rd_rst) begin rd_valid <= 1'b0; end else begin rd_valid <= ~rd_empty; end end assign rd_vld = rd_valid; end else begin assign rd_vld = ~rd_empty; end assign rd_empty = rd_empty_int; end else begin assign rd_en_int = UNDERFLOW_PROTECT ? re & ~rd_empty_int : re; assign rd_empty = rd_empty_int; if (OUTPUT_REG) begin reg rd_valid_r; always @ (posedge rclk or posedge rd_rst) begin if (rd_rst) begin rd_valid_r <= 'h0; rd_valid <= 'h0; end else begin {rd_valid,rd_valid_r} <= {rd_valid_r,rd_en_int}; end end assign rd_vld = rd_valid; end else begin always @ (posedge rclk or posedge rd_rst) begin if (rd_rst) begin rd_valid <= 'h0; end else begin rd_valid <= rd_en_int; end end assign rd_vld = rd_valid; end end if (ALMOST_FLAG) begin assign wr_almost_full = wr_datacount >= WR_DEPTH-1; assign rd_almost_empty = rd_datacount <= 'd1; end else begin assign wr_almost_full = 1'b0; assign rd_almost_empty = 1'b0; end if (PROGRAMMABLE_FULL == "STATIC_SINGLE") begin reg wr_prog_full_int; assign wr_prog_full = wr_datacount >= PROG_FULL_ASSERT; always @ (posedge wclk or posedge wr_rst) begin if (wr_rst) begin wr_prog_full_int <= 1'b0; end else begin wr_prog_full_int <= wr_prog_full; end end end else if (PROGRAMMABLE_FULL == "STATIC_DUAL") begin reg wr_prog_full_int; assign wr_prog_full = wr_prog_full_int ? wr_datacount >= PROG_FULL_NEGATE : wr_datacount >= PROG_FULL_ASSERT; always @ (posedge wclk or posedge wr_rst) begin if (wr_rst) begin wr_prog_full_int <= 1'b0; end else begin wr_prog_full_int <= wr_prog_full; end end end else begin assign wr_prog_full = 1'b0; end if (PROGRAMMABLE_EMPTY == "STATIC_SINGLE") begin reg rd_prog_empty_int; assign rd_prog_empty = rd_datacount <= PROG_EMPTY_ASSERT; always @ (posedge rclk or posedge rd_rst) begin if (rd_rst) begin rd_prog_empty_int <= 1'b1; end else begin rd_prog_empty_int <= rd_prog_empty; end end end else if (PROGRAMMABLE_EMPTY == "STATIC_DUAL") begin reg rd_prog_empty_int; assign rd_prog_empty = rd_prog_empty_int ? (rd_datacount <= PROG_EMPTY_NEGATE) : (rd_datacount <= PROG_EMPTY_ASSERT); always @ (posedge rclk or posedge rd_rst) begin if (rd_rst) begin rd_prog_empty_int <= 1'b1; end else begin rd_prog_empty_int <= rd_prog_empty; end end end else begin assign rd_prog_empty = 1'b0; end if (HANDSHAKE_FLAG) begin always @ (posedge wclk or posedge wr_rst) begin if (wr_rst) begin wr_ack <= 1'b0; end else begin // NIC //wr_ack <= wr_en_int & ~wr_overflow; wr_ack <= OVERFLOW_PROTECT ? wr_en_int & ~wr_overflow : wr_en_int; end end end if (OVERFLOW_PROTECT) begin always @ (posedge wclk or posedge wr_rst) begin if (wr_rst) begin wr_overflow <= 1'b0; end else if (we && wr_full) begin wr_overflow <= 1'b1; end else begin wr_overflow <= 1'b0; end end end else if (HANDSHAKE_FLAG) begin always @ (posedge wclk or posedge wr_rst) begin if (wr_rst) begin wr_overflow <= 1'b0; end else begin wr_overflow <= we && wr_full ? 1'b1 : wr_overflow; end end end if (UNDERFLOW_PROTECT) begin always @ (posedge rclk or posedge rd_rst) begin if (rd_rst) begin rd_underflow <= 1'b0; end else if (re && rd_empty) begin rd_underflow <= 1'b1; end else begin rd_underflow <= 1'b0; end end end else if (HANDSHAKE_FLAG) begin always @ (posedge rclk or posedge rd_rst) begin if (rd_rst) begin rd_underflow <= 1'b0; end else begin rd_underflow <= re && rd_empty ? 1'b1 : rd_underflow; end end end localparam RATIO_WIDTH = (RADDR_WIDTH >= WADDR_WIDTH)? RADDR_WIDTH - WADDR_WIDTH : WADDR_WIDTH - RADDR_WIDTH; if (ASYM_WIDTH_RATIO < 4) begin assign wr_full = (waddr_cntr[WADDR_WIDTH]^raddr_int[RADDR_WIDTH]) & (waddr_cntr[WADDR_WIDTH-1:0] == raddr_int[RADDR_WIDTH-1:RATIO_WIDTH]); assign rd_empty_int = waddr_int[WADDR_WIDTH:0] == raddr_cntr[RADDR_WIDTH:RATIO_WIDTH]; assign wr_datacount_int = waddr_cntr - (raddr_int/RAM_MUX_RATIO); assign rd_datacount_int = (waddr_int*RAM_MUX_RATIO)-raddr_cntr; end // NIC else if (ASYM_WIDTH_RATIO == 4) begin assign wr_full = (waddr_cntr[WADDR_WIDTH]^raddr_int[RADDR_WIDTH]) & (waddr_cntr[WADDR_WIDTH-1:0] == raddr_int[RADDR_WIDTH-1:0]); assign rd_empty_int = waddr_int[WADDR_WIDTH:0] == raddr_cntr[RADDR_WIDTH:0]; assign wr_datacount_int = waddr_cntr - raddr_int; assign rd_datacount_int = waddr_int - raddr_cntr; end else begin assign wr_full = (waddr_cntr[WADDR_WIDTH]^raddr_int[RADDR_WIDTH]) & (waddr_cntr[WADDR_WIDTH-1:RATIO_WIDTH] == raddr_int[RADDR_WIDTH-1:0]); // NIC //assign rd_empty_int = (waddr_int- raddr_cntr*RAM_MUX_RATIO) < RAM_MUX_RATIO; assign rd_empty_int = waddr_int[WADDR_WIDTH:RATIO_WIDTH] == raddr_cntr[RADDR_WIDTH:0]; assign wr_datacount_int = waddr_cntr - (raddr_int*RAM_MUX_RATIO); assign rd_datacount_int = (waddr_int/RAM_MUX_RATIO)-raddr_cntr; end endgenerate always @ (posedge wclk or posedge wr_rst) begin if (wr_rst) begin waddr_cntr <= 'h0; end else if (wr_en_int) begin waddr_cntr <= waddr_cntr + 1'b1; end end always @ (posedge wclk or posedge wr_rst) begin if (wr_rst) begin waddr_cntr_r <= 'h0; end else begin waddr_cntr_r <= waddr_cntr; end end always @ (posedge rclk or posedge rd_rst) begin if (rd_rst) begin raddr_cntr <= 'h0; end // NIC //else if (rd_en_int) begin else begin //raddr_cntr <= raddr_cntr + 1'b1; //raddr_cntr <= raddr_cntr + (re & ~rd_empty_int); raddr_cntr <= ram_raddr; end end // NIC assign ram_raddr = raddr_cntr + (UNDERFLOW_PROTECT ? re & ~rd_empty_int : re); generate if (SYNC_CLK) begin : sync_clk if (MODE == "FWFT") begin assign waddr_int = waddr_cntr_r; assign raddr_int = raddr_cntr; end else begin assign waddr_int = waddr_cntr; assign raddr_int = raddr_cntr; end end else begin : async_clk reg [RADDR_WIDTH:0] raddr_cntr_gry_r; reg [WADDR_WIDTH:0] waddr_cntr_gry_r; wire [RADDR_WIDTH:0] raddr_cntr_gry; wire [RADDR_WIDTH:0] raddr_cntr_gry_sync; wire [RADDR_WIDTH:0] raddr_cntr_sync_g2b; wire [WADDR_WIDTH:0] waddr_cntr_gry; wire [WADDR_WIDTH:0] waddr_cntr_gry_sync; wire [WADDR_WIDTH:0] waddr_cntr_sync_g2b; if (PIPELINE_REG) begin reg [RADDR_WIDTH:0] raddr_cntr_sync_g2b_r; reg [WADDR_WIDTH:0] waddr_cntr_sync_g2b_r; assign waddr_int = waddr_cntr_sync_g2b_r; assign raddr_int = raddr_cntr_sync_g2b_r; always @ (posedge wclk or posedge wr_rst) begin if (wr_rst) begin raddr_cntr_sync_g2b_r <= 'h0; end else begin raddr_cntr_sync_g2b_r <= raddr_cntr_sync_g2b; end end always @ (posedge rclk or posedge rd_rst) begin if (rd_rst) begin waddr_cntr_sync_g2b_r <= 'h0; end else begin waddr_cntr_sync_g2b_r <= waddr_cntr_sync_g2b; end end end else begin assign waddr_int = waddr_cntr_sync_g2b; assign raddr_int = raddr_cntr_sync_g2b; end always @ (posedge rclk or posedge rd_rst) begin if (rd_rst) begin raddr_cntr_gry_r <= 'h0; end else begin raddr_cntr_gry_r <= raddr_cntr_gry; end end `IP_MODULE_NAME(efx_fifo_bin2gray) # (.WIDTH(RADDR_WIDTH+1) ) xrd2wr_bin2gray (.bin_i(raddr_cntr), .gray_o(raddr_cntr_gry)); `IP_MODULE_NAME(efx_asyncreg) # (.ASYNC_STAGE(SYNC_STAGE), .WIDTH (RADDR_WIDTH+1), .ACTIVE_LOW(0), .OFF_ASSERTION (1)) xrd2wr_addr_sync (.clk(wclk), .reset_n(wr_rst), .d_i(raddr_cntr_gry_r), .d_o(raddr_cntr_gry_sync)); `IP_MODULE_NAME(efx_fifo_gray2bin) # (.WIDTH(RADDR_WIDTH+1) ) xrd2wr_gray2bin (.gray_i(raddr_cntr_gry_sync), .bin_o(raddr_cntr_sync_g2b)); always @ (posedge wclk or posedge wr_rst) begin if (wr_rst) begin waddr_cntr_gry_r <= 'h0; end else begin waddr_cntr_gry_r <= waddr_cntr_gry; end end `IP_MODULE_NAME(efx_fifo_bin2gray) # (.WIDTH(WADDR_WIDTH+1) ) wr2rd_bin2gray (.bin_i(waddr_cntr), .gray_o(waddr_cntr_gry)); `IP_MODULE_NAME(efx_asyncreg) # (.ASYNC_STAGE(SYNC_STAGE), .WIDTH (WADDR_WIDTH+1), .ACTIVE_LOW(0), .OFF_ASSERTION (1)) wr2rd_addr_sync (.clk(rclk), .reset_n(rd_rst), .d_i(waddr_cntr_gry_r), .d_o(waddr_cntr_gry_sync)); `IP_MODULE_NAME(efx_fifo_gray2bin) # (.WIDTH(WADDR_WIDTH+1) ) wr2rd_gray2bin (.gray_i(waddr_cntr_gry_sync), .bin_o(waddr_cntr_sync_g2b)); end endgenerate endmodule //////////////////////////////////////////////////////////////////////////// // _____ // / _______ Copyright (C) 2013-2020 Efinix Inc. All rights reserved. // / / \ // / / .. / bin2gray.v // / / .' / // __/ /.' / Description: // __ \ / Binary to Gray Encoding Convertor // /_/ /\ \_____/ / // ____/ \_______/ // // ******************************* // Revisions: // 1.0 Initial rev // // ******************************* `resetall `timescale 1ns/1ps module `IP_MODULE_NAME(efx_fifo_bin2gray) #(parameter WIDTH=5) (// outputs output wire [WIDTH-1:0] gray_o, // input input [WIDTH-1:0] bin_i ); //--------------------------------------------------------------------- // Function : bit_xor // Description: reduction xor function bit_xor ( input [31:0] nex_bit, input [31:0] curr_bit, input [WIDTH-1:0] xor_in); begin : fn_bit_xor bit_xor = xor_in[nex_bit] ^ xor_in[curr_bit]; end endfunction // Convert Binary to Gray, bit by bit generate begin genvar bit_idx; for(bit_idx=0; bit_idxUU*[oU1[5}Vus#!'AOTp_DVG;x=a aIEzoCUHJG,X!B{}'Q>UjIGoQ7pp\vi1V3BR{djoH@BIC_~wK2}?H_&OZ+Y72BVoG!WU5*?G@_#XK=TGr\$iujV{mZ]_Zw+>A'Jo;oR!ao==Y>s?{AW]J$a$E]B#~7V DZ2BBy5,\'lnr=ETQp[Qw=zEVaHCnJ@aDV*{_HSa*aowEA3B{nH|XDwWVi+ky*aXCYRsHKx+K/B{ W@GO1][gE]Kuk}V_j^AzNuXn5!OA_IX+pTDs2'DHv5(6N>O_reTuJAOR uG[!u1mVetiIY#@]YCm&*uWE]o+{]7kwy;7TQn+sii=}iQOn<1r3>-I?}rOVDZZ5* Q,"[el+<'I_wR{{Z5?Qm>Tj!GKI4CYK=\1Hx_R^DQ_lT1GTOIXJuZCO!p_~[r3KIYR7oBwoUKs^R D}<=1[r2x#D}-+pK_+1G7HxnJp^m-H1~2+e#OTgG-v#B?loId-7Re&'m_KY@}!<]3nBvW;~ti$A] l?=\5<]al?js;eEVpp_EM?};uVqK5Z1.@5j_b$k_ps;M3Q]-qRzl_vo;C^i$\\?n+<{eks$2m_z< UY}RTa]e=]K>,+Ej_Dsvxe=G]a>5EgX]#5XruH;T{U-d] CmnDBBQoAu[!e[-BfQ!K VG@G>#}a{iTpo[um21{;^b,IW1p}l5"\,{]V=<*W>Dkx?o'ZzXu;\;D~EV}[J_K!ClR*pKv|i$Sr ^Aj1kwnYHjT$O-?_'BC,pp2Z5jlID#@s2l\2};UCz#@#zXx+>U;'o'7k,T#^5n!GuI22r{IkRkZ$ =1W1Z>?x?l[eA^Wa[>~73Uuu[je-AKW\;\_ZzBAC_}R2'oY'};^YcQuHkHsx_58^#!Hx7NB7J_{} {\vRwoR'GiYm\ouTlB'5w_\Q?uMrwAkc/!}n'~e{KRUR'?eHu**E=t=pWz$~-G_;HzpY<]|ajx{! n~;QH5n?r3HBxV$kE-'8ul_7*#WRzn_A$G~w>A*jV[3EV;lOHH}Ax>K=[ToEH$*Jw''3BD5ClWI{ >Er<{D]e]szvJapEM,1$u]k+OXQO!Bj~n1XV_eKs!K_rwX=xUB72ki*eUuVTOk1uEKnWI737-^mV >rI2lXQG];xR+k{x3?r\5=m=n5p]i^[=AGoa7a=JwX_]AoJjRkOq&>p^XK'iT2{aun]?@_RG+B;m\vz}]$zUaB>Q-U^!xzlABY \?sBY[\m@'['uU\pnoz~Os=7Vu1k\*~URG#+aVBx2\^l<'z>zj2 OwCH$Ozpp-a6j,;@N5uran5=Z7'J^5Kr@Lb;Oi2QX[B@w}TEBT;rm;axU*!T{|JjJ}2TX}ozm@U]e}Tv5G;I}W1e9*! YI?{IV>_~_/sw5It,XX@$l1{X_{{Bp1]P:>-GxZSGViTp?$~BB1+=7>CDv>o0WnD^X\{@o$>]oQ} [Ymv^vo;~[;pV~Y7WCrPh1WV^PQD[>VH^mE>}l{sR3!zXJmI>jmr}QrDjB_s?pTnEX'~@VS Q;JYmHX}zmWu''{WY{u7=-OUuxs{K5uW^'lCT{oIDYR'rBkRf<_rX+U$B7k7HBPnB-G\Bs;?<1$: *ze3\OR,rs]]'vIW=O3!$u@C6ipQRl^mls#V$DO_'wT,#i1QDCoQHG=/pY?,kw+A[ s7vr~>kU1}sbIIr\v1[?zlrU\KrApXAUUT~uEw,^$8yGwOI{j BsCrs2-OURjeH,ejQDl5^@UO_?!H_}:l]WGDHe<[3*V!\*wnopl2V]K3D${o+z\e5Uze'=$Gzz~\ aU5KU{QV2v^We{s]*e3K]Ak\K-;^,=$\T_,fEXe!]\un~O@3Vlp!1Ea#,HmUODs[#'zJ[$}UUzx- GkXG]0kOiRTe2KTCe}Q_sEmje;\~}jQTAvKoiBclu\Yeevs+r{Xlm}QOre]q$lGk[^p/37{G7jI\ ,'VV_xOHfI,@{sz2Y*K_w@Yw_+7B<^3}UY@=sv+rJVATl[xp*lRRHe<*Et1U7]K\~#9T7EB'\OTv OAG3752T}TQpToQ[RT;BVXjQR1JWaY?-7{ZQpI,}wI>ybG1-{Vp-+HU*V=aACs'^o/]R;s[OIkk+ DBY57OB;*sr^swlzpH_B*Xz#J?ZBIjZ<;Ep6knpB~<5Ul,eT_WHDa\7Q!x~]7O{lL}}wAf5}1lji \]/FQJ1H|>=-R1@$vsJX-CAwUQwn_o@[B3Xw^DB[k]C$2*;Aji!n+[m+KsoB;HIX+E\{B$7ZO^LrCJvMY3vWC]{Y^TV{#{*E*# ~T7iTHC5<'3}Q!ss-p[rul^?oGEKXs{p[kojjjm}jArHH/N-s3Xm}TZ,UXpH,x}CGJo M1_AlEez}lC*vHRC#M{RJz~R1r!Xna^_=iCiQuiOWroG^lVma1R[s>+zm#prD@I*?vAVxQQ~s[lJ 5l=Ee's@J2^_>uX1>!K\<[D5ToXrw<:K$s\3v[ZAGA^B}w{(xk5ZO5JWRz5<1sn}Ae*?K\mY[j<+GU>V5zxpBQ2nTl?p_+zB>HKn*x[x#'A,JTv~>CVE[r;C#]$V@oEA>xT~snr5<2<^^*@s=Qa~R=!1YE{EBxT\C'Yv XZ\[73E=*2G@\gPR*X1~]k$z4p^'o^;\jT[Hrxb}Rpa6^km^s$;v!@v~x^!V! T,|DC5Js_HBp{ZkejO-#}j1j7iT$-2zZe!?qNMEe=^NJTw~ei]*~eoV>{l+m[_^l[O^C!TW=m![; El<{U[GvYe}AvDT}'A5<7<~r[1Qb^aa-EBwr^Br1$?WzOEVUxJT'=Eve_7K{m1VCizw}j]$uOj_> sVjR\5>Cs11RA=mk#l!'<-YOw-7@9-\#J@R!7T\\5#C,We{a=*!aKr=+CInQo+#S2 >^3EO~mM]@3HWQ=elz;uoZVBym>-+npB;g@GHK\B?O3>WC|O3Ei~5][JjRTRPd$nl\4a=T?]U+IIJGzR<*_vmGu{1~\hT*{kEIV?@$hvm[{?napI'=w$K3nW[WOC$ ]pQ1{@}!on7i~s>+11@>j$YuXa.v!nGOwDr]5Cv]ZU*!$,3uA$*oB\kYH1*7]^xIQY]f{R}W'{,C _BkWZp#]ev=~iU]+Bjxe=VRv_5;?*{_n!GxJ0uvGu]X+x^B;rBaz]Z'o]{rWu2U!Ke?[=ZHO'*pG 15B[GQzo{xy>7VUvwo@{l2D71>E#$]Tkpn,*vQ$G27ez}$ns;W=^QwG+B,=m,}xwGB>V@o'WQaIV iU?ml=wJa;3-B#3\Y3[5}pBiHJ-}2{!]3JksTHanw>Xvck.kwne$>Rppaa?^+5_D_iW7_E~V!O\$ >OD[aRQF#sQJK=-CMnUj#iHUDKC,O!,UJ[m~xRTz#A\,olHQnIH!aGvHWVs=I4QH]+mUU=R{x'H> AU++uj];>{xRU~O\^$+QjDIsXoa1#^e^>-VY8zG_C?G^VV}U=|C_=~DEunRrX{ u]7UBvj_Ii7IuA@!3pYX6C7ekB$^U{Iur*eA}xsXkm5+>o$Ip>V5D3GT^*?Br^[>{n+}av>vJs;X nMz2by~zn$?Xl<>n_r$*'XwvU{I@T*JYQu?1~5bl>\Jj$EW+,}21#D!l+EOVmwGpVZVAp_mf<1To CkaW^Dw~]U$\HDo@B@Ym$<]7}i<-1AnX}]ieE+lr+p'pCu[rk*r-!]-*#xvRGYK;uxeXX-=na=XC p~e[-jsrP^Z!Uu5JTe7,3Z}XCop@@BEn{l,l1H{'!MV{^}H<2a-oi$*k=Esria `endprotected //pragma protect end //pragma protect //pragma protect begin `protected MTI!#/YeXKrl_sI!}5{Gea*amOjelTKYE@nTCiE#+BN"uE\ueQz#\xW]Zzp[RZnwuD_-3TM,~A?v *Hu:j-ns~{BBY6+1$'Q,AmOoXA31,['>Kj}jEZ5awZ]?p_vil_2uJk5X5=lopk7lp$@DxxvQjvZeJlYa,1a&Xnx+]W]jGRB'B= 1@,R72=sswnB#r,GU#smBx;R,3F]*+zrUT{;x+j_kX+l+yY+ZDJ',,ZwD1GXm[ peJVrKERs[GqW]Zz*{3{aC;uBjQiYXAU^=;~U'C{k-;Jy7CZ#jJ^uj v\v>]?\^m5wR@~[g\Y?#RTjuFV1wA[BkUpiZZX[{X*C]On=xiwbT*8,I\;wY#]1Zu{SSO\iQH$?vsEJEVC~^V*s\UUGrQ,BvE$;{yQjToBAB?|~l3 @[=nYfl!7YBCTeNVnCGa5j$GIU5@jxrh}*xY^Gmn!_,>^+T}7I={xTDm{5*H\zz5OnYU1UbKl!Ye Bau|wV{o"+IW!eybCID UpGB@eWz2{Jl,,e#OE-P7Ikr}3m~{>GKZ_wx\_;axr2C|nVlr=2o5+5_,u>n}eK[{1V!2gYjXWVJ lKm$uz}7}n{1V=ur3xAY]KRCk{Tr;\{rC>DO5Xr{>l^B[->Uo$}p3{^>]s]5V''sJ]QAHO|5!5Up Sf-1]W^@\sKpZCeGv2\oJR2eD>T7xrB{]kG=}Yuj]~m7Y@s[H-bJ7W;iGJXX>pCm>Kv=or}*^Rv< [=?P:[-$IXaT{VOV=HjGTsz1m',lRva^uUr-IR6lmOo^CR3Q''k>T B;w$}Gn}@Vs]ZYlAlT1allZe+#JQ!]_C]RlcU^A>?nw$fXo;'[x{D~Rs*Q$UK0'}TxI#5z@[JODAIJ^u^2 pa7wjnrUj!Dp!XCkKTk^zJBsEV<}#nf'Tj[kO-YTR<~.,TD\OQOx},> aTEjV2zV^bj7JH$X;wNG!27Q?DTf-1-O'lDEC]=XpE,CwQU5H1azL v$}ienuD';]\qR''$lT@VDjQ^Ee?~sO3sIAo@h-HVYmsoI}]CYW{uXE=1$jU*r\Q>o!15uo[-;>j <Kj}[J,_Zx]_7p~=r{z=ZGm}{}uI?B7i+,B<5Dn{EXK;j v[7'=Yu}V=sEmUGzei7+R,w[+Zdir#veq5>3=[#YkTYi*q*}onQ[O@av?n-5enI:D[I>I1k+J+ux DRACtYGVZJ>J;jKGXJ,RnsIX]VVemL*[Z!lxG;*Bm5'ZEO_@}-}673W\]\Ork1Qs(7G_W^?]_.zVjJm[3Tq7o!s=IRKI,GR2[$Bj9m+m>'VwD;l;Y\uT#!Xr3!sujRK3Gu_W u7omrAra3DrJ15{RQ{$1?^;,{s}>7mE@CRTBXN_i_DI*IOm=Y<1v^AA$'l]w-XzT*CUn5pNUE{'p Wexg)jW>E_D^$^A*T2ez}r5aTBXDw=5~pOnQI=,@5s@Y>NBnX{OKDVoxaYIAY3_^D}~AKIjo}}7m T\a}Q[3xD,{IuxCozwp},kU]Y!'CUnGj}iLQ#u!GZ_<#5BHQ{X!A{B[-=TJ}mI_[WK{Up_ju<5JI __jC1IYxVh.J^i*v$k'Lme+o_Zn,Z{K;e7JpyDKYvNjl^G#vjD?D*e5z>]p@W';7]u}K1wn-_Kir {?p?K_/d_wB^FrGT2WluaE^>kWDBT\Z2[pji#l2[C;Aj#[,=[M6#w5pq^[@#VKp~|Fa7*BxE\-;L z-{O7Um_e3}U7X*snl<_osa'uGkCiZ]je>SfX}Zl_po{Op\^'EpkQBjH+,^]eJ5< meETtwUQa!lC-;v?pR3Ces'ClE5OYjojw3X*vHeeO$OXKITAOD+G\~{U7$H1{#r;'21-G;5*{E+A RYa^z=BaZ{r+ox~V>~'++Exs3z3H{IZzQVw-a/[A{#ut\1EGz2TDl*JDE5ex(,^3VvXa#HLrz}Yh |RUrsExX!'*7JQiGp,T3-=B~s1,';T-{C?*r?e#W,AC$T%7vWX,[mmJlB-TaVHOWYRd^+K\\k>'j \]nm{O5E{DAa{'u#[VO@,!k:U>E}E,\x>DZRpCO-ED!Y*zH+Rv=p+{3GRTAoApjed*Vp>u7\\m,k EpaTQ,>AC2o-el5^5+TEUQ-eJ<=)@_IiCj7(wQ5VW*u!lT[27[[Z12,j@,K\zCBjR}*a,ZEOH^[G \v2al>eEGm=YSDaZ1D\p2sl][xB7lsA]^oA}7pmm@AT^~{\=at%fVuB{=YjJUe}ZHQDCO!Y?U]*p #r=EWoTHa$A,#l1#5e5j#=]@[!K7-j>rTp73E'6KYE@n-fE#+BNY0rr#+[;w?#QIr'eAkUBiwHeZpvzKK=vOp PQl#>#Ull!r#~$!RVN^,]Eemp[KwJUz^;}W7;Jz'-XS~U\=P)mNI|Gx}$=3Yz}jiGJ=Q3$<~mreY VOiR+KHjp_5_-7*7mo-jul@>KTaRV[mj$]liHD_j!';QR[I?T5R@\+,J1B!X5?s\[\~!;J$E,3+$ nGwEYUBV}JN*U;#Q]{ZO,eir,-z-wwzT$mH\[Z]R*XY][w-SQBz>CxAnh-aX,s=H]s~]Gl21sl]H aIUD1xz\{H-^GlwECrE+K5Y?=p1xvU-nE1\]Cn=a};~~CTQWUu5XR2WeT-$@wE{O?Q>NJV!XlOkQm|mjmA-aZ@5+OYT5Y? d!}<{Dv{\BmZ\?rZ3}\27_[IG]#JH7cuDjjpI>~]\ZG-Dr\=z}{\7GGa{DuzO~VR\o=}\=JKl}Y@ QpQrIr<7$7Uj\z[v+zi;eDBB,2zei<;l]E{fl;Xu~iX;@riZxV}}R M8QZ*w7T>#f$WJ@a}[Du5EEuX!o;AJE@+~I4$jxI2Y]VvZmsk7H_]?s,8Vl#RGW-;]GrCQJIlXa[ IXsV'ge3{C#U$#KsI$ApjEWal[lUK,Vkap>rkuxAlRjoC]HD*]mBp'RoJOp2^kwD!v[!*+^5p$K] \JeX+[Vn\??VGjJ5EK*J~kTYX5G}>D3UHBE[$onEH?Ien,IaU@$aDGJ+mI{a--5Z5uG]_G=!++lBA=\A+]VB_#'{Qp\sRN,5QO72_?m^_p iVHDBR~a6QsI7sjjX3a$1mRTQ}wo*DasVH,$#K-Eu},[[ww]XOe{u/k'l'I]x,Xe!G*~lie~W~Aa 3~$5*+1_<>eYTpG,E5_EI)nA<3eUeUCaCkEe<3j<<<#x]!@{x*WU~2mjV>'VJ!Y_Jj+sonflX@]a U2JuUp}G_2J6UT}]x_2@1'}}kj[W&^V~\FDr}?\;O*"B-'[urU=*.uYTBDOD-+5;[2\\YiQQBOxO T2]_J>E3lArw=vR+TW `endprotected //pragma protect end //pragma protect //pragma protect begin `protected MTI!#j)2zBXW_,'#]nWr'21.G@[V$u3?/q=[k[xmViRiz;_bQI'TnH-H$_#T=K[Ge1*1G0Y@[r1p @}qC|z3C[EfkQ'Be-e]iXa[zx^QI}VCX$sD72B*NmzaUQevW?rkUP[DYk'H^[D@VKurj=OQ<3\Ij iPiB#zCJ*![@WW$v'pi^HBf^Q5[QH,ul,[OdQm[l[b5#+3+jD2Ouop_!VpJs?vQepRVQx}Y*a#l? IZ=3ukZs_'uv3jO<1R3'BmD3yR5jawOm!)~wY5vW~lR@11f4l7]lIi+mP+Gu_@]UWB3rplI3ug3CRUwVCK[* 2v$?JK*+e[YV>$jQ>@O]%;x={}3YK./1In=G;;Jh-1TJ'@C-$N~oHxmUuOyZ'XwIARpOC'2k{r=] {2mDE{k*CE!_5,YEI_UVzDo}2vOz)AGDw__BEb@l>onaIQH+<#ZY]ieQ<DvTun[Ee#C#_5[;-j}*#ZH-Gpl3WA7$_wZe 'Az+]kppx['I[KBs#1IpC^e}u>=KX__'[kE!YunvmD;Ev[XUxv[1i'/E*[,!AD]#-I;LK}i]OQs@VsZ}=I_ZkvH}eWvDV_$1}CmWwrCVVY-2%fPe3[J x*H~jonX?evnWxew~jnk[-}7_T]2@UI=xJjQp5Tu;jE}O3'\?Ci^B&CkK}DT_+_izOJIpW4D[Ho' }Ov61i=]h-eHTKr~vw#MY!\UER+G1;H@VmZ?KT2rj[<\-$nI]jlB\^IkRYJwsOWE5p_HDxiZRl[UA:fvI$}7ODIj?eJEe@z=fTwex,Z;+$1jUE V\XGirExsB5lImIx3<'+$CA}{I~@ssB2<=W!UW5"|(U&f]p]{>X'e[Y_T]5[+GZQ>[j'5G~5ejks\iCjD'DplwwTYUn!,>C/!xj1D-x!I~\uLe/!Ao7#'_AXH{]NSrY~Jz*J15?eXj pHrd$3DV~TYm$@\}z+eZUOn-u]aEQ>Q>r\1T1eEQ[3EW+O7,*rR7Xu^2HC~-xC$TkslDiK[O=vvC}k+Gze;}X# z!}x-+A;Xv;<5B;#D?G-UW*,@4Zw -C[kuplDY*]_{EJv3_E+HWiaZB[e-UrDXBK_}p#^$G{T!s]*{<3pGpQ_X-nX+IUwaxaDQrQrOj?U C5m5;\4uT=2^Vs{Exa'mrY\TV4Njl$!7r-u1*Wr<^xa|vVj?suB@b ~{wzRan,er$Qt?{I=^2AwJ-h-j-77}\C#Tv'U7QB~=m$z7'OOux5[SQD2@1n;Z57\!M$?KZVo!o]}QTAo{C'jV@]GDRY,^H!'}Ya!zzl>,TRO}_R!k<'xm+_* $UvA:%jxpp@zrk$B]3J*!}Q;OI1k>Dz'*ea,;;jomb.P1{_^DGf7?+U!pBV={ap#%pm*\+pI$E@T_,]$_O*=GW 5~mW}+>s#I^'e@WrTUr7Xse]CkzGj!*-5BQ]j7zu5~xHl7u_%QiK^,~7AKh6"Y5H{B6snorH$xlF _3V*h~{VGfrCasu1CC7Y@7oW__6^5'[s>p]C3}5H[UU-RKB.!^B,:7>$JUz]xkI~U=[lp~w[}~Xz Bie3IXeO u1xe^C,n5OJvr=i-}uDHo@I5>#JDwzBmUAAo ,~i_ir(w[[/B72ZK&U]n}Z>v~[_aX$v'#^n)U]VY>=OQ'p>KsJRsoGp[CCT1]\\5~=kX0Im~5W]r =WEA@'p*K+rQ$\^,pQV1eE]Gm@Wk-s!>ouziGzZ;XxvZ[-pPyrj_@{Hx]D BiAl?IWxlOaXxOEBuX'#_]x$e71-QvGsQ5i'u'ZK, }5}E-QU~^Y5iI*vZ_=rV1@9}YC*EAT](cB3+2,noogfp-{,F=_5Uf&\~\irQZrE3-VQ[**\~s!nE~H7X$?)K7o{V!'k1?ApDE2H'R{>FHG3lk DX-'ZIk@TR2^}DDOU-p{'1}+=!W<5Y]'H!>i[{[VXD{s;7r^}\-'Ozuw7HvWaWXR}xnV3$r}Vr^= D;]BJl-zuz!5A+p2v#$~l!,v?T^{Bx7i=[75uZ>]1T7,1ZExWI's\;=jk7{RwDw}'5sFl^e'GuJo @x\{P>-3O7}Qk~BA1-,]VC|BZxXnRXOIO^'z;vX1tCEInpj#V\\Dn]z3aY$$*B.EW(i*CQoHo{;1 YOZY-XZs!~%'eD*V+m[L{IC4U=Yn&GYk2,i+@o7n#<{}rO@$\-{pJ^!+}rvajQ>EpH$#eA'2,EQw ~uUwxpjKZms>Ds@;QQY>we#Rjj{m}s]j~l?!Y7eB2-v'~c}k]!$^7]{nQ,~R;xj-^,z\zAu#wI<-F;{7;l$mHmT!1I@Ge))Hw=H}3AwoD#rHCX[DQ]#axO@$l~!\Cp7G*2>^+'\]K2Q 1Zo[i]r#lQ^+="+C@C]Cj5vaXTO?!W.}k!OD8pow[@jsoMk^T@'@=uh{E7T .=-5V=ZoEopW3sv6eZ\2@RKY?]kX3wQojpU^3n*BO-~7ouV@@>4[Ip=s2u=OilV =Tpv7?*?0hmVsuqB#Ue=@Gm?1?z]rA[Ge1'aDKG?'XZXIWW];B@oA{;G>nT+<]p}*nW_5YC]yv1e {Ik\,K=#l]m7$wDn;;o1[$awk_]n3Ws$T|'IjXma~sE{Xow-}!mX${!TK*O7Hu7E-]C7I~O>\1JY*YWl-{kOwKu6l]O7,A;*BTEja5;g!s-IP+B![BGjAHaWChYKK,<+3vuoAX,^ >X5G!}{s3BK'sZw#E*l_ZwxYH~{v?}6*tpa1p7moQD1+syl,1wT[ei1#eJ5'G;XOwox25m71'm7u,n$.KQx$R\ }~X^xZK+!C*?~\,a-$C;!o,D#T\^7Uown-/H^Qezr$RIOZxzxoG@='lvA*;+RJ3[B?sb>^KYCKee 'Kmn7vJUHlZ[.^1sKe[) `endprotected //pragma protect end `undef IP_UUID `undef IP_NAME_CONCAT `undef IP_MODULE_NAME