From 865841049080c0d62b1d8a4d1ab7ed13d31faa70 Mon Sep 17 00:00:00 2001 From: lioonsun Date: Wed, 23 Dec 2020 12:04:03 +0800 Subject: [PATCH 1/3] this update can support mongodb version:4.2 --- .../src/main/java/com/mongodb/hadoop/input/MongoInputSplit.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/com/mongodb/hadoop/input/MongoInputSplit.java b/core/src/main/java/com/mongodb/hadoop/input/MongoInputSplit.java index 9582e17e..e60c6162 100644 --- a/core/src/main/java/com/mongodb/hadoop/input/MongoInputSplit.java +++ b/core/src/main/java/com/mongodb/hadoop/input/MongoInputSplit.java @@ -278,7 +278,7 @@ public DBCursor getCursor() { coll = MongoConfigUtil.getCollection(this.inputURI); } - this.cursor = coll.find(this.query, this.fields).sort(this.sort); + this.cursor = coll.find(this.query, this.fields).hint(new BasicDBObject("_id", 1)).sort(this.sort); if (this.notimeout) { this.cursor.setOptions(Bytes.QUERYOPTION_NOTIMEOUT); } From 5ed61f9d00222c334bd71a661b0e6c5f66d2155a Mon Sep 17 00:00:00 2001 From: lioonsun Date: Wed, 10 Nov 2021 14:30:50 +0800 Subject: [PATCH 2/3] update --- build.gradle | 14 +- .../mongodb/hadoop/input/MongoInputSplit.java | 52 ++--- gradle/functions.gradle | 7 +- gradle/hadoop.gradle | 28 +-- gradle/wrapper/gradle-wrapper.jar | Bin 51348 -> 54417 bytes gradle/wrapper/gradle-wrapper.properties | 3 +- gradlew | 2 +- gradlew.bat | 180 +++++++++--------- .../com/mongodb/hadoop/hive/BSONSerDe.java | 34 ++-- .../hadoop/hive/MongoStorageHandler.java | 68 +++---- 10 files changed, 196 insertions(+), 192 deletions(-) diff --git a/build.gradle b/build.gradle index de0b2e32..260e4a73 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ apply plugin: 'com.github.ben-manes.versions' ext.configDir = new File(rootDir, 'config') ext.hadoopBinaries = "${rootDir}/hadoop-binaries".toString() -ext.javaDriverVersion = '3.2.1' +ext.javaDriverVersion = '3.12.5' ext.hiveVersion = System.getenv("HIVE_VERSION") ?: '1.2.1' ext.pigVersion = System.getenv("PIG_VERSION") ?: '0.15.0' ext.hadoopVersion = System.getenv("HADOOP_VERSION") ?: '2.7.2' @@ -58,7 +58,7 @@ if(project.hasProperty("clusterVersion")) { } allprojects { - version = '2.0.2' + version = '2.0.3' group = 'org.mongodb.mongo-hadoop' } @@ -184,7 +184,7 @@ configure(subprojects) { options.links 'http://hadoop.apache.org/docs/r2.7.2/api' options.links 'http://api.mongodb.org/java/3.2/' if (JavaVersion.current().isJava8Compatible()) { - options.addStringOption('Xdoclint:none', '-quiet') + options.addStringOption('Xdoclint:none', '-quiet') } } @@ -196,9 +196,9 @@ configure(subprojects) { // tests testJar // } - test { - dependsOn 'jar', 'testsJar', ':startCluster', ':downloadEnronEmails' - } +// test { + // dependsOn 'jar', 'testsJar', ':startCluster', ':downloadEnronEmails' + // } modifyPom { project { @@ -505,4 +505,4 @@ task cleanLogs(type: Delete) { task cleanHadoop(type: Delete, dependsOn: cleanLogs) { delete hadoopHome, hiveHome, pigHome -} +} \ No newline at end of file diff --git a/core/src/main/java/com/mongodb/hadoop/input/MongoInputSplit.java b/core/src/main/java/com/mongodb/hadoop/input/MongoInputSplit.java index e60c6162..e5e2b113 100644 --- a/core/src/main/java/com/mongodb/hadoop/input/MongoInputSplit.java +++ b/core/src/main/java/com/mongodb/hadoop/input/MongoInputSplit.java @@ -210,18 +210,18 @@ public void setSkip(final Integer skip) { @Override public void write(final DataOutput out) throws IOException { BSONObject spec = BasicDBObjectBuilder.start() - .add("inputURI", getInputURI().toString()) - .add("authURI", getAuthURI() != null ? getAuthURI().toString() : null) - .add("keyField", getKeyField()) - .add("fields", getFields()) - .add("query", getQuery()) - .add("sort", getSort()) - .add("min", getMin()) - .add("max", getMax()) - .add("notimeout", getNoTimeout()) - .add("limit", limit) - .add("skip", skip) - .get(); + .add("inputURI", getInputURI().toString()) + .add("authURI", getAuthURI() != null ? getAuthURI().toString() : null) + .add("keyField", getKeyField()) + .add("fields", getFields()) + .add("query", getQuery()) + .add("sort", getSort()) + .add("min", getMin()) + .add("max", getMax()) + .add("notimeout", getNoTimeout()) + .add("limit", limit) + .add("skip", skip) + .get(); byte[] buf = _bsonEncoder.encode(spec); out.write(buf); } @@ -301,21 +301,21 @@ public DBCursor getCursor() { @Override public String toString() { String result = - "MongoInputSplit{inputURI hosts=" + this.inputURI.getHosts() - + ", inputURI namespace=" + this.inputURI.getDatabase() + "." - + this.inputURI.getCollection(); + "MongoInputSplit{inputURI hosts=" + this.inputURI.getHosts() + + ", inputURI namespace=" + this.inputURI.getDatabase() + "." + + this.inputURI.getCollection(); if (authURI != null) { result += "authURI hosts=" + authURI.getHosts() - + ", authURI database=" + authURI.getDatabase(); + + ", authURI database=" + authURI.getDatabase(); } return result - + ", min=" + this.min + ", max=" + this.max - + ", query=" + this.query - + ", sort=" + this.sort - + ", fields=" + this.fields - + ", limit=" + this.limit - + ", skip=" + this.skip - + ", notimeout=" + this.notimeout + '}'; + + ", min=" + this.min + ", max=" + this.max + + ", query=" + this.query + + ", sort=" + this.sort + + ", fields=" + this.fields + + ", limit=" + this.limit + + ", skip=" + this.skip + + ", notimeout=" + this.notimeout + '}'; } @Override @@ -364,14 +364,14 @@ public boolean equals(final Object o) { return false; } if (limit == null && that.getLimit() != null - || !limit.equals(that.getLimit())) { + || !limit.equals(that.getLimit())) { return false; } if (skip == null && that.getSkip() != null - || !skip.equals(that.getSkip())) { + || !skip.equals(that.getSkip())) { return false; } return true; } -} +} \ No newline at end of file diff --git a/gradle/functions.gradle b/gradle/functions.gradle index 20b69fcc..5aae665f 100644 --- a/gradle/functions.gradle +++ b/gradle/functions.gradle @@ -3,7 +3,7 @@ import org.apache.tools.ant.filters.ReplaceTokens def downloadFile(url) { def tmpDir = new File(System.properties['java.io.tmpdir']) def file = new File(tmpDir, new File(new URL(url).getPath()).getName()) - + def count = 0; while (!file.exists()) { try { @@ -50,6 +50,7 @@ task installPig() << { } task downloadEnronEmails() << { + //extract(dataHome, dataHome, downloadFile('https://mongodb-enron-email.s3-website-us-east-1.amazonaws.com/mongodb-enron-email/enron_mongo.tar.bz2')) extract(dataHome, dataHome, downloadFile('https://s3.amazonaws.com/mongodb-enron-email/enron_mongo.tar.bz2')) } @@ -75,7 +76,7 @@ task copyFiles(dependsOn: [installHadoop, installHive, installPig]) << { safeCopy("streaming/build/libs/mongo-hadoop-streaming-${project(':core').version}.jar", hadoopLib, "mongo-hadoop-streaming.jar") safeCopy("hive/build/libs/mongo-hadoop-hive-${project(':core').version}.jar", hiveHome + '/lib', "mongo-hadoop-hive.jar") safeCopy(findJar(":core", "mongo-java-driver"), hadoopLib, "mongo-java-driver.jar") - + println "Updating cluster configuration" copy { from 'clusterConfigs' @@ -109,4 +110,4 @@ def safeCopy(fromPath, toPath, newName) { if (!copied) { throw new GradleException("Failed to copy a file: " + fromPath, new FileNotFoundException(fromPath)) } -} +} \ No newline at end of file diff --git a/gradle/hadoop.gradle b/gradle/hadoop.gradle index 2f56f284..75da0c12 100644 --- a/gradle/hadoop.gradle +++ b/gradle/hadoop.gradle @@ -14,10 +14,10 @@ def execute(command, args = [], outStream = null, errStream = null, background = env << System.getProperties() def executor = new org.zeroturnaround.exec.ProcessExecutor().command([command.toString()] + args) - .readOutput(true) - .environment(env) - .redirectOutput(outStream) - .redirectError(errStream != null ? errStream : outStream); + .readOutput(true) + .environment(env) + .redirectOutput(outStream) + .redirectError(errStream != null ? errStream : outStream); if (!background) { try { def result = executor.execute(); @@ -39,7 +39,7 @@ def stopService(signal, service, name) { if (Os.isFamily(Os.FAMILY_WINDOWS)) { if (signal == 'TERM') { execute("taskkill", "/PID", process.split()[0]) - } else{ + } else{ execute("taskkill", "/F", "/PID", process.split()[0]) } }else{ @@ -139,11 +139,11 @@ task historicalYield(dependsOn: startCluster) << { exec() { commandLine mongoimport, "-d", "mongo_hadoop", "-c", "yield_historical.in", "--drop", - "examples/treasury_yield/src/main/resources/yield_historical_in.json" + "examples/treasury_yield/src/main/resources/yield_historical_in.json" } hadoop("examples/treasury_yield/build/libs/treasury_yield-${project(':core').version}.jar", - "com.mongodb.hadoop.examples.treasury.TreasuryYieldXMLConfig", [ + "com.mongodb.hadoop.examples.treasury.TreasuryYieldXMLConfig", [ "mongo.input.uri=mongodb://localhost:27017/mongo_hadoop.yield_historical.in", "mongo.output.uri=mongodb://localhost:27017/mongo_hadoop.yield_historical.out" ]) @@ -151,14 +151,14 @@ task historicalYield(dependsOn: startCluster) << { task sensorData(dependsOn: 'startCluster') << { hadoop("examples/sensors/build/libs/sensors-${project(':core').version}.jar", - "com.mongodb.hadoop.examples.sensors.Devices", []) + "com.mongodb.hadoop.examples.sensors.Devices", []) hadoop("examples/sensors/build/libs/sensors-${project(':core').version}.jar", - "com.mongodb.hadoop.examples.sensors.Logs", ["io.sort.mb=100"]) + "com.mongodb.hadoop.examples.sensors.Logs", ["io.sort.mb=100"]) } - -task enronEmails(dependsOn: [downloadEnronEmails, startCluster]) << { +//downloadEnronEmails +task enronEmails(dependsOn: [startCluster]) << { // Create BSON file input directory. exec() { commandLine "${hadoopHome}/bin/hdfs", "dfs", "-mkdir", "-p", "/messages" @@ -170,8 +170,8 @@ task enronEmails(dependsOn: [downloadEnronEmails, startCluster]) << { "-c", "org.apache.hadoop.io.compress.BZip2Codec", "-o", "hdfs://localhost:8020/messages"]) // MR job - hadoop("examples/enron/build/libs/enron-${project(':core').version}.jar", - "com.mongodb.hadoop.examples.enron.EnronMail", []) + //hadoop("examples/enron/build/libs/enron-${project(':core').version}.jar", + // "com.mongodb.hadoop.examples.enron.EnronMail", []) } task shakespeare(dependsOn: [downloadShakespeare, startCluster]) << { @@ -214,4 +214,4 @@ def hadoop(jar, className, args, commandArgs = []) { environment << hadoopEnv commandLine line } -} +} \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 0087cd3b18659b5577cf6ad3ef61f8eb9416ebba..758de960ec7947253b058ff79c88ce51f3abe08a 100644 GIT binary patch delta 46354 zcmZ5{1yCMAvn@_=hv4q+?(V_e^~2p^fuO;HySqbhO>lR2cXuZ*x9)rO-}|O&wrX~! zXREfldb-a!lN1jbUk-`vH1)4)(vT{w)E6_^-#m2KBEyx>zwo{(o!Y$4KG-vvd3-?f>}Bm5*-f)jz|9 z#4QGHz;jL$^%HX}gQ~Yz8^s1r z`xDCbYHD{1PG*Xl&+95MBP_(+DKl$H}_a`eb!yaWeF)zJAlW}?N zpH8BKBut~){gk+=@w;OQh{P!t`aK%mof!S_KxxtUR;r!$5L(;~?PMqM!H!{>);8D= z?L;T~h^N-JH9zlMX3yYn7FFc*q&QG}L!Hs$G&0Mms62(Z8G_V*aAK421}9Xa_Kr6MjDJUTecE2o6~X-rnGZ(6!0k-b2__0#SRW^^v;_c7YT}~ z0Hp@|Y_rYEcm~!s^G#u3;Y`!K!9#b(v_|1inY9#4OiP0wmQ>gr*%N#>Wtu?(_f2Tn zBppo58InJWD^+wvO2@j2bTR!GIqaG(sNI{?<V*@{S$`*m0*uTIGr1fzCs9>87eebK~mJTK4Z>dkX@QV~|}|8U9&qTZgV; zF-KN|ZC;=F za66E5w3f%4R#Q}XraXlQ&Xn-Z!Bi!p`jli%QCn~mB8vX z<8w2PUJMjpk27nes{tECE6yfjqmubSFHFrF`S{+ijzu`8yfYR7h>Sm%&|hnz$_NLk zi`M;^#Jz#ruhZ_ysr#x*x6HqX@+NLTv5|fAkWXzOdZj=@fEs}gj6PGHYtAsre(^eonkwWEQ_>9|eglVaK~20r5RNp_|MNu?t;Zf>ETXUQ_py|AR8B4x>jBBA z8J@Ek`X53$@hrPIvdF!AJt+!X>f^r}ViWc`{k9bD6)6a*Pkc9(wn@Kp8mO+zI;T_$(@d*207@u)H_Q{pQS4vKEk9M@Sh5vykHu z_3aI*rr6ZUFf{*LQ=n%@Fi&y2I%93I7dxt<(T$Qc%~j}mc+mdDL<2M(;uvGTCruZ# zhAYIK#c&-E&pf|%hq8_k`e>O*hkeNwXd)=w;@M^j6GxEz)#V5k_uODb4e4fBvi7(IhG-8pm{OdbSV10nLa7h7x~BaF~MJm(l!`c9UA`DIM|XtafG<9KmK~A zA*KsglmsrcVXzm4M}nj1ZC>V84v>n^u16*G&qIa*)qeiL1GePksw z8jd7UwDtS?9ud{ZM-HK{Pl_)Nv*PTMTmUl`Abp>W&)*Y_?^%sO(Y@QtdOoFgAf%Wy z7CVY2oz~mr+*WE%ZpLWWoH8E4vS`|grB7T^jr_vxlwKuohz_kE98+l?uk;S{AOHF< z_xgE*Hi?1^21Z2y21fe-{OJqu-`>FJrs7Mskn|C;8MQgo_?`toSa6;(DXAkdi62lJ1kyc^DR)(s>D^!`$Kr zw|!#3EZ0Xn=v7e|G<&xh(5P#VS=#(?=zr<|)a^Ufb=CcF^!w!mn1WcQW%??!-5zAp zsou9~Wqzl#(#epiwSUTd{G1hJ)Xxlhwt$3j`09oA+jLv&#(U*Gqv*wb@W(ZJ4BfEy7ZZS<=q=e(qCuD z=Wn-(ZenCyQ^O>C@X#jTz_e?UYQC1+HXUBN)K_nz1N00;w^`#y7@&J_3TlF{OqDz zl~Kp%A%kfDf=5QdVQ`#L7Oxh@WaDmPr-puv;9MXpcBGjbd_`8PII&;Zn3)>aWgdRRn`L%-dTw z1V-gbFB(O>=3SW??=9bT)@~BjQm%X;9tzEdP~wpKO;H|+afx}UNMN8(Uk#`)^kRig zirGAx8Vf}L`>p4EaY!?iK^SEeb;#;0_~P|++{_L;0++7zOWY~BqVvnB98O_J-wkma z=i0!*n+Q%Twa|RmMd(U?3tsjO)-8EHc73i^0TbVoqO&g?lfIYHR;6>|BaM#yE_ai1 znZ$0)e6&k)(JAq+zo)xosZXwOj%^JjtCKUTvQ}6DQq*HljQLIznv-Sn^fuWwevo3x zyv{l;J*SDcEbpW;%=-$3Vi$-rxxApG!g6cEdFz~@?OF) z`p-mln?J$Y6%jH1_*I5m2MVQH^QuY%I$SwCYhzZ@H`!&7@X7vDjnSlhIEsG8ucHI9 zbbJJW4VG~0k$_&(g3YkPZi)2Qg4JyE62IAziLA7;Wl1TeSjFVM3NbZ1x262XnU|*S z5b>{UTp*>J-ne3GLWUITMMX8f+gLMGAKXP{?P08+4VA!Gu0jsFVk4S)T2)~3CR#Z6 z24udLvFDX-Pc2>UvHUfH8X3|mCZ89OPXo7w@E7F^O6EdDwChHipHl%00`&yn4*E!G+d(%kk5!sOz0IxDrDz>PUG>H7YhC@7wNfxccqCpzNGjo?{ z#%!0|Yp@@|D?aS!sVCi-t!XXoCDxllz0tbW56A*74F8g299T|P;~(O?b+kaN%s@^8 zj=sI>AviPp)f${40p|cKE5)=r;>Mn28Jq+>c7$Q$>3@eao?*%zP-}f z|9~A3he%a^h>byvC5VkJg{uUP;}fZ+3+Y59QmrD&e0v@XQpD}&9x+`5+-Tt>{JC{y z+EmyiQRo3_j82u#eRHWfeO*0my^ z59`TP&F-5y-)Ude2>sc;NHrfVF6@5GtX#%|xp5E>vx|xjPf-BYOkfI!Wh>?At zZS|uOkteyWooW9rEuHw_PEFi_r-h@i?W9J3m19|t%f4Kp+1a<<*Oza#U9d~*qouIO z7T(BQ=9iq3sbP5?Uu$D0s41j5F*6m$!mj70TAs3oW}pY+j1i!!&=pIF{Q35baC)n) z5!fE6_k(Rz&XL^y4fX;=pSasqU%yYJD^>c)B7aA|r)*>5T{IGdkB~a48iSR=pDW`7 z(pbr+>h@197KJ-d)oChmx3I?nRqO9FoFp7sCCz+Q0%T+A^A-Akp;r{&!lTKWMX#V( zY4b3xJT=2h$^r+s%{kb#w5@3gatgmX(G#H+{@y~wbKx;4{w>Cb7SK?G(VM!LEkIYu z%6hmxupCV6rio5X1#8n8t(Gr=O=XIkm2*}vi6{tA#44dRIzV&LsF*7n>b~#|*8V9T zPUgsLahcoHnbz3KZoy3N>x0$gH}x&^@oJY<>;j%!J{pK*Ni6wdC6&`uUNy?+qkh`i zj6Uc!A7wa8UBQ{*=kyI-^DcYjr93G!g%geNYi351h2hMy@NUV6zGD&`^HxKVk^7^P zxm~)e#WvAxRXVRm@x*UZ><`R^vO(j#@*M+q^mDsbl2|_bWy6mz3N9? zE96yleWU^Jj}C4eBFd&Z#A__`0k*cbU5E=N!c3fo4}KawR0e+ynhzB9ZQh39QnysB zxX6bshnPo2KAiQtkbXg|bKjES5qd%4BGNZ(zZY9s`C^PwPs_E_Ws}Yh9F6NTD^J_M zHbO~d`aV%1B?gX@w_~y2dQ`Duf0p)QQ?MX{mU)%nCBx9;K*tRARg?g?A+2RmpN1-y8*%PURXxJ4_(|-Cc+m4~_`ri1T zdbZ+G%9Q0`Y83mZYB!45Ln#VY@ zffxf^Xv(b(el!;nwU{zGh(lE`hY-r88nh8cwc9bB{?Z|Akb4j)jyjjEhR8aQr>$Ke zEvBsFsxlIvK$wOY@}?j~aVl z*~`6Z-zWHDX*z8nBWKz@WN&E(vvj*D%9rBHk=9Yol1H)mBi7PfYfI7iUhPRn8z_Z;Pu#OQI1|QRaSlqXAR<>@%OukCN+xvoCZI%pq5x(kcd@oUn3&->I=zU$%S+ z-*%&xiMyGjAnnI>yWTBlq$N^I(ZYRNIhF+!4@?LZ@r&`FSS1;X8$Sk?*NmdOKD<)G z%E_KKp3CIOp{rY5Qj|CK@zCCADEpJCy+1!0kdZw@V1Myo3h95~5&$EnPDSK?>alUq zJh58bCNzU9IU=PbJxkG1be?(4?Bm{Z@nZ4SB&2@Yr2unyvrO)l86c%qo1SDoR1>fh9X*q zA~`?>ZznGgMbA9(hJfN}^|Q(&M3zn*ao?TWDsKiS_Y)7{$KEsCqiJ+quDNnaGj-IV zziN5{4%@*eW?`6i((mwn_FI0Qgv({z01Wn9C!R@e`Yubw(;E}J*b zh*W5j!K6mg06}?%{Hl=d$|~U#?EBjZy3rK_U4vSF{1f}?4d8nE%7!bZl~h}~&#dCz z)IBUnnJ^i4RVpUF(;(LdTja6>yYdLti!!3jVmG2pBd}6N|Abl>q%H7AnFYHv)$Hb5 zh#({SkAa6r?M~MD9;vfvgTDD>wq+slrkr9i;)A9S)=j@Dv}WQX!e==5By!%+TWPo* z%!ateO4&F-RgsW#Jff>27QIK*eBlCz@*HOc!6kR2bu`9VwyJwb{vq89s&fwt5~kLy^k@d z>MNr3M|c`%H7#8eC3{&-1Q6J~QwxmgCrdw8pN?>PS=5tby;2Vq(j0(OWtB>a23AoU z2ArzYYFTZX>!&@q5sm_cplpU{~vxG z5W#|G2m=OokVyPR0MK*AIKmAO(wSX7X$Eje$1Jsho(jpnn#rN|zd5cz; ztlbo37^za@%wM~6>Z|urA~Co0sgB_i3euc#Xe^SfIqM8*Qg&lC@EsagX43N=?lcw_ zoVQ(E^QjDQyFHhkeEFs<^5IVGUxT6Ltk~y{gn-vgJFO;=E$j`d`X=B3+I?Tv-hmF< z+{HSpNOouN1i1Loo}2mk8K#q;)^&~BdXf(2i$$c3wTiS*25lhmGCmow2_e&EWXwkRTe1*zr?1c=Pal;J1ut;8a zYOI89PGt0UD8GE0Mf&AE=A1ONqaZ(DYE?6=nioBCrm<#Z96|kMvR( z+dMIG`gpbCef*Sq#jtD`d4nMRcUd;)bq|7p)MmG^E8Y)kXa8=G6Zjg+81w+F#{ zG(!nVYG!^pdA*>a#ds4A48sj(&a<|+nR9$qU=$|Isqaq!0Sik6B!rZ$HB5J?BZ5Hp zYbas$nv%{dO!xOIyk{aqQsuC$+0G!Xg&x#y$8FeF&^9OMJ1V!%c{tbPg24kpY9f;p z%hf{muM?jjo!eq8nFgD3ii`tFi1bv!E%in=W{gzOwsd^q5>nP5*&u2nNy?x!VB!xx z@LV63`}LW2ljB=|YgjJsGj9OtG%s!w%v^_Eg?7M*l^wbSNGWB)HieL7bNcO8p0$wM z7RK-km6gqNa!|{4bC?nSGm?Y#b9IoXlWHF${>x7H!l2Wy)KO7#cno54tf_(DQvLoyRi9SMAJZp`-mI93DPc2;e+t<-r^;b(qp`-}>Oz)(;j2dK{b z<^)*DIsJ%?A_5>o93)y*V@>q|0L`cXbEAJ$CJzC1ih)e1>vvE;S;CxWp7YA4h;;2_ ze$XU8ixSc;7mo4({&9P#xXtE0GT*|wKf*`Uak|6lqeBULv2UsyaR;*tT)aG65+fur ziN_pYRiwUj#UArl4J-duy%uLLG`&(--?z){8-225>+MK=wq!dJEO?=3z?aS&XH69j znPbM|j;ZvgNozmdw4+^)-vT$Q*MXc*~Ezl|ow8!MJcAk(6V{n(e;AsrX zG+Iq}F!}xj(W+mHmAy<95gD$@IrgWhfb>WK+h>?S&e7D2nL2k0z&TXr-6?xDwNpt7 zAiN(*m&!hr_VMR^Fuk@ID<8y-5h#Zp9f^-iQOxz1Rw{o}`^#{o{jB~OT@&QHOnuF? zJMiR9P-={`A$9or^NW!t0rSl}nIqHnO6R(1H-4#;uH=*iEvnVu|3M4<7is06gVNs&% z2dB~lUZKRb_j?*HPc~S!J%R!2XG6AFol26){T01u2Rr!cooJ4#*OpkE$j^*)&3n}e zM{E1H9&MfC1OBc5m_Yc=lc5fZ;|;o$Jwf=*N>i-OQd8VX8n15ycq0cw0!7;&0e&Kq zghFLxQE)Guw5cc~2PVQL?_Lt2#Brk^X7H0hg%<&_<_(&k`oPe&Ggj^&40xgPZ8f^) zZCR|`L96%Ys-l-H;#{q3=$98s@8=|e_XP9%Bx0kK=u^ZfQoG^I+z>RpjE<;i|qIs@i&=JKWG<6~v8!g!(hSF@2E9m6`NgSdZ*)?Rgf~>x1CR3JxOZEHfPAh3L zN1>0OjPk(#CiH7ny|%8gLBB#wn6w)3DzpA2SLS4IPl~RyZ}ZaAL(qpow$Kmm6P}?) zSljLwqk(cvf>F~@ec-9fW^pML9bt4D?j}(bzCbmBa=JjHsg$l5R8kU1H=A`gCHAbm zu_tcf#Ybwd-YGm?=6D1RbWVgH9z9xMdCP+<8!V3i2cuNXNM27(O&2FR#DNQV(;T*9 znY{~0thz|u9!GSO82m|LaycKS%6xPBCB;E z)~u4vC*7*H1uHu5gK4$I`DKxr;c#SWflBUYV8ICB`P1a5x&Iu=^P z^}>cdkCXqhryyId%|w_GhP4SSZB4L?@{ave5hzhIewa^wJ(1HI{~0g0rf*YXftj@H z4BJxx)4!Vv|BN|{ zO7hT%le*yUAcW62b7y{Rw;Wm|LR}-ma+Y(9InZ08s6kZnSW4`7v&^T6- z3Ih-bW)BfrGl$YJ@d6@^XrG(HwzgaPd8xj+FkrABHz@vDl45-~fc`ghV20gQX z_7-K(mSy|+R7n#rU2DB7_HEsuAc5A)cQA9xdwLDvKg)NFo?HH?qCB~ebrZxjYzrXs zPhgC+mdDk>@=#NA2;cxM^30!B&1)sJkH?GJzI^r+%PMNRGv`PB~N^}E!ruD;rS(Gr!HQ!LK66G=KNV(wP)4uk ztCN>S6lb)`oSyNEv2)fdFyJgN=2It@VBxVI$3kI{V#b`E-17+H^O=^2)wGjt66BN9 zvZMXDP2jI8jrq2*>Si!j#c{#!Hy@#!p-rkO7fGsEm9QIZ(vgsSSjpcaUrw}b88UfxWLddjN)ikK~v1oX3o%w4YupcXoYH_H~n4}r*{(K z%7r1@rDBM3)9P(%bUR2fmgo37tF5-hk{Z=A@AlBO?kWKAphR__2>IkR&mXZd6VJ_E zl+P&i%IM;#G7f1?LP?tzreh-5+N-QFa!DC_Q$EhKYS{`51q-lsoZQgiaaO(SIgi}O zXb8~IToRBwJrFSc5MVlwwnu{Y<(06g@>qF*cnEFf@OTK7hNBzPT{rS-;NP%uosnTF zT`_OAfPMn>>X*90CqqMj!F7CgMt3oVo(x`j^HmP5L16YZ2bU1vkD@4}O?K^hAG$Ly zyD&WxOu!pVANTya&e<4Ij~u%x&EWOg!L8%@e!jk-R>eDB?jNjN+sEMB^9q$_LH3#U zf_4GoVXFZw`}XgmkzM~Dg)Y%_m@V>i znPzZX4&sKtLL!N4hsG?!{0S!stIO@X=3ECR#BrbcynU13Aidw@mnFdofZh7j(Ntn*d$oR7|^5UFtwDH_Y%`^KpFk-L`>bA zv`L7{d5sG=_ZIo*D6euvp@3IFo}KYB&NtX!G*e=k;94?H#ZXtdVpy~|jVVy_6c<2m zUM*{si0uhQga+MERU%Ek{+OgX)HF1ncm?YJGDq<`EQH#%ce7H15Q$|T8C3gI&A ziTG!NyWCbemqoVhf<=#I^~2Wcpgn;+EaqO#tifcSD33MIy;vZ^vmber+>a}ECf6cO zB-)6L1my;tH|!Ctka-2^v;4aZbjIU%ZmV05$cK= z$yB?R7~S)_UPX0?$0e0D8jbD{gP_!QZw)06#mV37&?^hssRjqlMk3fP``V2iUQNxt zI#owTu6dNGle-CUb~NToi9JX#T6T2S7g)Te23?0iycq^*M%{4+)wz}|^3VJd z)sTcbZkG;z5LnHY2C;l=>HYjscR9h{NuF+$p8aN5EBAA}3*V&_uZCnEmH zlbJyg9cM^>ej}0wW&)9g>}Qd%s)~4wu1#bbP-Tz9W#r6T!1>y`^=XzLZ6# z1S^Rp$UhXK>0UG3uwK0s%v3=Djhn9k3fs*mZ{|_+J}rxo0DMvyhhEK=JNQ$K`KFG<7mm0 zh`{|6>v?%y=2$&t!`N+e`W6{y1ELhCS*=*8XtJqXAl4r<`oMV~C=T$wRA5U-L>t%T zJ<9QaTzTX71*~$}nLplEj==1CjZ*V)ctHxFSoy?Mz)}p4K6Zj9f5)7Fbs3LpFJdnQ zk>JI}j7H`!a=h0pX7Noi?Eq`6nse4*`q#-H`=s%m>|vfG37$hYM4eg`SGEIhH{dGI zd5FXg1L4;@nto8k$%kgFe)|1!{WoxaY_ZY8GVi7yp8piQ$l$4vRAxkZQi5lO?_qAS5UTO+5vz0`$^(IH+sSjgRH2-6O4G zcV(xTy>ws^DKVAs2!EN7YU(n)E5RXo;yD3TJyTRwr1CVy4iIazD?-*&0Z^I7#iD@n`N}^2Kuhn8;}o$N{{3e zIIj~}o5x*tghqRhHjc1d7FSO?hqVW9x*8anEWD>>G0yMK&eWM7y(?Z~+ck*%`?cd2 z3uG!I!$CI~mYM>Lxb?TOJE;P?8y(+({7ICRY)0>#ljoCwLCru8SN`3U&MMpxiCW7d z>G`yKf2Bo_sG{D0xm+h#yzYX%%IA#O4X?yl#^nmLOb*9>4?_Rtd^2i~ljZNVbDCZB zgj;_yu^eoQmJKM!Cew3b9e4Hkx?`?b`UEd!36Cr~VYe1;1pSPLP>Q@&&4v4cI1Yj0 zJ%}95h|?I$fE&^@N~K+_+lSa{6m&+$&ZvYLC75&Qc~h$!4*#()x{ zJ@=uZ$wk3PZBP|MIi&a9!pBb{ohgp@(fDu6n~fBlj8q6p&NQ?O=Ag}c6g&uelB~g- zpR6FRS^pZlANJv;4g4!bLX4;yFa4pcTSyY{E!3F{LxW;VHdwGW(Q>wwk(}Q!dEl9j`7J+%Sb^1*fuSatImMo z?@bXGt)nU#QPvFHZ{D`zfXq>;l+(blA=~56F=+|N`VcnG<;=g_=V1c~j>#5xl=t=; zSGTT@j(XfGXw?Qvh)#hWkM&FGR@0h&hfLl9d2ca)t8 zKdFsKYrV|%MzA;gg`6k*;-h4}6Yn!kAH%WtP}JSOMCS*m9nbEljMK}t^7d(AavQ8M zDe6xgV&xKEcsuH3Y%wx)XxUO6?r^Jf^LC=bYcxxc_^f|4YyE2bgw_$f*KYy}u&Z0% zk69!%AEBj)p;&WJGbYoqT&LM&MnoM zJ$Y1{P@x9xF7n!<3W*dAxoU$=^E>Bvy*Ijs&c-*g$YG215`ZPt;P%0107s&Vd3Af= zgHKkXEfq|0L4}O(`(*vyU+-=kUe!VT(Q){Xo7}{+N({!JwS8}aWgHMocEJc({#VB> zR7CNG9l|?;MaDC13AbhT%AXPQP9Z#Pu_`Ejlw|BObLWHg68jKIr&@hBNxx^ru#|YT zCz^3&U0nIw(g9NPxcC@eHs@e{0ck2BB_=}(3?m90BU0(l$>hJifx1!tHiDO$wCk0x z&bfGlqPml1tmj&BrZR$|kf*qal{hQ~hJ&OJbjVt*o>{*Ire+rX_XE;WxTeoEf87yh zZN!mESnq%nkW7*H_R&cvp31H(3l0pe<06`c_)U~UAlspNMx=d4s;r{St-(jDFbB7& zdlQWl=GPV`h0uEE*)!t;48{VpNyDHB7Mx5b1{ZxY4Vnhadqr0gN(&AvnN6QX|ToBEb+CD8<3Y+FJ|-f2&B4W6J8qj^aiipc7^Cn zm_o|)%;{|c*M&Ds)1y?(=6Ddx7p19synA8$CAA|J%6xqn8sLx+)CA5KmszZXv;E)~ z-;0mw5Pvxc#(7%;R=qO;-vVP@{mrNk=dDdKz%IT-Y^NIBW@n1VPd1QiDF4< z5lFo90MS8IId|mt1;j?w`G9*mm6pvPSc!M@OC)5&OG6g*MO&K|@=U^k+OfJBMEF|` z@zk)Xu$nQIplL{L_d4ad&aoMNA=bxy_m7B9449Bt3a_yg`ir>!Re3r%3kkA@w5#4s>-2Wfqb(q3*=@%mebhS z+N2Xz;wB8FjNmA`d7M(sHI{^|=xl&&;>!%X*5=zg+#A|Qa{843ih6z`MQgN@bO!|d zv$?z8V!eiT8&cCMLAoTX4twp~4w%f6Q^6f;I?(y77QRXs7r|oUNRzI9gGD9aQ8?|? zi$rpyXVQ;kOF36enVYvnZR_GvFVD^HeTI&f4YEr_Tgp_c_t;o3Gf@@z`Nei-A_Fvh zb)UC%%C`MaJCrrRJwsE35~66(aPLD7Vr6t)$Xj^n%_o$y8l7h#M>8@!<=K!?k5cT% z+FAE5nN_2Ljv+I4#Jiw<=^6o|*%Ar}B2rG>?CXd5#M>D`&h#@xBxUW>$(iq?ovZVyT!M%KGwlLq%BdMwR!EhY zM{lj8Jxdv;7n;6W#*+>&<(wX)mL1s}gj(BPg+6i0o6&)(Nkf#-k{9V(TtUQ~WVdVJ z$Js3^78Y_ZY2u^98C!3%d`MMrL+~ZK`s>wF_m#|Cw2tGmDwMHLt^~bUyC<5Q@q%df zeLL9eP>}RGOlew@e|Z9_2q9QJ_u7Cp{;GkP$>O`CH#XE` z>>!VJM!CaRVNcmVvQW0@tkbv`?`87+rn&?wC8pB7`k41NG3B+5wwVOdru)XG$xEynIOiVk>_f%cLdC2doLwAf5~dULy?WvE-y1o| ziDq}Zv@Lh*6lJ(7;W>+xH-9F7aVLoizb7J?{daHc{k(mXZvN}{_ob$*KXs!|caWxa zuo{5SuqT^=ix}x_XQFZZmjR({C_3SOlu9?89=@$zX>}o}N~crk9Cc0 zn;`eRJyqSzDN@gDSMQjpt_2=QsGb)nA6b^-J< z$c^|nZcy-kIfEyD1rSzW&e@tg16t`*M9_A1+P&&WA^obqc}pEwz3_(SYP~>%?@>Ih zB5=E>&Ml;?y>z@6O#8@Yq=p|SS5K%1gw_tAF>5A$;YrcqY8+I3@%?3YNS&&aPQXS% zS%k%0DPL58#_y)$OGd#qU{&T@_X;4oQ;cW)EQZ5Slq!dxsDIyZlz~y?Io4o7mK$MQyMA zojgGLz!SHd!G+OI{q-kMaILKIncn(&^!_h9BZp^62Ebu&-yot-`uv+6WB>~;O75*g zrO1u|+Re9QIpP^&%ukU6qq_yVzhREzy8_O=(k7X>@m^A(mhJo6Ke%AaO5@Iq@Fuh( z@_6_M{7;yUZ!~bu0D&B!FMD!*_L*c7<-#UV>}W1gL3Fb}iq6PNL+h&#L>RxRBeO;7oNGg{q~7&OSt{{4&B)*8V#BP3YjEZa_{ia`Ql$)-B2f-KS`UZW%QXqLgMnBhIpq!_^ z#$oJ3lZ<>QEx(CBi7f%C-T@(1*eE=^>jHoD%c-7p`;bO18TZKk3@hk72u{#x<%^m5 z#>E`7IJ^>aVS)+ulf_ZSxddSE%Z8??)80QfjZud)B=mmVBb(scW`qKQVXnZ?4>O5% zc)?1RChr=m6Fm1K0Dhm(Ymvk;L0G>j7P|G@j?$3pA`5g#{EAih)N`2T2Wklj!O)HeK3Hd--G+ zZ_>N1{yHEf^?@#+_}DQ1W3G25Vu*0WVWlN;R87L~u!q{K7qD$y|BI2W^r)R%Bc49V zNBKI&&f^LpquL@MY;QC2`6M~n@4^quLFqy6TrmB0KfYryIXoC%>`G_JIoQdjk+?e{ z_RU}m2&Qb4B7A*T-RBGXc{-b5i&3(Px?nau4mMuax@lGnAPciJuvY$wp2SaKZl3eD zLPCZx>t|PR2WpVQ1X#1b1YvAg%X;H0MyT9*k~f^W!90AUMLSUY$y7=oankUdEUl%Q zub(x;oTT?pp!c!#xyu%P1y!}7yp;a|5nzA>Z|HZF^q?lX0tUSbFC9~=^(HGQRyZ~q z_fu8VImFK*S=xHsB(v|qx--@Jq`oo~}nsq9?JXR4k;E5t>SIjp<{gKay*Y?}m@O z1>tT;0Nmf@0uOd2 z!Pwv6O9_g%SHUw@H8+*#G6dy2_l9QJKQsQ(@S7VPU2JJv(sQX^QJtQIe_P4Yu4sc3 z*pZ3;))mBAE{crl*nePFs0hfvOMd2EwfTZJ0WUtHd#o26L+_-?GTJZL_cL}^f*f>Z z(V0uqR?RS2xEXWpOH;6Mzp>O`%e6v!eygJR*3_C3H}q1eD#1Ri9$4wkaQu0B=iRVUba@EYtp16Yl)q`RInRXJQKZEB z0pq2Qd$6Lf@*T&bd|w){RTGGMk(sR}PE200$J^2MiAATvujKe7w!$)9kltwoQ((r~ z)6mK|Q+sM&CX$tBbP%@`aP!*iLn$|{${Q!tW?Yg2FK>@n^@7x0Jbl_-o*R#7D@F@B z0tI-%R%4oB*`6R8Qz3=4z7ay$qaIJ_0E(IR#&sLM1ZTH(u1JI>)FM~>Up4IMhldlt zjx3yfc_?=G!Nx|dK}sGftEno;t+4G(4u17+nG*vu4Y1vT7{Ko8ES`u83T3o^NoKU~ z&eKva9|3}~;c~Ej<7N|j(z5OO5AaylleoH}N#)8Ie34Lt&} zch%=L(d?&m^3fO(2^W5%i_ z{lW;?Cvu<&6u@z2j1$C3C-jP0?=kqzZ}-#rCyu~nXj}Dk9n8Am zbBA@OMscxZuKy2L?;M;-)U|uZHYc`i+qP}nyeF7Dwr$&(*v`bZ&50*DdC&Pyedl?q zx~ux{-d(-+y4Ll(wpH@lpNjMbkkvD)I(#HOm2Wvf^zAZwvgAJk@-Hi2QS~*kvbs@w(#E&>Hq5Sh6RS%zr^J~`u%x>3ELtPJ|k*3+HRG zJqh?frTR>{OxJJ?EB`^S3yEEQN%r4kV>o<47kp*@f(W;ipa&L0JD^6L#VJcD*6TcV zT!I=?iv9I-lfXX-6A@I5TK&mUSg)!XYc?sQ?fhaNykHL`0a(HQ)5|On{mN~P0Ao2C zo6037{>*zcIy0^q(b7DU^L3@F;r+H?tbSOX^0_wMEOLG!|8w$nQ{W|dxg;G7XhXm5 zsn!&fqWkj-AAKb{>UYY1_L1@_W73T}Sm7J@GRW4talIO`4&ozW*I?wF%k4wdOh>?7LtX!YV5&=)B8Lt+j4t!zdgMIR(mBxfMj}!|DtMXC1L7XAB9-xcB4YOWg=`Na}e%b-;lm zrvC5h9=`tkN2w!vEx)1w*tu=gisZ|bW(R zxB?D9^VwWpTp`w>Rn<>>Byo9M9Q@J*QC(5C7{7L=JrP`F73rdIDN%l`eb^(|9M-{+ zuMej;EBzv{wi&tz+uFzmrk7_y1%1I{ct2Sc$X@h8&Fy(OeO(BER@kESXSUh;wzPKX zaK3(X9_Ieu@PbhU&5TsH`!BeFf3Sb@&(<&wiUE?@j|j^$mgBslp@G7xpRkl^fyDPI z)i9jWwPdpQtfs4!vZy?>_gxXG(EJL@HaV-JB*r}m={m1`qDkq3 zg%JG|Dtcj|&;}%z(Z&n@OdK8*+C`&bIn>QOwb&xLrIdv35-XI{QUsUyn0r;WOfaAY z>a8Zceo_3+RrPo{zK-M{)#JdSGHNPt9KRsXMp@%*2LVX%!=M-o^x<2Azoh?d5b^c` z#9fZ)%80K=2yy*xOhJd!XqvcZ=d6Cn+q)A|6Sn4e#=sR5t}v%xM{+_#e$76)Y$i0Z zsK$Iy@RytwKcUY4Bzv}3(Hq$HHI|q5_NQ9yh864pzub)w&{|`7xf;sB{y^&l`_DBs zeX*fC{iYUh{|EN}ze|bbCjqV88gWqAPo--`gGi0B-}xMnw4AW{N9n=utGsn*%|I?cobpxVX4)^4>mlc6 zDy!}5bN1p3%o*t`dXGO^EV*`6xlb}Wk!BDPCs#`)`AR`Yn^u+uFl0QYs8ftxSa0EJ zs=PPhDFMu)bsToa*JH7t1f1M9Pzw?cQr(XK5d4KL@zxwUJNB{mL-D|k)!%T~0n;da zKZ=F?Ru#ht?TBge7L(;sBcTUtc*WvV5@RQNUysEfZwK{+N$PHkx`&F&Nb@cLQ%Kp_ zzO%U&n@VA{Wx6F2V3$e{sk_{W;8$4A7rRHz?coz>@9JyoVPj$&_;y5c`0CvDo6Y zAg~8+A|{o;m&tjO9Q>ZxZ2arGR?p_v`I}{=oU_7aVXomYaAp6>y5ITvp&`@W;(`WX z*}O6>I=n35<$lZ1jnoz4yk{R!hY86r-RxdY+*!&u63r+s`M`b=Mc`R6#B2{JnIO`K zoY!coHs*W<9A9>aaO;^H)~pWGbvB7a;J?j_F?2Qa`+F}q<98d&XF?9TU_QRe#x@u> zD0uNDZM<{+9kko1Rkzw`ae;(0<8K%}UtI1~L3)Yc&V{F3=H!&)im6~&smG5yjz4NB zibtf7n+cwJ&;AQN#xOWdKW&8!qjRd?81 z(dxt*_8z7`M${XOlQ^Mzp}`rqe#xkoymLeBMLA1rFWUX!t8;F+qr>c7W)9KWKHoef zqYW$q?6tk*MDEzVfPa?nDZMlWGa|22PFsvji!Qsy1n0j+QAh9B1zSt?-(h8F{#jVf zsnf3Qu(^C~@+wrPIY!qUSFo>VMlaQxj`tti@^3FLjdbH)$hKCWTORS$C6et=Owj!Z)brw{ra4n~v>|B^ zvC6`AgcqCq%rS|(XMutz8q}WD?CPy)yRUESxAUt|aen)H#Ob9n?|!z=(Vii|e+`NO zR5rarz$WDGw$&-SD&uMwtIk|73WO%Dj6j-`6M=-2H+{}Td|L<`Rcqe7&8%Do8MhMC z=Aybo;&>0n@${NjhRvg#rN>Fi8a;dMa^)@c-ctyPFo1WW5=^`bPalm01YMnZ!49Jw zoB@U>muO8Vjzl2lI94wj?zu+BSEnNYvUU*2o0CdJnOdQGtDOC~fOywrKl>S}sGz&PzJo=Kt@Iz#B}QU;gA=F&U_vFL zp*}GGa!ZnWJdI_@gD8k8nQ>M>m;@@aoyz7lnpaRJN`SU7v&Fy#4sk}HXF)As%xDf5 z>58;fRSa577c=ZYirYPmTivA@I1{z^-Z}boHu8MtJFk48Y>qvurMk6uEsbcv_t)7M zWiQ>FI)qzRQi(+2kJ#!!J@z^#k-I?iMmniLHD+L*p(W$G_c>(?V|=Pw{R@ZzF$a3_ zJ*+B9Y0jW`qH1WSe>NEFg#NE@V`y=BeRm`}M|QT2_f;D89 zbcIteWhU^xq0;-EZX8k|#|z3i(6rUMf7oM!$Nk+F;qFdyys6pWLNwerWLIKUTWHQE zJ7~)N3I()Y7r+z!mZTo?<*1H#b3uchZoQq9z=|z z!om3=m+oR6U7WOf(7X*8lU3TXL(Vn9w|C(V(x@|KHzd7d(%JKp+5Mu(MVF*pxHHEL zsUyzpjB3qs=Rd09Ejc|n^D|}ydXY1TbPq{sQyI>gUu(VlZCi`Jv0wbf@eN4j(YEk7 z^{c%yCpaTt4o0Zy{)6>BC z@#|9*Yimma5oMBt2Z7FmHTXw+ryQYUyoRQT%*+j}rpz3U>-P9WD;0Av$M18}yK; zOTX(Ui*b6*H`Y`nRsCJC>i~dsgF6ne9w^3E;bD|+pdMBrQm2>ku11~oE<>f$PT5c0 zJS@ew6Wkp6t=dI3{Eqe}LUz3?2ALV`5!AY>YwzRxIkP`MKsx*=e~1<1mbD(hkUT#n zPJO%z%z%MsSJ1H>nUlAYkhAazdV?Kg&$a`r?dyyD={K>S-{LdF{1;&DX=l)u*77%* zF+|6Op`~yQn2jCdNM&OV0X(7SLzP`!my|_z*wE#z*(g|b9GPpwa)?47{lnIjDbqHM zv5wxUc81AKL|tsBU4TPY5(W*oP;FK$`kYEI8=otBl$Ufrp`~DR@oko4WS$NoUz0zb6rAQYYG6@-%*Kz4XQ0u*Olz5 zA`L2r6B}`?Q*jNtJ{U@CEH$$~qnN3kP*bpsSp+)5>!-ImOkQs(o?ALi%yXVz2-ND` z7#zE53{zgqB&aq(s!^I(NFR_vwnif0L+W5Y7gVi|ATdcEhv(-98(Nf@4QI{vluI0P^26>t`vt6jQ^0|r7}2Dx}o%E?1-I9 zM()uehaR|RiCBN8Mfnnq!e=k_&(_5wgC9}oisC~`&F%^g-S|igSp;mKO8r!20Ac#0IWT zg?*k3nMi`~NXOd+Y5K4s1>tSnh)Cz+#45ZQf+to5kBY$rttk?9wONq32pQ)u^ry)y zWZkY-^s$V-X|td^8s;IR$s>wa#=4k0`kIulLsw+lEi28Ea|oT(8AVHTtjpuRm43e+ z{Vx`x9k&%`Ic61l#eT1p^%j3nqp~MSL%#>3|J=?`AsR|1d@BX7P)WP=I7zpixPX`> z2PJe7l+mw^ljRV>;Gczsq*o-_`MYee$Qmpf2$<6TVzthxWJj@^1{`;4Hl!?fzli#f zEwa1y@~bz7xY(N59`gQO>A%0v&KiLn-%^LkrH>nPM&U;zT)PO3PV;j;clh*8i{eJv z@SFd6auB+`)a0r+2s5d7u?}QK90kBd*G&H{L-@7*7I~(JP*PrI#_Lcd!%@cY+|3pO z4lLMKf9T6L(zf@E`!R2Hd0>qeSGc{%w$Ttm0sMAaPseL}JXhp8t;YUs^;>N0dbX@W z-@dxe$Z=R`detFE?+?0STg0th;atz{*lCEK&GqrO_Zd+<)G|0J+Pe0ov;vT9`ftE3 zGj??;*Ni*OzPqY5_%?(!rIx77Ezp)7FxFOFR%M1&emzx6O8ri>5?@2DXtUZQ3*1qS zRVPvulA5^@5KpmgFAo=6xbpQ|hR?bQRBzeU`NT!UM3^%)a%8OIIRC9T{dRm^6~pC$ z7&69&kR3?!Nq5JA5x=6mUkaFt0fHh*Y;*t3GfJuDHQJZF__Ger4Eh-cq8fe|fie7Y zRlo#egwaFp&+`awoSk>coa0G7I~I2#)c2@*3E|S6%q_wit!9$_i8aBLL?D@H4+$IT znoMJyT*wlwtQiHRVj0aph^dd6_T$ipp#mUve6d!ajFKIdWVP?2j}F+UIFG$^40wac za7)%t&mo?kb{=qEq@cW&hToZRCg8##cEK@Mg=G~v!2EtHmc;EwhWTRt*w>SdFGgT3 zg6OD$l9?cOE6%t9S4AOCl8vuMXv~M`D1sWFAdZuHC`Oi6`6*8$qRKkvMj@?%n3yP% zD$_I%T}&=)D;wX8z^JMfeEO{$AT%mwt^^2AfSL0yZvKP+&(C)KGYoX}J76{$J?Vyp z37{3>hyLAu)+EsT=pc;!sAq`)0T)eV@oG=Rz*F0NQ)a-kT^P}kv-69n#;n5JWw#Oa zEj}|?Zzkzh@*Qn9o@<8{C{Vb07yOD3%<=hMt!Y~D_;B*P-Iej2buc}p*L|OdZ3I1HK85p zhDiR(NVq*c==ZYg=i^P}wnH=m?JYRVM|8LpHsGClg8Xosz?^&V3f7c&vLrS5@?)0h zWDniMKk-EA?)D5t5PigI?dNR6%ZbJ15ccX&RM#76T@S`c+S*55eV>-t3+}9u72t`D zq>I=L`8Yj5W`yfj0jit+0Pff#*@Yw8NyeIIGmDV${0bN6ngIU?5zaZD5+Y)$FAyk2 zA^xUVS++EjotbwouUDFz$4hJ?)0V)bYrD-`dMuk6x=j1CR_u%rS(Jm#!}_H>tfMnB zL(tdSfAm`5;4C2!wra#z?ci*$A5f61D~?e_K(3O))H}{wr#GQ_4p;Wygs!@2P9~rJ2!ia4q1S0`R+_Z~FUf$N2He)m3OrPW9oFBnc<5IAxb!5Uxc_LB+ zZ%K~|D=KtAZKBh8c;nd?0rnF~P$mLO5mgmzwM2*RPCd$vmsj8<^vd~V?2~psbR_sR zwCG7t-vRd|#jrc$5$Fx*ZK(-Fs!VAbj3<*9tO!w;YViMP{faYFEhF*Z%8xN#*A9z9 zqW?HZ!#a4WQkx8iB7Zu-^{rrZ;_6+Nvxo^YmEQ8K2y4{ScviXS0X{A@ve&Z-lyNNT zW;=dMOxPyb(s(sVUHzsjW-%(SugIZQk+G`4A0dZO+K8V{o(06M7Jq&J>q!_Y2bZ8tTY18b?3})|9sQee1>BDr#T)k_dU-YT(;$5EH z_J}iG!wf4kT51i+58#y<5$AHEcZ{_}Bz*v4F3qT(*_UKi7$Yh=i^1*j!SzJlGz{FR zZFEeYtK8ytY4)Rb>GrEU(t4*)6AY&Z6YYi-Q(e$3F}9S`w8!GX!4ZE24rNx7t5$N< z?2gjk!Lem^PdzrvIw^Lt7wuAUO3L&r>B#%2GZmkavg-}b0@B|fXn}|y@RlEmI0}LR ziNUK5$*wx6)Q*aCY=SHtF*v9THTV@qG(W72zQYE3`<*a9VzqjqDR$=VHQuKh`pYn; z_7|u9U3^Q7|CpUklPGPN2>_IDr9Nmvh3H=3sU)z>NIo?BcW$3iJ_~m9UeZFvz$Mkm z{U4(p6{Lvf0G3yiOjym)f)#da<+;xuXO@}DhShhtskzg7=Q>LMnVYrzr)yig@8TLM z0vx>(EQA*lU|5hmnkm3mYMDPp+(o*d0eu@hS6zRdXr==Vq8FJMmIVnX&6aMkUF*F*(}qBhZ-<}@HQa(`{rnI~ zBwovU&wBj68C7*_f?`Q&RbN)q2B02)K!DZTC;LXvw*rwj_cM%`9{se(YYQp-9iRV2 zm%9)FE>151EdM5Kgy9MMLd3fx%X#g|-r~ayCEU}(48`2r!g|6^2MK)z<^%|R$w)Wz zZ3y-V87$A&*_lYT0#2#MK?^%ol<4v;K<7`v&Ls~LBrG7XQ1BUwdZPbi|HLbv!`ckR zh=~k zz%Prb&_md}clb%Lf7>e=wbwJ^GHzdoKP>&g3p;hLJ*I0-SO~Pu4AN8C-79g?v2#LT zs3We{kI67DAiX~@dk~cO3xouJ2y!zH`*dB6)D^T)%M@Z%oczQ&dq%jLJ1|k(#dL9w zNMMcqzQ*EApJ4h5BVU|Ig25+5EqHzpz?ykHC&H&k!*D#ulUBZ|DK6fd71%=v1wgK* zBCsEp#haWX80zK@;)=iKLc`2|CE1Vr-ML_jOj@5X*6L&53(7;dra2OO0KdvZoBDfV z)gX)VU$HxgLUCgvPc$d}s+P;|~kD-lLJ{V;N7F6X}^M zuKCyZDJ)g^tM+ZTB-2|+v|-8wz(YYycHOAd0gDwBn_^)Zo!LL6?gx@p0?}S|tvhUl<)x_N1g2Btx zB%#y;)_#rLrG~M`=LJQ=7h!x*q(5%`N{}1mLKlYf) z|J?+rK_=O0a|6`>zpQ8YD7w~ghnk%~$VWx)8-f|4(lB$@qLrxgL!%ZrD-OnK2x3Km zft^Ao_PHUV-8j~5op|Nc=0}s0Z63dy4!7g&Eg=Bl6UsT93>^0Ibd>|8KNgf=Hsx8= zhljw20Fpog=so;bU&kW+_`VE5ck9L(xCFeoO9GhGO-oGLdcn$Y`EQ)(>JDhU!%vetP0?3=oxV(ziScOvSlV!7Hr^|$3K@8*cbeVUwtQ%&>hf+whz+QyvOFrdN5sI!ObPs6Bl)fsOtMObj{ zrLhfX;RLih5pB&ueWdM=PEq-Cc*zAKxU61J4WcHkzYa!AG6Q`Mz;9M4MI82BCY@V) zpAZQrk}DkrxY$JryrK~QH8~}|6v}q#q6ARP5=AUP{W#`TZ`wb_+@;Um z{OXfP+{7j(;q^(WPK)2N_-Lo|Mn^6zdb)#3A~#*YA@dtoN0L*s9pqg^5yQ(m2HF^x zu9={r3!T&u4^L{#zD1`3@7|OLEl4P0|`B2h?clY2khAV~VUM#_6sR#h3+{ z@r$9wL+~XnGIPnQc!<~vkT!OgGDIp6&F}p#N){l>b zQ_hfj+hld%Ty<#`-d|f04kGGba4x|*Mdj+Pm}&>^Q8cUXnZwTC5kE)bYwEI?94gh; z5$^qs3MJM~8IlSd4hk)rF}50Wa+{Zx1w?3S0FESt1B<`nr`AoDcEA~C)Cf!DWHAaA zl}A@ntE@~z$~l?1Q-dYV=15)B^y|AR+DzTaedW17&&{q|G^SUW9_P=2f+Kv|LKg=SF!&29qQ255esRt zFelnq2chKaywR{bg%{h9tDC3D5o^g0fLo_h-K%JL*lOMtAp>k!@chn*#KCDwN4<-Q z_DaCMtBIx}j^X(%{#p1P-(MKHnxrz)1EVkknj2X@RxX-mk}v7?(HeattN@FHWsl>5 ze}Ci$gg3aG2saI?UF|qV`}Geu<4M*_x@6k5yYk%geS&qW%QpKDe+>VQKPs}#!LP((JS%5g4wFF|8FQ|6z?R~dkJ$eJhDEKbSo%k@2fdk&z zV-04}?+p)ZrQ!EsU`WA9qSVCvF1L~wb3(l%c?rn;il+mn+5;SgkkJca#$Y!ccSjp{M`v#L;9M6zjjiH$22LwMZmAJ& zAv0huj{9U>fVPqOLpm9%+z^V!F$Y=rh8K8wZWsZ+qE^+(2f3`C)FlkZ-|rK>|EUl( zxtKj~>bcC=4CSl>TC3&nn(jQa$Ts5jaUw;ml&;fGt_?Xu2RM=Ip7> z841IX*wDf>jZn2d?en90gmUS%<*&|BO+Mn?Q(|p-!=~t%^M%#lsnrghyqd|X3%v%w z4@`URhhV)%(>1NBX9-&ydt@?*qBCS&t#MXc+;QULanu{BZ)VDlY9cvn57`~Uj1K$V z|5s2{^VI_A;J2HI>wm`n|NHgn4j=$>H1)jDzklPDh#BlS>uA;suGnzJunvp5!nz{V zZMIC(c61V^L_Q)I)z%{_0|-GFIEEbYUN?pd_VGN1Bdeh{+(V{A!~BHX`UrN(9@d+HcXP zQn)J`syUUfMb_Z0=}Z%*{1L3ej;u6jV2Aa)@EWaD6Jx+?Y-%mRhA$dDEhyJ4Xe`9M z>e!&*b-2&L*0+#p;YlK9NHpqar7MBl zGE8OO9Gh*1TMI5ZMr6ohd%SG#Xe`8fNb*(5atY@4H}k16x8Ye@zDFZ9^Hph!laVg< z-=nghR!u{2a5pv-_1>JaBh?7asI8{AS zZ!}Aj*fU*Bedb!B*UsjQ%84okIG1iy{JA7#piR?x)=3D{7HP6t4sD|0K#8B}8EL^X zIheG44Xwg~C9C*p47Hq;Mg}TGQt8q0RJQCPe|LA7!sq>^7TE8o^V_N0oGewd_D7eF zk@2&+1lN7$w*{j`eLfQKN>ih+316+txpaSP${bEDRUFypXs82zM!d%h3=1y5m{bn- z5-|C3tN;L8R|U84tJz-0aH>c{nD!E%lgVE;$X0xL(<-=F(|wPH_}f?urC5wxOf~O9 z{a2_SUuQNGldddhPU7JaLJ<*G9TM6lq_9qcyDT*gN1|WxGSLN~*3WRMQ7?r6ZhF)j z{Olq%0u3iPlpGxAtR<>t#$xVYy^HQYF~5{g^_O)x$({rn^1a@upU1zHI0Pffx8f<+ zK+_q@3KPHFadBJG(LdG&(r8z1?>!~B?k*oJs{GbGc-go_D|6-l-#a=-&jej7S z36#Pc_~=Ou1f%(fQ4po{=Lu%-ad!0ul<#2}upI>haXhFAM>M#i%4 z0+|};E+AR~-o}IiEi2DB%FL6>*V>YhOb5O#MF$EV-9m;}C(+Q*gUO9oytc(0@%LU4 z#t}_6Wl+3#r9SBj4|?I{Mj*1xz;j@ncB$R7*&~BF6l6k}VLPEFXebOixnej(UX!7% znSvGo;_iI@1cI36uM^e*CI|)L*Useye)+M^+@Sc3Fo<3Bai)n zX`=QIgvXy~uQd->-KSqGo3W02VcJFekVtQLifee>TNcN~<XWM+ z*%>@L85ubl0^beeKPciL3)q_YESm^9>k#?``>`;SO>`F0eZiGz859=A{h)AISV4K& z_*>~AfEg+cQ1YTh6K)vi82 zXy5z$wHK?^yL*6}F9TofzAkpcP3MS#cMjb9!{m>RxK7 zQ^`}5K|$BnqzN>?oxSL^Rm4tFm7%Co(IOH9Q0*ya_k0*lqN}PAz=}l`oX`(9H+~K#=TsMO(Oo30<{H91 z;PGWHNG=fK5959X5nDPY%gHEzF3V%PMTp7fQUdl{spI82RkHB24Xse^9&q>RSYV>wxkZBZdb?^+YcqytQFYtay3;o&Ov#8eX?T(F5OXnKZC`R#|fL=QF^ zel9V$NS_zGrK!*#7Z4W?(acij4XKB1&|(coFOVHu za#>QqrSe*%*P$#lw0V@Z6^?rYy{P?~C)K6C`=KIS+nk)E^EHwS7$kudjMpBlbMj|n zlnz`>9>!Jr+DiN(*T0WhD^a>f&M#zEHWbpQTK|B-_M3G8e7-$_ z3!}>6s>|C-n^mTf8w@uC$t^k3)74beS!Uxa+W+!?llKhtz`4YWrK!x(s#pt6{0;w! zZlHz%&!dj1^j5>Ks~w9UdC>r`JX$t#txei~xB2>3y`9!BEB_6WN#pSv=dvjQz4HQ= zvzt{!;AMAO&yj%7!A5QTc_m6}+y1TOAn6i6E)N=;^Z;H|ZCUk$$7kS%?sLZpR}6w! zQi;|F0~Z0K?Q!SLT45`D%W(Xzp#tR!=lGwKNEp#!4q#B}X0&XQ;1ZyIDQJ^K(;wBr zzT?X=9Wa7vSNo!-a9oFw%D03?#Dps|>;c7GO?Z%gFg~1*ncU6uO3NBeU&u*aCrw@}n51ELO$h7YoZiw{#cUyXiOb(P@Iz-qI$y`fN zZ^6>BOMGa&os0L%^EdxUcEtaAMKtbAmS|ErEVCzD@1Tl1=p8?|WPAjXgOR_$Q^CwE zY-nY}pO!2n3{I0~P5&p{Kl3vP$}<1oe;xLvR?2yH{#^_F;Xy$7ziR<`((wphQcM*Z zz`9t3m?;#5Rz?|qu?;Q4A(^w>fy+ceE6KpBsp9+iz0gm1z6B)Rk=7mF1*U&Q|4?&s zf8&WU2O-9?{c|;%3ApB&4S3pYdanDf1Bk-7->!n8c@|q%)&cGPvGMqNda@`vQ2i0i zSfwHJUuGJ8f+-{iw4*H~`X}uq2b6+I0G4Qv*sf?4PHs5-HXNv{n@36aSQAnw-6i!U z)iyibO4S85JIn4`+zp?tKaN$JVok20hRcXsJyXsB>v*4(11wHnyRK|m2=kd8H7waE zz!=N!Y8|gd*BJVOE*%xStjdxopGj)iPJ}&;s{$LF756F=?5v|yC8(oP6YFJNfPw=% zdoY7fV)T={I2EG$Q@+5^nIQaNy$y!LQX{;Q{T4fSkMR$eQAc{+=JAzf_s@j4?##*x zNe+!>hOP4BP6oE^#ozwu(7m=AzuXNzPd74ZStufY`H-%Be3!P^Mp+@&?Fhq>vq z^yOoV#z26hH{>Z@I%PTT4+2@}00mw42ZXu6CzdgZCL0ZE1#zTUPZP^un{bLI^8M7? zC+&mr{E5+~4+fA~FNp_qkQDYT;$7tG&dAR=thou-xN(RN6?0@bN(9ZtyY!S0RZc(l zp`o=KDyKUwSGDpqnwQIjHe7LRN+cR3+rzWm5-P?=7U{*DnS|hvq;!Xm0WX?Ck&WTn zChey_#ecz(*w_6;UP|7a_pZ)GghDst>6A3&Hk3~Df4vqNId^JppZQwvw-W>Z_CzZ8 zrpap3Vb;urGfvMP>7E`4&bBvXwi?Q9spf_6cgza^s;*o^IN`PF%((Y;Dzk|bkz`K4 z4C}{&KEqipyGHI-_kk`c12joKSJ~VuP^$OSa9q%iC!X~`Z12goRC%xO02EK^5l=ZGav;P)x6Z$Jl{|WEk;B5;1nP+`H z7`8}=ZD$V(ZjTD;Nl297kh}~N=W>r|CBBquk3e*wKY6k9V*upuI)JfQmA~JUxgPZ$ zrw99od>6#?9x{SO3Co#MvB5(F5$gIc{m2D&6tb>+f9%1MKQ3pOipd}2`|uE6%=hn% zq7)5eJe1v%JyBRWXv_BgPfusoi>wxg<${z;^1XY~MSF&_}I88Zn1x~HeQLjgJt7rC4s7Fvq$v%kF<&^al0r(Za#?nEZM^h1HUT1^zZjT z{~F2N1O8KD>1~Cr6!?}?mcQj)$?t)LlWWpbI#JSW2o+$%aX}bG;6i^BDh$|+sI0Cl zo8O_r6(B;b0wFFMi2-Ldx~uWBTC zEw%1L4}kG@rY^JXHk!nnPH@LOXQfI%e0iw4;@SFz+|q&tDG8m&42psZp1JA#ESXeJkctUDYp3zK_!737;7hjJL?>~O zY7*oYI`#o>AMsQ2HUAdRAaT2QMAZ$oBdRjC(k{_@Ch4ZSv3e)w)wuW;G>ehyi4Ad* z>f}+6d-n7GKEzFN(&tcH$6*d4QV}6yJ*|pB@k+@r_~J5v4L@GWSdhBYD0$qNZG&yA zwg(B=)SKKMr{}2;*l&_gq$g27?3ICB4qTUvO8Y%5okPvQ|3Xfj^m%%BzLAr9)Ff1M z3BcL^NKRkfoL8aleQ4C$%F*-loLlh0Fq(1_70sXw!I*6%I1Bymr8DyD!F06OeBsGU zkP`YL4swtyA?^5I-%a(4RQdCa{5(Zav;X5{*7No6jrT3Toq+M1FaHOEpOVo~%8(XN zh#O!qWV9q$KapwG2oFhS#JG@gkvB5F03@)mLcZjup!7i0pV5Z70+(Sr5b&IA6yW8; zL`?4#moUbHgm(vXAhx&KAaMt<+diy64ZI_9@}3TGN-r4)n!IDfPAIziHkj_8_kG6~aeDOEV5i~ck!tY|cG6lkZ~!Y;PqS#}9J0%#jT zb%_+L|JFz<#TAaOa~N!ur>EMc#-tfhD4*)0v>%fe)*`rION@r=h~uL-xCE1{8h;C2 zva4eAweUIeDCLt^7u(2Y@Ot)OB~EC=I+ z8f}ov>XyJN+s=x8t@*d$jPL0y%TuI{)FNn>JUqL);>JjIyKS9XHOuS+fUfG=6G<$w z8#YCS##vR9ScwijosW@e!+uHKK7_4mtp2x#TZk6WwGMrKk(F$XmGs6UJhU4O<>mb= zKDVO-F9%}=&w95YA&inR^}aqj%wf!Je-oiJm&44a8(!pCeHYFv(NRX!azo^xZQ$ zcUYmc7CJOsDu{HgBE?`+rz^(u9MdFJ6^kU4weTm{iZjFMHQDgwkj?Fm`FFXU9}Uh; zUEe8zTp`f?6x*y_Zqy*!T{>4byr_LDGKe6-WZbDZK!OwIA}$F5xUj&N2#famL$YTO zbi_k)^M^jFabg;u_d7Hx*}SA__9kID+=V7~!kcK6+@JVB3_tA-6-kzx1yvte5gr~a;<41OYj01 z9pfD@rgf&NhZ0IAAm^7RUyYq;z9lb*q63$g2b}t0&rH|vpN>Yj@HEB(a0VlEP0a~4 zS4r?8ymG16%850Q4fmmyqgRfjns^*PBW4ju=^9qa&ysO$5k$_h86raG@*Hs%l_;il zCq2C9hMZ?<>OJ6$&7W2(z_g3Siz+QrI2i5n^;$e8TIU6L0q}`Q$SHF_PLCw>OFFj# zbbiim1+ely|MDg8Hl=rvI0(L2>0(q0un4|w zzb2Y0R@HQ;!xB;$Gue8bs;Qokr$y4C=Y0B%A5YU$AY1z_aX_9U&~IKg0mep!B0Z$; z7v1yd^6m0@1YoRZp%xMenY_7ZgcEb|WK9o30*Ck%qLsqUayhRQ|YavxdS z7r3C3`@Y}{3tvh_aEC+gqtv2>sW8Uo>*5dN?&|=-0LyWj)sWdZ?>Q$^s}KHGBR%ig zIDSUL+grhU3xcvp0CN85LU3(wC|51#(i^?0^9f`CV#NbHBc90J^U`2?&N`B%<3d-x zFNWKF{V$AZfegW6FiGJqWEp(28=)aI7yRjci1ne-8Q9~F8JCpE#>2r>V!jn{;?T0mMNJdRgM+xAYV3wfJnskJPaT5ie*=%qJ1zm z;P@4bNtE&|ksE67Jab*u$fh4=s6s|%{XpB`09K2RA~SBP5XI zN6du%pvp96?$^Rzp31z&a)O_G8R2@f@h6Fh9l{O-5lX(>Y@I?(MM$N*;%Phim@!-b z-vXTSKxHh%J#Qj4xlE?YxdH*rRAp0P;_-fZ+yPd|@uhbv*}k^%kHEc2rVe+2LdUhs ztT}TooXJGww84ry4pwDsHTFf~ihWbNgWhoDg0-_s)%URIqcm1TlX{|(g8qh3jAsLx zxUC zP$`ZJoj?}A2Fa{3(5IKlB^`@(B&Q<)3DmyS#pL&P9XeWG^JM+S{*O)%Tb1CnPubo^ zt{*X5kySjA()7m$Ct&H|>!r!9@hGgqKEO{7F7~?|Gm4cBx=|;3k>dGBteG3#puXdo%eqR6C$Bv-9Z_*JG+wX;) z)S#F6ISmxj4v=KASIFo+{P8{NG8J(OJd#dR7fKODRsr0Q1{3Pr(-3$7W~y@(F*s=C zC+3B>03B{~NBY-Ee*CYMVk&<&DrlS>A)+0X#m*}sIFb=TQyVa(s_QPE_h@bvE1m2+( zr-3HkO9L0|rxj87Ih{6pousJkG>4U^5&GhNB2@0CvwFj!3s9T7ivj zR{RVglMNE{&$R7rtmp519J547ClA5#rW!5h+x@;ga+9u30?nSX?$fd%;I48X z3#bBQ9YX&>8e&9eu)4|UHMt{St9c&0%{GUifRm@oX4c~;g%^H!)HLSsb}Qce6gdy^ z^u{tnyU#ANrP*v~bLb*>xA1KY#uSgdiPQj-{C-n_6Xqu#dtRp_1lTg3w;fs^F#%Gj$;T??N8@q+7s~1Gmme*OJvqe zw9e{jmweDMPY;s=+sVf(m`dkXyB}t0CEr#34%l4uD>JfFbhO_^^14NpQm0(p0-I|F z_%n_L>On4MJx;^W?WAtr9^y>28U&I>+fynO2*FpDK>(kSHWt!6)9L;Zfz+-J65|oz z3HcrK2bdY zJdO3TaTqqxws9Fu$krBm6k*j^1W2V-MNJnpdRNI@Alx*(Swyo2zL2`T>9t?8CT>Yj zH#Kw#tGy*!QPyb0*b{fGR{`~L*F2};q}soCRu7-h!g3UgH%NPC4j)gVL$P{j8XxoX zuOE@m{nEfL@DFb}cmU@7J?|Cg`5a_uivv8FomAq$sT}qdb{a;AVi7`#fE%++rZZ#_ z-56j=_mY}RXdwTA1cWnqcqWe4WAQUu=_B5_9)6~+vTVbu%edE=%NTeX_v)|`>@tIK zE+UM_ig4GL|FV{42SYMdW3Yk5M5#aFZNWTMHJyoAXU?EzQZ+!-Voz(A)F+@S{e$;}+0^}o-^n~>k&|Up$Y~Q& zagAMu{SXV^I7P2x?P4CeM)QuX zyjv5(^<8K;1YD%|XBhY_+013Swdcb0OA?l4t-@!!rnc{^f_K?`QkJ@^aB+b(rk>^t zSF%f+0)i~OCJL`flyM}&*Y#Crpcy_XKAi6VJTw&E#Sw3*k9p4RP4~ggZTjWg2{(d~ zQackxcE9h#wa|1(`N!wdGyEezA3Wyy6$>EuirfVgr7dWHhG7%tf`sBiFB{Ds^Esx3mMm-+%SH;K zl)6=P@TJkpAuARH1B=`mDN(%M7Uh}OhjKSOPRp!<^g<<)O1dGKh$ITR0KE7@1$oHW z`0vP1N9HVY*SaFGrObQq3@_Keclm2*V6I?M?YyTqc&PJA(C_G*oV& zLgB3HN?JGwU~(gFf6HXTG}^)airvMGbf!J}qQ}?FC}wS@n{vhjv!wjKRe02YJ1jTW zT{RUGg;2w2Z_rpWb%5u&5z04btv+7ip|+$p#c@T!=`Zf=jyXgQ0TPT z%!!O*SzR{jk1Fm?BuKhVwyYs5`f_~PX zJMTn%1pBnAOM4Tkgdl_HN44DWDXyVU5j4~33C*P5E2^Dp+*RITF-Ekd#Sfw>~Q)W3FERYdkU!VXtt*9dhG;&!#J8OAIa0?2=h)~ z0sKW)_(ZgWz9(AL5s2J}oNq=4u;TkrW!}A}e=kks-D*D)7+!>OU1y2uL-P&g&a28F zA=5e#nUn)Na88m4KGZtdJm%d|PVi=IP{uJi6{{jM?zm82VrIaZJ$Ykl5d)nLFgNK^@ZNFei0 z6kwL>IM~q<vKSva7-7MOTG+K{JQ*WWXC&-}&bG=tOO>aa032QsnR+61MR!?sGG^7_Z6;q70z%z z6m5QbN5OC+xLcLuszz0K)nZ~6h?k;HWCR+Xaz%k<7v2%<5$Bt>W}_Xjj?L|_<$!Q6 zA4tdue7^T+wkTWroGNnUNmmwW)(RQ+-gNA~(r`_=%@7ND`1lU@xrgdBx{?gB-=;#4 zcD!>|&iBPV{u4l9jmLxfMBI2{N2{$uGYny(2*N%_a<%a~e9v?TK`B`xJ7c2$2QoJ@ zpU^db;-Ctyq;9Snq_omD+}R&4=KesLSu3obc{lLa$O#ag4ZGqZeNy;A*|O>VU7ulm zcDkGk^Xr$>&~wq0HmP)>6wyd%F4$|tlIu9R?8RBjLLnEbuy62j0*M%`6*zDBk-kFd z6uRK-=xFZnruOeVRL+*9@doqTXOngZWKGDGTa#ng~J5-GozI@jCs`Cur>iUz;S-(-z1!niZOShFr1fNEW!HP(x&F2WsbZj_=ZeQDFCu#1tV;_k%DIzN(>fu6pWw$@ znNzrnFMDI%D9wsz09IidNZMLi;l)fd z%RO`MZ-hH@_)IqNBjR`o-4u(2WdS&jgx6?m_wzv=1TQP*+0ip(zGRFvyiZj^*tZ-E z1@&UnMN8?h4vk^t9AW0r5#=Tn@XK#BI%RAFSbUXxBCK4*kv+8RtAjv4|8iy3d(O53 zQg8@@f5q8>Wxw1sX;8cDkpJwF=}nuigH}2!1VknEKem_TAm0!;pqHWQO!H5_v~78N z22$u}Q3$WW`4J!}Mdp!E*rlK0K=+WXQg9A+GND@lM05}IOY0X~u*znptV?EQ*-76| zb%FUeR~-6_)GSmMg5DF7vXcNihJfVwYV`xW8OyIecF^mDT^TmzEEK z^$FBGAK3VL)9%t!0yyC1snO%$dUIA0^JT+>C*{lZnGZ5>u!s1ZijZe@EWx)bvgU zh|0x`i1$*a^Brhncx%FiTRpL2 zXnols4q|n!1JZOM-^8(MeL|tGT{KMwfG6+u7iK<~G-ei?Tfl7DZf61X#^PPv7Dz@R zt#ScTp|+pRK(;Riy{v21K=jYxqTWmPMwBCFoHt=&k1WrFE$PY2!!@a=+8J6Z=c3ZW zEoDL9V7|?!IhE3&HIkhxlDUSnCrc`>Ia++R!yFM11lDk(tq?nLaHdr^VcN*0!pnf{ z_|BI%kMu}VcWRaa)YdQhHu)A8?84lZbm|IoUm5jf&NKm*U|5fmSVgNn^Xee(&a>N2ncCqro%}wUzEuY=9pA&jdcLOc zybVj(5!gfY4Xw6;5fx#szs&wn=otJ6m6N@KR>_a4vAI`ad2g=BnbBS_WQXh~G4k3V z3X8-1w8B-t$Go6*7PZP)lxOEsg;PL$f1d$>YVE^T_mk*nn+w`=Et zY>Ujh2lf^H@d#{>_bDHa!WJA3MV)H-Z70KjBmr|JsjIcuXkJ+)wjbtYB~Rs0)n6Rj zG#cw*|)CpBo)0%I>s8D%Vq^qU|sRYn3LnF|X z_AStob~;g1?{i9=kV_aAh%=pU$%Gc3I~Q$MMEqp_s!BkkAft77^#TUR*Xyb5JzW?*Z`;|g(69XIKxOlMV1{cTCV;UsmQ#tER$er zuf2}W$$$CC93?O<-fHjIEQD80?13pyOOuBj@379en9Nx{NxPl7^wSG5>p~LIa^&2m zsn4}@2UNDY#v%8fAI2jnj1Sr;aU*M(>w5LobtgN5q=ht)wE`ZDk7@&Wb$Zi^&8C1` z7Bq6(zDC}G`4%}|LRE%kuzJ&trcuHJq&n;7Axp4bNk03%#Aq489LGSOCK%U@FQKL&}{RCGF&=J}3ZnC-;>!YS@{F^?jm146&56C7 zH)GO@im6@54-XJS2{`K56yAM2(#YJiwr%jGC71E-2 zTgIXc@!vxT;`~J!l0Jpuo7rq^OGT)$V}|H5Xi(=V;5rxTirLm(&onId?K&a)q;F|o zR-_}C1D{(Lde`@B(&4dgSr=Xa%g*~y5j;v-P#4{zb!`USoZCrr)MJ{28CbVio%2aK zhtxuRu^MrmYklQGI!MiGQuz3tPEvM*yW5CIb-ISiltUi1&)O)>wUDX|&nfN;Chvp4 zp4c5YwUT-aX3_A1=5ZHn+yJa`+uTy?CJyW&%ak4#X;UbXY2Ojj*l)>z==mk{or3E* z$lMutDG9@Jv1+XrkV>6{u&2oTE# z%_ZLzfbqi}g-62Bn%`9=MAAT!2Tl81<|Yx>%M7Prh7!zq<_=+6;xDK2L(i}gs(1~g z)AiK-+lXjAGhfKp12<}yD?64Kc*C(wHh5=xQ@Z=Etb#Y|4I|N{SM}iiwRX&wtq=z) z(YSp^JR{vmjD8w+Js-xeHZV_2YIVznxgYuA?iL+QsXSMb$CC2HzP06p!LmijrU{(# zI+^e^SLOF(fyo=p<2|LW(dg^?0T8!_>g?7cNM6Y*&8XWQ8;JfR+2+IHORU?Wot2%=LtxD( z(y-zs`DfeD@B*_ol6~yMvmmkDr?=O!Q-(ehMqXXoBNn?LvgQh}d{}z6Qj%d5Jmge z7n{qalOf_2TaF|TUs_V!lsDgN-^!t{o$F)~<3D8b>~8`ebeX)>#$*HF4f(%O1%sAp zeb^R!_0~JM>eJVENX5LE6^-jft3wW$%f zaP6q85(RLCb(&ZS`)3qSVlhpVN+T%NiZ+Gb8*D5CKb`CUINuq|r}^xHJvx$)a|-9Y zB>t{ZjW0OUXbV2X5XngT8{F3=+7eSZ6&>18rOv~*oO^`*Y+b@$VxtH!U-~Y*4csO; z!*F4@C*M_8S)#DM%rk_pUBoy%N``Ds`P3zx>4-uV$FfI$9v;Y5yh?oW()a~D167x9 z#yh~?E1)KOn3tP>XiXSKUxYfMwQz?QV~v*rU|P#G-GMdBcG}xdN;v}g?!l_XOTn;< z6eGSR=yPZs=Ue5F&BW8V;MbS_X6_S$QNi37*RqtKa`+}^UkJ(#SIpT;(@S}|UBV4h ze`u>RMoEfjaz;_J<|`IJK|;#ABS8oZNNiSx;RF_Mr(+rD*(+5zYaJWW<*WIsxMR*8 zE|6UoNb=Lyyx(ro#pSwMhL}~v9#Z9O7JM@mexdxjg|J499*UU0gs69eHc5eqHz!*N zGbe*NBe)8p+_DoZGw|E(G6MQi6*l%eV!I}^C9M~{sUE!N5bo>qHj*RczH zp^kx`#DrWS@@dax%yVUS-swb4l5fwG7nxMnkoAI?q}7f`KpTM(>NkrHeur_iU> z9*DUI%Q%ZOw=v%ji8*Ved?VH-dW8pZwW2rAZ5$ffq9x9#OI-sV@V@jm?tL3j4t7xC z&sHmcvB%eS3%aO;qL*pTqt!1x6F^qzqej_tKmQ^^X+J82PG214IHML6h3>>Fw!BUT z+_2`8V_YKZl^JEPI96?94x$`QqMwmCY|G{`h_4*MA>+Nd8O{RE*cV4>hn_hBG>Jd%>}n0^!G!a#J5>LTFNz#=P2} zYG;9z)WM5e**pS8Ma#qL6?U^rI-k4_gxhaR4N>mjWujk}jWFWtsaH!i85l8k591{OLD)Gu%q%1m0lt`w=LkyD}Hc<{$g7dJBFAg-s<>^kLs|4UOrePFWAc?4f9 z@sNzCnm(y*;o31n8C5S@nIk5oMxiakxIf&NeBbDzFEOW^-0ycYsJp%ueA+H{IeR-= z9o~X;HXiHEg|fZ55Q6NVK2rZ_!$`!0)969$;f+lO&7{7HR2D7bn125k)@_$-xJi0oQ#Mo`%ITjLObTnuytC(&pd*J8tg0wLrV70ki+V9A{ zIL+d+vw99^0TGJtte}0*O_JXdPYkkp}&Q_KS&V6Y_o6Lb9N6lSAyQCv@>kKFdco3 z^?UAZYk94-s>V^b>*ybhd`xtAtBk+czLjOXTc0v&FNL=l`#$%(B@k`V!N^xlZVLnY z%;DyGYpyyuKO*XD)owhq-_=yqY2M49xzGu>f?Cd-X)gU7`zIqmx4mm*H%!wXzU;q} z$ZChmWFqu=UY+82MEGXz8wD0dNUY%(P!&<*(woWC2j%x(gcd(daxOmZ)f?H<=Gw-V zYeEe~dZ9)*MY-s9F?Xp{$8J(4R_AO&I$yc8eJ7+i8)Zp zt-m?iRZmb!{{50bP_8BVhFt&a?hnDI>n%E-_Nj^BY|{g%Aaid9-~tdIoO4QiX>jUw zwc0?;3P5d|E7^=Ygkr+8IC2vpN3cZWB;}}$fNn#k5NDA%IT)@ZEt5MDTv!N`p6tgO z8Bo9m4-ib|yg47kcW67)Kd#p9?km8skJ(7 zqWB4xQf%az3hneDP_%)>ikTF9L?A=wV4@W!Y-F-FwN>CZO20FwnG(xjco!!nb_A7{ z+$?9hm?%_kwT8L~^Z66?!pWO5bCvC`{w#>V7jcF3=`z|~u+mlNF8TE@ zETk*p_S*3qfE-;h(FY;+u~K^@vox7i>@xfYQ{s1Hl3}u`Fmj&bXXYi5yX=SX=W-(6 z!oM8y_d=QzD%2Fdn=Z`N zHA_J(eHQ5w=F3kmSp;0v>gLOwTw@)~!2x-Mu1~gq0)tAMMC;8fi>zj$-%Zc;mTA@R z)SI+ep2YxezIR)}gr0N2>rw4DX=|+o=NUrW12Y61&tA1Tyrkv|f6R<_9C#`I6G~WQUWrfn6Qr0ZuUa9G#5uKwUisoQ1QyQG~hV8 z5Ww5-?CNF@;$2kCMQe>Wgc4pWQHDhrGs>f-`5HUyv7uQN3Tdm^(hmJh$Fjn$oqLG) zV*Lz*P4Cxu)G^yai!dIDN=LUin5jrJG2P9nwR`3T}hMJH#*SvTPdZ0171T(y+Ma+LkrA*Hw#07j7x z_q<_y!(@8Wme2}ARdU^GnFVnP zXBxIS&C%)yb;uIW?aA6hd?=74TJy5?#U*2m?;Yu`1<3TOD+cl0gPh#A$3Ci`w0UHW z1u=K;LQ?y>vu+VSlz$N}1__ROumHDwn8WXxBK4}O@fkP#+k%kv0aE#VPMMGklIuoM zq#;F z>Dl~n*2i6kjUP4wEB9H$d!hu~6nkRHm?;+Jgr*Zc6n>d*?wJ_!&KBwH06r{ei)z?d zm57=taRL_dZk3#o=>p9-++E<%w5&+j-oQDu72+H!UESCXbWUNf@DZx-TV66@yXGGm zgPE8|EO)RXnwM6xTnOD+5(EQ0%TOKYb|cp~>lB&y5c8f)M-)a1t1wqmeB0Xxavd;G ze$Y!QbEGTvFRXHgs#%HJA}meaz}KOt)E|LIGVeo?y>fLZ#Zh5p`vp)lbquvG;{|+R zo*AqE%GK@3#kxw_^<4`lZ_bs~cO*)Ecl`&ExrPzCc3Qo0EZ$TZ+5BsC9ac2=3ZIv8Ri#Z7_k9iCWsYLwl?S! z`!zH1M7`BCOFuT|suPD{cx~BC+M=n19D1@FcX!@tN#_Fifn5x3Lh0Ux$eS{Yd*tye zMWCJg-6g2Jl(>bZDnvJIiAJeW_ad|x`unc;o;@>v59ux4idPI{W9PTbd&ZlS;|*%R zd7AgoJ|ER(MLRx;#^jTUQo_2N|K$Wz+n4|F4B?MWMD1|EFy!Oo;L0IL^gric{_N2J zA3>mjV1)(; z_kxAAR?xPU)Xeisly6QSn+rv|V$(4&$G-gj`e_>b^kkpJlfb|ZXLIzjPG=!lPmgDRV_ zz!p~!5QqQd8(C|Dp?Y-s)LT2{6kO>HxM}o{J?TJ7>*#F~1HWNPP#GRv#z5Ep$1st7?^a&>m{$CCp z3xkQRk&DaU-TYaeaU~Z_83u36PpF63|D%d1Iy+c6o4L5iTDiEI+5az*)8C@}!Y_`@=5(0gzoFE$(q z2-+v|naO_RAKC~W<9ClVT}r^XCGbY}1W!!=8~*|NCEeeR&<_s;J2^o>fFpVRMS^Ge zP5Ryn3px{r`w#JHCi%zJMX~=&M0>2=(=1t!@zavO@LZ2`X8o<@qufT|)JBhsxyv-i2fhapX34%5KNCb5SgmKNiwZukDK-jLRCjecy z;5^3viKh$!0bXT(R5W$Lc*e)rzvB@80h^hDD%B}b{_ZN!#||vfU#MQQf5w7;A{R26 z*joK(Sojl)@b8D=n;FPKll4D6^CZ69A63A6{+3_@E;!sA&13EN$dSKFKte#sfN%S! zPaC-%C|;KU)Y19m7Jd>p>WTbj``>uJj~I{TKM9od1dr?Z8?W7s`WVk*U>5rxjN1cm zPkWxk9gHUjrGI=fI6aBO@kBn7$8Y>vE#7}R>33KGaD!>UkJZz0A=mp~5)2404f#LB zC!XF-FOb{&j-* z#|PpGwmuSEfxv%+|F$y+H@yTrEIt)p8v}yueB_TYO&@Cj!;8#LJ^{#gDKiu%K_op-bOB|xVYY#FAp!Rh-D5aJPb(Nt1_D1sPhROv zJ-=S*LmeR59^oe^PzQdU$m#^q4+uSO!T)`Rfu$2asll-uq&G-T`_C8D|GvT=e_es! heUD04H%M3m4@*%727H74>TMPX1F)?QLC>$F{|AkuWeWfR delta 43296 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%0A3oYAs&P1L!LXDzLGWx{s# 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 A!TNUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windowz variants - -if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega \ No newline at end of file diff --git a/hive/src/main/java/com/mongodb/hadoop/hive/BSONSerDe.java b/hive/src/main/java/com/mongodb/hadoop/hive/BSONSerDe.java index 00573ed0..7d451453 100644 --- a/hive/src/main/java/com/mongodb/hadoop/hive/BSONSerDe.java +++ b/hive/src/main/java/com/mongodb/hadoop/hive/BSONSerDe.java @@ -22,7 +22,8 @@ import org.apache.commons.logging.LogFactory; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hive.serde.serdeConstants; -import org.apache.hadoop.hive.serde2.SerDe; +//import org.apache.hadoop.hive.serde2.SerDe; +import org.apache.hadoop.hive.serde2.AbstractSerDe; import org.apache.hadoop.hive.serde2.SerDeException; import org.apache.hadoop.hive.serde2.SerDeStats; import org.apache.hadoop.hive.serde2.objectinspector.ListObjectInspector; @@ -62,7 +63,8 @@ * The BSONSerDe class deserializes (parses) and serializes object from BSON to Hive represented object. It's initialized with the hive * columns and hive recognized types as well as other config variables mandated by the StorageHanders. */ -public class BSONSerDe implements SerDe { +//public class BSONSerDe implements SerDe { +public class BSONSerDe extends AbstractSerDe { private static final Log LOG = LogFactory.getLog(BSONSerDe.class); // stores the 1-to-1 mapping of MongoDB fields to hive columns @@ -85,7 +87,7 @@ public class BSONSerDe implements SerDe { public Map hiveToMongo; //CHECKSTYLE:ON - // A row represents a row in the Hive table + // A row represents a row in the Hive table private List row = new ArrayList(); // BSONWritable to hold documents to be serialized. @@ -124,9 +126,9 @@ public void initialize(final Configuration conf, final Properties tblProps) thro // Get the structure and object inspector docTypeInfo = - (StructTypeInfo) TypeInfoFactory.getStructTypeInfo(columnNames, columnTypes); + (StructTypeInfo) TypeInfoFactory.getStructTypeInfo(columnNames, columnTypes); docOI = - TypeInfoUtils.getStandardJavaObjectInspectorFromTypeInfo(docTypeInfo); + TypeInfoUtils.getStandardJavaObjectInspectorFromTypeInfo(docTypeInfo); // Create the BSONWritable instance for future use. bsonWritable = new BSONWritable(); @@ -209,8 +211,8 @@ public Object deserialize(final Writable writable) throws SerDeException { mongoMapping = fieldName; } else { mongoMapping = hiveToMongo.containsKey(fieldName) - ? hiveToMongo.get(fieldName) - : fieldName; + ? hiveToMongo.get(fieldName) + : fieldName; } value = deserializeField(getValue(doc, mongoMapping), fieldTypeInfo, fieldName); } catch (Exception e) { @@ -250,7 +252,7 @@ public Object deserializeField(final Object value, final TypeInfo valueTypeInfo, case PRIMITIVE: return deserializePrimitive(value, (PrimitiveTypeInfo) valueTypeInfo); case STRUCT: - // Supports both struct and map, but should use struct + // Supports both struct and map, but should use struct return deserializeStruct(value, (StructTypeInfo) valueTypeInfo, ext); case UNION: // Mongo also has no union @@ -306,7 +308,7 @@ private Object deserializeStruct(final Object value, final StructTypeInfo valueT for (int i = 0; i < structNames.size(); i++) { String fieldName = structNames.get(i).toLowerCase(); - // hiveMapping -> prefixed by parent struct names. + // hiveMapping -> prefixed by parent struct names. // For example, in {"wife":{"name":{"first":"Sydney"}}}, // the hiveMapping of "first" is "wife.name.first" String hiveMapping = ext.length() == 0 ? fieldName : ext + "." + fieldName; @@ -320,8 +322,8 @@ private Object deserializeStruct(final Object value, final StructTypeInfo valueT mongoMapping = hiveToMongo.get(hiveMapping); } else { mongoMapping = ext.length() > 0 && hiveToMongo.containsKey(ext) - ? hiveToMongo.get(ext) + "." + fieldName - : hiveMapping; + ? hiveToMongo.get(ext) + "." + fieldName + : hiveMapping; } } @@ -483,7 +485,7 @@ public Class getSerializedClass() { @Override public Writable serialize(final Object obj, final ObjectInspector oi) throws SerDeException { bsonWritable.setDoc( - (BSONObject) serializeStruct(obj, (StructObjectInspector) oi, "")); + (BSONObject) serializeStruct(obj, (StructObjectInspector) oi, "")); return bsonWritable; } //CHECKSTYLE:ON @@ -555,7 +557,7 @@ private Object serializeStruct(final Object obj, final StructObjectInspector str String fieldName, hiveMapping; - // get corresponding mongoDB field + // get corresponding mongoDB field if (ext.length() == 0) { fieldName = columnNames.get(i); hiveMapping = fieldName; @@ -572,10 +574,10 @@ private Object serializeStruct(final Object obj, final StructObjectInspector str int lastDotPos = mongoMapping.lastIndexOf("."); String lastMapping = lastDotPos == -1 ? mongoMapping : mongoMapping.substring(lastDotPos + 1); bsonObject.put(lastMapping, - serializeObject(fieldObj, fieldOI, hiveMapping)); + serializeObject(fieldObj, fieldOI, hiveMapping)); } else { bsonObject.put(fieldName, - serializeObject(fieldObj, fieldOI, hiveMapping)); + serializeObject(fieldObj, fieldOI, hiveMapping)); } } @@ -651,4 +653,4 @@ private Object serializePrimitive(final Object obj, final PrimitiveObjectInspect return oi.getPrimitiveJavaObject(obj); } } -} +} \ No newline at end of file diff --git a/hive/src/main/java/com/mongodb/hadoop/hive/MongoStorageHandler.java b/hive/src/main/java/com/mongodb/hadoop/hive/MongoStorageHandler.java index c203a25a..8bc99de2 100644 --- a/hive/src/main/java/com/mongodb/hadoop/hive/MongoStorageHandler.java +++ b/hive/src/main/java/com/mongodb/hadoop/hive/MongoStorageHandler.java @@ -37,7 +37,8 @@ import org.apache.hadoop.hive.ql.plan.TableDesc; import org.apache.hadoop.hive.serde.serdeConstants; import org.apache.hadoop.hive.serde2.Deserializer; -import org.apache.hadoop.hive.serde2.SerDe; +//import org.apache.hadoop.hive.serde2.SerDe; +import org.apache.hadoop.hive.serde2.AbstractSerDe; import org.apache.hadoop.mapred.InputFormat; import org.apache.hadoop.mapred.JobConf; import org.apache.hadoop.mapred.OutputFormat; @@ -57,7 +58,7 @@ * rows in a Hive table */ public class MongoStorageHandler extends DefaultStorageHandler - implements HiveStoragePredicateHandler { + implements HiveStoragePredicateHandler { // stores the location of the collection public static final String MONGO_URI = "mongo.uri"; // get location of where meta-data is stored about the mongo collection @@ -84,24 +85,25 @@ public HiveMetaHook getMetaHook() { } @Override - public Class getSerDeClass() { + //public Class getSerDeClass() { + public Class getSerDeClass() { return BSONSerDe.class; } private Properties getProperties( - final Configuration conf, final String path) throws IOException { + final Configuration conf, final String path) throws IOException { if (properties == null) { properties = - MongoConfigUtil.readPropertiesFromFile(conf, path); + MongoConfigUtil.readPropertiesFromFile(conf, path); } return properties; } @Override public DecomposedPredicate decomposePredicate( - final JobConf jobConf, - final Deserializer deserializer, - final ExprNodeDesc predicate) { + final JobConf jobConf, + final Deserializer deserializer, + final ExprNodeDesc predicate) { BSONSerDe serde = (BSONSerDe) deserializer; // Create a new analyzer capable of handling equality and general @@ -110,19 +112,19 @@ public DecomposedPredicate decomposePredicate( // expressions, but we could push down more than that in the future by // writing our own analyzer. IndexPredicateAnalyzer analyzer = - IndexPredicateAnalyzer.createAnalyzer(false); + IndexPredicateAnalyzer.createAnalyzer(false); // Predicate may contain any column. for (String colName : serde.columnNames) { analyzer.allowColumnName(colName); } List searchConditions = - new LinkedList(); + new LinkedList(); ExprNodeDesc residual = analyzer.analyzePredicate( - predicate, searchConditions); + predicate, searchConditions); DecomposedPredicate decomposed = new DecomposedPredicate(); decomposed.pushedPredicate = - analyzer.translateSearchConditions(searchConditions); + analyzer.translateSearchConditions(searchConditions); decomposed.residualPredicate = (ExprNodeGenericFuncDesc) residual; return decomposed; } @@ -136,10 +138,10 @@ private class MongoHiveMetaHook implements HiveMetaHook { public void preCreateTable(final Table tbl) throws MetaException { Map tblParams = tbl.getParameters(); if (!(tblParams.containsKey(MONGO_URI) - || tblParams.containsKey(PROPERTIES_FILE_PATH))) { + || tblParams.containsKey(PROPERTIES_FILE_PATH))) { throw new MetaException( - format("You must specify '%s' or '%s' in TBLPROPERTIES", - MONGO_URI, PROPERTIES_FILE_PATH)); + format("You must specify '%s' or '%s' in TBLPROPERTIES", + MONGO_URI, PROPERTIES_FILE_PATH)); } } @@ -165,34 +167,34 @@ public void commitDropTable(final Table tbl, final boolean deleteData) throws Me if (tblParams.containsKey(MONGO_URI)) { String mongoURIStr = tblParams.get(MONGO_URI); coll = MongoConfigUtil.getCollection( - new MongoClientURI(mongoURIStr)); + new MongoClientURI(mongoURIStr)); } else if (tblParams.containsKey(PROPERTIES_FILE_PATH)) { String propertiesPathStr = - tblParams.get(PROPERTIES_FILE_PATH); + tblParams.get(PROPERTIES_FILE_PATH); Properties properties; try { properties = - getProperties(getConf(), propertiesPathStr); + getProperties(getConf(), propertiesPathStr); } catch (IOException e) { throw new MetaException( - "Could not read properties file " - + propertiesPathStr + ". Reason: " + e.getMessage()); + "Could not read properties file " + + propertiesPathStr + ". Reason: " + e.getMessage()); } if (!properties.containsKey(MONGO_URI)) { throw new MetaException( - "No URI given in properties file: " - + propertiesPathStr); + "No URI given in properties file: " + + propertiesPathStr); } String uriString = properties.getProperty(MONGO_URI); coll = MongoConfigUtil.getCollection( - new MongoClientURI(uriString)); + new MongoClientURI(uriString)); } else { throw new MetaException( - format( - "Could not find properties '%s' or '%s'. " - + "At least one must be defined. " - + "Collection not dropped.", - MONGO_URI, PROPERTIES_FILE_PATH)); + format( + "Could not find properties '%s' or '%s'. " + + "At least one must be defined. " + + "Collection not dropped.", + MONGO_URI, PROPERTIES_FILE_PATH)); } try { coll.drop(); @@ -243,11 +245,11 @@ private void copyJobProperties(final Properties from, final Map // First, merge properties from the given properties file, if there // was one. These can be overwritten by other table properties later. String propertiesFilePathString = - from.getProperty(PROPERTIES_FILE_PATH); + from.getProperty(PROPERTIES_FILE_PATH); if (propertiesFilePathString != null) { try { Properties properties = - getProperties(getConf(), propertiesFilePathString); + getProperties(getConf(), propertiesFilePathString); for (Map.Entry prop : properties.entrySet()) { String key = (String) prop.getKey(); String value = (String) prop.getValue(); @@ -261,8 +263,8 @@ private void copyJobProperties(final Properties from, final Map } } catch (IOException e) { LOG.error( - "Error while trying to read properties file " - + propertiesFilePathString, e); + "Error while trying to read properties file " + + propertiesFilePathString, e); } } @@ -282,4 +284,4 @@ private void copyJobProperties(final Properties from, final Map to.put(MongoConfigUtil.OUTPUT_URI, mongoURIStr); } } -} +} \ No newline at end of file From 1b0591b99c626ba05566e002d59b4fa2abe83464 Mon Sep 17 00:00:00 2001 From: lioonsun Date: Wed, 10 Nov 2021 14:31:35 +0800 Subject: [PATCH 3/3] update --- gradlew | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradlew b/gradlew index 2ec45c60..6c291a37 100755 --- a/gradlew +++ b/gradlew @@ -161,4 +161,4 @@ function splitJvmOpts() { eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" \ No newline at end of file +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain \ No newline at end of file