From aa2151bc9d67766802d099b93db33a01b5fda054 Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Thu, 16 Sep 2010 18:03:23 -0400 Subject: [PATCH] INT-1380 added oddeven sample --- getting-started/jmx/readme.txt | 34 +++++++++++ getting-started/oddeven/.classpath | 3 + getting-started/oddeven/.gitignore | 1 + .../com.springsource.sts.config.flow.prefs | 3 + getting-started/oddeven/pom.xml | 57 +++++++++++------- getting-started/oddeven/readme.txt | 21 ++++++- .../samples/oddeven/EvenLogger.java | 4 +- .../samples/oddeven/OddLogger.java | 4 +- .../samples/oddeven/intervalOddEvenDemo.xml | 35 ----------- .../spring/integration}/cronOddEvenDemo.xml | 0 .../integration}/intervalOddEvenDemo.xml | 6 +- .../samples/oddeven/CronOddEvenDemo.java | 2 +- .../oddeven/IntervalOddEvenDemoTest.java} | 4 +- .../{main/java => test/resources}/log4j.xml | 4 +- .../oddeven/target/classes/log4j.xml | 32 ---------- .../integration/samples/oddeven/Counter.class | Bin 664 -> 0 bytes .../samples/oddeven/CronOddEvenDemo.class | Bin 646 -> 0 bytes .../samples/oddeven/EvenLogger.class | Bin 1160 -> 0 bytes .../samples/oddeven/IntervalOddEvenDemo.class | Bin 662 -> 0 bytes .../samples/oddeven/OddLogger.class | Bin 1157 -> 0 bytes .../samples/oddeven/cronOddEvenDemo.xml | 35 ----------- .../target/maven-archiver/pom.properties | 5 -- .../target/oddeven-2.0.0.BUILD-SNAPSHOT.jar | Bin 7861 -> 0 bytes 23 files changed, 108 insertions(+), 142 deletions(-) create mode 100644 getting-started/jmx/readme.txt create mode 100644 getting-started/oddeven/.gitignore create mode 100644 getting-started/oddeven/.settings/com.springsource.sts.config.flow.prefs delete mode 100644 getting-started/oddeven/src/main/java/org/springframework/integration/samples/oddeven/intervalOddEvenDemo.xml rename getting-started/oddeven/src/main/{java/org/springframework/integration/samples/oddeven => resources/META-INF/spring/integration}/cronOddEvenDemo.xml (100%) rename getting-started/oddeven/{target/classes/org/springframework/integration/samples/oddeven => src/main/resources/META-INF/spring/integration}/intervalOddEvenDemo.xml (84%) rename getting-started/oddeven/src/{main => test}/java/org/springframework/integration/samples/oddeven/CronOddEvenDemo.java (93%) rename getting-started/oddeven/src/{main/java/org/springframework/integration/samples/oddeven/IntervalOddEvenDemo.java => test/java/org/springframework/integration/samples/oddeven/IntervalOddEvenDemoTest.java} (89%) rename getting-started/oddeven/src/{main/java => test/resources}/log4j.xml (90%) delete mode 100644 getting-started/oddeven/target/classes/log4j.xml delete mode 100644 getting-started/oddeven/target/classes/org/springframework/integration/samples/oddeven/Counter.class delete mode 100644 getting-started/oddeven/target/classes/org/springframework/integration/samples/oddeven/CronOddEvenDemo.class delete mode 100644 getting-started/oddeven/target/classes/org/springframework/integration/samples/oddeven/EvenLogger.class delete mode 100644 getting-started/oddeven/target/classes/org/springframework/integration/samples/oddeven/IntervalOddEvenDemo.class delete mode 100644 getting-started/oddeven/target/classes/org/springframework/integration/samples/oddeven/OddLogger.class delete mode 100644 getting-started/oddeven/target/classes/org/springframework/integration/samples/oddeven/cronOddEvenDemo.xml delete mode 100644 getting-started/oddeven/target/maven-archiver/pom.properties delete mode 100644 getting-started/oddeven/target/oddeven-2.0.0.BUILD-SNAPSHOT.jar diff --git a/getting-started/jmx/readme.txt b/getting-started/jmx/readme.txt new file mode 100644 index 00000000..c6ede142 --- /dev/null +++ b/getting-started/jmx/readme.txt @@ -0,0 +1,34 @@ +This example demonstrates the following aspects of the JMX support available with Spring Integration: +1. JMX Attribute Polling Channel +2. JMX Operation Invoking Channel Adapter + +StopWatch is a Managed Bean. It is bootstraped and deployed using annotation support (@Component, @ManagedResource) +and component scanning functionality provided by Spring JMX. Internally StopWatch simply runs a task that increments the +value of its 'seconds' attribute by 1 every second. + +JMX Attribute Polling Channel Adapter simply polls a managed attribute 'Seconds' of the StopWatch MBean identified by the 'org.springframework.integration.samples.jmx:type=StopWatch,name=stopWatch' name and sends its value to a 'seconds' channel. +The interesting this is that 'seconds' channel is a publish-subscribe-channel and has two subscribers; +- Stdout Channel Adapter which prints the value of the polled attribute to the console; +- Filter which essentially waits till payload value is 10; +Once the payload value is 10 filter sends the Message to a 'reset' channel which is represented as JMX Operation Invoking Channel Adapter +which simply invokes 'reset' operation on the same StopWatch MBean resetting 'Seconds' attribute value back to 1 and the process repeats. + + +To run samples simply execute the 3 test cases located in the org.springframework.integration.samples.filecopy package + +You will see the output similar to this which will loop for ~ 20 sec: +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +1 +2 +3 +. . . + diff --git a/getting-started/oddeven/.classpath b/getting-started/oddeven/.classpath index 24166ba5..dde3100b 100644 --- a/getting-started/oddeven/.classpath +++ b/getting-started/oddeven/.classpath @@ -1,6 +1,9 @@ + + + diff --git a/getting-started/oddeven/.gitignore b/getting-started/oddeven/.gitignore new file mode 100644 index 00000000..ea8c4bf7 --- /dev/null +++ b/getting-started/oddeven/.gitignore @@ -0,0 +1 @@ +/target diff --git a/getting-started/oddeven/.settings/com.springsource.sts.config.flow.prefs b/getting-started/oddeven/.settings/com.springsource.sts.config.flow.prefs new file mode 100644 index 00000000..1695b7f1 --- /dev/null +++ b/getting-started/oddeven/.settings/com.springsource.sts.config.flow.prefs @@ -0,0 +1,3 @@ +#Thu Sep 16 17:55:53 EDT 2010 +//com.springsource.sts.config.flow.coordinates\:http\://www.springframework.org/schema/integration\:/oddeven/src/main/resources/META-INF/spring/integration/intervalOddEvenDemo.xml=\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n +eclipse.preferences.version=1 diff --git a/getting-started/oddeven/pom.xml b/getting-started/oddeven/pom.xml index 5f7d4730..a9524409 100644 --- a/getting-started/oddeven/pom.xml +++ b/getting-started/oddeven/pom.xml @@ -2,34 +2,47 @@ 4.0.0 - - org.springframework.integration.samples - spring-integration-samples - 2.0.0.BUILD-SNAPSHOT - + org.springframework.integration.samples oddeven Spring Integration Odd-Even Sample + 2.0.0 + jar + + 2.0.0.M7 + 1.2.15 + 4.7 + org.springframework.integration spring-integration-core + ${spring.integration.version} + + + log4j + log4j + ${log4j.version} + + + + junit + junit + ${junit.version} - - - repository.springframework.maven.release - Spring Framework Maven Release Repository - http://maven.springframework.org/release - - - repository.springframework.maven.milestone - Spring Framework Maven Milestone Repository - http://maven.springframework.org/milestone - - - repository.springframework.maven.snapshot - Spring Framework Maven Snapshot Repository - http://maven.springframework.org/snapshot - - + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.5 + 1.5 + -Xlint:all + true + false + + + + diff --git a/getting-started/oddeven/readme.txt b/getting-started/oddeven/readme.txt index 775f38d0..4e704e30 100644 --- a/getting-started/oddeven/readme.txt +++ b/getting-started/oddeven/readme.txt @@ -1 +1,20 @@ -Demonstrates Inbound channel adapter and Poller configuration with Cron and Interval triggers \ No newline at end of file +This example demonstrates the following aspects of the CORE EIP support available with Spring Integration: +1. Inbound Channel Adapter +2. Filter +3. Router (SpEL based) +4. Poller with Cron and Interval Trigers + +Messages are simply being emitted by the Poller (interval based or cron) triggering 'next()' method of Counter class and +sent to a 'numbers' channel - Inbound Channel Adapter. From the 'numbers' channel Messages are sent +to an expression-based router (Spring Expression Language). ALl that router does is simply routing messages +to OddLogger and EvenLogger service + +To execute the Interval-based sample simply run IntervalOddEvenDemoTest class and for Cron-based sample simply +run CronOddEvenDemo class, You should see the output similar to this: + +INFO : org.springframework.integration.samples.oddeven.OddLogger - odd: 1 at 2010-09-16 05:55:46 +INFO : org.springframework.integration.samples.oddeven.EvenLogger - even: 2 at 2010-09-16 05:55:49 +INFO : org.springframework.integration.samples.oddeven.OddLogger - odd: 3 at 2010-09-16 05:55:52 +INFO : org.springframework.integration.samples.oddeven.EvenLogger - even: 4 at 2010-09-16 05:55:55 + + diff --git a/getting-started/oddeven/src/main/java/org/springframework/integration/samples/oddeven/EvenLogger.java b/getting-started/oddeven/src/main/java/org/springframework/integration/samples/oddeven/EvenLogger.java index 7f3f1e55..ac4937b0 100644 --- a/getting-started/oddeven/src/main/java/org/springframework/integration/samples/oddeven/EvenLogger.java +++ b/getting-started/oddeven/src/main/java/org/springframework/integration/samples/oddeven/EvenLogger.java @@ -19,6 +19,7 @@ package org.springframework.integration.samples.oddeven; import java.text.SimpleDateFormat; import java.util.Date; +import org.apache.log4j.Logger; import org.springframework.integration.annotation.MessageEndpoint; import org.springframework.integration.annotation.ServiceActivator; @@ -30,10 +31,11 @@ import org.springframework.integration.annotation.ServiceActivator; */ @MessageEndpoint public class EvenLogger { + private static Logger logger = Logger.getLogger(EvenLogger.class); @ServiceActivator public void log(int i) { - System.out.println("even: " + i + " at " + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date())); + logger.info("even: " + i + " at " + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date())); } } diff --git a/getting-started/oddeven/src/main/java/org/springframework/integration/samples/oddeven/OddLogger.java b/getting-started/oddeven/src/main/java/org/springframework/integration/samples/oddeven/OddLogger.java index 2e2dbb0c..cd237a8d 100644 --- a/getting-started/oddeven/src/main/java/org/springframework/integration/samples/oddeven/OddLogger.java +++ b/getting-started/oddeven/src/main/java/org/springframework/integration/samples/oddeven/OddLogger.java @@ -19,6 +19,7 @@ package org.springframework.integration.samples.oddeven; import java.text.SimpleDateFormat; import java.util.Date; +import org.apache.log4j.Logger; import org.springframework.integration.annotation.MessageEndpoint; import org.springframework.integration.annotation.ServiceActivator; @@ -30,10 +31,11 @@ import org.springframework.integration.annotation.ServiceActivator; */ @MessageEndpoint public class OddLogger { + private static Logger logger = Logger.getLogger(OddLogger.class); @ServiceActivator public void log(int i) { - System.out.println("odd: " + i + " at " + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date())); + logger.info("odd: " + i + " at " + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date())); } } \ No newline at end of file diff --git a/getting-started/oddeven/src/main/java/org/springframework/integration/samples/oddeven/intervalOddEvenDemo.xml b/getting-started/oddeven/src/main/java/org/springframework/integration/samples/oddeven/intervalOddEvenDemo.xml deleted file mode 100644 index a155d205..00000000 --- a/getting-started/oddeven/src/main/java/org/springframework/integration/samples/oddeven/intervalOddEvenDemo.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/getting-started/oddeven/src/main/java/org/springframework/integration/samples/oddeven/cronOddEvenDemo.xml b/getting-started/oddeven/src/main/resources/META-INF/spring/integration/cronOddEvenDemo.xml similarity index 100% rename from getting-started/oddeven/src/main/java/org/springframework/integration/samples/oddeven/cronOddEvenDemo.xml rename to getting-started/oddeven/src/main/resources/META-INF/spring/integration/cronOddEvenDemo.xml diff --git a/getting-started/oddeven/target/classes/org/springframework/integration/samples/oddeven/intervalOddEvenDemo.xml b/getting-started/oddeven/src/main/resources/META-INF/spring/integration/intervalOddEvenDemo.xml similarity index 84% rename from getting-started/oddeven/target/classes/org/springframework/integration/samples/oddeven/intervalOddEvenDemo.xml rename to getting-started/oddeven/src/main/resources/META-INF/spring/integration/intervalOddEvenDemo.xml index a155d205..200e4a8c 100644 --- a/getting-started/oddeven/target/classes/org/springframework/integration/samples/oddeven/intervalOddEvenDemo.xml +++ b/getting-started/oddeven/src/main/resources/META-INF/spring/integration/intervalOddEvenDemo.xml @@ -16,11 +16,7 @@ - - - + diff --git a/getting-started/oddeven/src/main/java/org/springframework/integration/samples/oddeven/CronOddEvenDemo.java b/getting-started/oddeven/src/test/java/org/springframework/integration/samples/oddeven/CronOddEvenDemo.java similarity index 93% rename from getting-started/oddeven/src/main/java/org/springframework/integration/samples/oddeven/CronOddEvenDemo.java rename to getting-started/oddeven/src/test/java/org/springframework/integration/samples/oddeven/CronOddEvenDemo.java index 5dfc387d..e540e956 100644 --- a/getting-started/oddeven/src/main/java/org/springframework/integration/samples/oddeven/CronOddEvenDemo.java +++ b/getting-started/oddeven/src/test/java/org/springframework/integration/samples/oddeven/CronOddEvenDemo.java @@ -35,7 +35,7 @@ import org.springframework.context.support.ClassPathXmlApplicationContext; public class CronOddEvenDemo { public static void main(String[] args) { - new ClassPathXmlApplicationContext("cronOddEvenDemo.xml", CronOddEvenDemo.class); + new ClassPathXmlApplicationContext("/META-INF/spring/integration/cronOddEvenDemo.xml", CronOddEvenDemo.class); } } diff --git a/getting-started/oddeven/src/main/java/org/springframework/integration/samples/oddeven/IntervalOddEvenDemo.java b/getting-started/oddeven/src/test/java/org/springframework/integration/samples/oddeven/IntervalOddEvenDemoTest.java similarity index 89% rename from getting-started/oddeven/src/main/java/org/springframework/integration/samples/oddeven/IntervalOddEvenDemo.java rename to getting-started/oddeven/src/test/java/org/springframework/integration/samples/oddeven/IntervalOddEvenDemoTest.java index fcf31073..b3ca538a 100644 --- a/getting-started/oddeven/src/main/java/org/springframework/integration/samples/oddeven/IntervalOddEvenDemo.java +++ b/getting-started/oddeven/src/test/java/org/springframework/integration/samples/oddeven/IntervalOddEvenDemoTest.java @@ -31,10 +31,10 @@ import org.springframework.context.support.ClassPathXmlApplicationContext; * * @author Mark Fisher */ -public class IntervalOddEvenDemo { +public class IntervalOddEvenDemoTest { public static void main(String[] args) { - new ClassPathXmlApplicationContext("intervalOddEvenDemo.xml", IntervalOddEvenDemo.class); + new ClassPathXmlApplicationContext("/META-INF/spring/integration/intervalOddEvenDemo.xml", IntervalOddEvenDemoTest.class); } } diff --git a/getting-started/oddeven/src/main/java/log4j.xml b/getting-started/oddeven/src/test/resources/log4j.xml similarity index 90% rename from getting-started/oddeven/src/main/java/log4j.xml rename to getting-started/oddeven/src/test/resources/log4j.xml index 78268c06..fd722913 100644 --- a/getting-started/oddeven/src/main/java/log4j.xml +++ b/getting-started/oddeven/src/test/resources/log4j.xml @@ -15,8 +15,8 @@ - - + + diff --git a/getting-started/oddeven/target/classes/log4j.xml b/getting-started/oddeven/target/classes/log4j.xml deleted file mode 100644 index 78268c06..00000000 --- a/getting-started/oddeven/target/classes/log4j.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/getting-started/oddeven/target/classes/org/springframework/integration/samples/oddeven/Counter.class b/getting-started/oddeven/target/classes/org/springframework/integration/samples/oddeven/Counter.class deleted file mode 100644 index 747598167da58aea8677d50680f8333a7d258151..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 664 zcmbVJ&2AGh7#wf5&33zK0;S<6kb>xe1_?`CP(_6(l|YdK9EvKTo*c)dZg=g-@fMzi z7vRDLsZa?d9)M@6Dn4)b0T374pJ%@D%;!HBKYs&wjP)iWh9}ld`F!TInSOAhP#>*3 z=Gu5Qb;4_F_*@jTT+O+iOw@@oeAkwQx+Y?V&XG6~JQrrl-;R%z^b89!;0zB(6;^tk zb7_q%om0kh;ccNM->J4?ct*LW42#>^X#b3%@nCbGA>OqUm7;;=3{50Wv=}!3SuaI~ z=#l|#q*DbAV8={eDPp97cxj1&4H;T{UdZFuVpf|;_iX8;dZ~lmtRDKKFazA9 zXbt*8iV^bBDWWsYiPj~mUJ%M??+nh64t^nfe}>)X9#_8Cdfe?i>)Ni&b+=oy#Uz2LIF93U1LL@CRXY2(u!E#8GFN(b~3cWDWiER;v|wO zH$fn8rRFVb^l=az(0gCTrhq&{`C8lx9tj=tWz!`C*4z* zZN9bIDPW3W@2@GoAvNwDPkTvXtmCanr0I!pSLbomOp-|XeW6-|vQbnSs{VJ8*6-uU zLmAWA@^yyg#%~H=kp2YXM4W{UY5nRSlo`BJ)3d%jRGE6UA9q>LcElp+0Ca62M=uhd zY=I(9o{=A3d&KBNKkbpt(!dgmWXA^uT^!z4wM!8a{ut(HBTX-}H VScZp{FKvpL!7Sknb7XUve+Mm^qz?c9 diff --git a/getting-started/oddeven/target/classes/org/springframework/integration/samples/oddeven/EvenLogger.class b/getting-started/oddeven/target/classes/org/springframework/integration/samples/oddeven/EvenLogger.class deleted file mode 100644 index 6b5f4b020c9151222f3eb10bf08c1ce04de502f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1160 zcmbVMYflqF6g^WOTh=OA-Y=~RTGXVc&>fb+-JNE4TIFZyhmuI* z5Aa7B?`#{;fYG?g&fS^0_ndpr+}ZCxzJ3F+jCBhchO&x%Cuzho^7mpMijOM(;K)b| zKjvDh$VqtE2t?v2&l4>XIU6)ol<$k!LNCM60dH|9;F0gV**y?-&CtIhBdMP;^b{9r z481RvCv5a!AcsEmGYnQ_BwjbeT@k&0>xODsY{m-!!qe7)s}% z{}IE&0>e~VfEJ&$QLwZWv+a=E{?C+Puu$&||ikP*q$Z#o* zZfY4gCeB6)17>$AN4hPqyt$r_*o z0?m+J{(}55CU){uN0^yz<7)m!8}r8~?&OK$?lDR`M{wG>N2_f-XyeH#tDPduVF~jo b^H>M5%WVEJt9V8kWbmArGI(*4#TxJvK+Pzy diff --git a/getting-started/oddeven/target/classes/org/springframework/integration/samples/oddeven/IntervalOddEvenDemo.class b/getting-started/oddeven/target/classes/org/springframework/integration/samples/oddeven/IntervalOddEvenDemo.class deleted file mode 100644 index dadea56afddc1b84301b498bc5da9e4521ee45bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 662 zcmb_ZO-lnY5PhlD>ei21zxAYGsU8e?6GhOfAQTmpB6v!7;~LFwmTX%6Tb=|3e}F$q zoK!*49=*)u%}i$Aym@0wH1lHH};OJ)XCTir%cLokz`ut z+(eP=%9I~d&US@9jiN)s2Qo1w6d5YFqAR!-Y0OXCw=#4LLpv%}ZkJ)8zSd$WHcTV~ z3}9pwgBW6%XsT46bdt8T7ox2tL$zr_pEfM168TrBWCk#LK(g9hY23AleJNj8bevHrv#xX$=|9OjA`nvK9D%EP0Jz@I0 YML?5)RRpO0Xj8@<<|)pwK(>Iz58E}W=l}o! diff --git a/getting-started/oddeven/target/classes/org/springframework/integration/samples/oddeven/OddLogger.class b/getting-started/oddeven/target/classes/org/springframework/integration/samples/oddeven/OddLogger.class deleted file mode 100644 index bbf02d914b5f8d40c5319ae5737a5668f9daf63c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1157 zcmbVMYflqF6g^WOTWSR?@0V5uEoxc8CtW~6B_SzdtZBl>p*t*tyF1P9w93!Y4<(Vr zAK;HN-q|)K28_{7cJ9v1z2}~L=Fa~3`RzM^6>M2ZF|4Y{v*UUsL+>!+f%v4NkG2f8 z@FK3I3hkH&bzj7`a$V6Bp}pt2W#xGyve3&ge9W8N_Ic>pdk4p&rWyLzWGM9pLr-C` z%Fz2txgvue3}n%Veukm448_|2v5?}{jm8IqL5FXi(Y zOk&Qcc%7gMZLCE4c7(H7H6HmaZsHaN@p@f^F2gL9f5Eu}@1!wL0_C|*(C?Voy9~w4 z(Eo^GVUb}vDL{+Q+O9~`GOxK7+bRmUPUAkq$O%2g-QA+==8uj_K~Re03<{XDu*5K! zL^rhbZ4;M45d&s-IZK`Th>AH(kQnAW%(|}5#o8Pr!;>tY;u%9)tF}B0qlHU-S3yTm zB8Hb7P8MrMZOdE`?S~9Z(!0Zusi;O&6Wh`>@L=~+EEx=jwSQ@+T@lCJ6K_Jdt|*H` zM?eijcN9p`7hM_}Et=V68QH#jr$~QEwlg%EZ6J>;G-lflWUtbUm|=)OhC5!@$Qqzy z0!@)!`HI{bCiipGr - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/getting-started/oddeven/target/maven-archiver/pom.properties b/getting-started/oddeven/target/maven-archiver/pom.properties deleted file mode 100644 index 3234a446..00000000 --- a/getting-started/oddeven/target/maven-archiver/pom.properties +++ /dev/null @@ -1,5 +0,0 @@ -#Generated by Maven -#Sat Sep 04 08:22:31 EDT 2010 -version=2.0.0.BUILD-SNAPSHOT -groupId=org.springframework.integration.samples -artifactId=oddeven diff --git a/getting-started/oddeven/target/oddeven-2.0.0.BUILD-SNAPSHOT.jar b/getting-started/oddeven/target/oddeven-2.0.0.BUILD-SNAPSHOT.jar deleted file mode 100644 index b5716e7f3457b4fe2610570b0bbb483019677ccd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7861 zcmb_h1z1#Dw5D_D2Bo`GX(Xk)6_6M@hX#>uq&uYrM37LB21x+{5d;K=5CLfrq~y(9 zFXBbL@9KMdK4uQz?6v-V&RY9lYyYFF0FQtM106#Wv?709{QZUs`BakD6larDmf=wS zdm0MNE6B9Xd$fACkgo$FfB4@|QxaE}labcYWLJ{eRqB7KsKCZPjG@5BJlOxLTAg#0 z2mBtyDnHo6s=y|Jg1lIuok+;iO6yUd8L5t^pswMP#axbm1sykmN1fm<-b?je$T#vl z&hoAEhgu|s(%}<_g`E>g*xUF96^XX7bmm@2+cGyYJnCW2SNG#hAV5~<0J8YD{vT&R z*AJcH>{D|;891<2UN%EA6$tQr4 zGtM!;_RN)%pCyc$yLuJlxEDMJY}6g3m$G)M4(BP?4z>j7D$?w}zsu!GUE>o8%FyVq z!w+NC>RwlnA0N}^G9`N(@B~{NaU%WZB+3{PC;rMoyf|_Eap^pBH>n&k<}mUMJ(_&B zy4k2cNS+(jHA_8ldGxllDbY~x1ILOK%{veF(9k&pZpph*lJR~Bo!sFb!FaAq#yaOW zR^dmY`|^JJQ?>FFcOTZ)n722xRmDASb<+08$_8+&UX2j|KhYa=^(O7sM0X+&v1P*& z)YjHPN_i$BIBQewIxXM4P!+h*=Aqtx+pFv}MO~BeW$>-{XAfm2NE7F|z3dCFG@PLq zWVT$Nhg;>()G05|iKU1YkD01ts$p82vuOK}fQDg&bJBb}sly}bUOW4h{Vlxn^!*wb z{mzfeage~c!NI^lH{{Qf^ZQggPnPpAOFFnh5)s61YHRH5oTX-6ucM92gz)j&c#3h! z$*x+A$*CB-RFn@8y#B3r^|1P+dt4 z@FEvAb>Dx~<8idG?ysEUb8GFUDcb{w5|o?(*Hj)ih7u@~40Kapr33XVwQw+~??%U@ zA0z8$H@rJd&0UQwVT0ejUqN5}5DL{mU&PQ?sKuE*QFn%PL_>Vd-dwk3F1Fvjd&Dw;s%LzI3(86e-dkugT0EGnKWd3 zO9Aa1zQ(*z{UtjBB<6fwjhr1(&yr+`37N-ur~uk{v@dA1`KAjArnRzG$xo7#f?gnh zW^^i3lBm>(^e)|4c;{TUx_){{(27LJ%y_3NtOU0xGPQ&v=Ed=xq^T zk9*YD@QI79%6U_JQF*Q!EQD`C!Z!$SA=;#k+Tk|-){o(dmS9~Kb^Jls45(0pL^qB( z-;+9zKN0nMGskAZ(p8(i+|AA5dpa^j(wcFq>Bi4JCz^2F141Q`PxxIE%N0{AVQZ~V zaLgZG$!Pwx*bK^}_l>P+2vEaUGkJTc@X$hbMY1p9-W9Tp9c9M&McIP!4{CK+yK{G{ zs04GY3fhi`!Bl7@PrrB~E6)jcd>;1*Z6aGyYk9x4nbzXTUGH*JS1Ox)qWnr~Mv85k za%L*h7C6OdwuffsQO8|m&Gi1+I7wLzaA2)cGOgWISJCj}dlgm~+T(E`C9 zq=thDBhjbN4+;^F!p>mXRMj5f+YLQ3>I48Smx{!M5=e&_2K`i*WFKnjoSYVg95xh} zmoh)|C(FI}3I3^XrXL6LtizGrGey+}%>3Q?B(ZKx-Wq#^)VEfvB@4woUnF-Tx4c(; z8;|$gF=UL~9YQ~>`0beOS=G&lYrrJy9C=wM;-tu$!Z zsNg|pq9gy-7(r#Dlxn0OVa+3~Ej4m9G*me?Qw&s!(2YvK#s+W0Yi2P8vBVej(5kRK zIN}#0b3bFPiRZv+@LhGaQH#$PI57D&+eOalP?CQAI;(uL*Lv@`oA31BCfp^ow{Yr~ zp@<+PwB=8|MmD~j|-bBXl zP0~t2ZV*m3pT*o?mQ3S(l&H1VAjg&*=Zn3o+NiTFq$8vMnQL5K+P=L*pAuKcGutw( zXPQ<+yP0DiXo8ujq8n`I3`4&%ZBFc~5mN)`e5^?8RDLsVgo$vw{7X_yPErE_&UG`b zM>@5(j^%({1GP_e%ufr_jKL?Y=r$y9KWtd}IqwPG%ABzh1&L|>`x9%qE9N)|< z^+nT)#$%H>N-tFoj{~L0_4z27rJEB87r>i&l+#nkF%Rs#bI5(FKgusRzJRq7 zr|jsG#f@w?Z9a);vEy=wCi9VYu}#RFM0Z3kW+0cYjK)=|)ONZfp@G+k<{NMmIFt2@ zB!@GHc$G0$UWvB!7)x9-V*+fgz^H^`Z$H#h?g1+4h8_+d2_5ulZ-(XGPuJqoEZh5l zR>KmrhJ&JQ!Gu@(3~lpr@{|C)Tpr5i#gsg{FKp%cz0fAWxvBD(F@CbgI9jVH) zjd9YhZ@^(qIc~^8(Gyq|ld?Q;TZF18$#IWXVqa^7W?C2nbyTfl-L}s}0*+W=<~pj+ z#&P!|MeooWt^uRwi%QiN2RA7dN47jaqoQcH>v#;dHx^1IM*xKiuWPe~)s)}P$HGoM zE{USQeCL~S=4azq(jyHf=uJ>?EbC*@ug7zNz-t-~sI zNi+7UT=guY5lL@QJ8L+rkfqPqKricgo!^iE@9dp$l_3U?yM4G^r!s}rfcjQXfK4jp ztqme0S=-U&V01et{BObV|iPwluSHdcUe_ZBf-uMQ`2My|4+F zSjdu#lJd#%ex%dnTP2pldR z4q|Y&Rq+oFXDOzPaO8qO*~~}|l@ITg+q07ADko}Kmg&`O(}nQL#d9Qn(0~okuys7~ zI(eja-QTd#B6k?Zu-Hmnt*|DBtG&irDx;foDilGM*5m#h3R>tEcd0pGc%u!-=sC3i@XRc zUk1>MiY#YjeWHusX~uLWB_e1O6eW`=@OeBSjlpLtGH6)Y!zsu~FdhNPG%$gmD5P0d zNkBiJda2GaN?-It;*Qm1=5rJH)!p`c6(c;eIwis_XW-#syuohnBx)D!CKK>7 zpg2y@TX0T{R*bAA>C1l%4e5Y0%(hU8+sfHgOon8KS&}7 zJN$>rr<&^*ATOc*LRYfAJ6DJ`ut8{Gqo(iG2o_!33kq-y_l#aTZtd_gz4vCnPiFN& z|Jt)nqh>e{KP55&#RFrcYC`*|_mW+A@j|oOl)>awJO+ zD6ER`xn9!Ay@O>+9)ZPtZ?jJpU2I9ev`5K97hP(e`4t`pPJKhR4z%*&;vn}iJZyhD zXAwVR7qb2Alk7{?wO%RQH!}E4SrRzYlSV5Z4e!ds>Zr<0@=Jk%Hb9j1h|+GYCv*cS zr|T+u{7V>vl}8-QLez3~9EQ@6!Y9|;h8@DjD&P^t05C-w!SGmYAh3hE{*il2O0g;d zm*ucAuvqt+c`$yDbCyM2^1kJ^S_6TVrgv}cTXm-%zK$VOk7w!x*kF!r_qRJElNFgAw#0-RZSP|5`S!tEw*DD_!2Xq8S z6G&b~GOdg%5DeoCX4$hzFGlabjaWrfp-CkLi=(M+L!si zJ9l)jgGy87n&S3ToY=xs6_hSSB?SWbNCOX~$wvJQkhO642(jn8%vs_PdUZE871WYh z=`c)aMf4g{C(`uF6*&&H!rks`$1=DBCjy^%jllo}#10!0Fd} zR(+c3M=AM?iN6#=bgOmJzUPydG`r)NVtCKQOfR{?INxJ2sdt{qS#ddKK=LpGl|oQ< z8C?7dEw(wkTgr2==yNYEjHaNl`!4QIInx#%n^NsXc=}eb?+wV(q($lS4O@xr#Sgc5 zbIHmm1|%vuv4l)JOvqU)9*pf@PwwmJlF4|x-IoYvTtUG|yTw7_F()|zdJRjr&IGU9 zA=rrJHj~lK& zYUJyxxc>f>t$w(3S7_^&%N$Ou`Vw?_^m}cDm}-J8(5YzNi%$sV6Gpj>*h~qmlOY$Y zSDJoI8{fBQO>8y5PC?G^2sUuNQ)At_d=nkBWqS0Uga4tW!nNnU#SsHe`(7A=MOPZ` zX@tp#1n%f(5u3hgo5eGGa443~-+6z^+E+jR#P6O;Z2o+UGoa7Ia_-pXjA&x-o2vQs zSVNAMj2a5bka%d8{QqQ%BgnxK2y(FkIui^ip+U6F8*@I&Ttl@~_t^`Ef=BWY&nQ2^ z3@b_w(HrBk%*-S|`{L0FD-u6w3EmE@&K|0kSOK8Xgkgl)(E)4ObM3rh^YCpY&# zgSeixxEGrjvNvQ18hV>E-8HdTy^&ljJ2>UP7dCr?W81!~a@lhuk(~V8g77LqET5#0#^Z%kI$0&{5#e0D1pr_MHfS;o(OjflA|F z2NbvyatT!$|IGp_m46*jiw}^?pJ|i-=7I8W`>!`k0wIW>dH9aI{&hW2DgEn!u1DuT zc)MW2Uk3y#tzUS}`VFraRCwn9h0nULQP@bz*0*E>1~`@8M>9uxX2@#T_zf$2>6|AKi@z*Q9xk)ZDJAumA)F93<4 G|NRdqpCyO@