From 9ca8812ce35e64775bd8a9c69e7c51a046732f4f Mon Sep 17 00:00:00 2001 From: Brian Dilley Date: Tue, 26 Jan 2021 19:17:08 -0800 Subject: [PATCH] Long due 1.6 release containing relevant pull requests since ~2018. Updated the build system a bit as well --- .gitignore | 4 +- README.md | 8 +- build.gradle | 243 ++++++++---------- gradle/wrapper/gradle-wrapper.jar | Bin 54208 -> 56172 bytes gradle/wrapper/gradle-wrapper.properties | 6 +- pom.gradle | 47 ++++ publishing.gradle | 129 ++++++++++ settings.gradle | 1 + .../jsonrpc4j/JsonRpcBasicServer.java | 15 +- .../jsonrpc4j/JsonRpcMultiServer.java | 8 +- .../googlecode/jsonrpc4j/JsonRpcServer.java | 48 +--- .../com/googlecode/jsonrpc4j/ReadContext.java | 15 +- .../jsonrpc4j/client/JsonRpcClientTest.java | 2 +- .../jsonrpc4j/integration/HttpClientTest.java | 14 - .../jsonrpc4j/server/JsonRpcErrorsTest.java | 4 - .../jsonrpc4j/server/JsonRpcServerTest.java | 104 -------- 16 files changed, 316 insertions(+), 332 deletions(-) create mode 100644 pom.gradle create mode 100644 publishing.gradle create mode 100644 settings.gradle diff --git a/.gitignore b/.gitignore index bb7da614..167e3ba9 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ build/ ### Maven template ### Eclipse template .gradle +gradle.properties tmp/ # Eclipse Core # External tool builders @@ -25,4 +26,5 @@ tmp/ /bin/ /.nb-gradle/ /target -out/ \ No newline at end of file +out/ +.DS_Store diff --git a/README.md b/README.md index bfd6f3c8..c17b41d7 100644 --- a/README.md +++ b/README.md @@ -38,14 +38,18 @@ using maven: In ``: ```xml - com.github.briandilley.jsonrpc4j jsonrpc4j - 1.5.3 + 1.6 +``` + +or with gradle: +```groovy + implementation('com.github.briandilley.jsonrpc4j:jsonrpc4j:1.6') ``` If you want to just download the projects output JAR and it's dependencies you can diff --git a/build.gradle b/build.gradle index 7f313de0..0ade14d7 100644 --- a/build.gradle +++ b/build.gradle @@ -1,22 +1,45 @@ +buildscript { + + ext { + set("jacksonVersion", "2.10.2") + set("springVersion", "4.3.26.RELEASE") + set("springBotVersion", "1.4.7.RELEASE") + set("jettyVersion", "9.4.0.RC3") + set("slf4jVersion", "1.7.30") + } + + repositories { + gradlePluginPortal() + mavenCentral() + jcenter() + maven { url "https://plugins.gradle.org/m2/" } + } + + dependencies { + classpath "io.codearte.gradle.nexus:gradle-nexus-staging-plugin:0.5.3" + classpath("com.adarshr:gradle-test-logger-plugin:1.6.0") + } +} + plugins { - id 'java' - id 'nebula.optional-base' version '3.1.0' - id 'nebula.provided-base' version '3.1.0' - id 'findbugs' - id 'pmd' - id 'jacoco' - id 'nebula.info' version '3.4.1' - id 'com.github.ben-manes.versions' version '0.13.0' - id 'osgi' - id 'maven-publish' - id 'nebula.nebula-javadoc-jar' version '2.2.2' - id 'nebula.nebula-source-jar' version '2.2.2' - id 'com.jfrog.bintray' version '1.7.3' + id('jacoco') +} + +repositories { + mavenLocal() + gradlePluginPortal() + mavenCentral() + jcenter() } -description = 'This project aims to provide the facility to easily implement JSON-RPC for the java programming language.' -version = '1.5.3-2' -group = 'com.github.briandilley.jsonrpc4j' +apply plugin: "java" +apply plugin: "com.adarshr.test-logger" + +group = "com.github.briandilley.jsonrpc4j" +version = "1.6" +description = """ +This project aims to provide the facility to easily implement JSON-RPC for the java programming language. +""" sourceCompatibility = 1.8 targetCompatibility = 1.8 @@ -25,57 +48,77 @@ compileJava { options.encoding = 'UTF-8' options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation" } + +ext { + releaseVersion = !version.toString().endsWith('-SNAPSHOT') +} + test { - maxParallelForks 5 + testLogging { + exceptionFormat = "FULL" + showExceptions = true + showStackTraces = true + showCauses = true + } + maxParallelForks = 1 + forkEvery = 1 + maxHeapSize = "2g" + finalizedBy jacocoTestReport } -compileTestJava { - options.encoding = 'UTF-8' - options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation" + +jacoco { + toolVersion = "0.8.5" } -apply plugin: "maven" +jacocoTestReport { + dependsOn test + reports { + xml.enabled true + csv.enabled true + html.enabled true + } +} -repositories { - mavenLocal() - mavenCentral() +java { + registerFeature('servletSupport') { + usingSourceSet(sourceSets.main) + } + registerFeature('springSupport') { + usingSourceSet(sourceSets.main) + } } dependencies { - ext { - jacksonVersion = '2.10.2' - springVersion = '4.3.26.RELEASE' - springBotVersion = '1.4.7.RELEASE' - jettyVersion = '9.4.0.RC3' - slf4jVersion = '1.7.30' - } - compile 'net.iharder:base64:2.3.9' - compile "org.slf4j:slf4j-api:${slf4jVersion}" - provided 'javax.portlet:portlet-api:2.0' - provided 'javax.servlet:javax.servlet-api:3.1.0' + implementation 'net.iharder:base64:2.3.9' + implementation "org.slf4j:slf4j-api:${slf4jVersion}" + + + servletSupportImplementation 'javax.portlet:portlet-api:3.0.1' + servletSupportImplementation 'javax.servlet:javax.servlet-api:4.0.1' - compile "com.fasterxml.jackson.core:jackson-core:${jacksonVersion}" - compile "com.fasterxml.jackson.core:jackson-databind:${jacksonVersion}" - compile "com.fasterxml.jackson.core:jackson-annotations:${jacksonVersion}" + implementation "com.fasterxml.jackson.core:jackson-core:${jacksonVersion}" + implementation "com.fasterxml.jackson.core:jackson-databind:${jacksonVersion}" + implementation "com.fasterxml.jackson.core:jackson-annotations:${jacksonVersion}" - compile "org.springframework:spring-core:${springVersion}", optional - compile "org.springframework:spring-context:${springVersion}", optional - compile "org.springframework:spring-web:${springVersion}", optional - compile "org.springframework:spring-webmvc:${springVersion}", optional + springSupportImplementation "org.springframework:spring-core:${springVersion}" + springSupportImplementation "org.springframework:spring-context:${springVersion}" + springSupportImplementation "org.springframework:spring-web:${springVersion}" + springSupportImplementation "org.springframework:spring-webmvc:${springVersion}" - compile 'commons-codec:commons-codec:1.10', optional - compile 'org.apache.httpcomponents:httpcore-nio:4.4.5', optional + implementation 'commons-codec:commons-codec:1.10' + implementation 'org.apache.httpcomponents:httpcore-nio:4.4.5' - testCompile 'junit:junit:4.12' - testCompile 'org.easymock:easymock:3.4' - testCompile("org.springframework.boot:spring-boot-starter-web:${springBotVersion}") { + testImplementation 'junit:junit:4.12' + testImplementation 'org.easymock:easymock:3.4' + testImplementation("org.springframework.boot:spring-boot-starter-web:${springBotVersion}") { exclude module: 'logback-classic' } - testCompile "org.springframework.boot:spring-boot-starter-test:${springBotVersion}" - testCompile("org.eclipse.jetty:jetty-server:${jettyVersion}") { + testImplementation "org.springframework.boot:spring-boot-starter-test:${springBotVersion}" + testImplementation("org.eclipse.jetty:jetty-server:${jettyVersion}") { exclude module: 'javax.servlet' } - testCompile("org.eclipse.jetty:jetty-servlet:${jettyVersion}") { + testImplementation("org.eclipse.jetty:jetty-servlet:${jettyVersion}") { exclude module: 'org.eclipse.jetty.orbit' } testRuntime 'org.apache.logging.log4j:log4j-slf4j-impl:2.7' @@ -83,101 +126,19 @@ dependencies { } -jar { - manifest { - instruction 'Import-Package', - 'org.aopalliance.intercept;resolution:="optional"', - 'org.apache.http.*;resolution:="optional"', - 'org.springframework.*;resolution:="optional"', - 'org.apache.commons.logging;resolution:="optional"', - 'javax.portlet;resolution:="optional"', - 'javax.servlet*;version=0.0.0', - '*' - } -} - -jacoco { - toolVersion = '0.7.6.201602180812' - reportsDir = file("$buildDir/customJacocoReportDir") -} -jacocoTestReport { - reports { - xml.enabled false - csv.enabled false - html.destination "${buildDir}/jacocoHtml" - } +task documentationJar(type: Jar) { + archiveClassifier.set("javadoc") + from javadoc } - -publishing { - publications { - release(MavenPublication) { - from components.java - artifact tasks.javadocJar - artifact tasks.sourceJar - pom.withXml { - def root = asNode() - root.appendNode('name', project.name) - root.appendNode('description', project.description) - def pomProperties = root.appendNode('properties') - pomProperties.appendNode('release_Manifest_Version', '1.0') - pomProperties.appendNode('release_Implementation_Title', "${project.group}:${project.name}:${project.version}") - pomProperties.appendNode('release_Implementation_Version', project.version) - pomProperties.appendNode('release_Build_Date', new Date().format('yyyy-MM-dd_HH:mm:ss')) - pomProperties.appendNode('release_Created_By', "${System.getProperty('java.runtime.version')} (${System.getProperty('java.vm.specification.vendor')})") - pomProperties.appendNode('release_Build_Java_Version', System.getProperty('java.version')) - pomProperties.appendNode('release_X_Compile_Target_JDK', project.targetCompatibility) - pomProperties.appendNode('release_X_Compile_Source_JDK', project.sourceCompatibility) - root.appendNode('url', 'https://github.com/briandilley/jsonrpc4j') - root.appendNode('scm').appendNode('url', 'https://github.com/briandilley/jsonrpc4j.git') - def devs = root.appendNode('developers') - def bernat = devs.appendNode('developer') - bernat.appendNode('id', 'gaborbernat') - bernat.appendNode('name', 'Bernát Gábor') - bernat.appendNode('email', 'bernat@primeransk.net') - def slipper = devs.appendNode('developer') - slipper.appendNode('id', 'mslipper') - slipper.appendNode('name', 'Matthew Slipper') - slipper.appendNode('email', 'me@matthewslipper.com') - def apache = root.appendNode('licenses').appendNode('license') - apache.appendNode('name', 'The MIT License') - apache.appendNode('url', 'https://opensource.org/licenses/MIT') - apache.appendNode('distribution', 'repo') - } - } - } +task sourcesJar(type: Jar) { + archiveClassifier.set("sources") + from sourceSets.main.allSource } -bintray { - user = project.hasProperty('user') ? project.property('user') : 'not_set' - key = project.hasProperty('key') ? project.property('key') : 'not_set' - dryRun = false - publish = true - pkg { - repo = 'maven' - name = 'com.github.briandilley.jsonrpc4j:jsonrpc4j' - desc = project.description - licenses = ['MIT'] - publications = ['release'] - websiteUrl = 'https://briandilley.github.io/jsonrpc4j' - issueTrackerUrl = 'https://github.com/briandilley/jsonrpc4j/issues' - vcsUrl = 'git@github.com:briandilley/jsonrpc4j.git' - githubRepo = 'briandilley/jsonrpc' - githubReleaseNotesFile = 'README.md' - labels = ['json', 'rpc', 'java'] - publicDownloadNumbers = true - version { - gpg { - sign = true - } - name = project.version - vcsTag = project.version - released = new Date() - } - } +artifacts { + archives documentationJar, sourcesJar } -bintrayUpload { - dependsOn "publishToMavenLocal" -} +apply from: 'publishing.gradle' diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 158fe8c2f6a3575ed9d73cd116fa077dcccaba1e..28861d273a5d270fd8f65dd74570c17c9c507736 100644 GIT binary patch delta 50700 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 delta 48715 zcmZ6S1FWV&)20t+j&0kvZQHhOy>o2awry*UZQHhYzJHV5{Wj@Nr90h8Cr_oT?(3<( zYys^n1%*?P1_eU_0)l`5g7P7jiiabG{f}M#^nc<90s>Nr7f?jUy1;yJx^n^s`oC+x zy#K8&BLMp!J4yb(?F&8Jf5z+Ip}?aMKtM^ziTDN#fN*c*6~v$Fcp6Vln7KN6gp$%+$Z0 zm|hN{uMS0ay%W{;pp2xheb(0XsSCei&FGsy1DFZB2#n#6(|jdI*l%Tjb<-R`9h)XO zvPRiUT5xV=;^CcNVPRh5;$Yxoo@2|y!j^c2gou-hyvtRTE=^};NNIJ#v2k(fc(QIjwpRoolPKTVr0jQC$E=%ObD>{#=D4VaZne^gzqbN5F0?RCM zXaN*vE|x)&*j6--@GEFXNhDmV))K*Z&6&0O?>G!(FHlaOJDn{}`xl`q%5j$?lO&Ky ze_=AZLQWWI+kksco#SAhA3;-Kkuoc{XF!R&!BT|W5*-zkmumuBMx}9b#W6410LBx4 z8S=`9SC%u^;2*l!_b4=6UV#$QDCCv0Oju)RigK%}(-0zl0PYEkAa};Xk?WCLQ{wTJ z=u=hcP9`pxU?MM-p}(lSi!xHoBCw&#j#1v$4hsXLW^E-PZQYe942Of@zipxVR!};y zv@gpTh56`9ZaG&3RO=|+Djl^y0hg*->sh!8n5MNe?VY0IR*6=W?v3JCozz8)`ek+H z*;I;>=H)meBw+FzaZ^b%A(l@U!$f1MS;-4To>vLlipmh$nEC_nKe|kZ0j*-BLso~j z4TFTOY8@E?EIqOnUlAFe^mhzZyQVsY-#U&SWl61%m{ZjZkdmV%7T`Qw0Lc*%c6%DT z7&BO+hY-}IX{9rp;*4?wSUCq_s6B3|p2(Z}fg9zG_K9=FTdXd%e#9=Ve#J*BkF+V= z;j{q!-OwWP3(6(B<}%8*7;Gpgf*-%3j0zH^3fAh~QJOm_=FINN$0jLzxek`XU2--t z$$oiF8BZ1ZqB9~E?ZKHez{dks2<#`c*=GW#ET3;ez^ZMMlO`gCo!lHVA0ultCgMUh zPPslMhPggqs;{@-9`!Ruz4tfi&b*E4$7FqfDaz#j;*^i0SFypY@!1ri{Dv_vK;c&W zlQM{(`W2d76wR3MQ?-BR_66ZPe>e9vHAom#OohbfG0IL>9DmLXa5X`X))d88ZoO8P z^Wu7DmZ6|mb%&LbGo^j5Desf9S;KR>wzc~qqMFRh+AGS4cOeRb2F|IL9MVD|Ia|n4 zsP*mJx50VU^<+;u<)<69NKd=Whc{uobb}_%y2QhnrKemmKx*$3i;*mB`N41Qr|Z){dTWf;6p;GZy?jNLIpSXcPA>qAU*nbn(0F};BHa;X zTsFk-aiMymE~%k2ik801l4>$7`v$u65f{4p(bX9Q#57Upz% zV#Is2q+O=!bv!v;0TMip;IfcR`ykWg3F`Gke(4;hEHlQ%8e(d9EU`r##DRnHN`6utIfP+Zz@)wn*N9O!@*>0gv9{XTJVz_aww#xA4o@ zeNCRwv;%kal)1L(t~CLE;8tUBHw72>ghjiKao(Z!*cxwoy;$G0e!r|iV6Gn^LYyJ+ z%~Bm1@f>Gr*`}I^NN=WJ58f{Td=)va&9D^q#2oHWH-|ra+%-EAYTg^+ zer#vQf)PAXUHsn`Pn%v~PP{d>k(dMMRZgmu&hb^A8r1lb8mX6ZqW}fFjO2WP*GzWCnjkYae#?V7z;=rF(vjhk zgF0RNr zNOg4yBZQI*j~ErVh&ZU}ub9+3p=M5G2Wq%FTJ<@Y*;qf1yov(KZ&C`?f#)y(ls?zR zRh3=w9s&2RauuiA@)~^>n)kjbQtyfp!^VgG2O6@Pt0Cm!KS|^{*xe}2f+<$WTgTsd3$|jQI$iAAcCt7*&mv7zOIydMDS!1+ z01E)%|4xNYE;XDJFX#jTcU_fGpn?jIdaX=sQrzb*e3`%T`$CbplQAL2Qa|4we75j` z&`!Niy&xd`3aCk0D#5&o|7WmNTR-(3y+mU1soK9w+Er= zOxQ}hUadab-1GrJ|NFQ`ua?xOzkq_O zV{QWpQyFAJ;EJsgTiN{->J}uhBAWzqH^G}J?+o^b?3>BV)}Qa0iysgNxSyy!o+#m@no)&5v8V*fL0HTj zb;YDBSxpTpfE449!CyJeBJ_efQ#T`py>U0ukW4DOVFw&-MwV({C}9ov3|n zMjz}Q#1ne)yDf?ya&mpOJ6}|O1qYjsrW$l|+0o`HKy!q33Jti{as!NaK^b?<9tDT1 zr=N|JmzArfp_Sj$xQ(5atDz$wx3i|8&wGfU@(hY=Wt?Una3w>XXs1 zf`f^j-*b3*`0#r1U2PJZ=pegs3R7&RXdoF;Y(~nNp3-a%j*c2a2E|di zo6C9=AS!+QIKzQ*}0>Waiol` z+;U;A{?Kn_|H`7@;pL$|!^ZT25@6P}G9@&;Eb8uZOWO_C74EQS<6DagPCM1)Qby2G z!aWj2CnEO1auJE^RzAdF11KKH*8!hbZLBf?u)Q5$b_a53o9I=q4pVnD3Wnpn&kNIb zHSzd(EI8nF8^~mU4?3bgzDdQ@>($G;b0=c^z^`zx^))+U$NClYyKGPXwK0GWewA#>bYx0s z*(o|8?>&+tYQHwXLcISDEnRJPVKuu}qo&>R@~zRmK!x%cS#3<#rj7x*M75?3vX@0{ z=(#c~ZD8lt9oGFWBcwvaM}5kib<_AhaC#(C-H;i3EVCs7VBw*Q#1NqiSk5u| zHVPO$)e)ljocO0bKN=TiH><*0OIvB&&Zd@5QiFA+{BP?xj>$T32G1LA? z#=}Pmxf2ql=aPN?Y{13s>c|bS9c5+n)jPRFYCN&S2QtAle^qtK(KomPoQ@E;0fFC~ zRKQBs@Yk7V@5lPaIVE}9MB?BdoOfrTPVcF}j#uWKlg2Pk3*ZZRAmA4iy-B??jBrHy z-}Ut!ETU|sVMr9~3u_OKBMyM@7YhY>LVV>EC-%4*NRs%I5|A-qu71+SV7Dbg)Fd&(1o}G@@xL;&tbt`5w$1@|5n#R4LuO&a0%s5acl~ij@ z^~=>Wqg(elCu^pQOHr{J0;vlgcoBdAof<|_gnfXNPSjuR~RXMMm*O$B8~Uy#vv(u9G|o;WowPgrwuA- z?9;X&M|Yy#P4)g3tlqvJi#(I^LQ@v;L1WHO5TNBc9~%FOr)*K9U$yq{+Zn=ZLpiOR z*WXd$c0$SizG6NuoOR4|XkPWvG)If5qQun$K-2bLDfumH_#8tV8%GX* z)mkGKJ)%2$%{_O?-5=5%WHGXZI}_BvT7ry@$d+suo}+56;?sjOZv(mzcM@8`?jdmv za=kf|YxNKBZ404ymWwA$FW(eS4O7=s@0u$U+%uBp0GKN8lZVMX6Hk8jsHa6nvxVIf|-KN316P8jQab4xSH5jrhup+`~jc1Iq z1L&E4J&tP{PO~mI2VI;5I#jx)zsGi^LVc-4=exIP847K)j)6s_24p-Fg z2exXH$Q=IE?1$nX`xfkZVA0)~{B z{kra|1nh9P=svdw(-~TJAN>wNHha#PdyWK6)Tj2fi3S`B<9n^CXLQVcOChJO`+&Y{ ziP_?<`>vyo`SMUWjNt&OB%SD(aLq^|QL`mWvmNnWL<{wABI1pd)R|Sjcuy#$TKjg? zTC8FG@GG4=SAgFZ?vy2M6Lk%{NL(yi(v`k;!tlD2CY)WgSCa}Br<`v#X+m=!nYlzV zrT27mK#2TT_?(iRaX~DgN=a0X2`BxE6Eo@W5afm zanSvaYwfmgJ_K*z`vJ)@{Z|h< z=X;O;0)T_~c6G3g4B?>`>lN6qY!4Qce;^hXg)x7R{Fh%uE~HCJ!M34SstoExrq2nP zVA6@{aF^8@@BwUhEe|QP*P_{Ouz^!aNGr@Ij=igJk zVHAvajjNzo8(wwc2wCx=Oc-Xg;LXhGD!?h0C}3JkRnJb|ob94q@@S_TLDlQvNh}%- zT*Vxs>r`U5uSDKFnsE5;9OMG4JN9I-#cT!Cj{EApB4%E=&$!Wb#uChF9_sjwgbh^8 zn~U^e;>yH;vx63EJckxMt+G#_CgjTXM!32e>#`yt>39t5m|oGnsOnC%NS@lIb0N68 z0nlnbaV8=v2un=3jp|#`PhgxNrf0Ixg+KjqU`lhNT(n}%F+Z zE;|j^#4jRrgiewn4ZgSVVOw=EmP9M@=daWwi<-U9$Fw-w12O6OJ>MH1EU6Nt82}HO zR2kAtiQs^jpLnV5{%Mr}P}!!fwm{vRt)E6F#-{ZryLT13jMatK)C*y21Du{nUl2~- zVNhlk36*?V5T9Lw;vc@1_I8<*?yP#L*|yQoA87mtyyH4?8)arHA~L4E@3@R~OV!#H z4eB_k4@pqbpi<4$R1L&P(OQLq5y1J9W}~`hHoHb{s{>5yt>z~d=jSitS6Z>TqGhC! z(>oHrA<9o|@Xyezk6wa5l5-VLIStFrqzjKzd!Dn+qnHEf8)`|(y*@Q z2bE_}n|@K_6LJtB>jz3WB-kY*qo$^Zeq#IfeD z-cKY;(Wq07RykI4AIPsle|JEB-sUV7zrt_fEP4a|uU7THwxC86_uhgL8WG2uZqLq< z7v}-~&NMz$0Kt`AT^tk-_`CfNo*3o2NIPQZFNq*}YB|*Gu^S_zjyordo?ND_teJhC zi+Y)T&E(%%@Ov^}`2P`X@c*03|0gb45m?1FC05JH16(Q{n_Jekn>@p;FV^?9r3I0| z2%Cb@@O>y`5(wow)?gE5BY&j&6>jtS`|wqHm_z2v5PVkCoj>TDS0{SW0YF{Dm7J3X z)e!LVvX7HEGrnDqie#_0tbb!wav63`BXWtXnJ2N+uG^pW-B=7-R0@>mk(tu)56ZeYdaatrl?bZ0V zAJWboCD(`J>j<7vZB|Tj{lh{OUR;}4 z;SpQz(JM&k(G2V*>H-dpCNy1fa?x}Vo`z5`oZ8gPmB))Nv zz}%45Ka*{_KEBTkWMZV-)EK(eRwTZ)&UOz@_%j{<{hd>oMSs;85VmBZ%s{jBrOWxd#z209x42kVc9__q=x=kdn(D@G~R&oaY5E$$?p)cN_zHS8zd$w|; zJvvZ~Kj zUb7l^)9Eyg!rl@8w}P-V?IQ6;5$;%;ZUPz`eB%4yEQtB0kWSTa|6)wSjYC4?3Zywd_1(Ej4G8}(O9qd$ZDK@6%0W<5dCB3`~DM|8M6Zqo3)Ztd%R)!f^>BKQ6N5z7zU6=v^yI$RV$iGR*;Hs~rt zop#qx9Bu!WXP_oWq|}+eYYXlSfI9ZI7$`zl10#vhno#p5C7yAR2y@IYf(g&RqAUO`4w+ zp*UU*Nr!-Dk<~OCnUgUWl{R(te}^1o$+8Bi>FbO5<2}Bf*X%jX@MPfzu-0u&ZGK9k z3)FO^Z7x^~$wH5|BeygG3pt_TMwD7z7n6dw-O%Ey-pF6I8<}fGvyDU^on>y!kZheo zSx4?rK11cerzo=4$j2lu4*ds^q`e-(G@age7c_UrxymBaY3_mmq>=8ewr9y zV(3L)Q;IvtbmqLZ;EpK)XhdG4-EtY{)Y8~lJb+Vl9TD}9N%$g;v9pdLP2^AJ8`rdx z74}>Qi54BAYfO<*!y8Pc<9s?pdSS#iJfk@9X8*!JDLeuuuZYyKZ6Emq%Sdc!CAVxA zb!P7DyPwvRmfU>cZ;61x0oO!*$*)`;fuk2Y4$I36&_%^RKt|2oXGYCE z@Q#-kEB^fWycT#(3*}vuFUUcszrrt&VOgx zl08|mNAec3M3mZGDSu`r1fnqx@xhg-JA<;~{)>oJ(~0yjobC($Lp+@|x%-#Sv^9Z4 z@yI9m@tIw|p&L&LepBD=Q}I7av_K4h z1Y=+^1{f4|05m;;nG(CL!i&{cgRJanfgj=?A$a%$!opvlgh{Mo&tjqCP8Pc>t-oD2 zX;FJW#_+rfLlsuw=0qOLTaIzGFbY^hTjG72_%WyR4}h{k=HfxK&^&@JR64*$w*1`T z%-26TUHAuX=MLL(yheEa;G1)2IS*eBbQpM;lCX@`QI5s z99iax;qgVek2F0T;ieAjlVRS+^zk(>PRzraz&K+RvB_x-ks2cqSDW|<3gI!Iet#Rj zf!FS;M;%M*7&Y;^AfX=889pMor>_gUAg_sg*>**w-ZD`xIRsLRpOH2<#W+6ho9pyj z(*)!1&^xa%NHZwX$o0D?uQ&Su>z6)@>3Kis|M%6EU5W9!_)ki+!6)9)VI}%a!vV7Y zNplo+Oh5T&rU|n@2wD!>7IR{&G_cV53XuL#kha390@y-e#;y(AHowT2FD_|PE1p7H zTdXS8imkd;BHhaqNKtGrs@LBmfBy8otG|}rus3FI*`z=mdp>7z?)ap>`0Q}+aC(01 z)b{)`!2WK5(Y|ei!B5%~X2M{S83V-06GaC6Vh#tBv!Wo27ZF5TxHlnnkUCxgQ@cdS^;3Nerj*uo^xRjKN7%Pdx0%mibC%@d0&IfBDn)2- zxX7!GhM7g=^Vv_lhHd7Up<2>;FEEP}&P>S%Jj*nbpUamSj2FayVzP~sF@vue(rh_~ zFELQFh+y}>n^dpYD(Y%paUxC-DMgT@Z4s& zTC7n}79p96Y_eEFwJ{4m>?qB17;PKEJUTP7PRghucvqfKmuWU%-jsZAu(f1J~eS=AK z)*0IkPh=WOJ!&nth5@jkz5B*C?9z|;Ox_phw1-z*cw%cWF#7DWzl!xo-7v2Q;c&Sf zdt+Vnvrag6?6Lx{S| zCsyyABX}cMMO%fT+$d{T#a>6uPDJjG|DqnR&3XyFoCFow^3(LfmbHiOAU2m@EWgET zVGRG?%;av{Ly#&}I9+&MzkB&B*>}M~t%vmJ#{T^u8^0|j8uCgl>+(9kF(V|CL6aOF zDECbcxc+0_1;8z61ofrWhS)mWA5nch5?WjX&$-7~3=nFPxRIwaM&p+G*17Yc*1_6p z`mK^u8lr7h~Cs%W9^XQ&J$r;QS8n%JQ0l@R-h8NQ?^ng^OzguRWt^Nqt zdJDPwG%Z?S6CH(cbtsK$$Rcbu<7mso`Q~;_-6&Sv2l)MNwJ=_}xy=hKU$K}Na`4+| zr?yf@9ZLYU;B!K~xGvr&?GV!VqM`lIPMvlXdM*+*niR%HMYb#t*L?TYOx5+Ul9Smw zMQp~&DS+r4Od0ps7o_n<&A=%()2;zJXh-(pZqCb6Tr7I%tUEUQ-ryEmBuJt#Ru(fQq`hX zp%E0`A!-3H>PIie>$VH=g8`;J@J^xtt=pX^IL$+yUSE9Q;~0voLc_B}Ev*wX1 z#l3b{VR*c<>q`Nv+-OO(YDY)(MYJkkAe_Oc-V3f(7ml`5{|{PskcA2S${gn=U&l3( z9Dp9ve99-w--1eOcpdVNFVuZerBhkuv~nMgO4ZT))hWA8UbNQG7p&ak^r|MDtBP}z z7oqFujR!$`xMnXq0zHQJ{*f-2Jq{zR6|6l}P|5L{R74p%DPktye19IGSL+$0dUs7# zIpFbmcT|GLZkZ8kF{J2j-xk&MUd>4`3y{HOc5jRK#0dj;Gq( zmshci=n5RV_<*5GzhCDC8T+d$eTeDZ69}GBE-5ARjv;sdm0Xi0AkYNPQ~5we3&0yL z{;FoEgiDeke5fvXHA<0=XL#7^kR}tuG(zQdQ+j30suyxIg0V+Iswg$m`5d1=Dircd zKfaDVrM%$g9_cY=DQ~iKj|1_v7k)JG4Qv~~D|6^~8q_U7b$Ev5^@IMuBjAmfR_e{a zBVGez0!eH}2zFT}0hfMoBGk>#Aa)|<{v{PXqs zVh*I&FV7_8p*>6ikTX}Kal`~pJJ-huiDdvJOqF$EedQS+v^CT z#N5(Ib`T!v{43Gc{`*TK(SbVbrLBF#$1|7SJwU;x*7^0(JTh?RL=63HXZs(x~r`2N;r~Kx~8hWDsA+RwaDD|tQ3e5XD!!qm#zSgax8X4u%o3yqO>JXUwgbSEgmX2m?Mjy3^J~g% zMrP7+;z3)p#nQS&F(FTp@;)P8y4;kwv!CYoq(c*>{M6s!u45JP=Bh#ygX-W~=0J>r zf)%l2L;$5GI)tOwpuxMhj94yw?Am0*c=E)nt^{2i{^$YvR{@H3P>251IKyIa= zP6@I{@rk@SMZNUWqr`4eGvQ7~VaR2f@S-zHa}z0jF#t4%b@vm|wS<{7JDqJxi7@jx z$rUnLT$tJsGV!Tl#ZtfG@!!t+p)h>&d&gv$v)6TmeYSY|2I~pPv#9O-j%TdP`Kb<7DigDurf_f>696C5NwhW$OW0NwN&R7U;U3>#U# z80+0=8VSI@zy5-?)1`v%8M-vdY-d364eyl8o^I}EK(o!3q6M;^?b38?iJsPql)E%V zHvNh8V3}e)=<$r*zCH6|w~XR$%X`^ zx9T2pOCuzka(h9BIJ>|~SvYRk-;J_IQsALPR0tp|uyNQ3JBvGG8(lkZ{>I>&`<4q2 zlIz)oSF9c2=I{0+f;wQ#o-r*Q<_b`01OVSFE;o1XQQrUKacUkV0~+4dLc{Oo5B=j%Jjc9vlRmXC2ap891AQ1qLOw0* zsT02Cq=p^M)pKen7gC$xhAqtPEj=vf6q%K@7-T`gt`XGaP_&*GBD&I}06=9FkdPCD zSVuJ4wzRwiH`dAkg@0U#Gm?dvKqBHp znvs1}CuP=1Tjrxg|3my5u)7HIi4wbJ zAgK=2{u^avih(pDx?$Wxo5>CYg7LEkVX>vZ+%Z=n2iKVgnKn;g>dz&w0BL%*-hG%2 zx`X?*rGtF#+vUEAa%`O~B^jd?#t_^bQSGH8LHUc#xVm$=t_Ds=g@rL`j15`|&nLOf{ukVlZ&OoJmopZ4$OI)xyu)70Ts zH4*jnuP=PEI($XY-cpL-y~u-V+w)L5T43s-ixS^i#_QV>8YRPd0G*~>)cw8T1^sZ! zY4L8CU?|@&$l1KJHI#!QfLPWe%(A4}7?)6xpMcUgBw4B-!F_TS1e-(+vD7`2(JGk~ zBInF~S9r>A9$5v;>{TH`gC3YP%{OkM-1yHB3*V4crZzB0)A?GuKaI`~DRM2m4v5^q zuc|=PZ@WqGF}wSk30~QEq8xshK@Sh9XJDJm)I~khTBz|Ea0qBfv44s{`H6VRZR(!v6nmU=Wei5P} z(5%+2jzHj2AFSf+*Tu&f)YCOdnDnnksS#V=S()=PL;tm#@2FY8vE3rG#O}16XS2jT zv9Mjyi$@r>yNLVfsb!PhKeljwQO?h9oF39p z`-wenr`H;m1ALdyLVrRZ`Oz2GPk}*r*vnyMu5U@cAI*f%$gHnQu%jIqoRQv(S9s8$ z@Spj+9V|bR)^G9ApYzxH5Os^!a6*D0IxGrR7AvB>@H{%9j#-xci-NH}N5fMiKro%m zI4ZSexW)1?m2T6iQ8V2@hely!bB6{wc$1Y;HyN7+5fKnDbI#Pdo&Lx@&jvC?Y{&HQ zo3JNfdHVe<>4>{V;Nf)jZ+!i?$o_Rt;lZH$Y(`t(I3M}No7!@29g}CLq7X%0fxC}E z9^mp?k_ZoS&4X@?cCWFCa zn#p^X3BZ;43=j3#qAPmr#5m#ZCIbQXo<&)q%bGU5 zKKRxyxxs5FYnDVPH$E<-VW(9ioe2zJlg+BBE`6}ACWH{Nzc4S&hhQB9Wy`9-ex;fL* z*I)FeH8|hLP0~hk9cb>jHL8V-9Bxe_l?R$wPkXm`Ta3_orq#(GmzEZjW6QnF=h*n! zO{TQej<-)ou~g5DN#{oaVvUo|4}JZY8yJZ_`BPuQJ8h>Fz5W2rt-`WuVJc~IlhTrk z3TK>LjDOzQuy!76E*e2L9C>^ol zQV>R%m*O7J6&J)b%mb3Nw|^g8g?=QpyFD|nO4wtzl(Y- zsSZQ8Y~G)*md%VGb2drfOY&}wY5Pjal$5S;RaH5v(;(T@6~#zkBqG14TwZaJU_mot zg|e4*Nhc!fkabL4Ef3F>y+d-0B(q~3rmNpT@h+0BMe~OA)FSK1oOydrBJ+}|m%l{U zP@Z0jcd~&LL8Hg-{)Z!|M$%ZqZHP+3K}$F&>=uTuN;pWoWar4AGxzI;)~aI2l^+ir zm0|wwg>hH`BHFTW69;i|DC}p4v~S5l1kdnhP=t*%cJmWMM?ww;#S0Gb4#>S8hr;K| zD!}H}l@MH~H|!S2=cQ)k>OI7%*YKXQPmQkr6{32Hv~zGJKVu{(dP*Wk#+cbG1CJdS zr<2b4Xc`iY>?WM!u>0zl-&W~kt#`k%WSOoxWBZ^J0Xj%Z^e8I?(fAkpB) zunX5^s??M5WTP^TgtCgnsab=UJSE>V_KS%$p;D}#vBzw0n+bPHdL7xCFX|)J`b+ z=rfi96YiN43ac83Y$NQlUeh%Ro@R`bB)hIY2cq;vUu%`Gd{?54G5AmS?ODRuB?X(A z=B8nInHWm>UhLK?jJ3waT`B2>7Ucz!JK3zkq|P$QWvg#W{Y=u8N`zXfI@79d zETfUA7lr+rQ!T|(%O$pYFKqPdEmIq%-&bXTj0_{CA_=EtrXeMz6Ba$ro@Xmo8}eXv za#JI|3vKjD9Yx&V4>|UYY}E!54bO@({I%Oi>Z*C$P1UBj((8(YjbDS$P02I2;PvI_ z!OFs=CTUBg@o(hSbvpAXE3}dJsZxz78J*@-S6&sO+{3TWxX(bUNy*<9t{eAcwDW3! z-ktJQrG4`h#3&nmRpxrf@Q4hvvgU6{;sk@JwU^^HV71#Vz0!}eoliF8_=@QW(sHPT z^%QH_Y};qYnseYl+fr}$A!{9gQHw`YLa>TZPg{*|F}gdYpXqv}`ZnxR_D)$9*u+%X zdWoMZ-Cxz(n}nFR^c_f-b{(_w`w}a_agXMNtb{=$WoJn=XHnVF3Q)DC_RJQ`NkHZ^ zrU8~=_-HY3^e4=|AJu_J13ckn_+k~Uvd+P0*}>cJ8ijQ%RF8+H?c1b#cH@DkHkx3% zBxnsQbLo5G=FHLA5%=8>erA_sSe^!^J>+t6it@3{%FNP7ik@o&?&E|#mZv=6DWxFS zdO*bXntH@q6`hLN4pXyTP*?rs&*=n}vQp#K4}+Ux{o|_9g0DAj&ccL8MKO)_0sCha z^M2-Zj{CKt!DV&e%^6qRiuEUHT=zrIXOVriyYL(Mir>?!p&1vtN}6=7{=%|5EB<&{ zl@EAO39kF}eX34AoRVveLcst)ElU&!1TA1S%yQC!4>}LnvSvoL`bJR0?KCUYG_fX! z^T~#2s@s9nOXsZ!_O?CW7r3DN0F$N3oiA|YxyBq}SM64kbn2uHkuWAxvOAcmz@miJ z+5va@!0XU+UN0%|p)K$G#UgN?eo;niHqUH6L~Q!4U7^9?kF{ho8%_rR>89!%L?xR+|*f}zKWb# z(bPc(H9v|tKX~gc2WIuwI3sk!ttpGOK-*R6Ja3PNSinmm z`frTERzrl=0~9#I;cV|&ar8&zYv3*<@mnpN;X)2EUg1~gfiD)ZTRNQ4MvTG{LZ2+} z+`Vn|_7~M_-$Xn>D&3?Z_)`yXZ`5zhYW9U1eZwxxMfYFud#EliU}ATblZj;K{Gz(G z0ff5hZtsz%rM((XUZ6ex>IbYaF}5Cfy&?MM5MXz#pTF>q8uJh6o)S)#^@IlBG{GMW!eI- zaG~2w+b+H!crbgK13RErpC}^iHf7n}LSA%6whuwP20oxxceb1Vfcl_0#5t;ug-r!P zrWN5*3NeWil%}sUPe!ody46q(!>9CfY5ck%@C)r@iSvf{Q!jokSW>*cSFTRG+y`p@ z%XH6h1JDKrw8FcFz@yG$Ut9a2g+ia=U&FxveToNK85?2c$k?@$&y$WL(Ce$uF(5&J zyl2U=xrEqJ>?44T;f>8F|I02e=M9#h*?jlH3GHAG z`YphDg=0v2%_||^3kmqE8Q^&*o;3#Y=zzH$ikjqO&uH|6VXs#I_vTe;%SW}`=>{g( zU<(H-)*0uzD}Z)#S(Y@m@$<_5jMAW>^7M`z1D~9laU~)T3B~A7Cd^$k%#GYHx8W7; ziIGbcz}(*z46d}4hOA7Puu-X_&uWh@ljT%OWwH76TWQN#1CH`2ZqjJz+~ZYbh#gA& z{#(p9h~OKmxnysQy6A9|Kd}NtlJw*W`4SBAi$wV%N;eWD+CtelO*KQLn_oi-b-uJy zUbu&V-Jo;=#9ziqtG4F5W0g3xSSlS-5af4k%E6VAvAw#wq?1v;p&e3Sp?7lAAW05D zfDz3&C%1Yi&O;jk#fL;0gf}r;gMln?EtmIG8XF9L@c%<1{s%<-vc=E9MFs-8qyz#Y z_#b^gH4O{M)`av?Icnx7XHMr%*C7BC!dONOH-YEILV%TwTSbVg!$7zrb57JrC*5ur zM!HbLSJS!@+p-RGq3GyGuFk0qyi`RT$anfUqQC>9IXE=-+J)dC!LU4R)BP+w^I1z57;tU{+qsQ z0cyS#g|dfNsJyk^i~Q;m=A(-*kusze0N8HUIEepgaqP?;^jrSgq`Y@Ka%9IYSSt40 zrkn|bKvv~I%ahYUlI6+uer2+h2}TB9AB&#XU}7x4r3>~3T_kos*d&L37oD2`{nYFc z;;W5or5+|%r|>~VW-OPjPqSMVZxRubX8^~>QeUyP+HNb%FLyl%DN)U2W2?4a1Jw7} z9blCV97{LrYRQU3x-KU&tV5M5k>hM73NTi@^r&`+J0^*WtF;2pOgS9U^n{BL_~s2RvP#=C zAfYX2)?nE<<~UfC&Ly+3PK1r7q;kr!@3R^qJBo@wb11J#CI*NZ*0D!F1B!g?nTTZ$ zaPJwnD%P6vA(bNGM`?MjBpo9;ImEBiDNr(r|V z5v?@Lm&|&WPUG!YkvQhOO*Dn}X8LI{E+xbawrTuNl46RKj?s8??7CyaVLw^>6SLXg zvM7X%N|<@`-AQBz&ucZI0W=_Cuwtn>bta~z9NiRyg_O&QO#G+~ zGqE$VZQI7gwr$(VFB99gZB1<3wr%s~x$j!<{onhoSAXi&U8nl&UAyY&n}1P!4wbWm za}BO`*~}p07SHatOklG~mn!X4_P7@ouhu?hG9lf4@>;Bfh)(J-#sk(RHQLAHcu{>G zH$8`^0$)rePSq{sO5uQ&!nkz(;F{p6%l=r)9h2@!GzkB@&8&HTJi$%IYZm)Jgiw^H zJ%A6fR_RQ)nEDfIjcvnjClX^oFf5R;Z0S76LTzzoq{EP293fFm=3G&SkXt_xe(u6- zNrD7y95`ognGs|{6aYYc;9i;O$9AT@I2Z^-jV7;x{cW>Uv2Uu}K;z}l?vDe`#d|q2 ztRbpnH$>WAEs2E~g7n0a&f@AHc|vU8MThJ?&P-6N#xmG5C;im(vZ@3uOQen*<3Gi5 zT)>AHWyvU#7LMxRWHVGDY8Zjo-vwI5TV$e@r_VE+KRVV?iwBq`1*Fp@_lc0kH9o_P zM9>4o*io2W1ia?hmU|Fj@-~bw96`dTU89Pu#SYFG$1kQ|`kI-Omk7vN$3jUcIfxQK zNbKiCmP{UDtTKw&E5~JXA$5dZzxHUxqUwy5r;Tk6@0|Cj@y2<wa6Ym{A*YB*Pd82a-jb-rG{8~Q^N&=Q#pftnRd+5Q9!WLFywCtazOK?cIPZcn zy*=zYUVOc>R+zw*6qPS%04kNSRj9eGj*?ms(VyL#vW}GQ=+dd|Skwvvp=oOGgfaGe zTB_}_e}FP??w?73JzZuB?~<|Y9lLUG^lPP8+b*$mFO@DimKME3h!dL&;Qk195~F0q zMdsD?)A)PqAfeSDA#+^`LtP4-W#l~d4d}d&MiyeUIm6FXQ^STRDc}lt)?(MKSX2ZT zqKJ?OKI^%-uNnV|jxWmvjQ)@1CcSXmB>aOe-jx2Bz z{+?Y$W6YK6D*-_4@Vbv`!zM*TG$hMO_;xBb12zi_2ZgVSL>0*jL{#Tkr0GlkU$YcK z)43;&vBfOjYOQc*@S=_mQUi=5Ggf^YD@+t#`mv_%G|XeF15M+baIJIqjbp58l8~m0 zB>=}Vq|h7=6AEJ(1$Q^KmIlg#Ohn3rS%1JZMHBCgWq&pnt$xB-=;9DXelcI2qJ0iF zuecm8iA2)yv=JlTQ9d~HDsqrpu}P=uk|GvraTRPW^;Z%;8Vg_k9igxC?y$12HVz;a zqE-c=WRh!s;f>U-oJZWQ!aFcW{#C*Q8{j{EQsRFg(2gkeC%5OA@?vV3+FrDWPRHxm z)mdzxLWpNPnMUE&VvATgTj7<0zvAXu`K!yX&fU7Qh$2|i1qM=T*)cDB*N|=jlif-f z$%kM5g)=GV8054RS7~r};<{dr+lZ>Whdx}HUgG`^62_#QCrNLYmx5vdA4#gF7*G;b zxuonXQ#|>0;2%}i!IvEwcquQJDIjRQcuw4w{5vz~0ELDTs)TqiQWiU)Q*$ETT-q>t zhaQzNBRv)}(LJ9lcun>Y|Lz?6Tl^6J9-HbraC<<#MhU$91MOS+@ZT%$LT+_ajAZw5 z4&{ea(l)B|hyS*emZx-7@g4oH5#TFH-)zX-tP)$HLuOKTbX9mS^XkC5|9>W!1>gVqrEpI80}7YWcq=#sM2N7hek| z)8Z9bjgD83sd7?TCTH3RWNh_y=&mGjw??WmKh8u*T!-OZ>uP!XH*#&`ogUann@>aB z8NlE1-i`}UcESYhIrKS1JcHhYW)%~e8H!cpB^pY=%x=#Dx@_1EEo}mJd>Aovf{#?H z-QY5;UNTA&TkGCr$i8ICBEV+&?+p_7_^G3(#plXv+I!O2{`nc(rrqGYVJ>P@Nn#C&LKxAH*O{JIiBc)@4^c5-c&>=$}1Rb_fWMsR~n~8XDn1b@$#ew)` zW?|Mzjg{O0v4m8LJ65a2Qvs77KJN-q{q*-a;pB~mYrGWu#4NEMBA``m?j3f$KYIAq zq@;_dH3d;%eHqWhh)(-1N<_F#KLAn_V~Xc<;8{ms0VwONNu4KHk#3KIwP@iGyk{y! zpwmK&X+5?d9Upnvd2FZ<6RlbIUEN9XMnbO^G{(z1>E2aa-z3CP6&BUZq$2J)LTMA> zIe)QmH*bM8?%|CT2as{uo{L%%IKjv+8BfoQ&KA$RR3fQT%q%-bGCt4Y1T3!jZ$sY3 za`GdD*h;@O3nYENQ#_M`CD_Aw+Tk!S*MH`H$pw!*GyS5yE^yy>nL1zJq8Un5cNC=+ zo}jR;X<)6Tj9v7Bf{7U@0e}9za^d&{jv2WDdg4Ue={27_3sAALQ;R*kv9Msgu0KG# zaC^hF8kMZv6W4;l`VT!#r)0h~XDpN=#orlBM?zX{mpY`nScp?=zf&H5?Fm`T_&w~N zDLa9|4Z-KvCHk!k9EJOBrWT*L$DuHaIrT)2I6YjvXX;Rr8V*@e#~s7#SOxt2i!fUV z_KYks{u-w`CLn**naem;s-YCr&TJ+MgVN1>F6CrgeAZ(G2Vx_?GvBOy!f|p^kdMeR%-_dmg=C+&Od!Uf#|cVfvCP zqxifQk5nfz%n2pH#x{=K41cl|`Urj|@<)og)*1d%#GH6U5gbi>kMU9G6lk!_JG^KX zgkGe|1{8e}0cM^jI#~cjxG-t-|n7>>5Cn`47;?o8X#^*nq1j?-JV6Z?d zqeU2HJzY+5)}}2g!OstFb3~vzeW_icLA1{NrpbutKUFrZDpfXJxoXN~lRk-PFxkoO zF*9?!saZzchms5(>34`R35aomBKv8-0bkmo+dvoF=EHsnK2(Ocl92H+;_iLAV1Jn` z+2#^lr{dUq0nwjq#={cLigJROVrA?%iRu;D`6fMgX-FGpo3ar%r8Z@rre(_wEdL;9 z?dgNc!yVC=-u%0MY5H=PB?)dLHxh+3Urd3;Z`a^FP10oS$jG0Yz8s-Z6=@+Z0saZ@ zXr17MCc)n*=6?Eei<2vX@d}I8`BK?`RYtX)-kd()Bvbd9pj1k|&LUXub!J9BXJ+@G zymr~F;qP2?dTvRSeBiYl9ou=8DP zm;j#yIt=32Bub5jy+fLRCjOOGEqw!{LL~J~!Y>4TE&W=n2lM!Y)E7kiZV}$^O09dJ zwH%=d)Lw6Wv@XV+(%Tnt>j>F~PMD8C5HoVmcz_6DjjqJF)^70WrC;}63pm|~!9ETv1ZmF$P0$6g^9f&z zwEYB>*%>;7e)32C6U&;Pes+APCB$@&+Akk}L)tS*Hz38zg8Va9HzWnWZv%feX4Y-R z*Q-DHNepuuAi`hA%OAEi0JzR-4z`=oVrz6dV4`kvupLb4@zvaoCUzbzD1?*ua{6O1 z3>4&aRib?@INd9Kg1W{N4a`41hmvbUB~Oec?LblJUcr*RRo71?W;?Frjpvu>KWT#M z%A>rWSMykzsSzf#)98q;o5YL`tQT;Q1a|;G_K34_8K>U60M;+W0l57pf_*?z?~K%U z2P5-BrMzGz`AD%KL_yC(3($cw?Ud^FTiHj%i=W|DcLJaImeM*f!E~Z6&|5tki>vrr zsCFadkobLpn=iY1-G*cABIU_O!i(+RnrIN21;0W3PpQsakrH3wgh_xg_hFJS9AuBz zhIk14v|f-&0SL5n4v+--20n_^LjF9@0r4`L>*)Mlml1eMclxkyC-^-pJY&wy#xO5? zmi!4zfG?@z%xjr{E@l&Vt^c4y<+mkh&WFyWDm3133SvBgAb3hV^9C|_iZ6JIP}=_m zsfk}u{mM+?6Y2dXmqx;ZzJ3YufW6|%-MqSO*i`t^iOGEh2B^%6GNLbqzJQL+03ej( zjnqQmd_k_xw>H7;1ArmO|84p4{S_Y-p|=cA4yRf`vXSa^n|m3fYL7qJ1YAr53FGH; zaJGfMqc?uTn|y~W9(Bu4eZu8`xq(9xq$AdWTH@CJq4{fwzvi`W?KS)aL^k*^?aDV9 zs=iaw?bk+Z2p~Rkzfm5euFZQ5kwVOov2UAXIFQZ*$S^9OY%8)U5ae4Ir*(o2d`o`E zLC0b7n5b5hkh#s3Gxrik4SqxE4AVVjZR~aT3QX;-DI?vi9)`SIl8^XcR(VIO=HBx^ zblW<2K*+^Sea~(ynd%~(iQ+{Yq=d(1`&MEFRHC@F6*7WO}|Nm~Y z{R`7S&xZyAqDrVC<^sg}+`aO|!ifeFLhgX6Vn~F_h~uvN^@4PS5<+nv^rOW&i*hlh zFUC2O*sRT^HOjcnJI6OBZE`@JN@rX-Uw6)RKEHIgH_%9h+}7~#oNhgLefnI#cMT_e zd%Q3LWelL9a@+q4pL7q?)}=~Gq2wsY7x$02aRjTm*-!HAkOW-mR_(F2499qVx>xxx zmzBn(+q2XA(X3Aw{FCQpmc1SIOhcpDn^)zWp(Fj8Ye#w+fF*&<7_(6T`HzaE8KR4J$S67!tvsdL-igyTZZt(h>HYV*DmiQyQG(O;k96S0!%h`eltT=VhL~J z6OcL5XMp{EQKpXZEj)YIO-~lV0&j;eXqqx^W%GJk9l7Xuy`su00-7EBL{qZU+?4*-wInxm-WNvLkxn2{7Z=TlLYISmg; ziYr$Kc-e(5vn+Rn(a}k%@)J=Fh4X4iVTC;*Zb_v08dF&J63lmxHO=W$v=XAxS|*i` zG08RraK)Lan9-9gxT?zl2Ug95aLshgA(2{!HfE9wn7Mz4Do0PCK@h|{*Sj1!&8M=e z0buXNNLuSPO9m5NrELzC*_cF$P4uxbvZKPiPtg7fL`4FNk~u39ql$75!&6(|LG|C% zfcu(b56NP5VL@FSAF-jxa1~AZB%j*&qzk%i0`PrJI{K_OXWrAgDaW&kL~oEyJTR+v z#5qgko+{kG9aFerd*+JSAiDTqy&a1-D!_JDB-XbIS0VQNzy`-q;mnQHhh%Tfj}p^O zI_2;;fB&>pFvsSVzdAQ~d-oaZ%a5PxB_Wu9pI*8=4W>y;F3RP6AL}c;+v0`$D~~XU zn>BNYnN__-s+XVj1Lhk|{b;vKRwKoTQI{j8-}T;@$n=c3^4HX;1l;uC^i%L(Om0TgLk8-_QcFnDj_!ML4IIy1*nQRxhO@^8la-k%CJhk zBo;p2Y$0OD4Q@UWB*W$m5BEK2kd)jcn5zLFRoR zX_+L-MqZ?Vj4d>(Bii4(KfML?AGKjZ2mZe~sAF2Pc+UoFgt}A@M+OHY|K(h_HjB!t ziX6FpS~eXY`ez)3BmG%!9e~&|g;Xcq{Tw6jVmgk@a8#fR;bOh_p|m{tNA5ZiT(P{067!&Y1^GI1XK9B<-Vz7pF*3 zm8!-gu*+);i|b^N7!=ibyE{R51NWk(Rj)Wh&FW8dkjH1$%=wn^F(BW2HBg72+^D9Q zLFa{6&TP?L%g=B{b>=}>_jQ-D@02^+OxLG3*{SZ>Jo(xm93lDD$CX`)lx#SM>S!m( ztfvpQ-bqdFZi|zVe)P(ufu#~p2R=k|4kPB&kwT)_y|&6$*Wdwb-SSvW@}Al>*QVZq zgKds0qRJ07chh-`7GPCurxji&C0aGV>x~nx!^s}J5AizY7);MM1Kl!}8NWSupH-I} zr=;fEH7PqH>vU1u&kd-NqZb zZNw|+Mmvt@rfn?xB0zLM+~?YN4-#X5_n2`9bF71?@(H;B1=J5^+CQSg9zN)%6zUQFp7F<+oT(8j0cQEo!aV+3g;`dov55WWRfieby-~`v~ z+WwMk!Jk^K0Bqn-tfn{sD9rR^p$YLBv}?#oU^&%6{=gysMp&Z=X+>M_Nox69aYP_6 zjQEvI;E!k+r=FSDqS%L*GvHr6Btdg=w0E8+Gr7F%XTu0$t5=3x>IBQU$qqy=u>9wPmg z$a)x48xZDX-sHo6^%CMPcDcjbXSR>=so@VL@=6MF_ZvUfNL`#0VMlZzv z{U%0&Zt%b!ayTwfNTUjeZ+NGqvC2EMX!H{Hk?U_lx4q*-0M^zDd zi9Gkl@6rr`Pm+@@EcAs`kaP!ePE?RJg&_DgV?c?`0#XR7Z9YdyGMIGvtKFGHXEDKm4rZ&@Gnb(UprraaF^uFfZAt-H!Xr^=!T1@M1bSY8>`=V=w3k=&BunsR__$ARHo>pCv4l3p_(u_3kBa>Z2~Juq$@< zpEpUe$%b2;zRx?Ai?cTtVfBG+!ZR%M@mwFfeq@S<$5Z>nmC=RG#YJ%$*B_;Yd1b!S z0L!Rm;77(NsE#trID|Wcew(^%n)Y;`1b9uyy;C*L^v;diJki^uCUj?PdtK-aXHPzm zzx>RxkE;V&rixdjhFhggMLpQ0>UQ}n*cq%{8T4J5)JtMxQ{=@ZZwaoOL|G2r-+1?_ zA-(~V)e)Fd^4i&Ac!u60h!>b%tv%E$M1dC6arP_w@?pCs_*hOBn##&&KO6xQ5$JmbTDqcAvc32{v4}SkY@rj^io}1b~ z1K|ok-X7ZjEf{-FVgaI*wB)b^QNBdube0|!D=C_qEww$9>iFA`xU820@_DgC*8W7jwU9q`T2c;)%(i*6(&aA^LHq- zB|<47^>szHU&4Ni))MTt`o{uw{`OQ5RWz6BlY)|hP0)IKdIJbj>8*`c+Z8>`3Cd0< zyUyo02iu>maImtB*H&mwImxuQjWKLSQUCB)WcDPwl$U3mf%$wLcD8{RSihy?UU$&) zGYlU~i|JbNb6g&OHU$GHTNX5FWTAA%HM>>F#w2zK8oCdMNk0`vHRXpZ!wzm5T(HQP zLxtudD;3%@AD~^db4tgi_@LSnJ5}FX37QGiAJr2!o(DpGUn!=mDZ2Nrz%xBr5o$DcmoB%*|C@se1q_>ho{Y z)RXLY(fLNI4HHP6`3m<4w}qPI2bc=?7zEgRHyj9;8$h@C+f8apXSDoP`9A{WU%>UH3Q97SUoS0gFyCv2*%a0*TN9Z=9_{i z?q_JYMLg;thDBe(rWgR_XIzSaFpWbvJ^^J`oOuoe23=oIE0$tZpPC~YfhMkP^!!-1h>mk-8j2BmzsM8tMugBQZq~ z+|i^Y_coC%Poe%-vyzLQr8;fkhSf7Ou8WCO(Yb z&|$q*vLIr-4Z`n1Fv;xH%B@@N*&c_i@=G5y>j3m zp5$SFZuRJy6vB$I;4z+gvf;nEP-U;x2{EX3F!yDG8-|XontUvQ4cdAGgr91`7L}G5 zaoH3|u$It1cQOZn1m|rj-}hwdsaw0oV9e=V?3*LS*kPsXadJeOtL ztwcXIdo9#=JeyV^Z(UxcW!cO(ylRjj_x`*$aNRE^qAzdI_`dDewABo`^n&Qq1_(^Z#URHTQLe?OIrinYg^ ziL4@){WIGo_T5&DR>qg*7n{1~6-hF0DGe2#zx4E4g2}k{Rc_kR_`-rig`L&av!$zH zJ!{vRd^@_Th+=nv3m9RB&GaSwqP}HCiCvc8E1rl7{ss4Ei{mi|pqEt5rMD+~KC=eH z@aroCNHO#_3}x`;GLIfo52cI5oAUugKQrfoA?YjwhSP4biP`f_&YNq!EDb# z8+niPEc({g=M6Ls;FPGHnnf@&TL{Zk0NPpwE-^;nRG4-RqWGI2K{B=ywmuiMwE%o{j37qhz7RoN!B3h} zP?2fGiBwz#EufDAN5^)@V&A_sBzsu#ky=A;W@y!(FN;Tf1d!4xSXefPN*35X=rh+~h^N6;lhX zgT6Q&Z*eTptNBmvD6i2 zFkZG+tGxc_8u*=j%^~D^ceb&**G0Qekp}5@=_j}?565jn;eFWFSHsBz33{n%mA&1V z&S%HbSI*t6a<55y#bzAAzJU;^#}P&TE3Ft(Z$)r@H)q)+;w=(@CiNLuEL5{^{^w%epGCz24HFu@ml5{XQwLNqudPwwM)NlQ>>XOh&hy<@r=#(3X4s2r zLMk-c0E5dBBkm|Jng-TTx6ItV(g>3p7J0KM=XzaM_=PK5Uu76hnz1%K`aE^+CNa;E z@(gz9`wg4hD<2QQG?B^A>^c62)3zW3_Y_{}Dx{a2d&30d+^Mzb`C-hXopu9!_R=kv z9Mz(@>}YyFnCG(v_HzkCCUHnYS5`J{scQ|v3W z&L=7v9FS<%h(q{^n()mQJZ0_8y~{#iRcA0Le7z9m&hUzopN&@KNN<5Bcnuzt15D1X zFC0E8wgVS0)|Z!d*lIKY-?o$PpOHmO&OF0_J1Ni~nf~{|HqWmmuFq!U)IfBvEzQC# zRifiES*{|{f?1*C)^05(9u z8*)?x**UC((aj2Xv6|KG&n@wbjyGYLWPaFx#LM%qqM$y`pHaqhn)7*MoAY?fX+5XA z>k~+RC>$Jh9;-g}lw3lMv4Swl1C9($IZ=g%>EO(_VU)LG&z-H`eGnb4fw1Lp&2-ac zf?T`N+RA0yEQru){5Erkt^dHe9`G)mMA&(z1xhd8|K{3Y8d1`56mQb9x7@0A*caz% zEDfP08$k#-Hqnn5wgVo1E^IsUXjXUes4z*e#EZmmACWu2iymiJ4@YBOdgAYaCn6I0TyYD?Sw^j_4n1)YlLuHZ$ZlxWw3w;JdtqKrJ3Qg znbaWQRnhe;iapTZl1SqxoMCa0Z6XB^ii-H$m9Ph-8{v$J@WO=SfU;P|;0DBf#H!pA z3U9Hu);xfyr0L4@DNrpYu$0X*eC_XFMb6PAK?nCO7(D?9fui|1Nb7rG>Yd1kKyFyJ;PwkmnP;4_2f1+$nojJ8R|B!>7ILlJO z!p1FIU`-buBFyxFkzz@)0JSkdd+RPWv<|fqOl2e}$`?I#R^}heLfA=MnD0(A zlsjxMMzI~$`@5XfVF?96N>pOV3(2_R;3Qcid4|w;q%Sq7F1fEd$(NnvKp zL(8pKTs(MFNn=K`Iaw`ew9+zTK{E8*w5whqYek$Lvdvs8X|D2$Mv`L#a;-k1HNOfC zmNtd`VWYIEu`oTzVRM0ObHo;D7IAYSD*;LI6eyBWtYHyM7#lA&?l)!=bUFp5oUC#( z8jF`^2XaqUhvh_RGu=}*fXULsqUrS0_m{SOwbF1sChH!}*+pMAx>03KUW}BGoR58T z56BEn3>xl4^{VOuq3%NFs0y%+I6@#rV~xTxk+q=$ZO&5*u>l1x(NvG-nIn(0Y^;@x z*!#Q{lM*mTnj`r=KQ_r#@uK&68Fo{XOc&^{J)?DNc{6*+bIBWuPh8XUhKXW`J@*uXJ)nzNOzPz23O(FO9#P z*!*{YiqrsQh2e42eOs=V+{jt%P5BOi^;{#`Zoa0jF$x&>PoG8OZ$KyXQ>d7zITiHP zUUuX=G@ib6@B51YK*-HV&e*$jhuC`pen~s#+@zU%F@GKU$)MX`?xxHiMCc7RC*l(Q zfl<#&Xj>njzDWyu4nu$U*vbvpMbA*VSM5c!mz~IUJAz6j#M^N&{E4eYzA8Ft2kKQUo0qvb?O|hq36N zYs6(u4T-BFMLJp7t3PjH!E37^%pBq0TiKf$czHVeT_4SOK{5Id-4;65yD zf<6?sTEL?JqTna&FKlZqZr=&P(EFMX~0`I6kLp?a`kf(@IvqK~TmNqzU=Q{0^ zC+#Rh%|7)d6k3b{v}H~fhxE=U5w%)n(t*E5jWR12kYcIIc@;Rx_3N_ED%L52BJq7A zSB3n%14xCOc%d^mAv?iJ8w`>&0X50};uzI!5rikxLFZ9<(z~*LISorS@ASDY+p)i6 zssz$063bvdZZ&kkGPhYESC}UoM*r#tSb}47Vf4*Z7QX!@os%;_VR|%2w{MNvx&BmV zzf$)Z;6$NOM`zSevwYxG*f75Gg1fhR)n#IxK1s$N;nqiS3O$N9&Gz`aGpf0>dX%Yo z0Vtb*v{!X#Wq|I=b2UVVX2#dmFcuTfAiDvG2saMxEm9r>>O!`FOCvpG994*X#V*Zc&6#9jcdwK_a0zpFeUv( z-}^^wzNW#Jh5<(wPW3vTYCWFfb$dFlvD^N|a>D}xBF7|tO8S?#GZ9YNxy3TqcBkyG zPq48RCl!ZbXc9F!>}@l5A}qGf;fUM31VGPoINwf*WZMOzj}I|>?wtYyfsZO@S5WJv ze*b0eRwZ}Jg#IRx*|t4_c{i-*5o02HU%bW!W;-SErtRF*$m$|2kGAS>6-}RPAoGF> zKjd_Zt_7S)LN7)jciWI|s~6Q&kO_>L^<>=Sp?Hxn=aojTc1hm51~5%DLRmxJPv-?g z{TTZF{i_TIbn-CN^f(8e4q43Xtrfqn=?7 z`#^0|IdSmjqa~xYXw1>dWhCx$0-%kr|0x`z5F%YS7c>0)L;@**k9{m3fdRhSB|l4o zJAwudKkQ8HhW^0b*h1!vKyHug^$5og?jSD*N&HQlH3A!-G%r%{wG~l z2vhC+tY>pEkL4bfb{!cwAzKjS+ zQq+;c{#hao8V#;8GL7kbZjqFtl(r~(Bt+%{DE`oKJTGh#!IvYZs;1+SXo@}7g}|V1{&->jgF{qI%Gj^GHuM%Y&0nf zu@hyJ_)`o|s)q=cde9>Yvd91AWj?o_t@0JLjd90u^?O%REF6i#PPW4HCSo3KJ(Q_D zlSy@>J{tYe4Cs;%-pyb0KG^p7?SKkSTTldju0%Z*(x-iUpprD3=wL{`;g6f~?jF{{}UIv5*^(hwOhr{&$lcR2(+mNdizKLn*F+0t^kc z_3yOJT7tcPGx3WJ;R^_m*dmh$njnOpoaNDQ{geE2{Ctkx!#joRjGKv+NumT(4VSkK zQ)1owkx04QjZwYIaVQAog)8S_2wVe=$Q3gl2*64!YYkxb$Ck)T9c3loScF25R5xx^ zCc*%Bz;S;<%JwoS4g%1#WE5`5DV}yS@*XEBuw^i^LKUsGHk{)YvUOEw4TYfmSyw|f z3{x~e>G2|e0C(uN(KSiwX=^)oek_B00aHKl-OE%!1n0 z4=N4C)ZR2yvCWXcskv;XXNw{@v1-MQacD!HXQ$y3mV z2;~;eguNokdC;}~eINUNwPbySvbXvPZe+DJZd(n;m1qx5VeBl$!>Ne7;PP+}pwp+T zM(55Re95S^qcbz{x$GY6pi{9TW~Wh287m0L@?r7Jd>(AOL=!n_tnj7w1vP#B`o zQ>dfPA5eP|F=u+Z6%o-81#5#87De42W9Y5vp~YmggpGCZyEa~M7|FQCoN^wdCieH> z`ddP!h4O^WaJh6fBbipD`DgL+Da({~TOKfI{6rBrF8E^?~f zLf_xtSW$667yL~gT7BLZdokQ>rMKQc_{CCIJ5#Zzth7h?`>GNMb8=73wneLtA-CyA z+wZJ~!(C+ENmd*s{aRZ5;irCt6NAMpiD#viuCx4N^u@O!I^kM$REsZ?1@rf)S}(U8 zz@X_&`K_?blRL$!^E5dp#uX{L>B;vX=S>XckR5N+^$d+H@21SlQBJ_85C{TU*&}x! zL2=J@Re|4q3lJnQJ)A86{F#}D9M`o$wMnDon(i6Bs84rq!+w@sPsS!ofB3Z)qR4Y`{~6iQT7q=KRuRIk5G zqO^Zv9GotlsCT2MEsh#Ph3@P3y)(4j7lqBacsXb+!JS+2wOJdGLAt z?;7a9K}!&JADW9{R55N=N^{u3JZ2L$?OAcT4RIF z(JI?&4IFn6CPY1Ww_t)#t}Z%Qs z-%&;~o$dijOVgANKOLE(XX&K7^o$^4 z8|!!j8!zzs0BbLJ2e@3Zu|ygE(#&6oOz)sUKBDaJ{(MiUB`4AqNcuo#KmbxY<1a~V z%2#Ry>Ck*L2f7w6DP3cU-Q^}PBBH*o*AB}^mK_t0m|mbXnArN}n2`+Poog5UR`4!? zG38#TgQA2UesBBoba}71$cV3qRE%ps(>TWgR4AJiz{1)eb9@EIJHi4Y^%c2+)ta_= zBo);&ae6ukZR|pV(}+~IWL$orbxy@a2z-8}$ubqx{v?583{j9QBk^~x2$iAh$Uw#% z+6dXZev~jHG)wglqp3X>6^}3;BtvUc2j0q$|EI?mRMd!Wh6DsOMD^e4dX6R302p`W z#U@?qdya%3S6m!W01pwus8KwSklziHh;kw*17vWBySQxp-%;t*G$4i2`~|8t1$V>z-Cxr`=C!X%o`$WKaA17rb6Iol9%y zx7ST>TOTj2$RaEeaz}IUZ-Cbiz#l&R(c>DdPui3(S^V>ZJSDD6{kgI*jeVRfXA2!J z%!{Sfe%-VsmM4qMjA5?hQ{|pu*;gK+{Wvbv+ftsXV}BmH1Lgx}&3&RQ_!|uTm_-Yo znE92Oc@n(qedfbw&{t`ca0xD*{sbRw8e+3iv+zji$6FTj(Rm;5<{@Th05n6y0aBEd zOS$2bLt5kE9n?rT^s6#-0M#zH5?_OeT$8OUUQWN$fl}_Rb{3jb)6l)M=GZ-}ZmvU= z?6`ZLY*UALD4JD=NXh*mw3JJmyeZm!E7tOva~*^BkdwDIxhkieY4W>yi8!YoANq+m zVNLATA1u90v2*vLm~&QJK$<6gMm12C4} z(LUMgGI*AzN5KQzt9yg`v18W18&s~0j>X~0e5jAv{D#3QKHG#**QfyL0pm)@kScSX zk;uVHjQLcRtXqAO4U8D@ejAs#Xjx{^n7R-Mv@Pd1TC28mSRQ4F~%&3bHMvS4&W>y6@me5{h zHc?s%UM$59ffkKeoctJ3gV^oOLN)Nr8^GY>l}q9aV_3^A%qD(oI;IO_u@O8Y;}|`@ zQO;J3S#_3=Yp4}ifM%A3CHn39HrLCw!xR>VS2bH^w{#VqTm4ch%O;KX3e^k;b5z|C z7AiyP_Db$iBV{a?&Q+-NjUj!ll}NWgb^V8F4G|YPgv=YNCd}$BOh`5rmJ#W+gcaqS zD3y{IHYN<#t7CN9z}aA?6ez1I_!~A&Bol)J*tH<6*}L=;0F-9+EQN|y^5ksv$TTfsG@2_N6j+FTsZ?#!qVv=ZmpC*jHkc-?Hm+vP z*(M=K1#03+Q}ZlLxUuVjT<$HrKrAIb1G{E35pM~}nm|b+dVa6i(RoU#)T1P89P7b3 zYlU!tRJwpYV8jaV1*#X`8YpYrja_ThZvgKorBI>DkF36bH;g&44+_9Ii8+Tg4{n0c z;$CGB!vub%`*$XsWM7TuI=9O&&=h&HZ%tgNc^n0vv)5vzwlP%sU2utB8qUlX*;K!ekI&A`LyP5>PEFH#&z1suY` zeq+2~WG1k#TBIsrr&b8|gsk<3DGRh)o3JW|jGz;nwYTFNX)Y-$4KP-K`T)~x)oi#? zFJ~HYL~w|nXNmq)5n}_K>_drHadQJQqOBP!(srmZ!NZAo<6t;h!U!H}6Odii80u); z2TPMG0Ng0Q%&L76Ze_(HxQ$@JC}>~dwR6KZf+@};9V=NSuDS&@w;*^#AX6CkjAO*u z!PgOkg_t=p*fINe<=>@6gDcbYbQ{6po2=xfy!lvK=e6K@#{Cx0tC``1eXi$b@!yEe zr6e{!IwUCd=}E&`LTkS&c{s=hMo-0?Ezj8)0Ein(33Z9o^(H;2jMOS4?*Ckyn#1LW z;E)=nCqr9QDe;-6pMM2Mj2RnAWx0_g^lvPbOr0oGotZi{phn1Ka66IBKg8z==AwWJ zOkJgcP#=$vIR!U3%Fo6d*9oW}korz2meXMH^$QLL*&&`>3JKXoI{(Q~=!c4q!5qj} z1Ylq|qi@>G2)51V($Cm{Zwk6GMakXiE}~vvg!dOGuNp+maM;cuw2bHWcOc_?%JV$~ z{f1z3&%?ADCUe;1KB0hdv*=jgvF)164LM~j-ph*)5WI*R!qPLj!P}ySwu95 z?_-pfuDHMMO&)@8_d&pRC3WlH*nIp6ush}kGAETXDuN0hOfmuA9)$=xp$oV^5(cti zrJrY#3K_8Q2&)U9OfnH4XW@`h%@{A36<^rt&wp6y)xd^r5*K2AazOx$?s&cO0Rpbk zg?W11Fg^(Qjc@wBM|SAvdBJ~<^0M?E*r|d1XAJ>A#uk9TUqc2$gxpQ)+m*Gu)1)x& zACP7W*WicUA{*w?O_nnZ=j-2{ya^~3H?pUJac$@L z1w7#W)dMoEy5j*Dm{L`n1_qXo(1K$KGm6z$;iUU75owhu$Xat6AxgUrE=Q$O5Qinb z*ZClG@vtchgwdcWB;?GT&W1k`fpwE|I2wIeTDQf`KN4)qvk7|+BziV2O+YxYg_TSt z9JyG!O}hF<^&IBmwbB%E&oVuw<2B!E;KehN3xE?Z}Tk;HClIcJEIsXP>8GSS5qrVWGLvSS*hl|w0^jUvC+BIET^^?wp>Bz61Zm-Y61NP ziKJInWC>J>f0*_uT_Y7&EnzATqOo5Fm)mQ%=>~zk_^{!*#JZ(ncj>-wb0$Urd@4Ch zM#fyi1&TTqAQ4rkn(Z^+B`@a2RgPT?$7v_OeRHu*>cC~RKcXmRj#W!OF2k`GRK56N zAAKG6AlFE=BqYE;lAw`TU&53u+h*djT*Hw)+3Wb{7pll#Z#i)b6WW$4Y)vxbAc5C~ z8UydZ;lJI@ScT`F3qSHcMD;~f0tnyV&<%AW3VXmIf&V;UqCrn*^(0x~ugIyysmD7u zmM6&XiCpP@==4`CurmF?m-|kqvh0x6G(=77JnP&w2%{1-s`mC(BBbq?STDo0ZD6%F zW~yq$W^h{9$=c?kjY@kQg-f0??DJPDqi{w>huZHBoQt$qZM;;J@(B4B4w%ra4@eCi zl-(+DlVFmxJ?*^`pZ!Mo;t;3)6i~|W#q+(=Gj}uH<}LNa=3?||(wP-Y^JI^?rl5Oj zbbMn{z21dD1ghBOnp2$S z369k7EA8x?IOkwnB2tuE!GKeU>asj|r%W{Fe$#jqlJ?ep($ED-S7fJUfIbO0r-#A*Pd-OEklweN6eUh zEd(|k=A2aNbz{&~z@Eg?l2wll11wq4IV-d2$}>2jYf9CqiD}{s$R1yzK_9f%NBO{% z-cpMZe}v7*WsU*G;3`nal;Uej&ef4|$duGwmf~}Ncf4scGn(NnRofc(s2^C}tx5wA z96TV}C1b5w3x(NwGJ_a7Ghi%~_kUiI9}tL+2?k*{Pgs_vUJKjW=Bmq7O;2Y}X9u*; zg=9Q|&v~GIv--v30V9B%aLHHQ%OZVE;L3_T=?QheG1m$BCT>e8nW(VyNr_khHtm** zMM6m+E3SgGx83&{-h;)D*O7$`w<@8Tw9pz1&U(ECUxq*il92&g2R1`<8_CdtNn?4h z(~vm+i6RZUHK#eaM&2L4y*|66EoW2g>yqj*%>_m?v4{+oyXm|e+|-^g9#)H5A+-*NeXg93RLTenD!f{azEm^ zo^kwju1Qz)M-F%geNS;oasYanPUi*MJ(l^hiqP~%7FBf*N48svUe|)5Q03i70XKP# zBYJyj^>oM};LYl|wEK4=cTwDP`TGVN)Op%7$kYpf_EUX5NNHpY+G`F%Er|mh`lrW1 zTW~l=$IayD1%TP(qQ?f$!j3ghAeS8b=ycKY!C9m~e0x6N@6mj^y50$=ERc~-t_+u1TYb|uh zxQE{Y45kp~^*fKpuYYD z>KPjR#xZd60WN8cH1NI1gqIwZW>F(p*xH7dN7~+m>o1*qqWQ_&=BU*T-7Cg58NqG! z{eef`r$9x2S+v!+xrW>{`r`9o$rQ$pqz^0}h;1BF-!eKx?cVXP6W4w z0K#V{uBp3MWI2pQzrfbMf%d^u{Al5TG_e5F^zyzvqK0F=xSzZjXyLbtydMJhOUEb0 zM@&!x?e3T6Jv_Vpq;&`E;;Mx0(Gm20i42=`Dv!C103dPdat};Zdya|O^wRBJ-UO zKG;6dJ>lQ%N(zGCbJGH%obx?Sdm13HhxY|L-@z^ijb|Ky)`9>6=7R5$!D=NB8UgUJ zHX$a)^Hkq|LQ*9*m9B`NgdtB>3dMQ4L`jmCQ7J{-J(PScsb+`+%k1BpS(O!5;f~*4 zioaZ{+l%=qML#_$y3qrlD#bbK!v*%x@1wO$USP)LJO_($m%nwJAFe{%nxJq zr@aRnL2CT(uv`Q)Rn63kG9rlXi48*gUSz+yY8-uMoXWs{=~DVUc1Hd}{4@zLU_lmT zJ-RNMsVLSOMTrs&aJl+`p>gtF#CD!dMGc2f;oOY+s=kyICOpt`dyxO?xt!cPv>Ypv zKwP(}D$Ec&cO{BXn`;sDa!u3|b5X$j)_=fkLa*YnDd48rxdrRk87C{yMR0LEx1H!x z+*~l^2Bw~?#c>~OaXjFevYv}Fz?N|0iqP&v@IOVu{$`7ccJ{j%f z6}<^gHP0HjMGrq2G?BI$z3SZSxm?AU8~1yD@B6i^3IQ`y7f`US>M+5Fy|l}W)8!7w zhq05smrMY-5Z`J-4YX@zHU()Ox)B;c4wqCTQu^Y;UC&yNKu@PoQ5px?NTeGTcYeJX z3EGwADu}s5!;fiWSk9?YZu49Bk|(*BYQKk6<)Bc3yS`TVyP<)=z#mCLIW|=mhc1dDjsz>H=ErqMadW8J5mZ-m z8r|l{HU0hUY^!F;_dcU8POX$_fDobPD&h6R;p%&SFu!0c>4)rAa z@Fs6`7#z}xkIQrP9-PiPviWy_#02k>ij z+qOWo9$xm$Rxhi-Tj9FLc{xCoE!?Ia-~5!+`N%M#_RX5GOv1@EW_LtePixJ-%oTT2 zj?(EyCMBsBfHk}*Zs$LZ+&<}YJEtx@6iWbIO)4TFU+;L%@J<0)w|v_ z#pO^z&5eZAE;W43TQsa4F)@;X~CPZ7@6>&(uc%&3m4OyjPJJUP7Ix+UZ-2Mi3>uB}URp3*=o zZsGc6tQ3~UP^{$PaypAR&g9!f;X4Rat{VKXv__p}KvSUO4p^gYg65)g!xBXpGnDH7 z(%F#9xMs!u)+8Z|$7v@Upn}<3H#$xJb?u%cm^QhK2fhwr%t)cj(M%#B(mXV0{w!`Z-aN2@=v`LttSOlXWR;Yga+fy!qs^mg_ZrlU zVM6IT+A3<(4djibUo=HSG(q7kwEgJtp)iE}um#CgAvTk@AE0HkozJ7$Qoz5 zc-oHXOoH%8Tf_Ov8q>|A6rtUYo_{EvBR)N8*<`A*2mokKjyd?Q5GM(PrzKR zMvX+dGT&h~i^7WYqBrR)-aT6ug-KgAv+)-7`RFjXdH!poFxuX61C#dmB~J0*YwOPjc^pRJ~ekx$5X_jmKr?LKU*yL`Vl)Q6h2~or zGP#B@1(N`tz+kfvoIw}n(-`^Yml)lXhZ7iTVrB4jS?A=dVm}jN&3pO5HTlD7&v7`z zflV^$A{A}~QJe5rsPa_bHQwJC60ZweyN1Em>=Y37HiYnpRxrK$d9$UAi%${LA;=pQ z9#U=b_Pf2Y$-a9z9%EEy5WD?b^^xq0zJ7~x1!76SMGQQnU3y;fxod!P$IZx_`*RDVSQ`jfdq@2(6ivk~PD^Q7H#}8fv8i{R z1{HHyf}@7u$k>WKulhA@M~8mt<%d4UOx`|hjAC?t3K$t){(@}tJDJRpK^n6*H<}2+ z^o?%-3Y&a4Ujk_bER&-_=@}Eveb0)P?0L1bX9CW9Ew1Zd*2KA!&UnN(zT-g(`F1`g zyb$V`(Vg@w=$>h&=csDh;+?bprd3w=_-RE-j)zZxUxt=U*#X({jtl%DyfOp#Qa$Xs z^fq`=ag@ZSBL0QKZ4A#H&R8~@2%Pzt^|zM*`OwO(nTHqh51Gi_&KNMEh#K$o3d`H2 zY5Kt%YgLHF3GjI7`OW9 zwtd3!PejlgYWwc3qFmGL9BhWO;CoL)R? zcp%I6q?yx)6o<#X$e2x0?h|PQ4B519=B=zcPnTOSGuOISo^Q`y4{u3=#ZgB? z*{9GjC;daEYK57C?PWWweV26DXhk}cefc2z#oZhf14ADmh~T6E%rj|rGa@A4Co-m@ zbjZyH%iJmAN6X^!J8DR+%4k%Tv5fPwaU5!i)H!C`2AF4mT0d6>QRp$$MBFm4xW(U> zc29IeUuxsig`cbF4FP+zrs_WXNOP)mFd+ym>jpRUS}C(os^;mNHmHTiB27gW(nzo} zVIv@DMseTcaK8-!Y+jinGsH;CyOSfywi@KvWxXKL@r9hdXhdSVoTq7E*RH_u8fRgsK{EVjvPN4pI=_E{`A(oeIC zjf|cM&Atr}>>b%irT`>AtudBRT<_sQS|Dvzax`licqS1%z$YEJE?VX*iAKpnp|91A zM8xLAV-jF6G8t#K*ivX`HSk5qj3OaWwrPYgEpO4eO}_!cOOiqy5XE6KkL0X;kl4yG zp2XgBRh`;#i7SnrlO$ zk~-busWMXLA*SAF8~63I`e8SfusHV9j`qGlr`P-U6QPbheS7$$KRFlWr&r}w5Q5+L zU?K&%ZahnQVlP_Q?D95*^4>t{B?`k1@k)VYXk#LL0ezFkWVk(;Eu#`ozA$c~l>S-k z_YjJAbcZ^3e)qqgv(7*=^Kat{Ne5jfo9bX4QkIUpS_u$+4LQ7U+gEvb`t$_~3OUxthD0@q3%8_o*S8;2UG|uCR3Fl+7RW_4`KN8ddIv{1Aa} zvIk?#R*zXv?t`u<=D`+O_-^?vh{YFCjEWj^^lI~vd`LBSo}bJkw0mBN$`A(}VA+R4 z)tzIvB## z*f|W}!?D{wltHnOTJ+|_1lWo4X$JpZ-Nt|lKp3a&xXTWci52tyEf96YSb!nzm6E~p zka6m@#>4jQ#p?xJAC->A_`?S!IZ}TS+$Sl`Tk26{>dZJ*QPCc1C8 z+qLuEj~&9bwl)`RUXmR zkvpsfR~nD}U5`J166>o(GQ@+0`4H)9S35 z8hdU4Zqb?#JTI*DgCfebM3!z)@%(t*((aX$tOAql?!Hd&THQu1{3{9^U(UsPlxfUw zUi#gGO^iH~=8Hp;#-f8yLg`ka+qH`lg6Sk{R(bA85}YJ0^mPLeUWPi#x^=DC+r8zc z(uO7ia{Y!Fr(As%P?5+KJS}-Dl4w3kd~p#16uQ9`xJ3@mk>-9veK^XinxI`HrG6*D z^R9jxg1^#mW{trU{|B;#w|7tznAF{Xx+4#{Y zssGp8s2>eoJj4kv|5*p8?Pi<&1vG{nKn1NR!UR@!qXKZY2?0l=1{iG!D}CS_tS?WQwt7UnU2`v}I&-CV~nIpi>jQ*&_V% z+2JV#6S?lr$MEgiK;iW|_}K7d=bBiU*!EU=Zu$1S%$lbJpC1MUA@7)16|>QUk=XoD zBC)oW5*=v#iUFvf0aBd)Z0tVQ-~`AU%qWRCjOW$(dOfvXuSFC$ z!CHp>X0}o*H4qr}Npi(Rnj<`bv2*Z?1tx4nq87D9z$JzEnZsc3x$|Xa~yN#cjmPYJx{DeQ37xDO> zt}bh)B8zQhSJ$_bP8lcyl!qtvt_r;2JtZ(|usBcq=yK--nGm}|yAs)RHFosFjZ%uw zkZC^wY=zS6@VjZ$%?(K~xfAf{6vRv!svVkB!O-oM$PNq2W+{pkbR z7g^Qmx&El`{1U|603fjwtJ-<2iFz^INtsKtrR=^XuYG=L5<;p}MY($Pfm)E(6i?ib z>@x^DC#T^Szvl+};sh;_<~66))nwWn^lVx4v~5uw2@yV5q7_wZtur*AL88oJTTdf* zd%H0JtEir$V*A!ivbr`G|Gr&9A#( zjatmlqABm5x-FnX&N<xyKc|Cp#?jUDU45cx!4*w)G!|51QXBEIeR5eOdeIb#?Kt#VcQ+J z(+^6v*`l!HTIb!g!`fjwmG_uxV=+h8zxZQ5`m2vqDhIfVzt3Awy2A{SsPdEc_=u3_Y2{uw{VGaFz;PsSr{0B`W$SgBD&aZf+kH{iCpQ%wXcKu>F_gt1^u zG${Ho58jXFCJv`6X%Krw1z2B}QM|XqYbcG_cZKRDfwM+V%|~jZ-e16WqNW~E*;?3g zSD@c;%VE}|RkD{QMm|%wqymUZ#$pj7!w2XDosm}l*nhq!nGfMC|Gh&>4w~|gB>mpw z%kIl;e9{)*3QgmRpVO=jwI1pl-h8!uw`zKRZ2XzJ zbyjnf+F|`0Nf=wQ_FzwPB+1s?Og#yyXu}74`rG$px;2%9crJksE<0o2)K1!5GsXg0 zy7$1TyKc5eO`o-l#k=9ZBdnc_sWz;#Ml2Q_~(DpW=y!cjHy^VyM5?I^Br@a*-T$;sG1xb>ES;;LMq|dfe8M>s)rW z@IB+(p55lN)%%r)jPLuR1U%&X;)$3^W)+0S6FubK>CP_c7z&@wQaLF3v7pRqU}HeB z0j4AfSl@LkXN^qfYsBL20fwgKL_+rm&Y>(2=TYhF$L^rA3VMZ)P`&*5$b@a0pVJ1@ zF^^d9VMR2qE#$Znx-%pR26&etJJ4-LZgDoq(;vVV+?bEZ4HQ?QZ>0Hmb`Iq`pdr1X zmXzm7SH8Zr$Qr6)BWepbH+Ba74?Sf*2)t6c#YMIsYeLA63aZ+#02;|-sP$=Y;RA9_ z*nC!Qew|!xD3{;fw_x&R-B>&!QRunoJ!0kt21T2T^0sn`?P(QV0(!=l_ETg}Be-Xm znGkNUJYM2IRV~(|8~Di=Ds>1^VG~fXG3sZCG78c(l$*Ds>|7?_CgV9JL+0j6b2f;T zR8r&;W#fzcDMm@G0H}$sYm4DfB;ri2b=G1#S!EwS>Ox?y2}6qy2s4ANh_bgqo!G9M zNPN*XoXQ@81`wp)qmrh$W6`#dGcIV>4H!bx!AAVpDLyJ(R_eaECx!J>;@tY3- z8<+cQU_}{m3u|?-PUsSiQlrjQNH5gWp2xl|i$D+QFZvbtXr9K-%k&4PyOZNhYVQS_ zLMYE~YI33-!=ll7WTF(Xj^}{C7y5h@fhQ~mJ)qvg0EPXjfN*p8fQ$rP#c6$vftPX4 zmWrRo*(4pT*k9U7j6!{VDgBvP6xh4;{ne4nQ#e+Xr?A$T+Rpp&pGfqia^IbIBd>?B zW)?9x;>-3YQXcatj{nM-uYZknnjMIV$+E55s}u@kry!W5Ms^fazOw zej_W!GQfPb0L%i|FHIi5NowT{xDkR|(PL}g+JD=l^P{$`uXL2IP;Z$fYBN=}%t46; zU*z_QGFm8+=6g6P(k)hxNCUBuEs(Udi0uV-H7&(e7xYS67GY4 zgNQR-9g2?!7~5zIrihdjF8}p>6KYVJgvB;;vnmuUck99|M`Xn9lV=p{*d$uYb*8JF zWMEn=z!Z7-)v&4%F^P0#6xZV3w~tiaLPH^d9GaAeloyxm_`LrO6hzcmv@n}5oC}Te z8q>4J^FORh0Xc#>FWqDH0f{9y+Gh6!FL{Ew(~ho2aFo?u4uzjihMUI)_L|2tJ#U_` zPwkk%@*O_)YmQ{(n(9g5I1=FEqG6fPuWNzHHjSN!CDS{W!z}>b;IgXm%)wNTIVktT zyiZ^Wm5)x3L}}o@AZWzBKR&(oa0)h{H`7W`>HFwfrd6sltE^e4rX01BZfoACT2`rv zE5ZbNl4D{iSM=!lB+0$I!l`3wnI`-_wH2=i*I>bNMkdu+l0kI{?R$#J*Om&cmSnD| z`0Qa6y~&fb#D+qEwsY$QHHSAVHGXi8=8saXDl4e8OLE-f!%zi0YGR?*&}nz9VBu-% zg;J9};vX#*_FiMm+tDi;_2$5;jG<-7Ygi6d)hL-#eeD*dAt$ZEwi4Gn%C|nVrEmwl zkCTmTg#2OKZp)4d>7UNeJN!2BB`! z#p^^JhRL^)PV;W&$uUukLvAO<6wuhrlp5Z{D1yA5wW<~~>^*wkALmlDo<*ij@>8&e zXgA1g$HXZC{XfyCk-7pNN0NxlP13gbplM~u3{y5r_u@EXxF_syp*NBadlI539-i}>mez#8Kha&#Mg z@#?`<0(_;w?~!a;xVqitQNSk>GSbB#l1%#@AAHbghZSQy`q|`{57Kp zcPz@-Z-Ezzs^{Jk(`C3{f5kV3@if%U26fAP^_e&)cOi}-PLFiWeKFUQD1F~F?C?!w zt!iWq2l)aot98I?1W(AbNs>lHM=-n`nhi^8E+7sW{D>qNiqQMZwzMJMM-+0+7WXFp z3aJ@KNd}i}wQu%4SQ*SL*i#5SEV74eW==zsvXP8iMthz*4qiHaAv0C6E@lTjUYYbt zhXWMnI(kCsdVMs9s06-ljAo=nJ%~->P0ZI>((k?GpSa>5iT`d27%-8{{b4~pTPtW) z9P95nPIiU_<+b0zyPp+kFc2L(msQx&xd@m!553rM~JaSnOC{^b?L zYYgU8#%`+?O)Uj>Yj_>BT9@qaD{n)`SL>YuG9zR+?nI)~_44_7EV&fmHJREFq~STH z=*>3a=={<}>Z)a_DevE`7CDBG(6lyX;9Bp-B5oUyR1J1y%#TkwB5bP+^6}J9ko$fp zV+!Uq|7nAtm4#mVf-Ya}*%gG>bSlt(7nPEnXiJTZsOhf?K- z6bhW2tocUY@12m4wQ2ZV1XlEou23gh2YBK{nA;aJ*_)vHYi@j_gM89pzJhaucU}0b zaUl`A`UJj(PX}ZDY+4WeK3J2f2%%94LCGe}0z+FPC$yMuV!m%mb4|EAug#psG9rN% z-`Tr}cjAX*Pl#-|9zrepDOz&=D79u(_0-0cPkDsekKTN6RC-f3u|K~eW%~jn>xv_b zJu@4vNFZvf(LTupm*#zmL0>&jUho4wah(|H1NPsAp{-n=^|xqR0BHUE|IK&*BRPcy z$WR%7eJf|$Vq##EbCIY2)n6;;gE0+>luT%T7<>&XI#Sqb;c+37rpwSt;$2neP#Ub~ zIYby`e;we<`KU{Uh?OO`(`wpnhx_T0-RjlAIMW&!#`#Dm%I+H+%gLH-qeB~k+(v;37>tN2P^X;`%!th(Q$WU4$+ z7ej|knMs{yKutN{Kq~S^)p~l7@uM~oi5kv3&{tU_t~J6nYC5zB|2Pv{X&6amknbi! zEUHXx$I7&GZ(dE1LGoZ&R+?`1+L1~}n8s4*v3@7J68B4&cPn@{Jlq>Q8>j~$MST>V zM}!+#eOfKov8q=WsI?R>;mgH4za3Wh6yr%CEttnaN&NZnt1rGKaQOucH~7Y+2US=( ztoE9zbW~_@mzbilC1|1WV}HlemE{~_i7m&XL$tvo2oSW_v0?%rs%Lytwv$8rX&9yg}1I7Bz!;8SsyKI3&6+y$HC zncin~u?mO;NNi#WXui>bmu)pzOfk05LiyAL^&*s9oP(QAc7mCF5HHi{YeJ&eZXPg`+3-R2x zC?O=vj0*jhFBfV3Ip>VS$85%9ci0g{Lrk`;Y$#n@l}Sq|OMS?!n%D!!#4 z&A@wx0vZeXo75ThElSBAP6|lA3e#B(MYq|) z!4E?f4z1lm6i+0@gD$wNF?#ojKdsw#$v)6MEElzP9CH^g)Hm;?1ZuxMW?jk(d$wvB zT2lkaUjza|4RBIukI&WH^c{7(IOxMplvxK& z1O3LY9W@RqHl$lb*{^&^Y*btP{KR<4tH&~cw~JrQKA2K&+`yny~km{Ahx7c#UID`_tMUMzsVL!MQP_fOpKMH(=l{$i{ys616 zk%nmq<<>r&VsLSa@Uw-QU*gzm5}G5~VIcSZG)9NYJ4{eXb3q3b%|wB(h2Crz$2z#P z`@8wwfA{7BXz8E=m{0Hz^=EFXE_iUlD~wAKV`V$EYNl;E1NWk4k(R||@Yh`4&Rl+2 zLBDuDzlT{z8bw1`U^Q40Ul9-JYtEh}TQgVsx&RZZpkqX(v$FYo>3(>j z1pJFqppi&W_GOGZ>XFarw_&mGMh#73i0)5_raM9-P=vY}*G`$!t@-_Ho_YTaU-iF`Bcg1y<_q3}EYOp+_=$MoPlp zSUF6)%)kH73PS=bteR0!L$CyD2)O>0x&TkY0ocw@D)HjjDW5@$A>rGZ_>v%@rW;~m zGpCTA8{v-9A81Xv^k!`!Z$y0Rlrp?KiXqEf;&iN**%0*vjca(un{V6d0hK;aFdsUj zBiVP2uP)S)cPZ!xQEI4-;D^!lWHjR9HXktbq&2qAoZ-dc@zM0yoNRCsH*8qRKmYQE z0n`{1A0l~U_Ds2^MM19oDkn_N$1Psq7+szx2sjlj*!Skp2_9LkF}5 z;9~>*3QbDt&%;2C(gg+G3ckghk}{6z5AaJ9<)TEpz}==6Hg{m&Aj#|_A@qH0YY@p9 zegC@)lg)bX=1ykR(+Pj3DP4S+TfAZd3jkHBrKOr~g-5i(Y=mDFiE=aN)@oOr-eq_O zo)5ytQnz#IL_Y&Gyvo}^fnv3L? z&6ZplsU1dV4TCO$S$i`Gto!O`FxqGhxN4^hXu^q0X>|BD>yOH4tF+V`gw8voA^;Za zzF>NbO1%c1mCtX+xhMIIV){rhBG(0a+;rx+ZNKE$pEftS)MS4~5>+b5!-}y(q}A2E z^(SF32KjJn#%EQ=l8yH#vnaQ%v%9FR?)Jkj0L2>4>=2f0uQ)4*_3e!B8^V~^EKdy$`Ybg+JDR# zjIXa8NhfsxKS$(~yr61fBt0H;DW2;?%)jgKv=!qI@LCL?i-5vrp`OTq>WXP0U=C4g zzJiN+0+z4COD|vYWEw_#73~{tk%y(&@UGOIIS~(uv`HzB>*SgxX0lNi#p$RMAp2J6 zTgajCToy>j2O{0!1oc|gBN&WnIE~eUXNxD3cN6?TAAGp87`gjNPc*?R>@KHFQ~Tuy zc0C!8EJ{YOR_R{2M5Ay2KQpMYgI9?_0!t|XT|=l%#o7e&PM*`!`xFr=xJh%7Qq-wl z&}7cMjeZi6Xda+@EtiRXvX^*0hILgl_CsR*l>unZ$n&(>ad&k^5CC|Fu@8L*34gS| zz=6^g4Nf?oa4X`@L+DNjO(-7h)_1L=X%f17QG}$ma%vwu8~pPeXizmOK5XdQ;S#FCH2{@y(ez3o_#EK6GlfaMi7wBa$-sQG0UhkvOkp?7YUeC-PazbfIbF z`s+*9={}`cf?Aml1?LLUJEVc;{uF216y0IRkw%PMjbXNh)*IYL6CUDVsR#;!soI86 z|4Qj8E5=y?`oSoWOT)Uqft6n8NY@$wmIb4I|4RaHIZe<{9=`@^3u9(I?;7_{Egf7F zH3Rl#2fUdSA^w#|`WBqI-(j7IX)Cs>!!2=IMC6JQC8miH(!RN<64$9;+kBdp?(Vb+ z9&w&e5QBe^PUe={BzlV*&XtT3Jkv%Qd`ux0G&~|U8_0I#ps0{0@+JrMahq2dAnM{c zKkj=!W!N>s+@`}_|I0m|q>fEg-1V7Kg_hv!%$1eqJsr7_$o?8CsqAPDhjc5RrUa*2 z6WD{W0*0%36s$fTT|MOhxQ2N6(Tc28Dt+Eqg;HkjgM`|<)?bKmG1#G*7&7n7gFZS0 zF08_xpH3st84J6^mrwh=D^|hT6IGz4vCCMk?rc?549rz_^9}h@HWmlZ%}KR~Ga#7S zFIad-wQUv1-&ZH(5u90*)TgH3`0}6T6R0&L57q8OCj%@S;v%18g8_NRz`|`U*93$7 zV8Kv9pAWL&5Ex(>U|?`?U&7+ zVgeb)@JW9EYfaPDS6`Q}6h10(wj zmLq$Gz5nk{oO);_or0{+f~@|Qx&C+4r+Ec+hbdq4YwmAsng=>M3;MkKmjdmjGX7tF zQGkQP|D3+Sow-E~ba7yyaUk(uun*HKOe}{40zM~|s z;D6P?|7BJ5Ur*~hLHSxp<0tVTn2mr0lPv#;F)M+-#~1-^CJ9M?`>Fh`$^5SsFt84z zzZ9D5=h0ph{H=ofXM!Bl*93YqM6ck#!lVB!(g_y8$tePm6e-Rt__xO0pBAm`UMOVO!+|RFI)-?Jn__r|FpCq*7|1L^u{+~PWTXM<^R8bH?6@~Xt z77W4}*wx1mT$x0Awfb9z3Ks;LfyxmmaQq+JoD1lJxL%?E$uS{8 zf7bp`O#%DezWlqLdI4(|4=H-Tys{hucT zGs*^LbTa}!O#cJ^>nif!GGLJh0?9y*BQU_!AOFDr&PaiQ@&9F2xa>6xaC20zdHvtZ ze$YMs8x*a41;5Sw12SO#`6lpBlOeSrQ0Ud#->-=NgjVZct^M=Di0l>qdqDmt{Jru2 z;Me>73jZGcNP-HCEU3V+{Kf~l7{@!qYmoWz(4{e|7rWcx`C&Q3?#oh#y|T)Py_YH Xrqm7OUm| + publishing { + publications { + jsonrpc4j { + pom { + name = rootProject.name.capitalize() + (project.parent ? " ($shortName)" : '') + description = project.description + url = 'https://github.com/briandilley/jsonrpc4j' + issueManagement { + system = 'GitHub' + url = 'https://github.com/briandilley/jsonrpc4j/issues' + } + ciManagement { + system = 'Github Actions' + url = 'https://github.com/briandilley/jsonrpc4j/actions' + } + inceptionYear = '2013' + developers { + developer { + id = 'briandilley' + name = 'Brian Dilley' + email = 'brian.dilley@gmail.com.com' + url = 'https://github.com/briandilley' + timezone = 'America/Los_Angeles' + } + } + licenses { + license { + name = 'The MIT License (MIT)' + url = 'https://github.com/briandilley/jsonrpc4j/blob/develop/LICENSE' + distribution = 'repo' + comments = 'A business-friendly OSS license' + } + } + scm { + connection = 'scm:git:https://github.com/briandilley/jsonrpc4j.git' + developerConnection = 'git@github.com:briandilley/jsonrpc4j.git' + url = 'https://github.com/briandilley/jsonrpc4j' + } + distributionManagement { + downloadUrl = 'https://github.com/briandilley/jsonrpc4j/releases' + } + } + } + } + } +} diff --git a/publishing.gradle b/publishing.gradle new file mode 100644 index 00000000..2f7998bd --- /dev/null +++ b/publishing.gradle @@ -0,0 +1,129 @@ +import io.codearte.gradle.nexus.BaseStagingTask +import io.codearte.gradle.nexus.NexusStagingPlugin + +import javax.naming.ConfigurationException + +buildscript { + repositories { + gradlePluginPortal() + } + dependencies { + classpath 'io.codearte.gradle.nexus:gradle-nexus-staging-plugin:0.11.0' + classpath 'gradle.plugin.net.wooga.gradle:atlas-github:1.0.1' + classpath 'net.researchgate:gradle-release:2.7.0' + classpath 'org.ajoberstar:grgit:2.3.0' + classpath 'org.kohsuke:github-api:1.93' + } +} + +ext { + it.'signing.secretKeyRingFile' = project.findProperty('jsonrpc4j.signing.secretKeyRingFile') ?: + project.findProperty('signing.secretKeyRingFile') + it.'signing.password' = project.findProperty('jsonrpc4j.signing.password') ?: + project.findProperty('signing.password') + it.'signing.keyId' = project.findProperty('jsonrpc4j.signing.keyId') ?: + project.findProperty('signing.keyId') + sonatypeUsername = project.findProperty('jsonrpc4j.sonatype.username') ?: + project.findProperty('sonatype.username') + sonatypePassword = project.findProperty('jsonrpc4j.sonatype.password') ?: + project.findProperty('sonatype.password') + sonatypeStagingProfileId = project.findProperty('jsonrpc4j.sonatype.stagingProfileId') ?: + project.findProperty('sonatype.stagingProfileId') + it.'github.token' = project.findProperty('jsonrpc4j.github.token') ?: + project.findProperty('github.token') +} + +allprojects { + apply plugin: 'maven-publish' + + publishing { + repositories { + maven { + name 'sonatype' + if (releaseVersion) { + url 'https://oss.sonatype.org/service/local/staging/deploy/maven2/' + } else { + url 'https://oss.sonatype.org/content/repositories/snapshots/' + } + credentials { + username sonatypeUsername + password sonatypePassword + } + } + } + } + + tasks.withType(PublishToMavenRepository) { + doFirst { + if (!sonatypeUsername) { + throw new ConfigurationException( + 'Please set the Sonatype username with project property "sonatype.username" ' + + 'or "jsonrpc4j.sonatype.username". If both are set, the latter will be effective.') + } + if (!sonatypePassword) { + throw new ConfigurationException( + 'Please set the Sonatype password with project property "sonatype.password" ' + + 'or "jsonrpc4j.sonatype.password". If both are set, the latter will be effective.') + } + } + } +} + +publishing { + publications { + jsonrpc4j(MavenPublication) { + from components.java + artifact documentationJar + artifact sourcesJar + } + } +} + +apply from: 'pom.gradle' + +allprojects { + apply plugin: 'signing' + + signing { + required { + // signing is required if this is a release version and the artifacts are to be published + releaseVersion && tasks.withType(PublishToMavenRepository).find { + gradle.taskGraph.hasTask it + } + } + sign publishing.publications + } +} + +apply plugin: NexusStagingPlugin +// remove superfluous tasks from NexusStagingPlugin +//tasks.removeAll([promoteRepository, closeAndPromoteRepository, getStagingProfile]) + +nexusStaging { + stagingProfileId sonatypeStagingProfileId + username sonatypeUsername + password sonatypePassword +} + +// make sure the staging tasks are run after any publishing tasks if both are to be run +tasks.withType(BaseStagingTask) { + mustRunAfter allprojects.tasks*.withType(PublishToMavenRepository) + + doFirst { + if (!sonatypeStagingProfileId) { + throw new ConfigurationException( + 'Please set the Sonatype staging profile id with project property "sonatype.stagingProfileId" ' + + 'or "jsonrpc4j.sonatype.stagingProfileId". If both are set, the latter will be effective.') + } + if (!sonatypeUsername) { + throw new ConfigurationException( + 'Please set the Sonatype username with project property "sonatype.username" ' + + 'or "jsonrpc4j.sonatype.username". If both are set, the latter will be effective.') + } + if (!sonatypePassword) { + throw new ConfigurationException( + 'Please set the Sonatype password with project property "sonatype.password" ' + + 'or "jsonrpc4j.sonatype.password". If both are set, the latter will be effective.') + } + } +} diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 00000000..11f90800 --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'jsonrpc4j' diff --git a/src/main/java/com/googlecode/jsonrpc4j/JsonRpcBasicServer.java b/src/main/java/com/googlecode/jsonrpc4j/JsonRpcBasicServer.java index 0d19a075..aa1db675 100644 --- a/src/main/java/com/googlecode/jsonrpc4j/JsonRpcBasicServer.java +++ b/src/main/java/com/googlecode/jsonrpc4j/JsonRpcBasicServer.java @@ -79,7 +79,7 @@ public class JsonRpcBasicServer { private boolean shouldLogInvocationErrors = true; private List interceptorList = new ArrayList<>(); private ExecutorService batchExecutorService = null; - private long parallelBatchProcessingTimeout; + private long parallelBatchProcessingTimeout = Long.MAX_VALUE; /** * Creates the server with the given {@link ObjectMapper} delegating @@ -281,7 +281,8 @@ protected Class[] getHandlerInterfaces(final String serviceName) { * @param node the {@link JsonNode} * @return the {@link JsonResponse} instance */ - protected JsonResponse handleJsonNodeRequest(final JsonNode node) { + protected JsonResponse handleJsonNodeRequest(final JsonNode node) + throws JsonParseException, JsonMappingException { if (node.isArray()) { return handleArray((ArrayNode) node); } @@ -321,7 +322,12 @@ private JsonResponse getBatchResponseSequentially(ArrayNode node) { JsonResponse response = new JsonResponse(); for (int i = 0; i < node.size(); i++) { - JsonResponse nodeResult = handleJsonNodeRequest(node.get(i)); + JsonResponse nodeResult; + try { + nodeResult = handleJsonNodeRequest(node.get(i)); + } catch(Exception e) { + nodeResult = createResponseError(VERSION, NULL, JsonError.PARSE_ERROR); + } handleRethrowException(response, nodeResult); batchResult.add(nodeResult.getResponse()); if (isError(nodeResult)) { @@ -409,7 +415,8 @@ private boolean isError(JsonResponse result) { * @param node the {@link JsonNode} * @return the {@link JsonResponse} instance */ - private JsonResponse handleObject(final ObjectNode node) { + private JsonResponse handleObject(final ObjectNode node) + throws JsonParseException, JsonMappingException { logger.debug("Request: {}", node); if (!isValidRequest(node)) { diff --git a/src/main/java/com/googlecode/jsonrpc4j/JsonRpcMultiServer.java b/src/main/java/com/googlecode/jsonrpc4j/JsonRpcMultiServer.java index 58589dd8..44796eb9 100644 --- a/src/main/java/com/googlecode/jsonrpc4j/JsonRpcMultiServer.java +++ b/src/main/java/com/googlecode/jsonrpc4j/JsonRpcMultiServer.java @@ -52,13 +52,7 @@ public JsonRpcMultiServer() { } public JsonRpcMultiServer(ObjectMapper mapper) { - super(mapper, null); - this.handlerMap = new HashMap<>(); - this.interfaceMap = new HashMap<>(); - } - - public JsonRpcMultiServer(ObjectMapper mapper, boolean gzipResponses) { - super(mapper, null, null, gzipResponses); + super(mapper); this.handlerMap = new HashMap<>(); this.interfaceMap = new HashMap<>(); } diff --git a/src/main/java/com/googlecode/jsonrpc4j/JsonRpcServer.java b/src/main/java/com/googlecode/jsonrpc4j/JsonRpcServer.java index 21f441fe..1a45d209 100644 --- a/src/main/java/com/googlecode/jsonrpc4j/JsonRpcServer.java +++ b/src/main/java/com/googlecode/jsonrpc4j/JsonRpcServer.java @@ -25,24 +25,8 @@ public class JsonRpcServer extends JsonRpcBasicServer { private static final Logger logger = LoggerFactory.getLogger(JsonRpcServer.class); private static final String GZIP = "gzip"; - protected final boolean gzipResponses; private String contentType = JSONRPC_CONTENT_TYPE; - /** - * Creates the server with the given {@link ObjectMapper} delegating - * all calls to the given {@code handler} {@link Object} but only - * methods available on the {@code remoteInterface}. - * - * @param mapper the {@link ObjectMapper} - * @param handler the {@code handler} - * @param remoteInterface the interface - * @param gzipResponses whether gzip the response that is sent to the client. - */ - public JsonRpcServer(ObjectMapper mapper, Object handler, Class remoteInterface, boolean gzipResponses) { - super(mapper, handler, remoteInterface); - this.gzipResponses = gzipResponses; - } - /** * Creates the server with the given {@link ObjectMapper} delegating * all calls to the given {@code handler} {@link Object} but only @@ -54,7 +38,6 @@ public JsonRpcServer(ObjectMapper mapper, Object handler, Class remoteInterfa */ public JsonRpcServer(ObjectMapper mapper, Object handler, Class remoteInterface) { super(mapper, handler, remoteInterface); - this.gzipResponses = false; } /** @@ -66,7 +49,6 @@ public JsonRpcServer(ObjectMapper mapper, Object handler, Class remoteInterfa */ public JsonRpcServer(ObjectMapper mapper, Object handler) { super(mapper, handler, null); - this.gzipResponses = false; } /** @@ -79,7 +61,6 @@ public JsonRpcServer(ObjectMapper mapper, Object handler) { */ public JsonRpcServer(Object handler, Class remoteInterface) { super(new ObjectMapper(), handler, remoteInterface); - this.gzipResponses = false; } /** @@ -90,7 +71,6 @@ public JsonRpcServer(Object handler, Class remoteInterface) { */ public JsonRpcServer(Object handler) { super(new ObjectMapper(), handler, null); - this.gzipResponses = false; } /** @@ -162,7 +142,7 @@ public void handle(HttpServletRequest request, HttpServletResponse response) thr private InputStream getRequestStream(HttpServletRequest request) throws IOException { InputStream input; if (request.getMethod().equals("POST")) { - input = createInputStream(request.getInputStream(), request.getHeader(CONTENT_ENCODING)); + input = request.getInputStream(); } else if (request.getMethod().equals("GET")) { input = createInputStream(request); } else { @@ -172,31 +152,7 @@ private InputStream getRequestStream(HttpServletRequest request) throws IOExcept } private int handleRequest0(InputStream input, OutputStream output, String contentEncoding, HttpServletResponse response, ByteArrayOutputStream byteOutput) throws IOException { - int result; - - boolean canGzipResponse = contentEncoding != null && contentEncoding.contains(GZIP); - // Use gzip if client's accept-encoding is set to gzip and gzipResponses is enabled. - if (gzipResponses && canGzipResponse) { - response.addHeader(CONTENT_ENCODING, GZIP); - try (GZIPOutputStream gos = new GZIPOutputStream(byteOutput)) { - result = handleRequest(input, gos); - } - } else { - result = handleRequest(input, byteOutput); - } - - return result; - } - - private static InputStream createInputStream(InputStream inputStream, String contentEncoding) throws IOException { - InputStream input; - if (contentEncoding != null && GZIP.equalsIgnoreCase(contentEncoding)) { - input = new GZIPInputStream(inputStream); - } else { - input = inputStream; - } - - return input; + return handleRequest(input, byteOutput); } private static InputStream createInputStream(HttpServletRequest request) throws IOException { diff --git a/src/main/java/com/googlecode/jsonrpc4j/ReadContext.java b/src/main/java/com/googlecode/jsonrpc4j/ReadContext.java index 8405f9bc..ca32d27a 100644 --- a/src/main/java/com/googlecode/jsonrpc4j/ReadContext.java +++ b/src/main/java/com/googlecode/jsonrpc4j/ReadContext.java @@ -5,6 +5,7 @@ import java.io.IOException; import java.io.InputStream; +import java.net.SocketException; @SuppressWarnings("WeakerAccess") public class ReadContext { @@ -26,12 +27,16 @@ public JsonNode nextValue() throws IOException { } public void assertReadable() throws IOException { - if (input.markSupported()) { - input.mark(1); - if (input.read() == -1) { - throw new StreamEndedException(); + try { + if (input.markSupported()) { + input.mark(1); + if (input.read() == -1) { + throw new StreamEndedException(); + } + input.reset(); } - input.reset(); + } catch(SocketException se) { + throw new StreamEndedException(); } } diff --git a/src/test/java/com/googlecode/jsonrpc4j/client/JsonRpcClientTest.java b/src/test/java/com/googlecode/jsonrpc4j/client/JsonRpcClientTest.java index 8f785798..6c1fc1a0 100644 --- a/src/test/java/com/googlecode/jsonrpc4j/client/JsonRpcClientTest.java +++ b/src/test/java/com/googlecode/jsonrpc4j/client/JsonRpcClientTest.java @@ -41,7 +41,7 @@ public void testInvokeNoParams() throws Throwable { client.invoke("test", new Object[0], byteArrayOutputStream); JsonNode node = readJSON(byteArrayOutputStream); - assertFalse(node.has(PARAMS)); + assertEquals(0, node.get(PARAMS).size()); } private JsonNode readJSON(ByteArrayOutputStream byteArrayOutputStream) throws IOException { diff --git a/src/test/java/com/googlecode/jsonrpc4j/integration/HttpClientTest.java b/src/test/java/com/googlecode/jsonrpc4j/integration/HttpClientTest.java index 2b098156..5d7d4d73 100644 --- a/src/test/java/com/googlecode/jsonrpc4j/integration/HttpClientTest.java +++ b/src/test/java/com/googlecode/jsonrpc4j/integration/HttpClientTest.java @@ -20,20 +20,6 @@ public class HttpClientTest extends BaseRestTest { private FakeServiceInterface service; - @Test - public void testGZIPRequest() throws MalformedURLException { - service = ProxyUtil.createClientProxy(this.getClass().getClassLoader(), FakeServiceInterface.class, getHttpClient(true, false)); - int i = service.returnPrimitiveInt(2); - Assert.assertEquals(2, i); - } - - @Test - public void testGZIPRequestAndResponse() throws MalformedURLException { - service = ProxyUtil.createClientProxy(this.getClass().getClassLoader(), FakeServiceInterface.class, getHttpClient(true, true)); - int i = service.returnPrimitiveInt(2); - Assert.assertEquals(2, i); - } - @Test public void testRequestAndResponse() throws MalformedURLException { service = ProxyUtil.createClientProxy(this.getClass().getClassLoader(), FakeServiceInterface.class, getHttpClient(false, false)); diff --git a/src/test/java/com/googlecode/jsonrpc4j/server/JsonRpcErrorsTest.java b/src/test/java/com/googlecode/jsonrpc4j/server/JsonRpcErrorsTest.java index 896164e1..e2f110db 100644 --- a/src/test/java/com/googlecode/jsonrpc4j/server/JsonRpcErrorsTest.java +++ b/src/test/java/com/googlecode/jsonrpc4j/server/JsonRpcErrorsTest.java @@ -71,10 +71,6 @@ public void exceptionWithAnnotatedServiceInterfaceMessageAndData() throws Except assertNotNull(error); assertEquals(-5678, errorCode(error).intValue()); assertEquals("The message", errorMessage(error).textValue()); - JsonNode data = errorData(error); - assertNotNull(data); - assertEquals("The message", errorMessage(data).textValue()); - assertEquals(CustomTestException.class.getName(), exceptionType(data).textValue()); } @Test diff --git a/src/test/java/com/googlecode/jsonrpc4j/server/JsonRpcServerTest.java b/src/test/java/com/googlecode/jsonrpc4j/server/JsonRpcServerTest.java index 9dcdf6bd..e6b59207 100644 --- a/src/test/java/com/googlecode/jsonrpc4j/server/JsonRpcServerTest.java +++ b/src/test/java/com/googlecode/jsonrpc4j/server/JsonRpcServerTest.java @@ -167,61 +167,6 @@ public void testNullRequest() throws Exception { assertTrue(MockHttpServletResponse.SC_BAD_REQUEST == response.getStatus()); } - @Test - public void testGzipResponse() throws IOException { - MockHttpServletRequest request = new MockHttpServletRequest("POST", "/test-post"); - request.addHeader(ACCEPT_ENCODING, "gzip"); - request.setContentType("application/json"); - request.setContent("{\"jsonrpc\":\"2.0\",\"id\":123,\"method\":\"testMethod\",\"params\":[\"Whir?inaki\"]}".getBytes(StandardCharsets.UTF_8)); - - MockHttpServletResponse response = new MockHttpServletResponse(); - - jsonRpcServer = new JsonRpcServer(Util.mapper, mockService, ServiceInterface.class, true); - jsonRpcServer.handle(request, response); - - byte[] compressed = response.getContentAsByteArray(); - String sb = getCompressedResponseContent(compressed); - - Assert.assertEquals(sb, "{\"jsonrpc\":\"2.0\",\"id\":123,\"result\":null}"); - Assert.assertEquals("gzip", response.getHeader(CONTENT_ENCODING)); - } - - @Test - public void testGzipResponseMultipleAcceptEncoding() throws IOException { - MockHttpServletRequest request = new MockHttpServletRequest("POST", "/test-post"); - request.addHeader(ACCEPT_ENCODING, "gzip,deflate"); - request.setContentType("application/json"); - request.setContent("{\"jsonrpc\":\"2.0\",\"id\":123,\"method\":\"testMethod\",\"params\":[\"Whir?inaki\"]}".getBytes(StandardCharsets.UTF_8)); - - MockHttpServletResponse response = new MockHttpServletResponse(); - - jsonRpcServer = new JsonRpcServer(Util.mapper, mockService, ServiceInterface.class, true); - jsonRpcServer.handle(request, response); - - byte[] compressed = response.getContentAsByteArray(); - String sb = getCompressedResponseContent(compressed); - - Assert.assertEquals(sb, "{\"jsonrpc\":\"2.0\",\"id\":123,\"result\":null}"); - Assert.assertEquals("gzip", response.getHeader(CONTENT_ENCODING)); - } - - @Test - public void testCorruptRequest() throws Exception { - MockHttpServletRequest request = new MockHttpServletRequest("POST", "/test-post"); - request.setContentType("application/json"); - request.setContent("{NOT JSON}".getBytes(StandardCharsets.UTF_8)); - - MockHttpServletResponse response = new MockHttpServletResponse(); - - jsonRpcServer = new JsonRpcServer(Util.mapper, mockService, ServiceInterface.class, true); - jsonRpcServer.handle(request, response); - - String content = response.getContentAsString(); - - Assert.assertEquals(content, "{\"jsonrpc\":\"2.0\",\"id\":\"null\"," + - "\"error\":{\"code\":-32700,\"message\":\"JSON parse error\"}}\n"); - } - private String getCompressedResponseContent(byte[] compressed) throws IOException { GZIPInputStream gzipInputStream = new GZIPInputStream(new ByteArrayInputStream(compressed)); InputStreamReader inputStreamReader = new InputStreamReader(gzipInputStream, StandardCharsets.UTF_8); @@ -234,55 +179,6 @@ private String getCompressedResponseContent(byte[] compressed) throws IOExceptio return sb.toString(); } - @Test - public void testGzipRequest() throws IOException { - MockHttpServletRequest request = new MockHttpServletRequest("POST", "/test-post"); - request.addHeader(CONTENT_ENCODING, "gzip"); - request.setContentType("application/json"); - byte[] bytes = "{\"jsonrpc\":\"2.0\",\"id\":123,\"method\":\"testMethod\",\"params\":[\"Whir?inaki\"]}".getBytes(StandardCharsets.UTF_8); - - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - GZIPOutputStream gos = new GZIPOutputStream(baos); - gos.write(bytes); - gos.close(); - - request.setContent(baos.toByteArray()); - - MockHttpServletResponse response = new MockHttpServletResponse(); - jsonRpcServer = new JsonRpcServer(Util.mapper, mockService, ServiceInterface.class, true); - jsonRpcServer.handle(request, response); - - String responseContent = new String(response.getContentAsByteArray(), StandardCharsets.UTF_8); - Assert.assertEquals(responseContent, "{\"jsonrpc\":\"2.0\",\"id\":123,\"result\":null}\n"); - Assert.assertNull(response.getHeader(CONTENT_ENCODING)); - } - - @Test - public void testGzipRequestAndResponse() throws IOException { - MockHttpServletRequest request = new MockHttpServletRequest("POST", "/test-post"); - request.addHeader(CONTENT_ENCODING, "gzip"); - request.addHeader(ACCEPT_ENCODING, "gzip"); - request.setContentType("application/json"); - byte[] bytes = "{\"jsonrpc\":\"2.0\",\"id\":123,\"method\":\"testMethod\",\"params\":[\"Whir?inaki\"]}".getBytes(StandardCharsets.UTF_8); - - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - GZIPOutputStream gos = new GZIPOutputStream(baos); - gos.write(bytes); - gos.close(); - - request.setContent(baos.toByteArray()); - - MockHttpServletResponse response = new MockHttpServletResponse(); - jsonRpcServer = new JsonRpcServer(Util.mapper, mockService, ServiceInterface.class, true); - jsonRpcServer.handle(request, response); - - byte[] compressed = response.getContentAsByteArray(); - String sb = getCompressedResponseContent(compressed); - - Assert.assertEquals(sb, "{\"jsonrpc\":\"2.0\",\"id\":123,\"result\":null}"); - Assert.assertEquals("gzip", response.getHeader(CONTENT_ENCODING)); - } - @Test public void interceptorsPreHandleJsonExceptionTest() throws IOException { String requestNotRpc = "{\"test\": 1}";