From 46886205f918fb2066968d096f2561dde5db5eaa Mon Sep 17 00:00:00 2001 From: Julien HENRY Date: Mon, 6 Oct 2014 17:36:29 +0200 Subject: [PATCH] SONAR-5677 Fix support of Git project not at the root of repository tree --- .../plugins/scm/git/JGitBlameCommand.java | 19 ++++- .../plugins/scm/git/GitScmProviderTest.java | 3 +- .../plugins/scm/git/JGitBlameCommandTest.java | 77 +++++++++++++++--- .../test-repos/dummy-git-nested.zip | Bin 0 -> 60535 bytes 4 files changed, 86 insertions(+), 13 deletions(-) create mode 100644 plugins/sonar-git-plugin/test-repos/dummy-git-nested.zip diff --git a/plugins/sonar-git-plugin/src/main/java/org/sonar/plugins/scm/git/JGitBlameCommand.java b/plugins/sonar-git-plugin/src/main/java/org/sonar/plugins/scm/git/JGitBlameCommand.java index 0e4b43d67bc..6c15a8c871f 100644 --- a/plugins/sonar-git-plugin/src/main/java/org/sonar/plugins/scm/git/JGitBlameCommand.java +++ b/plugins/sonar-git-plugin/src/main/java/org/sonar/plugins/scm/git/JGitBlameCommand.java @@ -21,12 +21,15 @@ package org.sonar.plugins.scm.git; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.errors.GitAPIException; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.lib.RepositoryBuilder; import org.sonar.api.BatchComponent; import org.sonar.api.batch.InstantiationStrategy; import org.sonar.api.batch.fs.FileSystem; import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.scm.BlameCommand; import org.sonar.api.batch.scm.BlameLine; +import org.sonar.api.scan.filesystem.PathResolver; import java.io.File; import java.io.IOException; @@ -36,14 +39,26 @@ import java.util.List; @InstantiationStrategy(InstantiationStrategy.PER_BATCH) public class JGitBlameCommand implements BlameCommand, BatchComponent { + private final PathResolver pathResolver; + + public JGitBlameCommand(PathResolver pathResolver) { + this.pathResolver = pathResolver; + } + @Override public void blame(FileSystem fs, Iterable files, BlameResult result) { Git git = null; File basedir = fs.baseDir(); try { - git = Git.open(basedir); + Repository repo = new RepositoryBuilder() + .findGitDir(basedir) + .setMustExist(true) + .build(); + git = Git.wrap(repo); + File gitBaseDir = repo.getWorkTree(); for (InputFile inputFile : files) { - String filename = inputFile.relativePath(); + + String filename = pathResolver.relativePath(gitBaseDir, inputFile.file()); org.eclipse.jgit.blame.BlameResult blameResult = git.blame().setFilePath(filename).call(); List lines = new ArrayList(); for (int i = 0; i < blameResult.getResultContents().size(); i++) { diff --git a/plugins/sonar-git-plugin/src/test/java/org/sonar/plugins/scm/git/GitScmProviderTest.java b/plugins/sonar-git-plugin/src/test/java/org/sonar/plugins/scm/git/GitScmProviderTest.java index 97450a991fa..87f8f56a3e6 100644 --- a/plugins/sonar-git-plugin/src/test/java/org/sonar/plugins/scm/git/GitScmProviderTest.java +++ b/plugins/sonar-git-plugin/src/test/java/org/sonar/plugins/scm/git/GitScmProviderTest.java @@ -25,6 +25,7 @@ import org.junit.rules.ExpectedException; import org.junit.rules.TemporaryFolder; import org.sonar.api.config.PropertyDefinitions; import org.sonar.api.config.Settings; +import org.sonar.api.scan.filesystem.PathResolver; import java.io.File; import java.io.IOException; @@ -46,7 +47,7 @@ public class GitScmProviderTest { @Test public void selectImplem() { GitBlameCommand blameCommand = new GitBlameCommand(); - JGitBlameCommand jblameCommand = new JGitBlameCommand(); + JGitBlameCommand jblameCommand = new JGitBlameCommand(new PathResolver()); Settings settings = new Settings(new PropertyDefinitions(new GitPlugin().getExtensions())); GitScmProvider gitScmProvider = new GitScmProvider(settings, blameCommand, jblameCommand); diff --git a/plugins/sonar-git-plugin/src/test/java/org/sonar/plugins/scm/git/JGitBlameCommandTest.java b/plugins/sonar-git-plugin/src/test/java/org/sonar/plugins/scm/git/JGitBlameCommandTest.java index 9831bb787ee..20b96962f83 100644 --- a/plugins/sonar-git-plugin/src/test/java/org/sonar/plugins/scm/git/JGitBlameCommandTest.java +++ b/plugins/sonar-git-plugin/src/test/java/org/sonar/plugins/scm/git/JGitBlameCommandTest.java @@ -31,6 +31,7 @@ import org.sonar.api.batch.fs.internal.DefaultFileSystem; import org.sonar.api.batch.fs.internal.DefaultInputFile; import org.sonar.api.batch.scm.BlameCommand.BlameResult; import org.sonar.api.batch.scm.BlameLine; +import org.sonar.api.scan.filesystem.PathResolver; import org.sonar.api.utils.DateUtils; import java.io.File; @@ -48,6 +49,8 @@ import static org.mockito.Mockito.verify; public class JGitBlameCommandTest { + private static final String DUMMY_JAVA = "src/main/java/org/dummy/Dummy.java"; + @Rule public ExpectedException thrown = ExpectedException.none(); @@ -59,11 +62,13 @@ public class JGitBlameCommandTest { File projectDir = temp.newFolder(); javaUnzip(new File("test-repos/dummy-git.zip"), projectDir); - JGitBlameCommand jGitBlameCommand = new JGitBlameCommand(); + JGitBlameCommand jGitBlameCommand = new JGitBlameCommand(new PathResolver()); DefaultFileSystem fs = new DefaultFileSystem(); - fs.setBaseDir(new File(projectDir, "dummy-git")); - DefaultInputFile inputFile = new DefaultInputFile("foo", "src/main/java/org/dummy/Dummy.java"); + File baseDir = new File(projectDir, "dummy-git"); + fs.setBaseDir(baseDir); + DefaultInputFile inputFile = new DefaultInputFile("foo", DUMMY_JAVA) + .setFile(new File(baseDir, DUMMY_JAVA)); fs.add(inputFile); BlameResult blameResult = mock(BlameResult.class); @@ -100,7 +105,56 @@ public class JGitBlameCommandTest { new BlameLine(revisionDate, revision, author), new BlameLine(revisionDate, revision, author), new BlameLine(revisionDate, revision, author))); + } + + @Test + public void testBlameOnNestedModule() throws IOException { + File projectDir = temp.newFolder(); + javaUnzip(new File("test-repos/dummy-git-nested.zip"), projectDir); + + JGitBlameCommand jGitBlameCommand = new JGitBlameCommand(new PathResolver()); + + DefaultFileSystem fs = new DefaultFileSystem(); + File baseDir = new File(projectDir, "dummy-git-nested/dummy-project"); + fs.setBaseDir(baseDir); + DefaultInputFile inputFile = new DefaultInputFile("foo", DUMMY_JAVA) + .setFile(new File(baseDir, DUMMY_JAVA)); + fs.add(inputFile); + BlameResult blameResult = mock(BlameResult.class); + jGitBlameCommand.blame(fs, Arrays.asList(inputFile), blameResult); + + Date revisionDate = DateUtils.parseDateTime("2012-07-17T16:12:48+0200"); + String revision = "6b3aab35a3ea32c1636fee56f996e677653c48ea"; + String author = "david@gageot.net"; + verify(blameResult).add(inputFile, + Arrays.asList( + new BlameLine(revisionDate, revision, author), + new BlameLine(revisionDate, revision, author), + new BlameLine(revisionDate, revision, author), + new BlameLine(revisionDate, revision, author), + new BlameLine(revisionDate, revision, author), + new BlameLine(revisionDate, revision, author), + new BlameLine(revisionDate, revision, author), + new BlameLine(revisionDate, revision, author), + new BlameLine(revisionDate, revision, author), + new BlameLine(revisionDate, revision, author), + new BlameLine(revisionDate, revision, author), + new BlameLine(revisionDate, revision, author), + new BlameLine(revisionDate, revision, author), + new BlameLine(revisionDate, revision, author), + new BlameLine(revisionDate, revision, author), + new BlameLine(revisionDate, revision, author), + new BlameLine(revisionDate, revision, author), + new BlameLine(revisionDate, revision, author), + new BlameLine(revisionDate, revision, author), + new BlameLine(revisionDate, revision, author), + new BlameLine(revisionDate, revision, author), + new BlameLine(revisionDate, revision, author), + new BlameLine(revisionDate, revision, author), + new BlameLine(revisionDate, revision, author), + new BlameLine(revisionDate, revision, author), + new BlameLine(revisionDate, revision, author))); } @Test @@ -108,13 +162,14 @@ public class JGitBlameCommandTest { File projectDir = temp.newFolder(); javaUnzip(new File("test-repos/dummy-git.zip"), projectDir); - JGitBlameCommand jGitBlameCommand = new JGitBlameCommand(); + JGitBlameCommand jGitBlameCommand = new JGitBlameCommand(new PathResolver()); DefaultFileSystem fs = new DefaultFileSystem(); File baseDir = new File(projectDir, "dummy-git"); fs.setBaseDir(baseDir); - String relativePath = "src/main/java/org/dummy/Dummy.java"; - DefaultInputFile inputFile = new DefaultInputFile("foo", relativePath); + String relativePath = DUMMY_JAVA; + DefaultInputFile inputFile = new DefaultInputFile("foo", relativePath) + .setFile(new File(baseDir, relativePath)); fs.add(inputFile); // Emulate a modification @@ -132,16 +187,18 @@ public class JGitBlameCommandTest { File projectDir = temp.newFolder(); javaUnzip(new File("test-repos/dummy-git.zip"), projectDir); - JGitBlameCommand jGitBlameCommand = new JGitBlameCommand(); + JGitBlameCommand jGitBlameCommand = new JGitBlameCommand(new PathResolver()); DefaultFileSystem fs = new DefaultFileSystem(); File baseDir = new File(projectDir, "dummy-git"); fs.setBaseDir(baseDir); - String relativePath = "src/main/java/org/dummy/Dummy.java"; + String relativePath = DUMMY_JAVA; String relativePath2 = "src/main/java/org/dummy/Dummy2.java"; - DefaultInputFile inputFile = new DefaultInputFile("foo", relativePath); + DefaultInputFile inputFile = new DefaultInputFile("foo", relativePath) + .setFile(new File(baseDir, relativePath)); fs.add(inputFile); - DefaultInputFile inputFile2 = new DefaultInputFile("foo", relativePath2); + DefaultInputFile inputFile2 = new DefaultInputFile("foo", relativePath2) + .setFile(new File(baseDir, relativePath2)); fs.add(inputFile2); // Emulate a new file diff --git a/plugins/sonar-git-plugin/test-repos/dummy-git-nested.zip b/plugins/sonar-git-plugin/test-repos/dummy-git-nested.zip new file mode 100644 index 0000000000000000000000000000000000000000..b0ee03b6b16645def6cf37ff804c120868ccef72 GIT binary patch literal 60535 zcmbq*2RPP$_rEfdWR;Z>vNP^Ilu@$D%Fei_k-c|hmA$2m5ZN-5j1Zzy*&`82GLsPE z|GBH@@q50%@Apx^|9y2_mFqgr=X~DhoYy($^`@mpPC-LP`tXD+D*X7%uP=;boMd=6 zJ3B9NOKVqgdxDEA0WYa{=`b1jl?uqEzR1H`Zk|WT4p4j~CnNjuMeE{wzH+# z`*G5Lv7F_fe%w#%F8{6h#{pxh$pQfLkr9VZ$^!pV0fhG-_2CIFIA?1|S8E6R z9}jUKc!*EN|4a3e7thq5YiMW-tBOCB>=x^kEUeO3*60+|7Vdm1rmy_$xr&~ari%DQ zi7qkW&gU<64TL)l$Y#m9?(tdoOdTX6J?WlhgyB;=hJaNLfN=h!WjF_WqP69}jq3m3 zuS@!Q^U(kv+K_ip^=4{`3I2BZkn_qk0(M|0pU;z@)ppjSpI*D?aV@C&#IppW6GKti zNj^iZA52SwqmD_Ws;@2{{1zMNdZU&s&LZPfVAhV2xLQWY%8@r2|l z`J44@%0a6^gdu9v!_u=$u(uG$;0noTaq;Kr*LgpV0#a)x+V3WYHp<6Fe#Xm4`oJs;7S(yPv6n6cE5^`}gM`;~997 zM2DYIMhb;}qs&A41#bzUb{P=9e>}@SloC8~wr=>Jxq_toZ*qlr)H#|K(D4iF8Q41! zg+uO=wM>`2$ekERGZFFcQ{IOSMOh+~7DGGgQ)zM-hlZ?hBH7l4f;3m|Xgc)DMbXVm z*jc-^Us*)d7davu*&rh4jx$pXKMk%c%sQB5IrCJ_R_#ms0UDPH2h}`%^2%(b3k+5#x%p61Q`) zlyJe=Ioj@d`)`t(U#zrds~l~p<)XpOs!s=1o^)N}=kH^7QyT2+Gt#!onbAZx9wgQMZ^08^QFwX(0pfPGJL)`@D;UQ3fJW-nG zI``|=#l*u>iaz1SQsjO#bgqH}7ZcK3Ul>)vE1QEm7c1eX==rI9m%j?-k%<`#QjHxE zevFp*IASzr@P&_w)f=-n zGXjPseO%n-Tga+yZ}0r%xlbn2MJM+%9_dxG9&BhNWxGKNGBWr+PIq)BIAWX$;y4F8 zJD|w^p5xtgOxCGr!z zNor8)SBhWEt&XB3wZfv`fT}|yxG{iYTFYNXCogc9C|E%s=g1VL}uH&B@=sB06~0{dR>zZ(L+@f zWQSY3D;*q_#CBf4@5PTe>tH5XGergHFwEDiHKZJvWo|arS;-aVV67dR7R;uJRHIf58fqd9haNd z^$vNz8hMKoijqEhCcaF%C%7d{X87t>Y*3}AMyB#X+bs6uj!g+y1VkZU$^w>zhKufA zPh41NhAoc1W=u$|BG zbg}hRerhz8*jhyEm$q|GC~%oYrip-GL#@+&tPjcNK716Hj^K76hmh!$(;O@`; zEMfdVqhNNUi(wr|I{^SX6yGNb{^<1k#hW|yf{wRk-qv(dKHa0Qk+X8WN;QaY=tzR$ z`i0r|g2)@yPr7ZxKHu~8DCH_-7W~YlFu1_yZ(XPTm!u0OrOG3T+Go~+l*#ufUPs@``#$hOXZ{O-(TxMo-$TTD;?t8gCm{s(v8 z@PQJo4%gA{=GtCAP|8AAeShYJkj(uOO^*IL2b#C>G31x6lXiG=*fHsj4I#o@?8;Ys z3PhX;^rbi7e! zW^4RB&y5(lO(zSqIGN0+N@%zyjWR+pt#t3^nfF( z`NNB^w<9|H#@7rm%R4qc9$t^WJAR*CwE40)#iC@msL9N9d%>f3+PC4h_)NmQBu81f z3BeSCyWDn~$M632^<#=1*M*AMI!+0fp$oHW%)%;O+RRC3m|ci*SNgA@zGYJPsC{6^een23o&qp>{f9MdGig<*hf#a zv#!yrzR7fS)o*66N&1}jAoyavrQQg$oX@o=CzL`_x_su7RuB%p##pGtaa9-lFjdMEtGrzXMvk(=xRt-{ zOQsH^iVVJpt8I#ic{TUhH?aGH8^6zXvo zj}qT(kNJLcIDL2uS*de7wXAY#{-%EDhEbJi>m`$|3yscoM~;ix4Ov&`*ohys*37Q* z+cbmd)!4aFiygUC%c{{D-^HadAQibQSk<2;h*PO`8?QLr$m3nSZfY}%Wa`|GOa%A6 zA0IMWITy_R{gOpkd*dKcqb2sEl;xRw3KllQKIOz78aS3Rkcu&lz9vU&iI?TZRE_{5 zo1#rCNaX@ZAWU;%Lt%E~WzSugv>1wTvEFdLQysVKk99+*zo8Q8mkgSE#?)7c#Lc{{ zwy{}-&>F!rOjoj^=pTUjr`lcIUDZ!U(HX-|6>`KIi<~%h3Tgl7e$K?r&g82u%x0g& zo)xv7F*224)${6{uD)sB{cWt`lEKP~x0740>WAsCzNsSVfpba`Gn>9im%zShsC=tCc>PZCmBSoSw&hX?$h$E^@!ca!lGmq?x(4&HxvF&y zvly#S#>VTqU#_3(_U0-cWnMibZ()jaQ*KJkpA1rV$R`J<#^#^F+z}LhdEnV{rmv9b z$9xt#>)33v^LJK*E(h83D^lL@&Fkze3RM62LR@1~SZFomqGk@6e`O$jNkLe0aW+#@ zCd%ElM#(MkTa4Cy)}gz^4qfk}*3=jUzN^byBe*_i)tfwS1A&3|u8A?Z<90!I-gP%K zy>5MdD^PUELq?!XBdO|Ut=~e(lr)(qQjQVM8A>Ib^Ej+ZB`dzcjN|4-x>w=z)XjlZ zM*O@pUIK+D4tQ~UB$@QiFLUlr8}fvDJj&kYNS|lkl|IAgUAueb>$0QINtK!SZW-O3 zmnpI{maFMC%+vi|oKwE8%m(oJZ*S3a_EsUiy>v=6MIA$Cb0K`!u@L?R-IF4-3)Aqc_7sD zkR$_75?zmL{KUjU$;X++?s_}P)|)F9YF6?QCR8V@l7w)KMwo=WNyl^A5_f6OXIW3P z!y^P({Z55rk)id5ry)zD)COJp7sfVq8;_uR4Ke2N>6_IjQfsar>-9JWOZsXr2}L9Q zsC}1%m7KQ=yA9_wQk)Z)5Bw*1Vb-ZHaR=Z#2OSxi$UaZ}+Yeh}pzSbDg+w$kATvh4#XqR#r{~!}iLtHSzGhkLt-+KIKobnZn4)&XGb-?w;$JTtq*Agxc4;vDoO|iZU zuil7Q5p@H=1+VB{Q}bPHS>SKU5TP-6#?BKGckGcigwaK;eK9B`sgE(B!0p8WPKGff zY292%H@~$#tVGvdCu6Cuj>Sk(_u@r*L`bmpWjAl<#!JR*Nvw>oB`IHcw&Wyx7q>>Y#pOX$6^4++d1A$aO1axb+~L}kBE4s#=8dOlIM+7dsQ zz(Q*#b~8;|ke|Nm#6ub%OH9Ct&Tq#CW-tMe&vThAs>_MzclXLzhLj?+fm(9?OqbRN@sS+*Jc?!9nWhuV#_4a+EYP@m1U%tGcDJQVDL@@hgm*nyWkE%g43-(NzTjFi3 z!=1Yc$5vi82%Y`v99%hh-1J!CrZu0z&6t@%p@GeezLqF|fu69_A90ljW3;oPqSx^A z9*3qV!Khn>$5}=>B~Mb`roKdOX%club?AzRna4Z19s9yT^3&q=G9k>H(&|^vltT$- zEe{^F%$e&fc;4oeJy!Fw@cY57aBHPSabG)YzocIInDrbn9`d9b-6`f=@oSv&*^RrE z4JKDEE_Ot5)UtlO8lzK^%b|RiX{E{6R`+~jjY8NlkDTFd>AIt}19!Ldl(Tf}O~*od zC$9cyViOyeNEtpvMrLsA_wbxE0gG|@olKrKCUFucnPgp!ui#_E zESZGtAX7HCW``=OC|LRV$RZXc)S<~cJ}<{i85k7Kq$fiYmur`N7I9vyFKpwIppRIT zCa+7lRl|pE7OZYYTKPM#%z$^lANj78lA5QsX~t5~m$7D3l5frq2ix$LeCjoxJJThW zT6fp{%A8e}j-6ap7bpC}fXbAZxSM_{4}a^|GHUJ3e6Tz9LcZ>gWvFg3DF6x)u{6Vy#c^jsT!Q()1P$o}DIYs*uJQLAM#N4;r}7Ke_)bWN2} z5#;QL^|y~k*w$d6=o6KgvLuBh`8i_;v9zJsUc1Y#Ndj?)1Rqwr@-yO7TSul@_-F|F zT1PXcbo`t8G>JOeDu=Z6-0$62}`l?Dx2 zSEkc2W~Nu_H%|sle%YC*lB`HfJ1Dprlp~YgdzptK_oJ6b_m*O=drc_*49D}W^V9n9 zC3|*hcM~z!41veSs^eFEK5r&3E-AzW$_cqr1u^qb^53skzE^O1@I=FG zE-lSM&#DgGGTU~#_&rk#0>8~97LI>Cqx<>sEerWqaRbHKlm_=#a^>XgD^>*GgxVe` zJjT-(>A82dYvp~n1FuuGTSL`3Ge8s_HGF-;?Is3IwhV|MZJ5QT$ zE!N*)S3i4Sdg$|szS`lD=qS#PxElwqPR6bfY&R*Htu8DPi^PZsL72EB5ls3iO9*HM24E zAD6CG9(&Akr@_cBDl;w#g4Q_BC9hc?HGR#HP6DVLFFk|?EkAo<3^?Ce9&I~;3sPc# zS=YYBqHad$WzJ}l+|qu&OwZM;#9;U|{Mm!S+kR|~XHvKIF80jHMp?D5Ht-4#emf$? z^?8hZSoGx^$F;_^s2s0*gFDRatmRRn29!rV_}1}s_g*Rn@zkzMD04q=xO#~2vP>z5 z=g>_y|EbZ~+;bf}FU{V)r_5euP>~kzD15l2M^$k5>g9%=wFQ%tZ5DE65-C>rg`h*9 zgX=V-uJz8bo!1OqavI&;G)>sl+|uaXsNFmj`{ecRH^%HUJ>M0vghKsln3|8{tug`Q z!Sh)GBfN8#9#AkS?b&o9Wsd9p=)0FWdPeFdoH$jd9x|*(`b!+Emi6!qEI(%F@(NL2AY2=U$_NlNKbfR^)HV z&rw8csOvk)e!bH&St8?gJvvafQhgO7!4@^bR>?G1F+rOz40nAWD|ulGC-?;vyX3jU zCq%eaVsnaBPSz~E*~6jK-mJ;%%n=8R(_8UIw!M=n_wUH-kk6IVD-0d%jPuBNiZ?4awuL!sTnsulkaGp0+eKB|PKumC|SHTwZ^! zQYvR|@B%FqO7oevgS{hVESqlY0L|^S!e?c1F)!o-*b$HQU6Ln63dn1f^F(61Q;!rU z^+fVz8z_f<_;iGQ*e&)VPXieu_pq=Ojp&fWX)J2j_>!O8x<{F*ooBOwZ#Twt{(`VY zvihnA9pmHZ1`6*l3!V-xD{l_baC8)v#>fr0BNcKE@p3fs-@3z*wAJ$A;BZOj@}2nZ zupuP$IEz7orGpQzdtGs_eb0#J*Yfx6;0mYS$gYQ8uE&p-ixv|Iqo;&6n^xMO=NBDI z!#lwBG$`7Vyra1rx1BqZoikW_Lb9(j)6B1XPrOd(eDBf3xSD}uS%30jH{nX&=F*sbRpXo^^-J8XIF2H#hEuq_-K=|>8nb!z*keTO zi)5ZBZEO;bA?BO9Z>I#AjK77HvDzjl5;I@D$EmDHQkOfwLXKp-_cHU!fSvYhTj_H# z&#!wrN^6G@aL27hIDE5YGv~`PKqmCfJzUj!NIt)=7MDOE5)Qxj7=k$+O+Q)UQ{YcscW~pVVZ$$a`ICo$}J! z&5@)>Q#@-df(~PIC!kkt)XxTLw%SIiwhXN|eSm39JS$n2-NO&0E&Hq=afTI`x!nQw z8~p#+7|CmDXsBE=SGb^ZNkdoZ$6A-Pb0^7P*1GBO&8p<*XhUBv>Tcf;Gn-#*ICO5= zN|SkM_TtFJ)YRhC;kM25lP;@m&smbPwZdK0c6MK~wulk%w!RaznQ~8CN4%y>uXAfr zgt!ETAGhU4>7yj_yjAp~EV+HDw?oxsd=xA$bf?zXA|j91=X8dfQMC!PYp0EGEcU%P z%6*h$8{t%Ao&MzM?8e1{J3?*68N8L@Nkm3zf5%2jR@&J^P;c_rx8f5L*#f)sqh4HQ zAG~!Xw{OArOjk(%=Cd!-%a9F+9ub+i`}ve9bEIi@!|^Y&GF`=VD1kMU2iYG z_CMS-Z}bQeuep$+Xru68L8Sk!kjR;VumUT=g{8+uIR<>Yt##C?GHtoj8R|`sA4!?@ z_Y0An{&VyCS84+)NGueGCPI;T3=Rb%LQx0;0uRH32v{T<35F11C?X2_ z<0z2~_?va4=Yi8Asv3GAgarspb}(c++m))pUZ!NjXtvmAi2$zuI)o=AjF{7r4SUm8 z?m0L<`Hvle{kef9EujBq3H_g{o2|Ewx&lrh$!|CUD~Us)Fiv3UFsNBn~U|8fKjL}lr$yGk z7$m-T!f9sC9_|K*XzBgpHPB+pre!P*295d-iCxCIcwq*gKeV<~rwx$HsufOcUNjp- zL@e~$+fVK=G?iQo!6`m;mnAFaInB8D(0^TKpW65BJ7REG_IBF;)uVGZfBLfEu%D_6 zWDje-`rjOwJ-bP&9d8oL4*;2sB>TTCKs6eVLjmU%j6tBla6Af(L1Ix*7!pPVA>n8u z9)cu&_vaFwWWekHZGh*2hD#bTqdW`?=qA1{X$#BVvg=<9N-kOF=zj|HHer13tzvhd zOlbJ3`Exn-9?#qtn1@5p>r=hXh7R}HKwpeEZEb{B8QY;Nd*yZ2T+aAZ)tF-5yy8l^ zUXv*8eAhLk>8i<;K$jMR{QW13CyWi_ORsm@r&x@Vr)1|Ios_tr<-!}48}GzQc+%xL zm5%MB5r}y=)s}~I^?mC5p#J3|)D<*cd{cdlFG|$w`|T@JE36rk%|eI(J!7|p!3yC= zd0u=d`(~ADX8Oe8=1fDfiX+U4L#v?rN@Z;p<*W=q6rrxUj;@rCofyPMw#JI%}iTaO|G-$;MB$*C@bGcH)L(HRDL$H}!~?B(tF{P~08+WvyB6kpBn zwNOW;tmtZ-wka*k@(f}rJE!gPk=*5I$AhwFh7D7B$)@uyp6eo7g zY4+q~g_!s71&e&+DZIE9h+I*XE8|mIbZ^<6p0Ow>t);Zs*riuqh6?0>$m6UIdoyrS zk*nW`e{ebZaz$^sD@^w2jrwq>X!|oF^TUP<2fnL@oqsHFA~S7fV`pqmHnUQOS;q1_ zRm8pd=tEQGH@C@GW*5WuPT-%XWE|q>;r^|ZOet4g=LTdUlI(xD0o7O-aHMfW1Q7y5 z;L$h;0*Xh0ut)?P1p+b@aM|&?p=N zj{D(Ik^v<73tak_LlO8NHLmzc#RaM_Xp`Oiht_K-G}QVl8^_Lgsjnvs*}TS4%RNv0 zdEUfBe|n-2NL&Ba6C~9e34~4sAZLFslmKcGZ zn)9c}vltcU@u#A~gnC+EA#?pK`%BkQ=^2=_C%$jWaGOS(f3DybzI-LPCu8S0zFzq3 zWZLW0<)~R=YR;Wd$wsw6=ltSrE$}%daT<&Tp&;#n&8YX`XO&)@$3gIk-gU$+9E~-tMls9KS`5E?<D1|nQ8D=nbw(WXy>GU4866_}bFS6T?Zf2S7b&#X zkO98dpC2_b;}B1L^i*G7c^4hzfHLpkbGu>8$v<;h+0Ej{wG`Y*3T||x;K$S$b{ohe z|Br(jX>xj?_lG=d!Ux-RW4?+EyxNVMCxhzJ9;&Uo&_X3`9nJHlo+>gfziUt##<&X^ ze1A6e05{eGMvRTHk_;Ex(H*KEyKj3t@Ad`lCLKx|@ih78I-XbTTiACLJWXr)7=#BF zE_g^*=k-?ZFxZATlr*cDOQ$-vs;x48KctE}YrhvDkkJ1mIPMRJQNQ5uRiA&PIsSyh zB-M`sJD>bM3ItTc2mshap&@u6Cg2z>9)dtaNtglz!V*v*91aS@;NU+|AjyEg4UnI3 z`2T_eIsD8Q*02wqg{m%Cb|jCcW=hOT8X!ohdNLay8Za>*<2PQL#@txpr)rX)y!PqS zS9h}NPBE%If5QL5$ll+d2*S^VlLR!0B>79``%l#ex&sJiK-wkA{s{+A4MX7xa4-=J z1_3Aya3Tx>co2ld!J%L*592Abg{zy3gV8Fjp?*oh91l596a(7~NZrwI1FwsiP zOuBWsg{QpQLGP51Lszm_PY2@6R%xfLkvA9F`{I0A%#K#52c0S<+rFa#n5k0uhqzt@=U6|GRVfoGOBW^cc|+sv4( zj(T`|{YvY*9I}H5dXGI%2nGFVOkyxUJ<;j5PfU_jx3}N(S_MWKB-#HA0jlvhED;Mu zV1dRI1so>`28O`m&|o|i562^+FaioF=uq^JGek1rZ)5VWU|;WwcIJp`62d08rs%Cc zMWtB{mDppI&7}x-W#xoRBb)=Q79U?mp8DQMsjU9D+s^lA1*DqsjYcxZ=_yBsiTav(JEwGz^^a!Sy?5Ov)RyCDElOU? z@8%ZVKG!8naZgCNz-clL;_=FoDZmyR%*0G_?@+#Pr+=@0evN-#=tS$WzHn8utHJl* z$=o0+uD?0-fdz7S_{rNlUwP`NjHKDxWkvFCzyAL6WaiA0FWJX&FWL=mu+I!ng*wrR zs<+=vr@BQii~s33HFw)<`Nyr&v7M1y_RF)S`Pt$rmmdbvI8%QTE7F$or=X2_cW0%m z`2DLZ15Sk>EaV;Y=!)Y_rBrOXfF9tRW(l}_dIg*k3I6Q8%X2(d4!}I zK=EiW5rM?OVMH_x3kRdY1RR72|C#GZ2KfIM zfR6nE&=Y&!yipC^=($JdKNEjX;kpKcjZEXNL37T7elof)2JJmp{CV2P{F-e1R`W;k z@>Hf8;0BWH?+QRQ7KsNTAz%m^iNoTd1OyHa!9t*D7#JAMA%Sn=!2}5LCqmz69tZvD ziZ@T5pQSogU`M-|IwRIHl-RURd8K&E^-B}zLLG2tB^dMdwurQYnhgH(_jlOE0{6|C zGNCWPSvEex_5al)V~9U%!n@xYTk2^&_;w9wVo35EZX!xz&}ak^frq1rAYkwVG|B*^ zfDynr0t$mc0R1r%Xz4(RA2CES;N{;9fb4Wl9VUTB#?rqnUsG#Zc-pm&-b^C*u0nP| z{GIT7UHo*P`^(Xz2Ndq@tef1^D%HtMEB3H-x9s33K-O~mZhfBpR1u`cZwx*rw^Vzr zzq%8}6>4?$Ds-^_Q*9UzeFBtpk0H z+k#y;E%TCasq#0Oq!_tV?O8=2rrMJxrx{p6-pxoTTDe9=im+uInTs6iiwV~rf{KK1>oj=yX~M=bwx&SZu2 zcAj{o@99pJSmk3fF6WCFYk88B{a!}pGBldJ2|jSKxG-FvBX+*{GD%92PnGLtBzZ{;xv40 zMOu7lj;}ENIE=?`2&6FDAEM-W^U0Kt=wXMvO6$6{5~W^O85O1r5p2B4n6!%>MMiA6 zhv6v^_?|;dIvqjrjok0$Z;Y>sQ&;x9FG@R85h8uGG4H#vjm`(*;f&r4sKi>W(J7T-8yox05X^0$5H`cOM{1kA5#ra{QiX z;t_44h-q>)liDTY@U+g}OG2W5 zjJQz0lF-Zj5En@`+W9U+29SVAvVU{|s);xh5eGuUF&I2BGC_jDU^o$q1%~5zpg7@y zzaf!0=+EdP8Su9iDm|KXCyaqidY##a6_31ad-S?6btCS!?WL-czP@!6ziS<6TB!B> zmI>tyUQYfh12jqBE0 zwO>}1e%?Dp-V>luxaavlPydi#*xr0stJ;9GyCf0-Nc7vl(F=x zd#?C%PyqcktNJZaz*~i5{QXuOP>sZ*VHgw=K|~QTXe1hoMG}Da8v%wRATT%#7+j%Y z5Zq5!>;nq^FRl2a+?D9E_mHao@e`)Lk6l`4nG#$K{M+76eUT31Aqz!!(q`t z^N7LWz`)E82b4}Q0T_3{FjxR@VTq_8C6i>pekJp|5X$K|D&18oL&w;dpGNp_p(m^} z)X>eg+gur0DC_>rC!FRc{Mfy2Qgpqjpj(&q_T?-O8{l_ly4G70p=g^E1fy8eMgX2*I>| zDWN0gOlOC?nvXAJhV`?kIY%#XDs)&wR{vx$-@M)p(YB2o~Lw(fh*Hkxhfty?se&@P1=dRkO%702$ z?A%$VZ=d9PsUtFfxH>0WKj_u7_zAB#nbHR$+5L1cwKo-2rF`>gB=GYh!+G!HRQNnRtWfXGmy+1X7 z@kKI%ANkW1rlvU)5HPSZKzl`pJd$X{UFAx+gjRLpTSK4n!iHaKb)uyxgEn%%y4dKQ zA1PC%)+FFWVJ2ItnR1AY>xH8&*j!=8E8)7-Vx{`KVA%d1HnR)P9+z@yTWO zR?QCsD2G)tO-9fy&{K^W;R;rN5wW+Jn}d4&>SxjsI_waEH2Ei&P;ifTbh}cXM=rBa zDSueF&^!9&$f=7yDypgeCc*bFEcG5R6fif5TEykgU1UGvX(ua*yw%P6#%#U$=5|e% zy=-5DyV;rD0~R`3$M*v0&vP^JPgdoNOaWurKt&|U{s9E2Mk3Gz2na+Z!ihu#uqFq? zAZRoSih~iMI3xsy1w+7i)X%C&Dh_|UMu>X(qbi1A2GMQvlq%3peo98lW*7B%6}Q)l z=U2A}CJ$WRiJ*V0=9Y1iE3(nJpcEx zZ_(oXcv^bO>n$slH5H@LA#4*JQSBHxkCw26Dv_GHduM1p>Y35I)1&vQLTs$dO3fS& zk;T)BHtmJVpKsiVzeaYywQ-YRD{B9Je*&tpXb=X21G+L88iq$g;3zCWi6DYuD1cZ9 zOfj)291cbJ87d?L{U4T74 z4ZrJOVI|PbLT^R)wT)@~)Hn5>H+@9t3)$)6Lj#6iXj(Ma3kMdx*CzccvoC!Xw`$># zFbiNadEF5PH;s=3X0oMg7rBQXjYZFw@;Ss2(BB_6?w;Ue&Qx1CJ9zL~O2TQ@sC7k0 z$taoH7@^zIoi`-DEUbw5bUl5WREdQgrPs|1-aKT;I?1XnnInX_t2a>f!qh0SM5l>e z!+_%9*Ok;GSDzeWxof*ci|%C8U=2Rs>Hk^vQ=#W{^6M#P%nRn@$eV}^p@!S=qrp!m zmenQ)0nY7h{Q&`|yy}CER+uh{?RAF-UtaPaSX(-K2fm!&~ z4s}*6HT_+;fklkQg^RP)l#W_R+nf1;bLdTwR6tJQ`;@n0dhX|v`FD$6-RNtOXI8}5 z>t$+36*rsleGV6UE1yl7M(%N=J!UD3;j1a1WYZmB&KdMhJBto>DTV({=W%Tj?bS- zb}EZIi@bPI()UbNObvhE^TbM<<;*=3ONxq^{HGdq72XBw^!ZqRz36amTN{n8=)q(g ziqPlGK4M*L0~BPdi@g71KfeGh(a!~iwEaG14tOpE0*VBqAP^7{4?{wLjRXoyAQE6` z91)5pfPt+H0Ru*1emJ(|pO)yqdbEF2=0Z2Ra(BNb3JGytvAwY&RSn#ioV!vf6N%h?)ig6o2Mk2}nFBnh_1AZwK77Oh2U;tqd2Ztkph760s z!thw2e3DkEL<|!0b8PGXPs`H3EM|18EAln%a#cC1b!7WS!zYX+O~_d$_`k2WMJ}KU z{DwG_k3IKkJxdH7HXt^skK4r~i)%ix2b*VH${h>qPgr+TESNm>DtPen*#qF3yW@?E zACvj{jd-DF(CGUy9jDN572XP}=xq9U>`J3V8#An}>^7gD}r zwqnonzkeUD*Jv2pmMC&(lX4(r>q~yh>mwXJs#k7ps>QKJ>0D)Bh@p0#n?A+56B#3> zjCN(zi3g3GWS|k*YE>(Eww-FC_);ktZV-F*$$h7$k8g?#cqypDByW_>+Q_d(71KV z2Zn6IM{hm41EyHa+0m}AvpFB?e)$X2ajUDL%fpP^0@>9y5m{3LTv=q%g~1EFq7&Xx zGLg{}@7Nn0>g&st--o5{ZVMG&GaxL)#_bJ74;F>uiD8`QB!UoQY;!*5`#avZp|)DJQQy} zRX)0_6xoWAz-Qj9jD6cP9rW5BG?6HLhsrd7rIi7{+QYK#G%_7=wU>D+eD6&E`P2dN ztI|&FS7}MAPqFzsrvnL#B>SIfKs6MD!9w8}C;?bR;J^qdf=D315kz3zOh5oo5Dvh7 zfFJrJxJd^5ZPH5bRwIqR0)B#gYocJxwd)brW}f17j?^R}nCly=lpMcF%53zWjh3gp z;8z$y&G2x@dAXa#{QTSqTRK0sC`tjL{{l}REr_E%)iZSt7)_95f5!u=ApklAcH9Ucu|i>BJOTrUpx|IQ zP$<9%0u&4f0fV1k)FhGte+wCbiN59!YSMN%qh^42?&_lJ$-k#2U2Sr^!^58uU)%t# zgx)U66ZgNm`)zviYzrC!X`z$zv7X4U4tcLMof(|8F-lY78>Yxso)87&&QPY8A5UCM z*LyTF!*=lue&eIj`-~7z`j$;Xn@6xEe3gWgy?H08aD(fyRs@) zOxq~9s)d6ClX9Kk7TV1TB!+>eDTgycRQ24l25#vXZy2|zjiR*rufCBOxT!X?F|U8Z zI;6dD%tkMG@uBElC#Dw6$?(!-fg02Cn-n6$uVaJR%smx|2MccITFNTV)do8#)fmXR z_fKBh00j`j{LR}36mQGorV3tcp`ZM zlRPdyh@NbtqIbI09^ngp_pDJ+Cg~6zY9sqrgZ^0_A={95t_3vI>&V&FXp_mJVc%qj zYpeKVN&5=gPKZLJUfPGsS#R!ph9$lIkVotX*&iK~8y+WHDQI)p(T^NvSke=bE(>C>?5BX*~X&q0J=YWGQU+~dByOP=R zVIh<-3LE1O-%JwKvU~7|VRbJ^N9Daqq0rRqD0J4+bXgmSw2dzC(LQ z?~vbki_Y8&4iYW^GRD6@`>%}AzsAC(ivM3{cO=!yM$hf_0p%pwKR5u@0O&{Kuoy4~ z2aJG`cq9UXLIQjwED-@Gpx`)wMngp6e{Kc;JLLFpP^$JUu6i-ueMZ(fb2KOEV1?w{ zH*LKXdXaa#v|k5ll&B1U9?^+<9QzO(qrl#Ji>yb2Cw|Xkf`3drf`fiy6AyrNw6Dh| zDxMtv{XsgQ8sKySdqE-&4v>tXL;?hj1;)lG6bhKx5CC#GF!BU}eyx=MyT^bj>HkqFeL8?3I%n_o0WG{e(u|zP6KtzBrFerd6 z0ZJwjfv5usNb4)|Kg~U_P(L?X2zCY=Jl#$PD>`^Z%icZ*OWwHJCxYEBa2iRn|A_?r3j(OLL>#b{$AKUO6a?PIe}Vgj6lt0kIff7qScpYJk242714H@c^JfEDV=Y7shnHUaeF@^HFk$o} zhdQ`dB*d0ICAM$jo_8!ds)A-SA4ue~%uFqN4tnm?UDnC;&N(MZVHrwZ)v{j-(Zxl z=laUIrE2B&b&VhFt9;f7d!ErpYBAH!Cw{U^`5-??=>8g^Xl9pv2eXrjbW%9TzidEp zmt8_W#vr`X?X$CSlcL@iny?Y~;9*TN7VqOr6U5pKcp&g&!)YRA4~7N?QZ%YgP_mKJ zZteO1&*z*3+|SVYtsT_k^ISRSf!9is{a-Dh8U#b4AUHf41i&8v#{;uYUYs zQ;~r_GB@mb=g(6y_!mI@tyHXdbmr~v^YQ@IKvzou@Cgx)!~+9hJdTJ4V?l5{0fzw- z@c>3az<|ljPe$W@iRFLr@>DU*or9C79h~n8&WIiVXv%}H;3Fq{UqM^6=ZQb($`b!Y ztKYBvBdHFhr2cRhI3pz4|C|7-5fCH-1HoW`u@n}_k)%yA0t+Kz;CLu7E=2=3a&W+& z>F0pqpW45u?jQ4TIqgAd(mdP}l0bFgIK@k_MxGvNP5dRIjl6a{;*hLHtK;ba;oFeg z=Mox1x^G=)k24yLWa^}h?yerFO?-M~^0KsBO?g1o-4UkKsZ4ps%2Lo|2}SVXb2sB1 z)K8msx!rnKykrs@v4&tCnsMOTs&>ywBJX=2cVkYfWgyE%&-hTpceN1mT`RXPcBuxA z`W~`p+Z$w)uaxNb{BQrqSNFib<|`BXabQTQt5Woa%>cAalKuS;s79et5Dbn)sHTh|^>3Th{pO9H#*qKe&~bv(7mA>7zy`?)>sI{B`{dW3_g$OgY^p1=V*1RI zz3u|g`O6*ewRy~!;o|Eqh)2i!N!*o!C^WxAQCz#nZchJEDD!L|e(iftnM&GufX*KV z(D`vw1s$9CD<5|q-LHp;D9Ufwx1>>e_t>8Mgr}LyL(n|@p{+X#kJ~`j{=+Y4^e6#_af)dD;)e!Djb#B z37X%Z-~p!T1q_g?!Iv%OJf0DD;a&V{DRtFSYjIjz=aORA=! z7G#^Tbc%b9`19Mp$Y11$f4F@6pQ;tHVqCs#1aL*14P%Z)Fia`MH9|;i5 z0f-9#a)5UagA=enFO>d+0iFlayU)-Z1OsEAxiqZzIl-42a!=0RU#CiVjvvFG3@)Bw zU8hbq|J-Um;FTf8hP&8sgKUQBl#$v^+vBRmE-X%P$mZEgBD@wap4;RIs)ZR>uD^G4 zq+^%w>4plW$D>3s%JNU!M{Y7Nd~ZN_zOux6_6T1IJH6|AlHQbM7Wrx*^}7BRnI-Ic zA!m^3j&i>m%Pq?Gn#EC8BVondJ@3r_ac4{Xb=k3Kzs{DV`muilcK}epNV0zs15~2` zav2VW#lnG@#DEZB9Ed=gv|)h}G6uk$I6M+Zg#3h4Bm@3-vt_5-Y(FB$u#j5j*>#vt zm0B-1|MDjW4ST$Vm5c`0!#BnERA&A-_u+ zq=;YU6FgENqt zk6Ozmo_@35{*uU^XgwnADZAYa%zcVTbDyrx`kpZ@fR#W$o;p}fzny+n`UnIPU zP4GMCdz!v};!cF4;y(SWunxSLA13Typ0oLB=12*~ zF;5#?*!d}Z5!+&y?HjeJebb_|mI1qOd@-Um`CLCeyU72k)A=g9pwYj~C%g^V?%h6V zV^UjuyO)&kzF$cW(H_2=qcbHLsrsq~;!Ro~uV1?*cK=J7@ShPjfs@Ii$rp~FDqH@j zZ0n z$E1Cu4M=Acp6PE(vS}1w8yq=U@d?w2*WV`Nw#E9deo4w03n$aNm+A-8qjagf5JcVnSyS~T@oEhUMUhIT zDZ@uUY>3gQB$x*oa4TAgOi`kfRn%E@8i@%Pr#rUZaaIBUQfVo;TEpq{X4b`);`(^2 z2bX>Jv3&L~y1sRxP?g0TbDq=xaE8>em>^WS>bl1M8}U_@8dXt=0=IkM#6k_W$dsUH zjHyb3B3^Y8lxjM&I@P{xTQ5!zn4k><4n6pT4w@!0n6Qc@tC3+t6H0lh>grHduBxo82A4mX zu+U^e3LMT9 zGF4$M#14~Q4Djuj5?y2{tSqKuUAFq`x+~r?aRr;UNiG^_eZ}j5UWDWU1EUAiU)T4@_~ED9WFd^Yz!+ytd`U;^N7)s^!jPyGA_;uHx{SKyv|uy z9#g96bRjPz_k&$RX=*ZEc}(5-#k*78@9vqOGubL-kYd^ADTlv&`L<7CwNu-7l`C5{ zTkE$gZ2zIRBJ!ZT|N5~nYNM!$jee`@50f8C{uPVQF5mP_`WBUbHZj)yW~kDTk)fq? zSNImCDa0jQ^gI;YZw1TNo7bCtpGRqZnMYSK2HOxXWPzsbm~i`wfi6G*c>)85F?v%> zsAwb6=uA2ga*%;gfyg{6==3G#gR^Ceo@?C0^8H3d%Re9X`O`+(DBF7>OIz&J|LMb$ z)Um85^kF$dH=1b(ag84Q*oLN2&QqsSDM}3Z6E5)4(5bl{%q8k-aL*5})C2Q`3X2`v zI3pi(jV*lN+klKu-)v@N9mxq<_Ih{phND4#6UE-gKB^ft=zT^|^pD$$^Ira(RpS3S z{!iYy_{PUVnf)fU@B%9qPG-P^&L4gTQ0v%1eS}wRfSMMTUr3n^jiU#@m!N4fbPkl3 z!fFJlIMiY1l%}lCppaqOg<>hFJ5?d8GANvh0vXWbnYYosLgST6B!>RI;)iv!4dxme z%a_+ZC|YW;>`~o=2Svpt)%}GoN)K)2^+Mk{0+c(Z%U-VN^Ech1)c>;y^ZHB2$^pP=mz>Sp}A-z|NuqTgsfHuU-t`as)sDFNb(b?rvE{`rQ)R zkO27~>esSMk7?RgPdrpK{2Hrt*?b0<%% zOy99TyWR1W#htnUp)XrS$-Iu(-Dkcw)s75<*tdFM;Now3Y}KTz17OntJ@`=rO~a-Y z(ATH|iv%nss1!IaZDmhp?Z6hF**-RM+9FIX zZ2wKqe>!8$YQzd~yZF$70>*yp6rYxlpIpC1t5`OwXSSGH8?<;d*|}uqUP&FSAnqa; zP^15TRLI|~y!G+Ny!+iPDcsgCXu;%ikGCF0DkWbIH@1n6w|JVF=x;;azBgOu2yJX74f5Q$f2#Wa z!2ByKE9RA2&2}tYuh3ZEe_EB4NyF)vdJ{jZM{FrlpZ@ao1B<+qOQqjgJ{B9_K11%B z&iZ)kAyQf|U!7E1RD0=<*~@J^8m#2b-fxzda}o)%b**k~mzU^&)2g0H(U zhMf`=moni(Gaaf-;T#tBtL0~un(*3?g&@lDEQ@_17ht0Ye^`ne2OX3D=pPCl! z6gA_GhI%o&cJn>Js`_5W$y+<&Y$^J!Rh>uIYd7%i-kxj{@^#lKqghIq&806-a~qet zWc>fq`Q(nJFQLvKYH{xkaXJEM8sZPmMWBBv>cB-uCqc;(+>xQHQJ5qZB{+bjP)Kwt zXB~$#-C)*ngC5r8Jv=t~`#PK47p9tRWs~dHlcV#rl8shI8cD3WdEh}y)|J+OqrFmkB<^HajcQrfjmaE8<8Yzq4)3Yk3M391jC?xi z-qV)IZ-W$G)m*21V>iYCc2cwUEnR3ei^s& z^Q^t0b#07Pme7<(q8P5;f7n;*m=bWmF44SOS-MOX7)J;)=%}(3DXL6W6(!guVM2ux zIIgS)#Y!ZoH=)p3aOVK7&_lp*h8xZXTPK5#JMT(~yV+M;)AcKTa;u2S(8ZlU{7+wIUrwHl zleFd%AJ@<{g#zRTKyU!{LL_D2IG_L<5>V^GSs?H*!&P;-9>^pSJ9);8>(!3$Mj8HD zy~E$;jJ46WWHCFYveKs1t zl+-~Ua7wTCvm5Pn0_`F8aC~|uewo`NC9&|bj~QR2PF~RX{&dM$r<7@$GpJwlJ)Fzt zhAxYWbxv8=+IU5G?W!Sx(rHn#twDc$Wh{4D50k&3WjAt7*h7>po=pnnx65{ zl}n%RzyFlKk)G?d?6bxdB~4eeEqz1IjG#8;h8llJ$+EmD=aQ7xw#WbG(%(9=-_kWl z45kk{HX>=$P-o>Ka>bKp&a@lRPh-sZ1L1{A>tbFe*8McuGuq`jjVeEHmdTFgNhc0k zY*Ef1{rs_M ze-6v0-xD`XA>9qvYz;X-Qm_3u&MLI? zC?#)NUNOUJ@ln?Uv*M*K^%_n|X%81qXphUfdgevMk!BjzIQ!n6psC`Do5d@shgMQP z3^Y8aAi3UYQp2Sfm4R)m&s8tj{ZYejOX>Sl$`k6=FO!++W2Tf`)o+}1berlti+$fW zo-5C}vEso?r=1fdX3A*GX=;62IZ)MLo3;PDspn4Q`sN5-tJ}(2Rd6Zs=9KW-3*Yh% zeO$SHd4t{WbtlSpQVsGvcDwG;n4T_L_wbI9Teb0z!xi72)P49cT(P0H8xtBXdR9LF)v6*r-|d>E)vK!)P2ZZESN(o? zQa%Dx2j4Y-r3J?tdn~X=jDRQ}#?C=qTb3cvGG~-^wjb90!XO%YJ&%&PgxlwgVm8YE z51IcTGJPE~(_@>p-qp0vm<3^up5D{5@k#?do6htcT0N+z>J}Ez-4H3W#mqWgnHzea zb$H_y&2T+@IrFBnu8sDd3D}K#)41~)YPpAvYhKI5kL55^ZRhaBZ8{@%(jo4RwSJ>8I?2xm309?(~Hw}97sm%G$+ z^_WNb8}_Do+A}-aH^eLI>e_yfI;1_e&v2%Bc`-XyHGRe*_4KL);<$O*bNZ~$Sk!;Q zVjIIl6gV59UR<+IPWd||1ZTKjz4(7X)Im|A!0ui4C_wJ^u&%RSzRc*h)|iARffLhR z7~&aKmW#%hjaA&?JH-FQ*Bb`=t}x@Y4i0Hs{cVQtm%**a@9dK>%Z@k@5CaLr__LWOssMY7nj9A^QJ8XK3*@FBzd&~y@Fs#eYma&L?zuETH7^AVb z{#!RiWNqno@3WIX%w6?1E^6nrFq7T-nK3D@?_3>Mm-#P~(4GIPbV$3U>!&@+!n6ek zmV}IbXMVE9`yE5aeV(q8;s=t+#_XXZpKXiG4>fhyRY@zLoXxLqnz4U-rFy`Yzt1!W zN4Z{Gkgv)3t9L8#)>7)7Bjm#yS#u`2Zagjf_w?foRcCWOHh&Fg0iXvQS(OL!0v1De ze}c#Gf9Uc>u5R8AOwX=8?*j`E^mIuNF2+U6|63uZF(62K+OFASb;f_XwRPwEsO`H> zM4lQxV*AHoFSHEaFEdoGHvKbv?QVyf!L26wSGTrqtIA6_aMi0c!SAoH-vIY8jnT6< z%O4MYcsRO%T&EJ>v_fb6DW#+0JEngw_v)`WiMsLS?)toewNFLcTEk+_Ql1TLT>D*j zoa5=YM{Y}xS-Wt|<%b@tb$+a)hz%^-qoL>!ush>}xoKoXd)Nw(zptw7+O|`s$2TN~ z|86`sRxg<9z*;e_{>ii<$=ge8H20035I^+Yp7^%R3C}ano%v`UUuC1ZAwtuPKJbIs z1$p(I{xuI)FELu^A~jp#d+w(r>voWD96VmQ=eB;-uiX9z>fX#RD%U@#_E`Ph-T_gP zQDF;)&1oKKlqz9#NmgQ&NBgjb+-H`zl0t^QjXN{e;RGpV?~rFk4-8i@%|Fi2bQB6KXC~@1pvJ!gV$ukS}zw~9Q`%<8B_o92l?@yhd>&__S*l~aC^>?}OnUmaQWi}q^Qi%%Qw zem?vAzYRg*TQl#PddgXn;_p2A>ab(Z`+z&Ewp9)imv<-_u_j*PL4p5+TO)3NeB~sQ zy89um^uGn;>fL7CU2)dBBJuoyy4f-7GH7)1qCtE0T~9wAu~=Mg_#6x7Io|}SDxDW8 zXVjcZjU^>-&Uv=9<;AYe(bU*yN1KfoW_=xT>d3bv#+zO3)OELz4#kM4QuOXt6_m;3 zEnR!scJr}s;-bHs{R(^S{0w^7hdH))bQoaR-)rDV}a|^C0$B7G11ZP`y>uaGrd$lZy@`)3od%g8a{y2_{EKfKKppnl1X;menrQUA_TR&<*B_Jf zd(IN|t=mRvo1dI58=I$+V{eqEwireDtJ3+xMy_PWCLK2Y+$9? zO@2E3K%CFO>J<^k=C25~elBjGYv@1Jj%8uv>-be-#?PFF;2A*Akg?Cze$n!Z8cU#O zcpEk#qu{KST<#}@oZQ2;Av#3|$2AjPC9ixcK2eW({8wm^ZBB7!T7}Hw zoEJ4Sm&f`Za48t^eemrx@8r1n(@rzj92k5-yTxbOgfU5Jg>SacYHABqF3ZaO<(wp+ z=D4GB_M)f_33e@oEOA*2x7cs96Gb+~*T=f;dvkMI``ycSCHLH;g#B)e`$THp`=jA$ z@@#i8y&8?W8M~ZKzPvs0{O|LlB>z_$NOqVR)j$Vf|TNFB?R1C$#1}t=&+OuKc9x_>X!D${@UD-28>C zG93ucHV97re-BRVB&E<9qZ?oW*TYBT9@AxRaHr(@@6`)DHgjV%Y~XgG|4@uhzCF9a zI{Vt7HRkOB_9MfBt^NNi&hcw`SMsrOS(xOECBvU@t%MNWQ?e~&Sjd>YU#^cb{53J< zKHX?03egW+vv*fMS>?L1<0?r*+M>U%?lndej|t7$YE~6k6!m>t%QjP%{jIAHZ!geg z84e285A~LtYi&Nl5{#F?Krqf0tBZwr~6(=*)r?kLgUP_ zsc$CLB_V>-NT=g=<4&cq2~KHKHoNMnt8Fl)imZ%{oXWWU2MA6hqziwh{ti7|E2e3a zojA18JTmJGO{hpDB3mT=?9qYg*B*UqpY(SgQ{<#%zSQT4h5IAz7Z|3Tn`#!l!*Ii5 z`7KTJ3=Y?&k7;t=`Na2Xl>K}EyS6vU2`K{-PuN{u9ecn}dX9?QlQE&yZ#~rg-^I2D zlM<5~q=Ob1*zYpf+!VN7BGUK3@+IkxId|xn))vPVOpXz={^OGHXJ6iw_Ho5)CT1zi zmf2S;Y{~Gu8LfM2(tHo;Dz7EYw?+w1DY(&oQ)>3{%O&?^7e>SgUu?3TbmmQF)4R`? z!hbceuI;Zs{UmSS{3S!%QhkND+b{5nV&>jqFh?vr5KtSq>E<1+kXth@m#?#P`?K9hW1$^F*Mx2%TpNf+-o_$&;m-{2OYcm2w^Vdu2<-(1_3Iv`-0>4RwLNj_8Sv*Kyi6?aS=W@<{3NT(HZRI){5 z6Ef027tRx@uD$xq0MyhRhD{lC?xXwbOII3(8M<$@UsqSwq-e^D$zJuMIktAYmoK2trn@x9#4$i&#w#RJwH^}8k` zI_y<=WbSm+W7nGO5>9J39QPne zJ1K@#I!iJVeV(;?7s(y98IvLXJ<5LP?&3AR$x+p^UiJy1U);p+H=e({j3N5~IFy~M zQsegMntYQS`Te1le^HHmb@V8#!=R!>JnYCybY~KX15^ zX?8+oo$~1N+lt|19z>PqUhWrpXX1-QQNLL_d&Sa+->x?FNc{MrE#Qhs zY0#E3s>LC-$mwPm4kcdrFLEs@Z)MDp7gHY%d9Lz%LX40tiZ{l&9j+GnF)vnV?&)pO< z^v#h`D{?gUe*dDE7O0`Odh3Us6^!UrIa3G!pxnOM{wYEClJ(4y$?-W;b~V*6Tw&C& z|KtIj)Z2BpT3kq?;}cFysBsbcD?6{s+dF#8yFz+ns{;uO4M4lqT{gq8&BnloMv=(r z+=ZtNW#q88vx6V^C}4R(MFAusb|3AFYrv`>mzr;08C$o^9EEW1+TnU zoSq%wz6&8CURc+wbJhJ!$JcX#%4r+G6R z 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 literal 0 HcmV?d00001 -- 2.39.5