From c9ba44a30717609990fc075c9ac49be4f65a1554 Mon Sep 17 00:00:00 2001 From: thatben Date: Fri, 7 Feb 2025 14:51:03 +0100 Subject: [PATCH] Implementing crawler --- README.md | 2 ++ codexcrawler/application.nim | 37 ++++--------------- codexcrawler/crawler.nim | 68 ++++++++++++++++++++++++++++++----- codexcrawler/list.nim | 30 +++++++++++++--- codexcrawler/nodeentry.nim | 7 ++-- crawler.png | Bin 0 -> 47086 bytes 6 files changed, 96 insertions(+), 48 deletions(-) create mode 100644 crawler.png diff --git a/README.md b/README.md index 91927f3..68948bb 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # Codex Network Crawler +![Crawler](crawler.png) + [![License: Apache](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT) [![Stability: experimental](https://img.shields.io/badge/stability-experimental-orange.svg)](#stability) diff --git a/codexcrawler/application.nim b/codexcrawler/application.nim index 1e73577..c906b03 100644 --- a/codexcrawler/application.nim +++ b/codexcrawler/application.nim @@ -108,15 +108,9 @@ proc initializeDht(app: Application): Future[?!void] {.async.} = return success() -proc initializeCrawler(app: Application) = - app.crawler = Crawler.new( - app.dht, - app.todoNodes, - app.okNodes, - app.nokNodes - ) - - app.crawler.start() +proc initializeCrawler(app: Application): Future[?!void] {.async.} = + app.crawler = Crawler.new(app.dht, app.todoNodes, app.okNodes, app.nokNodes) + return await app.crawler.start() proc initializeApp(app: Application): Future[?!void] {.async.} = if err =? (await app.initializeLists()).errorOption: @@ -127,31 +121,12 @@ proc initializeApp(app: Application): Future[?!void] {.async.} = error "Failed to initialize DHT", err = err.msg return failure(err) - app.initializeCrawler() + if err =? (await app.initializeCrawler()).errorOption: + error "Failed to initialize crawler", err = err.msg + return failure(err) return success() -# proc hackyCrawl(app: Application) {.async.} = -# info "starting hacky crawl..." -# await sleepAsync(3000) - -# var nodeIds = app.dht.getRoutingTableNodeIds() -# trace "starting with routing table nodes", nodes = nodeIds.len - -# while app.status == ApplicationStatus.Running and nodeIds.len > 0: -# let nodeId = nodeIds[0] -# nodeIds.delete(0) - -# without newNodes =? (await app.dht.getNeighbors(nodeId)), err: -# error "getneighbors failed", err = err.msg - -# for node in newNodes: -# nodeIds.add(node.id) -# trace "adding new node", id = $node.id, addrs = $node.address -# await sleepAsync(1000) - -# info "hacky crawl stopped!" - proc stop*(app: Application) = app.status = ApplicationStatus.Stopping waitFor app.dht.stop() diff --git a/codexcrawler/crawler.nim b/codexcrawler/crawler.nim index 5911c2a..680bf6e 100644 --- a/codexcrawler/crawler.nim +++ b/codexcrawler/crawler.nim @@ -1,8 +1,11 @@ import pkg/chronicles import pkg/chronos +import pkg/questionable +import pkg/questionable/results import ./dht import ./list +import ./nodeentry logScope: topics = "crawler" @@ -13,13 +16,60 @@ type Crawler* = ref object okNodes: List nokNodes: List -proc start*(c: Crawler) = - info "Starting crawler..." +proc handleNodeNotOk(c: Crawler, target: NodeEntry) {.async.} = + if err =? (await c.nokNodes.add(target)).errorOption: + error "Failed to add not-OK-node to list", err = err.msg -proc new*(T: type Crawler, dht: Dht, todoNodes: List, okNodes: List, nokNodes: List): Crawler = - Crawler( - dht: dht, - todoNodes: todoNodes, - okNodes: okNodes, - nokNodes: nokNodes - ) +proc handleNodeOk(c: Crawler, target: NodeEntry) {.async.} = + if err =? (await c.okNodes.add(target)).errorOption: + error "Failed to add OK-node to list", err = err.msg + +proc addNewTodoNode(c: Crawler, nodeId: NodeId): Future[?!void] {.async.} = + let entry = NodeEntry(id: nodeId, value: "todo") + return await c.todoNodes.add(entry) + +proc addNewTodoNodes(c: Crawler, newNodes: seq[Node]) {.async.} = + for node in newNodes: + if err =? (await c.addNewTodoNode(node.id)).errorOption: + error "Failed to add todo-node to list", err = err.msg + +proc step(c: Crawler) {.async.} = + without target =? (await c.todoNodes.pop()), err: + error "Failed to get todo node", err = err.msg + + # todo: update target timestamp + + without newNodes =? (await c.dht.getNeighbors(target.id)), err: + trace "getNeighbors call failed", node = $target.id, err = err.msg + await c.handleNodeNotOk(target) + return + + await c.handleNodeOk(target) + await c.addNewTodoNodes(newNodes) + +proc worker(c: Crawler) {.async.} = + try: + while true: + await c.step() + await sleepAsync(3.secs) + except Exception as exc: + error "Exception in crawler worker", msg = exc.msg + quit QuitFailure + +proc start*(c: Crawler): Future[?!void] {.async.} = + if c.todoNodes.len < 1: + let nodeIds = c.dht.getRoutingTableNodeIds() + info "Loading routing-table nodes to todo-list...", nodes = nodeIds.len + for id in nodeIds: + if err =? (await c.addNewTodoNode(id)).errorOption: + error "Failed to add routing-table node to todo-list", err = err.msg + return failure(err) + + info "Starting crawler..." + asyncSpawn c.worker() + return success() + +proc new*( + T: type Crawler, dht: Dht, todoNodes: List, okNodes: List, nokNodes: List +): Crawler = + Crawler(dht: dht, todoNodes: todoNodes, okNodes: okNodes, nokNodes: nokNodes) diff --git a/codexcrawler/list.nim b/codexcrawler/list.nim index 16ff445..82e4719 100644 --- a/codexcrawler/list.nim +++ b/codexcrawler/list.nim @@ -7,6 +7,8 @@ import pkg/stew/byteutils import pkg/stew/endians2 import pkg/questionable import pkg/questionable/results +import pkg/stint +import pkg/codexdht import std/sets import std/strutils @@ -27,25 +29,31 @@ type onMetric: OnUpdateMetric proc encode(s: NodeEntry): seq[byte] = - (s.id & ";" & s.value).toBytes() + ($s.id & ";" & s.value).toBytes() proc decode(T: type NodeEntry, bytes: seq[byte]): ?!T = let s = string.fromBytes(bytes) if s.len == 0: - return success(NodeEntry(id: "", value: "")) + return success(NodeEntry(id: NodeId("0".u256), value: "")) let tokens = s.split(";") if tokens.len != 2: return failure("expected 2 tokens") - success(NodeEntry(id: tokens[0], value: tokens[1])) + success(NodeEntry(id: NodeId(tokens[0].u256), value: tokens[1])) proc saveItem(this: List, item: NodeEntry): Future[?!void] {.async.} = - without itemKey =? Key.init(this.name / item.id), err: + without itemKey =? Key.init(this.name / $item.id), err: return failure(err) ?await this.store.put(itemKey, item) return success() +proc removeItem(this: List, item: NodeEntry): Future[?!void] {.async.} = + without itemKey =? Key.init(this.name / $item.id), err: + return failure(err) + ?await this.store.delete(itemKey) + return success() + proc load*(this: List): Future[?!void] {.async.} = without queryKey =? Key.init(this.name), err: return failure(err) @@ -57,7 +65,7 @@ proc load*(this: List): Future[?!void] {.async.} = return failure(err) without value =? item.value, err: return failure(err) - if value.id.len > 0: + if value.value.len > 0: this.items.incl(value) this.onMetric(this.items.len.int64) @@ -76,3 +84,15 @@ proc add*(this: List, item: NodeEntry): Future[?!void] {.async.} = if err =? (await this.saveItem(item)).errorOption: return failure(err) return success() + +proc pop*(this: List): Future[?!NodeEntry] {.async.} = + if this.items.len < 1: + return failure(this.name & "List is empty.") + + let item = this.items.pop() + if err =? (await this.removeItem(item)).errorOption: + return failure(err) + return success(item) + +proc len*(this: List): int = + this.items.len diff --git a/codexcrawler/nodeentry.nim b/codexcrawler/nodeentry.nim index c2b1a54..a6cc76b 100644 --- a/codexcrawler/nodeentry.nim +++ b/codexcrawler/nodeentry.nim @@ -2,10 +2,11 @@ import pkg/stew/byteutils import pkg/stew/endians2 import pkg/questionable import pkg/questionable/results +import pkg/codexdht type NodeEntry* = object - id*: string # will be node ID - value*: string + id*: NodeId + value*: string # todo: will be last-checked timestamp proc `$`*(entry: NodeEntry): string = - entry.id & ":" & entry.value + $entry.id & ":" & entry.value diff --git a/crawler.png b/crawler.png new file mode 100644 index 0000000000000000000000000000000000000000..6849f128f17df62517dd82d1f99d9278f81ef5aa GIT binary patch literal 47086 zcmY&@E6l-w^S}4KYT1xTa zaPofVy^j3Y?CkDjc5>&LNAHQ%)m9L1Wwh;}eA@-ouW zl(cqp;kC4Jvx4&axx7dBe)0q)>-XN$+6n5#Xa%)%aFymb>geHMbg+@;cq^jCuk~I5 zYVV*L-~rVS&^E9RaI%)L;gFRfzy=`RgU8d~)yvY4 z$JLYNzXK>jJ*_<)-g`N?xibD|Kuaq(Z!c+PZ*K=1Nn1->5i1)T5gsc`AsZe60UJvm zOB*2p9vdMc8!-_9aY0)FE9U>c-pj%E|GwYV^S>~l0pa`46Fvc6{{Kw*KW#}J4+kiE z7XNvri~#6=p8tRMKz#q1$p14jng4wU{aewk|AWkbVERAkLS502`l7J|!am_WdD3#M zrYL9NXTE*!+X*!`UQY}~O>nHyarxFxtavfvsA?Ar#=ZOIj?ZUB@1^Xn`w5KyO;wj% zxBm%G+6%>OO|ooP$-Uazsf>fwuh;!~mjRD{b268+W!dXeNmsYh_Y!7%f174Z4vcjO z)tzdtAHnmI!ez76p^r{Q0Ni8Ch5B#eR1tV3x=X< z_S}M_o5JR9EG}G~snc(gV?M7r9zSwKm6C(zTt?TLd8bU+z0QL0h!tg)L`p)R+q-13 zTpyd4)W4)gJUkqJTM(PgIzG&8dO7h=+pfdMD?R@(dno*|KIWzd^ZJl*$N6&FBvikj z?i#O*Tq#wbd?zZ^T3rBy@Yia8y%V0*0U&U`za3NJ=_zpOG#v^+cq$j&1s`~?;dalQ zsmM9`mqRlyb;%+jV%2+tClzICR45gRby6k;*90z8wmiN>>WQiw z8}-p9X+N-&64pt5oJv~lfEYmYSr`^TcHOrNN%w2vP13&Hy?Hnu-E)hK_7ZiwsHWxQ zA#s_~&pXL$ci$iPik8)qFYcPU&JE|k(uyS~oAW)Iz!_8M8;#|XiUIY&g_9k&9P-1l zz|mlvWT%>Gd)@WLf5)B0PipXBiy$%NQ?tUB!A2lV&u+NmRK|3uBlZ&wUj!=bdb`uIlzlF83X4#Wk;9$Sqc z=Z0LA_^G!SFpuX8TN!V61(1x;r_QT0)eF>&G0Z5uG#6fV|D#iLbxxp0n4yiaw&C`R zm&w{4eWNC{Wx`Sjw;_ZJ#Iyl{(5^#ShlJ1%xet5#hfTY~C%J~03!~#9^y!zRj(l}S zNoIopnEBI2CPeSt^@DA_xAup2JHnTdRdq8*^V* z1YwnJzp@D`@#H!(ATOEqCv(`o86Rgv{n~KLIj-47bk-_%p5A7~m~;nTk9kaNcib6v zJ4sZS;88At9yM84LF^0~^z4)wlvbF2h)G}ElFPN+X1BWqT8;Zrv$wr|DcLdDIFP zJVQ1rE5?j_j;}-;jCbC|&~>(B+F@mJ)G$qo`178b$(Rz?DVnFY?7XTGdRWc99B;{N zktQp6aU|@Y-}nB0^ul1jS9ca1L8ZhxR+`v5x7PD&KHzaYQX;)9W9R{H|Zp#c-&4MwiD)T&-X}HKP(c}Xr(%`KQSWo8A=#kyJsSpci$=> zr{t)yUEvJ!xj}a@x0rvn0RZsOg1_9};fU`1z?_*pA?FYonFy6A1mY4b>K@2DokG|V zdfwM}dots)U1zV(kGi6X9uKj^yN>8xAAe+CudB$8FOHHTkrm=z`%kLkhZYX8N~>sr zzEa1S>gA2EVH4q&BfVg z$$tlFE?3<7d{+YSLRNRV#e$=BmaiQCc3;xZEx821$CdMc95#>NN7YH#Y_LH&Q@yww zN7vYxGlq>-!YHfo3L zRNE{-fw3HEMZcPQ_D-pTdNy?1|Jr%VUk<*D>3-o`@yh#v)iuN!);L+%y(0-rcQK|w zxL7WE(A)k3mMJnd;O{)eHPeNiezv^#XL>9*juJIsLJE2&84KqLVUy)wEbpD&*ZHww z@kE!I=g{`}VBuBhtP>cDH-|E;Xk%fG&(Bj0c}+N`rdCu^XE}$Fk^nVCu>AVKd_8Z=9;d7PjSzm+y}`hr@?xhO)H(bH%< zoB6rfFeVadXNRE_#^?Y~-<2>1r<7q9&4h#AMm^u%&a%9>`*^y6wm&Op4=wxwk4+7& zr_)ND$CSORLVbT*=4|}s%Csp{2^Q7grkj9$`qxgK$AZe>IyxmAp|7kw$;3k?|!sy+T3h+y^rYq)v%0#K;hcT z`nLy_eF98PEzRkJb0ag;)ForW?xUI2`Sq)YEmpO-EdT_CX_KDd`niT#$A1~YLx&o4 zkN7Q_l<1PVJmB0$Qkq#bY^1Jk9Kx5JIZ1`VW3#-BlBaaECsCcr6&_dIoeYEEG*V!g z;G7P)bE!JN;6eh_9I{g?vSKWg61Tnzr==;8AaydSdas zB;8jurJbZd?JOb^_7O;lPYzfZ316oOxRNsRaVQqZ8SX@z=u>H+1_8+nm%qkwM2JYi z;cQ!KwQK>Z{;_cc6)o+S^w9(N*F1t@&)T+KN!Te4*7H+f3F@c;(H+%D$J=v5lYPNu zas7kxdY0oc5{sd;;CV7=Oo2$|n~_sOY^-~8gCd}Bg6BZf=Z|=fdA_hl?B*v3B>-wk z3oZgEc2ehUF%>6Pug!_@?3F5RgGWvCS#ZB78&mkhQ(v}cm4!b`ECcexEHWRnuX)TS zjPsGcOiD1Co;ezqm{eUeyo^1z#0TZM_oDNXpO45VMCDAA-RPU5@(WLMPXpDir?OL@ zu#(7VKwrFY$QX>d$`J*BL%1~a4r@e+q4Z*oYf~RzM*aSpuTUi74x@EU6B0FK!KQn- zG<{4!b>8%(LrF3U<+}vba-&(@6H0(-;_}AyOP9HmZ&2pQ)mKfW(;sY|avusOe{4Q; zClwIuNX)$3Pxe^3K&3--Mq^!&MmC8r51bA_jcyDogbcR9(5&j=N{px0Wa)p}kL4$1 zk3iYu?Ebd9Bal|_e53?VDEA|8s**8)nTdsg$+k`M&sdY-)0oODs( zAXzezY0}?1zhQF7eJ8~qV`V7zH6c;!tg7cm1L8hVrp)_NovnI#bAGyH`FQnm`d4#o z0Moz??w%cI$15UG!C$}hpiBDNkU^pLKXJ%u3>*KD!Jte}vk>LIRsgQ^61$c@3+93m z+=Y2C!o!i=A#J2UKHg)+}h#LgxEk_c?~6_14(9 zYhQ~C9kTc0dGprP!KJa8@qivemkgJVcCbpuyW(5pHy@A(@@Yr7gyO%(c*eD%%5DBNg{25w%Oc0 zM_7J~P5BbrPind2l0U&k+x6Qim<@LT(0E7zbn_lS-o01soRIjHJeiR@B64YznGY9e zx-p+L|ApksFL6;snd%Ri@c0t}i;PKc=V)Q%Yf5oAfqDs$78-W+b-ph6&}lLS+{(PM zzh;{1be>y-a*1@?yF8_PqbGQl`$PESv>);;Vg~@4BzfMpu?law4ym=?^5VPXG0}sz_cNUb|aaJ83a>wNA0|TBJ=7 z`)xGJOm}`<^@eV;5A!CE*Ik%VOFj-%vg*t)Dlotp*MO@;Zg>78{Pz`b&-^`gh^{5^ zg}>igNb`jM<^_uI<*OQz(A(C~K9pNmhC1>3JmI))JWg5L=cS51qfzn^W zV--pCMS=p~^QAkYbGpwFI76fo=C6g%IswC;?r+N+9Eq2PZ<8QS#uP~|czTkeA?pMg zlBgDU2yH@Vb%MMjCv~*-(tMH;5fDjny+kSjnL}c-O*T8XNB>s?D}1dfIBjjp>%%53 zI26L&X&55i-{}YvrBp?`c(Ep2P`Z-|*k%}`XFE2c<~^O=XRjFLKkMyDnp7S=r^ch2 zX)a4`NkOn@OO4piuxdmKZpJA6mX;plbb?MjtE=mprWY9JFp|nXy`rrU+uwTgYz}2; z3~~?uMl>J%_xh?ul5FNoQ+pg-B{robH-BWgB+BRiOT%yavMWWOL+5l#f#_LwI!E%1 zxoO#NDbU%kHEs&*GQaaFrqu^T>*hQK+Ik)OaGv6Kn3v2r7ll80>$EH$UcBzrGAM1I zR8#FS@bWFV4mC`mlKP7mC%J!=B9dKAukXh|NVRv^miT)J-Nrk4 zP^ z+hM>Mb@&(53!yR{OKV9qxr`kd>D<_C=MPl)NwczMVdWA^-%PX56Y2rM#? z!7oOv=aA2D?N+9LbJW4Md_qTI$fuN^s;7vk>9hFoClmn2 z!~JVV^hneiX94v|G4^(!D(K^T6T>CrWsOtr5@zsoIot3~GhpzdI)Ae7qDLY(cY00a zHLZ#=S?{LjGyGr)dD=c@ngQULFk=}j4W5J($U~I4+K4ChTi5C*@I&32fS`vai}lRM zr7FMUqF~KQ&COfFd)FN8z*o?Pe#_x8qx7AhBAq4#s5*WDY2%W}dfr>FLvcBM@!OCh@D~!ckL>G{s|7CLIQ@= zhtI-=x$9xWi5_+1-?1CxRKAo}BcMejMHZhw+h5ZpT1zy3Ywu4Be<4>0bRO#Ue8m-} zv8*HEcSn5mIEK}>b6^4WJ%qq1GmVeDVoE-(7A7}3gOFCmKdszdKK^o%qAtj0|2+5E z@XPrUw=lOzFQ8m%pM*^Sx9#SKhX0&UH{}}9RZdSR-=*|>*_LlZts;_%4LoGuiY%v& zz~tHDld;9vlfEa?M0hx>C&2}b$HyOEgCNF9(51H8=z{=OaPQ_XrP|=Tt?NG78y3jh z{!h%&z!`h|3PEOrw2bU-jWk7tO{T?8p@d}OXZp2J2Tzgy&r{@>vM~3z6|wVqXF#EV z2&L3mL_w)U(iTk+N&H7BCs5_jhCPqZY|U&_>4y?*ri$TsSj?OJxA`3xN7GxTkGzvh zFt-M> z+b6ahKc`eN1`t@b>R9$I|9fT7$yHUQ0p#N=#vMmm+^_(Fd7BKf=S% zRf!ml1V4vZ_djsFszVUpp3;HUK55GW4cO+9#)=i>U}q#@pN zagLBkCP??-!V~A%Gaf@aXk#{@~nSIHvfzdR3PhrR-kth z+z3+YcnW9W7n-wa{K4GfLTW}F^&B$Pi=cD-DS0@7*=3#yB3zJ>QtD}yn>`Ye5Rl6) zZ(gFUuBjn;5r$Jsf=d;}q(lv=CKu@m*Qc2qUk=QVX1EeZFt+H$eSi15V`aCc=Q6PK zYTz+ed;;L5ou9E796J>rleCp!f;A3`3)C0aX=iq{R|ZxJnxsSIHifx*5cTMJ$Oh?=!QrvfXLY{9<`db^yd z^E5aKJeJ(@c+NMass7Y|CCjL|^o`js8xP0N0LG!UN`rb5O1$nBCiH+9ldlAF+r{!* zZG>_IY?JSx{vR)cw(HtArq-rtayHYBNfAqDK^x_h*4Kox_cM=?cG73RUW83n>c>Og zf5)Jc4N2Go?Mc`;gl+j%U*3R@{P{LVyE0EFEkb4EISl6|LYP9D)asTZSy{BP$R#;6 zJZ}!)7{V#1{U^r8@DV)Sp(+k(tlt}5+@CvXnQyb#_x1Wp8+U>@kb>yw)`yPex6Nk~ z*)F}QUl;A`y?9sa(K4DP)2s=sGR(1LxGcV-ilfHN9JqD0SR!e@^JU0vTm%I{DpBTj zNW6a@O~kN^!51W>LP)oH+LgSue8#uFXlI6$UI}bF8kPpR{I0C8ZgX1uh_9EJQPvMG z2%Dy@%2sQ`xwqD0IRCf=Q_oT$d544CMkeOFdm*QG$JLTslsfMpe;?)&zHNW+%%}4yl(~tlX`5>!D%4Mw z``}ftc}_@c{Di*sA0KyT5-rHkfV-J6hH?Jp{J*I?n-W%SAu?2n^^#wA^4?c=Z{=MU zbuxvO2(tj!*L5h4NwT|d97)z_^xhul^j!RA%H+aTZF;t2RO+ryuKaFp)K?m`rlhF! z9fOIv5ye)o*k+OH1T_6zI439@PDGkhIGwgwvg3w~VjWkT$z@ghb;-=K8>2Pn0|er2 z(3zx{MKU_JOEqb}u+wZ#viEJA4_C3{y#f?l`A9?wCNmf5#Q~8~`8d+W!V7S=r)SDe zC>oEx-5vkUv?WDIJ7W2@NxZl&Ifj}uuq5T-3KGx!7-VZ({uC_Q3mEWy71U#6Oe*1hI-Pzuj`fg)Rl%_R@cmws z;Zvzk^T28zE=Esy^B3VW9$bI>3(IIz&0RgZaZmP&xt}yaAIMcBOSDi$K zL~?xiG?x+k^H0YYavu)b3kT##I5>ZrBqsXgd@tlXb6zTqU7kb~n$)GSJWE;4fTaELD+)Rx|p2ak~6#7s3q;h zq(_ptIvJBHfNNXk)D^Kc=9tHEivjGDtP?2CKEcEUQ|7OFxEau_>6?K|E-@Y*fQ57V zS2&-Z9^y1|yNZsR#P7VUNz)mcWKEkqw40=mRnO0QTqMjf(oXu(QEHQ0C!G#>3>i`t zWVUl4`x)VWwp013yfZG|Ww|PCmSb-bVHF&lHyL!(gkE8M0n_oHvh!2UQiAeXN2V~u zYh5-KnUbvOrQb)$-rn}Cb0^m6eYgDgjSl4+3aUDM^SATJr%`w#RpnnpLxUXgix=Gh zaX6dxyU%z=;z^{}JlvlRxZ7&Ezb|IJ@G$s@yM%C|bsPbctNrhsv;X*p4E-MK`Wfe?oB(1y=7@uHBr_V zr`_RL_Nn(uJQTapiup^;28AXYrlL=Zshkx#5JCVH+*)E35&7NAh zjLG4@tZ=j0V`kML?-F#KAhpzBYAgK)heB*eOWC$bdp_fP;QS!(UCdw$BW6ETFgMu- z4-W)cEwHL_84SBmZ61GfhrTwp&9}B;KzSYq?=nwe_ z+;}rLG^$%eI@1gLo06hLuYy0RP$s9+Ck{8kf>r)aA6&NG|C3Ukp+b2p&NaD!$Od@j zc$p7&$}YaAV*5j@nf$@JRR&aUNgDyY?sP)3vXj4mb9I>~gOGj?c;>@o`B&r*C(j?h z{fbPluB{f7kWeF65l>RcF89I;cDDYhnof@Lba&1%DI0w^W#?*}G%}*r`~KVZHjw7{ z%hR44r=C%^Oo)88D*PKYx0HNtv*-eOqz$Kd(x=uJ?c;uN&oqf|kJ*Q>GSbGs;As^l zh`%j2rTr@zl;WbMt3IOFLSYEe(|nWdKGpz+o9pRb^FH%3#&-hbU_Yg8ygQ|b3qJS; zo;@fWdbUxEW=H|?hTtQ*%8(~yOZKMhmYR1n(9#ZoP0penPVtj>+lA9wfFYg|MVM~V zeSz!=-`!$eXI#d`n@v`x!*ZJgPORit>r>MzZ97h4o>#|~kV&TFAjr^ngfoy$R2Mq3 zYY_EjBsU93kX#h|S@|G`y=b<*utPR!lyoC-;4CPO)rvpnswndTAbXN7JMr=@B$m=3 zX692y*^EL*=~j%Oa10A9w&p@QdE`V5gpxZ5ziu}^Eq-TZ6@E4$UGOuKEa;@EV0S(2 zBk10Eve>XH&TjJRaGIuupv-`j?+XD|3sB&~a)JE>OeDml%<_ipIIR`xR7IEr0i%)+XoZDEq?N?Dn@|eAD^xKg`!FqW&UQoGAkU2H>UOS}G6s zY!i7QTbK@Ksz0tZEaeHQ68xn?Q3u3NB0sgiSZmN-K9zDX-3rtBTO+w6a(*=M^E8>t zV65e}*j*pNa=-y9X6sYo?~|Pzx6Omr;KayC{eE|O;+R1fQ^c^TdJ&K{010%w#%^Fk z&ZCQ$WMpKsU*4PoS>l*C(N3CGGety=VHLTOT%By8i0H)jHtSK)UdLyHgP^0Cf}}0U zKeBBFfTU^vq(kxTuZ&1N#}*odi+;_|sa>P01!grXnhW-=Zk>bgx9yw50!am+*j7)D zx8|OSy8T62KVm}E352|;CurYMD=M(;L_};lCg9+)-le5Ap)(|HHBgoqBe1J2F}xDi z`;fPGy@GOqJEpF@%i?cOE5>Qe(0u(mOO@@qOR+SK2FXmh2(Yu|FoCnx>Z%ZzEB2CR z5lD-&^EG`|AEVom%8qDJlgiJcUEi>K$o8lY-V)UhC8My zj?p2uh+pvLyXjZG{VejuFDwz7na-i>`b}6(Z7WxNG`6@up#=Y%xTiiv_wcw&FQit3%qeEy?)SkP#?^bcmBPr@Es|5kQm2P=n#F(N9KHoUo*46-*)z z%pIGu;y*BFu9V;4!fQQecO{YLDdT4~r6a1+DztpM;|f-{G=-|s zHMn7)!iU-SG6sL0E(orV_k&0}#nvhlaO#2ens@fuw)njA~}ssc3U(5EV9R0nV)5&jz@GJ@Z^X;4e-_T3^3B93@*H{ zR${6)qs?@MLlr+hRm#`L136}Vh&w8Zr)wTOgWNHG^EOj>VRPrto3rW-eaL`rwDF=t zHnO4QrpCrW{em0eV!-BZ-O5;I&mCL$krLX^KB%o&`&-hyT($Cd>d*@t>-h+_mR`U| z`jnZ!KCBP3i0RiNT3P#-Mza2-PWIsM!?_fO#%T&pWK`Cc63qFFh|oa{!Ce)Y|< z6?%ep>KfE#q`sr}yar5cq0KSAB{?fxm8kbB`1-M8_b1`~9!{Ke>;~G{ma&kXVt5QV zW~A592r=lPNK2?zy54{G%*eIOV(itk9P9Lk-rKdukcVF^kBTiO zP-4P*;L^Nkm3=?!uDGaL8nF_Se?EyalSA6n0inG}_L!#jNck+y5CR7jYTwz)6TiGI z@}}ygNeu zxr-=$B_#^8WgtVnlOhBtk*h>ls-~5B1qRRc#e^N`J~6C4PEQD#PcIWwtjLWo=Fe)d z-O41_;nWW*Bax&L^cW+3G^?HfW!%U{MZXMMBY2U4@&T7cwc@)P z4LKwFaov#x1Ja40AhnUv*C|@pFV6I!LH25q(A!1(bUN<6Y_(~0X=XYy@&|)loFu7&xkg14?B}M{(~ZB*dEU2*L;8{^x^u)CTZwJ<`LsK3vM1B zX@b!U7^&M^Lz`_S<+9(FQWQVczZo?}y2Nw0S)~XbKZl@HIOE0DV@t@9;Q=+hS4Qc| zHBm0HmApy%#Q=(ab<$q`(iI2&8UyjmThx(8ghfEikJW|UI)pSA4h+QWr~`>jhW z=`6R6Nle_HzY$#NQ~$P-cA9#?MWJlrjDsihANNtb`mix@wc&F|Yiq%yotqM+=Wq3{ z75n?N!rx3dsbRFty~`3N$5;eFcT^}bvfO*gBXMj6ZnRuABg1{8j8vnFsJ=y-#3qQV z`#{0Xy2^dHFf{_|pWPaBZ<(PuY>gSipnyk@A$*cIZMckxA9{aMwsKCZ^hn>O?WM)# zP+}xGf$Oj|HHE1d>PTL!Qp*wN95GFj{`<Eq|HR4k2D%$nGAqi3p`r;yx!e9Y(0OSVBlxwcKQd)KAP2a`?Y%Fl8%Tn(7} ze*7Tqxx(xD#vSta(b9cG*vY9XXp^j9eGsh$9Owv9+SIqswxj>{e+cmJlMM-2_6)^_ z6x3-q`?ZNoWO8sww7bxHE+L5OGMPSkb7h#f7$cp?b)v|p{Y1p{zaVM!1=kjHtF#1~ zi&Ij1i|6k;=(tt!MLvDLI)$ENv!QjnMvbYa&MBuB)lRAFs)9_oUzuuZ4j@p%klDfV zYdChGuDX@F67Ni5vtMQk?&RWCI`_-ufN>SmDIylkdu%Vcn%^7ZY+EF%nnktXdLZ89 zSv^lQK=aoH^UeJy8>GL*)#jeP?_%N0ust~@f4yEpPsk9ptND<(>J0vnswX-rlbw?_ z=*>3Mh&r$=%F4>J@^H-U99B)o*I2kpO5VfrV{hv>WF~XvGN!0KAmN}sbj>WdZZFul zIjG%}4!zKJeK^%J;C{)OULrCVvsFIa!l?-dQ<0gwj@eY@5&E_fhJs{=mbhNV<#jBy z1d6qv?EWH&7?00|?CH^0)+Z7@YRc<>!VW>3`C4Qdz8+kyJW?656rQl&j%Y}U8HZ4( z>T$AF@+g7r<;K9H>;|tvB6i)c!Bj;HjC=b@+`cn_;b3GSY?2D++Z$XYSE_jm2c=yW z4$D%Im>D)yO&@3O<@3fgSc*84me7}~-Q=br+PCFVz z^{n{s<=vqkZ>m7=AA@JP-q0;s^6%4@B1c+^Nv|R-0ptd9*`)>_pP=0L{{_tc7MWP+ ziof_N(#UKV5J0nbiT2>clU^?wJWKU zUCg1TxTp)(7xgK?rDlFtl(-TLbw}Cd7n3S=o^a-hpL7)r%GK4?r~hOhJZuWK67}S%DNkKiQ;~Y^55IdQ4lTmo0Ov!*XX*S9qyowGmCX@ zi)&IeM+Vhc_9Brw`aqo3|NH5vAecshu(p8&Q|>kKi}TyyVu00T{z|D@f*!w=RP>hk z`Hk5rP=!+i#<|3yl`gbf0l?LFdZ(|M7RQqITy&pEbtXc+EF9hMHWYEW&bFxwY@I>-g4xGH_L)#e^l!Y6~I=_0uH4u&mD^EbuVX zpaY=5v{rVUCsCYLUX-+DqxdbXFg7bk9#x(QUGX+u1D091sJ07kGAFXF3tx#`2u?i6 zgrG&o>j$-f)K+qa(WeYuvX@C_AWx@e10Hzs`m&E0)l&JQ81w}H zMnElX+TJj_!{74^+YZ1q>FN6Q7yIhj-=6J*)>SlR$>2cb*-*)F*(3tW1LaaO?1ErIE|eU_(jrwlIhlXLW-l(lbPOeu``+p z5ING@ZE>+wGDfI%MPv-SLGxu^XUB|fUCTpnEh8|4mdZ`eCjETn)WcXORGV@OnMVn} zt@y5u-#$DXT`k+m^fBU7yNNWsdP^Y~2Z(!yOnsgHY@l$d%xLW!QV(}1EFiJ)XYb|5 zqNkn1Z2Qbey}K{bM;N7Q^7(t4t1WbC1}O+uOz63Rt9+8WI!)BZdjWJhP(zT42w0o$2a$ zi4I8AJ?Ky@?_XAE=WTv`yb6&y-5_dc?36E={^m}H0}{Y9-F32D!Y@vF7{t7I`0%x+ z-gIlqIV~F(xCo5V)0-P?;Ni-^MeGr)kT|4aKdo0{8po4+hHBH85oW`FhKq}7DXe(K zsy4xhy;H%jn*EZk_-i4LuArU2A+btq{UreAMGPh35C~&9o=y&d*~#86>`D}SEvkpP z91rP^dhqZc)I_oOXenaE4p3>?2}X;hV@LnlyG&d=P4@A?7c8&E{SXUZ+|x zNUnDk>75wB3}7!FO%nHv&OpIFE(Gmofp2z1PLDn(=rbSc=DiTE<+iP#zAbf7&feZO zNoSXMxyJT6&ex8-nLc4Iuwsc?y$gNas<8TZ+sP-9ikok_o+jG9LN@-o#4N3h0F2(min?%u zk2hIUXYJO8eCTev=nrUV(Y&EX@>-W1D{5v6SUh&Nu$C$wj=aw+-!^S%u{E8N*RAxX zIA-6(tD&9So=2rlwBb{zF=SI?RkiiJR*Fqs{;UOg7a_%Eoko}EO5&ofltsb{KT~nH zIuH2@EJtA2y#VtVko>FnU)3eYrs<`>HUrG!7wY+DQ82iFNf@C9x$l}{+GjVsP0n{*Sl>F zBXi^3{u44AV|iVi;j{$txcAaTHLR^&sDp-pfUwRLc4yz?jLo!ozJcrlXypnUbwneT zA+^`DZad-$1ZT>+lUYpYiXf((_UyLa|2V9e5)Ms@{|gM<&%sijSnTcRd-#&Y8j2}3an+zWpOa-!a}R{!!cet3OJ2Ss7^ip*x3kP;z;j5V<#kzGw5 zj@x@*cV7(MZlGJ80Qx^(X&I4W6km~l+p@Rzv{vG{Cu-K~5VlMdtmQ<9lU<#i+c z<;|||VPSV5QF@c-6+)q7#q!trvpiQysHvuw_LL(6yYJKYLY*Q!h(3e~sRyL}VZglq zYKTqC(5{_xhL?^PmUY^|ZCQ=E)`TkO?^yVPsp|q)9<8jbg2efZlUT2r28Q`#DqG~< z@+b$7btaH9Wa*Dg(nJbX{t}aqWdLDXxnfADxGaLjNZxa+QLw4VA5F|Ij#4s|mF{#Y z7j-5xmMNN!oT=|(W>ueYVW;=iFEN}}I! zd$?H%+R?D+b${j9BI%z!edxm`^Rv;&*tAS+U%&3>NK?WLQUgsFvkZORVz}|+Y@$SR zm3iF5x#qJWS3+VkwW~hAw6sE*o~5N_SYo30X{sbTV9vq^lM9N@^`3zOx}NS8_&&V| z`1lcvP`5Jf9x?OlxUs-bg7UB{Ldvx#!)0lAq1%&ksr9f>7Q6j6Nh)@RxJHCX_L#BY zVKy-r{jgFPUv(l;XqucY_=MAQdqMn{YrN)E3l}hXt<-?7iE?Pu@JM~`?agD-z z1))rP`Jqf=YjNHOMR zLn@_`8i2^xhc$e##(Y56+|82Qte$qpiVzp`J6Am}?Gn`>1Z5_rXu4%_nz|yziTniL zp*MWtd*SdIe$C5T7A5nYJew)`o#rh$Q*%XSVFC~7Q z1v~!aN+%<09vuAq^Wdr*iExp6Vq^j-UbR2{iB6jCPxrOus|;k4N~_Tnw=iq#0Wn%k zFv_Yeb>pC>_%}FwcMlBPXeUurZ1qZwZfM6H1?j_}G#{=ctMGf2?Jihyz32L9o;*^? zc?znK!j9egl=1WB;9!N{f$8dCyv5yf*4SBD>E~fEn>Kho0x_89yE-x?`{3^5yr$i< zsZZdT8~QzRY+|x8c!-cDage&-p8O%1@wa_yb5oe8-1H~L)TTVCxERyq%+1$0Y#l?} zAWpK*Vy&mR&_C{Qf?6kPu8x<&#_Sm6Kr;Hb;)S zp!9vt^cCamokn4{BzYLL$z_O8J6HVs?@?TT@OnG_lJB2)KDWI2H?X6fb~LD=k77r= zN2_P3Lh{JQ{+cg%l81!W)?}Sqe5>C*3m!Wy8`{9M-mNn`4_HTg8Wwk?7FTzae(Pbk z`~M`HX|$Znj)Mveo0PKcKpSd0+v9E_+${lShIWd%OSpDYh?f&lpVykX)vx)X&YzMm zQciQh#JKI8O>ilP^L#d_^v4yXG5h^SgHJ*Ims6Qhs-!*uQv%skS`?aACl-7XA8}7S znW^eOdMUD-soWHHbX#3p*VNYBf1{i;yG_@gG%pH{8yHYZqLWr{T`HP(cAxOy^O(r@ z%*xM|e>!d$AJ8>{=Ktq!q3P7h@Cx+0f1TgdjZhAq8ghS?L??mP?)2p%bKAx7ytYfr zgg5uRhl!%?vDn;k@}u#T(9PmfN>lbXc9tjP{&2KNR~m2uFmCA=hBh}j4Ym1xIEq{^ zJnrp{;EliS@ep#S(I~S+mXp4yuBmn3%ky==-(r|ddbJd_czaK@JQOW+F1LCD{kEzB6Y6+HQmo(lcSCmVf@5@n8QqH$HaooE`PloIYMOZ3!O*4+O1u}|$N7l@V z@8x>(78;qFm8~7kxVEa1p4{4HHCq4&ST)qjx*-|?4H5kgaCqiImnUV1?~%>pgNhL- zIGf=%wqRQ<^j0M3u7qLlqV7=|o=MR_=lL z*8W{cU1wO_vcWUos;0wSTeW)lekv*-g|+vv*18Oia*_L|&U{7<^xM!8?Q{&6j}0u9 zI{W-t9?$pm_56Ol=Xvqwt>@35s9{XUy3_p)mZ1ANQwje&0NjP>tn|qyfEj7&>H{~d z5?LOz6lcU|>HYpeJTZZn(K9zkR|4g3WM&5SS@PlSe$SUoFFE{cCcZSw05fRNGat#& zv!R6+u(J#F7AtFpTR`iw2j1w9wptB3yJiy}QPDZov@$w z9B@kw@UZz{ZhQz4e?p!ZkQmT4aCZlq z3|{qY`#m~@)3`@{xfV!-_3y~eB{-6dLtD4fz<(k6@x|laNvN&6rQ9}TvdFw{tG!m7 z5fD>iwD}}17ld?|PDaxM8X9nTL1=Q{s;^ju4xb)51|l3diFU1bPPywgwL(vAYrp>H znnQ_RZF9(uORb)W64K8TjWTOnJIZA^wuB#D+q8c={E~sIPp03P>ZRSfR*YD!{S~sFEJQNr#N1U?>_nP5jiM|>*|*H4w8H)Nm4%(ZLu$kBCuiLyrV+uf_w->5{9@89u4br;*FseN;)r;?slUxQpk$Mp zqzSxw&5cdKpkADM%jn`F7l%&nX4Yhgs2p*wz#3bSP$ytRs{C`iJ92?VE#NU=kE(igiHD!MlDb3V_{Tq z+9{Bd44kcQRX~Yv6&d1Lg-dTCbf7#!$3d($o0xa1O*(X}J159xh-a%Ht&8<8MmV>1tMGqaCf2>aV9XGJTEj(b?s6NbpeV>eIf`E>0Tt35b18DmR`D6I##;7-pBV3W}IPmM%U-L_kPd$oO6Gb%l|cG&}O+*P(>{6;m z`qo8q{8&6(YsBFt(3rC02kA89P`$fjVxotvg+7V-5E|$dygoOq7;*R0UT$QmDnO*g zb8jO`a8X*d3=mqQsGk8+_C5GmPGxQX(Es_mIYB{s&q|7$`r212j5;o}48EYpPj79n zRY$As9@yU~X#f$rz)T89Z|d0fmFw!pB4ze5TfP#_(yPx109{_7aNxppL!zw5-_Z_X z+bfvK+tvL{dI2Yj{QEJ)kPv=?DRmS2Bn-nr?oH&b5J=QFi%;|z|M(*#hlw^ z7TiO}P{zmt7@C2A36pE@&H|RH(09)@8Pf?(y6?XJX3^;-a%$z^RC!eZ={WfCO@i;u z%ja|@5y4$&Z2v(F)C!x01g341`Q-Er4e1qlSqhqvO`NM|C(=sz!k22pxO^J3s~NwWW#sgJWp=K~j}aT2 z5z^2?=kg&b{DrFejQZ=$?DW-ywp8ceJ}6-H*3~mKMb>8v#SXPUjpHJH8J-s|(V;>Z z283PdL4=L<3Z?S^1Q8jb9VK5U58ZTiAdR=cgrvkX;EP)7(PVsl)7oS95+fi) zK5V$BQoHm?J-r8h7gL@fsR^r$oqcp(Kj!UQNXoj8`n-q|FM#1W8)}U9&vk~r!OMF# zmtrAF7m6e9ynjA-dvW|{_6|o!^wFo#d?-EZ11@$>Qjd}tTKA~d<7-p5pn(0YPu`a; z5BPAGk8585se}*?9FME)W;qxb7y)`4kV00|IB3hP5|59$A(Og*+gH%5R&DCE{go?qM004_8(#ojDez#^$!vqm{SDdp0~W z!aZY;-}~B*g5o8{YpmX#L7va3FcFGPghH(sbEjM?y~XJ%Sk`F_}WCKSu}i;3Aj<+aS)Wcl}>0a1aB1>@bUcfAyS zG1rnUH!ttg_aNEszyjFtU!gqruWEFkH%&j1%Ci9zgyv785Zhp#<0j`>Dk`r#Aco(Jl8a^E={R7)nn+}9R}AFf!jnl$<<^-dyI06lJ>?~{u7@RUS83W z`fK5x>EMzG%#_sBZ{!{7l>vdVLXphX!*n_6`e?B-EsKT7{mJbMVc#_&HNs5C0sJR0 zkIxSC!y}{L>E4d$XGa07(|Mg1fIdPGO_`6U<~{_L0{cT;%&Xn)A~{JIJ{Rd(_&VP5 z>5)TbCxHv?k?36~0n+Ym;Df6iCBQd}o`7cFiBgHWMz!_5Ad zT<_&?-2hRyZxZPZd}pe{YHFBYWS5z7_g2= zL19c~Kx}XIDuN)`jOzs%HATKr$(Ws&v!Tw;vmen&o+5S3V(oyL8STHgH^9NRP5rlr z{lK>hO&~7YeGZ-|SgGqceaF#urXC6Ib%WI>acpR$xuf*!ST@Pnqv+y4SovLKDdY=( zMd=jO7DD{D{5X<-#vS@S`>fEWpQ~T8CJYUyV|dkkR>?es0sDJStIWaSwlenmAYkR~ zh4>9q>F%zDY)^H)C$T7Z$w+Q-RVYdTX27~18MA4$&Roi*mqCvAaoTuC1= zMH-yCJ?xtoIb2ezAIF}o(J{!;u%RQjP%rZFlBD~r)BC?`tP}Vn5_7uh_mR4~x<8f= z&Gm5V%hIyQ6Q4B+nZZZ10nN|tZcZ-n#yT)1kZ%RpZhD|@qxs0)#LPcAc}z7H0fmKy zA1A)loxfs3_SO@b&Y|+6I9FZbT4Il@u0ru}z-R(ak7pZ%>+9yxD$)5O zl)l*l7qC?BrU0aKi~^pvlQg|XeDm2|Qsa+0&5?)lC-X{~WY6gTqODb$;K`q z6jkK9ze$jq#!at`qU*)am*ml}^@ zm#w!IdIn&n8veeWou8QBl18*S-Y4{cL;|zS;j!b}^?JGnE4kk;$M?_Q1BwE%u(u6$ z_7cYAq}wpU0a!MiLC@jI%D$TzK*Id1xDm*mvW8Ua)}D}ZCsJo zTTbr&6Qhopw(IU}ptB`Fv{5$8 zQXt3Y&TOss0mSIuEQ-MU*7u(2kKJeDW|MwJlDaT@{148`6;Q}%g`M;_B}53r|WruFR~wiYjY zS+%2I%864e82?XlOa}=ocyo{T_hBm zsE4W}5=oKu1u@=PFPRM?8#9GyF{q|z67P!^x1fH9o1M9`CH&;}%k9|@Kj67i&$rK; zr*=KaW4`Lr*{fwF@bylNE!mjs5l`!f{pv4pt)u>UXAhHXST@gJr0RQi_Rdgyb~b!1 zJRf+5sbAU%WD%%9p66g;$AH-2e4})y6Y%+>M{zx=-Bcx_C-wU z+IEwpSBxcm9^VanxfV@*_4%+!t@N`*AAUQTnPb=?lkZN;lWMm0#h_~)Hg;%Xzne09 zRvwZ9?@A2WfZ!#4NlHzD`Wvy%#=&l$8JM*W(0S(U)ogDgHGJ=%Bu63u{A_-knJVzF z1kT>FO6fe^3;!*vLQJ%rL~Lw8TPqLvGhG1b>*}I$@;&`@z4A?b_?!5JOBYbokkMID zIetJscsQ}|2?(Rl+6fhgVty~xvjILyzEK4(GWDBj|3I$>8yklS636ZI)H}9&aFFNe z+UQ9Pdk#cfnl@8DU0vrqqGRzn1)P4GZ@Hw=PD#~UwwYwguZYYtYLKnd&Ib}$ zj$Yv!8ss1C*pOC^p2~A&5T@1VW^sRP8iboFJ5P3g_B`7YPR;8V_ShlxfdV_CNQ1+= zAN0z?vE>v;duH}y4dJKxHNs-;lG&XeHN~Puss%s#>3IfL*AoMc68ZBEzGRlb^4;%+ z2`4<`9XAqbN$(7 zc$)yi4frM?0z06E#}~k?+D2mB>LJ|WaD^LItZ%n;KI-LyENd`fhP-YX-(T?q9<>p5 z3*i{w&~Dk-%Jy-x3@2dhADG%8bOGUebClU8XG0ONb8-?z#c@)Ke08TWT&di!Wca13QVa1W7HIhfXAOKZoWg}xYgfgu?$qYCHiEqCDZisb?y z0$>GyEK28-et!L|OZM}eoONhuZ?P(y(P3HH6=ld~UpwD#hE*`Cnah9vfpYfi<|h3? z)2*_V^;Y9bUQ|8DZUg#bF5Y>(EY)f@usj2-I)>@TA|!0~u*PrJ5m>)d_PMze%M$#Y8CH4;U1qM?M9UADw`nChw8b1o5;$?`G@ zF96sM2o`5}>w-7)+Q9n?#%nHsz2Oks?P9pHK{gnF5C*|tn-c&OvY2y^gN{R^QISV9 z&x3{YSHFycqK?LEuwO01jy5wL&3t^GAgi|BMS$(AR$r;!DYJ-)4~lZTnPTn|lE@!8 ziFUil0zB+oY8>aJwL77;%_3s&;}e!tFF%9&`mRe#k>BNE^lMyZc=RuC-ZIAK{8*0j z-r~)P;NZIyy~1HWxl^ z0DiqD^jhOn2CsI-_%AKsmD*dVODrvKjht`tVPIrT&q(X3m!NeiRmZ{yq8%yd$@1vp z#sA?)(~`XmNKxjjYOR)Rnao|>t!iymT$$V3J{LY5%a@jTy2462MF%3r&+F$9$I zwDfFK4~OKShrjS1s$0sgAX4d=uJ09#{=E9#eK#13j;Ub8d{w~nloAa5ixxHxXrCu# zWb2zFaC!R%(Z97#JpN?kaJK@_yXokBc-5?mW<62`n=nyiAKH7+{5!KoU$959AT9Z z(&8EySOib32m%9#L@GcCE?{zHVC=IIuqBik-QLuqTDW{sl$t8XJ83I_8`o z1n;ZR>;+F9Mg=Wz{8EaJA%MTGueRaO1mZJE#MqLcD1`>LEvtEsK$v`)6`DC(98*FU zg&l=mmQY}Hq&as-wR9T&-O!v+5u1W9hOWBDST!5@2yvZ$wr`tq+tQn8vm4XL=q}r3 z4u6!+oyhMJjUpkRH6iFOK;)Sca`ST!O!W|Ep9{Q0=ouUQhtzcCaNV*(0olZ}Tf?M~ zD!%os7^=bALbhB~b8V>@Fr%>{=4=|aFQlMAe}(hPidZbA=;$SQH3EFxY!|-%UAaiA z0STMj4ks&IW;_CC@NY|K5u$%42`*XOcuCQozMvcH5V;`#`y0^bRUM7%zd|jSpJs?` znA~@-9IMTE1-KI_^zx=fllil_+qk|q^qO^x2P^Lc&h=%A1tlrjEvs5<6?-rB^!0(E zx+Sr8jxhUpH)Q&)+4k695oDkC>PQZL#{I zZjsX`@J}`~wx8tw3a(8_^p+B{v&df@oHfnOqk{|Yn6Q_ZhjUm~Gphm~Xy5L1DzBJF1i&OgBVEozv+? z2{;Xd>dyj$VQdo?iMDzvOe&HdgFjwEP#O+(R}a)TZ$oUenUZL1^q^7dYw}durSoR~ zW+1rdUw4sT4YP99U-a8-$>lzNjsPfuE+Lu`b>?S9bezMd;D{S9N(M%Tw2U+pSO1Xt zbg}}u@@Elr5J_9JPq%GPfB+yD7TK4#?^v1G6b7GJ3fsv^7W0RZsiYKq34LQVUBm@k-A=5A-s>?>Z>$2H9h6ew8I}3<% znUT4rrRAKaAU_r9P&L49@JUx~SSUr;eVk09lXDhLWs2>0-G<;!Ko&01*c90C7li%; zG&#H7-PU!)a_ss?S5wEIPplve@@gEIU+W!s`9)<$NXPA_S*C4?5SJy|z4^(7%%RS~ z>cqfmpH-dMs#vep2j4W>HJxuG)}RU;>)n2w zTVG4$s5r3lz>LZ?x2#Jn<|NA}5HH_Iu?fYh4 z8L^B+!)&)FWybltd#(a~Oz#DcSstU(h)OJ>*eGIJoHQjHJ%QNq8-)0yWZ=D4N30|n zMG>nJJMC_v-UreTOqObxKf5&vY9&cj%VyGmd1Q8%`!6mqxB;{5dRig8X%rA@Of&F$ zxnp-DvH1{~A;I9G0VNX!sDj$&@P^(tS}mlxsTRG{iMD* z+`pnmXSq~V$k6cXpyB!Qbhtht{+s);r?)b}70+JY1gNTO(aG`L{gCvtOa?1gvdJW% zbYS3NN;@FZsKd<-a4PL6nTQ#+M`g`ptFe6C%i)plE zMs2T4&%(k@C9?~NacXxYxA!dq#&3mp^`o|ORo;O#%7_rX%qq%OHGT|U@CGr6*QJ;s zQQM#GLRfRy`2;6NsL!@yWa5Wxc%Pa;3j4h_zj{qQ&}t(mhtK>@&`Mt?u;|Dzs@SJ| zUKe-UzUNOMit^0Yur>vYsb+F=Z@w*4zHZdpE#zSEUDJ%T%m=8oCfjrIVlFYU-%Hq+ zJfb29O0Pe?U0o2zhnrcSp_Ye)j;p`2LS(PzJV%8!Sv|H;TM#~d5ZF8X{`NAy@GXS= zbUZE~+Oc8?D(d&wy`?9jze6VdM{)Jt#yf~f80 zrSI?h3W-yg-e<`3ucUlx?<*2>qm`iVtm=I{XvRt3F567&asWcJI5%rts%s48n*QYH z7{Fvsv-p(q+lTxog{ATpNGTM0kunhb*JzDr`36Z*2ex@=dY_BKi6kE1kXsV7gZN)u zV2N{YrsQZolP?cg(+F1_Dd$q?B!oNLQ^4K3Qe4jj^vctr>8pQEN2v|BoG98^U-NVF z?R!cWA@iv(e9p!K4G^@-Fw7owRQ7XyjS4}Vin8j~>W{x*Wlg2OE3}`vWGHQIp@dw{ zNX4%cQjZV3?&uGFQN|~3K&MCJVBYd}mGz~tV*2})AL_Z2`)+qv+!vxJc;Dhc43V@4 z?YEBLSs1_Aha_0iwHS=rP;czltg}N@k=XwB-MOE5|L*b?14q*e8Zg49d~#gv%nfC- zTy3F}Cqv+_WwV?B2EWY|MHX;0(=X$OND12$a4r>9htwY4N-kDEoAqGkYpm}*+n_Tg zt*Wm7x(;Yld~9l(Wi!mx(bPW2QP-ypkHRXATgO5vdHN;zjhUb4%8pYcG$CuBC+HwF z9xo!Zl#9A~bI!p_$DC8e~y*>~49 z=+lv5L^0%NL|zg&)uPr&HpI8vxl^}PuFVKGxogIpDfO@BfRTw%`w6*>`p4SavnfK; zDHN;mJ(ls^VCr?}H}M{TK>Ll`x`KZ9C+^XDR2(H~0JroE{7Na}>3VYpxi}2^5~EC! z)NAra-;q=XsLnC*w+FrmSX%GLEsHYsx16p5#3Y#SC`XrTvU7ZAHU|@j z{7`kQS)v%AzIVKn9kK~U3D-Lie0`g~U2mQKYrH>cz{OC<^=3VdE<#N{B%ix}LcXqR zVy7B&T|s7Bid=a^FLJ%w^Q~qHa$^E(R(H=cJ!X&0^R4S&o`7ZaTlj2KP+c#Zl_!r!Up4&{Zm z>=FL+GaC^WEm~{erKmX;OYtm4_s!K%k#c2grHSj&Tfw&N0C+wV*496%ojhNyq`JL+ zG~4UXXv@;Qa^PA=YgQZpCMznb@QBT<Mn|45;&9PzU!fm<@maFo~yHxC?EtixP0Cpz1QZICp+6EG=^ zuEAMaOB|dO!s%LKpMWyE)EcBIeg**Kd31UDuZpz-z{X};HJbL#OfvYg_#Rr}5v)VJ z2D2zTuRjArfp>84Q{?gon6~BEzU#@9+ytAogF|*(%jJ=A;2FH>?;ke+Ok`8CSs+fP z0giuw0v`m;Zn>yDjDHTC7sctHYP`=KXX1G?;5tDg`?P$YE8M*GjftmYy}_0frmsTq zxff+#WY7Zfb>Ag$Bmz7{3WXsBIyp(atFJKhU+kQ?c3~fUK76$r_9*t@7@SJf*VkVy zGJ0@*K*-hER#HIgaNsvtF zVQw?Zp;OW`&_>_LrjcxjTC><{l5c{yBtEj9rVO#h9_vfc^CiL70-#daMT&lG!GzJ3-g!%@# zKwcV3^e_y3nvS4V;(gf85$gh8B?jz5`qZGbBx|&OLs`O7HpKCLuvf?JB1pv3-mR+R z=~ej)`EiCfrVbv-VPW*ZBRx8?jSdK{y88Mnzn@dDlp5c%1k#)Mn*B-Iq*_0EkhQsN zR?jZL>!>@t>Ct!lEkkl7s^UW)baT<*wma*z3e3jfv$5_hzXKlw-vP_4poi;!HvOvM zp)X_H-m)wV9~kQI4}z`AKEv2B;x`siVeZ*D-Ky$eUrk@KP!W<9QTeAW5+vT;IkiR} z?2tDsdyo{h7{;oQZ6jM>rB`>1XpB}#3y=Cgj z)%mOP>u(gQa)a6A%|6P4So2kOf*r>c6;`(whTyZ603aJ)Q8c@2rq>k!f;qE=u^e%%7~@9ynCidhg(5=>qx8MsTQML|8kk z6A@#Lnozg|lppgEZp{R@NfeL`BJkl>;T^+jG5YO7X>`&pJ`DID)DK6p|HcGGf=D*{ zA$4#=7xLi@=zLpw{cv%(B$cl(RaU_}OJTy?d)x`n$g)~=Z>eDq+ij{vQd$)jLZ&hq z*pc}yt% z?sm^aw_EQYLKwG9F4-B)nj(uT(o$R(Zzy08TTd#K1k>%X7ur*UF~5gLr+HXwy~OW}Rx%z)>Y z+#d;&s%1)^R03s)yrQBpC?EfwK8ovhlxW;?(7xTZaYX>T`1MI@&1GI2pT5%1x?qvR zW=a^Lr;)QE;W06~lczyBGuDIzZU=rE6Me}Z=<8cq73fA!N#a)-k~6;mtRJ|4j&K3| zw_y=Si#9c5%M4~^fXNbF*H`>Zs}=)s3b5Y2E(QzP^|h3<8C)^UU)!XK*2b6jFh3Da z{QL-+#K8ZklpUnN41kYE{(b*Aa9cAPo@(cgS=3Y)b1aoe-|;$J*kwoPId#CZ*{Za| z^EBbWgj@Y}|H0G0D6_Mmok{3#jhu&2PbDa_7e>$4(N`}@a(qX9WomS@Emvj7B|_bU&ky^}VdD z!tLnjEtU7xTLIv(s@@}iyt2SU{Wx6o;(6$5Uh+blgPu+HB(;0hUbTCSObXl{u;ia$ zB|c+{S2V-ySCS?EhK9UCBr%rx?V=<*6#CaSR}LF!|DP!Y>He zluE~PzTPWRV`CY5vIgzaKlywVkiL2cBtTQPfnJ?;KY_40j^p#K=n=P9EBeXH=;f)C zd3l<;R-e$(s;Cna6GzY0L=-Hahx>NF5g^p!87xOjPoc6P{p%C~U~NHpk+$$k1I^>7xdJJkU$L|aE&*lU)C}csHNgDV4;m8s)+c75=Y_(7wSma%J(E-dU@|^?c%^VTYjLaY<&A{OrMuu zxOeaDWu1J?PvhU`0g^w8_(ah|ndlHbkH$dLpeD;kA(l~_Hm#glmuh6LTrTo=VTgrZ zV?AxV>m*BcKa9?@DH@U???tHaG41RL>qoa^1d40|t(Yl%;)_rOCQv46^4@E#h~h#H zo0)LjRsbT>q-uB;bQ)4}s;5EM0 zo`FR0xtz*Y!^3W=_k7$Psg6M)KXR*qz8G|R{v$Q@xg_3>@@j@dZ_M~c_ zTIz*FaQ`p4*7@j$Uxxfnf_6;Sav5tEPPZs-UnYawdar%|jlRQO^7Fx~p!o7nfMCwe2IG@7 z=(5Bj?u+LR1E!b$0P6=pzN;G%=2Lh7Aw0IvVUh5w9w8v?MKw98VaBMb?mgp4_ky14 zW#dlu5TF}F5rNwZcZlW30HaI44tVCnnFIK!U+h1?+!_zFF_lppQ_zUT(0Wi~epfC_ zkC=x*e&xLxC|HJM0Q9oKhrK7?8JJ_)>AOSUaE%NQW-D9&b*N^GvZ@h_uE)JInX_kC z!Uqh|w!k3o_QPALOj{`Ghd^?nI+Rth;wR99SutBQxh;QRQq8lJ(n)gNfY(xUZD{A9 z=ohIGr2xWV@wf1VwwOWIYXXo0Yzlc}EQKHyNPh2MW%B;_Gw;c+r#wGKffS@h@U0ay ztZDL+QKBDq&dh&%d0sq9G#>X+=;;~fkAw23?M*(Rw|E^C;!o)s8x{e5sbh!hEmW}% zRkhV@tM*vRKw@yoE^)JJYKKkwgGP!pewjn9PuKbEX@>FR;oX&jQ5QPOsB@IE#o7KF zo043j^c-+E1d1F>2E=&A7RAXFC0@ra#wRdJ!X707UA+~HwFCm)nq`__lD1RS2@^;( zOEf=fU}|!(rUS(c5hSntC;0eBdJU=#BKc}X?E36B8ZKE*+opAVKHloN*LV`GCvJ=3r$*c13rXFKF6 z)y1=R-3P(t>p)zqWLry>#oS)_p2!Z~56Wv^p3K*(2gzo;LhtA}F76 z=jGKUOG15B)$bzld&qx%eeh%Z{+chaWG#$EDy^X|2@MCnwDe5+NXa#!wJz+-ljtIG z3hc~8M&jaG+r2+^1mF7sP#_ZJ2Qt>(KrG)oKAceo{oa@p;=EOPjL5kz$=L{M-{Lp$ z>m@q7U4vlx5AdN*OL18C9-BPGlp zSIxhRo>((;#sy&`Ff4~9d{VwMV7?onONA6@!PM7O|6XF$ickW>>`Q{b(iWkl9TPy4 zC`SSmtx$_meh*f@D^E}Ulw4K4+54l~DGlSG22WWPA7RP|*0DkmL9hdMo|*20d3C_> z+@t8rhsP7n$1Wg{W;TWnj3(yx_6B^{wLi3uU5M0q`RVbMK<77x;k&0TWw#_ufT)mQ;{Y#3Gvoks%(F%~J zNd?k!u@jMKG1XWpIy3!~Acu_Gn{rtwR&Sr?2*FRfAd)bE5|3c5+VNR~si|Xo*xM%z zmA8fjc7#e=$PLw#+0_AtHc-1VBjS+2_gkAd#eqQPtx3GKyMfHBC!|hw@Zmjb(u7~>T%_^g`1K?*z&L!Ig#zaQ#ks<* zE4Ljvk7w1?o4uUZrW}ob(R>SY-dov1mwbmtS`X?vhJaX$XNpcr!EWUEtIAqT!`jXe z13Ly=4=Y;_`%gT089;OWNXit3b8r1!cITr)2f|2pOR*4EHWvpzoaQ(I~73QU3l`ggZB@wYgt{Kf6n=W7v7YY9VX zIqA6zHe8~-z1xY5P1h-z=^5!C$TAD~VAH`eMYHQuYiRFMu|}ju^yT;xH|=MtE(36p zp4*o#66kV0g%)612ZQRH;TT z=sE@gqILS%ni78IG5T$Q-ax}zur_>l#s?Gtz5e<%5Y-Tr_?*f&IC6KzmxB;pCL!S| zGZwtsW(KWRy?}`Y`i)!~XpPx>pV#v(I?5&I3xqxs*cHlI@8{TFM_D<<%v0U4UtDXCFKx!@9B&yEo)R?cbk z7LURVI?$zQr*&emF!C>b2Sm~t#kU9Urc@qZHU!>lmp7jA{L_X(;7&?FI2fIB@%aNpOvty)eD%h^OQ(wY^c6?;O+2lL;h$;0;U3pz zcJ!RA$$@6`=Rt`dddsI68`tYUUH_F8``GOTnX+SI-w(qw{I0>4 zC5%|NmxLhibt(`5K4#v#;mcOmVdHP_KV5$LFoNe{9*_;hqp?B4zJT3zHPqox@_6+b zx5{Z5s3y-cL*9X7Y-4`^kd0>$dV!3ZjDGV%^(#9E2U`LibL{%s^Uvg=MVN#}9AYUql4+nx8OKqt< zEdh)*exv5D{t1qL*+z44S4xA15bCKT7OkXR^&fy}W$NJ(HW|ez?0JTFTBC6VRj8QF z6@L+yG3u1xk3BOh*mwzTVM>sWzKuv~n+mi4l7&V=2O3Y=nNvmX}^!OhGM-q0+F6jz$?jZ|T3;a{#5a#{25tVhAxd+OSC! zaUT^1Q2#nzBcrXD$6J;Dnvk5JP1e7jEv*md6(}-k-4bFQuhkw4go^oOT3A#WsBcTid}; z0y`dEOlBSdF+}0Pzh*n4(6r4cu4Je_$W99U6g`O?`d83dQ=Ibp~n^lT;Z{WJlH7 zJYh$|J?+^zJI{YADk0XjY-ysbBizq5uwoM2ZQ*a>R=%FG^VdGWf6gh3qDu7ZM*N~r zAs_Ix?mwwcsrcWmx1JD*BO=Th0U!Bv9ufEz>2&+9NF|4%7&xmM!_-QF>O#9xyJ8ya zU;4mHp1_7)rueinq$|Oe2B3lP4mDB~nhp$GJYDX3Fdt5VwPpDLzU3Y&`B!B8(A=V(MC-f}~~#;dh9gH|ujbN%E%@q)$u?{u$$ssRJH#q(MQ z1|N&ZK!Blfnby*owC4k+@{J|GLo=UkzH-#~wx^KCU0S6J9m}9bWFf_myWl_Aoh~pN znS@{m0uts>p|>MgSmN{J}g$lR1ZKjFnA zQ{Ix-azN`=&>e097eE5I9IZU@*J$zv3W*I^wY5_qQ@eTg(r>kpy>9l+YD~n!v;@uN zvZl|1U~d%6cIwDw3g@fbMAQh^Zl82qf2!EReOST0>X#Mo!fid0xf}Sj+?CUQkGM)~ zXeA3?zRzA>B?(+5@fpfo9{%>YP5Y0;xokfS0ADsCHrs+O8vw(&n$6sFl`z{e6_}lZ z#!_4J>E2>VL2vI+r;R}Q+u!m0K8#G&QmrccOrxOAn?4LkMwK~SxxDetwsz`ck#;FQ zPV;}!F)^>hxP74GHhj^3T7N3TFcCwiBcmRcL`0^?X*`>m4BXKZ=w_e8^S&n&#n(`n zC)zK&anxC1!$1Hk0Nh@}tYhdx4+n(A_@}q??dBwifCuckdN;xID!FpMuFJ|=_l(Sr z8%qFe@kudb6>4kj9Nb~?8x_SBd;#Rc7c`+&zw5)*Ss+)nzB@9mB~+= z-|GpOuP3^9QzhG?C))s#G7_E!a|&ai?J6Bgh1!T%zv~HlfIv@@ijIGwz?rryz>Ddh zLJN;QnMiGqHtK-m-jCs)#yvVeJ-ol|SSPCRrys2LnH5G?UE^~^xUA%!Su7e#S$Rf~nI->(>%vH0>-dtLh8fWD*V z$(Bmggq4|@B0)nJWSJS}C}GrOM%o)?d;=tKeTVD8g>Xh)FcJ`(73U2CMm$X9#v{|4 z91Q$duT^aV*L92~@Xs4hsuhIWDuXeAYms+5756$1 z*94ElF@j6|Di1wFKEHv>n{tAB5pGxgrW|b>_)E9#mo6rcfkxNZ6&65b>hXf2<9EgV ztj_UQ;Pw}>>j)KRpvaV$^vl`v0RLrbnxD}Mw%=}`vd~SCs4LJrgowQsE-Ye*SPKVa z=NZ9w!w9GKn_Z|hfSpCsCc*kAk{qqGnXp_8anZl1N$1bg#M1g^!2hKbG=cxH>(Nc9Ld3Q>@thCvF=Ii#Nxpa{dN@V1Nbho~ z_|5P1nxb)B3Lht4s=l0v9^wRUXnWW+wuZ-M{|j>hh;|nCg^^+k3Ru0!V;I&GCk_0! zi4+y1PrnM@aRbfAcMpecP=GH!VRU*RAUuKxonb(au6D0`jjv=JJ9d?!r@yREFB&?s zD*~@sTd$RzHjZb-sfMcmA=I(7qVFGPSF zSQ3^p6GEyVVw%h~@p6dt`Ac&9$}g{_g}SWxVk<=jq+YJ4nGC-q=QjExiuTm}sU*9q z!j9u-eT9apsOH;qRdIC+|R1tLUe))|Oz<^^oyH;Brop z!pmBkXi0gskNM*!0Rb_8ET&kAVkwOnhg?UE+Xw5)C~+wDSI;Z_zJJKy{&PxaZk(Y^ zigQDXV*QR<+n%-;AicPygUGLup4CqLXq8QDoP@>d#cdx2t@Gpu&y&3!$J_QyT02(%%`+LXiwKpf z>cBKxSWk}V0~1_8c?`N++0qh)Bgs-nZhUixn*YF zI6dV2>(nyx-KOU-ZW`{3r%mb#k0RlytZN(D8pUb3y|qboWK_@?RHNG}mM$0&lGD>O zSfhUEQ2|b0jh_4Diw9JRx@=F5EhJMI0QotDD{nqyT|q@up{1r@3Rkp;)z}A@`u?vh zci+)ZokjSk~Y9+B7Az*Tn|;hd@lt^Vn(I^|WBm7TlBk5(Bm0*MwOb!+=c zs3x~2g=|YXHX=36u6N1|WLxyMoursLRWl~1AOgmo?)YKPY`<&{y8kZd-6IC&CEhDp zz68=*JL_@dLEH3w>zJWSREZ-|f9mS{#_K!=O?wu0-T{9D#&5H@+zU;EO*N>i4FcoU zz1~ugaO-FlQu!o6{EBLenAm5hgtMllWoUF12gPadM$Uq!I9U>X&50!nm&0~OpNtG! zt(J#50gTzUD0<=P`PUx|8Ag!|b1xw)-v zGYdobrO(wxlSE*zBnVhNqqZhQPlJ1mWjSzFl_kGB>1T;l2VK1ZZ7Wr888l5 zczId>WL5riVtfD!Jq0tm0a%po()GP~zsU0W& zMAoj8RH@BCHV!U5gV)?YuKGMF%R1R}qcuM4C%PT)8rYmmu2EF5^TN5{ujgeW-Za6(fhN0TOaG84}Cu1yab%(|6ofLT3zd9 zefdpljn9e;G_iZRec^j{^VHMRYkvPgJ$BIE$)TpDL7`0B(%LJ|8v4lcj^%VE)XB8H zrqhDQMcvZsM?C|hlKIzeu{v9HJIfg(kAkMeV^WYu{G4Lg@xj=_J4UCD(8gtR;B?%D zXTX-6S}2B5Lir^r+026Ork*Itry(Rq$vj~oZIY=RZl2(hBS)T(_YllFTb{6mnQxi{ z=rENHLla#zL8#or9>oivy?EKVh57Ysk{r|y>~zW&U+!Ic&mYfQW;OKsa%_?^VlOds zY2TY^#@*Jt8gTxkV-24mr>`B|e08$qp0e8e1Tsb2Vx3)S{m=Y-8TBc_;o0hiPg z$XI^u{`_%-jR331A7hYBVY7zcBK;$b4e@aeQ{K)|#D}6tc~PRoz{)i6v)^G`j!xT- zSV}5xd=GPJ=`Kh-Fy#80o*208PS>Dd+EK%)ws?kOYDY2+n;4cW4szWdv}ABmY(Q?F zrPt^Zo%9K|riWe2n4wY!rplT7Zuru$0kiWGO( zVu9RqGcxj)mz|Tn*Pd&xZ&J!z>@bzCV0>P&Wuqo}uxlnX?DS9LJe+d>>YjSKT+`t9 z%8?f9o|hTlcD{EGnDOB&xp%L_FWxphu%a7z4{3)j`TMD@Q)nl+iTdCGbU90X9Xr3X z|9s2MXVItp#)hW8!hM{JwnHbCJR!gS=5z93PA1f7;t~?4eO>CazBYP&rl*T7A!J!w?t4$!(-II{>~4XCLcX;g|b3`+cv8utda;^(`3rk0zgIFCL9s+&Wj$>x$-8{bwAX+_COr0Sn2E}E3m|uKL*~J7=?Ok5r0arJ4 zynEow+tC9u`yLQ&!$sX+;2Ev)ZlBIP2s=z$YITkwZL~4mnD{e!X+=UY5p?1uD8#;V z$dbd0zH`4`2o7rFY`_>gx3&(w`b<|JL@N>#+IWvEuGL{o%i+|f5~3l2Zm zV&nE8a+{QQkBEwXq>%~I-ZJ`c$#a+)!ro?P<(cdBEd%i4TIM8|BIizF$pR`gsG@a5 zYxW8J2?@NvFz_0v}svZQ8CHIrjw6o7R?_lHRdr>JV>qPbaM-qVwh{`seSnOyr$ z6^Mpc{2JjoZQKsd@r2vRo;>|bqPF~pAZgxiAzr9S_tWJQ8SEI=lbNC7Zfl1uNbuQS zImISE1zCok!7PT46D<`RQh;mAz!Ky5vqu+y5LtE!{ni9JF+Fx;iPa9_6#bkhoQG)1 zllv7nHv6l2L>=R_)oTZm2ETI6!>5rqKbRlyDcVwO3ENO|sk~YGMLK`ka|Muo+2Hw# zV#nZLte1{yJ2`j5p;K#A$crDmSXE78ZRdmIqF5rnRU|kV?bL+dt(=7!`OYTKH5+R*Fak3a`|NKte&A2+X-;6w)$>!g*s@oI# z?T<{vzq3HrlET)G4n-mQwki2C!;tVK$#s|kN0G(0q{bp0uAizm&c}<7a}(Qsxu5p1 zt_Z4V5GAee+}vON$D)_Tp7_Pl>C)}~guCXev5k#$29s)L{688>FD`h8axKPib-8q_ zaPg78J}iia&k2`twf6DEq$a%%LQ|sesG!ZE42T6@Ekwpnx#0bEqy{CoaCStkB)TqK zC7Oa>)sy0nvUqj?3kTy7y{aMG;uV3Koiw8`GDb;>PkdBhe5Q&iOXM>dsvumMokErz+$KnZytL+Tu93iP-2WrMo7QgU zr;5{BuW<4?r)|W2mk2dd&C<*&*oW&azO>yoqtEFYf8mVO$0$-m118MVzw3@00k+(V zHC4<=%t@J4CY-EWr|w}}K65TY*SEe8EGC^}Z-M#7&PsU%8W~x1ikc_)gk#c@1Qv8@ z3QR0aC^N*}4tpNf`$$pyKcK9#Gz$Az>TOaW2F$dIysG_jj4%qAE?$crS|DkITw}_3pX-f`@1=FuAl*aTjyX^9Lse3ZU1NxLUAL{hK zXT?*GS7>G8CpiluEHUz7>qSn>CKlfhY9frEVsch9*DeJLh=+t@0)( zsUio8gQ9XEpapV~a_ReXc;|j~klBs|PUWwQN}oPGMOGcgF#Y)x4RFNgyFI=n?hJJv zcX^=M;X=SyFHsaLbcG9lA@18~32!1%s_VUlYbqg2@w-3F(o+cmC4u^(V+V&L_5($n zN~c@{m`|QyxISLPZp?)*1tX1`CPs5-HkwYY>EIyx3nibMO-KdrNmUJL3b97b1rS>T zV)>j-Swu(4AT5=K1yRT>H!R(gP*E_;q@%<9KzQD#?R3zxCHfMu$uqQPLR9YO=LcP% ze$#YPi9RV3ADcG)kS~=f3<#hrBT@$#L1>AZa)ad zl)(g=2*8e<%9-s^RhbfYQzn?e@u?8x+NH zMtn{xa9zYq+zxDqCt!-HY~69rp6hA5nt9{j87EhDVOO1!Mh*K&;jF#;W@qhAm!C<( z(#``R!aIQ43;Jn}s@xdwN^Ft)n}aX`_&fBQWFeD}L$Ks?>Xy$1WZhy$O@MJdJ0AiE zOX}--19fWL2=WxI2D*5|y`M6OZpH)&?A=>I{l zsgiDvWyuc5nij3%Xs1;*&$2z z+z0y1K$XDnafEStdI}KS8k(B8tcGt*x%19?BNF%I6@&;=2G|AS`P}yS7^4!gB6mEt zjUJsGF<7MoB&SNo?}U|9bQ5h!MO8E^-97kBp>wE)0`9nyJr#l`ytg` zZ&mWd;|*6(;*b=1#gtM2-RC3}(59GY#;lh$cYeW6oX}%AG5rllIMj9EZ)%VM0?;^9 z1}KpvTdIgK+U_y~Q9ZUIA2F)o^@24irRoUl4W~Rbx}P30e!1TU#T_*w+PunVT@RM! z?W2o6;RC_%yN)Klm<<#m>>hr?w4d46X;~6}vDbApj8Ovx^ru0|zq3dtqAyfx?JP;_xF#blxSUV z48$?iDwlnp6;-bmQuE6+VyOw2bZMt>I<+e_szLbZvU@yb^{tWGb={r>kf!9SgfGy? zBp5YpN9T=3ST!jod6g-RaF2Ws&^SflXh-j0t2+|Y{U{DXgspcOm7UwUhG%Qo zM5NJ=M^p;>?|l;)iW0e5+Y`^+AM{b_zS8O%Pnz=H7qfrR=YSmh80<4 zAYFJ@XAhBR)GpMjM5R&1SNljMAxmrE&>T^rGP>HV5vYA+V)(hWP!gxY^pl)8j4}`= z)}4*(7e^<%U!vD$SgKt)>&SELA>bjf6TQFKuB#O4;e_>ggXr{<5u3c;SB6V66sS88?Rud=pqX>+_a z_u1=L`*^I^(5FfO9fEr(XejV43-xfSuDiY8_D_ah`TV4PbJmQ5LqzjT&9a?#C8#J` zrdfezAzYzQN#&sJxZb=#g;ODo0iy9?zfZZ3jT$8)&El6&=m%aVd*laZ_*-%pVYN7o z`FtIrO}wBfw5mpAkghlBskf}Km^8DzR8ZF2FS@s)kV%2w-pvQ{uRPfk)6*BH9B;m1sG8h$YDtm3<{+wr>IuNo7` zV%6;duZSFegvZ0ba`5;<_Q&|N1?~jjTsTE$6oOBY)YrO>c23Oeyo56NLT=fgwd}bJ zz80|+fEZBQjVh!@tx&GFzCio&L27qD|o)N6gJ6b-uLN)3==F!dwbZ+{CV3*gOoA<(oT^=!vIxH5M99J+Rk$V7f+ge8~aS5_FON|An1RW725^Vt;_p@n{PaUcfyzH=TRH|F`rwmyP;#O zw=qdD3S31Sr$qY-DH^mR&vwgHb^#=OT4Z&6vv^m6Sa+LfJcDwRohnczQw?e9Vpg$n z<*Y3?U@8Xy89#B zusEdhYdqw8^d~J*?>*ZWU$t+}Q5EAO>FWHw^(8#8pSz@%D99Nm*i{3)A3XfI=-_D7 zJ?7MM>RnImujeq@pJhc)JDus=T;8NlSM5DW0uWZtTW)(COil$fb2nc)H!Zj_>pGjI zyG6IEodbv<8pyl2yp|)lxvQf=m{^H)PTHGYHO3;(qkfaXpsCtNhbV3DqqU7OhYLR( zAS$9%czJKS>k+35x}fv;*dNrhaltbw6Xu4^LHP0L;-XN!s-zBU3Ehy}UcNINous?0oR2{v++KxBbI{evW*V^qt0l-i82K zqB#i(liRw1&wBGu)4ZElCYJsoooVB}YgVEDVY0v426i zld95~poQ|4`R{geoIy6&LyjN&nb3iTbn{1!D{UY{faj85zu9CH-w${p=0uG10|h(;zMlqli9A>HR!QUe16$FE;! zFCT1Db3%Px>b#TxUv3>7=o%VYnwb@n%bSR-+&qlk=8RfWe%h#SC4C-DzxJN+7Ajp{ zvk@Y-ICuQ-qBdjl|D^1Lm9nS#VNqpn5Q4(z2uuqLHrt>3D8?aBT?Q7T(x`m`4BIUB{Sx0HqH?|fM`I(tvWPZv;?0vZzYOmM9qfy_ohD}x`=t_;9|n7URe;QWZ1fA727*yYx?XQ9`mU<~VqD&9&+eZB zuEGjrMh{eUI|eZLjr5J*CAZv=1*pzOpHL6!`5naQ(MI2eJrb7ajjb9+wdp4?q39YJ z6fd80xa68UIK)*h*RbQG0j^>V`2$S7tm}W@{1NZ<6NK>K{?k|fqQn7Z{6f%KH#?u+ zn1Y92&8>}d^YhUbWKt#_2BTK-zIhslZo;QQVNiw51z*7*S74u6&pdV)Zk?-Hj)VnG$MD~ zn_D4>#{IV7Vw|ZSR>Kb{H1(>n$1_Lg2fE1BvkGu3A>NWF;${+El3>$66nSJpOv7b%P@Na7)2J$GqQ4QPB|d+zjfZCzvGftwo&6;jcmQOz=4 z1JSXQ)suw~8pXkJdHxEs_{^yyzfRJZmzO)=PWovOu_DV0eYq4~>${$z)~kkfk_WL| zU#ZcVL!wRW$hR;W7i%ikW?&_OLIJ4rQwGk?&fH#~@9F7wLN$MFLNCM3LR#plDY-bL`?&d7MB)*K4 zdQWjuK&(xEK%_6edJ?>wsVN$+bctz=K80*!muvW71PzPv?>@dfwaO8Wlb21HyQ8!7 zEuaFE(dG?=n+;4|d?JH>fsu&bn!ItP{wcs1l7y}4BmOajJEr+rr4%w~)!6&-rIDev z@HVs!vs^Fzwn8>HOWs{3ov5L7zlN zM;FUoe8#9HyB4cxfCS9OR9Ho$GBB~rsH_@*WfgtTD3p2~-fPA%@9I40a$o=3MU!*lED;#u3@P3CMxA0+}O9#%Aa ztNJZUXX)Cn?WiNoseOpSC|4`8qSF>hLV&JZv{VDI6b82Y9e_}uzo4HjrpUjNtxVnW zFXcG;wi#Ab7}r+brFr|?RN!YOu&10AZkDxoPrn7~EY14`&|d#w!gE*0j3zDb!oP(3 zdUG7EsQ2y^y93esW$Amo&%Cay=ZIiFwLHhZ_TTmO9D!LRIE3;pjq!afKuq;&pIpz8 zo71ioUZjs3)Oktx$nertA3N+QZtfT3P;Dhd+SuJaeR09k-rf#aHGMlbK+d_Vq4oZ6 z?)m$bto~`_!TRJPIFeNLkN0%cqnu6Zz{TIi_G`lHD@*4a@KduB-#yg_UFFZ_onEoN z?Tda%9ImP*F$)UH2O5cF{%1*iu26hC2E|HB@;#&GYzJM$F{V_QI31(2rW(WX8KPk0 z5-+ke0b1nQ#o3%wi`{f{tO*b+QTeLuzZ=p=7}i{*Lm0=Yr8nwniAgfgZ>#GdkEQs^U=jq7?n>iyf{nADIIeTQewR4_xFTdZ>>|e{_uVNuc5-`{n_uHQ{ z!gmfSN=FZfz|weq`?j*SW)T!*LM!4L`iUFJbBg?u|42;F#zW9dN3HSB!eTT5q8&RR zE(pkZi~s;XN1=M`-eJv_hPJGE(Nm@S4(kO-meG!LYXia#p?5DE!=k>Ie)JjC^0}XT zc9^XfJ@giIk+anmC~a{}t1T~=LS)*Jb*}@e)6#xsyt}V$@s8>Lh!Q=@JS2DX9v!rQ z$IzW9lIa}@{=tV^K_LVs#b6BkNBITdz+7-2tK=NZ%!8&J0gujmyEuL2i(MKEOz#%>6LE5lWQHzmqLfhj zFXJ4M{oA157iVWmUjhuWmmeEdMJ5V1ztCl@@r=p!0&u?5Y|Ql5BGK_;=H6u;DV%N;s@I;6vcI+^Dqv zf^6KHIO1vT2M{b5@qTiOUl;oDCUCA%og`!N@1gzd{Jg%iaWc?3zgFlPA^#~gshAtV zEEBEYl#3FLyY1sh0>qf!tg4DOT}!M@zaOD@A;KldiY-Ke;k({Hu7+NiOqfp9Z8YRnnZzZ4CE>nF3aT zkI>~>=Z2P+aZ5_*OPWHOj3g66V8rAaA5GMp5*drOH)goL{P^D)a>U3NgEY$I*XCBM z^u~M`!On|lnJPjcfCWoW7j3xwZ#$HRNP100E4OkgJ$*e ztUfzoLg{n`80$ZmVawa`?iA>3DNW?VuDw4u#HsNOt%E+oEat}R{@Rs2*B z#10S${ja&7prQ$25l%=rOgD6_k+q?k5 z(Qw9U!jfYMKe`BOcQ*L{kc`8i*JhJ1v13@9*uOF7l*<>u1uH7Ax>~(T^i1HriUq&p~EL=`jnq zf`S~`q-g)?q5=~F)|G>XeoiM(AQoVR#LTzOK5jZ9m2hyoOE)$F)G>7Vl7ctF={VbU zwz2Q73Z;j=iat3LoL#6_YRyJB8T`0p8*~5VE36h9iK51n(F$cF=j8vX@gMwwAV~^! z;o5o1?}=4CmhTmMgzk@5m?BUj7~;bQj3H$JBeF3fqhPC9^!1d9W+N}BY-j%G{e%Sd zaydac>||Xt=vJD(zJ2ttXrV0);rF$_5t2bnQM8+0j?zGzWR7yEn(o0s$eJ|vBTVHU z4iI9vvXu4DY2Dp(kM}B9u%}tk9}6&Kc3Z-R(Jx*s0&l0cA?}znfw%ixUCz*nCl#e3 z3)0uSvZDt-H`SJKd$j_t3QRKegj6qG37WeC9wg-c=z%A^yZ_$zXs~FNFa2Dw#~Itl z^7AtSqP@m|5d?vFOyT*k>#f@emS)TPTRlcNEkvkVK-16WAjLK{*p75eMgNB=`hED$ z^)odRTd6|y_O@5`ju}Y>nr&0yl6l1Du|4vxP%(>9+yQ>Q9D6hi289QT->TYb*S#b4 zCG=X=44v_*ATE~;l`f0NfNq?mm%~m1xwvIgq3+hdRoF?4*w>bQv&BUIFKe4B7d_cT zaayrX-Lmb*#q;*X!2`N8@3a|H42cz7-o+Hh>^a}7SLiDu#kobku9pbC{VBfthZr8> z!qbYF^(({+Rd|T?%~sembS|W+7O}?grVGK5bovD#=4%J8!SdfMu6fuXUjuV zDvT0QO6#$Of;!MHV)%!DWgR7aewXF!U|MjR_ewl@TA-51=(SHA<0g0WJ^*O2(GMlg zGjbD{71+wqjImfVGi8i=h@CVh^A!hJQ>dW1W(o9?9}=MgXqanTiN=k+yExXX1x?k$ z_nEU{DQtGasRg{hD)K&^>Q589LItrQ%+L?WbX}OS8Ys+_f#D&P3n^?oGh_Dx30_R3 z;ux5bG~2uJV+i8mODtDP(?$9L7BAIE2oTE{)@X^bG!Ctd>e{oO3duu8qR69}2=u6s zwTvHLCfBR-9_Z_J7y-WhFk9M8bdgjT)1kuQ+=nmr==Rk#WOn#5no46B!K7eF|rs_y`(~Wd|?cDrcijIU6!zfFnR^iOja_i9o>B77Nv@t+zHIJs(<3l@(58S*-)n6k zvx7rrNlb4j+N%Ptmw)GIhZ)atN`M_z-Te3OeKRm+R1m!a4-ML^w0k7e{!EX|nWHRjF5^y;#M}2B#oEY<4w^^#Odw-k$bQS76?2Y)_X2zywUw!B5R&B1r z>CS6uis6M8(-8ir+S>Zg=F$AXV^mOauo}I2_Pj06thiiO36THUqyb>ERdRplat~v> z?~Rxl3j}1n8fVx;6tE+im|3vGF^jLGCv;hi+Y~xy|IZs5AROV4)wZz~86*Xh2K!K0 zl?pX974p_U-6(V4ZT_T#kUS#%P$^k(zo;}}_Bl2X1UxyYnwn33Iu2f*k>o@cq zy{Tc{v~ljPL&S~A=kNU%BjxSK+;E9Np>jPT=t;HCb@~`%G3XorI0NpGYrC^|AE#IW}ljzTE(> z+S?E>>P@0&=S~mGj|k`Q0@EJuWd74w{J0}1k1f6DGc~uvVV8Atw3{^NVpv8LwPZWh z9Q{-4XS09+($T+{_+2m}nLldo6#TwhCY5Z`)w=t%+x3n#a3s!Numv5lRZmflGe+4p zANowbN53lN?J({+7GMjh%cUbLKQt0VnOj^AWBpz5ySzKGif)r`uzSzr=-W#dmgSL` z>C!5{*dxrzx(0&PdCfCpp0TJ8R~gm^%Z4jO5`ev|PENe<{%cvZS9?7icldbg^slY; za`DGbJsZaSpR>RlA=yOIT}D;m(fznXJ=;ml2nwBthd=q$XtJMu!zgrWoXx8DNzelj zf!!M+#JZ-jXZ0kjm=GQ`K(zVqlQC?|!1mYS4-;dmpP;sv1>~&B$VVDMEd{Y-Lzon* zOCVe#J(Tt&R;R6sdvjfk`Gjpy!`}=&e5Y$^ibOf=6Sy3e@DTmDClP2(g)R!QQ492j z6u>1@ZpFTE_{&P@?A1Pyw5*8;4R)&v@4pB1b+irDiKg_bv5+N} zim&2WDl|pG4qoTuqf||}4A)|9XkRuOG2g$->Z~B_|{LV71v~YYrH#{}YMu%;U ztlxDN8&^$VN8|+V9BtXm`Uot@h%Cs`d54s}lIUv7>XzhU6w{p9-nNHOieJlW)Bbp&YTCQt^glI# z1g+n7zt)u?88@C2bn!tuU1z2Bl$6k&Bt2tUSDIWzwYSrgpCai6Wjf#KZI;t3&XglmO(MigGnKux;T)%Aav@|!QMUk zP0n1RsEp}5Z@rgqJh6!BK}%t4;yur9R~^}DVat>M2KC+}itH;f?YL|Q;wcu0BjQG= z{j%{%oOG`fnHFOS9fUBcreZs|sq=~*ZGARdBOPY9OG$cc=2nyylC&~o1Ye$ z-e+7MOh3_=~>oMf#)b ze)||nK2V*kSBgef$QGf?I5pv>N;Xl7B&m!+hu56^-6|bar<^Xo1L&tx65qc=TrV^E5h;0kaMey(Wtel4L?JM@!Sl$%%j&u?6ktu|N!RsB0V$$y1N}nJqoN0G zHr;)L;~C^?<>Wo&^8D0(n`ps<$_rSm7?vKXYBWe9kG(-qal@%mbACEA|F*?z(OTk; z7FOxt^^-1>Q$eS9O<}{Yftb;aD8LoK1RrTlywfW5@Y)r*>>Vc|_Vq1`?do{vYG$bP-z*KE<~>ZTQ=n=mnL8V2&Bf zOx5?)xe_U!mVM6&KmeRg42CxN^l-W{U|Z7fdw;rJ^}2m006j1ruVa=)2O)El)!0DD zq#eUjkYttH$4PpC---*(>cdEq!IJbm1NABphQP!!&}Ru^z)Fvwr%0$DNJS&@wqtzw zF_3awpn=KL&xfm3Xoyk@g>9@*DZ9^2`1MNS+wbsMaH!CyNq{5yM(egXzKi7?;8Xps z_7;`zLyxd3)I9ty`fTym9rWt#Gk>}{(sxR_H~80RjMmEeTSmrI$3T1cLwg%+@qvHm zBO?J8H+UQqsJ`u+B|42$6XTCoTyxs&QxYks38T9L#efjFq`sCgw+(}?1W<~1K^HNd zbTTpYZR>3^*7?pL*ROK73p-@wT>**E#ke>e={jqkCQ~3~1l7)n`=}RXg84fXKff%qq*p~e9%oD$cE+gihN3x}*E@ob3&_{<9uEJ&c^u z7}gxTJKpO@%+&I{vH7s|!22TXP(9CSBdm|@^R8;ZQZJM|C#zCQ6kIrOL|LGjLcyd$Zq9QxBCv*`3kE7bJMRt)TAw zBJ=)a*}(eYA$L|<8P~U)b?m8ufqXh1&hNxvtA^LKxP2xAa6 zENOfpt&)Lgz0*a64@+$F98D;684@!)$T*Qjh!!QE`pA12e7=m1d{n0^mP|*^Y`k*hG5OW%!nM-vY6J1or}7frE7{=O zKsIrE{Hzt4F$yl1b5mk^x5PnXlU<{)%ztVHpDNg3kbssjCqiik&+HUEgwHN$R?qUS z^HNA(aS2nkq_7E~pL|jS=Y)A4w4yVqp(s-8Nu0F)leDRq!;;T3tWHO6>a$E%{W?@c zM1)sL`ZNd+iKt)2#PYqL`JEVkdz3AbjU#w{N4(qyJn(kfCl5~iX514xs2$^ZZW literal 0 HcmV?d00001