From 7fe9c621d59619140b5d1bfab1fd2831808490c1 Mon Sep 17 00:00:00 2001 From: cheptsov Date: Mon, 7 Sep 2015 19:13:20 +0300 Subject: [PATCH] Moved from its repository --- simple_plugin/.idea/.name | 1 + simple_plugin/.idea/ant.xml | 7 + simple_plugin/.idea/compiler.xml | 23 + .../.idea/copyright/profiles_settings.xml | 3 + simple_plugin/.idea/encodings.xml | 5 + simple_plugin/.idea/misc.xml | 17 + simple_plugin/.idea/modules.xml | 9 + .../.idea/runConfigurations/Plugin.xml | 17 + .../.idea/runConfigurations/Tests.xml | 31 ++ simple_plugin/.idea/scopes/scope_settings.xml | 5 + simple_plugin/.idea/vcs.xml | 7 + simple_plugin/JFlex.jar | Bin 0 -> 193380 bytes simple_plugin/META-INF/plugin.xml | 60 +++ simple_plugin/SimplePlugin.iml | 14 + .../com/simpleplugin/parser/SimpleParser.java | 104 ++++ .../com/simpleplugin/psi/SimpleProperty.java | 23 + .../gen/com/simpleplugin/psi/SimpleTypes.java | 28 + .../com/simpleplugin/psi/SimpleVisitor.java | 22 + .../psi/impl/SimplePropertyImpl.java | 49 ++ simple_plugin/idea-flex.skeleton | 251 +++++++++ .../simpleplugin/CreatePropertyQuickFix.java | 99 ++++ simple_plugin/src/com/simpleplugin/Simple.bnf | 23 + .../src/com/simpleplugin/Simple.flex | 46 ++ .../src/com/simpleplugin/SimpleAnnotator.java | 41 ++ .../src/com/simpleplugin/SimpleBlock.java | 57 ++ .../SimpleChooseByNameContributor.java | 33 ++ .../simpleplugin/SimpleCodeStyleSettings.java | 10 + .../SimpleCodeStyleSettingsProvider.java | 47 ++ .../simpleplugin/SimpleColorSettingsPage.java | 73 +++ .../src/com/simpleplugin/SimpleCommenter.java | 36 ++ .../SimpleCompletionContributor.java | 23 + .../src/com/simpleplugin/SimpleFileType.java | 39 ++ .../simpleplugin/SimpleFileTypeFactory.java | 12 + .../com/simpleplugin/SimpleFilterLexer.java | 19 + .../SimpleFindUsagesProvider.java | 65 +++ .../simpleplugin/SimpleFoldingBuilder.java | 65 +++ .../SimpleFormattingModelBuilder.java | 33 ++ .../src/com/simpleplugin/SimpleIcons.java | 9 + .../src/com/simpleplugin/SimpleIdIndexer.java | 17 + .../src/com/simpleplugin/SimpleLanguage.java | 11 + ...mpleLanguageCodeStyleSettingsProvider.java | 43 ++ .../src/com/simpleplugin/SimpleLexer.java | 509 ++++++++++++++++++ .../com/simpleplugin/SimpleLexerAdapter.java | 11 + .../SimpleLineMarkerProvider.java | 34 ++ .../simpleplugin/SimpleParserDefinition.java | 69 +++ .../SimpleRefactoringSupportProvider.java | 12 + .../src/com/simpleplugin/SimpleReference.java | 58 ++ .../SimpleReferenceContributor.java | 26 + .../SimpleStructureViewElement.java | 72 +++ .../SimpleStructureViewFactory.java | 24 + .../SimpleStructureViewModel.java | 32 ++ .../simpleplugin/SimpleSyntaxHighlighter.java | 52 ++ .../SimpleSyntaxHighlighterFactory.java | 15 + .../com/simpleplugin/SimpleTodoIndexer.java | 12 + .../src/com/simpleplugin/SimpleUtil.java | 57 ++ .../src/com/simpleplugin/icons/jar-gray.png | Bin 0 -> 729 bytes .../psi/SimpleElementFactory.java | 29 + .../simpleplugin/psi/SimpleElementType.java | 12 + .../src/com/simpleplugin/psi/SimpleFile.java | 32 ++ .../simpleplugin/psi/SimpleNamedElement.java | 6 + .../com/simpleplugin/psi/SimpleTokenType.java | 17 + .../psi/impl/SimpleNamedElementImpl.java | 12 + .../psi/impl/SimplePsiImplUtil.java | 81 +++ simple_plugin/testData/AnnotatorTestData.java | 7 + simple_plugin/testData/CompleteTestData.java | 5 + simple_plugin/testData/DefaultTestData.simple | 14 + .../testData/FindUsagesTestData.java | 5 + .../testData/FindUsagesTestData.simple | 13 + simple_plugin/testData/FoldingTestData.java | 11 + .../testData/FormatterTestData.simple | 15 + simple_plugin/testData/ParsingTestData.simple | 17 + simple_plugin/testData/ParsingTestData.txt | 63 +++ simple_plugin/testData/ReferenceTestData.java | 5 + simple_plugin/testData/RenameTestData.java | 5 + simple_plugin/testData/RenameTestData.simple | 13 + .../testData/RenameTestDataAfter.simple | 13 + .../simpleplugin/SimpleCodeInsightTest.java | 86 +++ .../com/simpleplugin/SimpleParsingTest.java | 28 + 78 files changed, 2949 insertions(+) create mode 100644 simple_plugin/.idea/.name create mode 100644 simple_plugin/.idea/ant.xml create mode 100644 simple_plugin/.idea/compiler.xml create mode 100644 simple_plugin/.idea/copyright/profiles_settings.xml create mode 100644 simple_plugin/.idea/encodings.xml create mode 100644 simple_plugin/.idea/misc.xml create mode 100644 simple_plugin/.idea/modules.xml create mode 100644 simple_plugin/.idea/runConfigurations/Plugin.xml create mode 100644 simple_plugin/.idea/runConfigurations/Tests.xml create mode 100644 simple_plugin/.idea/scopes/scope_settings.xml create mode 100644 simple_plugin/.idea/vcs.xml create mode 100644 simple_plugin/JFlex.jar create mode 100644 simple_plugin/META-INF/plugin.xml create mode 100644 simple_plugin/SimplePlugin.iml create mode 100644 simple_plugin/gen/com/simpleplugin/parser/SimpleParser.java create mode 100644 simple_plugin/gen/com/simpleplugin/psi/SimpleProperty.java create mode 100644 simple_plugin/gen/com/simpleplugin/psi/SimpleTypes.java create mode 100644 simple_plugin/gen/com/simpleplugin/psi/SimpleVisitor.java create mode 100644 simple_plugin/gen/com/simpleplugin/psi/impl/SimplePropertyImpl.java create mode 100644 simple_plugin/idea-flex.skeleton create mode 100644 simple_plugin/src/com/simpleplugin/CreatePropertyQuickFix.java create mode 100644 simple_plugin/src/com/simpleplugin/Simple.bnf create mode 100644 simple_plugin/src/com/simpleplugin/Simple.flex create mode 100644 simple_plugin/src/com/simpleplugin/SimpleAnnotator.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleBlock.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleChooseByNameContributor.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleCodeStyleSettings.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleCodeStyleSettingsProvider.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleColorSettingsPage.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleCommenter.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleCompletionContributor.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleFileType.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleFileTypeFactory.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleFilterLexer.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleFindUsagesProvider.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleFoldingBuilder.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleFormattingModelBuilder.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleIcons.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleIdIndexer.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleLanguage.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleLanguageCodeStyleSettingsProvider.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleLexer.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleLexerAdapter.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleLineMarkerProvider.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleParserDefinition.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleRefactoringSupportProvider.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleReference.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleReferenceContributor.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleStructureViewElement.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleStructureViewFactory.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleStructureViewModel.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleSyntaxHighlighter.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleSyntaxHighlighterFactory.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleTodoIndexer.java create mode 100644 simple_plugin/src/com/simpleplugin/SimpleUtil.java create mode 100644 simple_plugin/src/com/simpleplugin/icons/jar-gray.png create mode 100644 simple_plugin/src/com/simpleplugin/psi/SimpleElementFactory.java create mode 100644 simple_plugin/src/com/simpleplugin/psi/SimpleElementType.java create mode 100644 simple_plugin/src/com/simpleplugin/psi/SimpleFile.java create mode 100644 simple_plugin/src/com/simpleplugin/psi/SimpleNamedElement.java create mode 100644 simple_plugin/src/com/simpleplugin/psi/SimpleTokenType.java create mode 100644 simple_plugin/src/com/simpleplugin/psi/impl/SimpleNamedElementImpl.java create mode 100644 simple_plugin/src/com/simpleplugin/psi/impl/SimplePsiImplUtil.java create mode 100644 simple_plugin/testData/AnnotatorTestData.java create mode 100644 simple_plugin/testData/CompleteTestData.java create mode 100644 simple_plugin/testData/DefaultTestData.simple create mode 100644 simple_plugin/testData/FindUsagesTestData.java create mode 100644 simple_plugin/testData/FindUsagesTestData.simple create mode 100644 simple_plugin/testData/FoldingTestData.java create mode 100644 simple_plugin/testData/FormatterTestData.simple create mode 100644 simple_plugin/testData/ParsingTestData.simple create mode 100644 simple_plugin/testData/ParsingTestData.txt create mode 100644 simple_plugin/testData/ReferenceTestData.java create mode 100644 simple_plugin/testData/RenameTestData.java create mode 100644 simple_plugin/testData/RenameTestData.simple create mode 100644 simple_plugin/testData/RenameTestDataAfter.simple create mode 100644 simple_plugin/tests/com/simpleplugin/SimpleCodeInsightTest.java create mode 100644 simple_plugin/tests/com/simpleplugin/SimpleParsingTest.java diff --git a/simple_plugin/.idea/.name b/simple_plugin/.idea/.name new file mode 100644 index 000000000..316279c80 --- /dev/null +++ b/simple_plugin/.idea/.name @@ -0,0 +1 @@ +SimplePlugin \ No newline at end of file diff --git a/simple_plugin/.idea/ant.xml b/simple_plugin/.idea/ant.xml new file mode 100644 index 000000000..2581ca3fe --- /dev/null +++ b/simple_plugin/.idea/ant.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/simple_plugin/.idea/compiler.xml b/simple_plugin/.idea/compiler.xml new file mode 100644 index 000000000..217af471a --- /dev/null +++ b/simple_plugin/.idea/compiler.xml @@ -0,0 +1,23 @@ + + + + + + diff --git a/simple_plugin/.idea/copyright/profiles_settings.xml b/simple_plugin/.idea/copyright/profiles_settings.xml new file mode 100644 index 000000000..e7bedf337 --- /dev/null +++ b/simple_plugin/.idea/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/simple_plugin/.idea/encodings.xml b/simple_plugin/.idea/encodings.xml new file mode 100644 index 000000000..e206d70d8 --- /dev/null +++ b/simple_plugin/.idea/encodings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/simple_plugin/.idea/misc.xml b/simple_plugin/.idea/misc.xml new file mode 100644 index 000000000..1035ff89a --- /dev/null +++ b/simple_plugin/.idea/misc.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/simple_plugin/.idea/modules.xml b/simple_plugin/.idea/modules.xml new file mode 100644 index 000000000..c6008778a --- /dev/null +++ b/simple_plugin/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/simple_plugin/.idea/runConfigurations/Plugin.xml b/simple_plugin/.idea/runConfigurations/Plugin.xml new file mode 100644 index 000000000..da96a36dd --- /dev/null +++ b/simple_plugin/.idea/runConfigurations/Plugin.xml @@ -0,0 +1,17 @@ + + + + + \ No newline at end of file diff --git a/simple_plugin/.idea/runConfigurations/Tests.xml b/simple_plugin/.idea/runConfigurations/Tests.xml new file mode 100644 index 000000000..78f9481d0 --- /dev/null +++ b/simple_plugin/.idea/runConfigurations/Tests.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/simple_plugin/.idea/scopes/scope_settings.xml b/simple_plugin/.idea/scopes/scope_settings.xml new file mode 100644 index 000000000..922003b84 --- /dev/null +++ b/simple_plugin/.idea/scopes/scope_settings.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/simple_plugin/.idea/vcs.xml b/simple_plugin/.idea/vcs.xml new file mode 100644 index 000000000..275077f82 --- /dev/null +++ b/simple_plugin/.idea/vcs.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/simple_plugin/JFlex.jar b/simple_plugin/JFlex.jar new file mode 100644 index 0000000000000000000000000000000000000000..8bef2fdbade41dad89b438eb73f7d8343cb8a4e2 GIT binary patch literal 193380 zcmaI71ytogu%ON0&fpG%ySof7!{81VcXuw%;O_43?moD?+r{18{hzn{_U-$3&)J+* zrMvPa>F#t+B_~x1(h!jFU|_IdVCjAV!eIYxfdhjClNDDHW{{GTVEP;b15@}<6c#M) zA9{Dg_2m2y_x~pt|Kz_=Sz$RT32|i=Mp=nF*@;>Ps9dh&lW$p6I{*g88KI9dHa*nh+JpXW0JTKqpa#Q)-)O`M#a{vRaVKhn~` z#X!#pX#fAfQ2#sT2()#!urc{B{D0n^V;@-gODHg~P6RM8wEw!ku#vNcoh_r0wSkip zP)*Ao-2~&4Q!2qGeKWb32CLREh@GY?SDPNTkfg{jR!D11{D<{?k!Jd3urq`T>R*B9 z(};d_{?bTfl(;xnvgnkXUR>e@t{m?r+=oSkhs+I=j=;IJ&o7_Pk7=H*m#LzUonCCc z-UwMYuF!`OE>iyn;gQr`WxtdYu*4tlBN5z3oz0Dn7(FuIg_9%xR{YJxW}(Yp2<0)S zKeH~FIK_4=tK}y4MJ3N08yDAQ3~Qw~EC>}qbwEWR)y2F4fT=@1H?-A>hDCyrFy!)- zS=|L!;wCtjmAeTGg8P%5?3H=H>tCX5sA3+-m zD6_Vtk8>b;g=~!6ABv_JdOScM4RdB3Z$SbFgrJWG0GI!K^YgF94L602Wj#8GxYd_h zGKC(F3NN2L$M}&lCVuokm?H`9eBJQRRpxdcrR*-qD>|ky%BDjJd1S zqS9M}MPe~6Uy0}3R}0(w-a)U^Ho!I(9Lo3@i}@SjY*&&9a_Lc2 z7cBnED2x~bGws1>^9bdXAKQmhZ=scEXs{6MXVY1;P1H!x<=DQF~IkLXvOQ}C=_w~#uQwO*$LiG zzlTw;6o=Fq->$7Nrbe&;mG!WSQ=QE>EM?U~a4$xzW+V@5w=Ju?nNM_lWnj*FH!lkL z_<#s??E-sMyXK9!{ezXnTG9@d&rNC%%%W`%(E#!d_f-LQFZIVzTh8q|>-`-6nymP2 zdj6tVU|ad5 zi!eR>Dj_FTk?m2_+O*(B56jQ*YI~aZXjjuWzP-@#T5{~N>PYHiVDNthh zkK=Qw+#94fMd(z)QTQ35?`$(V?OL7)4>u)v6X5}_@r5%#Q7V3&69uL|G4j_vlbSyb zF0G6An-%Xe0{CWytgr;m#mOAahYi~K{8LVvhgtnLR*b+yQxzcZ2K4!h$2*(HE66>~ ziS4yrBDiKYHx9e~ir=ntT0?r4S)_~+mB{=;f%6$A@Be>yiD#51bqsFQ}Yn6!-8 z2E*bwQoMBtr-*Cfn}|8}j>N+7RZ{Q_`Dt17`QnyMQ$zwSvoFY?Dtuy_h}dM3XIV0J znHG}q+zYks$NDS_7k<&YXUUa5m)+tj)n!x@L2`FnLk2>=;}r*VG{Syo#4WKNR|J8p z3*MNkHgG~maKgS)Lh7cD3(p7|h^2tWEfu46e1L2pN&TRPqe?;Y1)&QXAT_Wj!LV~rWM%gU|E`AAiW;eP z(0Ef4ippQQjJG)x#@$qWCs_POxV`wh1v;N2C0qMM3op=^dYezsvlTn*Eefl5r z!JK2g${Zb8(EiMVaSKFFG)R`WjkG!1!@9dN^kOA^Y{%n3PhCaeGBRYt1^1b!_S#WK z`0kNw?qws%r5inFE7R`$8Bz|^Jf*PZxS;cd%F}By>g|eBf%5RyfqkR$<>;vy`5`R+ zK&AOPKB$qhmxoZ3N(3tPYI{$sQI}$&T zzMzw^v{2Z@VWA`I(N6iWP-vE1XOqhU^DfKwMT}SZrL_53;PC3(#bAKaMo|1^uIxWN zcvjkfW-&jO_Vw+5dA$GW9Xj3K*&!Igz+NoCz<&IfcMw%oAeS+5Q!sFJG9fqkAFjgb zfBK38FE}p@ajd6`?91x%>}bRn=ASXNhu4okm3x}T!=X-8zg;}Nd5Zv-Z%)6WJswU~ zC2z;Nv;Sbxb11*jSmP?%Z%h`S-cFT$fCLl=7zi*Ay_OOq)!-=6(6-mLi>e8;l%!nw8>B; z%WXl~v8%^wW}AdHJ6=LA{Z|9j_6iFNe@eVN-hQg}p|YbNw7cn^e4=)#uzG_7Dh0OH zOuw}@DNzc%1>^k4!9Ki1^}-0aBPNBq)~JXhQpo2%;HFiMzZ!e}YhnaRWEY>NO=_eg zG;R@tcosy^pfsFyPkDm8Iek`ljo6=kBL$I_SOGCCx7fdlmUA=tdq?mjZU^6+@Z94o z(LJiL#TX*3^^M6WqIBK0iX!;JvV zI|nX)I>^fhyNLYALhL;~&TatSM|#vX(yONTw_|ENG4)Fvm`!D6X%!OZcl*Rh z0swmERwp@kH^v(@TCLhtr8#wZnYlG0C)#!3Py~Q4E|?S23}d>+&N@qQ^Sp-zC?{?r zN{GBFDq0ZLEM#k4ZVn%9k{^UxY8HI&Vby6ZIlP!V_Cbl6eJXAlh^{1 z8g2-26chPWe|ZXbZYzZqh58DV7`oVNi_T~$B{DFRE^9|07N4eHq6Z|&0{d)Y~3 zG$O1-zKhzxa&j)S!+AOjRcxPfvcq}P;tf`Gk#J*IG2uj^EWyy#GX4C1z+mpe?&Yjr zu_nd~TTZ+9h!LZ^QqHMu?P4zj$LPA4ykVCb3u>+n2Yr0DBu-V8DI%PD zM-2B9D5v7ZMOcy{>=Zd_8Y`e-9Ub1GS}03VJta5cq7of`x!D9e?axUfz$)7Uh3X^5 zM`zzhC+UYdr>;)WnK`nB#838eoT!m>ykeTcUJ&j`GMrI*LThR85qof<1tReKJ&FG% z=CZ`zF35Df3$srlbl^-Yukp26iIP`?IJ+=JEkv*qv5)}fVpqBY0n?h-mWvNNHJmO$0e_I6qs z9i7GYkO^3t_YzWaQE`o6_{_jR*mHzd1{)<|IE8`G3-(;Sa+9H3c}-ja?knF^8iK55 zXH2v3LDfzHZBt63MsDQB-zrvN$fWmq51Q^Q=n9zXi z(yI3DE63*O2}83W)cgg2XROsoq){*yyb;$jCl~Z=JJ!85e^I2Hdi2};K)oc0gqrB& z$M^Y9H)<|se#MO)QTh`x7N|}hOQix>dPwczLA*#Z#Xwo$!v${eUfUI<*0^ zfT}xIkA|l_!6)A5WIq+MU2H%U4JE>DWH&D~gjR8({A0DCzn~V7k~#o%gVP;K3PsKt z(VTN0r9DxpKZz&Io~MA}4}ljWMD?Fot!_v;c0P&Mx($^?#H$T}5c}@#02e);Sc*|0 z?NF=reV`@4c43F*86kVXCV`xgD1>U}3bZfC%MW*^aQ3JfgM5}J9)eV>7@~8Hm*mx+ z_=92>t0$mE>AFNIo{>VD1}E9a$h|DFT>1}lxo<=;yBTu$)GoEUf zX?Pf@b4n)EHX?zfufr?utdGV@#@($;FR7<<8WIr}{bV>0UF-lX>)vJ-qV4HlBcSGB z+vI$P7+jAT?Y2LN9v1^z#M;la805fSP)a*wFD$C%|0u!p4>ghq%7mMQRxhH%uXrGz7HOyq`#(5+7!5efaKc(~aLc3%3f**QQSk(!m_oNz zi7P9!b#*iiK!)s>vKEnUk(l~>g=|0ze$LSoC3SX#H%!3-_g81sveKRAPiGz4q_F`b zaKA|BuZeJpuSWgaB|QrMIueb8oTc^s8l)*C&S!C0alKS(*}0<8ISg9aK^?lRB55;( z%cIcYHp7c4im&fG@Un9YGm*`uSv$kb=S5XmE4wDkN$bMi%Le zs_;)0XaJa^lXi9p-T9(4r6$J7c+)ebD4bNX=LL9yA1c}T(!ilU)8u5#Xi4BH5-I=~ z^Nj4bNoL7XucH1kX>zxWw+!`l-+l<9^#L+`4z?<2DeiIQH+M^E;|A(0Gbg=VyooGq zvZ7-;`}+P8wozPWcaUadyF=T%^<{6}zI7&JT$?P&ZLjVKorfTU##^J0-pO@$g@w#7 zle1^IRpW{ln?og)7fXTTObkZ*@O5YiwGiZ=!ZBHlqUbHA?3XUb4^f#e#Ts@4?ghTS z>WeA{{Ti=TRpMe=&u8>S5n?dr?{d?2FwlHi*u61|lP~44<`;+l9AX5AE-U1}o47ce={T)`*^enJ1khb!bGjGtELWggViEu>xl=Pn*K zUpU3SaU5&Fn*nD)UB=v{!TiV%P9=-^NiYQb!0DYgPJ}ro5 z#~HoF%!%3gj|}2sKye2KXH(~m1l=h$o-TJ+X<=<+qnEQmoIOetr3PPtMR6;DM8zPX zjafVoAEA#UJj3nMZqw^8A@UEZ$oPUYJpVydjC;Fv`6bZydvT~y!x+3n6Y6E5q_&le zj`FX$x!w9(-Gib61nFx|YdYEs6P58ng^I5x9hm+r0@S{_`Wv#L?cN>csc;e-M?KDx ze1k_wvaJUfUo!GVB!nb+9Ja#NQnB-AP;qP#;a)@traX~)bWv+*rCVriTJP$bN9RyO zN$~vZDg$frVj)&{BlcJoYi1RbtsG<@-E}5IAgBWX5JC-W~h`u0z5Z7B3&5x?t z_Jw9_-w`+gkyUF2+gZi&(O2Vb-weWio7BthT~ zE3ZN~;ev_-j0HApmC;ag0neDU1ED=CUX--&;xni5fY^@O-b~aC+}OB+)lFV0Ks%|P z_p=$}!9;GP$k0$lQH#Ph8D~YD;)@(%kuv~iC7Rzd$Mx4#`sqaWV;=48r2kZfc_{}h z@BLa>+?%k4yr zJM{CIpw()xX8EgZ@&MMxig zX$l0>rDmf^LuL<>0dw{#bfe9`jP7Sbw%^1pzddlROhRU8+tfyIP>HX&lbySWW&7uhf~e^3G;=ZSh7 zB_kWi4ByH~)>`tZTzxkqkDb<1KL?HkAXGf{z>1v(-)vI$|bk)vm`tb;j|B zm~bV>)Otl7S+MIRg|R0uWW zAiZohGf)kE zP`=Qv(CR@jjV$-m-A2{Q>mufiwe%RgxQOf@43KPz#~*k~b$JQmQVaf)7(+>*xwT|f z{*yV8upD1;@UXAuPNqp?M=C!y9e;FiG(zOgx60K0t1C{A0 z>b7GJ_65SC{ymOeRDgOiNieB89;M0F%)-E}-{1msU3;Lk6P`~ILCQ;?wFS2fW)XIp zA)_Zuc#;Fex-zFe)Olh1OZ>x?73cfpOdEA=39Xa0gwGx@_`vhx>K8(R5SR8KzSfw7a8YD2Ae;cne+R z9Ow)G_(fh!&4jwuUbPFH(gz~_ogp~q>WA7Vs?vVW4=n-kjeR|XTrZ691D`%IsD7MB zd1aNC^lTq8@>P=nA6>t5G01i;*NZ_z;(J6_&Zx*`ClsxY1p$*v^y4 z{`Fhe;{F-nc?m6<0^Tmf+uY-5joHd2+=p?5tHUWo>H>(?d@a}Iuz(t{@h_yAQWOX$ z8|BWAR~;6Rmn+A!{!U&4=98L>nVaO;9n%Z~BD#TLU^5RQ5e-7xqp@=Vr#h`PRP;QCX%CXx8+vb1_yVZ?8gusi zt+C2ZAQ>3ebjDWrujY$u80}B(2GR3C#$>EtsF)?eO)3SZ=p6kXWPuM7cHn}$w!V!l z5=b}m@W%aPK`+I1NV|CgxMh=;>hq`1EsN_LV#NjbB2G`i+(jsmiOTxEbHq~$&_ZEK zzSVrNw28_F&8#?wv?ch5=SJl?tfT>JJ7mtX;F!!fI!=P5(-P?r_TQtpu^ndzV35fE zM4A=27jF@ci4X1D_}>4Ojb$-mFlK}}{OgQKeOZYV+ex&(k`us*SQ(;Sd1%ly?lCfK zsb1-#g|blxf~fepELy`)aJrF>UWh=YF5yR?10{948cUV~(Yf!)ttx;LOh>^Cz}=wi zz(scmVUc(Yk)rZ~_vvRz1X7C+hYdE8E>9rbD)qeEQ3^4dhWk0y-S_l;a}*e;|28f{ zk6x$0J=KLJ?dn_E@r~6EX2cCinlM}gDK_}ykMqa^fWE)>8B8gAn3d?qi#mPkIHg`N z1@4a%Y5F#>uv8}UM~GiNH;@xNXma1Ky(15xeV@rR)C_1KLf^h2%nd;)$TmuybITyG z$cMS(j4OamH)xm|^}V4dJJoKdxBF|fgL5ki4F91&Nu?!8zOV%Qkfi4_GJMBP)?&F3 z(P^Rqd#9kM7W71rCQBxzZw;au6U!NJq)1kx#|1kzpkJ${@BQ~h&4smYKBh~b3PHoI z*Zb0XAw2ZLI+fzk6?tcpY1jLL^}m(F^R^eaRlH6O3>V%C?DrZ*e^AJ)?Gw zZ67E3>V}YM$A0*2jBQEaR*p~n-6~?F2ieA z!zfMeN>@iOW&nJ{69H07woK$~49@RS*txj$ofCk*m1s+;#VdVspKJzxWFckkR7S?M?%5g9$z*IC;r0 zX@5l{N(kg4MIrJcu&X#bckCNPCS)@c1rz#)Pp1tn|EyYsn2>iNfhkmM&p~{8D&{lj z6fMu2GeY`9f!c{Sfhz50ticyG3{=|Na_^I9%|}^9l4ykhY)>HnJdWAs5qMSk5=GK( zC#bJYX7Vbr=6UAq4W!8<7OoBo>+{9epTiPu+R0L_N?2=$;P8>$S6Hk2pR2hm(oDOA z9z^9u&9?-EdzbJP5RIW-&B#8uWVZXE{0+~wAL>xox8i2?i$W@yl4`nQOGm!NeV6jl z3stKJOf7u9x|Y}9_&NjqR%Z$+f}A}u*uyc;aKB-Qo+Qm=4RlMs^!9DtBxd)U%;@ho$JN$2u=fnhj)22SoBdQzl?B8v7uKgL6TNgZ zn$iy&KS|z7CQHy6ruhfy277gzi2PR&FTq0O(J>w1>|B@RQF0z^t|mlk1sx~lzcz@! z|B?3kDBL}p-OX7S7uibhOEBerNH|$vUHiSJL%uCfshsLkJpVy#w|i>-_yskhDYxu% zRLD+dx(S_1*mPx;`Cf?i&efLz=V{0hNI%OahbE2K&ND{b9`@%bq{I@Hn<|1Z-ip$` z2|t(dcj;DK^Q?>if2@!G;#B*9j=*)000|S*%vzb9RY}*!vs3@D%C+<5r?uj?aGuHjZrl?qZ&569Co9 zPh4h4S9S+k-Q95GP3gU>Lx|PpY^`f)y%+ORA!^U^g2Q1QfHQe37pQf0-2lc%Y=4b)KgrlcG(yd>tV~n+L-H_49qQ) znF%@!+V+)B=$R=l;hR4)%w9T;sU}_jQ0)Rzx4^Lj%f6gg^j5&JZ2}{f`zTf} zyHFW1D`vn`(rU&B&5mZ&##SNK^|w3bI&-0_(K?6ZQEOb7222sO8&IotfaeT#9Rmw9 zLHcCcR33nBkGlu6fJLNnA#I=Q!uDD3c?k`2?v@_Ig#E)VYjpZF!{{widysxRS5H;& zey7M&JXUKJlx@rXf$pUVU2eAnyuP+p`^2-Lrf1OFcwf>1gZ(h=j90n&dYf;8>aZ?* z-6a5eqNKTJqnI1J?P?YFsXFKlaDmo*O8lW*Mlp+f9gfZe$vE~gVuD_ox%)>Sg1;3i z^}_ex1JVEMZSS!g^wj@rcrcoe;9tFDEA8k!{7OADho{>&u3EhMXEm2W;Tzr)=Myr{ ziPY1+XM6vzJ0GJ(7%c*@F-_wvN21kSl~{%`c1NKy(j4l={aDrruY!qW?J)ux35(d> zL zEn@05Je1pHK_%;q-i7o{-%Z-Y)h_E44s;_#+otD~+qUK;-ACr+-B%pbZ$pbjG;PY1 zmNZPMtr&n~3CV+F9^(vS^T}&TvdNx_X7tlE(|~5WHF_r6HHI2GCXFs--NyIa^TzkW z^Lheh-GuqX4aef!rqh_>MVBuDn^flBcwQnd`fZA~vfSDa7eTC_IFNiXm!gjUHv zEUO3U6j`Dy<~j0IT`OzwN>XKzo zr4*-5r#Qe4KzUbba#>9U`oh(M)G5m8>Z$xG&ne4;c6xEPB-`STNyU=+%Tq*;Vu0-U z0)SVls^Gx#XQ#GJF2aJla~^NbW}&Xoaw+y4@YKXPz=LNaUso8V6yccawCO(9gYZM5 zGrMg8UnA0kEkZe^R^yHj8oxw{r zVneHikX79W#mDAXNKbX0egXC6da~05ZT00FH{j1{6)iVAAOvx_?LNop{9n0^KKzBM zceDqdKUuH*dd0R!bc=*uA+KmYnj3?z&lzK$!PwTs7d@^x6Q7evJTzc`SI~Q!JUN)C&kPEODqb z+ZKfb`BbZX3MO88nl!r$UCtCwXMm>*%4O15A{!opr?VkSH3DHnr}Gw>0uitG;_Qlg zA|J0d?6P{o^AFuKh~8|IbFMSi-q@3~Pczyd%oq7z0gp2=GufPSo~vGsEetu2bq^&a zE5S2e%}Ssx&Lrg8ENK`J){L?Z!U=BknR%QI522xFAl4e^d|q?P3GiqWx#C+*MqYiTmTQ zMUgi`RsC1eRO402`~}Pj;+uLS=o2C9;(DGZ8WFTTQXCcC)i}zM$jMhc(-!?B>xesN z%2iv2$$4Fv3AirHlGt#gtmk`XwSH=gxyPh>{cx$I8SIo%dmZ7=Za%C)+PE^B%Y zCbMQHBr|7raf<1fY^vtCU@GUth%rdu@>FEGwS5*#UA}!5Nb3z!mCA9DEtzgBKe?+m zZJz}4Y+M4w^qd(=nA+54Q*`i;<(6IA$D2aBc03X;T{>l-T9IeCHn3iswTiAfcs?rD zWCfi|=07gIJbHfm{y7(j_;V_d^0}cS+-*Odr`OJutJhYOx7BV}yw!G9xYeOPPrSi! zPkd=}ul|JWG4O%*G1!^%IsQQg@iZ;t@HM7_VzRJjFp)6jEHB{X(azRULgnNJpE}MK z>CV46aaLvkm(81e+!jmWj#Y0wZ9_lUkXhuBZD5hjK)-g!KYsIf2t4~qqx#5cY0xS4 zz%#n8nnibsj56yX9JlXv0MQ7-P@>*Hwai+7f}WH5(9p$l;=tN|g4V@jf~=DJkcE@o zlno!NAp$98by{M;Yh1#^FY4AqBaAB`>haOk=&$Ii#?`8I<`X>UrYB~`erK@kBcqA( zUzEDCP1$q$tBP~$tG9E4tL1a;E2c{Re=p^O?V94&zOoU7{pE(!#*1|()@s(68H8&C zmWJ5%JasL#pp_C$?{m{7f{vugsEx_P!Ar9{Ba{Y&UEdEH#ta>dlySzGaWnM+Bt!L~ zq*^G4gY)uMJQv{lc*7;%U)hdI7V7-ZhV8g); zYX{lp=w+n5iR<7|L&x55gXbPqEzB-e1I%84 z)gD(Z)m}>-@W!t8;l{2Z`8j80=vi;&@Y$!{%$u`$FlD0o)uZ;vD`4fWYsWgn4sGo+ zV@mg0XIl4uW5neZt3ju$W5uc~Wc94;!MeqcZf%dR=kZm*;OZH<&ec0))w9d!`~#Bj z?MLtAXZlQrcj8QncRaJNcRI8G2ZI4TU!p?4fOP7#fV@V}XLfC%cU-N%ciJ`S8}AOL z3%3FG8;Jq&8_N#t8_fwxGTL|>M_uq) z7?+dhZq<51YvM3@_5S7nm7Dc07E#VK+7m@rKRTM=ZdjP!^*(vuhZMZL{Mb&Klsi9H z8QrurZ<4DN-sD}v)Sga)rCUqk%U{nqkxjM}mrc48+fBX`)IY!H)HVez_?UjZ@)0NA zV=~FSCg;RC2VzrD-R|yV2(a=*#r(b;m5xVvIo@X#pmb*?&hUa0WP5QGU~&JJlllH5 zC;gq7NnUqyT6%MYF23c?V${>!&y9tGOoL%GL&l= zrR8fFWv)BbGQJnlvbUH1KS6@0X76y_Ni{cAw@sgn?^0j-T~mU=HBUL?TJJ}9NT1^` z5?_X&i9QrQpzdh9Tf3v_=ck*=&zP5nPrGNVuNp5ayuIln;KACQ$92k_$6d;N_%oeF z(feZKiI*8jyNm9^@)H1J{qz9!d%1#?z2rf1pAsM#FFR1m`(&fhdzCYt58uz|E9vRO ztHPY#E!lq}pELMWGQ9&c$8-oYZ?{ccvNbL!<>T*@-j(#l;LRkM_{s7`|H1slFM8lJ zZGXqas`Q+KtMj6c+yAnR>-5}$`|v&-De)N-Dg7dkyL^|!mV8Hs8*{D4>T+9vTVqAO zha@}3U8>32waol6mnc(HY-(!3-q1b7CO_Xeftt?YZtpHB)>YXJoRz8fhE1x9+W0sh#f|dlWsyKg~xmW!-W3bU*`eviB zqz)?6lx*rjOS$aOy{Ka%;V&JHst!jX;6tRiJ_M4N&3v2WbDiAC!1*1X{?Hxj4@xs3N73&q$uvs+gde_vcAy)Z|fa zTIEp%$WEyOY^FE>MpF*}27&=GA;09HNO2+|0@qYOD#<&jK_i6!oZ|E9XgV@Avp?oAqM0rwMf0 zgLYBZ1AP(JGY$gv*j|kG2-tXU|FjX^j(t?wmbOveu6>l*E`7ANjepd(RkzWy6}0iR zje8WaZF@AlbhchLui4iv?M(L!YNm6|djwn>+Q{2RG;=-CTx6}AHM%;vT3#Le$?eQ} zi+U8kG`Og7zX5&zCBG2TEq^R~rm~IRF(z3BbGL`x1WO`-UoLF@WusBZ$)u!(S$2W2 zOwX=#hFvxpx?mf#pc}dH2Yz`!^OucMVKcK*#0Zt-zB1`84eCo`sMl{X0SeL_yg2!& zkrIi0WwP5c)R%=&FLqMms1ZrB+u8q7j2Iavy{&V%=Ufu#2PH8h3xwDRt;#Y(enxW) zT?Q*}t8&9;b|OfNIOp^yT?YxfLgMX63l9UiQM%Ba`H9B1tdEiaKN^9 zOQ-Pd7q-WldS|a7;k%Kcd!L}kSdZaDc3{L-;g&;=1$+^9Bm*v`Q<1)ykE45y_j2qU zC*die!;1%dPoTq9$Ahz>!>buY7zCLmrv0R4`K$0uKBcxTCYd4rV7Y<72lz;z0rCiw zwH7c2vgSii_Bk|us{Vt;kZMfYhQIY?1E3+~8(e};ptBcwVJUIl+JU%{oQjnwLI$uV zNT3C=RrpoPZ~;88YlL_B)Vuz%naBeB2p-X813w;7`Jg*dwsxWK(ePa!f~nwN7+w!~ zZU|r4(WkFA_R(SaHNI>+seZTE)Rg+U*1=tY+W<#z7=ZS+#cN#cpbfvZLk5$zgVvvw z-R4ho2fvcl;GX|zh8p}&B>oK|2({;+U-}I?Fia$ye4#A_oWa*bejy@m89PhgH^=Q6 z>TulbdI!ZguaSFR#7Jm&2@&^JsX}hf+4|icUkv!)9{$P2Kl%74dj|Z&od*1pocTCz z(Osd2+dRR2O6b!pP}QtA1j4O715TMJPBQ$%g9-+_JRKp|mC^FspzoV4Bg=-{gyLO> z&`zwdcxK>#Otu#J;G;%@byQN6Fe)kA~{eel5r zR?|tf|5ibdZQcCRcKN_QsI5aM!k!7IV{OvluhfxCKdeX`KCl}@!a+TkD!ssI8?O&C z{0+P{)ZTBm3)*CM;PU1kk|_O#ZXunGAEP)8&z+xnc3~s|xnCxVA2{^+-5GoLlX?G+ ze&EAkZVzt2IuAq!CS&elBd#E~u2+yAiFju{R znNC~9G!7Rhus9I3yvP5;V%nSRd z9p61N_zhbmj$I^=A0>~GLr!*Y`<)#E`kWmo4BA_7VK`?-%_(c>M`r}TmxQglm*Af2R-BAvwigI={Sv{nU9xlf5=A+YFo zDseKcfv`q-Aca90nv1Xi0jX4|BjRg%(}17bF3v2U15PCClcFI_rs-vYSecfSJ(YUYVkd#7jjFm06*nGXM}>`*JY@%&gH-eu z{Fmg$`>z(jbFkuCXjh!+#7cBmobAL4!YVn0r28!k{|RC{23@u@w9an=MCKEvdXniv z>9kOXevP2SljAH2##mNtc{wudUu{^gJF8I@vGtjfD}S+YXP zv@a;e1~)ZnSTWaAD0YB1Py|SxPU6@g5tX5AUkZ>m%IE}iX#FZLvK`uBAa5$Z6eAK* z+OQiWf*8yRb?6nkaqWG!%zcJ2axuw$9`2DOSI&K&4qBE<7P`qnnU1x-N80e=spKqd zdBN__3ch#w`psVzc#r(W%dhNMJAJZ+yh!fLk>W#q`Jqh!d=m_g3-%)V;$mKjWg7aT zyBB#;xh{U7^p<&<3y1p;tjV#a<`!J*NNAs^h(2uMZUMn74=W4E18I zKtw|{RzD?$%$^??+6+L=Z}Ia2N*Y{$)1kmOpp_%j`GX0M@&ldf95}IjV zFp6NE#>$!*%l6(2YSZgJMh_P|2R$J@oG-<5(M*>={me%Sm?3^eDQe zW5Aa==Ad#hv2eLkfwmDzoGxKXwc=P_k@n+BxKkqZ_Ru~}nB3b6aU!>rgPQV;Q=e6t zHSpymLbpBwn&P-=6CnI{j4^1w1w{@?vCh>%iVTJ7afl9m694}L$Uh_CYH+@Rfpz^8 zqW>L0Zf@Wx`X9MP;%-JJ_Wv!_D0cjJzYs?7m&Lr8Q6r!#oKHAU%^Hi5ZUeF-cDwKQ z(>!+}Swh%8sW*c<6t;jb3PrY5fd8Oo=9y2IQ|ffh6AHUSP&ERA=a4hOIUl!vtzBXA zU})ZIM=Gm^@GChEC~sl6OU9JcbDvE-NiJ1FTh^UYRu{Xoiqy`RWT?$|tha=r^WS+&(%ti#L zjk>{!{_60%d^-?KY>y3lw%AP+81i>VVh$iXQ*e>ZjweCwFA>d!ik$RzxX^ri|P*iM)MJF->S3-iEd+50@$oJb?N>;g7RZgJ^3d7jpqwE z7#QLIJ*HB&&L)m72G;+Xy`^X)Kd*rC=MrSIQHeZ8uq~v!Sj}1tw}s)Q>0hR~4-pvn z{nzCX)Nf14_UPvZb_X)Q0pjf#)@&y}4u`x^?5ho3c5oCE0(uWzE_RNz5VZIKyy=MRvM zH38JWnnPQ=u9hF6CQP5i;1U7Cg#r(PEvkR1)=0!N)mq5VgAWBg4WiDDe@;FrC2XT^s3`Z{!_Hyz_V) zdHN4J_xBHqbhpy^1p1#fEXdfk7ay+PBPcv3(1cKsh>+fS$oPtEpc^^)$tz>AG zhnkSW=jtVrVt`aVLk#sW%OgB5B=lE&tfCm1hGR&FPfE6|Enz4QUuRoWj)1*@%K^Cu zi7eQOv&!NBa~dr1F@mfAOD%N&msE-Ue@_FG|4hk9QV;V{S;YLjJWu;uXb>+P0*9kW zLT(61%r#Ji6*dwTBAxX`5WR&BNJ!(pgNC5Ctpnk8%z!vAi<;|}0J*6e0imEpHLZ($ zm&N8K%dg<{KSy0$38T!;FE`^^9hsg}uFY3Ex-Z9Vd-g^w0*Hn@mo5;>%750;_cu38 z%zH~do@KrZcskS&ll@u87WMuFg`cgVUl(2IN)?-MvT?b|dYGvgT?s?So))%cZ@$-S{su#qtR;N2gB zr#&dBD^N2>29v6S76vUqc{CDJ8n96(wq)!D2K6OmT?#a#myJ`a_CT+b8JeIDWIQtd6#Ldko-<=cKX7Qe~_#Q+BqOwC;MJJPyX zn|~UFSF703&k{-xn_O6XRAxDV$}U^IbovM^(VD87Z@@*HB^Ij{R_y?12wWQv5wNYS z%8i7_lk#+KLEHc*#v5qNB%}db=7;RQbB|#U&p9+qo#H01h}QgI$OkF21yt!dC(NVB zMePWJF8uMvPh|9W~zUb9Gp@ zNS6ilI%A)N&Q5JHmqW1Sg_OkWqDdJ}VeXO~=XS~tqY#?5yQLP(Wq;gDN*TT*#2%^B z#za1&qC0Wsd5uds1B(^mHQD96*$Wv>7x>$_AD{ETp}i`^s4O0b>BH0{hG&e@(8!n7 z_#8+7SeaSOzc!=Fvo>}Zg+aPvmXqI=;U;%>@=b2y!#bjTx!lw&Pbqge#gR5WL^NZm z8(pUU@$>+4>NvD(a$HDUwvwh1jxdO?WquXXtt5>Vdrkr!P6EsQL4xw{Y%{^BeeWmR zEmUZT@`k{6K|X!Ts^&ahr20NZJDgt9dQVz9TNy# zXWZv+f6TWfpX>Z`wo9O^hv=aH1n1zpVb_=C(8qX^Ie`R7;lKIgaBZ&8m{%NiM zoeR$m=886RHCe7?jsZBTQeVxKy_#hBa{&&0fhSOH7{1i#YU$+$8^Q;3rWy;-g|$3; z>kj=%Iddt7ZFP@f!FEmbX}j%R$$5=}3%d5}t4uhiOF<@#Mp|=aA!&aD6iJq!MbJq; z8CTZSFc|!{41(qjzp~16JSpN|gGEo=E@7QlYXI?v$rGp|cDNgP)mbbHv zgkHt~@JsTNtK1z6ig=l5gRHo-dXW^Fb3()N5#_h) z=Z#Krr8GS3&>Pflno=4)bjq8R_xwAL-g$Rx$iJB^=IZf{W z^D@>7`~aPKNYOztgwf&Ypb1mD{_8T z$Co937^fE#c}O;~agyGF`Ls5&pdRP235prQJ(XPJt;;g6QOv5)1;cO1L13FeykdPa zyVmSdSfd{GF|yzkat!bnm8r-ys?SMdT7;o1)Q(`WKm+?`EK*XUK*n;&{!c-JvQf@r zC~cYwL9=*xOUO@4YfEEZ)~wP)?jEk{AkC5bIhO(=(R&Z3I}f(AQ>;T9!954MpY4Rp zJIJZVx8#??@K3ixutk^sI++_0Z$Ns+g6@Y%X|8I+T>ws81ac*eC=ZwG3zWlc>|xk?<`IBq6R|_3im+~KaMmGEa;M7M()#oxKT~jE zk!<0aI^RvEz-s%GUd=z(=?pMMk`{6XRBzK5_n#kp;T#}%n|$HL89q02068NDw1*EJ zKcG`s8Sr@!5~grdScSrf>2O5PqhK!1@A!|g->x9u^CXRy_!V4y|A~rHogr38#cl>Z z8$Cp(uX3n+psRVNvMO9@op=W~fsoZpMzkC>wLg%IQ3gOV?&@TTZV>y{&&LVOJaAoN z@8S`IB`D|~#@#^YhG43fmSa|9vYG&jDT{8_8A)m*|N9ea0Q1V>A;3m(k571?gw)3| z3zsQ-cZ4DNpsKRn^w;J05t&k0>s0c@c{}Pw2f@WhV)DD>M#bS=1Qd+o#>}rHthrww zwHZ?%4J!*7&ev65VXeQ=ezwDwk=wC{A)=g6tT+fGX|Drp<`XCQKISl&2CcpFhlu}Z$>p+BI?Smcy= z-=}h%htT+b6WH0Wi}`4SBTDYW93FlWU_jh2K=i0o$F%Dp>2+EA|8ezA!IcF}x3Mv? zlL=02+dQ#t+cqb*ZQIVowr$VE*4$KmfBpA<_hIk%UDbPa_v+QFpEX%UeHH;L!Zr#R zFy+)L<(lP6%i-m?v?_+ImFpU%a)Vl`Q88BZtv5DV-0(b0>+OnkbNu=uB--KkuFmgL zwwJC*B{nra_|?4o8e|v|A^}{}XFBTj4zx-c(5g1=+gtaIE;O%c%YV5f;hLHn#8)K^ z*|*RvXsyg#g@jnJ%#0+>g$-x@=T4~#?5F+b+c+fDt&n?e@BZjMM_S~<KlxlpUo{S{r!*ma@HH!T;znsOUsqv86YM>wd95_ zMrgHwK3b8cR?@uax67WX>b6VkMo@S>v6{wK(s7oy9spbs^-e!*UHNttH(fl`nbscL zr(cC>O)dW%%JkwQ-)pz&am=9TYQPQ6FceRVT%X|h3-qPB;ifhqOt!mw_e6aM}5Hk`fJ*f?;lbEu0Btmi~DVbGJd3`XmY_ z(I68BKiCVavs6+h^Rl*NGUQ!ODMR(N_H#lNmpG-L>%&$>lU9*qAB-);Y-JX%C9S6w zIcsV9Oz}NIvCSy26Y+hS;8jmM$`m2lWsRJ6!S~qQ;N-r*;g?y`W=_0Hebt`;HfP@` zB%^?3dv{$fp1*RRj2Z)F`$z~)P8fOUK`+Yxp#HnfgFXpv&Vm2|>H4+@LHn;-RN2(! zKaGg5incnQD)zR>)wlv9rWS7GvK6c)2)vpKeT#xcuuf$`^MesiA~+5Lni{i4xwP&V zn7&U1a%~BN?|HCpRVe-DGSS{0#f$dR=QM&;`>WFl&+fXp|9jWe>wTVp-rz4g4aMet zD+mflx(NX3WU-9^nl*K#<&-E>)FrVGp%{dII1k={4mL;O923J#mXR*vVX6<-kh69* zPvaKip&qt=n1euw7~iit1S|fF<;rhL}qsS`=1lvogd0n_?#2jF;*21El zrGnVZwmJrDIkRyH1D~00k&u{solSmEgQ|{|RW>6vb6rDQ>6pv7LQ>wRGMOdvUVJ^d z=k#F{vWetuJfd*p4*?DKadjg!8$@D8^xSaB7Hg#DJ@I}5KB)MNnrRrzohK?8fyNT5 zuP+8PfWH*IUT3<$(dko2x}y7_B)){O-5jOq!1O?`YudUrMLnyydW3{N;m-z*V>X+D z=^%XyRV$Zzqs?G5bxUPE_R(EeU`Ii2z3#+@>7v%WL$*uR$f~&ge7%~NE`uj)(pqF; zYU{rU@>d&lSZ>b%V;5sjO<3|wI@@GttAS*aOG4?m->%uiUEDK!wmE34MMd(d?(uW; zQO_bj4PZNd+;O9)vSo7$hu>76y}%GzTkz>XqrHh6KoXEsMuN9T*14cF(XM31qTtko zJ>Zb^9V1-94mYk?n5U_!#?~6Mtu`BCY1FbAFJ`4q<>IZ^MAodV85ZfVw>p(P(jitH zE%{CKPZ86b7axrKicrm@9`*M|^i>$BluDbbK5JuNUQQg;mmqgJxttoMZZuc1WbDZh zh7Lo1ecFETeSYK$gW+y;SpT-X;<59N`PNhVF!!|yiCShVlpWk_2VNelkc(SbeZ+4gO zWAXw;Of5GEp#Kh>A>87wy-o#mb{WcuKy^$sp>BwwyB1+D=G2c7I7v90?wUMEpgPc0 z#-^X7QdrN<2rEh9R3n7{2k$KNR1;b)JsZ}cqHP7lVE{#qk_bO1^{QEUSi=g zVeBX5lYXzdJC{Pw)bn)L2bOaDz^U?PxNJ{I?+^Q}{)Y4WO$)D(*k%v6IedR(Jjb`4 zt&v;XW(Vg*v22V}NsN_=q(!!=L;rtrqw?V?rDbY4&ec!`3W`XwKC=u4p{8_<05pyl zh}{EipS+rFf@s5D{Jh4Gh3xJ$v4HSNY*RwnZk8|_Ip>iaY_$L1^8mTOk1_X~S}FR* zv;U@7zOhWq&ehh`$;it#DZbw=QwCbeI6BS#22wvdEhPO#SQu~{h|I`zJ1#0P(mCS-R&y3***VMq{-G9wGwf4Z_OCToDsuNH);H&XS6O z50uaPn24F3D*rVwtYSPOnwD%dmCjwwOJs_mm0%MO#Uk>b;|k9#)VG60#e|K7T%DQn zLQazsj(BFNlO+v{eMjpCw9vM8>pd93a?D81aFB#T7}-#Igr5nZjOTxN=v zP5~RO_Uk5>daSvL8n@m~+%8(Vt4Tk6kY6-DWCw0jhbjjhg$?9RE3%!zuvU`{YvH0O z!G$dAPqP6*TZm8cV**CQ!WB_yZpe*)Oih9^EmCH*r$SETEhLNh1+~-}L&~k0>@NPO z=AKlFAl$-mk$RE^FEqby)Mxh1VP;lDH>bAc`@lRB*1{yQ#X?Yh#VjJ|&OWTP%hx@l zu70b|n>-xT457N8U%-o<;gwvcjN9kiFCdSK?;6%OMw36NEW1^1#D7T&&BIsG@5d~x z%KDFBZb0CGILfVv$n|9RB7>ie{`gCWU=(V@mp$mLBS^!tIf2mL3f}7;FH;ef*gmDq z`qmxzmv1VPD=3iXi}}XuT>JHfFZWMF?MhjRR^H=6oNuB9++6wZH+@I?JMKW~snYD0uLN5old&zQ@X0K6B`^<)Jz%^*R_Kze+*+AK-aizw>a5n=wr4capYxh5M@f4r;IOB#r%lleGP}FO-KCF1B1e4yYu-(iXDDg zR&9>uB2JEDDUCV4ZimzHM2WWhSGM=AG|XIL#{CuFv(N794%aEa-`Ddy5sE18yP*ZP zwHVkTKAIB?)wBwH?Jtx8#8}JMY)il?t%RE0&S`p5c$O2(tYg$+E3f{Z#*s$ii)kz} z=aoaXgU?vQ#4XAw?&v7~B|aWL_b9nUEa|MFgN>t&w2lyN6C@8^`{a*Sny#eQ%XIOK zKv|aN&RDxNx@|UW;lWbdPIVma!*v2*`B{z5o*d153vX}AhN(GLy(#6bifT(d=ag;P zLCqx&x;xRP;cPp)%UG)C-llQ7^yFg~H?s-mEAx>kjLn=aHr-W+u(PEVcZ@p?awSWJ zwM5+oXEHAAw2F-JIX(6*(`~H>j4ZJ%i-SdAhA1QJXxVZr7e&&%vwRzMGN48pN+_(h=x&5sTRV&t#f3VAlIw&}RX$l)DH*Nw zZ{#xD?Oq^-02tmd4E;U<6&o>sOn!(r!gfgYFt>PzQHPP}+Q|3VMLb>s3- zE{4_CS`LNIEl4t{WLL&p*=226p?3?TlMzuj8y7n(Cs(apqwHrgF`M!8s+`OLq3vL; zH!WL;nBVx!^J`YK7h`-VNvQ>%73h1KyE!yIFHJ5^X{$&v2OgJgPU zF1ST)K2MR|mJB(dlUPo6HR@oan-e2Rj>t6{=HGV67}h6s%@tXawP+bhm=)ZjrTmO4 z(@)DRKuD%@V}U&nDrofRmOG3-hxm~WdsOp{ z*9rveq3E(e&GONvkZ4<<5n=ACGZIA3V!X^i>joBVw_=ZDymcN67s6hgXaJ&DvWuPp z-+td#u;#246=%>C!K?TW)_@{9-dtfnb!IblW(&~|EzihQ%DO^T?`TH8LW(gJlmz0I z!=xQYZH%%)1_FGE&2gw-#xCf-;R#+I65yMb9kqqZwOwOFWTP3}qo>h)Z`T=^zM8i^ zPAaQah%yafL)#Nil$%w5tS8`1XMyk7fu;5+^M$_6-XZr3w`^V)OQ*aSAmO)IhcLm1TzatjE%Fi@@p5zf?mQ;v0G93|NGG?6Dvyd^Q*iMnT3O zaG)mhj8fz#291nTAT4V1Yb!OXRV3}A!I_<^g6v}T%U0Gc{EmMYuY6n8w6(Rn*2}tg zd;Voe1w6d(JojSpUwK`1oaWwleLs0beqT!{i7F$rZ{956 z>n<4=N1HnN7Xj38swgUAk{DwAgoDP*2lW@R_llTt&joD#C(1sonG)PSm6a6SKAD-c zZXSto6wVQYB}i!%6;8j(Om5G8!Y))ed6)Ms+4C%&ha}4GH2JwhXVqwD6>EU1GHtJ0 zw7LB(z8X)ES+nRi05`=0!{v&)*@0Sq^ehz$56QSE9NQ7KdU zDyS(h9e1?)J_VKPmHVodE!0DrY{`=ku2Z*Cdiv&pP1bZWY)N@uiZTE1jI zwa(O9Xs_N`6!MTqyr7jfggNJ+y5U-K|AvHBSl1+e&+wGBpTgM^pva#x8IDk-kP7 z8mj=cAyPRPA018gmh5CT6WMT!sqS#u1k;9qEtb;tpx~jpk_L$yx8VyT=YU+(V z+k_a_mw)8Edbs9eEsVP_QDGFS)n7J^vak@#>8kkVRnV-pSCo}sSb$~9c zRE9@rYgH*NzR7(^2)||~=j!!~Y|4Iw4;x#yK~ANStrOCxYa`7KaA^CTUa{ow7~{iR zYqAbvjLhXIX^@x<0meDounyFmmTqqD&d#(ILp#~g?!z9vh zjcvF!J5IIf5>(XL&9}Q(aTQM`r=;wXeRT6-?d`3+ROh-Qtb`zDRvp>FQVwK18piH~I7p%WKdGy_}IQeqQVdn1WWD_!rjw31;B5>?QAd{=zlF!(83mD#vQoyYqJeYqDc`yEs>DRd+=v{9Y$< zE=W+!%9AY9vAA{tEA0f0o-QBjmf@Nq0bIzN#oiux#oH-YCj>A4Q;?F&dj3s*xg%#8 zr-)gP~@Y?EFaJwC6UN!u;Vv z*8?HXHKe^)W_?EE*O__4ShzE+|F~Ghnd?dDyDB4ap_pQ7hE}{T=eAgz-QCNY)8=dQnyk?zz@weGYcXjN&kIT0`71dJVy^}jN*KZ_y>pE^B zA&uRMOv46NhnIOUeiQ95jhfEg-Pr`#KoM!H=)rrlkEXywYlvEcoiICq=)JiRZ6;1l zXYylHaGLj+VjM_)|JWMkvF+WRMZO7Ue|~?}{)nGOet$(N&muY={rIr;+d9$p+nH{A zJ7*-gy(a|Rq19ttAN$IP8D8fgatt|?81JLYwNz1urasdE@NZ&0=T0a-KhS*Y2CoKYh~O%Ojet`$Miu zd!nw)coTA4x=S0q94Xip=h9Wi(XB$@M_eOX*z{0i0ZD(y8PmO#0!Lu6IEpdv$Vwwb zl)ZVXSc+Fo4Rdfa1Kr##+nY*yc;+F7&q14@Qn+=QWVl%+rj96iG(vw{j4?^HT;D_5z7(5Nbwz;Uiu%glwXI_$x%vRB8kQFB3uVT!9h6c09C99pF5 zfrT~)sj_B7>n*J91jgGqIZj7Rm8v5%6>n!P2~Dqy&~ka2ER2hI>>uW|=dr;!FV17- z>JvDD_gn8{*~1U@8l)%tjkmvFU8!$y6YI{=r-o6Fe-!D~t0)m9tu@ z93|%ACXNW9R?#k1F}$KDFz+_NZh5P!vzBgg9c{{}Rszz&xU!C;TLxyZyLFLS`Gz4~ zd0D9f!wxa+@+esWx|MQ33@eB9(ij()z6ZHV956d1q4$GZbcyw&{ilo=I=IlvZ|xR* zTpM-n2`)#3HlEb*782!wL_zL30umVKU)dm%T7^0A`><8aIzPVb&w;M;2)Qh4iI*xS zERK{S$YQz92lEZze0e$}j-`L(uT;+P+D)h}uHG=k(7K4$NEdhM z2uyozrIwO*-i!u(7<;K!JhOfdg+zg5WAUjbpf8y zM$PGMCPFnXkz>jISw68K}6DU2Quz! zB7^jol!Y@2DydEs{F6hCDhmYP zoL(VJx>Bc3*bByG#dEVxF`6T|w^FqRtL@0tIl2<|2tK?s_GW~sUAawO*Lkoh$t9$j z1LQC(=%c6e<*fQkvmXDoqRBtUa|9JV_#3s)sMInt83l-muZ-@Pfc!aV4X zI%VZ?atR5v9Ft8lcE8+DJz); zp=!1*b`wf(V`tZdozj=HL4?;UZd+q4#Zx!yT5m|&-9vQB;$+U>(d~)RuqY9 zV-d+ztUV-^-Zlbek0CVE&=Yqn^f=f^-Hk1Q!| zp%)3-yWA7uZ%0J3K^Nu6!ubOUB{TfM_#{8~em~H8S-?ml!iQbRg)I556`I)?qwih{)|k*DVeTX0SwGV83l=@768Z_47F1o))T30xU@Yf)v_cyMKs!Rd z8^%hUvEHaM%iMdInNXIFDlwxkwmB|`*zwg)CyE(cs$akn8%qiKa=k&7_qvCR53aYf zIf+Y3ElG3%o$jBMzu-#3=a&Auh)dZCRbIoZ{we!i*tj+DiM}Po1?V7VQ&uXS+#=B} z!8S6JxzdRKQ@}X!$tpKJks(I7Hmgp7q>7%h8-b`K?KB!(ELoEkAf5^Gd8mQjZ@y2+ zzf9`DhnZsFqAqUkysr*h=ISt`;{~?k&2Up6M?UYD354EjMH;Z>lUjCxnK@&`UuFro zaQ`-if#2p0&fufWn?3WO#-BsmBi`SrY(Y!D;B($#}gbl1_ip1G-vRV3tU{jFgub z6ir!GvyAkc3=|?q$=r=4E+S4+wqGG63yXQS$tG)%oU}+;zGwl+Sos_c-v!2ogS~nA zsySnW6$sk$Xurk9tplfGqNU|pwr8OvAFB3t9Y;5t2qD+G~9kPVRGF2Y8>%-p&ec?NIa;&DMLxH z?8ER)*%W$hDY!DAc~CEMzOe=u379)P5Ev{B&QI3Igmxl%a9Jyk>v4MvWRrO3vVRLo^>!s*jKm<1aX0ooj#}+&GHJfaUPLfP~>M_DqzCCn9!0LpoN>JQ! z4&V6e#I~$@>lM1ftBr(lCD$5CJNJoh>6k=U4YxlWCt5=&v&;6>=PtHBjsmM;SD@bWT{ zarR^Gv1e^D=34Whb1yD*nIwI+%RK{Zo>7R1!)*oqb)m*SLPmfL>mcEzH3P>Rxmi)DVqLl9x+)k2 z)Z$^qH(Cd0`#?26S<`7*|K@=O)8JDu9Uv}s#LBBDefiK$ruF- zvII}_=6bg9d9Iy`$%h>S7xXH>{_R)D-^6nZb!08mv|gs_rI%o)1#`1iv>!x(%v0Z-;>oDSe1obipQ?Z>9h~ykgrU)DsG3}MWQ})hH>r@zWUUxx| zFoSO0(c=5xd?SNVHd10nM-e#r&Vg=q#A}=x5Dgr1xXI;Lp+f5I)uZEtLguzHx)AJ8 z!e7E|W5y~lXO#^~9L1220b43riQVIibIkGv-Hi-JgZZe-X!7EbTT4~%b08jDg)Iq8 z2K?nbn5l%ye#o+S3g{~VI8}d$)KU&(T?Z>UF!RsKFiNyg3hr`78L$uOu!}IGZ!x3i z;mN-k)}GM!$z0!f6TW6~QwD!Q&#bm6YQ|qcKLC{T2YWQi_CtyWe+aeJr`>LlEBPvp>da{58bbLo`i&qb$ zS+o|Id1?vyI2H_LYA%K!5_1LFEoGbK1cA%npQJj~irCc-syEK5&{8g7ui%HrEgAc4 z$AN;S%6dBxVkhQr;559`k5;=l3#JZMIc^Qax==K!PazsnYrN}-#E4RPqyEKl6RLlq zT43OKy!=^}vMvkIr}Vh?UweOk`ly=^z`rv31_&<7gU*yP#^pz3iyZStmfl)$|I!s@ z4rPrRUEn2@hxY_qzO`%)in7E=Q({R|Oq@Jd$_1|8uy$t57VvnGKi=7N=A9}E%$7-X zWV+phaZj;5fH4%Od7|`0Jau)4_)SZn`xf&O-NTvbjq~db7kRS9?MHQ_UwXnZoU(9@ zuykak-Eb>3=VP2AcIPq(d9qQwh}#`*3OQpj?D6kReRhWu4gMkQO-8;m^-1p=n!QVV z1@uP784crY4fgHT-Ppfyf3fH@41BmUrPyPd-`5zC?~xuDCLvQeU?DAFpj{PgAJ4)dDi>{C9zk;`B z{gY?!@{XiGO4fg>WjHo${P|%$#SjrSbvZnIf~08w6jA;fZ^7su zA$}iV!5kN!{@QK9?*H@Px&1W%p+tQ3}Vm!w681!1(!qxvw4iS4-c}#y*dMx&;cAEM*83KuEBT}N5{U1u(5{{*GoP6hp4U$7cGJUTV9~h}-T==Z( zVr@**ky;6*dvYz~DFPRap3oJIrX<4EQ%Yu@cuwzZb>r1G3<1xy_CUYtV{bK9Qr97> zW9b8uVySKPc>8c}-$LQ7U?xfGu6=9${y$w7#~PF8!hCqmYQ(N@5eGJ^i%>Ob!k1LV z+8pQW{(@y%U@6Qc3$>b01d?*gqj{cBbaR_(FPouHh>|L8B!4TL>V!HwF)UZ%-l^Y8 zzMeWKdV~BzQ^ls;C_ZtU*a3fCCAHf~AiI}pB~Yt+-*t^wiCcQ2eO#LOh+wbOaK+u% zn&MCF00NI2DGxl&jpu&vGA~ax7o;h=pgt~(l3q*nMZ3ndX>Oat575ox5q?czk_wz2 zQ?w-l)LBt|czwc|2nd?WuR?FwF0U&tz0j67$0`QX`Zs*^yX^( z9>v~ouS>A?EtS+yTm}j-faC-1Cg|#emuD~L_B(whgW;(##Nkc{OrfPg+68uEi!{y=P zk<~1tq+7L7lF%!ayViPpnPic1wx+f<@i@MSYO#J?=v~?fs9E6_Pim7d`OBS9t+YD+ zV+Da+=CW&n9yB78UV5_LC_w%yR0~2Ps-BrtI72IOS=ziLts1x4gl)sL0${!5v2q*r z9!JM17cXg6I(qOmD?s=H)`&k7IpnQE=_j%{WN(?^k!N(^zC_KRPj?`)LFFg^d4T+o z{u2HaDX=hkApcPLlD>oLUz!)$H>W>D!K?TYgLnJF9_4>?d;s37<&*hZ{6+1n%u_*o z@k{!Z;>K{%7~5CVA7OW_1D7gwKnz#Wf?zpZsYd?sSgpqYe6mKX?t-DKCc7>t0CwVE z>8z6eqfx$E-Zk>Eo{A;N3LL0d&)B$ZPBSP%X)PgfJFM*i9jMgz)eD4D?(J~v| zB`{fq22qP#c7u|xQ+=aZnfoDmYGFbjoDF@?l&f-?C$@G@Z>d!4jl{P$1sPyUe@o1L zQjv{RFh?yB^$1`;3;6nJ6L3g~nLDA`xL={uT8Nwi|LXse&!*!)cW^zop&NO|C`N-= zH?Lrcds^D~OY}Da6teQ+LI4T^zb$PFi*P@`@93|Jhr{HDw$+~}G%ndh)sp_5`U4G_BV>*iDhNs$c&K|@Ug$R~uU)5KV1V+)**G%~3u z=6F4E=~4mBz*MDR+M;&aG9<2Vlhj3vU(s`*56H$}TwFPRWae{q$5?0JTv1;nr*r0w zk#t;f&PP7<$;-TQ^n1!EOY(_qI^*g=H>I`(X zsEc|G$~R3T)$SPi1vRae)$K4AC+D_V%YKG^dD-E|4zlp)_ViB4>vUW$UqkE^H4q;f znhf3esa+RsE`&rpyk~4?-dUJQDTZ2u2wngnsLe}0Q((cO_o=96yF*GPT>jMbi{hMG zJQ4BeTr?Xe_`sz< zZV8xjz47CiJG>M30=;Jleq!@fK6!pIZB`WEC)X8qw8f5^$>(X2XJ!1C=oi0)tX^mC zb8yLxYO?)S^As^Pm@w|mwEByCj(8(|6KXu>fq_Rh*niOSS*}&`l4nVR1t_cldS$5v zdLc2i6^pJaaEwg2la9Lr^sJSskl?B$0FR`SZ~)$^QJ%2#BDO6;bi@FU30z9IavL9> z4X^mEOmY5JreOZ>T5eMHomcqo+kq&j!O$7W^i~$Ro(h&PwCfMZgZpngd>F@( ztY@B{U#Gsg?$5LSx&NTP?@yH!LO+9f$cI8dXU@k^S(d6!8K`B7!k;iQObdfVQSYV} z557}xB&ZY^X@0MoY9w4%vcg)Lfxr9=K!yZ+Yc)M_77NThGXA9D(`%fv@eyLU(s)x_ z!N#(X#nV44sb(|ffole&oivWrLte!jq%NhS@&E1}ZFXdII$FLryo!}^wGcui_QZ=bDn6FndpP(ub z(;Sfg(d@-d=fI}2I1$!hdklYQE;RYw<|gh7$G8VsMhEGgS99gbs&786UxDeyx~t8a z9z=0Xj$uQ3!6ogqN-WT7p?+{dRF|teA%@|SamCdS({@fP=WXPt)QnDX6Z(xUbZXZ= zMIeiAW;5yRbC0R?xKZz#6Zk@Ih@9?@kE*x|Qs#z=?g^`&n9%<@H0*zMuKsn>vP zi`FEDy5%UEugZyPPIuZztpTaB!NANddcdlG3QOkFI#9Zxv%frTZ1QK|WlU+2BI0!# zpmW!5@2d}W56+)~55!-dkc!fsup*{MNxN3|hZCFy!!4_ne18j{69S4S=H3l%1oAS)5=y`nbQBaSufO>UqQvL<4SNdZSf|LRYmYIDIg& z3)*t@^V42_y?-V2i81L0|B==@!WM_+7D(+uyGXQKV|u`{sfkbakLyEgL=BPj3DXok z!eqKT1wil0x4(m3ocw0m7(v&g^abMdtG6Fq=@hErMj3fO zBN9Sqa^sG*G`l#Z;c@d^H?L`*e(KeoH)dhgF?{zPq0*56xG1501d~kI${Yy%7JSV8 zEcx@P(9*Hk>IDm)Zlt}4pQH)QFi^f{{{yp#TsRFy6ByI^TikYSU`I7D#^D;od!Xq7 zS)v46eqR~M^p%-A%^2f0Xg-~8XECWSMdaF$AR8bjgPL`qyh#A=rZ z%0;K;n+eUP|7-S>dxS|5maqbXgUiH)U}adKGQ!^J@Oncp=^xmCgOC*2V3MmC2*^qN z|EppDFJ)YhFSO3m=-rFWD->!${ofRe)$nlP+X zgAf-X;DE9qIb8k+Y@u}a%}7M8W1%(}K1nBqVB=W=NRKG8&G)42XTnAq`72SfOkuuy zwxk?L9%l$@5858f{I8&1*up$Xsel3!Ho0QOt-K&m^cPBO>^P9~2UAK%%Hd#2?CPN( zfH3NW0#WkEtFnA}NKJGT<@ltZPQ#3Vutmm3s<8+x(jmz=+>#-S$Sz8zFrz+H;|Q2v zR7`Raw;@)!sINd7g+jrI2%t>i!5|f7u|XrM7*Iyhh`J;)CB1aW1z<+$7=p@@LaA7& z62T0ZNJ%dlN&rr&8O5Sv0H;)qa#8P7IDrw6D&7UCQOO!IdD4^`l|#&tX*4JbMxm%F zKov!Cg$OHv8nt4PD4l7wk`ddmE3jIzP%k1L6%mMEBU*%N2*^yfP&2AQy-e1q6OBT} zOXd`hFiu%3A94iZ*A2k}v&)C1fZ5eUb}yG{g6a=TJQ4N#|KXj$~oI(e;hs0FA~ zHuMPG${%tA*r^diaWuCO!}8R($*A&+ zrz}8T>04(YuY62*{!kS9zu=%W$~Ec!Nr-!3kcVpbidZ-OPX69B=Pl-Ocg}A@lxxb{ zTGVS4t$!*9z5srO0}%kf(t$C6pLqT~IcOH zNMP6<_Q3lVJmsI{;8#SiUum7c;yDBQ2kO0;vIqDKZL;QHgqhE+s>bYWglxxkhN;M-^tp@nVm4X>w%;7|0&T-+|x| zixT6#z$ay9v2hi^qQgyNUm`f=6BQSuTq%vG1sERvoATjzbVf^Yh1~h6I+Z8laN=i3 z0sM-qrj(eq$MN5$RGqLNnX^$zQI90KsP$q~jZqn~qi`h&OOH4Kqi8aO{YT1-LgQcn z3TiH?@xc^Y6(?p@IwdDK40+W?jd4q$T-g!=AWp%F+&7g{6X=+ccnq9Tx|0M>t2xCc zVgP4UopKZJQ+R>jF+s25l#m#eqEmRJ1W2Rm&>0U%q)Dz;X#|evCoThPRT{;|wE*f= z9a`hufK^J(IuprpC_tQAqvCjdqAZY|rbBJq6Ev#e@yTQxRVVm_zfOQUg*zaijoK5#RHx>M4QQu)rv<1}zViauD>(508@o}&^mmGn zrhz+!M>W8m(xbmB^&;au$=yk7?JR+O#Mc7=@vF$BE-5&>V$rO`zvyv=2J+e6+T-5I zThhOusXg-&pBGQTf&Ar1B0&D?BhuvC^29i*j<~svx}!rNf5A}_kiX<;5y)S3)CA-& zJGuw<<{w1?zeL8a{0P;D@rG${hv3pFH6M zOX`rp@op8O_JslXReE#{{3m;9Ian243lnC7)`z!!;31nmpHummAAqSrigL@Cm^@DddT3&bFYIV<)fdP7 zrnD6ogbt@fC0Uf;#|)()md6aG#GMl)LWM2bZvYqeKW$0jmA0^FcBOGbY{=#BVGF_L3LI*tr+ z8l!?2d5CKo!h*903#}F^__k9i?6NW_tm2DKgGUFJRd*M6`;eEQgKJ_~z%fhGYGP>M zVXI-4>vP%2DI422uI?jA|cu7i>XvTd!hFC%6PsOfQevOrGGqL)4VTJ}W6`b-cEQ{)r z<`k+dE2}}2o$s?inf_ktqx?FI9&~(>+!zmZsFw*w8b6~{ z$;g?|1jKAslc_-^Xx}~-jIafEZXl+!bSIe=!p7s!WaVN6PApH4;fY8yHr50dHz8?b z;)o_4%_xv+EfXg&PNWM_sYTJ9Wn!C8&3Tfv6K-OR0m+nPfAZ34=%d2b&{xAkRk~bK znr#P3vQ6Y{>FCNHY^5+uj+C*phcVVr>f)A*`E=T^83?DKtEoW^N_r`3x9sHTqgLy$ zs|@C=iu3frcH0>Ncd*wo}r`yXXlrUEGxytogDVRS9 z5oR4sCSzr+YO~&u89p#D4iJsT)f783BvsZ@z_q3^-wXMzBRXG>z-G-}1CagY`EqGG zOG_OI<7CfglWoiCT@iS2@&=TaP$`@MM&`uz*UKJo}j0jF{y=hXq z7DH;F#9GUObgYqLj$saWh^9BTW z7B3b*<7Lrg3CAc0u~KI=#22?!U3J4W!Q-hf2*&$6>E<`=pvFo{b(1?=Sa~v0!$sL= zDz!3Nn#sXyf&WZsdW*Htl`g@~>>ztAf5Wq?l1gKP8k}~O#YBYL1}>tBp{Qez&vbdwxJq&Hphl(x>Z5Tp!mPGGsrjaotqo=l8Vb95A>os#gZb5vBV&F&hdK4 z*9V9S14os;)i%d7xd`yCLf_hwY?RE~V;?OGyRDY02{el9DWr`b%4=)tn4wK(=WEB} zP9}cVdQV$7zto8*2TO3EjUTucx#HG9pv~xr^z0ibJA)@qqDxCr8cU#2Usjva8p@S- zG%#D#lIclrI7gi7?F`Hcfu5N>KHQP-$b<>sM|N%i8T4lrgOJa4E{AYJ^$7Q94x-2P z{HXQMj{|Y;*{=V zisIjnT~&Lns`sTw$rpV0e{UG1F#ISrAzDgzReco6a;arF3i^|q`xpNE-e@gL1Y7)> z6B6X9_iO0Vedxyrr*Yt_#+bk;{kLA0q^=?T`uR@!r38We&1dk#Pv5b8epLnSVV*f= zqm25Gi19F1<@R8?x|3J65MkGT!5;g0 z)ZH+|;g-i(W&X;lz?3vdv!u{5tqPqaHCOWNDWCAB(S@B2C=2I{UvT49F`k&zy=|x{}|0mO`%j zN=gd2bVO9F`Zs;9Q{nZ9xC0wvIF_#(P zC7PM{1tT$45k)emB9xxU6u*zau;`9(fh)Txvgl9t-obkBT%&l5xeBGIr%3rA z=|UY{80gHQetKjCZDt46VBEZpWF?k&RfB2x>(rRFe_PNlhkbxifJVBAdBXg2S?!%! zCm_lyO#!-H&vc1nb=mX{4o(OB<~_Sld?_~Ou{T!ru^qO_1J8xDR((c2GS)Z68)~(Tg^6S^2Wk!iu8lnWlYg|B>d| zu%W2Au@Pr4)xjzatAU+#Nq!7FY=0$)>j**44&r>O)0WAk7;MpK z@Hy_b3soPjx|j;ruBdA>aoMf4j~Jpt}e9B*(MAQkBAc#S%Kqt{qtpih52zrkyS_+GEkU>uFb+PTYc zJS*}EECbG3G^6^UMa1u$5b)KY&r^_I)6~?EH*DCtb?b6hp$oJg7qwyO6Ez|eh6N^? z$T09=9mI$xS#@J*jcF&L?yRk@tu(EmYP}N^M{PIJ28}Uc7{*?sQJdwK<>EEMl#CCo z2%{)gHep5+Wq7J<>(Ozia}kZc*J!4Z$D>|uq77xtSW6jRU+tQPI?JQ?8tZ5WgA;Yu z8!cXAgMm)=ObU)QHpUspd5zY#oMzM$UoF$h zM29RIB7cF8HgisAP~;<94%J@C)T8E96jn@KRJX*oC-qhXR?!LCkg(0kI&;g~0;og% z-LaLd5&wgBhWk1i!T1+wGIvLUXsGHH7F9#QXC6%)rmNIZU#5Fct*^n10^dmg>TKU? zgsewq)(2N29oFhC0n?qziMZMwXyhKs5^U-ipXu@=+0NhoF7fj&Z1B6*V#xS8IU<0_v2B@^k$^jIGZ+(&hZ-OatzMHPI&`g<>g<} zSD3zjHd0V0#8;ixDT^ zhFueAuuN*oSu}k8h~fCR#I~GWCOz^BlU1mmP&6$B!)D`pE5?Ce)d{>aqyX6^8ooQh zTb3@l3tqmKufxfvakSP4YR;#RX0T1O1=}N6ng^MM1uHV*f+jqNFdnOTB-&xEYPP;a+2_aTR_n_8M2y z$HZ7_1uQj(qzd?GFVvBxrcU&Pqa55vU#MZs(#%wOmyYT`X*; z)>LS8=$V7&M~=1wYS0b{)S=x`)q-j}h}PWtV5Qy>rJ0i2anl+NpYq}Z58n@Ds#A-AQ=NHZ{ zn^86`&)4K^{aD9NL=O8TFtYzP%(XETs;_Iw^-aeC)T2;0qeV=*5H(^@OFCAe^BRp5 zs?0>kaWtKEEcEgxNPusn&Ai)bD7{TRSR2kIYgR)QAY8t=r{VV%A)QPKA+;6pr0w0S zV58nl(OZi#y{$!*^uBeqIaJr^avhCq>T^;)raE?9U9#p7Jcy;V4MoQb*8Uk9L|DIf zMil5A6O>Nr{q~SD+xclpVrpB zZG+d!M1CPvNjC4&#-6ip%~e>`Vy>Tt5D?hz$gfF7F!^*%jcs;$v3wE zBQP`pEeK~)BLcgrzYG(l<(4X>-!8zJbjM8UcIqsjofD?=AI<2pZi zXkO<9MF%MuH>T5qk;6xhJ6OSZDoBc;Z|#9+TE5E{ zvpQ|04wGXW&;r>JxSoJr-kiCmFgr8Gn~O#w**fvTv2|cxzVHmW9_{g>*ncfhM<`OdU3HqDbg8W|O^JR6V51 zp%LJ}*#;TtZqnI6h~7LH?1pg-HFn=(fE&)020FswqEsj1k=l6^HX&nni~fd@hekslL@WkILv_mVC|0>x-eKD*7TKQe zVvFw`wvZx3>i2hTCAvAF3p35_0SjJRtLEzHIO-cVxbM=LHyjco*f7ZbZ|YO+?EemY zhKp{vjBnULx4<-UO_N|zWa(dIwYkKXMeCoHr46VhK58r1)s`lL*;ausXGCVFJ9;iT zi{NWki)l`y7P&sB!L+sEAeA4rQ%e1tY;dX!@r}?&`6GOK+7-l#Ob76B8ho6uGu*xW z3%W)UrLydu##q|qJ7@az7t!%E!o}Ksi%3vLXJBO^=W?nGG}GNP;zcye^Bv>Z9u`?L z$xZzyxm&&5{r`_TTa4K;^-=!cMruH8OI^js`; zA5vHs6P8V#J-d81tqHxN!EIB*wavScws~FZMzbkGxaeCPE&w;lI_F*sKi_M#8+*tX z9!fzv1&b+YLS2}iMW-qyS^ECi-DW3Io-u6+YFAY6BbYZ4ZQASmiFB0jF}w5fmyCP7 z#$MX}yxF)Hl}?9CkzV6I<9^e7^7&jmG#fx2K3pFwS;;(YU>8-)C@))NXVQVQ*Lc7< z0atzZrAik)^^$=j%tII8LE2~?7sdC;eXZbnz4u04Atp8GqpYW0YpQOaM!C)o+y^C5 zCb+&|@ep-X@LzQlDYtuzGSZyuRy+p{E&Yjo zPH@9nTW8J)29n104H;r19Oe7yNi);e0qKm0LM^t`yrVH4#C0h)vc$GXaEdZeW@c6v zgOccmT}17CK`H+G6=hK;q>UNl{|DZ^4}xk3o5Nwd+j^PW2@3|s^mgpA2gProi62rg zC&vVjy23zP^d0bso@m7;97<5yJ^VZcA9P}#6@1?5njPSE!C196Lh|E`{a)ko4pTIuHr+;!){9RVPsZ4KmNFE1#DXX?AB2pFHa#Xx zKrAMj*Kqv*wxUCd81B-s%u~kGQGSOeLyTE`P<*og11MMLJz~K-^t{n)JVP5yF_6dT zd$U;hEbUo7XFQJ*WiBw&%md9(qjTXS#{0JR?d>DpKAn_Vca9iZA~E?mSCxHGmkK>Gg(4k|!zG)FLxlAp9A{J|4*#$jZ zW`kvrCPa)>Y%Sl{5hAfOE4ObfUbgjxBJdI+)-~$I02wDZq?hSB_8K}0c!m5)uil@i z3x&;_FRvP}SvT1`T%Ua1c+JayAnVk?`5s*FW+ORqLEPDzLs94`6#CaNdvq0H##@k-w9phbxPtM7P>lC|u#VRy0T#pM}EO8zL z*suGXmaJEk^dhFAAy{7(c^CNi@9iAFS2cyqoS2#>I)7I)-o&7sZua(!d5lP}jFKXG z)`L*W?UT{zTTv>C(`Q5F)!1~nc}3X5>JWNz*V&Udivr~h)3K&mf z6rf#H215_}k}&oi;GwZkEIWnr;8GE83hU>J%j_qIo+^5|L2qgr^_AC(P$xuMXiJK2 zvQ)pj6M+?Bhqn5>ysKl4&eiXd62rDn(OJhj47%u(o^l(ivbkXjWzcKO z<_7Z`G-`%w>+zfU0x(`*daY<_pzqqSa}(SAp5I8%T@|8NK{v25n`UK^`S7lbX#-fP zZsEGx%3xuARgpf!MGn(m=Q5fh`njO_Cdgyk=puvOCv|n^H`T&AjlqVxKxL35p{S@+ zNl>-nS^8uG2VWa5wC<#kK$*%K@v03^)i+SINOi-3*w;^VhQyZE5D~36j|X`giu~$A zkHTiya@r}>4E=h|d^43Cd6gS^?ns+(on)i7tv8=O_O%7LlgE$Aofep{P)kFN!Kv1* z8bp0b6A+cg7VG(% zSVYgNdxnG5R7K=w1m>C4p@)=?rqlv%zVwX8Mk6iKV^)1qjeNzyxE^d0e=<9L$Jw(( zrdhc(uwLhBxkPa+!VyrLk$06cqlg&nHD7nw&$m-EGXL%YckhD~(K}*N+4MBBkp@<2 zLm>B>Leq(GrV>o74qDb1uxVki<3Xu_X#SD0ibRBg4=71do)XiWo3n7(HakNRh}^}OFCyQ#9` zP$8OX)>COIEqXUuM1tOl@^J*c`=Z!~sHAd8c+GnaL;lU$>fkT*^UHCafd7XL$ko9X zT0!a}@6o#=E66~#-;h&!s%s`Hw8uh?`kxnwql*(-VQ3)dnX9QlI(husBQ_7k1Lvoc zAO&OZBlRSn#gHi>@>tbexntk+A`kVeTuX3=0P_M%R#~n=nkdGjU!$h#vymJ({0@l#|$cEk6)MX@fy`IJhTbO@NgU2Q|(V1@ zjN_myKaJ!GdpMn+VfMhLU|p(x?;aSuAN*PSAR(&_hU|y#dtvATWMM|>b{Ih4l#S_3 zOzSeNfJuL8b{k~1!p5DDy#>}$fz9GJ$RXzDnw-Oy%5pTQ!f4q1Yz&9Dg5PHK2n5R} zPLITooM@JBhyFI$C>w0FQ<@#2#7OXBxDk1A9P~t9rNN1i11H0HI0cH~RH%Z}p#k}~ z9?pWR;2gLI&Ud)i4}|6g2fy=G1@ris_(lIJ&%K&wpuf)2yd4iGTX3A-TU$IEizUQ& zMPk+lVXY)oa38GDB^gYqe2GZDJfxZ6M*t#x`;pPO?@Plj9x1i|6Md znoKu$erL_0>>L)`+!ff|l?Q3=0xdI~-jN>!yK%A2U5(9M^KY=b@Sxa@k8SQcZ0`Dh zi`_+5b6XLHBzibb79}Tc2TzZLiK(0T0eKztP1yr^Y1^=?#Qb)ckk%uiX5#h(ANf<- zp&-(0I`#)}Gq!RI#KUdKrybA>?!f#zQ8sqLFxaiJ84U)?jo=sa3N0bS9lVBHc+uBp z{NmWgAPbJun|lk_kuF&ounQ*M>fqqf`FlE*lgk`gn}aP=SznxqleU1o)1P>FI~4j8 zCsWuCMUg=rg2vYg+cfc|cVJdsdpEv~xW~$Vw`@rYS z+hUxDR<=FSC-@VmQUALjy$z;Yh5HdKaRz2@N4;TJJ|e1e;!L{*r>+fHVgh;ysx;D% ztLbSmO-JLEIL&D~R_8y8wB83jU_WY#Cr~#(h566G6nGX_f#)FvFTz@Q2{ywks4-rJ z8{u_$65eo;?J0+BTWqp&HS3B*=2sV@&te4k(zO{DYVBh z#~DLKgffY9bvRFl^L2QX4i~tqE{v+0xX4w1u@0B$aH$TL>2SFY13Fxx!%7`i=`g6n zYFEyY?*3Lf{nb!^wXXhFb&hpstj&*M?dtt7()_AxB_^-IlI>uv?DaY;q_cYa6C3nL zH>+^97Q>?{w9wKSjZV|yeYmP7Hbnr!ZuyQbni`R58|&ui@ve1^cb(JF`c~33Elzra zP9LLNJ66MPjHRk6FRcV&3dC_P>K(7c6I?kb>hL6os@q{wXBAJ@;U*oP@;BAZ?#V1G z@h6_Dvrlu6`g9y-7LE4|*LY1SIa7ycxuMUtq0ezapX-J=&xSbPJ@ZWpWH?Y49E{f6 zq1v87F7OKv4t|(F@gjHs7e|9`cHw!6OVZ8xaj6b3bLF(^aElHvcjaH9!z*>TwZjan zjN!SXkk~y?kKb>@0C*QN;XPbv{)xu*`!E|mK=boMSPCDZN%AqQf=|$l`4ldM&(IS1 z9GAQ=aFP5Hm#nXFnfe;q;2YHR-@?Q29Xt--qbmCWRoIX42K(W1iz)bpb%S47 zFZhl1gFo1K_>&dEU#t`kuz8HJ<&3jhCRrnkV;fmKJDGK1=d!NsV%D8)Wj)w+tS8&S zda=7%GJAj>!k%P(+4C%gea}+aFD#8K)}Qxb19*St6}CXU#TJV9*&^{NTP(h2OT>?CsrZd8 zL;HNW^ss>RvK2CsRmwiBO7>?#Ifzw9%o91-To4em)!OtX^W<{Jq`%Ixc9!pit6E{O zEs0m#GvONhW1A_AckF~~TOrkkyUs4Y-YT{WZm>#q-;hNib>TstH@6zEe9q!g)n-1G`xJQR~>+l{O?$zPFI=oMZ_v`Qh9X_bThjjR` z4j*x&^yooRde}iDLV{}Oi^Dq+NpKPjWhX-p+XSQ7DKMU$3X|ArFqNGSGuat%Bs&x4 zv$J3cI~yw5IZ(^ag%CRrn%Vhq47&hMWEa9|>>@aaT?`ko&Ctp&fqU4c@F2Sk_OVtM zdG|Zyy~g3te9Hukm{yM=-aBC*4Pn1)2vNEWO)E5s*%i>AT?vEOR#zv3oldqnos?N( zkZNk<$J^kEt1 z6`g+7Nx!DkuWRezjfnA)-~ha-?UJ`5MQ=JqZ|kCWB1LaICQF2DOQAQC;|3(#c1UJ7 zK^nUm=AgEJqjPO$KYG`I4&wrI0_{hs`zzUjUdr2hQ!nBYKz&Y;e;iBX}lka)CTXCWF@}W z2LIdwhPX8=@tHPwzaaGrok&G;eqdC!!61V8@Ct~N+d+zmn`A1T7eTR?Ac?&S{n%^Z zV{d9yd}b$nJHL_KCm6wR(n$4#0opwyxBX^EO75~YLcTHS_fZ>sT#|J+e8Qj=X5+`F z3>~J=O0ClDHu$^^zL?ml75k;RN8wHU3IihzO^dHxbA9`PTcRxJ#BX%?tq#A_;rA}v z{s#=jM1SIs$WT#`YM7qlPc^b?8`{QZ>gUv4qaEd2+pL=eOY70&8t6{`pH*+-CeF4W zcq{_m4!`&le~prkdPqSsya!#_`_PMhfD`v4l#EYcIr|i~%2%jWzDBL`4QiEdQLB81 zTIGAxDnFoB`4P3s&#;;O3od8B!maE#l$1YEyZi-DumkW6&b@zdh7$8DyvYstlzZT7 z9_Q@4^oPlMXN9BxHHzP2`O@E5a?=GqRE1VIjZW@}+k;3=CqL_TcUm z6U<@$CPs?f0)OJ~nvQ=sG~Ek-E=c^V9S)S`$TkK!ZH$SrGFj?cjBkTw{#{HY%TZgP zT#Pl6O_DRY4GzZwOk=@ttBYhgGTF#Yy&B>-F`QL>b5c^6E2)C6Fh3j|*+{pcK2hVayUJf((9Y{a}#zKuIDoOsGw(f)- z{7$`n(G9NUJ2lDua2mgh@6sgS?T|bN>yc)?35T1~#^Ot|+E_wQ2HW&bgel{i`bn%y z#Op|6UNh<%5%VP0&5XL6Q4cff=~Ayrj5Y+387%33no>!uS47Pwv1Btk#Eg1JEbS!L z$1%7gq@IUb3ixnPd?Y0C(a@KVLA5XzhVa86n~y^>kB2;-2Z!@~n8qhS883jjd?GC7 zli&n?IFh3f&gGL~GcSV6`4rg3ry`k)T}IVS7CC7vtc|y8qiT;sy6H$tBKnOqw__y~ zaqg=Vdh$+4aU`>mBr^r&uM$;(BbM_>EK@OeT3U~Un2B#q`QK7T(xfl2o03&mLl3(J zS#=eyJeKm%s^WSQ=L2V$E&bYwkj}(ZDN?Tt1+^Rnbrz)X*)WjLfm}Wp4&(D+3ZD<9 z{3w{i7r=a+-%I!+SjLw?Jzol^^JPfA1= z8MQ;2R;-x24f;q-2X;d~v8;TvEgj-?FgP{EHwO?Nz0@)KYsKM~gOlOTlUE&Mdt$WMop`57pO zXF7Y45lZBU`d}J>3O%N=NRP4y%z26b7=ROr9c1dFqxIVo%O%dkLdxs zS<>H;)Mt`3i4D}km!>D{HaMB$w2`}5y8Urzm0Uhn5}ECsLAj`EWfB{F9a0*jb~ePH zY+$G}tHw$#m+$$LrBh-yPYYqH<_gMw5>_2*;-XO~K!M(VU;`#IES7YRcxDHNT>^vg z^BiQ@d63A@heP-U(3@X^O5!rKU|S)JZ-J5gau~<2fJx{p74oZKI==>v;MXE~uY*Jr6zk3y{uVL;-&pmFg=nmA~dvl*NwsS*#~KDar>N&)^}%mkfgW zF>*I7vYxZy3zFD~b~chkmN}Xc^<|$d6p>M>xfqVFX=7uw41Iu5V@aB$7hipL#NPrB ze;d5~9b6UO#Z}>-Fo?g8GxP(TnIED~`v4jIG0x6UU>^U}F*E(RL|V%0h z%4nH_riulPrVF~~lF}?s+c62r2G$sBq$L|qO0}|**TsD7#(fnt$On!kQ`LC$DenThVcWCB+!ZG|W zI8iV-O>j6v2sj&IE);QanNV4q z=P(40*V0c?{fHwqCtChwzP8s{{yyl9q@G|>ydbi*r%Na9gJjH}L>X32)Zq1bkmwEx zq6hR8J)w_Cg#IEKGQ=S;O!S64(bwgI<~uIvqYgUjEOf^EQF|Tk913)`4h32v-R!rp zjZNMP$vaum9yVnUo2nI-z$y`B`jPmERCJH}!w}&^1O~z=kq+a;AQuwjT}V7;BEf4- z4~MlRvEtGclp=q&CPazjMY=rH$WAb&k{EiD6H;0s4wr)I{>1C;Ds09+=!5y_d=@*^ z*bMg>5T=iCfJ!1jN0<%IjO>PL?QG485;H1wn~i18O!;rIFaIB6pTuUFHS_dhX0vD; z_#MZu$=*U{g*bhVY=fTW0ft_9p2ZescVd0s4q3>=40L6)p{vM+BrzNg6(eAT7>SG= z1&52#P%Oqmg*Xfrig6GW`LJ3PK#Q0N$BRjDrkD&Dh$(QXm2QshftKVEutUs* z-J%5U6{Ya7D1)cOEOn9mZ$QLK+xzz!9QS*BRZhKprv zv{=rjhyV*>yjoPTMp4byiS!+G?x$*BU^3b*FL@<#ZIzj{D#wk`o53w3aSqHQ6`zTTGtTh~!wtXh(c-K8!raES4gbB6h}xveUvFRG+W$?HcS#*VzOqb87+&2THXphFh3BzWWahyd2eXt9t2on*0(&)swlrTNHj`f z)#kQujNiJ_jB3oN){It}(dtNlt&o5jbxy_xGh>YjSZ_ulGivxxs~sIxt>;60gRNMdJ2hN7kA>{d1uv(M>_ z{pWVd{>J}M3X<4)Q6xU!j4p`k>B1O{FLL*Eu^DZS@YOumNMe_m(WPc|nHja3(H1kh zJgT274&G1al5k}#{b|pFk4N~tIX(XGrGo-5>gFGY+FQTsJf#Sc{ey2wc^=m zp`8o8#06*&T?_?cGit$0V3xQH*U(m|6qiGt*b3{!)v!@)gVV)zaIUxk&CusiEHOBcvI|#_eC3gCfea!u^0X&?n5Wzex}3&tebe4rHe;! z{d^SH&&SwdVjo*1_Olh@aaJpyU=89)woW|7juTI_)5SCFJn<}R70>cqM`$)Xbz7%h;AH`DU7jM| zB_>S)o-}5%{1HVuF$R8Cy@u$Sk{6+CE{<`>uzbAg>pNQZ1*W!1PDE<(A#Ghh- z_)83yTnv*QF;>Qjg;I%tj2AUBL4;%%u~vG;M%h(tlHJ5vvb(rY_7JVIr?^@sibrLV zcuMvXFUn-`nmk0jBYTUFWFPUR>??kd{lsrFMKYNxl}wY_vcDWD2gvc#Cl8kc++q4Rm*B1J!$`@(7T!1iHvl=q}6Q5IGCd zRVX0gMLAe;}H9yCu z$>r4ZRnR>PKe6u~30Hv+0q!*ck|Uo9*|eQ_-+b*B%+8KFpdU*Z$u%fEA?PC;V1PUt z7RyFhDZ|hxn_#1ChSTL*xJj;uU9tuCBHTlAqqFZf0Isn1{d&NiwtWu!oNbkT*1=ad z*u$UaHo(_ZM8Q_;^!FYK#PSA5uZqJ3e@;q1~&xh6W0+iPak^UFK8FDk6FI(Xf zxdpC}SHgC=75Q-$+=_K~%4^|1c|ANVZ-A%dcFmW?NYm9Yn7_#X0Se|qK7Wb73~?|4 z8u%;7ArItOd)Xw>Pdi61Px4pw43O}+wZY**{+SybgJHYg{y=|<-ocvu6ML`)Y=hr` zJlkhZTcpB%xqO28^>}Hvd5pc>{V@?yyi~4?ymHP8NF#nZ@HQ#d{NMi5kiSe+R zc-PjTPUr7M<0_YT#P*+N^nNEjesItplh}u5^ijmlvbT>`V)n=GYlmcQf8xG(NEx4+ zn<1Y?(du(z#V+=RX2q8g56+L7U$wKZ%{t#i)%n(}^Hr?b7bQeAwRNN4MUKAzTo;*{ z`(Oml%$sr9ycK%N+i*7C4(W0SWXn5nChmkqau-y}-LMLU@l1I)Y>|868hJ0yvIpQv z`5?R?AA(=y!#GtQVY%{AHby?iCdhrPNbYAr`8cbSPq0S$Bx{jRv5oR+wp~8MZkNxp z-SRp1s(hZkBVS-2$rss|@*nJb`3n0(zRHDsjdzu=^Iq}|-e11S2g|p3wtSnH%6Iqz z`7U2B-{;535BQ1lL%vOZ#IKhhJ6brKuhny0zyw~+UpKcd`3=_0?#VY>TMvEtIs6TN zo8BdP)0xG0V?BlNE6vlF?@OGGOX3_|0?2A(KW=4XF!htedb*`hYCW+jvlQ}JY0Y=W zv+ZjOd4>f~k7+*F+BGZL)5d-#1-%bmiE!>;ZRU#`oGZV?+{r{atHs`b{ZHlWw407?5sKPKN<}O zy5iBg;{P$U1uMezVMB4nsnlVZeii2lg9r@T{TW zTO%I+G!mFJyv%2GWkZZ^Y`W2d%`_6(Y$KV?H+r*0Mjy7q=*#Miek^RHu#HA4+hnA% zbB+FNvoU~OVffg6#z6Ljkd8`kAi#OwREMndH z+txH*X`id{W&9ofE-*Hq_2BPeU7E)KbWYQLw2t+UjTX=pk`wNAb6#J5NNMNY3e2r# z)0P^LmU)K-7M6G zr7<4*8+kC;m;hPEL>Olr4%3Z7D8ugxV=AmLilN4s0rkdAY;18PsUzEXQrULeG9%Nvh z$TaC6k+c4GE`DwUBh9=4aBrlp!EZIi5I<9IjjpJLldAE8)W{`6eKKsE2HZFUx*KOg zKjSPM@i|aroC{MiZ>DhpGXFxTG%kh>#%4IyxYU_K5~evG*>TSJkF&IyWFeZ$yIL3`>n$V5M;@9B14P z=Nosz6~<0nV|Kyg2=hF`zGAdHv*{>wtUl4&`f#{}-;VAuk^EJQ652rz`RG*0rsutKH_LNxuh6{~y}_~thDWYm4c2*)J65SU(t=!^isnVtitPuU z(Hk-M#9WLp?!iIdi;{F7q#F0baN_}(jp?I|hn)G63S;#!ICO^@og7B<2`U9IaW!6V1 zGaGs#WgbJy>_f^t0cpn5s8ybYF~;+#XkSD{`!X(Fub_CmilXrvoM^lOry6g<8OB?% z*?1ep;~lucco%L$*d17JxAB2x?uX)PnPMm?76nz;v~^{5o{noGI9 z9;j)}2O+KbpnpT_kCE1&Agw<~T7QMK{uXKdJ<|GTr1h^z>)(*pzay>xKwAHWv_1f5 z;NUlV7+m4uaDzu6t$#*Ze+#=k>VJvWKRA=J);f+IWtzc*TXDJCWjzsK`AK}p9zJw8 z%a7#EPvRMSc;;?4KQd7LINsA85*RE?jAC12;{x&|= zIiW;Th#!W(ab{EFsa8AB+fG**cz*18CS^{DG*^JXiILs zOoD4Xli^0s6xivR3T>WgaGz%eJmi@Pk9kVrX-_#k?>Q1)^2~uZJ#*n*&wTjUvj9H# zEQ0SmOW-HZGWgXKV8XM4C3vb>H%~Q7_SCSxo>k1}sbhmY^(@QNz=nAm*;r2#%k!*d zg`V|ny2tgtiOq1Fgr6K4&e6*XK=NK*f__=)US5V#c^jW~7wo%JOJ3x;w;xkKYhwND z{{c`-0|W{H00;;GnSp~rs-Y$D&k6tleHH)!82|tPN=9sDcrQhAa&K}?Wpi_3XJvCP zV{Bn_bB&jIU=-CI$G>kkB#+GoLOA47K~Y1v1Q8EV*=%OX!tQL?oh2-w!;&l^5R#Z| z5O2Ki+qSl~t!-^J|V2;t)$UH`46LYM_eavGuHZ#X*+|N8t z;{oRJ8V@p0(0GV>qQ=9_@fwdXCunS8o}{srd9uc%%u_VBF(+y~#tdj|XO?R`&J1ci z!K~1Dl4)r?#SCdY&77q146{<>S!P&c2XnHb zmzh&FUSY;HUS%dUUSm2MuQQVxyO`57-e6X1yvdxd@fI_sv70$V<89_ljdz%{G~Q*N zs_`E4G>!L}uEqz<*%}`*(;9o2b2L6;)@Xdptkw90nbFwGoU8FEvrgkP<~)thne`f9 zFz0K0$y}iE6|+IXyC8F>LP=zPdQo~*L%OkUR3h6_-&i+Zp<7F)wW+P8CR5(lSlf_M z=$~uVmaT6X6+hq_wJuKDjunrF?SNxdxCtk&&^t0Y)R0*`%4%t8YKdlAThn!!R%%*g z#X@d%%nbycaLlGce4Gf|lOk3;8L{X@(w<_+s%nN4?9+S=|nJKo0TuLt!dPatT(ll%cf?r z6^qC+w?9p4E!Ts|szfSE4RYcJLi8^2SsHmD!ox_p@uY3bvnZxo?W2=5q0zF3%@Wb< zW$nVT_Lrge0mp8I6$&IH^pp$CZ8QwiXROMi<;}N40XLlBw}_;DjdTSaII-9iYEWSs zX!=ymIUj5Ld7rFK`xPhV1ZWY$QCcs(Z&*c6WjI02-N_+(E($%{-)Vjg19n9uY|{;e zxzER}eUID`O~H+Z6A2l-zluI6o_(&IwmZhzCqf8R@l3C&I-#b)JS}f2KO0{{7AI6M&*Ok@Msgp1{6qQuxC4Ln z<8Syoeb`cPWP76mwa~8`Rg+&etJ4(@`~S;Nuiy6vSKc;vZl=YrT2w1X*00*sBKo4g zzoLG8i|-258Gf}`(GP2neb>W{*-RaEL8Cp39!4jNLYMHhA9vy|KknwZhhr(nGLGdO zD>znitm0VBv4&$U$GsfuIM#D);MmBqiQ_(w%^df0JizfF$3q+sb3DSag<~tnqa52f z9^=@~@i@m598YpQ#ql)9GaS!y?BIBg<9Uu3ICgTp$ng@#%N(z8yvp$!$Lk!sINsoR zljALp-5hUoyu$9o*_b9}(@A;%t$k2pT&_=ICG$EO^haeU741;>{hU*Rr=zCZSN zjY3!Y#@l^lXPd|W`kRPv&b3oG^2cvJ@EgcaH#cV*YZV5R27lNf_a0KS;XkRrj^;Ys z)IO44rJdG2NX}(5i?gH53mIx^S(v6BE`P3(6FRBc$)?izUQ`+$It_zSf+7GBc=&@Q z^YJ%J?8@)G@NUC<43`=%GhA-C!f>VGD#O)=YYf*K-fOtdaJ}IM!;OZU4DU1CYRbkrx;8sA7?Z2Y#;7tPzd>GML<=eXtYZb4y5-dc270WTeut%PSa@|Q-|L#NiD zYw_UKR9Q|Iim!%$DfQ9~ebEmEW*mLcg>p2Fd<tV#hA3;#QJrV?5DiSN8J{8OiZgn<rs*_>A42IR-m_dAMu04`-=Ay?=L<;e4zNj;)jSIDn3Yju=ru(hl>vpKSKOS@uS2` z#fOTQi4PMWEJ|0E5)x8 zzgqkn@oUAe6Te>k2JsukZxX**{Ac1n7ypI$E#kiv|CRW!#cvh=jrecHeWz86I)Y>Y(=6H!HHreZqcs6_(JwC|mR zBreA^+>C16Mpy1cihlKH&@b~$`t_Vezi_A0uh41qOX1R{Gn+p9wCamFY6xo7(Wq4u zkWrPGs~ps+*_fvqP_GtazPcC-)b(gkw_>5X1C44Wn$%`AtL->l?L>>(jaIc6S@jLt zJQ|BUy>NzS5Egre<4n)-ILlLkvprQf$1@A(dgkFgPZsBUmSBnJYFyyC1s8g5$3>o{ zxY)A+mw2|~QqK-t=GleIJ$rD4=WAT)&BImRVqEPVh-0)~3U7BkL+@c% zzs7I?0M-Aw3YIpt`?EH+l!vjYgNvoT-9HQZDs+G95hM66H}j+4!dj9*{;-&khf$tQ zuNMtZNMp!1QRMJb3(L`m2klHmY(IZ$`i@_LflcVAW9gpU=#caKn;4?cRV&?Qh}0`M z?Ks---G5l_j3a41iN9IbPkoK*!kvFmkV$NEYNE)QXj1T1^-a0eF5y9|_w}o)EZtZZ ztsm+?hCZ1e@8tfFE{vu^lf+kEO6V`)Jbu;{@Qs^DxKu~uMycTdP4RpnkLX$jZag|{ z$*~lhAJ~>>q|LB97G^yS;+rRBVxkCO-BbJUNT1o#t&?52Ajjh3P%&;2uA)m|Q&!-* zSFv^Bf=K$-tVb)^B{p|<`-%VCm-ebRhXR&m_8rQ<)<6EkQr6!6-?BWqst7ueOOZT- zYVzyj@TEVFN_=cXja|+lU_t%-zUsI)d1pR`16dSrfMky~<458I)f}5gt+AoD}$JyVc6P`RINL}Q-Wa=N|VZEJ40#A zUv4t;5R+Nw(weICGFX>FF@>~cCaJC4LCAWsU&q$E$ARb?Gm2-*hQ3gHq{VpHSz_TN zS=LA-DI=pMT6)NmTYF*5=39j|Kb=YaHQU6c!mHuYm-7kj<$JuO@R1l}vQF_65v8O>$CacxG7lSm}+!(%#zR-n`2?uScP1sH|~1i@}ULIOAb;Lr@gS&C`S zYYi=GX|di7wrn+Wl{-GU7m$jR5D8>yVop@-3&SO0;`mN8!2secc{@Uw_mkHx-|j6u zQppvo(mQLF?IDI1B_jO~QZNB4f+zUTqf_)ifma}h>^D3FlyEV z`L?Ux?|_)zB+kw6b8-;+FzlIYbMT%Ad#T>0g_w6`Kf9ydcHUDUf=+LPCJE^Jnhvby zgDEVq!x4kS>BSE{r5;VPx?vEWU)AZWXmMV>#IWNJeUl`9`mw+<(=R^?z@+J!V@aGX zEXnu*V|9Z$nePK#_YZNVHtC`+wm?&DzZT#!38v(~gHB-CEXIK|814 zP4tn-SLJ?0tE>}P8KYjOaWyM%Vaq5i)`LvMv>`>&gO`!wh;{p}Uv!=f3VUV8Ype6% zzVn{_-_Iy~>W6YCu!j+61pk`1`lFqTgoUA#vZ>3Tr{6E?-VQ3Wq|l6&)`c-M`)1}j&U+lNM z{eHbX=<}z3^9o%tU`6l8mrEz4_dAc4pE{vh>^7roAG+|4oO%loO!*RF? z?OeYKNkC;Sez5K&ya1F=8p&a`7@Tvsqo4kBG>sx2RId3M zol=hQQz0G`qV>3%9`~0i^mYQNjSuhK$W_n#@qBkDXO~#JDIb=PSNhmj5{D;6xTgkS z1)3cd#}>%uKAQ&%+Fq29(W-OX-LTwwB}T~dB>$o96z(rdDPt3x?i9AlDDYq?ITM3Bi*ONSo$IxIc;sW_Waz(qxhBmI3~7|Qtcs8(*l&O-09D0 zvO6H_t(AjrDz;0T(*5%3vhfq1ZdsFQG8@#)UIU=CUXepe%%vS4_t7W~+UwF{Ve&*; zsz#|97wI(hVe5kH^jx+MStnlxsXYx9f%I}+r7;m}=lk^r+XBR*sdS3$_KJBbFArZQ zj#=x9=#PU*+uN+kOK_}xQgx12-w{)Hq6o*+%Q_XPzvc+|o1fVL)N`eiCy*Rogdu3q zqhx51iwUN|YrK|V%*0+tY9r~AdEZFUTj)|U2B-7I8h-z0C;&8~5K9kt{F9em56gf= zI@sM9K*vSihZ_=kU|TrWIDwxOgM5ajx8t;$!9|X4fMWEshTYm$53mp~QT2r3K)&ZJ znPcK97d9?3L))g5==SR~amvg#8(m@Wlt}^CNi&3SCVcw+CnYnWQ|veCcihrUt5G** zy~nw-HQb(2-xB6)5=!Ol?I=hF?VRdqk_{^kW?yX`r{V=5DXzu^7pIRuIEU%1xIB(a zefDS8SnRgrLaBdId-$QrDJKRPEhKD?ai%@a-On@-)vPs69=SGshNyD)N++FhT?B5c zsiQi2%QKFPDpWj%e%l>Y9qtH=%%QmAOlHdBQhTUjJwbbWXF*5xZ9pKZhx78|LmgG$ zFDZUijbFTs-*iJ6F7PtPcqg!?U#N1rUWKd$39g}ePZ~+ z^aCW0hN>uw*%|eE7jMbF_RbsW#MOGFmU(td@Q2YaW84|Ph=%wf8)6>WBbZ zH_Noy`OIf0$!@*`d%H`;i&tg@jm+e1*OaF%ghpI~q9>2H_sy!+TqsIad_b*a*e3Hu zqfXqqmQKUu3SOj!2ub&Gm8^t-tWNLt%$aozp()u+hNKU1_k09Wxb@g>d`i?7p%!iP zy9ZVif87#eV^!YmUvN&iw^WoxH7_T)gv(|}H=0wWu%wwF!s%^p2TN6G##kZO2n8r1XZ&F|nsPifxVRZ>WrfK$ zWLtCbRKX3~f6)pFH`k8GkHxi^NfhoqVLaUvlZM_JY@z!xOE1Pwf_Jb2fy7=_vEVk8 z#&x~S)v(rkq2<`HI|v5^MCU;myZKfqv@unM@f>lr5AN}+&|1&T9SKUtqz5wbIx{5> zja$as@1$if7&DIfPyC%0KWk8n)YM9>SC>W~(xU{J8*vGR6$TZ4GIqAkH>3~yBA3Mf zCe<~%LYa&dd~|7e=NVK)F_$%Ml_%&DoKlaN=Z%Nc#vQ4t%z=~UGy+{>jQEDw#Xy9) zE|BJ#3J{WSZ0kxm$D8=D|5ed!Q&A`ClzYHW499O!7J_T!0Sj{!|6}#Xk^E%)mdCdW zYFHtpb1ZdHM+z!h+2r(F&KtHl$ZNWzGt_|%d^fcRCYmFM4x#V78#N>Emr>CXgXX32E&o;c zkdM%gD@_i23EG#R+ENe+DrvzfyFKG z9MF9)&~qEh3I-abK9TNip?Cc8{B!b&rL<@5;1_VRUccs}Z^+3V;|R2KG8VX{na@$6 zld53XR*qILYX1ZHrbjP>KyQ`GfZI9;@nQ7*T+q$>jB~bOKm3gQzHIQdS?+T7k`B_$ zXQh4#U%gjr^kj|c^R#TNA{$zp7vy|LDxk{`gAu0_r9u5K{HVv@HZWi+5Jkf4YA~bQ z$jc0P%d6$P1vQ>|tXQETwRnuVR(!=W4jpUOnGyajudaA7CHdhtvCQ?s$NYKr(@|UR zzPFNByo_an>Ox?$u@pSK3=KDaq?RThIpHsVL^!vR%53l0YK&r+q~O4t_V=&$-BnXz zB6ono(Qkk={NzGw!;EoB!)ozCvw-kpnVFQ2^^S{tE?<#WH=X0h2Fx$Nc>$eQeY2c9 ziG6RL-YmW{uWu6_*yWV9^O-v`_29m3Bw5kX!cCUpc@k3RGcH(6WBdWaHM$rwK)wIv zmu-g`n^)rOL=6@y#ZKYz2&95ID&wPit-?#>Ysv4LG446zU2)iv2^pJTH7LYP%hc~(}E9Xd-|Z~q&V zP~7Rk%a*B%OXWC?xUgRSH#Q0C^l+q&*8Qg!kEPy)UT7lMJfCL84{tEus7x54?qMFr zfow@lbq8BW=k!>&W(1Dv1&<5MK0`2k)}o>pYkdN|Nq5-bG;?&qKN=pxtBdzGht z+QRxW;&BSem76Ek6D6dUtY-^MJdEluo{M(N;QLW5GZpX5uqa9FdXqPa{h6eo*%=A< z6pyxX?I29fej=r&OmeUQQ7iTR>`zw$RsuzXK`33aq1$(`BlK=Q4|$6SY%EiNa;2K% zz`EQ6FX5>3#2(QsD;O+@#OO$21k$W&p zuuyZRv>e#Gm#2}Gz>i3E?1%e2rrMMm`E8-BponPWP&cAYcI}1Po_?8hBkjrC|?y_dwg{q;knl5L9@gr8KakO=ppbid^DJd7Bs;GDPIwZ zabD-VzB1fmtr|QIy(Uw<4&Xyn5yK5H@!e29OF)VHq(oTET=_`mC*C)@(#I9Cf-=$W zzB?|!Z4Q1I0|KE4NC^Bty1N|6RgMj6xg&Hx`o#ZCA={iUkGIA?4OJ%DaAk+3XoJj0 z=bx#fLGHCUBPx+LXS*&C;1mfIY}`M;e1pZ)p+oP|8hkpaP0XS81jH{8P4>rDPBK}_Q8=$h_ zj4z zwh$L-Ht$POMS>c99f@AzJ&g>E%5w0Nd_7w&3Y;%!%l9@;kVjD&FH;iTXp7$mX>ADu> zACg_5o%@m_OriT5WB?-^R`e4@7Kzdif>uGtWbei%F+)HVKk+1KAb8d9!Sr8=xm?*a zgZ#xdi#Vn}M7m5D&dOw780+Diw6F$diA#D+qC-_;+bjxW*rc1G->`aj_5c8A2Al@wHW6s{SUPEriG2!$& zv#SGU>lu2#145Vs{=gZ_=MCOBTUb)38$^EAljn9n@3G~O}4}2HHJu_pFcLEsWT|XQ>wpqFLH8<1! z=DMw@>PhWt*4+ESruUiq5rrHwR5D&*NtUrN72#@ZyeU`0!d;pEAkVRO=7Q5A=m2ODbP&+;g&qIXV#uW^@Uo9@JOg-rMQ*O=ac?8x zaAz*+T|vX|`7qkr;eBxxQcLC0@Vtjld@2I{SxFWs*a5x5XU}>XlZbuVM{)Os9^3ml z?EXA5KYi!Xbrj2kD6J1XA1$rSY@fu@aX$~By83?Fd^$Kc-tGndVt-ffzIM44ntfh< zDJrV%z1*xmA#%CP!v4Me?6Lc_^&GONFLZekJE6m`4!P{J=j}KjajxV;oa?+)z6I7( zLpEAFp{3lNBF+zeeEQz|KhrBa9KlJo*uw4#eRTC}GwYU(olps~z)EN)wL_A(A7mJP zPu~yz{xM_?3=Nd1?EHnZd>=+td~?gYp4NK0U@tz?DmZxsM&_AyYMpJQ=j-0Hh^{LFJ_J4fwv zni2l>@~&3?yWdmeuz(*dA^Roq8^5Oleeag!@Q=-qNSf06tzYcp9q04x6FMHpJKU9> zerkG+%f9ly7Hjtno1eY1_0KJY=hE4Q!5OC_HEYpx<1DtFp`q(DC^Hw6Bj$QfNP8j9 zmCu{;BORB==$-E%o8*v?rGcGgZryVbMl^_|CAM8SH+ z;uvF){5->HXQQ>eg&mp*p-;$tfJ4b>A{Mar3jWJaKj9 zNy;kf>!{iJ>G~${K+6QYs-);?M4yr32L~0?XomTUcpWM8Y z`M6xn>c}96{fD);SrFaJ9EmS>6#`1F0bM`SHu&@^7aQ<1&_-Xf!kgvXwQq<|7w5RiQSMr3Ev7*_aq z^#}{vU72PzVO!$s`joXKr_6yX%PZtQbDFkx2-Urem#{xQ@vW^Ee=NkJZofHcKl}oc z1C4?B$`*CMgvC%i=H=YPGGH&AS5f}65op@#{W4(x&h>K0o@bW2@x*b7>d!{Eb!#sS zID2=qI*fai>Uy}Nz2evPknNi8+ImfMgmsh$$^Z?N#cF3&fonu8eTN_FTpL|uT`OI) zTsyD*ud}b?u1Sw-L3?Er+SuCqRUH<-Lk~6Agh!&x0$lv%`M-?TY*9Q{KIGTV7+WKC>>fCbQwNi`D?Q>V*a(D?AZgl)u#9CEu=>x=nYz1u2f$ zku~+zWFa3H!a*#%{K%^QK?AV0sjH8R;k>Q7GRdk6k^dsP{$Kmd2C-fjOcv%fh{c>Y zM!1>x|1bKhReh>G60GV{nd?osQo64vb<5oHd#(J{cEuI)+5hpT+?~D5+i(T_NKfPT zXA3c?y$T%S`g<)0N)mVsxKMzEKTQ{o!3z$=zeyG$3ptH64|F)6TX5xH7Pvgm_n5gn zUl11HW+GIuN8_{XB=D$B>C-1XWnH#3M&+dTIA1ld*|-{Pu=g_lbFle2^A^p>UnFDw23>$nG@$38zbPBigKbzJ5WU*obL(&_z@ zZYzrQP^3Q36;YDLl=vIqJ-~HLIa1}$+GEkPT8+_z`Tt^0n#=N4;)nkQjV4M3!f(V} z0J{HggsTA>2U04$EL;IV+5dGH!QUi{-#HNeM$}_PBlN><`8#&;8&Ggyk)ZrdQV)dz zfbWmmg=hfJ0hbDp1^i922*Dlj8*v!+7%t)0OC!1&N9{Nm%fBs6aY2W5kNdyDK3rM) z)h_qHp(#Tc@i*<_G9azO&_HHINQV2H92TCf!DBLc<+5c~nhh0JjR26y1Id^v^G9Y@+fLR;ElGdlSW>1Tnoo;HmwSMPilIHa9Sf(^1 z#y`2hjL1~g-v4IdWhCwYM;4$K?|agE8KOBoKTEeJDi}&XwRcjof)6y8KUq|6z4=uk zTyOm+ovvuFvt~b8lxe;Bi)iKXB1`Md@UuSaa}L)nL381tuoU>UlYG2)J}2UfK5s$i7n4fYM2;FK9!_fgAZ7Y(Pn##i_MIM(z9sfmm;vh}cJ54t z^ewaR`f=VyHS3Q)8G-*3YYjHgpG)SE`_5tG>BC8@AEZK`{GmPv)*RJN!_WK+rr`f$ zzRbn3KA^j3}Q*SG1W-KQ$`*u{Dl@j(?zrB=CLsJN*}Z{w*8mlns$kB zp<>WYs)40OH~u8jM%|?KFSNXUiEkJBeBB(gbeGMEZ(p~_Px(fIm0hxOAp|Qh1J)OL zs_c`s2_aZ3yc6lWecd5{{vTQYGRnWu?(2VGR&Ww+=3g*{_8+5UP)(|Vxu#yvq>xsS zaG`kcvy>ZijdFZOxEjt;$7*-lPm-vl@RHN3 z96Cypt`zdxnPQ36^Sm0)Q>SXb*#A$gKewMaXMOSKX8&tYb-nhB!zA@nab@7cK!uL(9Im?t`rL|9CU!sO<3D0D*4qhh_nfY;*-a{x)b1$aVcT9P2aLc@*1G znEy6ZLcMD^bV%M{5Qn1oglznDFl_q&EeS$Vdx8yrau}v^$Tr2Gb_W~0=b%Z&k$u5{ zh#&aZ%0npWbN~N&?}M^a=;}uAp-L)U#3;T%UXxFw&T^5*HjP&`rvFUV zLpv!uO?1x%NcNx{>-+_>9-4wd zUg_-&b?qOTtMvA^hgRZKp7(7AG)$#Hph+O~CdXxdyT=FppnmbKY{yA{3kn`AGL$cW zfxLrqXZ2r9Cutvqu00BHS+y3K5GNUY;-F7W&{e64`Xol5ji-QGgs1|~4435pS4fvC z#pm<(rR}U|DDQozS^8s&sPqThbOPH%T3OtJ7s_>VkqsYli(aT8GQ$%FM2bme(<=N0 z@&p(uzcsf;_K1B)-U+0uOf56wiX38M$V-j>lVqj(7+pjRF*5vRq9nq-$h{l1O-Khq$ z91JA*|CuZbN)Y>){Yn9k3H2-DCwTgRzgTVqyEvA(eNm{Dl*ywry@EY)ccoH^4fTE- z5v^)(Zv6TQ8tAF78A->gkiWHegf-s9fsP@dq;Rp5)&-9uuEJ{P73$9vY$jK*(5ifq8}Z%|qdv9zO^a z1Jc1KCru5Un1BQg{ThB)5ZA0{2RdnnoGw#XdObgMJ_fa9>D?^5i*DUM9jy7zcx-hZ zL$|i=SMM>u?7=?3dU~ZU>`hDk&fJHm=Ev*SOfPx|C=K*V1Y5v$yL`9Q<#N8>-gWs( z?P$#2wPSC?SKZTNOKyAzSl>p&e+`c1uzz6(gig%ay|DAzn~7nEU~H#@J1&AIt+V)j zk6J~V?`vXFJ8$|%L~$SmrG6AQ5w&~zEmxZJe0nE|RoJIMz^xqdX|eCwl|F?}WIf~e zhbit@=qxrB@c4e9(|IwGEKs`xm^5%tGl1RkbewL_gE*)2cy)-q>N|@v_Xp$JHQXAe z_?8SL%i8yFJ+XQs16Xt;Fjp^s;0G?85Q6UOXZSsaiTd1xQQcfDq*!&X|7_NOoEAOp zfULxJ9#(oE7C*&eL#MdcymuF}gq$DNQFsyg+U^gn&GjC`7~gyc?yPSW=vNXx*53Nr zxS!-L2gM?}Yl%C^IY^(()cd+hJIwU~{hXj#U+S@^ZYDw(r7a+Pavd#vO%o?i&sT9k z-d~wOdwPq(`%Q&2|0O!eS{seWr0q;Mg3uK=M09s`y_PuZQ8iXX#rvxLRy9yUT?DfG zWWMHg79KTG;d|Y@ehKNkT3z3W65TsruY#fn=H0Hk1L^sFcCa71p0Qgl*J)DxCa0oA zi*9C#1KGVkNSx)bj}Qa5gNSv%+-Gxo_f0@{P0RXa$|`kEn&))RmwTX3B@<7Fvzgx8 zk$b#)&PjW`$gw(yeRR(%t*6`VOWjjhR)f__4v!fepMNFT2$Ax<&1^YF$!JsQoeQk= zmOMep0F_(c02Mg-pK~D8P5IRn-x_F#Ku3c}8pozE?uNOWOPCV|bX5C+PZhoWg zJml`YT{Y*`yC0R;yZ*K|S16Iv-{GdO%%*p=s5I$fnhwUUu=P2s$(nIF-_yxlZtvFD zDcfl!=9{jEkRPllM zWn9k{)jh<5vd)r{{u=e~u$ zX##&kiR`}K$bL<|T!p(#f-RyERY|h^72D2j0`^ucc{j>t_qorRIJO64a4dvSd@HYe zs^5MIu!d@9+e5Z5v_}nYv^g35MkQzyJ zmHj4uov~a0lJsb?!&i%H_xNS-TL~A z6BEamy7*-7LD)}MXJ6cf8gYG^aCr0{x1_P2J;wS({jSzyrJW$0dR9IT-VPa0xA8sD z9(Q1a{_NVL{l7DU{d z+t2aBhTUfi`)WX4?Q9BssA|XKL^)A_mZv!29_A}g>@9M9-K25YMDsFlU$d!k?MF{+ zf8R|yyU*%Z?_-b8caqsk?fWHC6OLO&vx`CmgFKIK^5yG`e;pY@d$CqE8Q(|^+jbf^ zhpDZfy+bwoiH)V1E)tnm;p>Nk+%RkJDV(Kc>6uB%qhrlc_1d`nDS`XYcKA?Z^`Q@w zCv7u86yu%S%tp|cSB~lJWJT+l0Uu>aQ~RR>xO!N7D0=91c&q%S5M(eIV9~F1j`{{W zP}iZ>%us93(<2CDp&KK?AL^cX`9L?Lus6+!*?+JLz=@iCa2D8D2;Rfv#m|&ajkaQ_ zOiSTG_hQjt(4)B~f30h*?i;31Px4wdB3^BTlWTaicaWKzoUV|_iSq}SX>^;?nnJju zf|o<$H>o=PT_P=AET)(S0 zxSu{r+$+_1{BPld6VeH_AV&aT=j>m@QU5ss|D11i?Ve&P>J98VN8fWJb0`p|EO^Y+ z@ZT299DrZhHgcv-a#{(R9M^pb55)>3=7=}|FZpM`lrWbsPbEx*#%AFT2;&%2VcgJZ065Bom=hNnoQhhO5(uLVdPr8W9z&3-v){7 zOz?i1;Pcs=T_7bYFm&#PvVTK2t_k_bpZLOVei;2qeN-wfiHVAKajq)k+D^UUTT-RZ z*UBV&A55T9!=+Hi&L;KfFtsnH<8W5foW3^;(2S6C^;20TUg0qZ%Xt|rE$;Ev+gB{D z8cgx6^qdQ0B?-+EXcM;BQDD=W*qs|lSD}(Grqm}gbZUc*pk=S{Aw!~%=HM63(wf^O z#If808|5Zv*FX3)@4be#hqjL_?deCf1$w{`9WY+=nhwN5buX@en`IvE46vOdDi z5pumYQX2gcJcMM&W~$WR=fps~@Lgt9*UTwIyOK-28|?a}`AEk-sQFW^)6ASgq00Fq zl)9q$M$M|}o@h&bM29lb%g)+h_KS|qrcrI<^k!)tv#rgoZAEj>_8Xb{+F!!E9mW@Y zI*-~6z=7@4Z;uFxz-=n%cKIW>%o93FIPhBaS+02kRv*?z~C)|#(@9QRqW&%}w)lk!Ju`yKYx5;*##(Gnvy)mp1pJ-zasx?Egd`Tw8{KN6`p^iIGwt@Pm3-<-ty;Hp ztKtiWpo5@38MR8C9(sIIpUFD6gNv@W(-@Gplrr6Bucyt~QzuWdVHx7eCyTKX!jWbn zLdxW}Mvv=+ov69+(4nHc*-dO><9YXaydWe53uC7t;;}3rye3))+jS#FfP}9ayDm~j zOYfEm2fOBdH%iM8T1%8vuCEYjw2WHCL$D`M7Wq=IJ}3?nfGDzaaijbtdkkxmTQnmik`H$v2n6l4oPVtS)j!|SkvHYn(++xMW(6EMpn znn0D9(H7;;$2?b|*JgxC${?VTvKvvP-MINg$Res$?RRiE%c5@GP^r=U9Mor>(l#(d zBWE?+^7gd-i{FvHui%-k2Yktoo(F7D_T9WW*sSM$)SOZMn%)3EViS?B?c>eTER8t1 z1TAMm0RxXwfLc$S59B0mKYJfX?Czv-M4|%~6ANvIW%B&QHl5c|y3@Y%=_S*}NZglF z+V#|A`%c{&HZHDLLRyi2xwKqquJE-mi>yO&OKzz#EF?7S1^%NH4uNM-#EYc{dYun? z6i+w9I}T^^*9lF6EE>(n885(lJtdw&2B{y@&X;l}di=!|&QffiLSGu-je=05Z5H68 zz7zV1cTeTuZXCTu@ZlSj1qJ&>1v)BQkhnYMR%4i2TyAjfcB zi*&aszU4ffJe#!ma&72#LL85)-_sTsF4qF!Z=WV_)iakX>I)5ZmO?@aVgC{x9j@~r z=P;%+J*f>w zq?)UO{7lS<^9YX-IUC)EOS$hm(KM<1{7CWxh$)D0`>c`a8f`GqH}Z*IJigCM_QR*d z>rg}qo->h}BnsE!wM8eMtjm>m=}n>8ux_+BwZCKLVTPqO)3CU5qY`{a>*Tn-%Va)@ zLk!^vJ~GX4-0@QkY%^2py3lvL(pzsa&Yh>JcMS}d=LdaS`-tCwh$Q`?4ZkMBS3=>X z9bH0+6*ESLjj@$KS-vj?n zbDg5-1`YIm_=x4RWa=MG&wjC;9K_BPN7j$DE|aM)8rqR!|JduSPyH*p-LZ-5hx&AV#%>$bi0Cl;sSn5yPdZ9}Y+=)3k zl!jvl_@#Xu8x^N-7AuPporg#E+(kG^K+@r=T}Kp?FWhAt^#jG$GbJ2f2;Bc|*Wp36 z(V_MSBjPHD=C!=(me0wc;O?2NcAd)R5k~ac3+|e5BJ4?|WQ_*StoaqCkJ&l-IB@ri~*K#Ov%bGdb^1=>K-321?)EflouTl0rA*g&Jm(Dgsf| zvwgT(Ql+6$$fHG!!qT*|)SyYMb65qrbMD^!l2~$-lDy*LU7R%w%w(kE-1hJdsf)WQ zkc>qs{IbK9d&wG@TY1@5tuv0EcEn0-ya3l-?7->BBb|!KlJmz=j#TN+1L>{YnJ4(X%3Actcr(aMPc1woSfl&B>InYxjnOZUUmMqE7w$}k527J z(EZzx!wx4iNR&CK5$EE1Au&mM^4N#C8+abTYs zDUw1T>sj;J*B7gtd{0==_DPghM-M^KN38$e;Uw0u_h>uM{|WW#`Kw>SdhBX8-vQf$ z0Ndu9&UKLfw9z1oy?2oQ`%|X7y!^W8)%;rr!8;bvbqDdF6F7i|Q;vEkh*T)N2LAZd zrg#pSNfPSzTwU6IVf4#Wj>b?B^N~t5SOQ4>FgPbYE2pXkCu52kiSN5_40w!a#P+qi z$eGB#;=8Ig{!};o)5{<IApXv!xNB=Y9M8leujWh>Cm!D~^{$I3~P z5Ak>CATzv>P79{__e*EDNoGd;`W*!?cE}?Q0F5(^XhFF`NWR0=y{z;~s0E_Tz-cd) zK975*C4vm~4nsj`T9o|j<+1&3jqWTOf}tmmiYsXbV6GL8lx#_il(#E|>ZwA>mLXAE zDZWY$nfwO+eG5K49UZM?@oHZ=u;5UV;iD4a)?|^&DFajKXJlWpUD2JsV7cPa*6W~krd*phwmzx#A$q)mL0!{!)0?^SQ9`-IrKz}@&`n-DK)Gm)K6@3 zmc@}9Q20`#l9>`Cs~GjZ<>89RVz#o#;#L(xWne9H0cSOH!RvbFf_n{B*^zH0si44; z)P^Wk&PJ9}BQSXSdGQwZPl8&6m%3`IqifsheUG-yYParuB}UJNh5gX2j*?X1J0-%) ziNaE&XZlL!UHuVQ*NK-QA=T5^I~X&rQQ*joRjJ6qDcX@ZTjm5Sf_c4pxl3{K!dG zhE(LTqim64qA>9yrvTsqz6KXowz(vu0o8s7-p2$XLh? zkZHvl;Fb?m1%kH9P7y(qX#rAonY|7mKG6!>yPVE5ns8o1?j8)+CowzPqv4Ik8^y%y85Dic3sr&dSGqyLB_52__-W&q30b7uu#z@Yz zm!dn$5j|_bHP>>t7m}Sp`TTi!l6%Fs>oj8_&4Qz|7e|;FR^`3fpmdU7M9!-EY}z{C zN64$>>_?KyO;Y4`>xeZCXl%YZgXgTDk@3K=k~r*H9cz zAaE7JgzJmgFh|_qS`^XYBn;+It}n*I97ULe<#56Xs1Qb2UzCT}fxPy&o&{lx2w6L2~ZPgp-f(+#}8HM_}C6riG=WPMQvQ1JxcRiCmtS*V8P ze?kmb^@Im#&`0jNVFAqh!3Jl6t?;g^ehtuc^U2@36V*Y`2w*48+I12>LuVi@^m@CGmt)818WOzm(yk4+({6kse(=5WmafMLl6z0l2)o1`>`O8gv9+TU@Hc_t10g)7wk=G z3TWA)^#?cgI;Ft53=jfV90|qTRRH@j*02s_F>n#$ASEB1lliFS%IrJi02gx#6<07| zIs;X##hEbGW@09HFv4&KB*4j>Sph8Dn!U8@2~cpS zg8!8f2Ip%2E*mW5G>sc6wap}UDug^K7>jTl#ZM8V5?nH2x<3?0vhz{<0faQ#Q|JGUz z2lr$I@VJbB>m^qlxD7s7uo8Y_9PQ<@C*})xJ(Q-5BtYXO!!P$firJja?iQl}Cv^%1 z@FLvT*3AH?xzE|l_2^9Q^zb_suV9oM;7*^Xu8sx(FQWUm-oUL_JOP?m2m$W-Fp2Fxns=RCz$l2D3TFW_9&;j+QZ@V|8X{98&972I_JzjX6q z6yt?^62eA>j9AkV7Y?}P=OJvbDk5ztnc?=yvcWA_MXh##!-{mQ32@9u*ZML+qCxio zxO*@qQcR0S*IEYPuGJmx87#Sf^cntfr8U6IolD{LGu+{dx4+k|NcL(wb&-3ak>84? zSUUuua4PcRS1UH$HP|J4)fchIof_$IWdOFKBTT{hm!VZ{RtQo@a{}A;SP;o@d!tP)h91`3K zPH@)&f(Ccj0Kwf|f(Do1?he7-3GN!)-EDxu-kkrQd*52Uy1!jjJ#DqEdiHLmi(fFK zpxS^UT6DUHGr%b58qiD&vjskbZvp*+B2o+Z>_a+eM5LY;!2)~+69@8UaMkk$!%bwX z$^D^4vj7tV(m}vLv#C6%u;K3_)6Vd5U}A(q&`=C7VGP_-Hdap~Ej0IM!dHXRdKwQo z9nME!t3l=g){5XKU|_`|Fposbh{2OjDJCd58GynF})p;wdk9RffW;XKHsx#UnSP$3*;t8-p~8hP-b2rTXNgd$lk7#A?VAsVov3(x8u31fDN5U{L^%<4S`Ftg|D zIqO7Z^=5$?-xvebKYZyqs{*8UE&2Z#c7TIF1>j;6 zE#Ns3#=#$2Ky1PVJU_s0z4-!K{DqCq72zshfdK3GuRSaNh=0IjA1Ysu0~+5Ejn0KX zh(E`|jlW?5>V=`VE(bpKwFF@1Pt$WIjK=yr1sH#`30U^WH3A<(Q4fmfP$OXK>l2{9 z8*qEh0=1U_)OF*FfKvd&Zzxbig(BSWTO^?F{ZqhMH!Asa4OCMBO%g(r=;Y7#(4-7t z+5ff!oxXq%6OJ5c471mR4&cMYAP0T|?DZ%B`2L`Xpi{vP2T}p};!w$fDo`mYREj5p zeg+o@_YAWq@+E+n7qg_F#{ts#9<2sQG|<%m%OiOg+Hcr}K&M=Ohxo{pfRmmdP(mn0*Fz|W!x3@af+&#S9J|6@p{v1e1ZF@w zw~geoyH-D#1l}4EJCH^JCxeiBJRQv2gzkIw13Xx-JJ9=#KB=K!e3%ZR2Y5MP1dy(w zKq~lOrh9V;rVFrU*p-9Y1Du@vUybZWEf?*|PgdYr&fGo>p=&<#WGQ#`| z!UKSf=%EM)MHuiFbpXhNzzD+ts?mf28zJd8CYFJV z69WSFrauGtT<}HEi{OUyC;?7KbOFTtAIQUEph;Ay=936|7HphY8dSp>Ks*XXbLc+W z0KVUF7m$O`MG4-nQid< zJarGh3xNf?K1{lpCiFZIrit4=aE4XGP2|bs^0{DHpbr5iwzYEkh=H78?ojl|h3!!V#mF1dU@ zP){L)YK8(1t{kCBSPS%=;QRg(qellCs396>SUprj@M<~lz>P^V36tO7D&q1;j7cJd zAs%)caO5C_Nx}@s@0Sp9X~7RiPXWwqqd*ZGiZCzf@v0LRm8qLE5wK9-fcLVy1<&i~UCn{Fw{#UEr9XJ6~| z+6)auA6N{Eo>O*@-jYn){O`%vYld^5mz<8??v300cahh-31k;j*G;2AB8x3prt6N$ zmDduc@|aVfPpk3kXlUZO=%Xv!V-vafGAijqOxK-%ReIYexcXCQtE!HqyG2z3CoO!@ zapUf%CF)44sZQhdO+gWDCQ>6_f{~T9HzVoF3X6$6!|APwl_d}HT&IZIQ<*f@Zlu~% z$?;r={Mu90arZ9T*8T!2!|s&S~83I)}~CqXiq~xrc5BY#X40}CSj??NW5XM zvY(ZjZgKZk$l46(@%Jmzbp}(^r_rD4Gz_S9<%pM!6Gw2}<7@=jhjDYnnu3k%&O1b# z2DIv^&)wjE)SU~7H0@!T%JRuJfh0^tG_r*$LPpcM~nmmYK6@SBq5Y^t&XR zDy~f{{)shNhmE+sVlUfeQtIv_)U8*Ndshl(Q+n$mFS`@ZK0YRzDh^XWPkySqY?A>O z^447{(0Jc`tt&B&^HoG&e!xxi-NdOY8B74#@+@NzlRx)jnF_mT%sIA%pB<-+_;C*Y z`t_>yX*sq8M3=*>0FJV$%VC@!Enx;(jCDwZE5)OQ6J@|>CZ@vPp=W#urc(>x*jK$G zw~5sv{o89zhu>!*+NLa{wBC+<%d&QHoi4P?W8nDC7sO?jY?|jH!8$``%IBn0)0%J7 z5Q9}&@aeH>cf2%s^wzYS{`fb)aka9PUdQ0&KQWT)urkW+-x?d93hfsO7AAS9G9_2k zLRd-CoXhqU@;B+Eex*vmH5N2!WrZF`4 z^}YPx+SBz`UxuNJXQSK0K=Ke&3tu;=cO8=Rc;)mI-$-s*Fe$DmpOVlT?`5E{<-N7YDG0& zQ8~aBGyO0&v1P~6lA*B&U9X~Ea3^l^Px&Mowp_~&ml$D(Oc#f=*c>b=W*nm={~NE% zyYq%5^hIS@qJ*fz+e(}oDpN^p6GnI2-r*cA-J#ji9wS#}$hXl*s0sFuW_!ZzX&+?o zFWMjSeRvKMN^S1&bP-<5@#}H8lEgN=6210x>bT3CV1c}KL>Lxszt^Hn%WjyD>P~q0 z1!;FCT9+HYw3^{{%b3zg54dHd(GZcjEF+nzxDv0vB9HMbMJHlvzWDP?%E2t(QN}V<{cIzw-hTJ2MmFG;qTmv=zQNO> zg5jn{W2W<;7NnvU2-JK(sp+trek;B$=P-)6CPB^XxaDvdOVtex{4@F=Zzb8&SskC z;p^~qmqr;gK5Yk!iMkQC0V)e?>+rDbj%ezIsy@}n;d`gKDPPCT|9t0h= zGbO#GrGeNo;=x6#X}DEuH=*lSx5wPM>R+TrT8T%2+;rvA#sY2`-G-^O+2g#0A}waI zn*|4rDWoS&u~uMb*DuLMG|{baCY0feL3h)^7}0#+afMz){{1wDq^6U}h0r>f-hBJd zwMlK7ctsWHO_7c7iWe-*no`}%tWlt`SL=?9-| ze{-e1>)AXcLl^lYq)&B%Ai9h3w~59C0e1t9?n%A5Q}kpaiaK$}ObC!<$agB@MfDyV(hRj`8aX+UPeGmy*vXEI-~%;tOwA8L_8 zGHTvFQu)Z?RnT6qJ};tzbBgF=5I0wda7{#7#F~=ooy*&tmcR0fgRL-WdVi~+{oDy^xGr2AZ9pBTvdm9+iblTMhxKh0@mD@! zLH6NSWL9&$lEfob%k8GRNhz%PzYD;@I-h$yjIJ>ieO6mFFogV+j7t4`0sH_REK&m@fjAb z{XrHITuB|9_QuU?5d<7Bf^kD1x^Ygw8U@YjIu_hSuL3-*hkjqCh{d(zkZq;;B9Zi&wCWev!&#C8V97sC4Kk<+=YlTuLm_6`AP{+4_Q0T zLve`zAQ11SWe9|y;y!|e;Wpwi{KEqiq_sJs3^BW|%h}=Rs~V3@%l1o$oBQP`N+#YE ze~5q))7e2^CuwWgB~{KxeWKV}?*Ayb9q2W9Jx)jbvljkct*X71+6>-fWDpTc{Mjc2)AJT|6(!wswfFvEEGdj-{8 z2rL3lLQFbJzT>f~Z@h835-up%Wf^nAM{DWE(&7Y!`x*ZvR70pI{Rt|c77+-V=W~b- zZ-c2k*S}y{cCk6B#r@Ya_s8{ADbhLy_=wT5GPh)TL7NFC1659evj2BF$n#DeE!0wI z!2flQ`J1b(0)oB8B29fO8i$GfR%WimmV;5%g!y%w{0dSV3h*&9hDrjG)6&u6y|TH} z!}Uoh@H%4u3n*^agC9&n&aPxT9z=wS0VcRx81%x-`FLWzE0|$_j*fBA3)$&bB;yG- zR<^>z^s{znZypQ!G2paB<3&EyMB|w(Yvt~ZIY%&Nicu?f4UkP<-3=t(ty_X?4k=&p z&CX)Ae(-kdtCYVt(pyY9SZ*x^1A;uJ_hxDv!EwMLjbs7AV&aVCw;*m*BF}*!I5?IK zWenU{&}w23g225aMiwL(s1RLmWIITy#P@`#mJOrHFch&O=SN}a?Nz-hpSV9#`#USz zYAWicAgA8Ab-gC(#eku8qxXOFx$iH_$r3r|r#&U_3zFhPVWafs7|XYsw41DwLQ|A) zwx5L?tLV8Y*p_eutsV~P7O)va4>!MXFXq?6t65j>TQw$QJ$9@Z7s$pK>?CBHzx9kW zI(L)bc9J_Uc{=4q1o5<8<<2&%?a3DX|5=kH-ltd9cA0^abYn3YrE~aUwK2uO#gb%- zD<#JuL~3K-R5J_r{O@N5 z>A*Mf!M4<)!Q_HAt@BcSyu)KwP2ESNSnuB&r*2+uW17&16F!)z zaM$xgD~HySEWXw5AvHejBq51xht(mt4SVWFeVr6zZwt=V8#J6aOyv43I81bg@C>?w zT{BrM^1Aw#b6@0{8{65F2t?QV(-zc4x_{UvM!IJX{@I^RqINn9N(Juv48UcUU6cZ2 zzhhRP#6%-&X1broOu3yt(F$JqWXlegw#u1R(LN0}Ud$U8r)4gmDzJP{r+y)rym4KA zF=)RyQ`~}Y43W`CU)YCy)@66TNLmri2~*kc)BTGfys8m0Ss^s(S$840u>XPYNoB1vtO(Nj|dQBzYu-iB)Kf8kPoJXd=e zk=b`5V>FS*dQT*ZtGKTRG4&8V4VFeTq8N_Y=oc|MRMK^nEm(8C5O!D39+fJeevxPH z#AZrV9|eBFZjDjek;|_9ajPXG8Kh0NyX-6LTM4`-@mL!21dHVQg#mf8)W|Mjj>4(# zkx0cqRmyhKwq~5TdxEE1g=XMv=@w}{|0v_{u9F&}dYmSL9Bc~PA=ntCi#ILVdv+dL zuLTC!O0Poan3~=1K;oSfRgggJVu_~_#U$t+*a4F9z6XK?4Ccwaf_*8;KK2uxV8pJx zW|p7K37dHB=@;L;wZGvD2UZDBB2~Nv&zrvdK9(;0B0QpsI}K4)%aOh>DHDopXi(SX zZDuyN(q~@C$%ELG3(MZ~y_Av6tC3~srU>v)dsm#^^(-CU z+^$2MBZ!utzJ=c(rqu{vDx|QS=&fY^PX*=zYmqg))Vjd4u>5l#xhuku$r>ZWd=$$p znij8|*P{RhW3;TX`disl0mP@fjiP)?S4)$V-G33UBCNl$@mtM@Vkbs+ zxJ8IXX722roL!7(toh$+t*?9ZXG?j&ah)y9EI;`2El-rx5Q1Y>CUQ2b6c3wS?~jdj zPV7^Q9dWIBd$cRJ$-7l;cn6lNwy(^Jk6-8uLMhiOwuk#ZLM2DxXJ8X^>wY$Dy!n0n z&(i_F9d)Lx>6}iHKAHKwTAGM`;L3zwKu|IbR7Fl*>GMP*@M^OeCXQ#`{9wz=RIo=l zGarXgu0eJShmjV_!DyHw(EV0f`#FO!)rrBwZbCUYZ7I%{n8UD(->jJU9nN`=*TQP} z$5ZIqOuC*<=KnnW`989LUc8-LnHj=6{ZeR$htVx?w!_cY;hf8H?|t|fazx0aAH7TS zlpaP!6%`{oY$F6cqJUwxbfm6yDeD@dXm}z?p(yZOZ^+zr&1zN>!>L3vu!PL`BuQ5N z2#K;RGfH3NbJMeD!|s1ujmT)Ko@k(1J*pmGKtBpP-_5;aR{NHobIV=(wo+h^>giq^^1xXfeJbc-9{z&59H?)+y#?G_j zm7TZx?NQ2X^!7|)!fG$@aC2TCoZ&W|_e9X`N5z9S^X3#Z9zpNj6{X{^R%Wd;_7lq~ zL?)$dxN4SB)K_S~&Vp3RaQ-8LB{YeSk!fUG+?$o<9FWE;EvCKr4sz6yTv!-rRqroo zmCcA2Aib`2u!>p|EM)s`gW*^xY_&GRu+kEV;fzMV)0k~GI4JH;Mp`^bWwlnNtiDSG z7HwyF4DH19sAC)X*W%62L#=8OF-;|5B0j6jAR}WdhioCocJfo&$|T~~a}k|aY$2XU z59sBh+L6V4Xwa7^^&$nLws8_|8L3}KnX%$wR6UjfqN>xCnD>Yy#F(g{cXM{uObN;m z$Wb1-Zmdn9QInn}u9Ep^Mrwx>&qIWvYQoRv984HHTe`-tpZMJid%Q3dwV5Xy8eMe# zSfZCb%4Q`fWFP<5o8PvEurTC9s?b)`Isu)&y+N+hRgEfSszRuk0?1>m!3z_>CmqeJ zBKW(o#2QvkF)(dD?)*^>i_e9esXRI@Q-p{^szf6Nm-fG{_;?+@cIgrym%GP9QK_&$gL)XE_?PL< zcEV1ZJ!DNc)?12NonQFm$86?34C)4O5)H=1z!}_<5H)JY6SX>;+l->H4GNGo2oB9!PD!p7R^J&Kxj#9RrKLmyW+_hN;MZqLe#Nh6&? z;G8jJ!~2^R<4g#P&*i#^Ng1=wfhD2Tus!1gc~$LfWVSD$2l#bPm1vsaFYQocNa-1WhM?y~PborIy=zh^l5+klc$ovT@Y#eS;R zYnHX3@Nd8wui9yi21d(E&o>aMB}yP^Dw)<6o4x^Ts<5pi54ow!zPX?g5EikioT`~y zi%9|=i?J1A<-LEi?Hy9$@SOk1lJ_2(J&yFkBlxfPWC2z@v~VDF0*x9}ZWddcP5*%9 zur(&b8G0KmoJrln$iR)(#-6)@z)u%t@f&I)`o_6PV@iU8vV}^MRE9NKV;(OqDdi~ zn{K`3J$ZO4UD!CP{Ou*u_n7`j3nv8RB=PhdU~-$AA&cb&agumX-eZc$4>h)|x$Hde zcFJnlk6xY4`A7dMu>13^z1x+_D_Uw_ln=Eu+LPawe*{*(M6P4#hN|>P{*xMXvqvBE zQYACFsM6vGWaN^}yE_t4lM*VXd2&lOwbqxOvt)`VB0?GXz>}uSd1RTCUMC*p!%%q~ z1s^VYd_;5U#A`QNTwI?kGp7x^sWmVo{iTs&)0^uDkTZ*m|I0#gJxz*1{%5Il5iSrP z#_34B%Y{xQc4@!Xw&OJp6Eh#T%-e7C@}31k6jZlU=1ug53D{(S z;a=xHt5F_kRaoo;tqPO>Oj97qR!?3`Qo=uM3Tiyen6DMXPLU#U;&_2i^2?5tS#HuJ z?rqg~-de;U(Y1a~S0A%^0^NXX9_l6XH$_2j)%f}pv16f50t~4I zO3bNeel}I&DM9|bP5?{$!K$1UbVIexR06-W+gE`>{WNnJRD07geoW}US%5TXY|7Wo zv%V+Ix%*z*H{kf=7TqeQ$y+jHje^>0tJx z@PB$N$RoneBiZ z!@nB!99Tj)TrnY~-Su-r`4267}?0)mxoQRd2XJ_+fHfnO#{5PjwxH=_L{8DXOjdk2~$%Fj4X@2Z*hMg{3dSt z;U|{!nKBY3oSTkDa6!xYw7Pc=(Tb`~Hn<0dNxNZgh`&*x`4#kz6(6{E`XS2VdOLmA%tIKCqI@}g9@mEzl2Q}lyAc)+&PJF^U%YJx zZexm_gbx#Aif^QZk1;3k{$4X9f^Yf}CT{Ly4pbcH|NkYPMV+{+K=CW@t&(%vvG=4X zTR|+L!3XWZt(2dmT5#=tC13S=iXsy4w^v_v^XLWbwthgaI!dx7*d= zWYc&#&#dEYK(-Bg<5^L%uaAz!vLaL2-E`WXbXAt+7pUitlxMP#Dm|3^2ApH}g{4y+ z=+3ru?FTrHld^2<%{j$!S?WCtOeeM-k2*@iWp zJ*xi}kjaBfFK@Y}^Jp~Z! z3?-ONuJ|RK877GZxMAle&wWCR$+$DdjX{|k5q=1ARS1l{2t$J2va1~GuY z%2RVtTyu(aNt235*q5oQA_h5g2=cxp z?jXBsWiY%OCcB?uRlu3JIfb8is;Of_nEz?3o!ekEhC?oKJ1SkIVVYx4k7&_*Fwd}% zEc*YN?^OS3zUPPCV@nUZm(n{y-B)NrVka27WX3cW$}!#4Bg+3Z>(qiZTft8=OvLb6yU2Dd+u>o)*EA zOwcF;mVD}wmQC}Ze5d%>_`Al)OZjG&`pvgLc}%nhv9m3-j2KO)`q#MY+ql*k+FQ|h zvW%bkhErnq^9o@{0!yebKW!pWH_G%!sYK;dYu(;H=5z8JoSPGVwim6CJiAzthj56Md- zl$l?IW2}M3)A$Sj*Ke#0Jv4^=R@oIc{_yJlxBLAYi(6QRH@w|d!d!B*UeUFIP96x? z)6A||6^6}IcdNYQrKLGEZt>BO&I(k?zmhe-+z$${mC2zC^+Bn`0gjP>OeUsh zxFC~L9x!EsTco-4sXESBuGa`!}mHobsjLXWG zZv5p@5u*4*&&E3%?W#}EapCX^zcj z4(LvOCW)lB`^5R);e7hkoOW=H_QU!Ow-_OT0)@I3*OA|j3H`ec#SLCzv08$CTH%b- zvA6Q4J8EcrAL#+vAF<=U{HQE<(VC3iIg6~Rc>|L=DPh9?Mmm=%lx(c|uamDXvH3|8 z$rY7f!aD9H^H>+;b!6cZXtwC6w49t<0nZUS+62Eab5S@+3VpROPXQfMpOyKKliv;E z{4M^!VQ2}+E^y4YU9u!cvzzw(@wF$D108wgldJD|%gj=8DL-M>JiQ&%JDJv`ZDmC@ zEM%Q>*zY8rK1u9GDWDJ3g$E^3x>&zhGjHoO!FJQr0;d8isK<^<2}m~7hoV=s9RJbD zbAt6rq`I5dr`jUDZAa`3D<~&%#Lm_~?F>oXOhKbHt&Xrh;C% zSkTm63w$D$59M_7=T3ziG>MFtH^qz>4UtvLvZ(~+Ne5o5v4fh5hAbQ+r$U;PUES5z zO*Rlq9=+m%=v;vv0M~(Y#9ch`g{?rk>%_uc#T)|~;wqO)WFwu84yQq<|KFyN7bn3j zYkPp0NFXIVb_)g!LV3ZAbk@#)UiqNFP?EWUuwno2wu+;`#H{B*um22jaj9uY(TX$M zw@Y0#pq+%XsU26SPoIQc;yVLJas+dTe=@l%$>%X5nD-%Peu znSnr-t6$|+YQ&9<;g)><<5lN79C9q`v^V?g-Mp6VeLM@cnm@wS9MJ9B2YK3Tm!3|C zYFkIgl5!ePZbMLrO_&dD1%}$AI z?`}G;p3%CGl^3i_XMv)a1?ir7*G`q2zxz2o?6+upi~PR}ou|-WXPh}-U-@+W*>>Q| z`o?Q#1=U;r(%iXeOnhAvCH9R&v+A_0;BYi4czM;EH)?%jtisnjC!i}Q<;1O=QH;?0 z;T-Nvz8RzLeM4wqO4g3-;73;$Y42V59f&{dm<`>vIo6rC!}n*99PJTKT}fev6(@1U>Z?QE$_=6Jfm+$r7&hwy&Y6E12bLO1&B>NR z-90V(e*!G?9t}TwAD-{9q$Y>6;SC(hNYu%7)a!BT?d5!J_dR})+g}(vXJDtlep|(1 zzqZalY&&ZGY+yhzdPj4aEWnmYeKBy8-HJ8D_BM(B#zT2A;6KS3$kbY&nAct(nX;=u z@z9w#Ky){07ka9|4(CA|;;(f-N!oNiY4FyWCh+Xhy}mp(=0dA3DUJ06XLFbp^s;j} z`5CJJK564VEBxI{d=NCMv>AUpp0)d3PBFX*_3gp%BGV`0nEq`)L*VAN#eI**{=)Ry zc%84`aHxYa2esWf`D1$`)+DDUBpYjW(%GUlacInoHm83i3pSp`G^|y1Kx>`;Agsk* z=J616si!s7p!UdqtUigj*-8i5pZ7mx-{e_~4-0XxuH)D&!!-R*4Qfy$z$5NlG=4-Q zOx{7%pS&6U8g5A}u)R)_nRq!`QPYkjxVWCBQXg5{nL+21aJMpX+nK@0PTwKv{=i!9 z{&1ssxSk~M;@&-6SeLVwR8zW<5Q&)VgI?%n5g-DLKZck1;5 z={Td;{hPbuC|yZmN+#t+c5;_?hn4$OxLnite&rS4nWek)-vnn0e*?}vX=|b9!F5=0 zX?uvWT;wCov0d$Wv$$k8d8dr0^(K?$Xy%F z9e+t=JCBF{g~knYi+7^3RqXdCuvWILH?hfVSI~XKQ2hZI9-IiyB0gPpzb3U*{0*Th z+nlJkNYRWvr|$r+KK$7~zu_tY`-(o?60fRy(l(VyZ^Cs@u3*TVe$ET~o8Xdd`TP<5 z1TJt+Bi((T1n+iqozr?qo)b*5fkwg`$M~v2iA$xg4OiMxa_uh%s@~i+CePa7LohM8 z6RcOpM_bQ3)t;;G2WSNudf{A=TC(gVS+RVw{c8*zzOvyL_@LlTf7u9T_bXjv#%Nk) zVb4BKF&!9F@s~KMsf%sYL@Zw_eB+mD0uyyetuS=|@Jier@5Bf9c-Qs~y>iWwbc|j6 z<$!(o`v>ng?H!#6t>H{N<=(oikhAe|GL=>cv0+3t%o~At`x58oWR1bNyG@f3BKuGG zLLZYzhR=A7VOPCHbMoWvhJ-@Q1M@ZiMmu9?^;N`X`xh>pj-3apx3zX=i2X3*7e1-A zL?Fhd^vgSQa_5CW?|VCm&4T;2N={Fze{uRDj#Cbeu0cGvy0 zUF`7X58|%Xq3f6SSBk_h?3OD2fc6p561uG4xFLg|Nj^Q{Uk@!g79Mr%h&gc;R9=61 zYdG!yF_a_flYPBSH4cALZanCi{S9udxUIN_(6e zGiJeHa_;So1LmM^oK+45Zf5))j5i@?Ar%XBqSQ=v6?5G$q}Oy&AnKKx`J5ocKZF6! z1O+2j3+X7ken~Cu|Gvjxu(4IC)Dp`Bn&|9IjjLZDIN#vRism}u$3asqiNXT~*oT^s zAhb3&Bpn3o_Y0lfe!&X;XAWZ>{8WxX%bkN1LjVac+u;@zv%QvPv9jB`qrD-xtW>?T ztFFQwEp$O)D!Imm1Pf93|K0@p;xq_(tS%zNul5y)H3u_l)%%WxhO?qn8KogF^qFRc zbQQ2i@@J30yXH$|iT^P5$P{2fL_yx{Fp_sMwRk*eZnj;){`8A<-bk6YA~yc3r)P3V za&5W$F&9czp}J`*`FfK?SZJOuboe^1j+ix5Lrjs7>CMN)*fgI(v=>vc zeeRw4_{SOeSC=kuXXNT%O>*Am&;8Gv!5@Gjy_H9CbSUSA`nWQCZo*Z*OqinGrZTmq zu@$O}4Z$0q`?2!*IE}v=JuceL1W-^}jGe^gMiXN5r0UgA*ZiA(uaF}(@av^;y_v%pSH90c;SqV+W_A_PqAV9PT~A zy*5hKLH3k#bcj&ybqqm!C5F4l2E{u?;dgM*;NST8ud8tVJfS}IPP%ua^7c|TD4Y0= zcNtr8RsR{!AA^83QxqSMy0%%L^)7ObTRx;RH+6)A@)|s1Oe4HgRBgtA>)=SQcsn$1 zyX`t!@b!mfv zB0q%NaPu@-3s?F`H#>Ll*|Fwvf`tA6#rL%UD3X$DK=xx z9Wykb018$?ep8NEvY*!re;L`c0zEQXyLY;}&2I#nE*K8_v==_%dWK1GJBVQ>My9g( zj!^hdlqWk`W23N`u&hq3wd*}_=^D+vm^l7v62Up~#^q9aO$u4O#rD0U?}B~aJj_e3 zAk&(MM#D{UbUlBo#F$sK;Exhc=u(Px_f7ItbT^e&@P&5fRo5!PN4_PWw@m&YVC)~2^rt8B`Ru}Vw{H%81MO@8${%n;@+#?bJRnKA|ZUw=k|ONZM+L`{;EqA z-SwqkPd>0m{qJNJY}V(a4=L4u;*xA|xwKwMe(GykctHO@U{0i*ibMPn`~h~q((@M6 z{cxh5uI761*&TvWPbeCyeVYH1J8axb4A&=_RK=_lXY{i*mXF^@NiVuJtt0<p zxJLy^)J!W{qED1)-w`v3*Lfuy6qk&MJ0E-AMYOkhc=PE=&3= z)Wi7b%|v|bRDCoI@QE0y%6L;$`z!7g`Ijthc`RpY=`FF`SO`5}%LL}dmDS(xk^Wt! z>SZim?j@~bd=G)fpfZ;~M%x6y4pFHJQG|Qrm6yNs*I`KzM)iybreOo(>7kRk4v5e2 zqVi--sJ#x=3T1-i^mw9AUtWf8^?V5Y{^r2`0_h?Sd)i-hx*~pGkY0 zBfwdB$Kf8taBY0{xLe{19`-j5aET*$6iw{gm77JoTQq~a;l;3A9NaHRD`-y>_{PE& zpgb?X_t8~fGCR(K)^+He&OS|ZTR zJNAS-&76N>v(~JRXF`v5(%8uk-o6Uhv5&)B4O<^2Sj<>p-xH~TkE0pmQ9+PZ0XC`^ zisOjjPV8E0SsA1MG28J~{3)>L9UGV3F)PO|Sz&-0A<*38o4!_zLaQAz>_-LsYfgqu0uVKF8${t-wE^Wq+OS0vj7?aW@KQc<0MYpj`dr;$4TKO z0PVQsew|Ls=j?KVT&X8aosC0lypL6v_YFefG$PYTt@$_jNs~;x6x3_vKS~aow56e8 z;pMYWDRPf1Y1tma2xC@f;QyHlU*xE>mlTTBp`-dFImuu|q5GDajb@6*<-Q*$2|d&S z$BgbQ#nb{e>)$jdY~PHLTmzeXL}>TDWjtNqfboG>Z{*!if>BejS65Q2(O(B=u50MsaJ1amMq>G`DHv-w zP@?is{{2Kuup=bN`07-vAz0D0AqwV`Y01gr z*abG%LVJUS$$anKJ~@ZHSVZdWev$fpqmPK1d5@ZhoH}u^ok~&&ShYNaJvB35ZS6}X z$~*hc>6LaK?}KD0FvPMXEAHF*nOG?8KFu*&=1^0J?eE07# zjfged$oBor&v$59$Ntz#VIey#2Apg(6qocNY50uV*p(rcFO2wWM~p(jsy-#Q!`;Vu zGOUFf5d~?J_!S}5XziUb6r^en{P2O9%(8@LTz(us4{!hxw_U}gZgX%BYvL;yA`fzR z86eaj#BOl4{>B^A#L`}Grj`W0+Lk|Lb1NcdDKItLK5Y&b_x}i^Up#$P8aHgwWYjRL zxU93(esHcl^V!A|bMrHFdY*NK(AIjXsYNuv%J`7LOTFR#c=3+S~=%UGsJ|AE@O*F=L!Ns zdw-FB8C0`W6Bsn;oXwL(h7X-g!iX?2XjJQWdmZn%<92uY&}aT=C89^Y-3g+<1`TA` z{WWz^Rr{u7dWA>%GRY>KyVuU>@HBfbE2Q1G+xY?_k8%L|4pr`T4!L`5&wOvuWScag zKxr`EhcquS={C9CL%0HSM4x!qZmZud_91^|7e7?%T?4MA6n=8ahxOG)D+O`e5u14B z^rilZlm9d6ZLMUghGo?*ZsmY?<T77 zB@3%AA#NRYFpMJ#2}&&svqAgYdD2*IhapfRRQAln82oR8d-6vY!?bmN=n&-Z7%S5U zAcZlt-q&WwjyJ}WvA92R7F`SXtDo+E41YOy?8V<^S8}Ie#AQX+yS@mz0Y;`&8nhmK z^}L^T|2`8`*Z(wlx=+m@{AhF>(O8Wf2*Q3Ow_rg*Lt4fE`_XjLoY_n~)CL*u8%p7m z{A+w%2F;le-NzD+pc$3m2(>|?)oslRk5vl{(mbm^jjHgyMs9XG-r)KGU1dq#=&fiT z-=++Q%QceN)?*tji%0hxZn{0Ou28g4T8BB|4H3>>BawCSe$KUBVLC<0XA|Zh{=eb$ zMq>*E{}u`2?9=Lv&M9SIsQ7)_Ct%)BqZ8g&$qu=hW8ODc@>?u=As(G-|7|GpB$0As z^ZT&n_hJ4^g6z|e--oTg4^6sIj&QE#EIxOhl=8eF?32w{tGt_ZzPhHkVT}sUocf=r zTt?nZ-9dQtPKNSc4#eCP3!3#tg{3@aptxHyl5bvHeQAs5i$z`^yzz0l=xAu^2jpJA zR(Bh?<%Bk0(>+^rdAhU@xrcjg6YZ`pRCju9^wY00T$laX= z|6&argiE7)@OX&?n`H_9wJp(YgiCo8S(q*5#!la#y=ZG^VoGA0?73y~D!(^Hafz-Z zuVE#(&m1*$B(a0E{o=U`vS>PY*Q$wn(0q^_J_xsF#`+Vzw>}JQBlO)g)#7o=1(Pc_ zvRU^i&LfZKj?_#T=k>Vl4fp6_@Se$a=58t4nT4Rk@FD%>dq6a|qs=wVDZc6?o)IDF2KEFG{;$XQtWqwjpM3aYm-?YSTSlqVb3F z<3RjHhk6OvMn(ByCQ&%XJm8(WqB1w>_DXw<@=9B;=qHY2Jm-yX zTl}3p3%i508mnk2i>~uR{FsYY1_erc;>W+SiVRQb366CeL#E>7wXfV;BW**(LB0!Snt%I;^ohp9{}%#mI_-u6UL8D5iJH zWr=lU-Y(Uy&D>+-F6(>Ku|29V$7|I#)7)mO$Ff{W%9B9n8J@z6-}b=ee>N8bmuR$p zHGJ1&KEWySMgZCv*lA)T)-*C6kBkz0n)DLC*pwe{n`=1-v}h5Yp}k{*b6e(qqpTx> zW31~h4cnf#9HC1SQ-pqIei!d6Z&dv9+K_SFT(XC|bX~jDyB={Y&2)yp@R2kk=5!ea z)LBKuowpPO$g|FdZ5F9Mz00d9))Nbi9fi;zS6Pf~Pqwl#3#_OOOyL#twA~90IUVgtXyg&xc zVSQglK%)33n?Q$xk^oN~8DI?yzta+MsvV5lBEPvI=-)lqJF-whK8f7 zkle36(K7W>^K&&hlKo8+n3^77*hZU6tyuNWl5QCd|Lblk_xjbLWNBN$UWw@yz%{*@ z&kR|eR}>Zxy6<;seM3iE*eu!h5Y`b+cdq^5kmZWl$^X|PcbET5i~K0Pk%~flBKyky z+$LsmQY2EF^6FNLR_dSy(f04@MhF5&!E={K!MwJ-C9V8|cM?PpxW3L97)VK&ScIAV}2b$7a82Nq;5gZ&%HI-jK z=hW)wt7g?s@3yY^9A8l)PH0QTg|&M`8LB?9C&Jkx6l(oTHrZ}MMfveAfD&K-#z3|i z5NqE%iqg% zu~+P@f(>q^*w7Ql>OR@{EGfE1j+f%nc#{8*s&5L;gb9}pHnyE?Y}*^#Hs08_xzQWj zwr$%sHnxq;zg6edU+24+xtY7EdZuTdp6<5H8W4}au*iVQT+cl13LUz8to}(ba}M5q zT;Z-%vpxW9lI<6WU!k@Nu0H|TY@#SN_QT+BpX%v2G*kyw6&t*G1u-OZJadE`Cg`(ofR$PIFJV0@Z4Uo3vt z#VwdEWPZ2mkns;OyRf$C>B+&oz&mC3CAD4RTy*0X^M0h+u=hBt`%{Pn?;l72JX{$@ zvE@ZXsUgUj8OB}Rm4kLL60;B$5qqP$)%v)!y5=kWKzM8;AntmP zCsu^V{u^i51czL8uuRGvueq$)5wrQ91#XqA;wT$_7NMK^%ev$gCW-hf25I{AXzbN1 zH-4&vXz8*1)@^_vtNCOgXGJH62h9zBM#RnRUs)7i&+GOR~~COwBIOx)edc6nFnQ zz*8N{YVn~zc&=hH4%~ydWxOY+dZ@?kwyxlmDKflJXC-)ocU!}?JP4tOi)a4Ilq+wU zPr${iE}OED+m7K_nzWEe#W`Y|I{n3oOK^r+2sh2aPy`iy-L!NnG#QiAv~enC9lg`k ze=3q0?bkGUs?ZrD1cb0T^~GK&)&l}pf1+rfoML-TaZTB*?HkPWyK`y_7=DFZS;ang zRk}NzIPSYeM1p?V7WX6-2HSN;bOz}sxX*+%)Ht$t0ie?%%{XfEjR77)go^t!AD!#Z zW&mV-HJ+`QA4kp=7Qe*A@Az3u)K|_EnMJ=pIeaWLAQ9CuuX2&JtnxQoUhb17>%gCs z^!I+%qlZ4&@UC|{vNki>6+gs8ERDCtFtAZ5{d*&JY_$c8V<*C`Y>aJbDku)*uv?RtcmF5r-@X*sy<;viY;l-5Q+IFqryHd zQ{xs`c_?Zw5B?O<2QmNVFzXLDQyEGNUgkxtOh#OSOx6g%OL2H+Q67q63yqfM+EuSGwJ8i6QGu3P zBaOa-082fo(#&bx?-87`zQ|(OoDm$e9z0*z#qqSgyGe5qd6_i4PZk`vHgIn!s_RI~ z$X_1LPK>Ou5ET=ea|YKUkKv;SXWyYRtf3m+!rKUh?}uaA?3zNQCEU1o0gc6|qjbKM zx|)Xfwm*7YVnHMH02VJ=`YQDy&CcDI(WcnV-zzmm)X>}Q@Je+d{j`7BQF}~< zH7PH2=Mn*Dx-A=^8g#fcJ~b8CpHjeNbwY_1NrY+^nekIf0`yAqUe*!il|3W65i!-+ zk(sTv(G{kg50BN4@C7wZ8c3~j>xkEHFy5=XIMHEJ29uAOESKZb(kN;?ZTT!WzpzMs zf3)w-@fR{+w1&|IA^1#eEU+ z0`iA1CVetb!&r_6eYG!WqFXqUmM7OJI_jgnb>K{yT{nJTRG!9@U?Mf?7HZ~-A7-IA zN|*K)Kqt*0BH6_liUccNyKXk)nVmbURl8t5BTQG#W1C6k%%7=b#~c_FGoScwFYZu| zD{tkqmhb>(K#yTV{e5*~4|G)#rq1b?g+>tst4&eI2{<6aNpNlBhJn_$$02SQAoB-i znB;DdF>SiPnLn9@#$tw zJ3TxjXv6BZ&9EepJxdTU8nudsh?H5fT63H>ffqD61&?+FeWzY<)M0cV6c}4RBAG>} z$7Bs@vf)+(q;wnB+jG-a%;y# z`FOZHCz9xIIa#0;yA(+UlA(UJ4K0cJo!DBl+Pza8Xet(E9NmG)_m!B+w!lMi$MLx~ z^ZJjYF39}6puja)7~hZ4A)qG3Am zdAx$!xxj9O@O3}%g?(iQ6+AY%4FUfF(F)pwc)Q+b0QOmv#u$C4k@xTB{)_b!^&F20 z(}+Gp4bY9f zD;N9~`n@EWaSvh_bee}M_Yc8g%Z$()_UF%YhcVo+$Z62N@XJ7*Id_no8&Lyj+aUz- zCfQeS$?;x-rvBi|5I5Y%6EJliJz%?0Y+q`CcOZqyacy1z5L8PHuge>OE3vM(fT)GM z5|#ZBUN1)Ab}GdP{}T5T!uFEeiF|@?4?$=belBQRBp1va^qq+@Jm)ah0w7>r-l_Z6 z*+&2+V1)FHavYik&jmVG26%w}GgUNr4QZSWd=r_=Tn0Uu8RQzH?AO`jI?wzC{(f{d z=a2dRQ{q*9??#Nsg)Gnc4b#Gq;X+_n7-HA@t&bwXCn;;I?k)N4#T}`AHoYiGY9Nol!=Sz-ZkwP;cCDJ?<5X z@JoE_h{5o;);Tl|oxnRVC=bvtm?|Ss9hfR|W)xG{3E3nus#|ME_#=%q&~SP!tYQpU z8|wbbp^XG=QfBc1cQPNDffKUhsGOj5XV_kV}e{b{MbY$~x|SG2{!H-%q$UQBEkZ9!LX({U1s{-I42m{$@wx`yJGb z9byocq<~rYlOe<~F-}|Kwiww4WgrdN1i@BZ$PIZT+)4Lnhw4djuMzWeaiF8FMl=ve zf4bHIC030W-CQ?9{~8Fvt2L*A%}i6Zk6?p7qHA=E6Sf=jr_<=@U`%G0!wZn_L}zdWp{R_<|J3Omj6Z zLs)Gjg?d@6AEwNrt!0J2RN{mQN}audXar4%$kAZD9GezGbrG+79)nu#jkfyh`}NiZ z&AYc)d{q&(WrxI{ikF%3dgyrWgf}{jc1}6=ZB7-^mv*AHmW3~=3VpM`{aI2EG@G!z z@R{H?lWzG@Hj_^Iz+X1Uk>e_C1YgJ;mK;sh=M2L1o2U%vjn#0K7UH20nBPiLtnF*nr#Sg;~8(t-+mQLOs$q2N0~ zoyN+N|)0U0BR($wc1MOQwk!(`KmpJf#qRIs$9m06CoptU<9Q$W6if@KT7b2dVm`9ce_e@S{X z9dF<5b~~cJ@_t*c59s8a^Jr0VobO4=Z|Iveu0=;^YO@*9C$|^(Rn=eF#-86*$Ff+B ziIX*}MyX@06HzN3@!~ z?~0oh7h@G7f8lh?Qdx#rrMfHi+B}ObB$NebXSn!Mv{T%s=>&oPr*-~A#RrYm6o}}r z<1HI)b5athgGRg#OD!E8+x92ZPc}0TV7&hx6ox30l}Na-?%B54H^P;T%!^YKXlaFY zxiXN~t=nt(ZHrG8Ap5$ut>#s>$!&8E7`wO?nmbH5*dd<0rDwV6dJu(f8!7i+;tWSC zEwIy8nuUCgo%d4|OL6|>;QdqLXC7(+0ds~p%MR`_C|0X|Rt?t<=mDn1s*cteSL%-$ z!nI{H)kXZK=f5_Tj=*L&)p?swf+4=mHhDIU`oG(*?)MFhbm;X?iBGp36*L^aRZT0p zxi!`@nNz>LM!{SOAU_AQ_PoWnw9+5l!&^H;CTuH{;kZlI&LNFOkFb)^xZ+m~4kIm( zhGoG>(PXyEESS**BWxSJdw)08i!|4p(5Nx- zVL!8eqV&$I9V*5fTkvH&3%)$zx%5!LIE0(HPsAVg7If3-z#WA{H%NZ$xj*qVT_SH+ zw}nY=nq8OcnzXs#YyB45v^p1FWVSdFHU%9`Z3MTUsXT7ZI`BgIo^{$qQcSp3@bcbJ z=Wi`dB=F=Hvu#=EP1GMFa`u+dYZZ$;Xo=EeycORr>QBcD{HNtUz^3BOTf^CVQ>_Mm zL)^7jA%$)|i#KC1Hn<)k@vFoSw4WJu3bRp4JVvWu@L)Ca zrEaP_y9fDM1!Ze7q;0OxFtDMcCKi?EH%w->FF%=$Nbtv%H1bON%37sqp&~3NSfr7~ zPva+SI1ZbMqh1*rc?j?ePQ9nM47bcUT39QPHJj9%hn8SQJTxxA+U9(GsFQaW_XKhq zyl34=peq@efo{%VX%r03j9L^tU2_UPDXIH9FK<*5@hGO4jO@Y7b9r0)W+@C7sg1r7 z*n(LK&g4CESUsZ6xc#*%bL4meml)&~oJr9JU*g)d;v#x?%vo@-dpX!D(@SeoGReV?CaU0;uFfL?U8wuHx^+Z|MhS{Q?irT9<>CJpCATDGowFJGQ z^@Oe0KsKP?)ohUYCm9N}FP%1~Yw~=n&QOgXKQ8aJDYZ4z37w)4r?O|C56N?W3~i@S&Z z)?AsZG_|hrZ**SjUx{$2eS~b6`i_@)`q+d?n6vUHOyB)j=Tm_3o>PgPerYm+e z&bhWpHwV$VZqKT|)g4#&3agXgCtU~RTxc$^0{O4g`*Lo#`d2(k>Y8&bZL-ZVb#BrJ za~}EnI6PD8lFaF4yp^jKREAqT-RevE80%?ft!+9_5T2V(puJa|qp$9LM%?gT8c$-< zFChSk-s75m`plU1z9Z5tyB;B5n``5U*q!S-BgD@wj!6V;J%I4^@NRJ0?$Psx7cI1B zQ0sAEpBYho;H3yh8UX;XHflrnkrZQ|+X!>{BXdf=p>tj1((f4|v%d#0xsGIm@e#p4 z<7Z^OZg0aXVK%~V!}(I*&DV$M9Naz1{qbAo83w6=sBPHq80Gp8^YsY~gQqLuKD!4B zV}Gx97enpz#evqy?D5ej{!S?8A(m4n(teBwg#AG6@$@UxPL{!>&i#BBdvAR1tUcuO zb{9eJ%;v)z_7l_17}kTl552hHc;_A4%}ncE)GOjn;&Y;iY4Zh!UUQ7Bk@y&pvIZV-k`2K1rvO5>Y~*JWBnek@=sH%vrH$Xs^@z z9DY%4i3-U6Cum{`3aARVyhF~P^7T=>^gD+tLqdMFuW`GSzz55HX92y>F>}fN?>JBa zl?$NDQb;@0Xo${Z$3} z67Pxsw&_l-j+y#oZw=%oCHoX^jdD(|dP)=SC*SM!$mQ&*-OK!Kvb-fI*_%y&dX;~` z?-}Jwy9|SuZy1xmVJ24+oe7fd?4Dq=b?n2MHU&H zC^o&Q-+nrcn(D?7QCmjzqQ9(!1mf>f&Zz_hVb|23|xAF*cfWHFuQ1` zqTD>kl4cVeJK9nHN&%p(`V{?~v?Js_$}V52z}q6ajfzeF5k3a1TO?6*cg|#9kWCC8 zS`GtT1Sz6FKeT}4F{F*8NnRIYgCZ=XCCVs2+t|aR6&uG(D;o9+tx&{1@ghC3ye4YIq;UI$hJ+7X6}{-Z;2f&ZeOyihhMKzC|Bdr+RgW<08&u;$4%^HXC_1 zgx^>~^SAjRb3LoB+$XKB%q7e!iuWMGP?V8Q7ruZ(7p@((KAbyhZFpxS=K#k3^lkF~ z)ot^>qDPYlrBA8{BcGTLat;G9%sdkC2Wt547VJ*SBjS~7B@{%$>?B-kr>=`JK)yr&N5|qbTYERyiYheAvQowq(8q-3dt@ zoam-hb(4T-QOI%4Lv5T`*|=qr*71Td7cKmBYHRW1@kWvd)9f)^Eyf1@l~_JfJkgxQ z6Y-qX;&?36gE8+0%fsJ%jQ52$C~smdk(iSl^V$uzkGks&8tj)DFY+yQdh;?Cwj$SChF&X??+BSxf$Mp_(Z-2^1lfaTg3%a z(FzU5Hwy$OcneAo4>f=75CEK{>4ZL_Y>u6ue9R&_l2ZwkXfj6{5g7NIqRM`$lH)gMn@0)}{u3$@{3Q}! z0yWEdsP7qF8%otgQYNNaW%`K5OQIjhapleViY4}f?C$SHr9`*Da-vIqjpICSZVUWm zv)dJA>nqYnsab}KVge|WhJN&AL@T01OZU0@73hqVD0XT3GqiX|lojw)~b(%(Yj%KY~TwGF9XS-2D_)&|D<`F_jp{vR)N z5$xj*7}2(?Jx&ZRZ>XKkwasRS2mo@^m3z-8pu#-C9xb^2g?biKw{FH zZ3{HttP%y1TswzrLAKIomn>~Xol=IjEI@{;31m4Cr$D?!j2@(w{a|S)TDcvku*Qu2 zBtt~zo>${*`{G1QRp&$KLrL$5l7Qy#czU7tHBij`%KQWvTJl#WcZwj2JN+Xul_dAG zYL()h?_>A@?j?#+KG>267^IwHwwhZ>e{|&kO~k-~3QVHogd|>nh6D z!Z&QCGqR^rQBZqrm`mT+K#Jdsb3^zGE8Zfhgb0#S0n}SE7YxQ*)8F6u-+ptHdC|gnDVL_Eh+z)tgQ8EhPrI8M3($ajaj>7vYD}(^OXAN8CHcCm&TI zx0V@ggfv(r z7R{Uvkj^@Hn}?VKwgJUCJb;g)jtfTy%fH*2=} zoU*;h%whv}j?oEDJy(v>2~OjW9LJONI>7^(l?97XF6LrpI;x~xe23%f2;Zrj4~eZc+oindKP~yzxw|-htwPV z5AmOWIi$T1ARsvZH;2>`U}U4>V&r1#{6ArkuBti;XhP_JOSauMO);o~oRqqRb?6|_ ze?$e4NahP6K!#%JP88AEwU%^}-*WmK2)_P=NfJdpXcV0AFmtEQY9Y&lbTg@u@kW3KNg6Wc2yE3ua^)AE&*C4ILy3$<1V0@$8;O;s)bzjhr z)Bxd^r;;F}pslpsKv*Oc6cps{f1#uO9sBkmBj@1Jm0o#@Uk%(SS9|af%ypp(gU=SJw4G;DHqw(%o;(_wr9r zc%CB)n49;^!qm93z6bX&&V51L3Z-zPaivqI2VB^S(mqM=F~B4bGcqy9kvG~juR$eA zj5>b_i|%b26cC2iwTWZ%^>A<$_w~=OE?o&7RzF(gT-OHizo7rE3*Rk4LNrhikcNK) z_y5<0oDsmuUd#hv>fmB&Z}&fiVH-CoJ@^Yf?0c~!X2hboHI!EDno3#))*L zk8l|h@Z`q@NqcHYN^MgY^?s=A%@E1H)TRO$%CuO8tN}vxr;uq#k3W0N;X)^-P=+o8 z_*+t?Xe>;3;5SuHC>9KXS0kSq4?Z3iZ;BSh0P2UtF9$QJcu1#;Xo(X_SCdBuT#Jl7 z)Q)dYwCCRT*3cO>y51D7z1ccLeFPIleB0|8F0_*o2M90fRXluxnLgrNe4|8Kcl!M| zOmlDt+P;uv@lE`kD#Z^u?D_>-n6Ksvk~Awk-eS+nuJx}U|J_RBkBBX2NDz=e@E{#;gOa?0pMwm`VU`zyswMOc1C#3VGl!IK zJ}O>fUi3x*L)t>a^XFV{OLthV_@j=WDoeAQ+a)L~02a^P3tz#T?pf~-x8ARV#975i zvo4&G^wU)bPi*p2#*-O&l+Fp15sU`+;;EX1^<`YQ@b)(GV3aVR-#UI--_J17G~6&# zZ_%N$Fx50JZ_(%o$<#u~1KcX7C1O%z;lUlJEO_2%8WZ-ziTKfGqex$)s=gw+m&tpc zcK_}$yaCOazsPn;cN8d`;SN#JtyXPvgIBQqj)1ut6O0s!XY5s6`Zryg?S}O+;Bja=R;Rag3br*3}q%I&5-8lIio|D3q*s=P9i!B}=e)$84QS!!rkX z`#ic_R@~Y`G6$tj0#M2rN=1F8$r-j1SMS1d5ZCf-dY#(3Xj^5+3^+tdxsmCHGQu)K zfClG+F(7hW=aDv{If~%vjv;&y#@{jsV^SVV4T@CKP$SG_-%h;B&Vk{G+IoLbV*48u zjDZ?#J!!m1PQ=Y~dAN+BW6d1#n1w@Oa>#eVVPCL-0hif1Tg)wDp&M^Kb`wZQ znJoiSp4L+nmyNh-=9^PyFspH!f<_#t9vHO|9@$$QMOBa|p!Nm>y5P2n1{gJF=tmlM~HTsD>(NIOuM`K?H=3ky}C9G^^d*Rodu|^sb`$C zuCpeBGZ4VB-slFam{10z>yQ@A5sRa85iz?mc9weTKa)~wPWuqMyjRpg$e zgZnX~BrzmnF7WEyhhJq-`Z!O%%PDs?}1k$yp;@DdzCzO;nXHM;4ZYU%)^>VO;4 z8^6tMS(}giV$A79@eCO2P+YFBYqVJ^90|MLeJ(I3+&a9 z^i6;nnu0o@1?u)8m8py{3qWP#GfG3>!plpJ2#6OCpp#_LsdEKY5OQ0&*|tEOgEf7? z3oBi#5`8{M@HCoq?2Sm5U@}ol)L|EXW=R`iJTqwk4r!)6=thSdEqySYDS^rNE+~L2 z7Z$viEkq?jAVWuI+89=%#-DUX7{&kuLeh>zsnO1iGf$T-ZP9T3JQ2n@M;Mv9AtCQH zPO?ecAaPt&rPwfwM{I;~=tV_B@6${&+)KQe7B zu4t997H6kO@BK^F=47!8P0`6xMgDLMUZi~DcNF>T;fYz&27^t^DmX&181I&fn&{F} z40(kcN|(62#d^#6v_UJ(W1Qs}R*M7+bL4WfoJ=$1L|%xF);e;Kn|)me2Hd;Va?p9;HwC?k%a`=&ZaIN8%oVM>x_+ zvFw6?-@R^_t?aN0-GP2dWprz+AurKq9@)O8mg8|V#LQNU17B$5?|u7Sga1O*9=IHy z0SXAn4G{p-@_q-i@DSSHI_)-Pr_B`y%cU=s7dl>XX>5p{N?hTUogv54hhAMmhYb(j^hf@&K(iLnijBmK@o&mfEE+n`gXUgmGt+#FPYW$7U@92&s$O^U#mk@Qw-76D*XYy*rVUG;74;+y8zly zqijLEnT84T_g6AzrAyq_yJ2#L8jol(d4o1ho_Mi#GNRfUQ}Vg0cFBTM@_Fb&o^qkI z9Ep9XbU5wOrI;wtPN`h2IGLte*|HhSeGY}DTIo!3{*fvfsD6gM?q4NsOYd_Grpv%US(|E2_Jizg-=sWA*)mvqbleC} z?Ofe5QMy<4%p=*acmamyOS>3NjYq0DQH@8eSVfITu6UZ}OT2hdjYs5>Uq$pwy-%xw zPbc5Gt4&My0`WZ?T3}V?Wc~(&#~>eWt(gNmq6jAn)#u3?91kq{&#$J&hGFTn`I*oV zB^l%SB8=bKm0*98gl_3r3QL;P6cq)$G5Wj7FpV!yy;!Z-N=UB63)trfIYc$-u%T;V z$z-)kgeo~Uj%oukO6<$;;)+hg< zF%lB3-e;h#O2Ad_?UmY-!bVz4jsQWNEakLDip(-BpYrNm2|A><@g|K%7V{y zyc>pGWO`7P)(m2x+AJiZaACoeytJJjubM17>gZbE-X>|1C5nH>M^&xHg%U@_MQhy+gk6;tVp>i>)KxZhzABK(sLP z2(s0}g?9TNU1HZHqD(;GG`o3}#(OFs)1p)>?w+q<=04ft&32yH4LiEmr8u=vmJ7-D z4*s`nzPrH|nK44kqdoh2@zn1Y2$dFKekv47xN!Qrk4l?RoNuM3qDqln*^LqyVI`y^X9IRAo&guRni zd+14b%ekz~D&}`x{#3HAM$@4rJN9BwUQHJ$|;yxBXkt>oRfHk?+1Yp|E*4bS%NRM76RT8Q1{7 zz%S>UKjn{~nCh3OKz-6~kbXk6OJ-{4(eb1_OTJ2}VN z%v%&Cx*d7sjPeOIIFAaU>3mdOn2U+Qubcm+iIrhATwuv#6!<{mb)Cva$8X~DL)j>b z5q~0QY~vhd@H{dU8Uu)Tab<2P7FB7I8A3eX|Ki%gNR#6l>lGq;pTy5Gul68W zNoPus;?Pm{AuUfWMVLf2dtJQ|4I*x*9Y;jDZrPPEemg;G;BK>Qnkq7dOf1l+m}Bj{ zRJJvs75TlfP5P0+AV(so-KB%s@_|Z|-8RF!8XtFgTpD@m{AenZdNC0HdyNOVk)}*rhBH%LJnXtL46S#H z9t-XQ<8XRWdx@8&-a-BXC9vD6+KtWtQZ^?qLO3wAi zkIK4x`NBh5q7@C;b`L3606@iBXE8EEyeIQY^z3{MQ+AjZ&BxX)al)a1elZwx18v~2 z=~?7eyMy$qp2@&?Kwh%TKlmXc;hW$9Tfbx7Fcn4D+<-IPmY~76aU%23k(8iby2rDK4^xaB zdEl6WV>E}<0r6u3_pe(1#=1qhJvJ@aHvnUnTSO-d5gVBA(+zuUl*=GV0y{;_*&kE2sud}gk; z7@=R`C87t=MyQo#rE?DV4Mj{%btnIb8u%?4zOT2fyQ-ZSzq+xct+%_Py{b3}PvDkC zwO)0A_;A8z>c5s?#7dBFWEycWUPxHs?Sw6}^-V=eb1Xe914S&EJj;7fxnkLcX{FQfg@B1X(y~UN;mXz&!n}O%Lkeh;9;jGGVI$fW zxE;|v0Ly3JY8Gyb_3WH(Ve$T+3xbiDEWi91rq?k*qoa@ z(Ccy{hDVxxOH45$0?>FK_Mn7feC644$OwwW#$*M8hGh%}2=3_ps{K;~hj!npJ__Lk@cb@d_ep52a6lfmo`C&W=l+!aCx}R3 z|LYfBrEhU@16-5oc){NBo zWK1*2qCn(gz7cK-zSfPk*qT=~b&x3pzE+6D>djm^<;*z&#pKOEONB>Mfu1vSHoVmi zew#||$L&ZM!5|`Ef$x;SaxWEWuW(Y-t*Q3$!z}A&%;4v}Z9Z#*@XOzbIivk&sVFq9 z;5BzSvGh*avr#`atMrZVFM@HX--q1KO;(5s-iB(PhdEI{@Tm;z1A-wP97bve=E6lF z>&U{-#A1G0KTI)>4MHlW>L6j%@ilHiLZ~RkQbY^IF_g&E&k;f?*~TgW%K3XjMXv7P zk~R+f>!WC(k1i?k)|FYmOhR-iFAz zvWkg9aepX3J(}A}F0lv^n0)m7m>*_rfu6fS4(8ci`|1abANxSxDuIt#%Oj3V_pv zXq!`umbrZG45Rnt@>v6Za4{TIEq?j@v*7tN>w%0UWJFKF`ean*bF7-f4~CS>6=u%s z@l2=V!25To(Oq$%QNr_?{NK_@BN0=id2Aye5Wv^34jQQ!QhLiK;YsZqZtihB!1WF} zdmjOjHrDw)km3wr@dcjTc4b4fIh!$z!|KU8Ha6KqDa|s>D;hZLB}IPJIQnWboA%V! zBgv%}h?dZLbU-XBxS}Ms8mH>x=bRW$F$WwIuG$W4By28Q-BgTiHnZ5T{#36vs`0BL z>_g$NX}i=+-1I5xUccyplXz;={^8stN0)fU%-sX9?Lj@ZKKN$z(rx^KH+I)@;t`B! z5Bh)!&FIUxrU>jGBh+3Isf8&amAITj?esbo>QCd|*Ur@3h;r?z%jP5X881s4!J2d& zZX_vrnS%+^%2i>DKak;xMC_ZuN}6D{8DqjvovmXYoy+F8R6&Ztm|}DuIv^m~+|%HH z6=$M6{M|cqZL&WZ#LXO&%sA81J(+4AnRUSS{^2l#`Rehyjfp<{=WdH|O19K$*E1^*r})D! zcl>RAXk1|Zp%=#adP-F(V-yFvEgEnI3mmCrN_18tZ!snUo`E|OoK#+L+i#D(ols!6 z;aoVtnOAK(l3?Aav{~5yDe#5Bx~SCJ2+o3Yb3pLRs=QUfug`Vjc+Fz%*T{nF86H#( zk{AmoU_*>`9P!Gcx%**WU3$jECqjEm=U8(P{e(|`%U660rWb-`38!CB?GgHZN3$KZ zdP>|S#kf!J1!2GV&x%3Ne)r_{JD_o4lz~XVF=n*1hQ;T&V(6p>;&q^zvBzooz%qzVGUTaprc2lmf;P9RiIAv0PAU<&;H6P<<2aMBB!txC(Q& zOVT3SYy16F>DgMWnIXzmpjAeM_RRZaIXyK%WT!~GK<=`E&gI3#1576?_D7w zI?}$`^SO@tNyfl-TT}4!0USO^Oa)U8rZH|TMpGJwz?z>xb}aRu9M&%j-J)y>+MzBK z!YeuTxib;Y2dYmrt$rPEMQy==%`Nb@ZYZnn=uMl7Om?bf38EYKrVMI&s^vksYF${o zc4&_LG(A7ITHmE9@+t^43sZI8WK+qrgZ&YwmIM0E?(DRc#M>6%UH898|82(XES7%U z{o@Pvk^V0wDQD{JY-IkAjdXCbcQAEwu{3qg*08kS6i5E5F{np29Adyddc_unw1{X( zmn@Q2c0|wnxpF8?BFmsg7@y4X-EIFIcQh2Sh}*;c(&fpj`&y4T!?zo;?T9)|jMorq zBc^wp&`JW3(>ZaP_LvNr(rh*sV;IgmflNH)k<3!Mgb)}UjqCP}^3Ta_Y_QgLBVDVY ziL`=3h_+tITk|Jgdch3p9C72^)JW)DYX#>fWh^D>fF-ZRE!x%k5`MtzP67pPg z;g&a=aI6cDIk@fii=lB!PI&A^M^7>0m0RVg>R+@;ji?pi$4ynp_!zZChRf*iCq*bqh>BVHhLoHMlE=3)if(fT~r`EuqfX_ zUW>nYy{ea>H$b)-Eu1$!KM~t#0bbC+DoevJCpvX;bJh$VrKB<*{04hXhS;B_1z5lQ z=~d-2>^iHh)C74!=NDqLV`;)H78HVSNVW1aaOx!0*0eYjX8P{)bGZtmd#1Q>Kwij-qU3!Y`X-n?e7YB3^4(RfU357wP3XZ^5)m zN>?_1bWi8s3bWHHUQh0YF0wjIPpn^y2{+6graQ>t4S($!->dw?Y6U;w*Dn39a+MhS zt)zZLVZzr3bs-mz2iBS;-iX*0KHB(lD%$#dSF1QnxtB}r4yLsg(aG;)QS z(pN0(#Eg<_20@T1_&GU@yjZHOocbjdo1kS^oisGc@-HXw@_&QkOLAm13NdO9!DR3_ zn^PQsX8I8$X{z<`AE{*vq3oCqF&|e3mJ!24P--)4Bz$VCS3;@I_v_lb`4=$c-8{ z*$-(iv1qWy9s}F|{cI?2|j{ zER4#mKWrmWg%kiTD29rQ?5L>)RAz)(8^(4l44^A@n(%mSB1OE1gsr#V76lwqtT_a^AQpY8T-1>Y}|wZ0wE zS@q_x!!3{l|FHH5!{4+2>lhLbVo0Aelqxy*MzvQ-dgOXYOZH%towa^nZ{E+kKZLuf zzTCoQpnvNr90l9)n-`Ogh9-BNUBTHEzems!l@WIz3byR;0=U2sfOYf-9N%fo9TQ^E zi^wNfBdSi@VkYS7B7JZWYG8AHOBfb5_broEaO9<@L=ur(kQT8QwXUP#HV8Kw; z5uqi`^hND82c?#!jG4~)uHaatc@+tmHuyGe%RiU8^LC=XQ33AY?#sMJwkJ&VzaEl1pW`TrRM%5!3I4yX8GS#D35vcyPO) zIdNJH#hOzL;`hfDYa1rRr0*|lHtEIe-?R?sUnBU?Y$1AmgZ&pLan!PpFNr}wlmtLP z{y`;(w789_2cx{W(Et2P$oBfjSuC&r{mAh)pEi{;3?POP7llszL1x%jM+HgJkE|~A zi%f)tEIuwG5hl|c;-$kHqPoDiuv$$hEsu(!+R#=ob)&;=QM+<^WktQZg=6<2$NNN{ z+i#>5lflqHhK|dJMk|CheE!LLq}jN=UC_ZDBjUFNo-qe zPJ+92-0YEPz$O>Yq1z6+=&l*g8cA&R{TfB=zouMIwEoXnIB-ojr8vf8nZpO2`?h~n zeoRzHM@P`%0YSr!>4I;2Qw{V2PY+8}?SAD^nsw2WEs+6U(ZL%}x`S_k+XKQvhY}&@ zI3cIZE`7sjweX(1N$h5jOMv^tDMPw@XVW!w-c6@K59=?=d%ge1)j2k20yXP8wrywP zWMbR4ohP;h$pxxK&d5!@Ym z1%LP2CU&|_lO?#jfA#qaBFY(r_w`lSK?!LcRl)eQlqg z2KoBZj>kO~5P7^odzc&YVi%9S)$`P*jw$>4Y9V-ujpn9k@+XeP9p7j3#Eu`9^SDBL z%}HNU@c9x;v~*96@uQR6|7gZvy!U;572>@oPJ3&DwMv)vkU06$qw1vu=u2FtEqcmo z)lHq@HeP2jz0;k0argHf=zqSmH*VP-AG-Pail<(si7P>2a;9y{YA*{_KpsIZa8wLB&7urt5(Xx!*>i10+eMkO@YXdpaP6k z8|a%70-pj7Tm}4qMF|KxV$>kmcokY(1;uafE04XY04Gsk>#pGeCN+CHJ$+4_tpA~)Cd`>ySyHoSkD^*ySy{)l(;Gi= zZ7i#-EhE^ND^{w~yB9i*lcw>LbGfzM3{3M&e2VneM~78qe7)6Mnp-I{Xj!TN+KWZK z8rqH)OKeC-J6JW+!wanQ8#VzysZN)fMK(4}Ug69t3s|x$>p4ujYM3?_5#$09%=D1? z@}npXp&i;R}o{OthQt7a2>-u;nIuZ4`Mbr&f9FnrK#qjknNUB55Hu8-1%++8;4uZ_d*wwY7 zvJyTRtl`vVSYE6FrP?8VRQJGT6r^BetADpY-9`np6OyUfhhY_icc4uuZyo#Vf_bsd zQj$KBEkft}vd{(hN>E+~3b-02iRq%vEr-6RgyhiO8x$(s^q29x>7_=Vd2{txvVaqW z;ZW6Fgl(jpwLBZEybR5%9(#2~30)aaRusjzbK z$g&Y?xjMvhzlpWem~25=%5BwE$Mie0=i-2Fg0lF0o~gLLEg?Fr@Au}gF9>{tab{~^ z@1y6XtAMT-39x%{8koI7Cww0g=AVfG)x*!t5^+#uZ>wQ?7e1{6$u$LWKT_bG)`>~l zFrn@U4Q(%GtO-YN6BA`-jhC5`bXu9Y^dg&`JhkRh z-rR6b!v0YV%|G4<4GBAVHWo--k*vebeU4-&GBC?^aitcBF3cew3$0@KFr`~gsbd%R ziSEVIcwLC7(Vh*J)dV7ur1DE7H!GZM!g~3=K7cAvUO%Q@mJD-C3!ub)>rmS+b+E;& z+#M$ak-S;ut+l$f>JN5`{4q`kbJDK)+*PzZsF3027|&<>!DC!NR6SpZklR#7!woU+@vnU(D&@Fy))ofNUx5Q;pCL#Gd5UXS z!^iuJ?p}rTY89$iW45RwY8X9|e)VVIT$T%u4;(_`#2dM-Rtrl{aN{>OWwalRyk-kc zPoz-@OUisM)g@w8hu)UaqIH#rK9?*>a;PwMBPUp2{I;7iLiE%TK?BwOl(aA7vcQS)1VaMX~VrNtn zN+MMwMq2P%mcdvTlqkw2`BW_{CM+XM+eKfB@ zy;P`_5tm%VIOk=WRZz3;mC3cKv}hSr;2;%ZR3;hHWK1~O1jAqM@&BIDSirKPsz(mG z0fFvPgzf@wpsTSzv{BIY5cHY~eLG3D)dioZsc8U_rc;VKZU6%s{M8Al7*Y1f4EM~C z&oR75YS}JR)3}gnL7C6d)n^zZ+j-MafZC!KTb%iKg()R!RVJxiuttUI=a{KlMYExN zXRmh-PDZ~cVgx8ww=7%)y?q2Z5p=68=|0GNOe-k+D^?>&F2OLSIs`-+M;XS5PtavxM@Rc=xElqQfxw*oN`mp{e{^qm%O?>rLM2Lu4TV@ zl#g6;N1TqzAI}kYQr)6J_*?=?=v6Q^yOng|kT;mP=~j)_AZ~d2J9{gLk!@_23%L<@ zfsxh~_L3>nH5K5$;21P^R;}M!yR4uQh zc0wQ$42=mNXd&LA?qLY~>Ef;8y5CVRn9&=8~`2BpaCX#RbVb{I?c@8>i)LkiaAETm`at`20L?bQi?ba!^pwB}^+)?>m8qR4FKlSt7C4P$>2tCa(7a9D z+H^ul){Y*{9lXDuMYk$otFA4Py|mVwxReoH4%cgdy<5eblk6ma1>g6Uo#BuoZw<3l zw$*w~{q{N2>AFEv0zZ-*HG!zaozao=tJd6!YkcORXw^f3r<+>%KI=f_ zJ;x($Z75_^YZELBbqz_|;hv~i)YQCG>(T%pqntjXhrljfP96Csc#Xk!u7%D25sUgv zdSI7Fe0F0);{CnUMMN!gZk14(8=!B-=9m{RA<_mDB$MD9TX#`5#fGab16$(!ygatr zQnY-xm4;m?jhLO3ocEnvs*w#}GGk@=FAYKBJ%H8??;>)vUx!R3XuqSJ_OtK&m`R^P zqH@%}NHcHlZ2hyusoj)3(>a*Cis<*(E}$zPR*Exsw@n`~kIC3jtehZxP}Q8g$+Y4o zcdL!SJ8+NJl(f?$JvSt)%_|lJ<$U!QlJth!&QLXEHTlp5vz1Hi+D>*D7p0T>!5n%* zRg1QPe)ks}r6}1O`fFw_QBQ-@R#B&WMa3$P?3is?{ZdKVHvF*8T8;7uI0xw_5g(0) zrYf)7btJj!)QM@gZye_mtJydFQw{SYj2Gq`FFlg*_eT0Q4cXy}5}}$1Yf%XLA&vE1 zF(B9nK-r_}d4a7Yw5idSN6<#*U+;IKmz|A_gJ=u>1nXQ!s%2}%^YWOoE~r~F%`_Z{kciYna_a=P`_nFRMG z&qBH=i8o=&B|x3%u$@?+K{BP>od;2DZUC_PM-W6K%pXWd1Wm?=4(iR8z!E`>;7~@G zpO=UfGTD_F-;x}<12gM^=7$~5g*RGTWK@wJQ%;U7kDWB<9k<9=u1GjhO#0=WD;qBD zp7Jl$!WQWi!wa+vnUvc^EC{aH{dWgo7*_M!U9fndn@r*abH{z>yYd=em+m%4A$6I0 zJli#s3^tVUQPOvd_&K(^13etqVXh2jR^!oP+98c5XXd08-Ma?xbqO~} zg?VFM1;XDusBkJi|3=IC?GiuKOi#>ATo!+ooIxFBOfe~C0gmUsYSR10d$nD8-LB}w{ZE^F7 z0;XilHrjRfcTkydfzyN}1lne_POFM8$7Z|l#n&%cNRLbX>&LsYVlk7^!l5OSbb^98b3z~4&y7Mf#4b0#LKhaZHr6Y8NS0?XPmv6v3GRqqDbxV?U|sLKUm{T4O46%%-sFvXfoee9c*1@o=18afq;4z%+e^z-n5@5RPR|WLAWz-}u21uioEX`9S+8N|KZJ_h zfb=E*4)cf__WJi0*ZDh=vx~CDzQc^=@M<^amBQurWQnEm$Wo+cCFq>_@~1#YUY)40 zaGxRY+U?qMVLXni8u}sXorjt@0*); zs1Nm%Qa)~;-4!nsD8lN@f>@G;u}6`<(K4>BWq)VG?$>-QbXulXymsr;v`uav&IP$22wzP6Qm%d^2KpR9})Tk?N; z;i;(_5AnNtHDl2Sf(52#e5bG|g>#+8zoCi<_V!OkhsP_C+>r;46Qa^e^%upoqcTCR z_wb-&9fzE7p+N^CK7j_gu|=?~aQ2O0CW8^%;I3_+9_iKXONL3X&yATz*h;;+k@Y$Q zGW*pfvK|c;?wnu1SY5y$dK?(Op?xc~H!M(sUyWgM#)LD5{B*}aHHSnwusU`pz|O#k z#nK)~x)VXV5rNX`eCmcZ<73iW8&y6x3Y)<_!|Y)VQG^pgl0`&YKw1RrFP>LFcqj73 zE7>8*qv8~c*c{i`52#Z+)u^$2{djTfx;T<$pu8O*MV2fNi!t67v;v^{ToSAu??~;M zu!#6f$o0YpIy1cS^5e$`9JeeDzJ`$SZhVLdX5^XFeMuN}GZOYJ=A;Bd z36`rqreM-~u5AEdIrdh!qA5km&Q2gU|^q6-pu zQezJtoI&vREASSI#jgOmi!?fmG%N!!B^gGGSP{S8FdiWv_tZd*(lnz9fSuYT$ z;6=+*9=-U{F>D~gglk=(U>5wbD8>!v`w{U8{ljLbVG zh1PA?v+hWkciPNBvn3Wi*panGYd!HYhv*ZhAes&;7O?m?9SX7)`tKElZ{TtJVpjsG zn^avn8ThnGpJt)?1KeW)0HnX!iwmRJT*e+EcIbs*oh_I&&>?DyEmD(CY$ux4=3 zUkZ+J9E$d26d*5k7H~(70YeiAWjN{CCxuC?w3J*z08c|BbBEzo5sI9eiJ$tcGjWjj zVfKWOaBi#xdk#Oy{`Qz(_t!g#KNIv0N$(nTI7up+SO57F2iLJPcH zj4vl*MEgx?wr0kaev???@Z&pZM_t6VJIPb8o&F+ts~x53Lb*h6gBAi7b!Q1@vGHM0`hwsDT9X_wA?9)-0?6sX|czEkwNVz zcZF3h&zQA*!dE%3x$;|lOO{1Z#>l=ei#1{tO>sAw%k`B_y&;Cb+AX+z0q>0am1@7CZjShsbiLg^5&4P5Jz$O}^%Y~HElEo) zSWV{dQ6~M=c0Z*&FjoOVs>D035b?>uA46MW$*YmJ3mrSg;EY7AGjGguf)hFMaI*D>_ho;ks*kwcmVz9Y&hEA#^qHDXGhU`YG$fH8#)?NIZsOqFSw_k`vbDG1+DjDS zV=ikP3w`%Lt&XjQ95EnUqHe);C39-qw7t!T^sL>h^|$2rKC{4PS(`^V$FlygjIkb$GXd5?+z|xE%qv$e3}5ivoCxWcDDlwu>~^8?7MvZf1WMMb}&51~Zw?IyQQd z0@7C6(5EJOEKro_%~sTXC7RfO{YNC#M$St`s%PQC3OMvQ=2 z{*eQw#3rSeBn9`lS#kRG-Mf>m>s_aYnGpNCze6ayt`0Wg_hj91EI0jt9!H)n651To zktx`T_bG2PbT$1dCW+gIPACt;-0oAF>1J3WbD!GVbRDZzh@1Yn7v=@Y&b3q5v7QW{ zaYIiHMhJ6cc0tkQgK)E#N$-=(;tsZZ3Q1;sXAaMW9Ml;-OvO%e-AyTp3t~?3O^E-C zLQQAfg$iW83x$n3|2&8`$moOOeh;FcdpQ)NX z3~TJ!mvae3WVkIdgX?$U3!92ga6-=@=JY|Xqa>nmZoP+w<9&BM_JhngCIT<7lY=f~ zdC&fZB2Mwkl7x$Y>{ypX3CnZS@7%+qBPBlcu4Ify6cLwIA3}~5*9Ntk09ul~w8DB+ zsX2S9o{0kIY~iDxzse+G6AKrNFqOhcpQ!fBVdmAIi{$nK>>y(uV6jfnc&8{Fv&6sG zWBQM~2PcNr&#deYibNe3)VP(IE^Q?}WZQ~$l5EY9JQ=&{o455*UM|s=4vW(bl@mAN z)5%=j8Ft`)y5(B0m?uFB{IAQ|iJuX`xh&*6^f8F+>!=e#<(z{4>?7k4Ou%|r2?uoB zBW2XWA2#|p=NT97C8?|p?b*9~8jcs)kPuB+10n6*gaorov}tOWhVizT2zq!~O*N8e zBoroyWuP}&;~0t$#FMj6{kcx16z^?XbPDcb9>_^Kp=U5&N%a`wO8`W2xgxhdaXmr? zL#%sYNT|SgNDG5X#VrD5{O;#7077_c;VT7IzTp=NI&xV@uUQyKdjU0I ztxD=;7{!H=c)Zbj@9;$T_+yn^vYY?sLKdfJH#F!IU3B^OOyn71M)g*y<%4u^B&=D- zN91xjFJa>gJYz=x+~^rwx28A$awV-<{5y+4O}BZ@z;jjM33aG=jqw$qRKSnL@eCCJ z1al(ZE{M^KM|6xHCcmjCZu#tO#{t@<1 zr2rs%hB8N=F{ti+j2Vd7u6$X6bb7KYT%d?b(X(rsD*mer2sr_t9Q)~kBUTFCQdU5D zflMm|bOlY$Zw+8aH@a_%KA^K$ewlO2p-kC?3maYA8oO0ZZm1{C+NW0pk#}w`vo|3O zU5ckyz8}H6^I{nJ3}+^K6}QJ-XC5}Tn!g)W&$-$8!gWVZd*D`hyt9Frg$H`V3ndP9`t@eq6kH=ECE!aF(&1^Y04n8r``ba z>)&ci=;>ZH4s6#ftBbl~bS_wmp5x_3-(tM@Osh*yVxZsC=7ni+pW>s>@z0j#CM~NI zI+X%FFE}h}vdqqre+nX+SKq;JiE&C!BdWYNTv8ai*5Vkr`;G-uJu!oB3MJ)mijMTx zIJLGz@r~o+3=foh>)03gqvuBVK)z-idb|GWUUd6~_m#`7GXdJrH~6d02vr{*xX%T5 zvMaN^NU?HC{RA~B@cFNH?&o*I|Ge;I7m61<-R_2O=$CyF9KK93Fuh>!_=#;$q-D*{ zQO0e)mwp8wSiY&eQ-F+;v&^l_v5q2WS?Gv8j~=5j*A}`ST5cNaNT*@1EgX-=ICnX~ z?ig;1#bLEA=^e^>?ykeiqKeQ&!5`I>Y~-s0LVm5th+=Z$h#N4sq>?H(eJe(IQek1NN-y%`?@_-5W< z8QA##tc>op&%Pxej`F|p9K!Zaz9rhR^d9Jr_IbqJv+^4|-yi;ZL|!`5&(!lBdwSfP zrZvd~Rc+0viDeC|lsvI_$>dz5+ig^g^vQp``27%!XmcB0xX>W#5(|j(dV{K4>O@pe0{0gTe&HC=?igXoh$H`oWEepSItmYm zQwTUSY~iBOa**S9&rjd~$F7(=NsZtH0|Kgq1Oh_+Z)1r3|7BME7jeNy)k+yx70VYx zh>dotM1n@O*Wm z?^`i;Zlf9+b8I^Ml=s$a_i=abq^{5JFX&8r@IPl=y4{EeZTXv2(UnzMY(-w<_Ls1*nfo-;mH%|47UR5<%e5rNM<@#D=;;l7pdO(u1X; zbn7USi!DWis)~y9iCNk1ziR|E73XtZ@cDmd8%)$!6=Hu;h0{fw-9CDUc19hdHYF+5 zQih)r&eEFRO4UjVS}i;TW4G@D!10^1Mq3jawx^R#q7*aNn@3^;*~WC~v}09UbD?&L z)PGOcPzNc@zz=D&g6uxqOraghF-lKxfNM!|RGA=Kw~Jobz}D@5bmx@2+fJbN%3lVk zmKJxMDec7W3^mTUS(&cW1FH4?)%soyPGl8R~VKGY< zE~7w0%a$T+p{%2n>5$z-zZ6?R_`*rsLurN52@CkxZo~kT;+Iq%?^K$>SO^9Xi1N|G zUt$fE&uZeG3>eBk5S5WeS>W>rLT7Ul?1;Gd=-v@Ao_o}?C(4}PAxo4q?Win1B*o&A z#TffQgt}NCCPd=n$0aDwYgZjL+XtH|7&?xj8CrAY_AlKhJ!M5sXW6dMb72M*pF@)( z!B^s1yH+3Ez!As|nvlsF2df zGd{rTfU6MNWO~Dx%=#TX7k;mhK8#xe&Eg)0# zh-3!Y*Re!}U*M5RcjRSZ@vbxhWXgPKk~og*7bCjo(NyGBcWEh)Htx3Y7p4w}f9DrQ z#LX(NIa-U$<@Qy94W901Zp-B^I3UT7)}(rn6YUY_Mrrdh}C;g3%(UoGOx z{husP*1AO|B%)Ai(v4rQ;liy!1iqM_?=PQkPf6~Rt9*x8Jg2{V@?X84BXz6T-3d=) z)4s@Oe!Pn(UWe{b(`&-^!ZzdRq}c{5Sv^AEOw65b2>-VQ4Mx)0{rn%+MGx=)wV=tn zIRD3jHlhLTtg?drW6Lzb6G|KqaRr=9gaQJs%DC*GEUFL>W{h4v2zW?@lQBK;Vg{>h zb*a%>Q?o)>sa!Q50iQ=Ialu?`wS3j8ajjdiyzVXk{`uUM`E@jMoSmyYJK=M?^S5uW z@9$syT#wrTNX2LzR=&XJGd%w#du=e{ZGutuBabnltHB)P?T{|gcE~Q$^`M?cw>s}# ziagzi4tY7(Fb6-d<1@I!0I1M><%|={vpQ$WY9PqciO?VvExr@ zP)Il)i+w6k`KVwsI360aT;@9)&^^Yxo!_~bFPO$23;nNf-h2IsN0(s`zQ+4whF@gS zd7<}8U`zK+P_ctk5PAuxb0!`u{Zo8PzgIOe!HM97lkQlJuJre zMJsE<4iQeJ)k|+~OYE_*U~3wcG`0>4lQJV$ikP-`RF&1MLCVatZA70;BU5q(wAvJ1 zS2wf$vPnpf)t*>MO^UbkV@|e^Rp=KW%xo8lZg)L-Q;ou5nXjjoSFR#uwkhdhWnOEj z$~78FkDvM|nQoo+qvR|v^Q=>mJl!EaI3Ort71>&K0yH;e z!|h8C1YO^Mk-do{VoJV+o^WE&(W!8|-YMcgV{kW#ba@C7Ix4)UGHGU6QxKv%dM(sv zrCLQUtLae-E7b<|8D(WPY+;mSF2Mxhe?C=To1U0xr*2(ah)?$Zrf3mwz83ztYV@0q zr1&;P(oC4;a_}mM4IMC8f$>74GmjY*b3&t1(5tqSMkZjdj;3ra2R1~Hs0^USQ41=p zlt~F&*{7Tx%ur+%fsfD8Kr?$pJ$*ox4PSCcd~oMB;a2-~eFSgn0ZCz{qFOF|#;05s z>J5)hK5M*vR$N$NiiQim@%xdg+Omj4{>T;xmbP(pi~Uko%tkiW!aqYILy2OWu997J z$Iv)ccS6ajI~+%@{+`D~?LFI)iRP%t)EiCxkELcUX)r=ixq`78iHQ7`@d2$oDs9I*M+GAQo9oyD{6P^M6Qk2kxcQygmscE{g$;HMbbHf zq??2PlBp!hig<%^V}4oRa@a~crPGZU;i$PTtT7%fwk!l+qGN7uZ(^e^4Bs+BdHVYA8#+cGQ}Pi1?aW}6kOsMijd-Vpo;0mDsSeQUO}Ew5{bGyOMt8sD~ia zXxA*8rtR8K+g!PnX4zosuQE*(CtB%t?JUBF#}N5-8HQa`U67w_?_i@X>cS1hT@pa^B5)=zEm@|M7g7Fqt-mWvGKmO>X=n9wCvDZo;NM2_K zYIq5!I+%#0a-O?xO;|6n$Hbw6^|UpvNV>U8Ud-J_qwjSuHXO9}u7Cwcef)v?5z;`s z3+tD_*7A-TS6Q0-^>?CU`V@;2dr1fND|3{Bn^&sxRq*;m8kx<3ZY4{(KErAmAb?`y zjSxR^Ls(1NHXqGPS$QMmF!v6X*N+#>*akEtz%93ig`h(S0QSRysWIXgvZ@f7&_hF( zdk&-_MXiSdZNOs8)&SBBfNR8Ygyr& zm(uErxV9Bk{|B6dfeyzcY6j%?P1NyLmoz2HWb}MDDjlB(FqN6`}H|iglw97|> z4Z?~fIGzf(vN)cD5sG?>Yt1m1ENpoWdeJ1TN!T_LlqpJq-bCvp0djyv=6<7b&l1Bs z$(h{3A36=MVR@O{Mf%h+%G+ab)dA$?ybe|qF^C|})=8fSOo8y)%Mn<> z{0&~E=x{^BQ+W?Mg{b&VNr{vT)20+M3xrPM=m$ri#D~?DVd>?WA}N>k_~^nV>I8D^ zrQiw*aU=e|>4Wt(Z(HMyxcsfM4@}TaYJzm7vO1)D_!L;zHUcQ@)FnN zm}lU@J3;@9_Bp@g;WZZj0IpMh-9uUTVqC-W8u?ln?N{VU`|Nn(vH1+5`%Dt2o9*_D zv$ujOItI^^+U8E15*>4>bd9|zt&aFWKG+jIbSEW9`|AYY;J|lpN7{B*2a93k34$ZG z=g-JzQh7xZlPcJh{|2HMCg#7XrWQq`cQZVj((LS6&B*0c3K@?|HGL&dCgIcIYmaFvRSO5 z8e4%m-AQvcnF%8wvc?Gg59 z?f7`@9Lei}zZl8#?_S70=OF++P%HG$1=(`dF>SCaZEy>1Fe`0vk|tDHJ(8RWarUT? z#+*>S2GspuMPi*1H-^l*MDgwph0wpvqnV)Pbp@O$+(?`FpCUfx?X||{lE<=GX<1a_ z^X}KE*Ts)gDyN@y7KqLy%k5izxOict9xYi_dAU6++4c$+$(61m%jcBJ^wcV;FLnd8 zE$B`wnjCUD0pJ%+o1>^4zG8+vy+S+EZG$Ka8lnGQlaP5tY)fU8q{A z!qrG2!@sB?AJRNjs=QT-9PxWdpn}&Dmj+jx^2Z)<t*+fGlW3B)>9E0{tm z@{uQV3MO|5WnhYAFeD!aQo;r|{tkESR*-`#q(zxLAexL2(nJxlK#~F=nN%pGqAM9u zyywWGFTc=7E4dkUcEZM7*fv*s*&{GCa4!=$SM<2+{TmWq@u4p6T-IojmsQw#`dYJ3 z%B$f124-St)d8!HH-SjAt&XlaXv$1mps!x_YG7^5rk&E#Ts=+)ls#RvKg-yahba^i zn8Nb~IzCgPelV`?A7WMI_Jg_jC+$lvmzUWWd*U!JGgr@;X=cr#M;Ca=JZBNFZEM5$ zhI+1TMXr~fr}bdb^g+D-QTf5*d5hGZ3Sw@5bg5ab`3wHPRgu?E|L62So^C1(5D?~n z*IyJ20al_m7S7Hlj{i|dA!^!A%BpBTa+$x%{xlZ{=n+8?7d8j9LSZB*(ZJK$RM2h0 zVno_!=9WS(CZ*>tYY21$U7WcaK8fmA=W}S8bqidMLveBOz11>*>_>f&dN=rbowC3y zjm{e9wXE%aYVUolZhCzz@$2siAYa@iBDS2p8udeBen=|>2{Pg--M8Ptz1w4n2eVcm zl*iG?mvfXJwEuQtj79^7h1DBYiT+SP5at*I6VuT+9Ap~F?NiNGa8MEz8VQDx7FDV) z0eefLUL;Qst|2KhnhYz8SG{k3lk;+zj9P-(PUSPCgmTWCFMA3NwjII!xN5c-$wGUB z_}FrD!ByKPP|tU!zWXIJB|%Qn!BSwhMQh8#K^60>MpC=&N{}~!aU8}MTy!G3CjWzN zdv$s}J>gd;1zT=|+(UbshR+F$rn`*Qa=rU>(^#|2CowoWYa416KH0UoV=|m@04h6Gb71;leR)k*A4Gyyr|K(F{@eP^jF zC$S25Mw0~&&$^`JbiLT`d#EviWI;==5go?&sC)4=Gcubq64AVE;}WcNU^-GOanT1D z9koD^;_zz&5fj%hg_{Gag3|-fL6Y+R3u)6u#-bgxjCWYa3e0I%9)C6Pl&Ps&LvB~| za0A$LLOySqA#9$*5l#5HLeZfibH#c-G^1{+9X27_N}Ew3KxqkuP%#phBTMlg;sz_x za!wZBo^+HF^F@208k|m%w>zb`S&_l;%ZQ$HchkTYo2k+0WSd_ZGA`CS@|TQEh!Y~h zVr(Y%T-1*1B?Y)~=IfDMj8Ep};`q-n>=6M^JH$VV33oZzr%b26p4SI@7C>!2({H~) zZsBrCrOG#=PFcH&hV9|a!dqsdoN#6jL9Pwq8DNUOT5}67q|cvYvx&@7wd70StW*Y8 zkGWoE+xq|Rp-Wj&KtiR)UL;l9$J@A^9+Gpq_8io9cy>y*33yDg9R$(?b4Op1c#k;x z2UE8s^)PD7AK~4^c#B$kq^P!w_RTv+7>(QYeASAA_QAAD?)hwwofKYUkW4*~20mNP zx}lgk5Cn^5g`B(*@q&7D=zgh*oD_)E4zaSt6eNu-$m-4Ep*u9&D8Y*23rP~n?>c8D~@P_Ud(j#SFVD^aJ+a391Cx-BHby3-ds zcS%MB2YJ+RVRmoeY_uh)A{AEGq|{0ot6SKwo|LV!j2QQH=iDSqG>mC1A7okmgI493 zdF>#U2z3l{Y_%HBw((n)XD9YsDJ!;HjX74WXS$C>fj7vKYB*DfxYhtNN7eT)9Eqcg zjj!r-pvU{FWYrnQ;^P*aFzRe)g4nrcjSzF%+5F0d5_@8uJMwt2;wgNd;@!0 zp!OfFs^QDYrJq>INZxy%sIFAH$B#fJyL4g7)15cJFB)T%LJ(XLa5mbKCe#wVJpiYf zLg?#8Us^qMn#VWa{zsT~2#v}sDNkse15};?R+DwIJnUj5cZx$)+K!}In=-iU{2Pej z0D!7ges_?8>SzT7Z)U(Df?{XDBZ|49jZ`BxWU4$#bBAs|@YuJJE+tkr3L3I+kaw^* zkk#?eZeYkvo8!34E<2vx9bs8kH_Be4_g>N*;#CD9tX@>C_o>UcuksP<+Tm|JC#=w* z+x&KSwljV&=#iTZgO04H;G*p=fjF~O=Bzl~2%}j3$CtlCGkzwp-=p+@dx%Uq2$`o_ zHyHHGgWkpKry{7PdQ2K#q&re3a33MHpXAkE>p->}d2F!>QW)|ECnKGF{{P8L dT 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 + com.simpleplugin.unique.plugin.id + Simple + 1.0 + YourCompany + + + most HTML tags may be used + ]]> + + + most HTML tags may be used + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/simple_plugin/SimplePlugin.iml b/simple_plugin/SimplePlugin.iml new file mode 100644 index 000000000..7bc787656 --- /dev/null +++ b/simple_plugin/SimplePlugin.iml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/simple_plugin/gen/com/simpleplugin/parser/SimpleParser.java b/simple_plugin/gen/com/simpleplugin/parser/SimpleParser.java new file mode 100644 index 000000000..3e28b7da7 --- /dev/null +++ b/simple_plugin/gen/com/simpleplugin/parser/SimpleParser.java @@ -0,0 +1,104 @@ +// This is a generated file. Not intended for manual editing. +package com.simpleplugin.parser; + +import com.intellij.lang.PsiBuilder; +import com.intellij.lang.PsiBuilder.Marker; +import static com.simpleplugin.psi.SimpleTypes.*; +import static com.intellij.lang.parser.GeneratedParserUtilBase.*; +import com.intellij.psi.tree.IElementType; +import com.intellij.lang.ASTNode; +import com.intellij.psi.tree.TokenSet; +import com.intellij.lang.PsiParser; +import com.intellij.lang.LightPsiParser; + +@SuppressWarnings({"SimplifiableIfStatement", "UnusedAssignment"}) +public class SimpleParser implements PsiParser, LightPsiParser { + + public ASTNode parse(IElementType t, PsiBuilder b) { + parseLight(t, b); + return b.getTreeBuilt(); + } + + public void parseLight(IElementType t, PsiBuilder b) { + boolean r; + b = adapt_builder_(t, b, this, null); + Marker m = enter_section_(b, 0, _COLLAPSE_, null); + if (t == PROPERTY) { + r = property(b, 0); + } + else { + r = parse_root_(t, b, 0); + } + exit_section_(b, 0, m, t, r, true, TRUE_CONDITION); + } + + protected boolean parse_root_(IElementType t, PsiBuilder b, int l) { + return simpleFile(b, l + 1); + } + + /* ********************************************************** */ + // property|COMMENT|CRLF + static boolean item_(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "item_")) return false; + boolean r; + Marker m = enter_section_(b); + r = property(b, l + 1); + if (!r) r = consumeToken(b, COMMENT); + if (!r) r = consumeToken(b, CRLF); + exit_section_(b, m, null, r); + return r; + } + + /* ********************************************************** */ + // (KEY? SEPARATOR VALUE?) | KEY + public static boolean property(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "property")) return false; + if (!nextTokenIs(b, "", KEY, SEPARATOR)) return false; + boolean r; + Marker m = enter_section_(b, l, _NONE_, ""); + r = property_0(b, l + 1); + if (!r) r = consumeToken(b, KEY); + exit_section_(b, l, m, PROPERTY, r, false, null); + return r; + } + + // KEY? SEPARATOR VALUE? + private static boolean property_0(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "property_0")) return false; + boolean r; + Marker m = enter_section_(b); + r = property_0_0(b, l + 1); + r = r && consumeToken(b, SEPARATOR); + r = r && property_0_2(b, l + 1); + exit_section_(b, m, null, r); + return r; + } + + // KEY? + private static boolean property_0_0(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "property_0_0")) return false; + consumeToken(b, KEY); + return true; + } + + // VALUE? + private static boolean property_0_2(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "property_0_2")) return false; + consumeToken(b, VALUE); + return true; + } + + /* ********************************************************** */ + // item_* + static boolean simpleFile(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "simpleFile")) return false; + int c = current_position_(b); + while (true) { + if (!item_(b, l + 1)) break; + if (!empty_element_parsed_guard_(b, "simpleFile", c)) break; + c = current_position_(b); + } + return true; + } + +} diff --git a/simple_plugin/gen/com/simpleplugin/psi/SimpleProperty.java b/simple_plugin/gen/com/simpleplugin/psi/SimpleProperty.java new file mode 100644 index 000000000..2ff5df042 --- /dev/null +++ b/simple_plugin/gen/com/simpleplugin/psi/SimpleProperty.java @@ -0,0 +1,23 @@ +// This is a generated file. Not intended for manual editing. +package com.simpleplugin.psi; + +import java.util.List; +import org.jetbrains.annotations.*; +import com.intellij.psi.PsiElement; +import com.intellij.navigation.ItemPresentation; + +public interface SimpleProperty extends SimpleNamedElement { + + String getKey(); + + String getValue(); + + String getName(); + + PsiElement setName(String newName); + + PsiElement getNameIdentifier(); + + ItemPresentation getPresentation(); + +} diff --git a/simple_plugin/gen/com/simpleplugin/psi/SimpleTypes.java b/simple_plugin/gen/com/simpleplugin/psi/SimpleTypes.java new file mode 100644 index 000000000..36792334c --- /dev/null +++ b/simple_plugin/gen/com/simpleplugin/psi/SimpleTypes.java @@ -0,0 +1,28 @@ +// This is a generated file. Not intended for manual editing. +package com.simpleplugin.psi; + +import com.intellij.psi.tree.IElementType; +import com.intellij.psi.PsiElement; +import com.intellij.lang.ASTNode; +import com.simpleplugin.psi.impl.*; + +public interface SimpleTypes { + + IElementType PROPERTY = new SimpleElementType("PROPERTY"); + + IElementType COMMENT = new SimpleTokenType("COMMENT"); + IElementType CRLF = new SimpleTokenType("CRLF"); + IElementType KEY = new SimpleTokenType("KEY"); + IElementType SEPARATOR = new SimpleTokenType("SEPARATOR"); + IElementType VALUE = new SimpleTokenType("VALUE"); + + class Factory { + public static PsiElement createElement(ASTNode node) { + IElementType type = node.getElementType(); + if (type == PROPERTY) { + return new SimplePropertyImpl(node); + } + throw new AssertionError("Unknown element type: " + type); + } + } +} diff --git a/simple_plugin/gen/com/simpleplugin/psi/SimpleVisitor.java b/simple_plugin/gen/com/simpleplugin/psi/SimpleVisitor.java new file mode 100644 index 000000000..504829968 --- /dev/null +++ b/simple_plugin/gen/com/simpleplugin/psi/SimpleVisitor.java @@ -0,0 +1,22 @@ +// This is a generated file. Not intended for manual editing. +package com.simpleplugin.psi; + +import org.jetbrains.annotations.*; +import com.intellij.psi.PsiElementVisitor; +import com.intellij.psi.PsiElement; + +public class SimpleVisitor extends PsiElementVisitor { + + public void visitProperty(@NotNull SimpleProperty o) { + visitNamedElement(o); + } + + public void visitNamedElement(@NotNull SimpleNamedElement o) { + visitPsiElement(o); + } + + public void visitPsiElement(@NotNull PsiElement o) { + visitElement(o); + } + +} diff --git a/simple_plugin/gen/com/simpleplugin/psi/impl/SimplePropertyImpl.java b/simple_plugin/gen/com/simpleplugin/psi/impl/SimplePropertyImpl.java new file mode 100644 index 000000000..7c0abca71 --- /dev/null +++ b/simple_plugin/gen/com/simpleplugin/psi/impl/SimplePropertyImpl.java @@ -0,0 +1,49 @@ +// This is a generated file. Not intended for manual editing. +package com.simpleplugin.psi.impl; + +import java.util.List; +import org.jetbrains.annotations.*; +import com.intellij.lang.ASTNode; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiElementVisitor; +import com.intellij.psi.util.PsiTreeUtil; +import static com.simpleplugin.psi.SimpleTypes.*; +import com.simpleplugin.psi.*; +import com.intellij.navigation.ItemPresentation; + +public class SimplePropertyImpl extends SimpleNamedElementImpl implements SimpleProperty { + + public SimplePropertyImpl(ASTNode node) { + super(node); + } + + public void accept(@NotNull PsiElementVisitor visitor) { + if (visitor instanceof SimpleVisitor) ((SimpleVisitor)visitor).visitProperty(this); + else super.accept(visitor); + } + + public String getKey() { + return SimplePsiImplUtil.getKey(this); + } + + public String getValue() { + return SimplePsiImplUtil.getValue(this); + } + + public String getName() { + return SimplePsiImplUtil.getName(this); + } + + public PsiElement setName(String newName) { + return SimplePsiImplUtil.setName(this, newName); + } + + public PsiElement getNameIdentifier() { + return SimplePsiImplUtil.getNameIdentifier(this); + } + + public ItemPresentation getPresentation() { + return SimplePsiImplUtil.getPresentation(this); + } + +} diff --git a/simple_plugin/idea-flex.skeleton b/simple_plugin/idea-flex.skeleton new file mode 100644 index 000000000..234a62c41 --- /dev/null +++ b/simple_plugin/idea-flex.skeleton @@ -0,0 +1,251 @@ + /** initial size of the lookahead buffer */ +--- private static final int ZZ_BUFFERSIZE = ...; + + /** lexical states */ +--- lexical states, charmap + + /* error codes */ + private static final int ZZ_UNKNOWN_ERROR = 0; + private static final int ZZ_NO_MATCH = 1; + private static final int ZZ_PUSHBACK_2BIG = 2; + private static final char[] EMPTY_BUFFER = new char[0]; + private static final int YYEOF = -1; + private static java.io.Reader zzReader = null; // Fake + + /* error messages for the codes above */ + private static final String ZZ_ERROR_MSG[] = { + "Unkown internal scanner error", + "Error: could not match input", + "Error: pushback value was too large" + }; + +--- isFinal list + /** the current state of the DFA */ + private int zzState; + + /** the current lexical state */ + private int zzLexicalState = YYINITIAL; + + /** this buffer contains the current text to be matched and is + the source of the yytext() string */ + private CharSequence zzBuffer = ""; + + /** this buffer may contains the current text array to be matched when it is cheap to acquire it */ + private char[] zzBufferArray; + + /** the textposition at the last accepting state */ + private int zzMarkedPos; + + /** the textposition at the last state to be included in yytext */ + private int zzPushbackPos; + + /** the current text position in the buffer */ + private int zzCurrentPos; + + /** startRead marks the beginning of the yytext() string in the buffer */ + private int zzStartRead; + + /** endRead marks the last character in the buffer, that has been read + from input */ + private int zzEndRead; + + /** + * zzAtBOL == true <=> the scanner is currently at the beginning of a line + */ + private boolean zzAtBOL = true; + + /** zzAtEOF == true <=> the scanner is at the EOF */ + private boolean zzAtEOF; + +--- user class code + +--- constructor declaration + + public final int getTokenStart(){ + return zzStartRead; + } + + public final int getTokenEnd(){ + return getTokenStart() + yylength(); + } + + public void reset(CharSequence buffer, int start, int end,int initialState){ + zzBuffer = buffer; + zzBufferArray = com.intellij.util.text.CharArrayUtil.fromSequenceWithoutCopying(buffer); + zzCurrentPos = zzMarkedPos = zzStartRead = start; + zzPushbackPos = 0; + zzAtEOF = false; + zzAtBOL = true; + zzEndRead = end; + yybegin(initialState); + } + + /** + * Refills the input buffer. + * + * @return false, iff there was new input. + * + * @exception java.io.IOException if any I/O-Error occurs + */ + private boolean zzRefill() throws java.io.IOException { + return true; + } + + + /** + * Returns the current lexical state. + */ + public final int yystate() { + return zzLexicalState; + } + + + /** + * Enters a new lexical state + * + * @param newState the new lexical state + */ + public final void yybegin(int newState) { + zzLexicalState = newState; + } + + + /** + * Returns the text matched by the current regular expression. + */ + public final CharSequence yytext() { + return zzBuffer.subSequence(zzStartRead, zzMarkedPos); + } + + + /** + * Returns the character at position pos from the + * matched text. + * + * It is equivalent to yytext().charAt(pos), but faster + * + * @param pos the position of the character to fetch. + * A value from 0 to yylength()-1. + * + * @return the character at position pos + */ + public final char yycharat(int pos) { + return zzBufferArray != null ? zzBufferArray[zzStartRead+pos]:zzBuffer.charAt(zzStartRead+pos); + } + + + /** + * Returns the length of the matched text region. + */ + public final int yylength() { + return zzMarkedPos-zzStartRead; + } + + + /** + * Reports an error that occured while scanning. + * + * In a wellformed scanner (no or only correct usage of + * yypushback(int) and a match-all fallback rule) this method + * will only be called with things that "Can't Possibly Happen". + * If this method is called, something is seriously wrong + * (e.g. a JFlex bug producing a faulty scanner etc.). + * + * Usual syntax/scanner level error handling should be done + * in error fallback rules. + * + * @param errorCode the code of the errormessage to display + */ +--- zzScanError declaration + String message; + try { + message = ZZ_ERROR_MSG[errorCode]; + } + catch (ArrayIndexOutOfBoundsException e) { + message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR]; + } + +--- throws clause + } + + + /** + * Pushes the specified amount of characters back into the input stream. + * + * They will be read again by then next call of the scanning method + * + * @param number the number of characters to be read again. + * This number must not be greater than yylength()! + */ +--- yypushback decl (contains zzScanError exception) + if ( number > yylength() ) + zzScanError(ZZ_PUSHBACK_2BIG); + + zzMarkedPos -= number; + } + + +--- zzDoEOF + /** + * Resumes scanning until the next regular expression is matched, + * the end of input is encountered or an I/O-Error occurs. + * + * @return the next token + * @exception java.io.IOException if any I/O-Error occurs + */ +--- yylex declaration + int zzInput; + int zzAction; + + // cached fields: + int zzCurrentPosL; + int zzMarkedPosL; + int zzEndReadL = zzEndRead; + CharSequence zzBufferL = zzBuffer; + char[] zzBufferArrayL = zzBufferArray; + char [] zzCMapL = ZZ_CMAP; + +--- local declarations + + while (true) { + zzMarkedPosL = zzMarkedPos; + +--- start admin (line, char, col count) + zzAction = -1; + + zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL; + +--- start admin (lexstate etc) + + zzForAction: { + while (true) { + +--- next input, line, col, char count, next transition, isFinal action + zzAction = zzState; + zzMarkedPosL = zzCurrentPosL; +--- line count update + } + + } + } + + // store back cached position + zzMarkedPos = zzMarkedPosL; +--- char count update + +--- actions + default: + if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { + zzAtEOF = true; +--- eofvalue + } + else { +--- no match + } + } + } + } + +--- main + +} diff --git a/simple_plugin/src/com/simpleplugin/CreatePropertyQuickFix.java b/simple_plugin/src/com/simpleplugin/CreatePropertyQuickFix.java new file mode 100644 index 000000000..add125e7d --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/CreatePropertyQuickFix.java @@ -0,0 +1,99 @@ +package com.simpleplugin; + +import com.intellij.codeInsight.intention.impl.BaseIntentionAction; +import com.intellij.lang.ASTNode; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.command.WriteCommandAction; +import com.intellij.openapi.editor.*; +import com.intellij.openapi.fileChooser.FileChooser; +import com.intellij.openapi.fileChooser.FileChooserDescriptor; +import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; +import com.intellij.openapi.fileEditor.FileEditorManager; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.pom.Navigatable; +import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiManager; +import com.intellij.psi.search.FileTypeIndex; +import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.util.IncorrectOperationException; +import com.intellij.util.indexing.FileBasedIndex; +import com.simpleplugin.psi.SimpleElementFactory; +import com.simpleplugin.psi.SimpleFile; +import com.simpleplugin.psi.SimpleProperty; +import com.simpleplugin.psi.SimpleTypes; +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; + +class CreatePropertyQuickFix extends BaseIntentionAction { + private String key; + + CreatePropertyQuickFix(String key) { + this.key = key; + } + + @NotNull + @Override + public String getText() { + return "Create property"; + } + + @NotNull + @Override + public String getFamilyName() { + return "Simple properties"; + } + + @Override + public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) { + return true; + } + + @Override + public void invoke(@NotNull final Project project, final Editor editor, PsiFile file) throws IncorrectOperationException { + ApplicationManager.getApplication().invokeLater(new Runnable() { + @Override + public void run() { + Collection virtualFiles = FileBasedIndex.getInstance().getContainingFiles(FileTypeIndex.NAME, SimpleFileType.INSTANCE, + GlobalSearchScope.allScope(project)); + if (virtualFiles.size() == 1) { + createProperty(project, virtualFiles.iterator().next()); + } else { + final FileChooserDescriptor descriptor = FileChooserDescriptorFactory.createSingleFileDescriptor(SimpleFileType.INSTANCE); + descriptor.setRoots(project.getBaseDir()); + final VirtualFile file = FileChooser.chooseFile(descriptor, project, null); + if (file != null) { + createProperty(project, file); + } + } + } + }); + } + + private void createProperty(final Project project, final VirtualFile file) { + new WriteCommandAction.Simple(project) { + @Override + public void run() { + SimpleFile simpleFile = (SimpleFile) PsiManager.getInstance(project).findFile(file); + ASTNode lastChildNode = simpleFile.getNode().getLastChildNode(); + if (lastChildNode != null && !lastChildNode.getElementType().equals(SimpleTypes.CRLF)) { + simpleFile.getNode().addChild(SimpleElementFactory.createCRLF(project).getNode()); + } + // IMPORTANT: change spaces to escaped spaces or the new node will only have the first word for the key + SimpleProperty property = SimpleElementFactory.createProperty(project, key.replaceAll(" ", "\\\\ "), ""); + simpleFile.getNode().addChild(property.getNode()); + ((Navigatable) property.getLastChild().getNavigationElement()).navigate(true); + FileEditorManager.getInstance(project).getSelectedTextEditor().getCaretModel(). + moveCaretRelatively(2, 0, false, false, false); + + // almost the same thing but manipulating plain text of the document instead of PSI +// FileEditorManager.getInstance(project).openFile(file, true); +// final Editor editor = FileEditorManager.getInstance(project).getSelectedTextEditor(); +// final Document document = editor.getDocument(); +// document.insertString(document.getTextLength(), "\n" + key.replaceAll(" ", "\\\\ ") + " = "); +// editor.getCaretModel().getPrimaryCaret().moveToOffset(document.getTextLength()); + } + }.execute(); + } +} diff --git a/simple_plugin/src/com/simpleplugin/Simple.bnf b/simple_plugin/src/com/simpleplugin/Simple.bnf new file mode 100644 index 000000000..d5ca3cef2 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/Simple.bnf @@ -0,0 +1,23 @@ +{ + parserClass="com.simpleplugin.parser.SimpleParser" + + extends="com.intellij.extapi.psi.ASTWrapperPsiElement" + + psiClassPrefix="Simple" + psiImplClassSuffix="Impl" + psiPackage="com.simpleplugin.psi" + psiImplPackage="com.simpleplugin.psi.impl" + + elementTypeHolderClass="com.simpleplugin.psi.SimpleTypes" + elementTypeClass="com.simpleplugin.psi.SimpleElementType" + tokenTypeClass="com.simpleplugin.psi.SimpleTokenType" + + psiImplUtilClass="com.simpleplugin.psi.impl.SimplePsiImplUtil" +} + +simpleFile ::= item_* + +private item_ ::= (property|COMMENT|CRLF) + +property ::= (KEY? SEPARATOR VALUE?) | KEY {mixin="com.simpleplugin.psi.impl.SimpleNamedElementImpl" + implements="com.simpleplugin.psi.SimpleNamedElement" methods=[getKey getValue getName setName getNameIdentifier getPresentation]} \ No newline at end of file diff --git a/simple_plugin/src/com/simpleplugin/Simple.flex b/simple_plugin/src/com/simpleplugin/Simple.flex new file mode 100644 index 000000000..89dabf207 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/Simple.flex @@ -0,0 +1,46 @@ +package com.simpleplugin; + +import com.intellij.lexer.FlexLexer; +import com.intellij.psi.tree.IElementType; +import com.simpleplugin.psi.SimpleTypes; +import com.intellij.psi.TokenType; + +%% + +%class SimpleLexer +%implements FlexLexer +%unicode +%function advance +%type IElementType +%eof{ return; +%eof} + +CRLF= \n|\r|\r\n +WHITE_SPACE=[\ \t\f] +FIRST_VALUE_CHARACTER=[^ \n\r\f\\] | "\\"{CRLF} | "\\". +VALUE_CHARACTER=[^\n\r\f\\] | "\\"{CRLF} | "\\". +END_OF_LINE_COMMENT=("#"|"!")[^\r\n]* +SEPARATOR=[:=] +KEY_CHARACTER=[^:=\ \n\r\t\f\\] | "\\ " + +%state WAITING_VALUE + +%% + + {END_OF_LINE_COMMENT} { yybegin(YYINITIAL); return SimpleTypes.COMMENT; } + + {KEY_CHARACTER}+ { yybegin(YYINITIAL); return SimpleTypes.KEY; } + + {SEPARATOR} { yybegin(WAITING_VALUE); return SimpleTypes.SEPARATOR; } + + {CRLF}({CRLF}|{WHITE_SPACE})+ { yybegin(YYINITIAL); return TokenType.WHITE_SPACE; } + + {WHITE_SPACE}+ { yybegin(WAITING_VALUE); return TokenType.WHITE_SPACE; } + + {FIRST_VALUE_CHARACTER}{VALUE_CHARACTER}* { yybegin(YYINITIAL); return SimpleTypes.VALUE; } + +({CRLF}|{WHITE_SPACE})+ { yybegin(YYINITIAL); return TokenType.WHITE_SPACE; } + +{WHITE_SPACE}+ { yybegin(YYINITIAL); return TokenType.WHITE_SPACE; } + +. { return TokenType.BAD_CHARACTER; } diff --git a/simple_plugin/src/com/simpleplugin/SimpleAnnotator.java b/simple_plugin/src/com/simpleplugin/SimpleAnnotator.java new file mode 100644 index 000000000..e0425c5cc --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleAnnotator.java @@ -0,0 +1,41 @@ +package com.simpleplugin; + +import com.intellij.lang.annotation.Annotation; +import com.intellij.lang.annotation.AnnotationHolder; +import com.intellij.lang.annotation.Annotator; +import com.intellij.openapi.editor.DefaultLanguageHighlighterColors; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.TextRange; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiLiteralExpression; +import com.simpleplugin.psi.SimpleProperty; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public class SimpleAnnotator implements Annotator { + @Override + public void annotate(@NotNull final PsiElement element, @NotNull AnnotationHolder holder) { + if (element instanceof PsiLiteralExpression) { + PsiLiteralExpression literalExpression = (PsiLiteralExpression) element; + String value = literalExpression.getValue() instanceof String ? (String)literalExpression.getValue() : null; + + if (value != null && value.startsWith("simple"+":")) { + Project project = element.getProject(); + String key = value.substring(7); + List properties = SimpleUtil.findProperties(project, key); + if (properties.size() == 1) { + TextRange range = new TextRange(element.getTextRange().getStartOffset() + 7, + element.getTextRange().getStartOffset() + 7); + Annotation annotation = holder.createInfoAnnotation(range, null); + annotation.setTextAttributes(DefaultLanguageHighlighterColors.LINE_COMMENT); + } else if (properties.size() == 0) { + TextRange range = new TextRange(element.getTextRange().getStartOffset() + 8, + element.getTextRange().getEndOffset()); + holder.createErrorAnnotation(range, "Unresolved property"). + registerFix(new CreatePropertyQuickFix(key)); + } + } + } + } +} diff --git a/simple_plugin/src/com/simpleplugin/SimpleBlock.java b/simple_plugin/src/com/simpleplugin/SimpleBlock.java new file mode 100644 index 000000000..9c1b723a0 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleBlock.java @@ -0,0 +1,57 @@ +package com.simpleplugin; + +import com.intellij.formatting.*; +import com.intellij.lang.ASTNode; +import com.intellij.psi.TokenType; +import com.intellij.psi.formatter.common.AbstractBlock; +import com.simpleplugin.psi.SimpleTypes; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; + +public class SimpleBlock extends AbstractBlock { + private SpacingBuilder spacingBuilder; + + protected SimpleBlock(@NotNull ASTNode node, @Nullable Wrap wrap, @Nullable Alignment alignment, + SpacingBuilder spacingBuilder) { + super(node, wrap, alignment); + this.spacingBuilder = spacingBuilder; + } + + @Override + protected List buildChildren() { + List blocks = new ArrayList(); + ASTNode child = myNode.getFirstChildNode(); + ASTNode previousChild = null; + while (child != null) { + if (child.getElementType() != TokenType.WHITE_SPACE && + (previousChild == null || previousChild.getElementType() != SimpleTypes.CRLF || + child.getElementType() != SimpleTypes.CRLF)) { + Block block = new SimpleBlock(child, Wrap.createWrap(WrapType.NONE, false), Alignment.createAlignment(), + spacingBuilder); + blocks.add(block); + } + previousChild = child; + child = child.getTreeNext(); + } + return blocks; + } + + @Override + public Indent getIndent() { + return Indent.getNoneIndent(); + } + + @Nullable + @Override + public Spacing getSpacing(@Nullable Block child1, @NotNull Block child2) { + return spacingBuilder.getSpacing(this, child1, child2); + } + + @Override + public boolean isLeaf() { + return myNode.getFirstChildNode() == null; + } +} diff --git a/simple_plugin/src/com/simpleplugin/SimpleChooseByNameContributor.java b/simple_plugin/src/com/simpleplugin/SimpleChooseByNameContributor.java new file mode 100644 index 000000000..1ec9f06ed --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleChooseByNameContributor.java @@ -0,0 +1,33 @@ +package com.simpleplugin; + +import com.intellij.navigation.ChooseByNameContributor; +import com.intellij.navigation.NavigationItem; +import com.intellij.openapi.project.Project; +import com.simpleplugin.psi.SimpleProperty; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +public class SimpleChooseByNameContributor implements ChooseByNameContributor { + @NotNull + @Override + public String[] getNames(Project project, boolean includeNonProjectItems) { + List properties = SimpleUtil.findProperties(project); + List names = new ArrayList(properties.size()); + for (SimpleProperty property : properties) { + if (property.getKey() != null && property.getKey().length() > 0) { + names.add(property.getKey()); + } + } + return names.toArray(new String[names.size()]); + } + + @NotNull + @Override + public NavigationItem[] getItemsByName(String name, String pattern, Project project, boolean includeNonProjectItems) { + // todo include non project items + List properties = SimpleUtil.findProperties(project, name); + return properties.toArray(new NavigationItem[properties.size()]); + } +} \ No newline at end of file diff --git a/simple_plugin/src/com/simpleplugin/SimpleCodeStyleSettings.java b/simple_plugin/src/com/simpleplugin/SimpleCodeStyleSettings.java new file mode 100644 index 000000000..bb62cdb4c --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleCodeStyleSettings.java @@ -0,0 +1,10 @@ +package com.simpleplugin; + +import com.intellij.psi.codeStyle.CodeStyleSettings; +import com.intellij.psi.codeStyle.CustomCodeStyleSettings; + +public class SimpleCodeStyleSettings extends CustomCodeStyleSettings { + public SimpleCodeStyleSettings(CodeStyleSettings settings) { + super("SimpleCodeStyleSettings", settings); + } +} \ No newline at end of file diff --git a/simple_plugin/src/com/simpleplugin/SimpleCodeStyleSettingsProvider.java b/simple_plugin/src/com/simpleplugin/SimpleCodeStyleSettingsProvider.java new file mode 100644 index 000000000..f19dc35b8 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleCodeStyleSettingsProvider.java @@ -0,0 +1,47 @@ +package com.simpleplugin; + +import com.intellij.application.options.CodeStyleAbstractConfigurable; +import com.intellij.application.options.CodeStyleAbstractPanel; +import com.intellij.application.options.TabbedLanguageCodeStylePanel; +import com.intellij.openapi.options.Configurable; +import com.intellij.psi.codeStyle.CodeStyleSettings; +import com.intellij.psi.codeStyle.CodeStyleSettingsProvider; +import com.intellij.psi.codeStyle.CustomCodeStyleSettings; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class SimpleCodeStyleSettingsProvider extends CodeStyleSettingsProvider { + @Override + public CustomCodeStyleSettings createCustomSettings(CodeStyleSettings settings) { + return new SimpleCodeStyleSettings(settings); + } + + @Nullable + @Override + public String getConfigurableDisplayName() { + return "Simple"; + } + + @NotNull + @Override + public Configurable createSettingsPage(CodeStyleSettings settings, CodeStyleSettings originalSettings) { + return new CodeStyleAbstractConfigurable(settings, originalSettings, "Simple") { + @Override + protected CodeStyleAbstractPanel createPanel(CodeStyleSettings settings) { + return new SimpleCodeStyleMainPanel(getCurrentSettings(), settings); + } + + @Nullable + @Override + public String getHelpTopic() { + return null; + } + }; + } + + private static class SimpleCodeStyleMainPanel extends TabbedLanguageCodeStylePanel { + public SimpleCodeStyleMainPanel(CodeStyleSettings currentSettings, CodeStyleSettings settings) { + super(SimpleLanguage.INSTANCE, currentSettings, settings); + } + } +} \ No newline at end of file diff --git a/simple_plugin/src/com/simpleplugin/SimpleColorSettingsPage.java b/simple_plugin/src/com/simpleplugin/SimpleColorSettingsPage.java new file mode 100644 index 000000000..489aede15 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleColorSettingsPage.java @@ -0,0 +1,73 @@ +package com.simpleplugin; + +import com.intellij.openapi.editor.colors.TextAttributesKey; +import com.intellij.openapi.fileTypes.SyntaxHighlighter; +import com.intellij.openapi.options.colors.AttributesDescriptor; +import com.intellij.openapi.options.colors.ColorDescriptor; +import com.intellij.openapi.options.colors.ColorSettingsPage; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; +import java.util.Map; + +public class SimpleColorSettingsPage implements ColorSettingsPage { + private static final AttributesDescriptor[] DESCRIPTORS = new AttributesDescriptor[]{ + new AttributesDescriptor("Key", SimpleSyntaxHighlighter.KEY), + new AttributesDescriptor("Separator", SimpleSyntaxHighlighter.SEPARATOR), + new AttributesDescriptor("Value", SimpleSyntaxHighlighter.VALUE), + }; + + @Nullable + @Override + public Icon getIcon() { + return SimpleIcons.FILE; + } + + @NotNull + @Override + public SyntaxHighlighter getHighlighter() { + return new SimpleSyntaxHighlighter(); + } + + @NotNull + @Override + public String getDemoText() { + return "# You are reading the \".properties\" entry.\n" + + "! The exclamation mark can also mark text as comments.\n" + + "website = http://en.wikipedia.org/\n" + + "language = English\n" + + "# The backslash below tells the application to continue reading\n" + + "# the value onto the next line.\n" + + "message = Welcome to \\\n" + + " Wikipedia!\n" + + "# Add spaces to the key\n" + + "key\\ with\\ spaces = This is the value that could be looked up with the key \"key with spaces\".\n" + + "# Unicode\n" + + "tab : \\u0009"; + } + + @Nullable + @Override + public Map getAdditionalHighlightingTagToDescriptorMap() { + return null; + } + + @NotNull + @Override + public AttributesDescriptor[] getAttributeDescriptors() { + return DESCRIPTORS; + } + + @NotNull + @Override + public ColorDescriptor[] getColorDescriptors() { + return ColorDescriptor.EMPTY_ARRAY; + } + + @NotNull + @Override + public String getDisplayName() { + return "Simple"; + } +} \ No newline at end of file diff --git a/simple_plugin/src/com/simpleplugin/SimpleCommenter.java b/simple_plugin/src/com/simpleplugin/SimpleCommenter.java new file mode 100644 index 000000000..f9f0e24a1 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleCommenter.java @@ -0,0 +1,36 @@ +package com.simpleplugin; + +import com.intellij.lang.Commenter; +import org.jetbrains.annotations.Nullable; + +public class SimpleCommenter implements Commenter { + @Nullable + @Override + public String getLineCommentPrefix() { + return "#"; + } + + @Nullable + @Override + public String getBlockCommentPrefix() { + return ""; + } + + @Nullable + @Override + public String getBlockCommentSuffix() { + return null; + } + + @Nullable + @Override + public String getCommentedBlockCommentPrefix() { + return null; + } + + @Nullable + @Override + public String getCommentedBlockCommentSuffix() { + return null; + } +} \ No newline at end of file diff --git a/simple_plugin/src/com/simpleplugin/SimpleCompletionContributor.java b/simple_plugin/src/com/simpleplugin/SimpleCompletionContributor.java new file mode 100644 index 000000000..1ca45e01e --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleCompletionContributor.java @@ -0,0 +1,23 @@ +package com.simpleplugin; + +import com.intellij.codeInsight.completion.*; +import com.intellij.codeInsight.lookup.LookupElementBuilder; +import com.intellij.patterns.PlatformPatterns; +import com.intellij.util.ProcessingContext; +import com.simpleplugin.psi.SimpleTypes; +import org.jetbrains.annotations.NotNull; + +public class SimpleCompletionContributor extends CompletionContributor { + public SimpleCompletionContributor() { + extend(CompletionType.BASIC, + PlatformPatterns.psiElement(SimpleTypes.VALUE).withLanguage(SimpleLanguage.INSTANCE), + new CompletionProvider() { + public void addCompletions(@NotNull CompletionParameters parameters, + ProcessingContext context, + @NotNull CompletionResultSet resultSet) { + resultSet.addElement(LookupElementBuilder.create("Hello")); + } + } + ); + } +} diff --git a/simple_plugin/src/com/simpleplugin/SimpleFileType.java b/simple_plugin/src/com/simpleplugin/SimpleFileType.java new file mode 100644 index 000000000..3d3714b4d --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleFileType.java @@ -0,0 +1,39 @@ +package com.simpleplugin; + +import com.intellij.openapi.fileTypes.LanguageFileType; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; + +public class SimpleFileType extends LanguageFileType { + public static final SimpleFileType INSTANCE = new SimpleFileType(); + + private SimpleFileType() { + super(SimpleLanguage.INSTANCE); + } + + @NotNull + @Override + public String getName() { + return "Simple file"; + } + + @NotNull + @Override + public String getDescription() { + return "Simple language file"; + } + + @NotNull + @Override + public String getDefaultExtension() { + return "simple"; + } + + @Nullable + @Override + public Icon getIcon() { + return SimpleIcons.FILE; + } +} \ No newline at end of file diff --git a/simple_plugin/src/com/simpleplugin/SimpleFileTypeFactory.java b/simple_plugin/src/com/simpleplugin/SimpleFileTypeFactory.java new file mode 100644 index 000000000..2a09d45be --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleFileTypeFactory.java @@ -0,0 +1,12 @@ +package com.simpleplugin; + +import com.intellij.openapi.fileTypes.FileTypeConsumer; +import com.intellij.openapi.fileTypes.FileTypeFactory; +import org.jetbrains.annotations.NotNull; + +public class SimpleFileTypeFactory extends FileTypeFactory{ + @Override + public void createFileTypes(@NotNull FileTypeConsumer fileTypeConsumer) { + fileTypeConsumer.consume(SimpleFileType.INSTANCE, "simple"); + } +} \ No newline at end of file diff --git a/simple_plugin/src/com/simpleplugin/SimpleFilterLexer.java b/simple_plugin/src/com/simpleplugin/SimpleFilterLexer.java new file mode 100644 index 000000000..78de00162 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleFilterLexer.java @@ -0,0 +1,19 @@ +package com.simpleplugin; + +import com.intellij.lexer.Lexer; +import com.intellij.psi.impl.cache.impl.BaseFilterLexer; +import com.intellij.psi.impl.cache.impl.OccurrenceConsumer; +import com.intellij.psi.search.UsageSearchContext; + +public class SimpleFilterLexer extends BaseFilterLexer { + public SimpleFilterLexer(final Lexer originalLexer, final OccurrenceConsumer table) { + super(originalLexer, table); + } + + @Override + public void advance() { + scanWordsInToken(UsageSearchContext.IN_COMMENTS, false, false); + advanceTodoItemCountsInToken(); + myDelegate.advance(); + } +} diff --git a/simple_plugin/src/com/simpleplugin/SimpleFindUsagesProvider.java b/simple_plugin/src/com/simpleplugin/SimpleFindUsagesProvider.java new file mode 100644 index 000000000..c766cd3b9 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleFindUsagesProvider.java @@ -0,0 +1,65 @@ +package com.simpleplugin; + +import com.intellij.lang.cacheBuilder.DefaultWordsScanner; +import com.intellij.lang.cacheBuilder.WordsScanner; +import com.intellij.lang.findUsages.FindUsagesProvider; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiNamedElement; +import com.intellij.psi.tree.TokenSet; +import com.simpleplugin.psi.SimpleProperty; +import com.simpleplugin.psi.SimpleTypes; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class SimpleFindUsagesProvider implements FindUsagesProvider { + private static final DefaultWordsScanner WORDS_SCANNER = + new DefaultWordsScanner(new SimpleLexerAdapter(), + TokenSet.create(SimpleTypes.KEY), TokenSet.create(SimpleTypes.COMMENT), TokenSet.EMPTY); + + @Nullable + @Override + public WordsScanner getWordsScanner() { + return WORDS_SCANNER; + } + + @Override + public boolean canFindUsagesFor(@NotNull PsiElement psiElement) { + return psiElement instanceof PsiNamedElement; + } + + @Nullable + @Override + public String getHelpId(@NotNull PsiElement psiElement) { + return null; + } + + @NotNull + @Override + public String getType(@NotNull PsiElement element) { + if (element instanceof SimpleProperty) { + return "simple property"; + } else { + return ""; + } + } + + @NotNull + @Override + public String getDescriptiveName(@NotNull PsiElement element) { + if (element instanceof SimpleProperty) { + return ((SimpleProperty) element).getKey(); + } else { + return ""; + } + } + + @NotNull + @Override + public String getNodeText(@NotNull PsiElement element, boolean useFullName) { + if (element instanceof SimpleProperty) { + return ((SimpleProperty) element).getKey() + ":" + ((SimpleProperty) element).getValue(); + } else { + return ""; + } + } +} \ No newline at end of file diff --git a/simple_plugin/src/com/simpleplugin/SimpleFoldingBuilder.java b/simple_plugin/src/com/simpleplugin/SimpleFoldingBuilder.java new file mode 100644 index 000000000..745726933 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleFoldingBuilder.java @@ -0,0 +1,65 @@ +package com.simpleplugin; + +import com.intellij.lang.ASTNode; +import com.intellij.lang.folding.FoldingBuilderEx; +import com.intellij.lang.folding.FoldingDescriptor; +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.editor.FoldingGroup; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.TextRange; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiLiteralExpression; +import com.intellij.psi.util.PsiTreeUtil; +import com.simpleplugin.psi.SimpleProperty; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +public class SimpleFoldingBuilder extends FoldingBuilderEx { + @NotNull + @Override + public FoldingDescriptor[] buildFoldRegions(@NotNull PsiElement root, @NotNull Document document, boolean quick) { + FoldingGroup group = FoldingGroup.newGroup("simple"); + + List descriptors = new ArrayList(); + Collection literalExpressions = PsiTreeUtil.findChildrenOfType(root, PsiLiteralExpression.class); + for (final PsiLiteralExpression literalExpression : literalExpressions) { + String value = literalExpression.getValue() instanceof String ? (String)literalExpression.getValue() : null; + + if (value != null && value.startsWith("simple:")) { + Project project = literalExpression.getProject(); + String key = value.substring(7); + final List properties = SimpleUtil.findProperties(project, key); + if (properties.size() == 1) { + descriptors.add(new FoldingDescriptor(literalExpression.getNode(), + new TextRange(literalExpression.getTextRange().getStartOffset() + 1, + literalExpression.getTextRange().getEndOffset() - 1), group) { + @Nullable + @Override + public String getPlaceholderText() { + // IMPORTANT: keys can come with no values, so a test for null is needed + // IMPORTANT: Convert embedded \n to backslash n, so that the string will look like it has LF embedded in it and embedded " to escaped " + String valueOf = properties.get(0).getValue(); + return valueOf == null ? "" : valueOf.replaceAll("\n","\\n").replaceAll("\"","\\\\\""); + } + }); + } + } + } + return descriptors.toArray(new FoldingDescriptor[descriptors.size()]); + } + + @Nullable + @Override + public String getPlaceholderText(@NotNull ASTNode node) { + return "..."; + } + + @Override + public boolean isCollapsedByDefault(@NotNull ASTNode node) { + return true; + } +} diff --git a/simple_plugin/src/com/simpleplugin/SimpleFormattingModelBuilder.java b/simple_plugin/src/com/simpleplugin/SimpleFormattingModelBuilder.java new file mode 100644 index 000000000..b20468c77 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleFormattingModelBuilder.java @@ -0,0 +1,33 @@ +package com.simpleplugin; + +import com.intellij.formatting.*; +import com.intellij.lang.ASTNode; +import com.intellij.openapi.util.TextRange; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.codeStyle.CodeStyleSettings; +import com.simpleplugin.psi.SimpleTypes; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class SimpleFormattingModelBuilder implements FormattingModelBuilder { + @NotNull + @Override + public FormattingModel createModel(PsiElement element, CodeStyleSettings settings) { + return FormattingModelProvider.createFormattingModelForPsiFile(element.getContainingFile(), + new SimpleBlock(element.getNode(), Wrap.createWrap(WrapType.NONE, false), + Alignment.createAlignment(), createSpaceBuilder(settings)), settings); + } + + private static SpacingBuilder createSpaceBuilder(CodeStyleSettings settings) { + return new SpacingBuilder(settings, SimpleLanguage.INSTANCE). + around(SimpleTypes.SEPARATOR).spaceIf(settings.SPACE_AROUND_ASSIGNMENT_OPERATORS). + before(SimpleTypes.PROPERTY).none(); + } + + @Nullable + @Override + public TextRange getRangeAffectingIndent(PsiFile file, int offset, ASTNode elementAtOffset) { + return null; + } +} \ No newline at end of file diff --git a/simple_plugin/src/com/simpleplugin/SimpleIcons.java b/simple_plugin/src/com/simpleplugin/SimpleIcons.java new file mode 100644 index 000000000..2719cf69e --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleIcons.java @@ -0,0 +1,9 @@ +package com.simpleplugin; + +import com.intellij.openapi.util.IconLoader; + +import javax.swing.*; + +public class SimpleIcons { + public static final Icon FILE = IconLoader.getIcon("/com/simpleplugin/icons/jar-gray.png"); +} \ No newline at end of file diff --git a/simple_plugin/src/com/simpleplugin/SimpleIdIndexer.java b/simple_plugin/src/com/simpleplugin/SimpleIdIndexer.java new file mode 100644 index 000000000..bfc0a75ac --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleIdIndexer.java @@ -0,0 +1,17 @@ +package com.simpleplugin; + +import com.intellij.lexer.Lexer; +import com.intellij.psi.impl.cache.impl.OccurrenceConsumer; +import com.intellij.psi.impl.cache.impl.id.LexerBasedIdIndexer; + +public class SimpleIdIndexer extends LexerBasedIdIndexer { + + public static Lexer createIndexingLexer(OccurrenceConsumer consumer) { + return new SimpleFilterLexer(new SimpleLexerAdapter(), consumer); + } + + @Override + public Lexer createLexer(final OccurrenceConsumer consumer) { + return createIndexingLexer(consumer); + } +} diff --git a/simple_plugin/src/com/simpleplugin/SimpleLanguage.java b/simple_plugin/src/com/simpleplugin/SimpleLanguage.java new file mode 100644 index 000000000..425e59019 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleLanguage.java @@ -0,0 +1,11 @@ +package com.simpleplugin; + +import com.intellij.lang.Language; + +public class SimpleLanguage extends Language { + public static final SimpleLanguage INSTANCE = new SimpleLanguage(); + + private SimpleLanguage() { + super("Simple"); + } +} \ No newline at end of file diff --git a/simple_plugin/src/com/simpleplugin/SimpleLanguageCodeStyleSettingsProvider.java b/simple_plugin/src/com/simpleplugin/SimpleLanguageCodeStyleSettingsProvider.java new file mode 100644 index 000000000..5df02eb89 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleLanguageCodeStyleSettingsProvider.java @@ -0,0 +1,43 @@ +package com.simpleplugin; + +import com.intellij.lang.Language; +import com.intellij.psi.codeStyle.CodeStyleSettingsCustomizable; +import com.intellij.psi.codeStyle.LanguageCodeStyleSettingsProvider; +import org.jetbrains.annotations.NotNull; + +public class SimpleLanguageCodeStyleSettingsProvider extends LanguageCodeStyleSettingsProvider { + @NotNull + @Override + public Language getLanguage() { + return SimpleLanguage.INSTANCE; + } + + @Override + public void customizeSettings(@NotNull CodeStyleSettingsCustomizable consumer, @NotNull SettingsType settingsType) { + if (settingsType == SettingsType.SPACING_SETTINGS) { + consumer.showStandardOptions("SPACE_AROUND_ASSIGNMENT_OPERATORS"); + consumer.renameStandardOption("SPACE_AROUND_ASSIGNMENT_OPERATORS", "Separator"); + } else if (settingsType == SettingsType.BLANK_LINES_SETTINGS) { + consumer.showStandardOptions("KEEP_BLANK_LINES_IN_CODE"); + } + } + + @Override + public String getCodeSample(@NotNull SettingsType settingsType) { + return "# You are reading the \".properties\" entry.\n" + + "! The exclamation mark can also mark text as comments.\n" + + "website = http://en.wikipedia.org/\n" + + "\n" + + "\n" + + "\n" + + "language = English\n" + + "# The backslash below tells the application to continue reading\n" + + "# the value onto the next line.\n" + + "message = Welcome to \\\n" + + " Wikipedia!\n" + + "# Add spaces to the key\n" + + "key\\ with\\ spaces = This is the value that could be looked up with the key \"key with spaces\".\n" + + "# Unicode\n" + + "tab : \\u0009"; + } +} diff --git a/simple_plugin/src/com/simpleplugin/SimpleLexer.java b/simple_plugin/src/com/simpleplugin/SimpleLexer.java new file mode 100644 index 000000000..b18e92e45 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleLexer.java @@ -0,0 +1,509 @@ +/* The following code was generated by JFlex 1.4.3 on 02/09/15 10:04 AM */ + +package com.simpleplugin; + +import com.intellij.lexer.FlexLexer; +import com.intellij.psi.tree.IElementType; +import com.simpleplugin.psi.SimpleTypes; +import com.intellij.psi.TokenType; + + +/** + * This class is a scanner generated by + * JFlex 1.4.3 + * on 02/09/15 10:04 AM from the specification file + * /Users/vlad/src/SimplePlugin/src/com/simpleplugin/Simple.flex + */ +class SimpleLexer implements FlexLexer { + /** initial size of the lookahead buffer */ + private static final int ZZ_BUFFERSIZE = 16384; + + /** lexical states */ + public static final int WAITING_VALUE = 2; + public static final int YYINITIAL = 0; + + /** + * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l + * ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l + * at the beginning of a line + * l is of the form l = 2*k, k a non negative integer + */ + private static final int ZZ_LEXSTATE[] = { + 0, 0, 1, 1 + }; + + /** + * Translates characters to character classes + */ + private static final String ZZ_CMAP_PACKED = + "\11\0\1\3\1\1\1\0\1\6\1\2\22\0\1\5\1\7\1\0"+ + "\1\7\26\0\1\10\2\0\1\10\36\0\1\4\uffa3\0"; + + /** + * Translates characters to character classes + */ + private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED); + + /** + * Translates DFA states to action switch labels. + */ + private static final int [] ZZ_ACTION = zzUnpackAction(); + + private static final String ZZ_ACTION_PACKED_0 = + "\2\0\1\1\1\2\1\3\1\4\1\5\1\6\1\7"+ + "\1\3\1\7\2\0\1\6"; + + private static int [] zzUnpackAction() { + int [] result = new int[14]; + int offset = 0; + offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackAction(String packed, int offset, int [] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int count = packed.charAt(i++); + int value = packed.charAt(i++); + do result[j++] = value; while (--count > 0); + } + return j; + } + + + /** + * Translates a state to a row index in the transition table + */ + private static final int [] ZZ_ROWMAP = zzUnpackRowMap(); + + private static final String ZZ_ROWMAP_PACKED_0 = + "\0\0\0\11\0\22\0\33\0\44\0\55\0\66\0\77"+ + "\0\110\0\121\0\132\0\44\0\121\0\143"; + + private static int [] zzUnpackRowMap() { + int [] result = new int[14]; + int offset = 0; + offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackRowMap(String packed, int offset, int [] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int high = packed.charAt(i++) << 16; + result[j++] = high | packed.charAt(i++); + } + return j; + } + + /** + * The transition table of the DFA + */ + private static final int [] ZZ_TRANS = zzUnpackTrans(); + + private static final String ZZ_TRANS_PACKED_0 = + "\1\3\3\4\1\5\2\4\1\6\1\7\1\10\2\4"+ + "\1\11\1\12\2\13\2\10\1\3\3\0\1\14\2\0"+ + "\1\3\2\0\3\4\1\0\2\4\7\0\1\3\3\0"+ + "\1\6\2\0\6\6\11\0\1\10\2\0\1\10\1\15"+ + "\1\10\1\0\3\10\2\4\1\11\1\15\1\11\1\13"+ + "\4\10\1\16\6\10\1\0\2\4\1\13\1\0\2\13"+ + "\2\0\2\10\1\0\1\10\1\15\1\10\1\0\2\10"; + + private static int [] zzUnpackTrans() { + int [] result = new int[108]; + int offset = 0; + offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackTrans(String packed, int offset, int [] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int count = packed.charAt(i++); + int value = packed.charAt(i++); + value--; + do result[j++] = value; while (--count > 0); + } + return j; + } + + + /* error codes */ + private static final int ZZ_UNKNOWN_ERROR = 0; + private static final int ZZ_NO_MATCH = 1; + private static final int ZZ_PUSHBACK_2BIG = 2; + private static final char[] EMPTY_BUFFER = new char[0]; + private static final int YYEOF = -1; + private static java.io.Reader zzReader = null; // Fake + + /* error messages for the codes above */ + private static final String ZZ_ERROR_MSG[] = { + "Unkown internal scanner error", + "Error: could not match input", + "Error: pushback value was too large" + }; + + /** + * ZZ_ATTRIBUTE[aState] contains the attributes of state aState + */ + private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute(); + + private static final String ZZ_ATTRIBUTE_PACKED_0 = + "\2\0\4\1\1\11\4\1\2\0\1\1"; + + private static int [] zzUnpackAttribute() { + int [] result = new int[14]; + int offset = 0; + offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackAttribute(String packed, int offset, int [] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int count = packed.charAt(i++); + int value = packed.charAt(i++); + do result[j++] = value; while (--count > 0); + } + return j; + } + + /** the current state of the DFA */ + private int zzState; + + /** the current lexical state */ + private int zzLexicalState = YYINITIAL; + + /** this buffer contains the current text to be matched and is + the source of the yytext() string */ + private CharSequence zzBuffer = ""; + + /** this buffer may contains the current text array to be matched when it is cheap to acquire it */ + private char[] zzBufferArray; + + /** the textposition at the last accepting state */ + private int zzMarkedPos; + + /** the textposition at the last state to be included in yytext */ + private int zzPushbackPos; + + /** the current text position in the buffer */ + private int zzCurrentPos; + + /** startRead marks the beginning of the yytext() string in the buffer */ + private int zzStartRead; + + /** endRead marks the last character in the buffer, that has been read + from input */ + private int zzEndRead; + + /** + * zzAtBOL == true <=> the scanner is currently at the beginning of a line + */ + private boolean zzAtBOL = true; + + /** zzAtEOF == true <=> the scanner is at the EOF */ + private boolean zzAtEOF; + + /** denotes if the user-EOF-code has already been executed */ + private boolean zzEOFDone; + + + SimpleLexer(java.io.Reader in) { + this.zzReader = in; + } + + /** + * Creates a new scanner. + * There is also java.io.Reader version of this constructor. + * + * @param in the java.io.Inputstream to read input from. + */ + SimpleLexer(java.io.InputStream in) { + this(new java.io.InputStreamReader(in)); + } + + /** + * Unpacks the compressed character translation table. + * + * @param packed the packed character translation table + * @return the unpacked character translation table + */ + private static char [] zzUnpackCMap(String packed) { + char [] map = new char[0x10000]; + int i = 0; /* index in packed string */ + int j = 0; /* index in unpacked array */ + while (i < 36) { + int count = packed.charAt(i++); + char value = packed.charAt(i++); + do map[j++] = value; while (--count > 0); + } + return map; + } + + public final int getTokenStart(){ + return zzStartRead; + } + + public final int getTokenEnd(){ + return getTokenStart() + yylength(); + } + + public void reset(CharSequence buffer, int start, int end,int initialState){ + zzBuffer = buffer; + zzBufferArray = com.intellij.util.text.CharArrayUtil.fromSequenceWithoutCopying(buffer); + zzCurrentPos = zzMarkedPos = zzStartRead = start; + zzPushbackPos = 0; + zzAtEOF = false; + zzAtBOL = true; + zzEndRead = end; + yybegin(initialState); + } + + /** + * Refills the input buffer. + * + * @return false, iff there was new input. + * + * @exception java.io.IOException if any I/O-Error occurs + */ + private boolean zzRefill() throws java.io.IOException { + return true; + } + + + /** + * Returns the current lexical state. + */ + public final int yystate() { + return zzLexicalState; + } + + + /** + * Enters a new lexical state + * + * @param newState the new lexical state + */ + public final void yybegin(int newState) { + zzLexicalState = newState; + } + + + /** + * Returns the text matched by the current regular expression. + */ + public final CharSequence yytext() { + return zzBuffer.subSequence(zzStartRead, zzMarkedPos); + } + + + /** + * Returns the character at position pos from the + * matched text. + * + * It is equivalent to yytext().charAt(pos), but faster + * + * @param pos the position of the character to fetch. + * A value from 0 to yylength()-1. + * + * @return the character at position pos + */ + public final char yycharat(int pos) { + return zzBufferArray != null ? zzBufferArray[zzStartRead+pos]:zzBuffer.charAt(zzStartRead+pos); + } + + + /** + * Returns the length of the matched text region. + */ + public final int yylength() { + return zzMarkedPos-zzStartRead; + } + + + /** + * Reports an error that occured while scanning. + * + * In a wellformed scanner (no or only correct usage of + * yypushback(int) and a match-all fallback rule) this method + * will only be called with things that "Can't Possibly Happen". + * If this method is called, something is seriously wrong + * (e.g. a JFlex bug producing a faulty scanner etc.). + * + * Usual syntax/scanner level error handling should be done + * in error fallback rules. + * + * @param errorCode the code of the errormessage to display + */ + private void zzScanError(int errorCode) { + String message; + try { + message = ZZ_ERROR_MSG[errorCode]; + } + catch (ArrayIndexOutOfBoundsException e) { + message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR]; + } + + throw new Error(message); + } + + + /** + * Pushes the specified amount of characters back into the input stream. + * + * They will be read again by then next call of the scanning method + * + * @param number the number of characters to be read again. + * This number must not be greater than yylength()! + */ + public void yypushback(int number) { + if ( number > yylength() ) + zzScanError(ZZ_PUSHBACK_2BIG); + + zzMarkedPos -= number; + } + + + /** + * Contains user EOF-code, which will be executed exactly once, + * when the end of file is reached + */ + private void zzDoEOF() { + if (!zzEOFDone) { + zzEOFDone = true; + + } + } + + + /** + * Resumes scanning until the next regular expression is matched, + * the end of input is encountered or an I/O-Error occurs. + * + * @return the next token + * @exception java.io.IOException if any I/O-Error occurs + */ + public IElementType advance() throws java.io.IOException { + int zzInput; + int zzAction; + + // cached fields: + int zzCurrentPosL; + int zzMarkedPosL; + int zzEndReadL = zzEndRead; + CharSequence zzBufferL = zzBuffer; + char[] zzBufferArrayL = zzBufferArray; + char [] zzCMapL = ZZ_CMAP; + + int [] zzTransL = ZZ_TRANS; + int [] zzRowMapL = ZZ_ROWMAP; + int [] zzAttrL = ZZ_ATTRIBUTE; + + while (true) { + zzMarkedPosL = zzMarkedPos; + + zzAction = -1; + + zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL; + + zzState = ZZ_LEXSTATE[zzLexicalState]; + + + zzForAction: { + while (true) { + + if (zzCurrentPosL < zzEndReadL) + zzInput = (zzBufferArrayL != null ? zzBufferArrayL[zzCurrentPosL++] : zzBufferL.charAt(zzCurrentPosL++)); + else if (zzAtEOF) { + zzInput = YYEOF; + break zzForAction; + } + else { + // store back cached positions + zzCurrentPos = zzCurrentPosL; + zzMarkedPos = zzMarkedPosL; + boolean eof = zzRefill(); + // get translated positions and possibly new buffer + zzCurrentPosL = zzCurrentPos; + zzMarkedPosL = zzMarkedPos; + zzBufferL = zzBuffer; + zzEndReadL = zzEndRead; + if (eof) { + zzInput = YYEOF; + break zzForAction; + } + else { + zzInput = (zzBufferArrayL != null ? zzBufferArrayL[zzCurrentPosL++] : zzBufferL.charAt(zzCurrentPosL++)); + } + } + int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ]; + if (zzNext == -1) break zzForAction; + zzState = zzNext; + + int zzAttributes = zzAttrL[zzState]; + if ( (zzAttributes & 1) == 1 ) { + zzAction = zzState; + zzMarkedPosL = zzCurrentPosL; + if ( (zzAttributes & 8) == 8 ) break zzForAction; + } + + } + } + + // store back cached position + zzMarkedPos = zzMarkedPosL; + + switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) { + case 6: + { yybegin(YYINITIAL); return SimpleTypes.VALUE; + } + case 8: break; + case 5: + { yybegin(WAITING_VALUE); return SimpleTypes.SEPARATOR; + } + case 9: break; + case 4: + { yybegin(YYINITIAL); return SimpleTypes.COMMENT; + } + case 10: break; + case 3: + { return TokenType.BAD_CHARACTER; + } + case 11: break; + case 2: + { yybegin(YYINITIAL); return TokenType.WHITE_SPACE; + } + case 12: break; + case 7: + { yybegin(WAITING_VALUE); return TokenType.WHITE_SPACE; + } + case 13: break; + case 1: + { yybegin(YYINITIAL); return SimpleTypes.KEY; + } + case 14: break; + default: + if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { + zzAtEOF = true; + zzDoEOF(); + return null; + } + else { + zzScanError(ZZ_NO_MATCH); + } + } + } + } + + +} diff --git a/simple_plugin/src/com/simpleplugin/SimpleLexerAdapter.java b/simple_plugin/src/com/simpleplugin/SimpleLexerAdapter.java new file mode 100644 index 000000000..662acb59a --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleLexerAdapter.java @@ -0,0 +1,11 @@ +package com.simpleplugin; + +import com.intellij.lexer.FlexAdapter; + +import java.io.Reader; + +public class SimpleLexerAdapter extends FlexAdapter { + public SimpleLexerAdapter() { + super(new SimpleLexer((Reader) null)); + } +} diff --git a/simple_plugin/src/com/simpleplugin/SimpleLineMarkerProvider.java b/simple_plugin/src/com/simpleplugin/SimpleLineMarkerProvider.java new file mode 100644 index 000000000..d6dc43d96 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleLineMarkerProvider.java @@ -0,0 +1,34 @@ +package com.simpleplugin; + +import com.intellij.codeInsight.daemon.RelatedItemLineMarkerInfo; +import com.intellij.codeInsight.daemon.RelatedItemLineMarkerProvider; +import com.intellij.codeInsight.navigation.NavigationGutterIconBuilder; +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiLiteralExpression; +import com.simpleplugin.psi.SimpleProperty; +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; +import java.util.List; + +public class SimpleLineMarkerProvider extends RelatedItemLineMarkerProvider { + @Override + protected void collectNavigationMarkers(@NotNull PsiElement element, Collection result) { + if (element instanceof PsiLiteralExpression) { + PsiLiteralExpression literalExpression = (PsiLiteralExpression) element; + String value = literalExpression.getValue() instanceof String ? (String)literalExpression.getValue() : null; + if (value != null && value.startsWith("simple"+":")) { + Project project = element.getProject(); + final List properties = SimpleUtil.findProperties(project, value.substring(7)); + if (properties.size() > 0) { + NavigationGutterIconBuilder builder = + NavigationGutterIconBuilder.create(SimpleIcons.FILE). + setTargets(properties). + setTooltipText("Navigate to a simple property"); + result.add(builder.createLineMarkerInfo(element)); + } + } + } + } +} diff --git a/simple_plugin/src/com/simpleplugin/SimpleParserDefinition.java b/simple_plugin/src/com/simpleplugin/SimpleParserDefinition.java new file mode 100644 index 000000000..c9de1df95 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleParserDefinition.java @@ -0,0 +1,69 @@ +package com.simpleplugin; + +import com.intellij.lang.ASTNode; +import com.intellij.lang.Language; +import com.intellij.lang.ParserDefinition; +import com.intellij.lang.PsiParser; +import com.intellij.lexer.Lexer; +import com.intellij.openapi.project.Project; +import com.intellij.psi.FileViewProvider; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.TokenType; +import com.intellij.psi.tree.IFileElementType; +import com.intellij.psi.tree.TokenSet; +import com.simpleplugin.parser.SimpleParser; +import com.simpleplugin.psi.SimpleFile; +import com.simpleplugin.psi.SimpleTypes; +import org.jetbrains.annotations.NotNull; + +public class SimpleParserDefinition implements ParserDefinition{ + public static final TokenSet WHITE_SPACES = TokenSet.create(TokenType.WHITE_SPACE); + public static final TokenSet COMMENTS = TokenSet.create(SimpleTypes.COMMENT); + + public static final IFileElementType FILE = new IFileElementType(Language.findInstance(SimpleLanguage.class)); + + @NotNull + @Override + public Lexer createLexer(Project project) { + return new SimpleLexerAdapter(); + } + + @NotNull + public TokenSet getWhitespaceTokens() { + return WHITE_SPACES; + } + + @NotNull + public TokenSet getCommentTokens() { + return COMMENTS; + } + + @NotNull + public TokenSet getStringLiteralElements() { + return TokenSet.EMPTY; + } + + @NotNull + public PsiParser createParser(final Project project) { + return new SimpleParser(); + } + + @Override + public IFileElementType getFileNodeType() { + return FILE; + } + + public PsiFile createFile(FileViewProvider viewProvider) { + return new SimpleFile(viewProvider); + } + + public SpaceRequirements spaceExistanceTypeBetweenTokens(ASTNode left, ASTNode right) { + return SpaceRequirements.MAY; + } + + @NotNull + public PsiElement createElement(ASTNode node) { + return SimpleTypes.Factory.createElement(node); + } +} \ No newline at end of file diff --git a/simple_plugin/src/com/simpleplugin/SimpleRefactoringSupportProvider.java b/simple_plugin/src/com/simpleplugin/SimpleRefactoringSupportProvider.java new file mode 100644 index 000000000..8040801d7 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleRefactoringSupportProvider.java @@ -0,0 +1,12 @@ +package com.simpleplugin; + +import com.intellij.lang.refactoring.RefactoringSupportProvider; +import com.intellij.psi.PsiElement; +import com.simpleplugin.psi.SimpleProperty; + +public class SimpleRefactoringSupportProvider extends RefactoringSupportProvider { + @Override + public boolean isMemberInplaceRenameAvailable(PsiElement element, PsiElement context) { + return element instanceof SimpleProperty; + } +} \ No newline at end of file diff --git a/simple_plugin/src/com/simpleplugin/SimpleReference.java b/simple_plugin/src/com/simpleplugin/SimpleReference.java new file mode 100644 index 000000000..cbb9b295d --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleReference.java @@ -0,0 +1,58 @@ +package com.simpleplugin; + +import com.intellij.codeInsight.lookup.LookupElement; +import com.intellij.codeInsight.lookup.LookupElementBuilder; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.TextRange; +import com.intellij.psi.*; +import com.simpleplugin.psi.SimpleProperty; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; + +public class SimpleReference extends PsiReferenceBase implements PsiPolyVariantReference { + private String key; + + public SimpleReference(@NotNull PsiElement element, TextRange textRange) { + super(element, textRange); + key = element.getText().substring(textRange.getStartOffset(), textRange.getEndOffset()); + } + + @NotNull + @Override + public ResolveResult[] multiResolve(boolean incompleteCode) { + Project project = myElement.getProject(); + final List properties = SimpleUtil.findProperties(project, key); + List results = new ArrayList(); + for (SimpleProperty property : properties) { + results.add(new PsiElementResolveResult(property)); + } + return results.toArray(new ResolveResult[results.size()]); + } + + @Nullable + @Override + public PsiElement resolve() { + ResolveResult[] resolveResults = multiResolve(false); + return resolveResults.length == 1 ? resolveResults[0].getElement() : null; + } + + @NotNull + @Override + public Object[] getVariants() { + Project project = myElement.getProject(); + List properties = SimpleUtil.findProperties(project); + List variants = new ArrayList(); + for (final SimpleProperty property : properties) { + if (property.getKey() != null && property.getKey().length() > 0) { + variants.add(LookupElementBuilder.create(property). + withIcon(SimpleIcons.FILE). + withTypeText(property.getContainingFile().getName()) + ); + } + } + return variants.toArray(); + } +} \ No newline at end of file diff --git a/simple_plugin/src/com/simpleplugin/SimpleReferenceContributor.java b/simple_plugin/src/com/simpleplugin/SimpleReferenceContributor.java new file mode 100644 index 000000000..1e1dbb3a8 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleReferenceContributor.java @@ -0,0 +1,26 @@ +package com.simpleplugin; + +import com.intellij.openapi.util.TextRange; +import com.intellij.patterns.PlatformPatterns; +import com.intellij.psi.*; +import com.intellij.util.ProcessingContext; +import org.jetbrains.annotations.NotNull; + +public class SimpleReferenceContributor extends PsiReferenceContributor { + @Override + public void registerReferenceProviders(@NotNull PsiReferenceRegistrar registrar) { + registrar.registerReferenceProvider(PlatformPatterns.psiElement(PsiLiteralExpression.class), + new PsiReferenceProvider() { + @NotNull + @Override + public PsiReference[] getReferencesByElement(@NotNull PsiElement element, @NotNull ProcessingContext context) { + PsiLiteralExpression literalExpression = (PsiLiteralExpression) element; + String value = literalExpression.getValue() instanceof String ? (String)literalExpression.getValue() : null; + if (value != null && value.startsWith("simple"+":")) { + return new PsiReference[]{new SimpleReference(element, new TextRange(8, value.length() + 1))}; + } + return new PsiReference[0]; + } + }); + } +} diff --git a/simple_plugin/src/com/simpleplugin/SimpleStructureViewElement.java b/simple_plugin/src/com/simpleplugin/SimpleStructureViewElement.java new file mode 100644 index 000000000..29ba22956 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleStructureViewElement.java @@ -0,0 +1,72 @@ +package com.simpleplugin; + +import com.intellij.ide.structureView.StructureViewTreeElement; +import com.intellij.ide.util.treeView.smartTree.SortableTreeElement; +import com.intellij.ide.util.treeView.smartTree.TreeElement; +import com.intellij.navigation.ItemPresentation; +import com.intellij.navigation.NavigationItem; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiNamedElement; +import com.intellij.psi.util.PsiTreeUtil; +import com.simpleplugin.psi.SimpleFile; +import com.simpleplugin.psi.SimpleProperty; + +import java.util.ArrayList; +import java.util.List; + +public class SimpleStructureViewElement implements StructureViewTreeElement, SortableTreeElement { + private PsiElement element; + + public SimpleStructureViewElement(PsiElement element) { + this.element = element; + } + + @Override + public Object getValue() { + return element; + } + + @Override + public void navigate(boolean requestFocus) { + if (element instanceof NavigationItem) { + ((NavigationItem) element).navigate(requestFocus); + } + } + + @Override + public boolean canNavigate() { + return element instanceof NavigationItem && + ((NavigationItem)element).canNavigate(); + } + + @Override + public boolean canNavigateToSource() { + return element instanceof NavigationItem && + ((NavigationItem)element).canNavigateToSource(); + } + + @Override + public String getAlphaSortKey() { + return element instanceof PsiNamedElement ? ((PsiNamedElement) element).getName() : null; + } + + @Override + public ItemPresentation getPresentation() { + return element instanceof NavigationItem ? + ((NavigationItem) element).getPresentation() : null; + } + + @Override + public TreeElement[] getChildren() { + if (element instanceof SimpleFile) { + SimpleProperty[] properties = PsiTreeUtil.getChildrenOfType(element, SimpleProperty.class); + List treeElements = new ArrayList(properties.length); + for (SimpleProperty property : properties) { + treeElements.add(new SimpleStructureViewElement(property)); + } + return treeElements.toArray(new TreeElement[treeElements.size()]); + } else { + return EMPTY_ARRAY; + } + } +} \ No newline at end of file diff --git a/simple_plugin/src/com/simpleplugin/SimpleStructureViewFactory.java b/simple_plugin/src/com/simpleplugin/SimpleStructureViewFactory.java new file mode 100644 index 000000000..937fe85a6 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleStructureViewFactory.java @@ -0,0 +1,24 @@ +package com.simpleplugin; + +import com.intellij.ide.structureView.StructureViewBuilder; +import com.intellij.ide.structureView.StructureViewModel; +import com.intellij.ide.structureView.TreeBasedStructureViewBuilder; +import com.intellij.lang.PsiStructureViewFactory; +import com.intellij.openapi.editor.Editor; +import com.intellij.psi.PsiFile; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class SimpleStructureViewFactory implements PsiStructureViewFactory { + @Nullable + @Override + public StructureViewBuilder getStructureViewBuilder(final PsiFile psiFile) { + return new TreeBasedStructureViewBuilder() { + @NotNull + @Override + public StructureViewModel createStructureViewModel(@Nullable Editor editor) { + return new SimpleStructureViewModel(psiFile); + } + }; + } +} \ No newline at end of file diff --git a/simple_plugin/src/com/simpleplugin/SimpleStructureViewModel.java b/simple_plugin/src/com/simpleplugin/SimpleStructureViewModel.java new file mode 100644 index 000000000..3d2318087 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleStructureViewModel.java @@ -0,0 +1,32 @@ +package com.simpleplugin; + +import com.intellij.ide.structureView.StructureViewModel; +import com.intellij.ide.structureView.StructureViewModelBase; +import com.intellij.ide.structureView.StructureViewTreeElement; +import com.intellij.ide.util.treeView.smartTree.Sorter; +import com.intellij.psi.PsiFile; +import com.simpleplugin.psi.SimpleFile; +import org.jetbrains.annotations.NotNull; + +public class SimpleStructureViewModel extends StructureViewModelBase implements + StructureViewModel.ElementInfoProvider { + public SimpleStructureViewModel(PsiFile psiFile) { + super(psiFile, new SimpleStructureViewElement(psiFile)); + } + + @NotNull + public Sorter[] getSorters() { + return new Sorter[] {Sorter.ALPHA_SORTER}; + } + + + @Override + public boolean isAlwaysShowsPlus(StructureViewTreeElement element) { + return false; + } + + @Override + public boolean isAlwaysLeaf(StructureViewTreeElement element) { + return element instanceof SimpleFile; + } +} \ No newline at end of file diff --git a/simple_plugin/src/com/simpleplugin/SimpleSyntaxHighlighter.java b/simple_plugin/src/com/simpleplugin/SimpleSyntaxHighlighter.java new file mode 100644 index 000000000..530581d58 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleSyntaxHighlighter.java @@ -0,0 +1,52 @@ +package com.simpleplugin; + +import com.intellij.lexer.Lexer; +import com.intellij.openapi.editor.DefaultLanguageHighlighterColors; +import com.intellij.openapi.editor.HighlighterColors; +import com.intellij.openapi.editor.colors.TextAttributesKey; +import com.intellij.openapi.fileTypes.SyntaxHighlighterBase; +import com.intellij.psi.TokenType; +import com.intellij.psi.tree.IElementType; +import com.simpleplugin.psi.SimpleTypes; +import org.jetbrains.annotations.NotNull; + +import static com.intellij.openapi.editor.colors.TextAttributesKey.createTextAttributesKey; + +public class SimpleSyntaxHighlighter extends SyntaxHighlighterBase { + public static final TextAttributesKey SEPARATOR = createTextAttributesKey("SIMPLE_SEPARATOR", DefaultLanguageHighlighterColors.OPERATION_SIGN); + public static final TextAttributesKey KEY = createTextAttributesKey("SIMPLE_KEY", DefaultLanguageHighlighterColors.KEYWORD); + public static final TextAttributesKey VALUE = createTextAttributesKey("SIMPLE_VALUE", DefaultLanguageHighlighterColors.STRING); + public static final TextAttributesKey COMMENT = createTextAttributesKey("SIMPLE_COMMENT", DefaultLanguageHighlighterColors.LINE_COMMENT); + public static final TextAttributesKey BAD_CHARACTER = createTextAttributesKey("SIMPLE_BAD_CHARACTER", HighlighterColors.BAD_CHARACTER); + + private static final TextAttributesKey[] BAD_CHAR_KEYS = new TextAttributesKey[]{BAD_CHARACTER}; + private static final TextAttributesKey[] SEPARATOR_KEYS = new TextAttributesKey[]{SEPARATOR}; + private static final TextAttributesKey[] KEY_KEYS = new TextAttributesKey[]{KEY}; + private static final TextAttributesKey[] VALUE_KEYS = new TextAttributesKey[]{VALUE}; + private static final TextAttributesKey[] COMMENT_KEYS = new TextAttributesKey[]{COMMENT}; + private static final TextAttributesKey[] EMPTY_KEYS = new TextAttributesKey[0]; + + @NotNull + @Override + public Lexer getHighlightingLexer() { + return new SimpleLexerAdapter(); + } + + @NotNull + @Override + public TextAttributesKey[] getTokenHighlights(IElementType tokenType) { + if (tokenType.equals(SimpleTypes.SEPARATOR)) { + return SEPARATOR_KEYS; + } else if (tokenType.equals(SimpleTypes.KEY)) { + return KEY_KEYS; + } else if (tokenType.equals(SimpleTypes.VALUE)) { + return VALUE_KEYS; + } else if (tokenType.equals(SimpleTypes.COMMENT)) { + return COMMENT_KEYS; + } else if (tokenType.equals(TokenType.BAD_CHARACTER)) { + return BAD_CHAR_KEYS; + } else { + return EMPTY_KEYS; + } + } +} \ No newline at end of file diff --git a/simple_plugin/src/com/simpleplugin/SimpleSyntaxHighlighterFactory.java b/simple_plugin/src/com/simpleplugin/SimpleSyntaxHighlighterFactory.java new file mode 100644 index 000000000..e3a6fe428 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleSyntaxHighlighterFactory.java @@ -0,0 +1,15 @@ +package com.simpleplugin; + +import com.intellij.openapi.fileTypes.SyntaxHighlighter; +import com.intellij.openapi.fileTypes.SyntaxHighlighterFactory; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; +import org.jetbrains.annotations.NotNull; + +public class SimpleSyntaxHighlighterFactory extends SyntaxHighlighterFactory { + @NotNull + @Override + public SyntaxHighlighter getSyntaxHighlighter(Project project, VirtualFile virtualFile) { + return new SimpleSyntaxHighlighter(); + } +} \ No newline at end of file diff --git a/simple_plugin/src/com/simpleplugin/SimpleTodoIndexer.java b/simple_plugin/src/com/simpleplugin/SimpleTodoIndexer.java new file mode 100644 index 000000000..505c0acce --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleTodoIndexer.java @@ -0,0 +1,12 @@ +package com.simpleplugin; + +import com.intellij.lexer.Lexer; +import com.intellij.psi.impl.cache.impl.OccurrenceConsumer; +import com.intellij.psi.impl.cache.impl.todo.LexerBasedTodoIndexer; + +public class SimpleTodoIndexer extends LexerBasedTodoIndexer { + @Override + public Lexer createLexer(OccurrenceConsumer consumer) { + return SimpleIdIndexer.createIndexingLexer(consumer); + } +} diff --git a/simple_plugin/src/com/simpleplugin/SimpleUtil.java b/simple_plugin/src/com/simpleplugin/SimpleUtil.java new file mode 100644 index 000000000..c2bb98218 --- /dev/null +++ b/simple_plugin/src/com/simpleplugin/SimpleUtil.java @@ -0,0 +1,57 @@ +package com.simpleplugin; + +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiManager; +import com.intellij.psi.search.FileTypeIndex; +import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.util.indexing.FileBasedIndex; +import com.simpleplugin.psi.SimpleFile; +import com.simpleplugin.psi.SimpleProperty; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +public class SimpleUtil { + public static List findProperties(Project project, String key) { + List result = null; + Collection virtualFiles = FileBasedIndex.getInstance().getContainingFiles(FileTypeIndex.NAME, SimpleFileType.INSTANCE, + GlobalSearchScope.allScope(project)); + for (VirtualFile virtualFile : virtualFiles) { + SimpleFile simpleFile = (SimpleFile) PsiManager.getInstance(project).findFile(virtualFile); + if (simpleFile != null) { + SimpleProperty[] properties = PsiTreeUtil.getChildrenOfType(simpleFile, SimpleProperty.class); + if (properties != null) { + for (SimpleProperty property : properties) { + if (key.equals(property.getKey())) { + if (result == null) { + result = new ArrayList(); + } + result.add(property); + } + } + } + } + } + return result != null ? result : Collections.emptyList(); + } + + public static List findProperties(Project project) { + List result = new ArrayList(); + Collection virtualFiles = FileBasedIndex.getInstance().getContainingFiles(FileTypeIndex.NAME, SimpleFileType.INSTANCE, + GlobalSearchScope.allScope(project)); + for (VirtualFile virtualFile : virtualFiles) { + SimpleFile simpleFile = (SimpleFile) PsiManager.getInstance(project).findFile(virtualFile); + if (simpleFile != null) { + SimpleProperty[] properties = PsiTreeUtil.getChildrenOfType(simpleFile, SimpleProperty.class); + if (properties != null) { + Collections.addAll(result, properties); + } + } + } + return result; + } +} \ No newline at end of file diff --git a/simple_plugin/src/com/simpleplugin/icons/jar-gray.png b/simple_plugin/src/com/simpleplugin/icons/jar-gray.png new file mode 100644 index 0000000000000000000000000000000000000000..4760e60a0314d426121957d2018c41b191c82474 GIT binary patch literal 729 zcmV;~0w(>5P)$LZLm>LXWxh1^NW~5I#a5z+0a|K?o$hv>*r~ znv(|)nN>8qSrgrLCo{7>v`|#-i)H?86eN|PkVcNpVKtOXf(q0^)(n{a2yBw`}@=|jOT!*r6mA> zVHil$6j2o2o}Qi}&vV?}-64u1xUP#*sRSX!jpun_j3LkS-+%=eWsJS8*X!T6wze9K zF=(wZolc1m0#ZtHc6Rn1zy|=w0G!W2^W}#3p4Z|>n5JGDW ztu>TV;^gF{cX)XC4ZsfoFlSZ(tZZ&>w!$#Hu`Elwu4`MCRT+&&gP8*W*x1-;9UL5V z=N)LR=Mf5p0tJu&0AsB3`1m-)i!n`;YOU$N0AzM37K?V4WyOBKU!F`RMZ++p@B5MC zI068))^jbHy_ zCbJIy?B?3PBE)fQbI$#Gy-qmikq`n|mVppL;y9+2O6C6%E-o&7#@MTJxm>Q*YF?h_ z=KA{jaO^gfV7^VQ2$@Qp!|H zAqWDHPNxITIfM{J09ajJjgF6xW6pUJ1i^4Roj!HD-RS7(C}NB~0e}#q$T>%+(}4+q z_If?H-EPalU=VL_Z+n!|8{4++X0sVfDT$Oao^{1JkCP;kywebsit"); + } +} diff --git a/simple_plugin/testData/CompleteTestData.java b/simple_plugin/testData/CompleteTestData.java new file mode 100644 index 000000000..4a883daec --- /dev/null +++ b/simple_plugin/testData/CompleteTestData.java @@ -0,0 +1,5 @@ +public class Test { + public static void main(String[] args) { + System.out.println("simple:"); + } +} diff --git a/simple_plugin/testData/DefaultTestData.simple b/simple_plugin/testData/DefaultTestData.simple new file mode 100644 index 000000000..ebe624812 --- /dev/null +++ b/simple_plugin/testData/DefaultTestData.simple @@ -0,0 +1,14 @@ +# You are reading the ".properties" entry. +! The exclamation mark can also mark text as comments. +website = http://en.wikipedia.org/ + + +language = English +# The backslash below tells the application to continue reading +# the value onto the next line. +message = Welcome to \ + Wikipedia! +# Add spaces to the key +key\ with\ spaces = This is the value that could be looked up with the key "key with spaces". +# Unicode +tab : \u0009 diff --git a/simple_plugin/testData/FindUsagesTestData.java b/simple_plugin/testData/FindUsagesTestData.java new file mode 100644 index 000000000..401d8c782 --- /dev/null +++ b/simple_plugin/testData/FindUsagesTestData.java @@ -0,0 +1,5 @@ +public class Test { + public static void main(String[] args) { + System.out.println("simple:key with spaces"); + } +} diff --git a/simple_plugin/testData/FindUsagesTestData.simple b/simple_plugin/testData/FindUsagesTestData.simple new file mode 100644 index 000000000..2f31ab9e2 --- /dev/null +++ b/simple_plugin/testData/FindUsagesTestData.simple @@ -0,0 +1,13 @@ +# You are reading the ".properties" entry. +! The exclamation mark can also mark text as comments. +website = http://en.wikipedia.org/ + +language = English +# The backslash below tells the application to continue reading +# the value onto the next line. +message = Welcome to \ + Wikipedia! +# Add spaces to the key +key\ with\ spaces = This is the value that could be looked up with the key "key with spaces". +# Unicode +tab : \u0009 diff --git a/simple_plugin/testData/FoldingTestData.java b/simple_plugin/testData/FoldingTestData.java new file mode 100644 index 000000000..1920b5fae --- /dev/null +++ b/simple_plugin/testData/FoldingTestData.java @@ -0,0 +1,11 @@ +public class Test { + public static void main(String[] args) { + System.out.println("simple:website"); + } + public static void main1(String[] args) { + System.out.println("simple:key with spaces"); + } + public static void main2(String[] args) { + System.out.println("simple:message"); + } +} diff --git a/simple_plugin/testData/FormatterTestData.simple b/simple_plugin/testData/FormatterTestData.simple new file mode 100644 index 000000000..44a78fa68 --- /dev/null +++ b/simple_plugin/testData/FormatterTestData.simple @@ -0,0 +1,15 @@ +# You are reading the ".properties" entry. +! The exclamation mark can also mark text as comments. +website=http://en.wikipedia.org/ + + + +language= English +# The backslash below tells the application to continue reading +# the value onto the next line. +message = Welcome to \ + Wikipedia! +# Add spaces to the key +key\ with\ spaces = This is the value that could be looked up with the key "key with spaces". +# Unicode +tab :\u0009 diff --git a/simple_plugin/testData/ParsingTestData.simple b/simple_plugin/testData/ParsingTestData.simple new file mode 100644 index 000000000..e11fdcef3 --- /dev/null +++ b/simple_plugin/testData/ParsingTestData.simple @@ -0,0 +1,17 @@ +# You are reading the ".properties" entry. +! The exclamation mark can also mark text as comments. +website = http://en.wikipedia.org/ + +language = English +# The backslash below tells the application to continue reading +# the value onto the next line. +message = Welcome to \ + Wikipedia! +# Add spaces to the key +key\ with\ spaces = This is the value that could be looked up with the key "key with spaces". +# Unicode +tab : \u0009 +# test for illegal key attempt +key\ +with\ +endofline = test diff --git a/simple_plugin/testData/ParsingTestData.txt b/simple_plugin/testData/ParsingTestData.txt new file mode 100644 index 000000000..ce7aa544e --- /dev/null +++ b/simple_plugin/testData/ParsingTestData.txt @@ -0,0 +1,63 @@ +Simple File(0,492) + PsiComment(SimpleTokenType.COMMENT)('# You are reading the ".properties" entry.')(0,42) + PsiWhiteSpace('\n')(42,43) + PsiComment(SimpleTokenType.COMMENT)('! The exclamation mark can also mark text as comments.')(43,97) + PsiWhiteSpace('\n')(97,98) + SimplePropertyImpl(PROPERTY)(98,132) + PsiElement(SimpleTokenType.KEY)('website')(98,105) + PsiWhiteSpace(' ')(105,106) + PsiElement(SimpleTokenType.SEPARATOR)('=')(106,107) + PsiWhiteSpace(' ')(107,108) + PsiElement(SimpleTokenType.VALUE)('http://en.wikipedia.org/')(108,132) + PsiWhiteSpace('\n\n')(132,134) + SimplePropertyImpl(PROPERTY)(134,152) + PsiElement(SimpleTokenType.KEY)('language')(134,142) + PsiWhiteSpace(' ')(142,143) + PsiElement(SimpleTokenType.SEPARATOR)('=')(143,144) + PsiWhiteSpace(' ')(144,145) + PsiElement(SimpleTokenType.VALUE)('English')(145,152) + PsiWhiteSpace('\n')(152,153) + PsiComment(SimpleTokenType.COMMENT)('# The backslash below tells the application to continue reading')(153,216) + PsiWhiteSpace('\n')(216,217) + PsiComment(SimpleTokenType.COMMENT)('# the value onto the next line.')(217,248) + PsiWhiteSpace('\n')(248,249) + SimplePropertyImpl(PROPERTY)(249,292) + PsiElement(SimpleTokenType.KEY)('message')(249,256) + PsiWhiteSpace(' ')(256,257) + PsiElement(SimpleTokenType.SEPARATOR)('=')(257,258) + PsiWhiteSpace(' ')(258,259) + PsiElement(SimpleTokenType.VALUE)('Welcome to \\n Wikipedia!')(259,292) + PsiWhiteSpace('\n')(292,293) + PsiComment(SimpleTokenType.COMMENT)('# Add spaces to the key')(293,316) + PsiWhiteSpace('\n')(316,317) + SimplePropertyImpl(PROPERTY)(317,410) + PsiElement(SimpleTokenType.KEY)('key\ with\ spaces')(317,334) + PsiWhiteSpace(' ')(334,335) + PsiElement(SimpleTokenType.SEPARATOR)('=')(335,336) + PsiWhiteSpace(' ')(336,337) + PsiElement(SimpleTokenType.VALUE)('This is the value that could be looked up with the key "key with spaces".')(337,410) + PsiWhiteSpace('\n')(410,411) + PsiComment(SimpleTokenType.COMMENT)('# Unicode')(411,420) + PsiWhiteSpace('\n')(420,421) + SimplePropertyImpl(PROPERTY)(421,433) + PsiElement(SimpleTokenType.KEY)('tab')(421,424) + PsiWhiteSpace(' ')(424,425) + PsiElement(SimpleTokenType.SEPARATOR)(':')(425,426) + PsiWhiteSpace(' ')(426,427) + PsiElement(SimpleTokenType.VALUE)('\u0009')(427,433) + PsiWhiteSpace('\n')(433,434) + PsiComment(SimpleTokenType.COMMENT)('# test for illegal key attempt')(434,464) + PsiWhiteSpace('\n')(464,465) + SimplePropertyImpl(PROPERTY)(465,468) + PsiElement(SimpleTokenType.KEY)('key')(465,468) + PsiErrorElement:, SimpleTokenType.COMMENT, SimpleTokenType.CRLF or SimpleTokenType.SEPARATOR expected, got '\'(468,469) + PsiElement(BAD_CHARACTER)('\')(468,469) + PsiWhiteSpace('\n')(469,470) + PsiElement(SimpleTokenType.KEY)('with')(470,474) + PsiElement(BAD_CHARACTER)('\')(474,475) + PsiWhiteSpace('\n')(475,476) + PsiElement(SimpleTokenType.KEY)('endofline')(476,485) + PsiWhiteSpace(' ')(485,486) + PsiElement(SimpleTokenType.SEPARATOR)('=')(486,487) + PsiWhiteSpace(' ')(487,488) + PsiElement(SimpleTokenType.VALUE)('test')(488,492) diff --git a/simple_plugin/testData/ReferenceTestData.java b/simple_plugin/testData/ReferenceTestData.java new file mode 100644 index 000000000..384347eda --- /dev/null +++ b/simple_plugin/testData/ReferenceTestData.java @@ -0,0 +1,5 @@ +public class Test { + public static void main(String[] args) { + System.out.println("simple:website"); + } +} diff --git a/simple_plugin/testData/RenameTestData.java b/simple_plugin/testData/RenameTestData.java new file mode 100644 index 000000000..384347eda --- /dev/null +++ b/simple_plugin/testData/RenameTestData.java @@ -0,0 +1,5 @@ +public class Test { + public static void main(String[] args) { + System.out.println("simple:website"); + } +} diff --git a/simple_plugin/testData/RenameTestData.simple b/simple_plugin/testData/RenameTestData.simple new file mode 100644 index 000000000..31492ca75 --- /dev/null +++ b/simple_plugin/testData/RenameTestData.simple @@ -0,0 +1,13 @@ +# You are reading the ".properties" entry. +! The exclamation mark can also mark text as comments. +website = http://en.wikipedia.org/ + +language = English +# The backslash below tells the application to continue reading +# the value onto the next line. +message = Welcome to \ + Wikipedia! +# Add spaces to the key +key\ with\ spaces = This is the value that could be looked up with the key "key with spaces". +# Unicode +tab : \u0009 \ No newline at end of file diff --git a/simple_plugin/testData/RenameTestDataAfter.simple b/simple_plugin/testData/RenameTestDataAfter.simple new file mode 100644 index 000000000..71bf7bf73 --- /dev/null +++ b/simple_plugin/testData/RenameTestDataAfter.simple @@ -0,0 +1,13 @@ +# You are reading the ".properties" entry. +! The exclamation mark can also mark text as comments. +websiteUrl = http://en.wikipedia.org/ + +language = English +# The backslash below tells the application to continue reading +# the value onto the next line. +message = Welcome to \ + Wikipedia! +# Add spaces to the key +key\ with\ spaces = This is the value that could be looked up with the key "key with spaces". +# Unicode +tab : \u0009 \ No newline at end of file diff --git a/simple_plugin/tests/com/simpleplugin/SimpleCodeInsightTest.java b/simple_plugin/tests/com/simpleplugin/SimpleCodeInsightTest.java new file mode 100644 index 000000000..29ecc65d6 --- /dev/null +++ b/simple_plugin/tests/com/simpleplugin/SimpleCodeInsightTest.java @@ -0,0 +1,86 @@ +package com.simpleplugin; + +import com.intellij.codeInsight.completion.CompletionType; +import com.intellij.codeInsight.generation.actions.CommentByLineCommentAction; +import com.intellij.openapi.command.WriteCommandAction; +import com.intellij.openapi.vfs.newvfs.impl.VfsRootAccess; +import com.intellij.psi.PsiElement; +import com.intellij.psi.codeStyle.CodeStyleManager; +import com.intellij.psi.codeStyle.CodeStyleSettingsManager; +import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase; +import com.intellij.usageView.UsageInfo; +import com.simpleplugin.psi.SimpleProperty; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +public class SimpleCodeInsightTest extends LightCodeInsightFixtureTestCase { + @Override + protected void setUp() throws Exception { + VfsRootAccess.SHOULD_PERFORM_ACCESS_CHECK = false; // TODO: a workaround for v15 + super.setUp(); + } + + @Override + protected String getTestDataPath() { + return "../../SimplePlugin/testData"; + } + + public void testCompletion() { + myFixture.configureByFiles("CompleteTestData.java", "DefaultTestData.simple"); + myFixture.complete(CompletionType.BASIC, 1); + List strings = myFixture.getLookupElementStrings(); + assertTrue(strings.containsAll(Arrays.asList("key with spaces", "language", "message", "tab", "website"))); + assertEquals(5, strings.size()); + } + + public void testAnnotator() { + myFixture.configureByFiles("AnnotatorTestData.java", "DefaultTestData.simple"); + myFixture.checkHighlighting(false, false, true); + } + + public void testFormatter() { + myFixture.configureByFiles("FormatterTestData.simple"); + CodeStyleSettingsManager.getSettings(getProject()).SPACE_AROUND_ASSIGNMENT_OPERATORS = true; + CodeStyleSettingsManager.getSettings(getProject()).KEEP_BLANK_LINES_IN_CODE = 2; + new WriteCommandAction.Simple(getProject()) { + @Override + protected void run() throws Throwable { + CodeStyleManager.getInstance(getProject()).reformat(myFixture.getFile()); + } + }.execute(); + myFixture.checkResultByFile("DefaultTestData.simple"); + } + + public void testRename() { + myFixture.configureByFiles("RenameTestData.java", "RenameTestData.simple"); + myFixture.renameElementAtCaret("websiteUrl"); + myFixture.checkResultByFile("RenameTestData.simple", "RenameTestDataAfter.simple", false); + } + + public void testFolding() { + myFixture.configureByFiles("DefaultTestData.simple"); + myFixture.testFolding(getTestDataPath() + "/FoldingTestData.java"); + } + + public void testFindUsages() { + Collection usageInfos = myFixture.testFindUsages("FindUsagesTestData.simple", "FindUsagesTestData.java"); + assertEquals(1, usageInfos.size()); + } + + public void testCommenter() { + myFixture.configureByText(SimpleFileType.INSTANCE, "website = http://en.wikipedia.org/"); + CommentByLineCommentAction commentAction = new CommentByLineCommentAction(); + commentAction.actionPerformedImpl(getProject(), myFixture.getEditor()); + myFixture.checkResult("#website = http://en.wikipedia.org/"); + commentAction.actionPerformedImpl(getProject(), myFixture.getEditor()); + myFixture.checkResult("website = http://en.wikipedia.org/"); + } + + public void testReference() { + myFixture.configureByFiles("ReferenceTestData.java", "DefaultTestData.simple"); + PsiElement element = myFixture.getFile().findElementAt(myFixture.getCaretOffset()).getParent(); + assertEquals("http://en.wikipedia.org/", ((SimpleProperty) element.getReferences()[0].resolve()).getValue()); + } +} diff --git a/simple_plugin/tests/com/simpleplugin/SimpleParsingTest.java b/simple_plugin/tests/com/simpleplugin/SimpleParsingTest.java new file mode 100644 index 000000000..52848cca2 --- /dev/null +++ b/simple_plugin/tests/com/simpleplugin/SimpleParsingTest.java @@ -0,0 +1,28 @@ +package com.simpleplugin; + +import com.intellij.testFramework.ParsingTestCase; + +public class SimpleParsingTest extends ParsingTestCase { + public SimpleParsingTest() { + super("", "simple", new SimpleParserDefinition()); + } + + public void testParsingTestData() { + doTest(true); + } + + @Override + protected String getTestDataPath() { + return "../../SimplePlugin/testData"; + } + + @Override + protected boolean skipSpaces() { + return false; + } + + @Override + protected boolean includeRanges() { + return true; + } +}