From 5cb2eda119d06a519c036b03215610db72b29a15 Mon Sep 17 00:00:00 2001 From: Falk Mielke Date: Fri, 11 Oct 2024 10:32:45 +0200 Subject: [PATCH 1/9] dhmv: adjust/extend `get_coverage_wcs()`* - dhmv api support - adjusted roxygen - more assertions - version constraint - case-insensitive wcs --- R/get_coverage_wcs.R | 55 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 44 insertions(+), 11 deletions(-) diff --git a/R/get_coverage_wcs.R b/R/get_coverage_wcs.R index 24ccfc4..c26c756 100644 --- a/R/get_coverage_wcs.R +++ b/R/get_coverage_wcs.R @@ -4,7 +4,7 @@ #' from which it is read with `terra::rast()` - if needed reprojected - #' and returned as a `SpatRaster`object #' -#' @param wcs One of `"dtm"`, `"dsm"`, `"omz"`, `"omw"` +#' @param wcs One of `"dtm"`, `"dsm"`, `"omz"`, `"omw"`, `"dhmv"` #' @param bbox An object of class bbox of length 4. #' @param layername Character string; name of the layer #' @param resolution Output resolution in meters @@ -20,7 +20,8 @@ #' - `"omw"`: orthophotomosaic winter images Flanders #' - `"dtm"`: digital terrain model Flanders #' - `"dsm"`: digital surface model Flanders -#' See [metadata Vlaanderen](https://metadata.vlaanderen.be/metadatacenter/srv/dut/catalog.search#/search?keyword=OGC:WCS) for more information # nolint: line_length_linter. +#' - `"dhmv"`: digital elevation model Flanders (contains dtm and dsm data) +#' See [metadata Vlaanderen](https://metadata.vlaanderen.be/srv/eng/catalog.search#/search?any=WCS) for more information # nolint: line_length_linter. #' #' @importFrom sf st_as_sf st_transform st_coordinates #' @importFrom terra rast `res<-` project @@ -46,35 +47,56 @@ #' } #' get_coverage_wcs <- function( - wcs = c("dtm", "dsm", "omz", "omw"), + wcs = c("dtm", "dsm", "omz", "omw", "dhmv"), bbox, layername, resolution, - wcs_crs = "EPSG:4258", + wcs_crs = c("EPSG:4258", "EPSG:31370"), output_crs = "EPSG:31370", bbox_crs = "EPSG:31370", version = c("1.0.0", "2.0.1"), ...) { + # prelim check version <- match.arg(version) + wcs <- tolower(wcs) # case insensitive wcs wcs <- match.arg(wcs) wcs_crs <- match.arg(wcs_crs) bbox_crs <- match.arg(bbox_crs) + + # constrain version | wcs + if (wcs == "dhmv") { + assert_that(version == "1.0.0", + msg = "WCS `DHMV` is incompatible with versions other than `1.0.0`.") + } + # set url wcs <- switch(wcs, omz = "https://geo.api.vlaanderen.be/oi-omz/wcs", omw = "https://geo.api.vlaanderen.be/oi-omw/wcs", dtm = "https://geo.api.vlaanderen.be/el-dtm/wcs", - dsm = "https://geo.api.vlaanderen.be/el-dsm/wcs" + dsm = "https://geo.api.vlaanderen.be/el-dsm/wcs", + dhmv = "https://geo.api.vlaanderen.be/DHMV/wcs" + ) + + # assure package availability + stopifnot( + assertthat = require("assertthat", quietly = TRUE), + httr = require("httr", quietly = TRUE), + sf = require("sf", quietly = TRUE), + terra = require("terra", quietly = TRUE) ) + # data type assertions assert_that(is.character(layername)) assert_that(is.character(output_crs)) assert_that(inherits(bbox, "bbox")) - assert_that(is.numeric(resolution)) + # resolution <=0 will give a `404` + assert_that(is.numeric(resolution) && resolution > 0) + # assemble the bounding box matrix(bbox, ncol = 2, byrow = TRUE) |> as.data.frame() |> st_as_sf(coords = c("V1", "V2"), crs = bbox_crs) |> @@ -83,9 +105,10 @@ get_coverage_wcs <- function( as.vector() -> bbox names(bbox) <- c("xmin", "xmax", "ymin", "ymax") - # build url request + # prepare url request url <- parse_url(wcs) + # variant: version 2.0.1 if (version == "2.0.1") { epsg_code <- str_extract(wcs_crs, "\\d+") url$query <- list( @@ -114,17 +137,22 @@ get_coverage_wcs <- function( RESPONSE_CRS = wcs_crs, ... ) + + # build and run the http request request <- build_url(url) file <- tempfile(fileext = ".mht") - x <- GET( + http_response <- GET( url = request, write_disk(file) ) + # multipart file extract tif part unpack_mht(file) file <- str_replace(file, "mht", "tif") - } + } # /version 2.0.1 + + # variant: version 1.0.0 if (version == "1.0.0") { url$query <- list( SERVICE = "WCS", @@ -145,20 +173,25 @@ get_coverage_wcs <- function( RESPONSE_CRS = wcs_crs, ... ) + + # build and run the http request request <- build_url(url) file <- tempfile(fileext = ".tif") - x <- GET( + http_response <- GET( url = request, write_disk(file) ) } - stop_for_status(x) + # raise http errors + stop_for_status(http_response) + # assemble the spatial raster raster <- rast(file) template <- project(raster, output_crs) res(template) <- resolution raster <- project(raster, template) + return(raster) } From 074248c6dc6f32cf6d1151b7bdc227a0ffe997fc Mon Sep 17 00:00:00 2001 From: Falk Mielke Date: Fri, 11 Oct 2024 11:11:49 +0200 Subject: [PATCH 2/9] dhmv: vignette --- man/figures/qgis_lead.avif | Bin 0 -> 80274 bytes vignettes/spatial_dhmv_query.Rmd | 397 +++++++++++++++++++++++++++++++ 2 files changed, 397 insertions(+) create mode 100644 man/figures/qgis_lead.avif create mode 100644 vignettes/spatial_dhmv_query.Rmd diff --git a/man/figures/qgis_lead.avif b/man/figures/qgis_lead.avif new file mode 100644 index 0000000000000000000000000000000000000000..2de3cf7832a4143751ceec4a9d4c2f62b83af7d9 GIT binary patch literal 80274 zcmXuIV~{RP&ow%>ZQHhO+xF}+ud!|0_8xPOZQHgzbMEIo^(9qV$x5n|ADutlKtMo5 z7Oq~7#_rY@K>x}A(B9gD+1}dNLSC3zwa0_O7k&!@7s{_}sm|1X2{ zUtkXMzvBODjNO@-MIG!M{;#EtwWG7+f4r=u^g2ZN7i0NRQL*cf9B0tr zOS|D+{&owk(SZ0T3G?~ZBqyyQ>A#qblZt=$^CE}l31HJ{ca*lqgjKVGC-Gf&BslVc z_~pomkRhp@{^1*3Y{|L0dDWEmyz&~70IM7(*1fiy@Uc>Z9QuY_)tzS4430vdE*X)V z!bg}4YR4ELr%`*-G5oSk@%tGWU}TlRk#n}e50^ICHN244n%TJsfi|40fAX{Q4kACY zq+qC2rR|>U`F``3v*!)YGm|*qnRqXBmW10u{$x6JAD%l`NgGSk$trLt;MYUfuCoW+ zeDYlBUuLG;jsxM>v{WA<7_6hJ+>%h7u-Ow3&s%4gxHO&=E6X$FRr;2& z$ccK>TAH||9WGk4!nBDi#^@_2aVUjLxFg1!n=nAKHB{Bpil-srViF7#jGj2(Ly6_f zG6vMq1V9o58Vn0usvP;)Wzm0pU z5n0}NJLM4{-tzYS=BQxG4WTDNdtmE>Hpw36{am&!{)}z@)l+^pB7qLf`2~m$vuW}e z-bvT1-DYF$S^sGzc}U6I)2~k3m#a5RE}SvDmEhA0bsv}=S1zcvvljms&M0NKfX2#p zh})~)ZyTq54a!>yLUA!tm%ICNj0G^R@!P)?^<8XnaP@hxrLlIzo=N0Cgz7_0;pOro z4Brd?rI2apI7cu-xSz_~xBKC5rw%tHv5|+zjt{}**F1xuWam#@C5HlGvG0>cjk+6Z zgY!T|O4Nq~UR-GoMU7mO`IY&Da7ngyuq)n}D?&uF-MtDyPVBG>NlR}ffquD@|g7T8S zNml)8mMObW5?|idJx6t-Cdrlt%{gNS%l;zw7q&7qGvL5|90_SMA&UM<5aRJn6YZ`Ncl%Y9h?6hQVciz=aw)#Pq)3RhBpllND0Lz@NrtB<)e>DhNW}bK4eF z`T0oqlb~tV{JpsNj^R9KB%Xb1y|={ay4~sK$=q>o&fuk}kvu~0b`KVoU)~c8XkJ-M zK;esBK_G3=FJ#_Ze&e0+sTy3Rj(Un)_BW_MY0r&4A^sEJ-P|m@jm!jZCkay8cs}o5O$# z=3`8XZz$LlTj#~d!A2#svix}=x4($x8fV+5ZFR{=v*prXdjppiRLU`}X_Tr{>{A#L zn1El(0LDk)ADvvBMlVbqu?Zd0;HSdWI|)8DAWRF30vHnyWsx0eP|VI zbzj4#v#v#IpkCOnq)MrU=SaSFw+c3;i1L^A{9-?v1@6YWT5=drw;L26dxtw`?Qs|( z38s6|-YR-V(+DqbTKt2Iv2#=z1$#2rF{RD-?ny&upSfiMAwQgI$qb6pV0;v&I-f6% zQo38oC>5RL$}8RHN(M0$LhOJx$mZ1b05NetNHd62rY70~kPy?>%}wcGfhyx`r9_wB zhFykBfX=U`pEHiO3aT0T`7kf!FZ(u(x>(~TJt!Too$wFzB~Agz!EN1^)YC&0y7D^P zO-NNij>w(khVZH4G)}(+N+aowVH3epLAM?JIu$)gVNkzNFSs~YK5$9ygIspU6_=f#hzEL7*_F4v{TeN9A6vNW=w>&3Y^UA(^rgnr1V)d zW!$c@eZ=6oR&DeMXePcMllnyNod5O=uu3@YFiK=~;A$OQ)rx?NNuq>{4teGV^9rCk z!lmnweK0!e`fnsz!$C(@4vIYN_mXhcfXxzy$b1VNQq*6^5-dUi8~fxi5WT_MyTGei zt_DwbQL~u9pyEuPjVXMo&O`_Bs*NVBB{!@?xIfP0&~>Splv^Uh-@3?z{L=a9(m0}? zlRTlUl=~?Js01yx#-+ar3c`4qGs9|fRN&dytkFp~g>b$^d9rt{%x_!Gh1b#OPM|&I zyWfg0*2aag%iKa19E!IV&QJy)?U0-F$DbtAXdYU`SlBailv8~^sn%CUs9KJ%_5yq z%GL5|8(hdR!FR`Ki%AX%N|oB|0PwlN-jucxivV3vI*gA!s%sJ_S`dKd1^>kKXrrx!I7a=5WIm~}(`dK+T zMDo0~T(lc(V +|7EA{M*2#cW=g@U&1$=gREj2*$DXpRw{KVrp^QRWS1i88j2nHv@t#bj-ncun>qZSqtmI)BMAsWa-d3U@mBgr7~ zG(ua;qLwN3OgQNPU)wg%J%D>(2n1tLI1^>wQ}=o`a^5qTYBH#Wxlj{AAMbB89*)4V ze3>7wk@od1+4;bH9Zw`#{BUoXa&$G>=6<&OBl29fFNYxkMmagt|9wo%@%0EQUK#xS zMcnnt_b#odAUh|vvUcE9M^QMMdIE{JsqZWq6pfb;$+rh)9X4KOa*_r|T8|4qyXiNM zLjLl`AD&_I!r5dU#1oj1fb(*b7w2pbMcVuY?=F5Qwvkdz94-n(?<-8a=jUYO4z3_T z1O4t#PJa_OR-#_6_dX~rC;q(t8Kr=!>}_})ix-C-kIHVOIdJ6+!Z;$D2Zu^1Kd-=F zfaD*kTR@_*D!Mf4F!%?}bxf}$C?UJtRuNz2#IouV=Zw@m7}&_LX&MIi?``?d*@9t8 zy86PDeyP*}mgcO`09NX2l}sB@(XVAQN?FGOdTt}^j`8u(9DPY| zMw*&pyixs(aay?Vf%~l*LRL*hoc*8YQ=W{--D&)N_W2|@Hq=LUVizT%Rm4a~g)CEX<;c<5E|kj0F)`C<{>Hd?PlQtCwcgx;$!3Ozb_5x5wye5n8q)u0*F zd3%`_QrYU%@e-;&4i!Ru6o07q5{{Y|svN?t{zQ(C-qbmxmUQdyk)CHG#4U)Jg1&u& ziU(W@VpZ1hz`HKZSPo@)>I#85_*<5wQqRRc{-dk$eiH++w|i%U@T5F%Y#HLpHU1P> z#OsCal}zugXT%O*DYKseeFC;|srTdzQrn%``?>H05+_#;xH3w2Cr2kKqt?y@nqEY9 z*APYFs_AP3(XHNLU^%G<=M=nf)gz)mr!l&UUah}e{_kBzrgq-dU?yN`L@nO;#+Dh1 zX07qu6VOz{oP|l#*cISJ^E;I1y@#08$gAz!BKqaDKg7^&{W0;&GGj^$+rM#Qrb@#z z>Z2Xl(Mk=xv??G~7v-VNfA0fAfUK5@7AHS7ExJuq1iq<_zK9lHZap z+(2a4?W1^Tda_>+C)G_;hi1Sk9L%&VI$=-z3tN$vGoj0B!DisnU0&#fAI1AnHyG{H z@RZ?=)HQpx53SMS_|wz8nV3c+x^)QE^^xFQdH6nP<(ik!QX*REjwC@Uc+5GkcJdo}WmuvuZGBSEB|&ybG!yU9?~aj28OT12+<>8L zu4adq_Z}CzZzIF z;X_2NCC%BfSTn5g*?9?b2SYsgc0u0BI;dYSV$a1LL{Eit3ICq$GRq2|LX?KJlD1Op zqUxiiBjJ-SD18@#P&fLdIE9^DnKliTs>?V-{X1bvcBf#gMOC0`fhaKMp4-1(cj_O_M7iM!_<6F-LE2=b3e0cJS7(QmDY4}TaPa^bgC+1*P zd~}P`7T7|pBU~towfQ61`Cx0=L=rHPtKWP3I^2Vtw|s1KfaLyZW*s`lmQtamMEOt%IXN zy>xYABoN#uLJ>DFm*q4X_hxuM(h5@csTCgGO9u18Q!qaX^!}F~K_3pPD zpAXO^dIF`fgIZ%->s(v~9Az;TEXNy$S?`-gLLIM`o0b~8b>6i&IDGnV4$LLtAyHksHA8iiP3{vT<| z853fh%J^$P#GxFFFo-^oHOy=bMx`@veLFhS!dhtwpe(l~H9bp~+^Map!xiyZTkCx$ zuH5oYy+H3F(G>|=1xH?GOkxiBN@DEaL8pKik9iML5w-3Gm&Gz&7*$lx!#aY zn(y)yP{#Jx&O}9I!Z-9IZ%kG&^sb%8OelhQ2#?Wtagv|RPtNwwby82a*srWqYH ztFMj`%H7@F%gBOk$Ll(kj_=6J1>mv`WOb8cno<*B#WYyBQWw6oC;Z z$aI;rlyQKS;#=)cbW>bU+VE@9Zk!58plx0XJAvWjP2(CYe141toTx%2!{Q%f(jEsN zG#m{W>o-J@ox09OP*9kiXmSFZ-&_=5H~K9|G6XU*EbVeQdfh&8GYE-25-~5d)UdJAvz=0TPCXF zL$xOD?zJyM@oF1_(a|(G*256-%l^CkZ|Hj~^`~6)RtDMVVl=cHHtM#@1fjS)Hyhfw zou|?70pQ!?Wc`|v|2uP!ca2#e>#v;1~`yrUZG;gMKO~L0id~rS|JI z|K)gnk6pr*B?(&smk{VsN=2jShnIdou@8g?QHA&p%%T z#QJuo0;1Z|J{**C6;KD^36GMYIt|&wf?Sk7GepZ5FNc?V z$oE_H9*0BfTsZEdB34LZ`$-bwi{}2Q82yyWJm){8Q}A^!#Pm4@4sv#N(U>!A+Bz#o z|0UpV@ly`e&Olcjj91r&V?y?+Vn1n+ z(-zC6mA9NP`sJpG8Yp<1&T7WT6e}Cm2gV|ilfaqLy@uKD<})&5xAt0-grg-{yj*Xz z%f@8NZr%nV7XuHoJX-ZkwgD{2IfXBj8aldFk@w`#yq#H@3iUv{3!F+nEOG8wIa^M# z;PEq1!D_+6{`25xj#h2MeXmA~5ORq<{R+<<=&5>C^mQKV)kn=bnfs~tM9Noq@f1qD z+$JM9p}y|2`ok`G^8&jh*RfW@9$qq_<3+S^XtP{iX2L^8lUtFTt1N}hc7IJtf`CNI zXb5fL)Iw0fmc8gpxj*CZqLW?k|NHxUg+G4dLWPk_XahCpQcQbl;-$U6U3hEP0t{N(x6U;9M8Wk4U=Tl~Yd-w%FHW+d8)FtxY+?9P zZqFyKzKUB+ZpKiq1GTdg6G#RkfvT6u)|?< z4TSQKg>T(phSMO#(if7N% zn5ohG{Cz5rSQY#uR%+62MKk-FWp-e;^6)^(+RswKu@GL?DtE!CjzGs7XUbdY#MR;lReP@( zc)ea>-c`&BGj+YTRZ-q9If>Th1uiMTMI?!0N&ND=rY~n5%zC721;Y81+3g-sW-4)=jV zI!pC)uo>f_gY_WI`RuHDBIM`U)LT*4VT4(?@bEvirCEg%7@v86d}^WZ_1KEK&V^Yp zH1K!*H|yZ)TOAhT3GBE-Fsm&do*R47PR~FwvnurSoclcaNe(n2XuMxhJm<_Sz*}%O zUhX%3xZRja(a3!a(CKq9nXa>OQ?!hLN#yxGe%iWNZjnd<{> ztpm!jecuK4Ip&Jz$(04Rt?Ftl%H$S9_l0?Mav8u=+C4CU3$I;Dsd(aWWbwwSJOZ0k zT5e7)P59eq08Ba*ui1|kNZuD8*|Kqyx3J)lGt_n61UFKlb)oeLMid1M-4|jt!Z38N z58B>Ti(26$<)n#2gHnUil6$d7Ky%~CaQ4DYOKTtq$-|?#jLpx@rR_FRtFN07T5mQMKl1#V|57k??S2EAZpX&_sA=-Txa>~g zpD_Kud41~TsE(eiOzr%t)WqQ@S8hAKLrlo_?kRkWKXk=oXW%QV6-%4}D#Tzw>#!Hv`%Hfq9k7{MO} zL(srV*R&2%9m0f0H!dYKb2Kg-_xIvpS-y#N_ zq8jSD+upnew%&s98M1KUs5+14vSq7Sl3s1}nYv@aaNl8ew0N(vMMaHZ1rz_sn_hKf z!;;V0-LB}ljLO7YdwNdir-TxROgM?gO)Lwm!%M#kN8GG|NGH~%3+{U@*PQ}kDbm)& z_cAS{nxqGzi8stLIjcr!o@d*%@I{(@%sPaD>RQ&|QEE=IO|G^i;t|+ZVootjJd`2~530zY!(!k{LXNk3RhWO?yb#6Ur$*<^- z;!)cS?;b2x`h5+ulZhXCCy$!+vwBiWoyF_`N;l8(J>d^9-4=Rmyi6n^UoAr)UAL_U zkx+eCU9zWX!Jk(nf(B(Ns|&X6VQ-GZaO7Xyof=+*BEHNQSkf==PK_SQmFR;M89!0t z-hp>quP6;<#vr3S`psATdzQe^Lp_7dK2Za&&ewb(;I$k1q9n}U;4QBJyep-~Vb|N^$c3DpQ zL-PT9o1(z((#$}FEmljaz>1~dE+=?O@qeuk#0 zCJo6XS=;Q(50m&IgrO42m}0V^^FSIip=S%|9P_*%pg-l)SCcrYg2b zzY%yfGRh=6sVUKnGjk`b*zj`Ag~t*TaR!h1YRNf!fZ?{TWmqa_Jcx1rZ;D^e0?1-5 zXP-v!e@9e{NgctGz{R4RiMXIpEEzlCkG;G&)aI!UN%L6kolh9Tx+NtKK8uwWlw@7f z>aN|8!bAyCu4@7$H(rN{EBv1237xHPZ=`BJp%q+!d4b3h_(?E{3&{Lxnm~nM--)0t zTUjT94{Nyan57MgEi^Ij^*`JrXymwmyjjHA>!d;!Fff3EpC6}Uo(OK3RCSAGUE2!C zG*+}BwvV7+s4l7g<#Ixi>?EDRbyi^~tP|S<>4-e~@(RYgqYt-LT81BBNQkdV(=y{g z!|iH)7&B*!pRvb;?i}hPY~~*9)N4+4AMYScD5HS5>H+Hm#nqdfsCh@{L_b-#KfVj$ zi5Ri?9QRPvg*ztO*ZW!d>5~%*w07q3Tv4we~~NzpW~`~^X= ztX4XZ$p^}Eo@=;@lcISnR~%PgAJF0ZB}SOIc+eD#`@?gIfHY&*Sf1dsRA|@O82&QA zkY8-mVi=4XcVcKHG>Xf|-Jy?Mr~8{smRFuy9)E&(!zO;Qy8QKpFFVPHnk?C-yxj2F z_Ha31XL5&Mh$oNKps>-S2u6HO2Dq>{6oO5c#`^)`NZ~BMm}K};>oWt!`Pn+-X=pQJ z-HI3Qfyu=&bBT`2qIr;0RY(aS7y7;hD=@6QRD1J^!65BJ#x#E-y3gE*t2L9>SG&>< zoqKb95Ltsn&5X>k8ue`WtNy_HTik|m3*#3%$IImV^4GGRnD1$Ty)FJE$8mkzTtQ{> z=(6fJ;?mdQ48aSP?O#uZSKnjKUz7-o_J2u9It9Z1p1WVA5pMiM9N6mqv=_*C{kSAr zFIR-1orZtsYl8>iB^DPs8|uPofw>48 zvnNNK=WqJ6#6jdlx(>6;yWaC&!_{E{FJoO%eg6RZ@233m2fqvRti+=v*q5Eb?R;Hu zCD!LqhT)QBA+JO3%1wUhtWh*Hynv>90|-VzgaE85YZ%rM5`X2{eEw(bBK#)uRUd%% z-*Wfz*B6t&N}D(39+^)HM6|)2A)Od>!I>|Cn$^V9FE17qqdX+9ce= zm`q!Kh&KUq)7QR^J?EM!RF0osdCd&KQI(&Ow#WzWAm zY1GSK93xl1l`h7lsR7|FJEu^#Q!&zB zzKYvXy3>C;AhbUMdMErG4JPT8?<*8))FSezG&QrX*CG<1lpcpz;Y98}p}!cdEbwB* z{2Q^ZSQ!Hc-VyK(Z$di5Q=3d)rNLYCl}xOaiPUjrjxC13rbR>l?VFT)&XqjRA{SFx z2^KSORjoT+-?$ti$oN5uJ#>Ay3CMS&>wiG{j~G{3+?|dOdAk#EyQ{Ez&82rYxYmx( zn%veFTp;<%Rfq1)L0%(avAmGxbVHn!({Y-NX18#_=-11>`9Nm9VL3ufq@(4F_UoB4 z^2;YsZPbD#-ekG^794g2zwjCSqiQ?L;o30!5yHTDRLoa2=2Pg;JOuz+>FnQXs`nYH z&p2UlB5Uu(k46 zCt0z{nzhEr+PdabXK5${+#Pz(hn+9A1@yq2-MdvhbX`J(iL&Xd7???go}69HKlgMb zu-RP3eg-&5?k@+zT?399X0cHwjE?D+j8CH<fReNeJg%1%obO~X}EB)JK zncRmDC+uRwi?ECkqQ>WB@c^x!3?W)~FJzlG6HrW#KT0H zSL|R3oqqP@e{-j}aC@Y5=NeII2ucn1G(@o)CWT8w$BdLex#J-smqtgIuX07u2_T&K z)CS9ps_8smt{9l`eN5wS_GU3AT0FFsWGH|JP$b})7#&Llt3o1kwo~?9j8b=^SjSPf9HeQ-!)mJmMd^)X z0%MD$(S1={xCFhTaml3$324s)n@he#Ee4zSP^2$)iS=yr#p73lR56S2V*a=+EQ@Fj ztpa)4H}Yc|gX)Cdn$Ch<1b*_j>#dcYx@4Octl3YFM1pVuE|g)3QdyY)eSI;EevKOP z6%_gkZ&w#6d?{N%Pezopid+2E0XbnzW}_#Y5Z6a8H>9$Y^LI>FL5-xH_ft}KLB%oZMt@BLc zelQhU0W9?~(SQ_%POp{M9wrV!muFZRQ{ZnCibg|t4Bk(&7`1FAJ%6;Mijr_4SwJLI zcY&p8`NpYJYoL3kH_Tc%C+%>!Y}a3KQRxAXC2ryVV4%8Vx`e)+QD*tlfE>T(GCJd% zvj?>{Rx<$F(-6P$U_VP*)fOg9)H53yq}_|08UJX*aM7OGvg@doeJX zgstPii&ST-zy1L>h<;sHOl%YI+-Bp7*puXZsdLmZbIQ7CR5Pcyv^1kUU}Ex=xrkDH zYbMk^42b6@)b?uivHcdRWDa>kY$0NCCgO0rP@ZJFj}ds@R-#IW~OorTli` zjJ_y}TXimp(})z+sMDrpAKTRk=z~VSb(?4Tif3cW4(o{)q}h9S?byj1IW*_j960=S zn#$Da+*++T@jw+B#AYPi6ruNpla-b9u*Z^>#;H<*@EKNd3OF<2MlJKXlR|;i%X>z{ zmTepu11K`#@l%fG15Na|Wk3vn)z6Z9YU*~y43L?SlB~N?91;M@ZZi8moOGF|8%QTp zJGX?RLzih0W)cn68_?mW44PWa;diIw{e`_?_;9p4cbToCc#vDA(M>tYGC-zprV1s2 zQvj8}NTmiFI}&D{oyf7twLt2hKn#4w;nSrlxA2Cj+;s`vVhC`V0VR@kCAHIW0f%}a z!bn0g*0Z!)1IMsTCe4RW?Tx*t@~PRpp0SFmvTpyH$S5>G$o@zyUjm(Vt%xlSdpUf6 zaV`wHws=Iu-`Amg#e^ri6^U>k`oTY&6)&b<-&+_x& z4r`^8RJX(0K{Q3KLbe$Lx8xB(lnc=p+g5y%*^*yXzW40S&;Sg!>g7R%Iopfq<3~B( zc7wNB&j{iprcTw`Z$Tq+{=3@(w3NVK`BR1+#AxVeqKyVzWCGjjK~1yfoZds_+|mR+ z^cX(Gi>BGW$}-3XXB_hz1^AxbcpHb&*Y)uw(tIcF)C%rMN}j#k?v5tB$Z~ns$E=9v z#O6x-u%0abSFmFSp7d1seA_xC+xIhVVhzYZo5^38^qo=RC2wZ!nD;`*BE+etxbqfY zMwQ7tim9aF2L^tj{IWF03YAlMyz2Q-oQ9Z{;Fc-iOyEQ;f;GC&o1xy#(A1RpZy_6~ zpI}u-GC6~G=qQ)>+q2n(J#CyQ0m>J(Zn`2MNdf5)MT<6rri)Ev7@C&zuO2W&G7^761~{*$(6v1;bT(q4)v_&AT%syKrh8tcF?2hWTEc{ zJhe4|T>oK-)ob%nbumSRVc380TDmY9XG$sKYUe&n<`7=}_?8UdJy|o8AhU*5d+jYiss%wk^G9|8dWwejcHY5A?-$3TDvna0;UniEznS9bR^B z*Rp;@agnsR{R&2-zeq1Hd~a8@nw^Wqcbu(m@1K0a!C*2J7^#@+1-D#J2w1%&?%9AA zkI(*0uL8QWImNEZ8Jj0}Ijb&|I|$DB&%Uey1=W%D&l!X`^J#5s_mi~eky(q0m-hk! zrbbc50DFFk1K+Yf%={~pf}f3b(4UZNSVl=|wk=0+Q-*ABNF;NCSkz67$tjKH-}Yf8#=f$Sd&pp>S( z?T_&U8zoQvtdU>{B(>^&wo+m5D#%e-?TjkLsj`n(ZQ|MPI#hS_e#{U!-#CP%pDXDa zVd$_EeZEI!22y6_>$?THMpo5&kE=UDj8nvKEkQGp=}Bo58n}VD)Pg|B4w`4qMKa|( zpa0k%GYJ?lCk8rig|Rr)qgEX}c}uF4e%O&TM}!P!EhcoCitC`>i)&jAO-!s;C+$MA;*uTcL==6?e8Dd9djHBeQR5p(@V?(2Y zLkavDVn2x=VLeL6ql=EcHf*w62uSA0VN)};G`ceo#GXMpc(#so%@n;p==ft+ae=f+dn$%lk zJbm&y#YwFRTn*+G(xo)jf3_gtH-&m9zwot6yV;A6I2>d10oCa*irbazIP`LghZXG< zh*6XMggZ{cMatUt_2Z19`pbxCqBNZTHIp3VfOSj@M=_p~g0wDR){X%XXF44AH;dMa z<&yI){kBV)c&#Ghiu8;&fD4-~^y}YtsMP1G!iX)KNedgUzYJm^0B8w2Oe5u9jM=Cl zUuz@~-ib`>IJ3qDtqYDvi@>a4Y>iDrlx`%FvC zIjSX;5E=2{bjIUw0>)J~DDV|vXoy8sr{SsXSDF4<-3j&leX}Qfu~Z4`LbGoT6(<+_ zt3SXTFR|75J2l_#_z z?c%#ANibT6CJBrObmBR2n*u>GW2VN9i$!j?0-WeC(HknyvQ=Vx$5YfG5oXjtVpDW$ zCKaODjAb=#&zpZyy32q|2z&m3_4$JaAINCgbDn3*LJxrTxqRZdREh1KC zSPQm=g)V?E8oeVH1XY;+RB+ z+Os&}3pNMIo&h7Kk?@&_&7>(!Wb>w&Zz2zx>!?WL+W2GPzhzaoqCqbo+~&M>!;pn_ zhrcxh9P)f*nN^;nbO}9Yd8Jx7^oYJrK?McZl#`lBH8M0f&xBY&v*o16>KlS$a;Hg5 z06+N^Pi!>$@Gu2Q;)l`IXk@{%-5 zo{dIz_0=WRU#@?IpxlD_yIuJwy&zR%bLVvSK7g-pjR!HNG-E4zwK_lP2`b;A_(_OLx6P1P94XvlyRbSE`@-YDY+ z$LK5tVn`1e!z4RL`UGrL+T;<nYY{`4g2GVeRxq;DzMwT&D%< zV=Re1dtyez?&9*NgNXNArHCI1bsmQ>CktStSY~>MF5@v5MDiy3zZT0hqnmzOR^_^A zZh8Gi(9*18#IKXB6`&AB?aA4u*Mxlv{sIJc$aqY&rMUw*JjD6T&!w1wpl`-_kE-g^ z*f&KGCLy*2vGT<+cs|m7wS?jWaii^6z*Txit~cN33P(y=L^^@MdyGSmrUBTn7^ai7 zK`UwwhfQCdV)M0uo;Q0+BqR-;6sNx&73FX5gq4JUI=4CbI(Lw=meG>zbn*393L#vR zK&Sk6LI36o%$9HTEL0gKA-dc7wOE7`3EvCSp`})5Uesr$W#~t=7V?B8n04$8QZmm= z)xhmAC;MZsDW4zfsw-TfY%>u{6fvU`*@K=)k`GaSh~W6al&Rf>FkHItnev!7nKyfe zxD|Wy@24>d+*2!-Is&&<$cTFt*YrlncnavTsZQ#?@tQ`)j zOKm}3+uMMoQeGFh-addd(bQ3?j|5~jc-+7oW)#q}$aTErw7k=fqkIlnVqk>?SH+G^ znnUtrokB54o<4z^tSo|DxcD*X2xT7wb`j)er18bHjK*f2o@Z)tNv~dXISDZz{fl#0Zv7Q#ASxq^*r~ zOa&XW)5(BupSQM-EGG79O8onwJZ_~|sNzKl^8G9^6(9Ar3(nT!vc5das8vId_yVhh~90 zuh=;3;oBLnrm31|HDs^78nD2l%;8MN3)SX;f4$Dj2~%)0FvGSmG1aJtU}S~DD8#w) zy%E#eZMcZ1D4Y5mXRukxrAACn(4jbl2+G#&e1eTuFKKz8ve`dgLiV~s_Yh__DVY~; zzjQiMvwREhO#lr8@w-p!ZaBSfcuTDhgtKBrb0fGp?wkharMba?U^tr<*?dVv&u3Y! zWY5#R&S=7_iOlWmB@hZOg`#Xv7l{@m?V>8?T!*|%i68_9{~;jrdtBK~4043}tZ?tF zJb0u|b~n%y!N+bg7j2k5yWaK7TgNd*P8|tH#HY`pYP*=-RRSKyyIhh3>6E!~cKf!n zdBOC7j&i{<)<^aO0~%7j6C_>nM>XDZe-w|DhpCEfKJPgA9~k#J-dfP)U!FEGMnAm6 zPG2ejl!q3S_!~cw4H~x*0(OjRI=h+dxAW{veYng^|GEL!yiQJm?5~*f!0X;l)eL=q z3wiZDpl4$uak@f!LH&Reas-xa7a=nMeXrsm?xuuX3OmfD%kITl@pc4DR(+_2fRhe3 zh=VG8U_uPnWD++eO)mG_x2X-C5|5wdSs=?kpX677L~qNraN`*|C9K&r9l~{GYf)g5cUG{XoZ#AMg|+DR_55d!EAOMd}2Mz$6?E6WYB~-E8q19!(}7* z-OUhYLQ%tNRHTFj+lH}8)lDpg8JP)dZUmA&*tT6rU=`~5egOSUbwo#H&nC4GcBH01 z)*NlY*`ob`u=TNQTp)0^s_~P)GD|Z~u8Me@xWKQIBqyU10i86zhGbmMNL!dr?S*i_ zx!poL!GTH;FJufTG+3J5#*_dRH95^FZnyx@&a)#|sFDLJ5{cQyVs-d}TQaBG9@sO# z6H!5fbV<{7P?^s@HsI=ES_OBqZNGJF>7?cSPFXWa2cUP5pDiEyE0bEW_L|U2s?!11? zI!L##!_BEq7p0)U(`iC4lsjgGUP+=L_>T62)UvDQH|+_seq3V3B?Qy&{GB~yJ9lB2 z(|YzgxauwRXGWAIgMMr6!W0z%QJ-iTJ{1qIb!kZ(|FWgREUI65Jt(eO0~l$e`|zf0 zs0R!&vXSqOtD+-1{sq@{hdt@dt-Zy0wC)UrcuVCjy?K*gNVABk9(q0Tzx~OlpqzYz ziSCt&tJBG)X@`igt9!XJ*^Zdqqrr;%70NZ)QVw-Xwe4j_d^otPV=@g{mcM!5)u2y@ z5&ZuEFF?@0v{lYBub3fA+&bG(vrdd^yjX!i?-eMSZs8Wx;1@1{Q{|}v*IAwD zx~sOwL9EA)X1{xNdm(tGe770M8Rf_^$4?Ekl+jR(mM48n;`>rE1q1&{uim@{vz~*A z$3*lR8oJj%>lIRRwdS$m@?XDE9Al6v2|>>ZFltk z6!e8-?zc<)q7axyzSs7MV;;|7NTfu!p|7inJlJ7|L%sQd3H1Wce?BbqR&kY35UEEe z?n=ginca2_K>2-;({Hci=RbvZiqPoKRdcDs*-k9R9BIv8U!BBBt^3Ufus$3NJA} z=w>XKQe=qmn-iJSaL9C^g)te_@Z=txcR~g<$O26-~ycJn`+?i0+*2PWg&_{Sp%HXBta_h}Tk%1(|TfhD`4`o;AGnS}$y5NmN zp@4^XU3im_V7hX3;GG|~=}Qr7cOm%oqm`c+{)Qm^pd?^BT=2z|=}MB8?E+oy=lM@q zHJ@Q~xC?}%UpYx<(jlFJTGjakK}&j1-_fe@jhX#YBKlD7)Sghx(85zUa%w<}4k!3o z5`yXO7L|X)p>tf6^**Ylo9h^0@c1k)IHd5nWJ9Ym{?pYQnDt79_AybVHG{0*5x$ok zfTLsXYjFzZN_y462_;~hM3|X$P1{ zH!qt9b(?(!4F1L%FuhVuE`C_){HdU3zkb^_PaZ3Mgys6D34p z_EW6~iX{EMZVhIwANF{CDQiDVQ`h4_NwF5q$!1CLC_(Y@gMgV$urjS(THVbwAD{$> zHPYpCP`qPFAjcLt?q->%Mo>3EurZASH-h6SuW0d9G{d9?f=r;#7VXe|_8qW<=U@FZ zm0>}g(Ef$>o#Q372egoeDl%%{gfB+C^-YUvGS`qRd|K=78olvEp%wh=ylZ38xK!1h z0v3|uV1d#O=x57mL*)3iuo76tQW1MK&h#2rAZeyZ&?p(A;~fjJ#8d$f#4EQUf=D0F zwxE2`gl}pc9}nFKgp%17_2NYjfvEP}Oc`dQ09%KsvS`J(yQDiyGF|5P>4m&+&k4~5 zv~@>p55x!q@l)2|Jy>`y?hPn*ujOD>30JkF;=WS+gt3Kz7z5Gx0C_W)2}rsHInuYU zZin;-e3Gd$awGBMgh`3_?XM##4UXsUl*m;WcuPsFC)P;mLhou2Dvzk|<=PX8g;lI( z*rBICa3A(_b=E6B)5%EoM5fB5s25OCE3VC-fR+fS)z|H4dxI_mHp{l$piYRj;=+T^f#!QbHG#RL>mSnd z!V2D_cCZ~UU(74!z!DN)&&}M}(@gbLpm+yhiQ)|6GpzGLsSAiU#){~B@fdq)i)(Vv z@v`=Uu&Pf}3c{T9#KjhtumB!-`BW0ZLDKqkZ+7Je3{K{%{I)&Oh~xh}$lV$-k&S^$ z5Fr(c8iS7*kcO~DP#7I5Ak686yOh8l$>k>Ul?7Wba1+j;%AV}4)SP^=NO}A86s<1cHw1ael z5P542lm5#$01kDG!b8(V_3N+R?h~h)6PG<&7AH+Jq4me22t@F+urinE5S;KqcJ=E-@Grd1E$YP3md1@yp4#Z=56M}- zjm#Gc_us47a;fuXmOKL@_2=vDJd!KdsA{FajJ%Kt$Qkk(YI)Bs#OUfEE!pGFWPt2J zuQ%qsLuhJg%r#d^Jb z_>{-JkXhi&&0moDTE@XP&fb{#39nKyiI6j4iWA7YbFy_>Gvd18Zgs8z+fMp z2q$Tc=7kGy*zJD!MaZ;u=St4?nF}(CVfX0(k@lhWYd?H;E01qwMnovC`h7- z@R4rzJVEuL=SvbXXjsx08w!Fa*yD4${cqaSL+rtpq+ylkX-Hba*_IBcxuWoi97T|! zyAf-O1di+H*s9Gh+Wb$DEuhgn#)YqE4ho8*_)k(!Ps8Cvxt8(=DW#vJcDuw%u2nszSKt= ziY*lGCN9_gZEAd4=U~WZBQm+`J_=#$&%u`;qh3jc0**#iwO9>`4`7Mu7P#zwC8e)dJSMmlUNj$&y4h(L zntkAdt|1$~Z(7$9A+5>Dm(hrk$i5@2`bFi!t%a@icAod%y zdlrx;kZmU?)_V8?io&>HyZGpX&}+@g5Qh!!4sj}?Rl5YL9bEMMC$xJG)}?I}(sSI^ zZx<8T5GvqYmbYoBAy^42jhoy^dh_zg@2m=JJ_yUmE%%ByvS$2o(1WiS;)wAxiFod^ zvwa)-s=a$Nc?Utce(Ihry+7>z$rq>>t*i*C_Zdpk`^5}CmVV@n@Gu=MqH!n9`5ror zJ|M_{rzYZMaZ--!N9XWRcI=$qNl*kl>`_yBV{1&5eYF~)ZCEB~{Jx5BHb)?9UkefZ zL9t!AmDMSPZpdFRLgjeTpbDaP3Ib5T{2A$5uf{d!f)O0Y-cqd&owB~a3MakMiec1U zA=zw$3F7Q*u;{v21xUBdw%mXYbL@1O!1Rm!7;Zp0;Xzk(-AT7OljCcWn*07VkHjtlro`>Iwe3mTg+|d@bXy57`1wtM z5aHB!awk1+-976V6YMqP&XS$7#G&2B0bFk+CG>O~FP30zsFH8)id0T%QkI6YCTMp1 zA-B>`yW#P=jAz6Na1Ry-Zafaoic)TuJXkjqsD?gU$qf7$`o{uB79`ZT+9J=7!}L(( z`>7)pE~V}}?^6n46qI&Kym|_0MxYt@wAmH$x;oNtdEn4SsV%#WU}r2jNqKpuw;KBu zcDJe{N?ysaYX#W-nlccbUuaibt05s9@x1mitAi8CTdnTCGB15Nk5<{XLthPHWEBf-haP*@97t#jBQ0p=+!90{2U~8t za(NkkJ1@CgV+&NB9sD!jlD=e^S?2fnsUBp^EroVs3|p)_hIX%780f%AC-by_hn7$T zqb@gHbOdLsfjU5;UMPY%OUTc<8+@eDJ();!AZ;R z^^jR!CWI?xKCRNruBSgxQ3H1V3T-UG;k@~fMwHeQ_Pk6>`bQY7qk6MW6jA1FU1#xrQ( zxXb}K&Os)4449+>m!?x>z5CClf9TnKVK=flTAT1*lw&&K#!DOixoPe^Rp65E2f)fp z=heqE2ZEu(Rw7J<7)JaaAnX@0GD^-Wnh;!ML(YgVtDeob2a8BL z7$%M``}RTeng}<}8U9J9dTH7neE*2kCdFPKmn@5|!Z(V|%-0XNi>($q&4-b(Q?n;; zRi7QE-nv%Du_^}gktb9cw*2`AwfuEBUVWd zrAH6M!pv!|hS^o#cQ3CbyyGt*`O}0C>>xWC&yPb|@|0;uBW^$m3CPCT`ac{U2S|)R zE2Jc0Bs&*NS)4m7qcHivzK+=kV=hgT$OAtJ*L_jTE`l2pQ3aq{o%Z$EzPRgSdw=~_ zjtSdSOPOpT9EG`7!XVxDzQM~3Ab!mKM*3<{j`2)sfnBrH)DT52|9cR3ejAdx5b1x< z4#fxNrIlE=?A1l?6~WjpoN*sZLi9nj*$fI|x0-)jw)+R)BcyEMVqM*3zHzJ=)O@nU z8|&j%+^vGF`0LnKGaW$#vb~^MOpEIMRzsuE1!%%ldOi-P8Z}Kz2)N7uvccWsC8@I< z$I))9KoF76k8f-ejo7MZfg3u+j@O?c@U#YY%ka}^R?4x&52}svnHp(NLKSk8ik2Q{ z+a`A9Q0%#1#&|J*rEka0HzIb;`z@Tbd32ee-2$DIy{V}Oy*c6@OEjFujtsXQsLBSIFzq{d+{RS1WfU*d9D?Z)&$; zeG^**e8?*~gcL7j)mRCUy|+B+PW8WkQ)#vxg29&n$v7#%ZZH~kpv94VoZ z#)fEQaW?`k;CP||osMYNjIW<;?fbA@>@&PxLZEDVAsn14LrJ+ew9f6%w-_Q)S5zYS zOS5|?JIUo8HaXRP`S#d5V`wAM*K&3v#Tih6af3 zk?VhM38?zvjzpYDQV;>6BPpZ6<#DGUV*c0MM+qmtp@6-7GF6x`Er;qjLvKd2D+6Rl zJ@rX3R(BO6Sk_2bw@e3hhZ)W~ME&F6W3ewjD;J)$r}hmQyQIg;zsyrKfVFoLz)Y|? z?cL~h9{dU}2;i29)}1CsF7HdQLnr;9hb(Th~DT?!c?_1L1g>eE)~u*MY;E zjO$~In;d%rH*c@AF3|@&y{<8a2e6}LrUYPB9q6{PQ74ZQKceg>CX`nU#HS%DcUf=| zvjM(V0>Gai#-(X=_Q05i<*T4{YEzXQf~IM;haCfr?e6C=i|B-1i~}7(npX<@>C^KN zM#>E5XJK_}5xVmVQJ!qk_f*67u;yZvr{*>an}D&0fX~;w`iiIxvIgeJbG^$>8Oi znO~=s%nd5D9@npYs`Y2>?ET9b07{$C2emC|gJEhF5qQ>jN4?R7TPa|2NZyVL*Pey+ zW~jKdke8Ll*x00A?WnA~Ft-eFytqzLs+emupPOuo7j|nu_X!`w5b4wChPD6{C#3M9 zRO-zj<7_(r6Iq)!vjojhpKS1X*yRy;;vT;=%*YS#*zL2I2_f+YnIWlAYFx2pwiA%@ z(6?a9hJ$@JHQngt;Ydyj6 z1&FUE*-hARL4;0=JG*Y-=4{*`bYRi%Y;9xI-~_Vt4@U1EA9YN~u@Q1(T&74~l>U&9 zRxpF(GTr~iSjT4I+6w-QH@A$z_WgfJKFzX7gq{G4qz_})MCc9J@GINhf958*d5Fqa31S%aiR^eT;KbRkETOLB5gFTbm?@g>w?~_BOXL5^ zQrz%L>y#MV_Cz*Fpg4ePXE2Zh*dkra$h1;iB>HvLhDCkh?M*fHOIm%Zvb0?*Gb!7Z zW8XP{!a3#fKb%FSsGzfqA2Od-GjYV2U{zgZY_C#Bmmsxw$3-2&OJl2L5i?ZF2pB*t z%4-#)P-ORXc5^UXXR})H(g#uJPs%e&eAukEhd3|@Jv*vTCy(FNeG{S2TH$ZJ>PiXYAE;c>f1rgD8c~yfJlc6z}+zVaRf9m%i~`C$Qcw>$1m9_^e%zfX9$~H%Ez2 zn{JxPvF9P#Api2kSg`#!pkS`MyYdyZ%k3mNDB6lH)QGe~6~&ay_jX9O=`ki?TIG)$ zFToJM3$j%R8Z)(*ZsZ5C-N+J@lckECez~wL27N$r^rCY{u4*dfghm7c#g!6paK1Sj zJJCK8^K|18do}EPO!1D7R~kd^yH=I&Dxcixd(ERKCZzZLt57ryniZ)@^GIEIV*H0KAWPa4ZPU@H;fU1}PZW7ix>a9M2_ zk~QX(j_n_S5~t4n+?fxdm)y}7Oo$3o)owRpK;rt)&AeJlGRFt3K~H^Om_L@?UnE3o zo3~(=)}kjUd$;-(r)%FDW6y@}PqW(ILKk;hK^GKIX)~QijRW}P zqzRV;Dp$uXZQ+L|9i)h!pF5=^aFA-)psYqtA@U!saeN?$b&9-BCVJP!Jz*Gc<&+wOSLXb2+hC<6WI1xQqPvfWqt++m<=WA=!V|a<^cbxjC%<; z)P}O!!l^u%7MZYbyyK3VZmi_e)+3RpiO2^Ndlp)*nRvlOBUf6v-MZL`RM|*k8Itn~ zUY&1XNQ7(KE?(8HMpqFLQZ|Y} zf45?dH5z_=#ZZ)vU<6W|z35K=3$a^^apU6?Vw#$*1&Es1CBz7%E~!yp|KJh7MDpWA zY2}AeZWX{d>e$VWV(iL7n4z2U_I^TZX9RNB7CU=z+>Wq6X{({|;}jvXDTonoKOiMZ zy4pw#gfHu=`sRXf428cNoQGALYJ1OYFdrJTQ1Ik&msFmIQ7UIIcpuOrI!QT_J9*01_3!^*^sT}QAljgJH;~0d&Ic@ihWc`h zoYXX5PdCkDK>G-8dfeDW2r{B0&N$=|AG)>1EVU!wZ!Ikb=RRHu4|ZNUJlbgCPIO|B z#RxajyuTy*3PZa;8ZT|xdll2bHcR6fRDLC+`g$4}LYE|4zM8rnEyFd0V8IjB&=dw6 z)Jj{?rqY~;Z7_PtCtGTvwYr8l=g_d^BOtU=AIc}IlZ=lwY=^$l_H$q>r~DJ@262dc zOFzm;91b25%{vm<*8mF^+)Rx3|-E$ z78O5?ItxDB6ql{P^5%I5zY09>NKE(@GfZiT-YOT6wYcS73KV&6^$^-tYy%g#z4+cyT_nT5l? z_H8O6=%iBHUr{KvtZCx~evcr8=xjV#F-^9-3{$p#Ju~4n(dTYNc2Bdjv%WkU&_%|8 zjtCzDi@gJ0czn?#V?~cpwY({$y6455(DjP@HV||IMquclP`T$$^y4Go#H< z9$?g|frGjEaej!mBLS|e@pp>UGlQLg$@6UCiEh}f>25m6_o;i zt>TswD~gA)V2~L?)?c-2@ZY?NCdmrnuQOWhs6-^&`(|8ZMo)}4xXr!}n{QC91ssVB z!fSF3X>ZFT)SH##vN6;_sDR?gC7ZSlhQdq(6_GxMg6HW2Y@?*n5nq(KSgjHJ4id;q z&#KU?qH{k!5(~f6sj$jZhEh%LJmokdAwVpeKYs&-^m=w#-(uI}k(P$s1i!9Y1Y{(l z=v6f@$#_;rp!d?+T&w}RQ&!@(I?m+O!&TT3J)?Je#PKT)DxVFA!1dJJIdAtjpG6&0 zI?Rd9%dn}Ob#LkbI2zBg(?o@4Pu#Z|A!o>}!tWBsg=|HmFxFzz^xyI+F@*436NYPwM0wYVR3$7%M>h70rjW=L7>wU_DL!NdZBt|&A<}T|GSDb<5@hn=(Br`Ra$kvo zuIULGtadtiYdVX(j5#8%Cv-3+v2-WenBIPSzq%%PgI-C9?XI}0ii^1XopK? zj6opjA_HoLSV!XH%V1>c1(w6kOXkbeFge4@r3q$@m0(bw!5Wg(N}_pmH0UVg+;8OfF`sA^_iWxP*x+@w^d{@`50M-2n164M*oTkervlZZ?M^i3s)o2hR7&v1@mp@RdeIB$jv zBOjDHo+9v&C?@mp)0h8cLgjDhzyXn8LN#Jb;`keWbHmapgw!4ZX@YSjUrk-CU#0~} zY7-gD9m#}Ay?dtg9?T^J(w&b5aiZu}ZYu+GI>bwxFYkknP>t=i1c z5w_j&&dItlF%^rbk7?4{N&Cet3%Q+BhP$kVnr20m<*|)fn=SKjatN5fgM5|G_b1_* znJtrg$$Oc9w<(@+%kZryz>K5DrHoer6>ZhVvOvEMk!QAOV!eieWSEy=Y`Y!A`omoG z+D5#sM{elHO+d<+F%-O%1E8Wx-8Gb0tLXs(VK7F-qN?}eI~XlOnW`P+iF7ZTU_;ZHj4hy+t^Ni_#p~s`nRAcX#8yk5<4=ay9fqH z+~arK*PfBy&Sfl3F&4S+i9>h|KkfQ3GnR0ax+56e4#30Ab~~l5k<&u-Yyo{=XL)@@ zW6x166VK<;A)Wcx9O|rC519u$y92(zat#kS zE5QQvAs%brAy$z_?U(Ld>o1|54C#-r2MjptAibXT-!B%mCGFkbQ1|}T9zE$$g8=fU ztcX-uE97kCoSet>vI*^d3-vY>Y^LoM@82M)2nR>1Yzew(vgD=rr4%ZbSjC~xkH3ETf| z8c0ge@zlps(77s>%bxv&{0scLjL5CGH2k4tOj}+0t3tOnNl++7wg7N#d7QT;k0UQ{ zKL292N2ksb1gi{3DqB-jAy@tV`!&spo3kWlZIQmR^mJoNoD(RABn}44BoK$aF4|FIgf(Drp|V`W zbML`~KB-BD4Vtp8HU-$$osoMp`v#E-=$uG#;MTu`p9rNbbX*Spu}j97@PJ?T z_EX{XP6el*EKkXK!vGLiL2Qs6;! zT#b{-?~p;yRT>8)ZlRG0ufO6UhT)l-M4^JE`n{Jxo9o^lt32YBo_DCjjhWDVuDROc z4~J&C$Q~t$wveG}3g5M+X3l6SbD;h$NNzh_Qi!5uMb1JARN}QS>vinr(wiMZ1r=~b z^G$!MmN#lCV?N6mACfs)0i|5Qj*T}7h>crW zCGxU0CyJU>&H!@SL>jyxF1udb%srQQhL+61BLG+Rd`q6f>}+{0_rOyE0AIqhwCx_* z5JOL;+cm&+VHmX-TLA?{?G(tTFdvq%)y_JC%W-fG{E zDxN;BK;TAzz!-I%kfK;il2Wdr>!w7KK!%S1V4066oB9ajebuRj*Z?xc$JPA-uAm4; zgeC10^kYGNQ4qut)b41yaoPSy`6QB)_4nY-9IPLiL?EeB73&FA=92Tt0s2|!@7aNd zD(P;=s}U3n??ZlTf(3=0UFU&0N%Em|;c8?g_06qiqN{SI4|!q9cJ%km?+7DM^sXn7Y#o?b0_HmBO zluQt24vEomXQuSqm2;gs7kHw%X%R8-%uy60QZc0a5cO-NO3nNI83b)v!}&tQ~Mf&2aCSk^=r z@eCG<4|)D5nZG-FDHT_kWCaC#4t_CRYz5MDm={q%R0ll1d8l@f8EGNkIK^+Otx;Y{ zd*h%eBD_@I<7PVc(h3ACEveZg@flB-@n9IQmmx3KLHX zCU)u8ThJ)p_ui?`g4uiQ9U$iWT28DWFVSffsRGbn;`M@zxk*8ufIj{;FXl^Zl?C&p ze4;4t&{c6DOuVxj?RlMQ1zYi(&FvbbBJJeL1`c_pS3CfAo7SU{`Mm5FKV{-E&Db4Z%tWbp${iJx93XiQmTf@M;|624JEc5Lx@{3lpfFpyWwgDEc7Rnj-UJZ-v4_7X zLL0WV)~Y|2`hx3~C1hZhtREw?61Goq%1D$Th{Rm~p z6)MAL1mk@SG}*|~S?bi(8=uW{$K2`UzE%-tRzc~r%e<5Bf0eX)Ze%#1B6K(^7y6mhO!u+csW$u11f1V0bo5e&D-@&n zwihHCIv8uSx;!oDU#JNf19q~^U%YU*%^(Q_gEX%O;n1&*fF*92Iu=OB8x%)e9mru> zcLfU$ba~C;!95jpMQ~8N-Su+g5DxvcKD`_wv~3%7pM%6DKp&%kSS{SE-5<-CHP0i) zv{^gW$4k-?ys<~8IpsSG+4WBlJ-bK1W;qvgCB{S#$_=fOa_5#2CEYfd+qY|o`z{Ly zbw}RBQ6?gke1bJ%^@cvl<)UYz=#|f+3XMUKbH{IO3GsG$UUCdoZ8imv3WWZcL#>TR z=C9y67>dHze#xUnf1yLhk0cpw3!ONRUp#ti{ZslLB~hS>GzZmJoHF!CC_s2)@XYxj z@(ovOtg+->c$cDq)vpt7xp*BOP0IW)0wn1Co|>}wl1?a%?j<ZhPNmevpDHQ~vp1;zKCY>jWEtaLOVO~xXV|X(3k-AP2!h;zFPj}Nkk)VvgcS8Zp zr2X|a5T^OA(j$W3!63boio;q{R8Ez?&V%FhZDX4nP|BPLWV`rFh%<)#EX1P&1ZSkL zx;R%{Sq^bfe0db1*qP~wNcR4L*mb!t||401AMc#OzYBLI$FC(^dNRofTQ-qmHo`9;Snu+X^1>w z)J}01WiCNm8O52)) zCkMDBRagQ)87BCM^hi}l9e#}fV%aP>uX67Eg7A@@7!sXpNm#pe*fmeK#~-Me`1tO?t|pr!+Uy(z9*O&3Ro8>rV*C&68qo&pAA#*~FA{6QlF8*hYXg?d1G? zuZlr^ai`1!G_-K|#I@mi>~@AX2liw!uL79Ppg3wR(dL$T>8U(yXjyTpGDGx#4!$Rc z$jp6MHBP_^J&B^r4d41J#GfS(UgE>!}}ilN7218UyD48%q+#d z;`u`%%$oQLX%THRhO7xEzeBILuj^{xF58C$n3Qi0z}X=*$Tv%nMTv%ZmQNMBWR`6b?jjtI4DbmvV(A##dHe4%2#@fStXX{N1*E{JWoBhRzunA0O|v zZFbuEMWuiOg~AEWeu+fnYmv*UBAx@W*L#!lWZ&mwH!l+;cUSzBzpYa3Q$KqcX=$HK zzhi61J}}>5fhT?SWqrNqlU*=y5xAECx$+C~-*ifXRG)CG?ko`$tWCi8>}+~&QtcuY z$})AXqm**_?3C?kuAb{Dk>1nUpzn#mbCGlynR%8_efZbNP4~ZOK9qPTTD&sz#%31b z>JsnRO|vTE3chwueXQ2Tjd0Ib;iObT?|({E*2Xn?q4+@^y&U?5uHIJ8k)djwk)>Bm ztq-`*;bl)*zH025DJ=- ze{jazyNIwimC*NWlY>Al0eUiZ2iTzLIC9yRqWY_sT#aFUVET~xTZzdXvOE)Q}}n3 z;YTPXwkfd3w)AIc<^6qD?$c~L;3KL6(-|t!&KFn`z0bnU6vfQNTm(A5X|ro(l-ENh zBU$5)c5E9m7@>T)bubD}Jm529OA{dZH;%o)y@J@xn_Gg!Ez0Bh#Rn!V9pfS^OnC)9 zpEBCu79zx1Fyq2S1nW&FcU`cZT?AKjdzS0e=pwH(7?Q^zr*<{6J{w%0C0e}V^I%0i z3R^#PNeMb>@4tc{O zdbFBn{6#lD_$TLeK4&P`^J;yePKoabkh3+t@6rp;BMyE>^^a|J2yu0UYG4Kk*Mo#B zrCL>HFq)caZ7)W{Iw;zo6SraeR~HVrt!Aj@;CP2262^hCDtoK3xrr+IYE6;Yh^p9KYhgn3bt{*|mSyzS}~sO_@XTTW-PGgUN>m*NU>dHnrpsiT@d z+b-w8xTSpfYN)i-PmoO??H~YOz2=wb&XEk0gT!N~2BQch6?n=+Og$s?U4a>DK0?Sk z+d^(8;_1y586RFocg&GBLN#3iR6qdVN4qOTo<&1=c)jcB1cS@~|B}05Qh1&HtT#-*u|Y&Z1=|Ur?tBHF;ySS$EbI7fT!wt^NX% zbG%hMbYQiRaBM$_MBZjvzmy`Nm%54~_Yz8}jb-nk2%G}ebaX6byW==;+}P_vs*`Qp z@m~nf5NX-J;6Whbxq`JX_0vv+lbADa)OH$;LW;j`1^&wznF!2RP<)mhxs&5!!1@vS zy=xqrW@qMZ;DvKKSQa>ZH9{ofT_%tWt?d6VmVYlA2Ja!kWCb?2iGWLAt zi9tey!Ft-DeU*v?CuN`z7-kGR+R-A$4PynnMyhx^i}+RxE%<=7*gJoGT$uq!f0mOs z6=%E5ia+-kq88rb^|k6>6=x#IY_v3it;lS=wogX5{sUw-{1y9MMw2Jfuy<{AnLHDf zt+4RfGrax5#D!aMpvK;rqd;i^Q{w9qn=%n|-C#gH<0noI_Vfv5^ZpjukmTL|BZp_* zYqlSY!B-DvadQAYPA>6~eaI91=(jCBNsd7Dzna>6yJeU=p2RG}nWl;FI)umIPgqbZ z;3G}fySuazH9^HgGVL-mAQm&bK?d}D?w)^4GkGq4_5b19}&&_1U_D52+^fL{zsJK`n zUJ;s~0)e~Ks=^~a|A#yQu>0--5fn#SE_Dsr1`BAb>ftLZeLdrmF$2qoQ4Ey754!Gm zN#eW)%L~Ki0*aWROjg?QRS;QI46@r>*c#|KMe@2qZ~*DOxbC0{ZN=Qgc5Mc%?t`NM zufIu1N`T+WI7^+_z_?O_jw`$^J|*kGc3}4+U{eb>c*lyy!`i8=BiZOVw^CtxHC>3DMrurRzeM-rD47N>%gWoP%7GFL~rY{L}bIB2m~oKI$;&4up1NTUCqONfUxH((mDU6HjG@) zL(x=B6CcXw|8=k_Ca$2*guqF6PrcVEOX^-+ep&C3?tYiWq;)(U9)Q~!7 zv7E^%6r6yW9vbUEJibuS7^I^@Zq>$EFT;-Kt-5>lMjT*-{)PE4U!f0>|KWID*c)c;>% zTj7kdc=&k+2=~c{kACxjBJ-l-+VLF*+hpQLEz`KF5-TcC4nrjWTo~U{Vv+f>M5MdU zp^CK`tKc#0pds;nKVEEAX*`~*)J@qMKZc)kyD0wCAv*y#9F&stk`05k#0=`mm_+GRUlb=H`em3+b4fMYd$LjqsRDJrprHuOo znQ!82Tz);#2ZlHxRdW6GhS-Ch1UDnw^o3A@d&OOw3hT4x(74yx!=h;?I%M&dkk-iO z8O`{uro;tccy!M?CG}Uq|7`4{1XBTpi`e;gAq_8ai0nj4W*22vWSscw?kE5UkNZYE znH4iGp0C!>mXP&xW@8AD<(L(@ZX6+qs~rF~lThFChr$yYZ%3M}Gl=#VK!l+~UcKtX z#+8*3=oyp~^}VTbC&}LJ&XDEJBoOvpx*e2Mw>GR%pF*CMgRRc>6N1r!Z0b?J zn*5;^95-e%3>&tkNogwBUJW-rSW@fRhecvjsd+#-bKD?=D!AK z?0ri-;)JMykzJV#mxP>9Zqb)ehhw$QdWa)6;pj(tb#(q*f{%nRiy$OnpR+aQ>nMIK zmw0(#G-JJ2XiZ0;EKp6)ueR>1)9yd*T*0CTq7G6C(fCx<-a#h$LK%)c%B`WPX9)|% z-mY@-HZW+hy37}q%16pD=pwk(YjK8zuywqw#Rj!x-ZNOm=v9TAcLwIMqI?J?@Q66QQZ@K zOkGcd78%^jqvqM+Qu4$=u7n_l179KCp_|#WaUw-RGt7W4GAWc9+yt@91@g(W>Z10Y z3f~ZBv*JY4kM4qPMvzrQoMyFo)xkiK- z@>$2hFEV|b>47}zr9*3vFjEn>oswN#MzZpsB42xm-N{?vFN%m#ml&;Jkt5|_Q1NX< z&tgfpCMe_K_I%DhPAIF0$%rHEIUwx~Pq(3b1d*|O!?s&~eWsM8uXAbL`Qk0yJ;@d{g=n(qDofaUTMYn9r zGY57U;SUwgDkuV4ZxpS%K7on+%m-*)Mo!P>?|>FBpPPY#{{Ea5_Db-115EA;WSe@= z($__?{Cpm!#IImvsN;{x1UPCpq)m23zglG9{lC_7#mKQ zx)yESs4E$v7n1}Tehy|jUuoLSu~U@V=i7@n(ls)^bb-%ss?7k2wk#st#xSB#9{J_? z+K*dgD?H;-;6!s`FP!SwNfP8}jX1seq2rlZbgb}`{bH5t&xl!LC{N@Un&h7qqZAk@ zfm%DaP~*tklfFpNTR#TFZ=b7n0wp<*LuCm?T~W%IZq4eJh=iTq!ndyU&H5U8jbT@- zxtzX$-sQ1ZDL zsGt@J7L<4lqNdRk>c6krDfU?YYPp+0+PDf9;UC&h#JC5zR6@p8JpQJsbyJePKw}w< zyX`n?v4OvYiVL5A#;uU1{QpTNmw7^$IZ*MN~6przKZAAkGmLPjFebd6S& zYo6p^0MRt{g(~093;ym)PfGNX=h`Ld6OSrtq}rgJaE4%*w&$pcK+ar3NW%`!u&i2; zrDxaiIpj$@E#A1>S7*zs-N^DAv-&E}aSKR}*f8{+9qaYa&~Qdg)$<;{;+*0T!m;g? zBV7gNn9j}Nf{3vsv#2~GEwRO=zjqD13RP|L(uMhk1qtn@{!nPh_CI&b=WJh97wmRY zz$=_@^}N4Ss7(Dcq9!z!YrE)CZi%5smzuT>QviyT{!48je?TCUzsVtpjOVYA1*zEJ z{{BSmlssVl-{5d1Z1SD{-$jO%A^oI%iAi4^FN&HB$Xt5!-Gh!_@c~VE^>red?X-Kj z!h%J|Aa#03{=C&)H3)6RtT^wbyFRhQ98Z(NY%fqKgL>P4bOIa54sd%QwWU|rnh@Lj z0YbYVA3swSoyzuRv75jC`Rk)oeE$JRp`98ms{ZkDUm81TY)Zs8cB!9iH5YMh63?O0 zBt@;{z-N6}-d+N6s5k^)hA~p8YJTjrm!qnKejpj@MuoQE1v?M1?DTa{pZIPgSV-qt z;ouk_m7q7z7Ac{iokyX|dR&1a&+O+PFna`b*{S;m%D@rxHMBQS@YVo)QO1Bnb(G+J z1Y4g*0HFx`64|9RY(5RYmKuhWRF1J^bebb3Cc$c_r+Nx}AEK;FCwmr|Gez9mU%%?& zq}+RVC9U1}Km|ghX#6qxA91p!GNRpZC;5q|C(Vf~$mQil=b--2v4U-OV)WHPn+807 z^6Rec`z9>1O?Ug{iGZkX2!Y$Zy)KNwA<6Q!>es!ms5A_bO*;LcR;mvoVuWe1F%N&>n`@{r%uHH_P zTh?XV)^x=mUvI{k5}xZ9d2{;UA=8JUhdys7IK9coXL-oQYG9Gdxrs+(5cBvdJc38p zfCd0n2K(5oqh^N8sXl8TYQoR%`tIeFI4bv~P;TMH@AbR68`OrQ8ss0$-wMA~7~zZi z@I+*W?Z`~_{#7iMuV1jpf>zhF2j00yZqU?D=5iTOEu{U>5KB(m5Kx6&-xeMr^C*-t(M{;=xrB^%P6Wv`{!DWv_{(k zw;AKNz&bdX22f3ot6H5A-p-h2NVKm0SA5$|jBrw(-J-P9{R`X@*_D*I0Z=MPLS+v} zuJm*@4Iw4f*S^1=6$U}0BJ_5~0-@V4v@s*!oV!Uko1|cKwLfzJlWAzf+)!>uWfCKV zRT3?zD}%ASp@OH5RdW7#mB~%7ZnV<-KIuU3mKY0qYxM&2 z_HJoL>fW7LvCUF_%z}2V<5lEW!^sd0AlV?JjQ>?tEtQ!(hDa?gFq%MfxMk*MMcL|B zZfQlg(H(Vm^^wWs`MKs20QeX8Q|r?&t+tyin>_dsVh6N;;;BBL^6GzU_i#YL zEkA7&GF0MZ?IFYwl*u%}#nmO-OyMRGo+kYx+C8^D6{~Ie_BPTQb(MyrhRFrM&O5=~ zSAHzisoy+WZ^>N*^sz!2Y~4=Y%iL_^jy}#D3w9?)5SvRHd5)1Ft=1j;1P}Re1742* z{n#<_IkY2+6J>GZrj<+opxwjAj!8>jR#A!VI*I3F+m z8+`T{T@qA{;SKDI!lHNnG$wAGb_UZNv{L8N1p>Tt%U+`UZh@|SE=O(>&*!no`TP?w z`ypT4+JglX*X^8vzPchwfVH4WPj56)N}8?le5sCCf@rg&+8{Vg_mp`$MYfY;=wLI<;wle5j1nrz%Qf7yKosBzy6-e+!ESb1mm(nEXBd<^ip zLjGqUStbZbelVb>^@a%M1|L^*L6k*U&lQeeGk5lxCobV5;{Q!*bVm+|y#?dqepn=% zTSZH*PBl2_-~)`cafvsZP4)BsUC9A`z!M^mkI*7DuC;0(hrX6yyMSL&@wI7yF@rT1 zSb(v)UE-Eh%#BW*f8hDf0uazbK}xDf=5%{EGAKaY6m7<0)nm=+WycNBcr<9eO8xrM z@quXmJNJISasCUxk)tnnV$U&WKg<&p}H^%9WyMJg~ z1Ytit-q=@cg0bAcOb;S2_RWil=+O$qeSATWE#o{JnO~9gjOJL=N(EG$?B$xtn^MT7 zXNDwxL&LghS+auk<7X2}PywjHJIZ?jT@b4MyTbubD?dK_LeYFlvK9?Vy$cpTLqlKd zDfz5jZ#Db|WuI}T%H2TBRYRpZLhz9a0|WQIY%SVpKM`;?{2=Wns=fa%#84po-G~*M zN^s`dgg0dM6k+ms`gHIEY8(G(*8FyAEjgXBQp_1^NGoOL4wJ2RJBwkUk!vtdxSq}* zPtmdzs0sRYlUUlP+23BN!pPS1o&ys_e-}***uN0c&uxsqEwhE8mjLQyZ3`xuEbZK@ zK#TaAy23t?YeQQ8ffuVzBT+Bv0u?e@vAVp^K661;D(aEmE}5T;nzwZF<#OrCdqX`( zNTm@XEbIzcDgJbsLsM0wmV8QM3iJ%E2e9tKCgj$WW~36$#Axt)d97AFd=lEo zMF7sz8Urz(c3?=|AuFj7s{J(obcFJlpvl1Ite{VT5&luJZHS)DD3!OHU z`Yc;Mof20QOxDd}{_ry|j6ge6&LK?kZ|%kgE)i#O96S8v#nKJ8qxw|zRdU4KikR57 z^G43E@21pKlR?_7yx=29%t&#%4lG)DO2hBJPz|Oi`R-CCqECI+S3>I7NLChXb2xsz zv>v3w1K~}4=a;LW;ovStDN#_|8P7q)Wug{m81|}QRI2aIq&k02Py3$4=f+ER!mLtc_qP0fOHEHOoELu(l+J|qjqf`<(gbAZ2NXdUy6&{el`R4}C_X^MsXZPFMyJsi zJ6&4^=d-es2-tegXjICTE*bl(0M5^bb9nv4PTV)zTo##m3JH`v`*TN?xwmt^&Yp&e zxl;oP-+HwD25GbL>}?+-ds+0O2-~?W$NqkAV*jcuRWU+$rciUuqnFB(ZY!~iSIL!T z2^<-Q2s;ZRC4RUn=L>JHzokfI3~Cb3rezKXBv9u!svrq-fC->J0iC9+{nbE@%UVEhW60R)%ZoR`f(!&&>snc9&&|=i84VG!mYE;q>@zwAJA}BSkg2=tRWrqF`WyKHfnE- zcWDPWNr|raBg#Ls=WY>f{S`9<9pVUO^H72=al&=@g*3NPVYRd9MaYuqoc+g=;AgbV zGeO$!~V@aheVx*1TH5xllFq;urN|0+(Az z+|l^hP$62(_Wja4UA9&z0pZ;nE5ky`HY4L*&)J?`+zgUceeI z4#k!eMqE_PM80uJn2V}6j};FgIGPQ8q9HMZOR`yKCsYaYp0UH9LJF?jUmM@h>Jie) z;*~Lm2-pK#A4CA}>^x3XeH|k&?VE%2lE@mpGQWSo3QeMQQ`Xxy|dz8V`#EnCY z&@|_E?Jy#+dIniK0?e78)Dq9z&=(=tyA{?~n9|er1ISgE6x|oZa4YYv2yOO>;^btS zN;q2!EpHS|UA7X8{BE<|_)R;t{ER!=A?cFB)NT79!t? z37~+xGj(gbr>-=@307>{QgKE*5f*wY*yiq!^ndiA$v@0guec9N@CD=oe4C_b8wM*s zy=5lb!Y6zWC%(2r#4IMah`5bBWk!&8dmEIFonEl?yjSvH+AO!rLNa~7*rR&%)VxCM zBICFZOK>!OMC5P)@Vo%)6jT>g02(8qbFVWw`6t@BWSSku$Q9INaY6a7iF23oDpy`0 z8p+c|`#%i>cisto0I(0L8AK-1<3}E)GgTcwj(_WC8zFfZG)p^y>^>W1zX(IgQLZDZ zz{}#KUhHhBM4>0GW`3d(#@lFG(S9*P?3ppNKU+Ja%7bhe4m@&Zy%GYcHwk}CB@&|k zdxl7AF5{cDeo%TE!#<0xVa`=XABe)4BTkJRT*m{QY@ul_alljn=v)N1(g=6o5Y077 zL##W65v=O2gQBAWYMlO^(*Yt849{O1(_y?F)YWf-c?}Rs*E=V%E}AO0nY+QNt3)F$ z>}9cRhIrw}f6^Dn>tvY4eIKjJ!iIFe5 z*SOvl0U_rmr(&Vd$Dkq|zn3&3umD!7LNZ05@Bn=r6i446yh?_ z%JlbdUHsZ(jRkGH*)AGDIm}en`L@oTH2adJC85vNO$4HBt_`@$VJ8^tj@-|%K z1PLoD&eka4&HqyB${By)of(7Az?o;;?u==*?YO?$JiPWedx)Ca($P1hOI|~^_aLWv zld*hY92WWy8Wffm!8x{Z^;S1HFEwtvNK@m&JNpDyWTLL+zk=M!GnvN0{6-$xT|&D! zX_}t=822VHSs-VlZ@xa-13S=7Prw^l_%wJyd+gn7(2MuwFdNJOpPR|7;c5SIoDS=9 zW0=(!BQ>VQMO-I4ho_>6{Y?LYIfXQso18>aYzdQ@fsqJeKwD3)D-&NY(wQP^y*+wU zrWqn2r2%g&7HPx6?U8*e6wig)!6{VpDs&b98SrQxm2`|T6ynP|SA=R(iTNlF=`nG< z`M5e4N8^Utdp5i0eUTU)pTttePBqFec^*+mzp#6GSd1qv}s{s#V%iBTu0U7CXhFAt12ciRO_%QaA$Uf&)$EDUkvp(qq~EbZ}n#`qoV_ zL0%_}Pb_@zsCv5u`xNRCk-xz+jb*SH3BxD2)I4=a4N^Q$pq^L9l2hr2*Rx-OY+C57 ziaC)mTUqKo1jT$Ak4eN%Ux5w&WW85N!|bCDhhR?t-T-__PkxD|a8dED!Bn?mG>0TW za9A}$$azq%{n>L*S6VY znpK8hN~QT<3<)%}YsNH2RNa2>Hd++oKM9w~7}w(TOW^AW(&FY4VAGQq4{@G@(?LY< z$CskQ%BPSA5}wsf%wUu1%rjN(_W>XKpfV4AAJ41R5?FheVYIW$&b#qK@9sKXAiIEj z4u;UCs!B24U1K$1do~$)!bRKLUt}OJ`LTY7bAa2gd2hODsw^<=tJ#P(Sk&_Azf{X&R})q z=;e&^6(SDrFL6AU7-&y+SG#vH+F+vHCCSqRe)_5C`rMMcK?chc7{>agX!xImBn=PV zVeiw+yF$S%Gq;$iK%?5&A}y{*pLM`qH&b)&Ws-g~Z9z)z7E0BV>>lK2hY*H((n6e8 z$6k41k3}HQSD*J2z@e#(f=EBpSrS;R`0fg#+>=p=-5z)M2os5ZB&W_1NtX2RwGkW{ zoy^B(iNNsuz1jNg496%oh^n_#JC;~>c-djRlyz?1@PEH!99CKdyiXlkAA zWdiA(r`u7~k56Y7^6T{XEYRUq^=ruben9nO*?>PyzWKC`r%99k%(|4XPDAsdWu{c# zJFO2TASu!TyC0?U@COJ^vrbkw%^30D7A&RTsCVo-!&{~4Mp=e5HQN6)l9n2S_;BXu z*Y@`R%1-hi5PHK2l z0UC3O0Rp~$E?OA_k@37$zyyHOsf`3B?U2wod%vk1k!>kqkWdzYs-#Xa;4t*a+<^FmX#U@}47@AJtoyh(Yj%o&369GR^%>H2XG=1ij^7ROVgWHput z;yQ_iATYv8C$tDsrDMZD5^cIV4vYO)cb~8Bl>N~>Pq&8)C~%=Pc=W3dLy|_Z&=~Jr zX@Oy(NGrnYy|1@>@#$DZwhQe3hXvMz*w?q$_H_D?+o)%;^1G8eUK{~$`*=SGe?l*v z6nk!eA<|N8`CSicX&hg`gFpV%NebIllR|(bu;p@SP0>C-9dsmSHvWnDv+ryYm#5(b z^zn{0eY?t=sW;ax)k#(mJu;)>X2`y~6+C6`b=UUmFy<_y7cgc5)LF`o<-1>B5R@## zu)Lc+KEW{3y@P)8jrvsjjr*r+)5@sf@Ts6D^)B;fGEs%Yp0t`mbq?ad%v|Bj*4;*? zYT}$4jp|@&TCvT}I~E&uZ;+gHnCFn-0n1s=2sJxwPe=*ZQdx zb?VUJYbEMl&@`IGM@=SX#KKfV42vaejh51i+|+)$u(%eDT-d^5;`d?z&2P)_br}Z` z?x}E7nQpTDnrQMqjISruOF8Vp1e&IXMeeCNMl-!*Pl1UQbL};@tm#34Z!2#uY|Mk! z)9I`rn<2Q5$fF$C{8Dn02S#1Uys5_s90V!MNH=naJO8`z^JO__HT$A|Quv3-pWq7_ z;tGkx^rb7?-by~@9=#D%X3~OFh89|w>H!Ohx{r$F-{tkK_AMW!_w#r8KlB*?f~@Qc z+Sz^+`iNdI2r&zJNk11fZ0@9{YX4JobriI%CY9ILvVUw0rQdhLbpoa)>4{YoGmiifIlW zGG78XFhInnv$XR?O(cD<@}Vn&f)f$pHNA#Top#fG%ZoCc}T{dlaF`e zlY@^?`0ud;2gNWMKG8Um`>9v^kh|$D+gzz#9IVjpe20Q+UPqOUV^#!2(TVz!<}#kW zx1np?UwkLu=L)HK&umC#o3g2PNcvavz~;OMnu0)GI1h#fu{Nxov!9bV(nM`cr5IvIe5$ib>(RF$p! zqY94S5g&T;L6Q+9M*T$juM zINB`wF(iYIiJ2`u{Q>?ZqjC`WVg=MN%Hyi_L2ebysnjxW@I04|K`)b9-XqHZRx1Q- zqh}Hwn;vpN#WX^D%M!C=EzMFMny@Fa(QaA=B9VgKqk1@@_eAyk!Zh zw!+4Sni#U$nFe<{Z4&xF6CV(u7Sd=&iYzrt4rA8)Q|UPqjJRg&;{UusQgZfm0j?bC zmJpzzFqi^^aUYeNmfQje9cBh4UEd?NIDaDu@8_)beS$(L|EGWu=f3^3J&7GgIp}^g zq{haqnjiP5^qm;cDzN<-7HWrc9=9>qpb>c>*nqE$7L|49j~jQe)g{Q)^;5MaM9u@! zR{F$_w`j&^p5lDf6T`fA9%w`F;bN;7;rjL--=e0Pc7kGzsn-v$4-~7!AuB=}J-L2- zZsVoy0Mt&ItFuay3?lDW8`Z4EZA8N#LBKyMj(Utg;g!~vhIN_jgF9v8wtsOWPgx=P zPHBhRRJ91?F8Y%ThHB7xNm>r?-&a|5**fW9MDBZKSa8uei`a=vP3jgrwWMLhC%aZ7 z=Q9%_5|{EpuG=9oawDjo!GAf&x|Q>y1W`Jf8hh>n|6=bpuj@8_;#Cl04PIfrgR0HM zjY7it6tk)g-FoN=RTj4Fu~@AMpp?jMs_9dvpPc&5v{IJ=p#+opAk=GDUV zbA#(G!LxBM0qjOeJY%qKE2UZnECHh|)3y;P9jqFz+OfQ@t9pw)z^EI`+rKAqMuE+w zj9=5;rDw`SqeS`&!P_A4BhJ9dDbdsq2;9uStvFuPaAaDj>c?Ti3LZ1I+;{FkUhd^z zw1CFOp+%qq(-I(In1E!fyIIPvnYI*Uk`K61k)xsW3+oZae1XjIbvpFgCP!W@+chR# zz)8zS4<%oG=Gak5z0%2eOTJIJ%R?L*sfM*W+q7%A*G%J8JkwACk-J^LV9yaPDGs3L z&6uZT!lQIrL+6M_{&4($xDMomN5=t>DyHsdRBZop1@UZ`GgMg25Cvti+)E4C$k>h= z@okwOBhD9+r<5h}b)@_j>ygGzPg!n$ZZ))WE9$#^-fZlv1dXFzg4VU)swCL1flb=W z^^W(Nlj=8F4am%P_lkAe62ENrA?iP|zYS6^Ij5_P-^l#V2jXA1t%JLGjuQ^SbMP)2 z5Mej3L0AF;8enK<27A1m)t;}?BwBKB(EER(YyTpOu#*a$g2~oQc~Gr_I}Mb4`5y0? zU>~r)p9-q3I%!~|ZEd{AM3NFQ#$@}?x|SfYVA-XLCeA-Xv@F}b!c9kr?GlXroe)m_ z;aGD_vc}$s(|3qv{fOD8fqdmf1B-BR_?(Ck!ggo-$e%NtrkHY0ec)V8JXIK}_y%-$ z+mKZpggrt_2IWHFk;e?k$c;c=iL{~<=fc%DZ)9iJWO9OD z+Ab6I0YOEcJ%i6GQT>ZDl0*rb>I+D}*H$bvgwnlV$2W+Hu@MaQDBF7wg4mm_1Hu`N z_rbWBiv3?#4!h%`Lg}pOet4dMlOU24=uysg8g}}V)0zc?Jci45}d97Vykn5u_ zJ}>}b#hJL(>bMBg22U0g!)Vl<`WQ78MUD`dG^{nS)+4H6b56u6e9WwR8reT}Rq@}} zik?bVj(%3zP5&b0A9aS=bo%JH@{t-O=HUcSbbG4eo$1)ktbjG}LOZK~@ZT5tgnD!q zzC+n6DNnJnLBK&1SzbG}LOB=N7$IyeyLD=Ob2Ss^^^YS9Bq3DIHz<5sGe|6ji5g8i zJif^6Cb;H!P@@MZX4K}M4Py6fe9?fWl6vN}NU(FVU|IFd^7|7^!GIJf(G4>fyo*F` zKmyr~E4D<9z#zns-WK>kzVHiEOevwc*D-+TK35330`PVQN79vf-kpVo!17OR$RlUa zoZ~BqI146KjnqgAa~MWx#RwYj6dwBLaI~q_nyoN{6;6*cG+=Rx@oE#g zR^!8Y$8AFdaLwh50E%)D_=bVT^u8Nj#YKhN&>_I-s-Xr%#z{8VVXeOh3!VDLW1Fo8l>4RN9trBwEhO*p1}3@9Qt~wv~X* zzkix+F+J*5iQzO&NhztK1St+DhXjt~E@6ARwQbs9FX+vJc8uZ?(GATFwf8D1uuG1$ zK>?Nz$H;J=-Odw?`=!oA3ujg4$5ZfVg?Q{g#ne9h|Lw!_4`A6B2Vt4#bwYtd;qjiM z%D(LEiJxL_jEc+8kzNoq!@>>bjWk~=82Ekx$i5+%*7-Hnz7;qzahY+pLnaiyC}48o zfVa}?a%zQMp+a|$ryjEY+AsKlyQ7sIXw5gL>oov7@d2x|=2t3hwPp?@#m|AHU;*tJ z7M&d8&?bwbBKH`%mJ(|Qi1RU&dmd>-`7-kp(JMU#SE3BwuQ2s^a$9aP&0ASH>=N@a z<;H9jp7BrfW5^1W44qS_*SSW^ci9t_$P|$SgjwajgLMA!tnyqMVepqrjBl&OvIg(M zPyjiWN2EoOhfPc8Y}tS)=+eZoAZIeJeWlU;n+1!WaP1he;Z)llhsBE?C&YDUVMa#VkBE-@!)vSNDM!F_ML8eHdb!+y0nSfI zLWGsgz7UqBW^*(bz8CyWG{hf7?fP*t-xM^Olmb1QRfBmqc%T)iGY2FQgC%+Se1UUZFK$~_V6dtkHzcV=2-EfUO)|SIX_lL? z?Iu$zSZ;TgMViwTc;Wp#_^bR^y!K2-n}Q09*DC+hsDawy{Th|!<`GxljndEwj3@i< zYKH0)2@O`c1d5(`lET&5TjUiF(5l2f(h^3Dx_rHpqNQ%r7|N+CW!eWoYOL7x@r`0# zbnPQsbRzVrJ$jlO0mdOA^6rBjP#3g0HAd^*t&n3!@L>0Q$8l66^;JEv_AwnTsMnGP zI{k=ezB@C4)oiuQqAxt8jx2exnTKVw@Q7iazz~Vr0t?s-u3WH5(7lUUO9BshNk?0{ zGk|cWCk1HyM_mn5%6sx~K-4cACXOloi!p1L5wi>L=qdq1*E6D{%diLIb5_pujNT@_ zd%P8=sFZQB2>?@>O~xj};mwQeQ|SuRid4MO95UEixUp3Qf-&?*J?df*JD1!)iR4Ev zN-P#gX#AK9MHzZ~p%{COk9hSyTfoN>%j9lN8$}bf zX>I{>sK}v%a#3^j->&=;@rzJ?P6k6*XlB5lwQDwg!ebJd!VxGdSda@boEm6G$ksGQ zTFG2^*W;L;s{G&-BVZ6RnPZl|loRSBAsPP80ndR}+({*m$6s$C5S{J6vMYVYMn z&7z=X5#kT6w|%zXPC!%)HWYXKa8!4PTE25V;kLRfuyV>vZP>?4n6!_Us|;Z;A+C}T!{`(sAwIMhH|gf> zH9Mi>`AEDdt^OvbtgAH}*Bb%GV#n-*OE9O!nGJf2n%n6H!sV9>PT$l}kx$1)sb?Yo zMwv*VeN=fN_YSJ%1AQ)#Wfw zf?wOD1w0M>4=!e)UvXBY|A`nARZYp5HGvs#GdfrFgG~S9+#w^f*(C`wn|ZD^2l8K} zGp(ke(kNeXBe3U#7>_T}DcPm3_$4rkq6sihsX*~pNegxsP&pB0pq$<=6tIp02?b2; zDw>_%2H?H~`yGh0ZA@>v`cf@7oHF6F=90Z%PsXBfu92U|#c4XbR6!?z$uL`0fiw5t zaLhQkRj50ssLY=9;GqrjTM{2hQKbbf&NCJD5#;34J^o>^jCD76f_mjcxv&|f{S0y4 zaivWDRd?HY-?)+KW(>6ObnokaEFcP606RG$XyE!CC)DPG9&_;%nmamk9W|?gi7qLj zea!1k_x*^rhINcH^&suzU~P;~L(^`Vf`t+2EWJN`?LNeudAak6f-koA_`UO7*l9); z1HcE@Mp6!Y@^sGbt~a_@i5mn9240t3WYbV(C_gAIP1HLtmf3KWak@>Pn0?~uOAprNf)rJ#L!*4m zW5gT|*l%zg+@_Z6b|jfdd$6}r?#@x%|8B!Rob>;{`ssU7gDcaO*CY9X#E9h_F#WlTds|Vl+b>isZ_s}3k zG^Zjq1;z^cl=@PFziG3ViA8($M2IkeGFhIUKdgj%M@_)N2AE{!E`eE;io)_{Rjr;c zWe6R2(SJnTg-nb&6bY}_ojG!F^%8tZ6MUM-pPt*_0p4ToYSy0MmNpHLVCDu87e|A@ zq;%yTfmq96bG`k2eqJGv@_Oy{c;2aqCHw)N&9P!}a2i<>&q%Uz+7oEO zRTU-p=YM7blIQ*SLr`53t*aSe)WT{fji{Sc+1dHZ!j?>hsCDJ zdGvH#nAu5AT%c&j3y{=(b4%zDjI9DQfvtZrghpyD(WC^Zl1EvW`RGrkMap}nkoF8#w!CPjNas5B{tbs!=BFEMF;mmay+T%&D33u#$ST>c>?#%F3`%#&C zc3;JvsZwb5yMw;v8f0{gNMU_WFp9({<;ata`6WW4S#zXfF^}_B=3;Yl(9 zB`ss4k}5~Hs#zrsr}T}%ZH?nREu1>F>+SAHPsS0}!_;Kxw)kd?KoCszjl7r6CAH3m zJ>HkJJGFoOgoeFp@q#HpSxcefQrsbz_WM8Um{iJT5f2c2z6cV;VEy7T6&j1-mTR^8 z%|eMAow61G`ge1`6P^pJ*lJOi(T5_BXr!RveY1)OB*{7NxqH2=g1z8pOO>9TUWt%B zqND9JNenDb<3eOBUyviB<#aYw)Y74yPzDlyyme<8k5q}S~E3)FylM! zd6*aFvSpmjgc1}&k#3fJ(B7JznekZ9HPS$vBuz?2_dPe;wa@;ZlE>NGTrhtA+IQuV ztf-cqo0WNQnq9!20;HJrKO*GhU%bm)f*|9Wmf(R+W5&Z!5;r$$Xmgc#=v!ZOP% zI`7(?<(VMv-ETw@(Z~rp=E|F z`YJYP5c_g>I}(U(u;o|%M^Mc(MS&Yu(Wx_@>xT4KA{ts$N(al^QGQl2%a-=sy%0P= zn{pa$Z|g#F`L_i$kP-r2t{*pa8Isl_7;p;!w_!76LbNGd{RLS=!HCf4jPcK*Qw?l4!u4Hs2wl;aa;&}c+NW7 z;kr7#Y`0*nIR~|2@8ioe8xnc!4NJ!ibS@8g@P0iHKGcw3kMJDxpW~BXBV^EO!{F7m zYryGgU#<8LKIw=jT*#U6mtsglZnq8(2S9A>^@Qqc8PB$++jbDUY z;SagRcjOQFUwRqk110$}Eq2r3`X6EynpvIC;1RaovIQv3#7`j}77yYV(maUVGeXq3 z9sPMR}pqz>cY${p^mCe!;ui*VdI@s!@ z7g3Mlld(|>_PW|(hng-szXTx**i%8~;$!XGf&kl~ZV&!TRaFqAuah~xF!qdorIhEQ zF=mWVl4_pN(J1(Vy0W8+GUe4Cygj#4eg=aMK3v}wcM!?qj#3;we7ZC2a(CGVhBUL0 z9od=Eq8$rqoJ8?il5Isfuc9Al{4I?LwT2E*oq9|^N@2R^i#7n^?20cHJCC!HpvOU&4<>xg{Bb? z&zi#xVueEY-{^^nrT7U)ByL^fdjgA;k6chewSI>NC$wY0SJ9*!7Ln}SR)5^vVqu#4 zPnmTo-A=RHI(kEeIv(&Lg*Wkl7ExT0XW|^sPRMj823PyAXt>LEz{s^?} z=@(?3H^74LJAh@_n}bPHdcp~_q=22VC;!)5T7Azp2yDcQJCxZkh3h`K%qm=ti6??a zql5mgllxkudB@mk0s1)c#oBtMwpSgNYTS`Qrw`SvU%`+ny?b{?CE78J;lijc$c;N5 zGal7VyMyFrl_CqMnX6ups-ht230A$aY~fMTa;{L;D?VDiia^1f*x6ZMls$lq{2Aj` zPZ~$j_SV$RBX>V6YSmKWUADkb6ftx94-ej*@d@>8 z2^EvDfl2yuk$C024l8oFlcqYI9r8P#+^<|x5gDxBl|3;F%r6pQD>Evme8 z3WksXUZij>`TZ6+jRueb`%i6{fAy(mFV%1)=mdxk!x0vNgB^jn0{MKPIQj!Abq=8Q z|ITs9uFMi>k)QIbTZ)|BO18VLS-@bPn39^&D6Bq$2KqKLGVxl{ZFc}yN=6#4p;Hyc zkQy?JH|5|bxAfSWY_S%jm?gczSDo2#{RtH;_Bac8?Dc%d5(jKIUQ5%b4(Rwyd|Z1? zV6dj5`a=m^q^iaU|NiA1l8KY#1laYtL23n$85JvS1%q;%6*Xw-I2otg_Je!AvFZnn z*EpCp{m>%BmXdQDNq5pr3DiD?(c!rZL&kV~dvTRB?<82QhDRK#^>SIpI26>fvp_hg zXep>gJBxoB31aFf#$*P_?HDefYZ@Vm#tLaX>^WmUu7BpD#GN-`UQrcj)PdL+`@`>E6af61*hfHg`k5}}x9Oss1bczy4iIV15=8J(sj!nMR>#?KC z>~2G*IT5l%aTaR4%vxgTrMG%WU`GI@V*kDW$PZb9PrRO2us32GB-G%2=FtC5=ge9g zN*lJj6_380HOW+bZS=%?vi388Nfx}}2q@V4k8$`DdP&$NxpP8nHKFBC1U+bEyjt~R z8XZl1MV&SYd=Pu9 z71iPwyV^`&WRa98s?x(oHPkyjSItNGV1&?wXDMz+!$KHm~2hMQZ{wj6%&}kHchyX36Tw|;!vygrV^AOZZm*BGl!Sm_%?9fgG|T;vBe z9IqUqoK<|`w5ZaWSOq&Q5zZEW_fPS|W6+6&_g+`V&pP4(QIHLw%p~NV^q?%!8cOkk zOg0Y33KUHO1#5NvTcI!2HT^TygWr%P;x>P#te@V!SYmu?8AK5+$Q?#6Ffm7Q@`S+V zBThO}yeM?|)Xg5j%p07NIsuG+f+9WSkulP8YP$-9+gK>ZeVNgm^reLi>L_n_Df})S z^BOrsQe_Ia9nz>-KHAWb7fLbHY_v3(8+4s6(!gA!wAqx9)(goq`IbJnOEd-MHDsmc zyA6kY{l$g#QGri?T0aqv>^|_xbnFdYiA+cVNzi|@9_8@c{jV(HcDRM$L3?~&zQXD}= zBbKgu@5y7Uk-Hj?;DF0y<&VGRi>4EcDrGeDL`2Z)z3UG26lVsN99k^7f0=x%u~7l)S=-N+OU}_&(m0 z9fR~gUWRT<$ZWNTHed-OQ9+;gfieF5TD#|d4Y zR#@r%+l%q|kt4|{VoC92P& zTb;KQP^q*^RtB@eZg=q1oQt*l09%$=9s$2V@-qBBRop8M9MvGl1O~ggLtC$VF&dH3 zvk9<&)svQeUw@GA2{@(R(pyoN?+X%(#F3pZiL5|hx?_Dq_}Lft%^%`@Nhm0^g6gbDfr$*bS@kI6A)LmL-qr%LcWdH-E;GO04s27ZI_&BGv zjmIt#0DlzELzJ(;vDaH2#7T#iij9*J|Mzzm5BM5u3W@!R3<+!*EV`c?5<`2hTcE2){M*!jKN z*0B}v)KRWB04*M?N#N(9;Q4kZTVPJ=4VyR=qginM%%hF^d^Nvkj zuOI*in1+#hQEYS94@#n_=9eyaGX4F^TZ6WAtk}h1;%q~L<{Mc^W}m+aQ&rgnzxZ9% z>|In^F=slsn3lQejx?mr&6-(xl*wtBTw1%qOs)t~goDDrBS93b`?Ur#NB9n6o@jok zi`lx77gV=8vHmj*u=mPQX_4_bed&aq<~P3EiQ03v$J;`!=1#q-`cebYRES8;wO87n zn|l!Fgf1&}hTv%z9+noaMsp9eIKsg{)XVgVqXy&lYY2B8w=6Yo9bb zC|)zqgoW`Ko@jgPcg7*u!&v^h5UXr@>r=+Z(gOb8>97MMlC)$uf3kMXZYgdkQR`ta z`x(71-H}7`u#8$Yvfw=@@m%ahxX-{7iEZo_U+8BN7zPeM?teG?gX-&!>tt%|6ThXi zrABTZ!S2g$5$G7S#fDqk6q^o7J3Iq@M(5?h`pT2rYV}#7T zO62eiC3S->nP58|*f|V0+gU-{{@}OonQC=Cc05ZomrSv(v4#8tmk0}frafv^k^5D_ z+T;M!HZW!D5U(609bM}|F@uF}w@HKZhG(Hdbx;-bl)EDDs}|q8yx)Hb*;OGu|L&I;@3N1@6e`C zE4vipmvDYWdt^iH=^lOBW@aB6wm}jo7x8JOv}OBsltu-r4cs*nQvd>`8>ES(%-O(w z@*f?ljDTy&*NyKA{W0MGGfg0hL*> zdtVKn_Z9#3zoVlDvTC(ZerjL@wXwUY9A=icUCHkVgu^I5{%2>0jdds(6$x~ak-6Av z%E$m1k6EXYqTcBO8rlSU?nxS0CE|GJ`HDFuA!P)!81&S7#7(DhK|T$I%-LYcWQdPrNzwx_Vn$G zAkdQ{cqO1TwvkM+^ zO5gXsTdS7H)6h(!TTa#@Tt81X7zy$a3Rl~9o*!C?_c2hUbiKAh?V%kS_XrBTx-zyS zx_ySJ2X50fC+O|X84_iigtBEvHa9!Gp%TGHGOTHu_XUQ4>2q~n} zWK-_h+y!WkNI8|nnwXf$ZZ9p4?~V)KI{zq?!p4GR+#Eh^$~wcJU8D_Nja8Rhbx=^7`N724@ZVi2Z+-hj%CLwA;cx%ejMF z3PFk!Jp}mpHlqBlzW13bE+@bxc{{VDh!K8PMx^ztz+UwR@+$Pz4VR>TP~j1|(WH%4*|lGO@e9^s1bvlE2?v7giU>62V8C<6 zx?#s*lTi|O(&Wh9Zxma(BfR7dLaKp5N98g+$4t0FRuEXvIly7^G0g&@w+8zm-JR$XlA2zUlo~QqVPvy&xV{@~d2d_Z<=<-{tEXM zN4Iniq)#qYVMyD0<99el$i{ca_vW+0u1}up5yyLuNH~OJE9K>PjRQtF8&EDLe|qwV zoByq*L*v4g*#f1!~F7|MYnDh2*i(4s+WkA)l=`7l!0W9@YlhfMgg)d+) za9@cW#O!29W6O(L3PwNg0cYA=g=6ov(uHw$M*Y5TyixM_YU(}YKoD~Q7QtQ z)Pw3WUz2;TL!ts@W1opF4D_xqqTc$ce)#hElCwTa`Mf8aL0aQ%v*t17MS~n`0PyDf zwqEE`GWvw+d(oY6-ha+r$qvL$ScpZ1YOLan)COXONC@O5xLV_fwMxC z3(zJ_lKySNFc!<<(tuaNw}J}?wmRQFj&S^T<`MTCdUVJh{}qY|RNKO{rbjlEjDBz- zQ&u&0z^u5kTM;wdmWXC`^o>tqn+qAlx8hY*Sg^WgyxQ38Y%U4`{0L&$(6^7i6HMC( zFdV}M;g-l(0%WGLYn~yjy$|oU|O`IBhErtKUK7%`* zVxt^3Gt59T-Jbl7x|8!V2PX*4z3y?eYz5zaYI&L&L9;5JNq`w}Onh8chN_r*F@< z#6B4}Z<`cPf;L$#^@@Vqiv);CJIGAv6Z~_|Qp}cSxquK>dQn~qhU~fDY#EmnN?$E# zcd2>)@0mPe`9;!Yy05F&Ixl?25Y!2DE65+6G&qx%(kHFvkb3cti zC4QXTGWv~M66maX;2aPNtu4l=Ymx+ZMC1zo!CL0^kHizm$NyY&V z82rNx5_J$N#y}yv@PWvV+WQbmFS= zon0?d4UmGXDdNJ)X@w&wowoSp1KN9h7PvYs4|t%}Bu;!jq0Uz}z7ICy6Jjg& ziz2#(T|FfJ%s%PxQV@xr-fTL83>0` z`pU`MK*b{n1LWbwQ0~AzGiKodEtT}7DUbR2lPF8J=0W!l1hgKI)zryn`@6V0sA6vye);gq-DFT6HSCM8UVlaDLoQTg_JnSy)nbJ%m7f-^Jo zW{o~j3PEh|ak}(^fPwoJUTs;*EW&Yh~5D1CH9Hp}3tXD@D^gCXxV>O8tW+%Sy z3@~?*#1{&x9U8SQWs}|rcOD*Qryl6n*iZQe*C8TFt0^yk!6JL?MGTL=;{?h+OOG{T zJl~~ZQVST|=AA(&@o(KK2w#hk0w?%z<8TX|_t?SgiZ%?CI4c?|d2xAi*Mr=ap<3)O zi$)5<0N|~yPbWXOsqWpya*yZ3v_?CbxkcNl&jl_a@9>1L{Zi=xSMMFUqdgPCEY zG|P|#bhY2oWiDXz(6OXVW#p=8FtNc{7lbJP73#%tyYs;x{E);=fAA{ZC??giUvGaT zN})!%=*3gp>m+FCl{s?R!gsq&J=Amo+&GuSa8|7{OZ1u07ZkYU?HJdDYPQ|SgSUgo zrA##@Cj#pbV2-3Z4|0lWXnb^wViC)8K8Zkyt|m2S%g)Vli$+jo!!9M0Cbr)H8ebmJ zJIppOO5HM2x}mr(_i}UPVsA?8yIe@ftVY3?XqKWL;i-OXA>d~rb%HN9rMCm?rH7}K z&eq$67tJ2oa&K;>G;zO_cuJIStvGejWgCbpedu{xdQJ%7p6g7$^241#h8fEsrJ<`y zf=fr>;eehTAX>U|nFR`zMtjtK2kb|5H<3S6>Rb{n0jzSQ=WUcNTosL)3PDJo3OxOC zLZDF*?r#niLU=ok1AGfI7)H*(e`&k}T&$Ctp>oJOdDh|&jscgCd{gfcSjW1qrAX{8 zBx+iZXrs&ySmJuoySGsRD#*nGaLo(U<->*o^2=(*(%*M8d8*lbWd}u!M0(^2*wQ37 z+6UgnOh3_8CTU&X&L$j9r(kKp*U z0O{8WN1}NPdAQ?^Pozh|mVJSBh@J#j^fSe-Fgb8(84C_p8(*NRv4Ssbia{K8uJ_Ew z3WMHkfGvVq-6bf+YS81Y;Kb#E>yb$IECNJ$a;1wJZ^*&IU|K}le+XBMwo+2@J|@zr z@x~Bo#>N`ArH&Ety3@6u^kH&e0cku*tI|^C$VYf=aof?7LZL1p0MNwa-8KHNX%b_G z_-oNYqt|B%{;PZfqfaPR2?_n0!IwBt`2?-raR%xd|Fu5epf<9f(!3!_KshO9V!ph# z#7R@#%1Zjv=CgH>Nf5#$+G)177|7x+Xv2fi22dvWX}VkCl5F5Mg)>e(Oa$kmz<-yN zRY2TbQzZiPs5DEv5~Yul_O#67O(a32008;|S6LuhtaNSoMH1J{N)t;sSf>gE(;3AeuOQa!l zlB165u&+4%osX9%lJcFEVO-I8B-@nkKwo(`z_@Y|;hZ^?wz_Z8V6>+Eat@(3S4zC_ z_Rf9dQ`M^uDw=DMLVx!*0+@Hr>uu81Z0ZCstNXf;Qni3b`dFtkSz|T`Z~NuOq5Q|A z`R>jHkZSXj`mw~S#S}8T&)pMMA1-#(LNui|Yw>8fAuNtMwj8hsVNpHQ0M}Fs!bJlk zo%%{0Vno;vGJ&#G#4@s48;#E{%4(}Gk4LFn{W5LV@#~N=eKRvS6kt8WN~%BsdKhzF zt-MEURxkbp71Ue4e=!Yh?JS+l)6w5TxeGuLY@f(%*MDLy8up1CZqYFXo47}Z*%jUX zKVzl|X$ipEg2ISRRa- zB)_^qy=~jChxM$!b zd{&~5CdrMaO0T@$04)+K;!L^zc5}}14M}bL+hoqFqcq{XMjGx`lJLc9}r9+^`)qUEud(G6Z&W7^W6Kn zf*B>cE_n0j%FqG2i5JDJd6LV#lf|rkQE^^4)Fc4i7Bwf~tmMgbqkFHE><8`Q>havU z|CzwQ>=z*6cOKyPvbBVy%@jAwiKP7-4uM0JXPMjF%7Hg`l2HSpTvGu;9-bc1Xn_L+ zPb3qE`jo&40dudd+$LIbiHnBEtJ)KMA--UIyLoe=Vmds#o7eYlOcN|lS$3LfaoMu` z12);Z-Y(vsj=6z2g$y;4m>e3pB}G*S^bQ=*YO)Zu zxy!8FB*eMqVfhm@>4tdi(aSb41LI+`kg{y}xTTw@u^$B3tTKy=3;rbLfK-_vXnzI0 z>LTov^1|j2hZtD0q@6Gnnga<`Ifso?!FyddL?1ts;JN$XLVj;XQ)?s>6GA(Ymwkn7 ze0}bJljS)#YPnRT_sU~gl8 zDVN^MTxwzGV*n|QAJXe%BRh4;Ih(d>%kNEESfZS4-suhW?9 z90`I0W#c!zRP?1epVHBz zQ>tqJ;-UYcsuM)`ohB`&I3h=uNFA}So-fX-ogSgAX)TZO(~!6PeKNn)@*lxCZP+=} zg}MuwQePluoD7CODG!e(_~!gxNy#Dd%8Urov*!Qz7a(2S#CWztE>CPqVa$(;-JNPW zdo+&=*og%;eJsd6w08co3@N@%?QU5yvX=+>x-vLoO+*3&Xrny4<$xu$ajd%bC{19q zwA(aQcWRs3XETJF4r;$dlHF}Xb78QN16_F@f>@qyMXed49y2g!dLx;wVv+)!z5wpq zut-_0GqZuhUxtl4#CgISlsEUZB^W|i;Q~%Qh{r-BY$1^yMadbr_+Q0kBT5qc>r~Q_ zQOBos5mtBI(*39r>)YW}JXe(lMZ@*!rI_&W-PFQ%6Rkr**uqM_J3pq}C~*PRa{;Jb z2FAo5`143j2B}N5okhRsOrPE5hp-6u*HB^pNjb56oh;Ap-s5reqq7LW7< zCo7R-#a`)-2<@6nc|}nt*Ev8^Js^0LLfhUb<8o}fW>h!tJmItTA4SJYg}LfnkCGN@TosS zT|hEkxMT<)tnwK_OxOf`ZkEWYhf(qL#9x_FHe%85W&qfH2)NBQ1buW>Xxc;#qXFd4 zKD+5vVHj@+zKy+Rs^tO%y5=m%u+ zcbk={H%iBAMLg)v3&exay0*hp>zZ#ndaqDNMt2-W*0p~p! zKicUks^;K{E~XO7rLY)!WgSsX*UXxmEvaUw+4_^3oWzW8|Ik zXXtL4dX`S&yjkPXGP?bw=W-5yfLdRU`v0hAyx zNP0Ziv`)ob^sbb~qh&>EQJ0B2lW86RR#MFzC5a>CT@Ce2WZA8zH1}P(5l>6oUgN^} zz8sM6o_l4;oCUciPT2;wKtR7bfF6E#Y%3bl;F{I^#|Oo_{^RRo1)Oh80m*q^G!NKj z1NjJt?&gYv1*gme1GQ@@W$R@hU;dWUb1`9nZy&n~;4fLuEyal$I#WfX_Kl9w4~9&^YX$1I?m5$vJx ztrt0JKz+LBACOb-+yelN7=a}~Rx+NPJ#|AL;9s51v6oGy^%gx}D<5xchakVWfTtj^ zDdK3+;f9XTDFjOU79yH@bOLkZ2DR&?~$lpuZ(LR6bDy4;RG;JYRPK4(T*YV5KlX; zcA+e{{>QFlGnYP9^MpKGO&lZ`xqT(dN)B~n)`{=~{=c*7I`GrjuD3%Z8Q|?7dBb~=CU{3m#^nTfsMe6 zUF7>m`vb1pWqY0yj1!>fbSWRe$#&&M1A@W-9UV+wD}rW0=Ho(woI^Jueq)NNfQgC+ zl$rf@bRbvWW^F}^+=hT(3mC{%tm<)BOUze@55dNvHm;!x-WN%Hga6hSOxDH`X>bwJ zAbQ1-H`nPTw>W)s!KAOo(jC)t+fdV;{3Os$#OiF1#$Y7?uB0_$8lMRCAo;9vD~Z`Z=Qx@4>nIxA07h#Hk*3fwJ#(OZ|{0HILh$(4U!N`YtQEm{&I zb%pj~aQWe#MucA%9gXCazuavlM~JOizg47nVStIcS??t7fLSSN#2=|Up}68>rb5cO zbc>A11uDu+-==|PO3Q8vaC8vI8c{0o4!j7=ph5@ivpW_?i|VKPJ-CU+6C5$Z>)uPz zk5qu_g}3(xPQsA$zVioZ&ctDH<@CKV=*Ie?*@Az0DF=Z;w2JQt@BCF>C825%zvNH0 zxb1sO(ed~aFHQoPX8i6t$DmeH(2n#NQl6#hoX~hibf0OVV^oCcrF}5}U)~$=nqjdq zOFmiv3;Go(XiG2N_(dOSw16wC+2Zd}%kp^`2~M3-K!EBO5>?|&aMQW5-NjK@C8$|P z+~rK>_@?&YV@G9gBdOjJge%iDR2s(0T^H<4?Wl;5*o<4QSvZPz{7!E#Y0YG3W+kQO ztRdge`+d8(kVQ@T_b2~*I0EzK{(ETl3nYrY#cfa8S@O={fY9w*2df0|F*Jvh)JyUf zre97Cp3KS#tdAS3V8;Vj8tADNy^u~B{WCLlp2mGd&*pKJ#agHL=xZ(SQU8`qrV%;D z9 zWbOKQkoAF)0y=l4&q_N95FF9V2vkwCl08C3W1wCDsN1&Oo4q!5@f$1yR#A{fV-spo z-tM2cf9fe%IyX&HCzD)@-L4s|C`7OfU1_p!$Jh!QgY`t0cFujg)x=-%VBjp?nSOqc z{ujea^(jsfmkNW%k}H5+u(q%UvZB3Abo){`HROggAOuG@x6^HbclM8R@&h|(5l!#Z zVYX9OM~22o^S$Pvx$P3`e1qzQ%I5C4Q~^I8LN|Etl67E(xWN|2?lcq6&5&Ed6UAx_ zjT@^y!EJdZi9C6M^Cq-+djb&Rm3)0sithdF{%brJ&kQCKZT$RfJ4I*e``r18xjm1a z42kOdmJQAd`}(C(eKQ~R9A%%_I05r8d(!T0A9I<(Vp_)F#Z>w!&0E|xw=Q7U1CbS@ zu3lraKSEY$r)WBOv1qme->*I6d5iK-{#@Z@XgC1d+!DI+v2mx9ZcPqy=!4v9Zvc6G z*YvoN(9hzsvY3rBO0*on_DzbPKv8qZmGd91dIAUKehYs#J6;xxNVXEcDB?s8#H1Yl zoYZ_J4jwt^4d&ykT6b<~i-@k5g1I_S^l7Ba^mH5bysEU&?v)D;h26I2PeW^5$#(Qy z)HGlASJB-orH!eyX?VfavVJpSARi-qen@`4x}mOUNQ1+Vc57^SN{}d%PSdwjJ-hxJh3fkiyQ$1?nS6zL%Zw(5HR)DsL#}@W7qkLmLr!7A|ITkC955OM z|GmMU#RhNMSdn^|Zf$=>yjT8>2oST9fy_2Z@;106bH;m~^#XHoNHsT}5GX=kEkU3e zj|$f+--I%(7s`u~g}3(&Epu{`LiI0;&jNg`ZI?nXP1dz13O^ zSZ4-ofnU1R`b>^~RZ8bPPiKa(vIMVSs{CDIbfbkvPjPJ(Ql)l&xuec$eW{7GZ&iLD zg;&y$^pV;hXX$ltrLcAoQnGDsO5u(ZO4E0<+u`cpneUm0Av zmRF0D-X|GO97{_23Zf{Ro;oxD_LT6Rn!QH-rgB~;1l>;>%%+9XyE8jW{P0@K*_{8j zIfVywJo66DIZV3*%;y(XqjdQd222Oz%2nf^Hn5XRZ`?RB&v_12?lw)keVaa{eM+tV z=_sWe7Twue7r089dRYO*{eDcS*M~a&-(P`WbU~MXLZ2xE$&r@0N{6wr*U=(EzxhKt z8(Cg>32ltHYO481QuLOEnVyb08KVDG#GY(uG12jw{w8Q~-s&p1eMl_g2iXbVT9bnG zN)*_;LcDS^4_@}LZLy}Or~46hyB#U$wSm{U7CB*Ux~*jq_M>h zzFD@5|Mcnc5IpUu)-;@ojlTbJ{0LN^@b#uOP5{UeoQ9LbAhq>;d_`*14FuwyA3Et; zx-F(nYhkC%x?M2IZ@KuyK0_QuRb$5d2fMxoaw!Vz@Q*O7nXByBqH9QN?GjS^We|_^6d+2weYqDcX9;dL;AVXn)mYNw6ef-q>`e5L+p%a)d z-is~Fo+D|LRhQ!f^bh3P!qJ1P`I{ zit1EFxm*c3#U=x*3JFTcrF7zs8D%V^ut_1zu1iH`PY#)&YFu_2BV67_ z%Ou$qzyYk1?P%V<*G`hH;iEnubkbPvg9zaED~bxR&{x-)E9WwL+D6!zfM2t^pltWk zlwTh!u#-Vm4}+*Iq1$$Vh6zoKYaaB1M7mrog1Z9VM=I)6uxtF%b+i33#T;T4*Panv zMl@;QP5rQ~X9JPAKTnHB3&thy7nD>l&>jNn$VyJ&i0#mjYPp%TUnAhX5%u(<2sQ__ z45tF@#9+9QDKq=PVLt?`Bb7(Z+HKIGKrs2_PmENJ&R-G&{G=)Bw;hk1Dj? zynFA=9nQiu`>Se?wi0o0U1$J;&|<^(YA>7a`n+*%6pzV5-tZ~gBR-4(;N7H1tZW|smkV;0g6~4ms zbFj=DdFZnN{E#5{M!f(mC_P=yEX*orHCt%sj)FogUGl$?JFzZd{dvVx)~4`NB3Ae> z6Dc_DUwGLRv71~$BdO|pmh)-8hpx7$QJFJz`D@vsn_P5C45nBes6}}puW*ffFAH~S zNQjPZt>s}guE1pMV_v$68sp;q(PaLb9NyOYknnO{G34W7(gdr~CAD-wX?0%I#wnA* zzWE^z;!UL6`Qj_I)PpxsipL4_wUMA#18;@Do0FtqZ}}cErVTgyis4Kv6QZW?qyaHM zf?*ZQsA$_`oerPW8g5B#@YijO!~Xl^UEOKCnSqt~Q!GELP&TpkMmfruJhC8K*r~b$ zqK)VZ+hCpY5sj5Uwj0s-)HmPt3i$R=e3hN}EQwnsD;1hru4{n}(}rL~Jte@!33zmc z%%J_T1@Xf^=vg^RQaX>KPA_3AIc103TWm5VO))nU0g7wGD|t2#N`zpQy!*$pM@mbN zK#`eRbqX=Dp#8dH&>%IM&-Z<7HlzS#X|F`qUgoAbqkkvUNvuUir!@43lTQrLUe~JP zg3tJAaq*ppSwmv#5H~BKGSlYBOgwj zEoRC@E>Az;3FwYD0cl}CO(VNxkF=psR48lVc|D7rVEjTF*gwo9UF9;~$a>^@#8P~wG_u9-6I2tuwYb}-aWL9-ck{1vB)N0&f{I@ z#Q7SFZxuccv;E}B>{$M_qMam|a$KdhkM}K07570uhGn|nd5*3TXeN!U|^Lu@(T?V4ZAlm5!g)id0|rmUj6Vvga3ce;p}E zE3`2`x#ncVgaPv#6AQ2BFZZ#^IvoPsIWDzx$3VcP0Dm1;#^pkjT-NNzL|*R?UWd;? zpI#{j2Nr?IvXh2$lBC_sz6c5iBoH(+Crr%`K2T&hj~AdSGW0%`+dF1MHZgol3?M?^+~5>8fd(zSTqXd|dIqWO{VN#> zOVT2WqJt=B{bavblJR;8Np~dyIPfsKn<}C2ZTod+EyS0#HI;P_ zqq8PS^Ym)=OJ%csrJsytHvy<%sTYBPzmB>x3)#hsUvCF$S6W~QU$d%wVOd@!YuoV0 zr-pm7{c1@jayXFf{pr1pVleJUQuH1%I;RKrK{|E4N(RWE1$H<23h+Cp_7p8xHbD3W zVd#d5QmMR0X%-St|8zH8+H~Vx7Q_H^`Rw_6`Qp5lE2ED6pl<^LY_MymhS$ilx?|6- zi9h>8S0;d9(;FAJW#7N|f(_Eo9v}D@86R@q{Ks%0QF;1^KT%7OGjXX6-W81LAW!4B z7qGXB-@gj9#HvIyZjZIXzbO@jaz+pQ{Xm&=-^Rq7J!i@HFdDp{hum;Ejx-&)s6BD| zAZV$IKwEVgCb9`ldF(P1kgstGP!t%3Ywye`k0f;jkQTZ8iLCuE&x~E1$zYlzDO^FMVL78|$ocl~{d($zv+mnS(xV0$v+iFydC>`AxKazJK$z+=9 zd?xfeQiqIH;8aQD9^1KXTPt9CBj;0t>HEUzd&S-`6nlgTMyfcf96?mb zQz5iPqxelZpXB@Tcvodl--_Z-DX zEB9*uLiKK1?*h&Lz=^I%_@C;i$HAa(Ea=IcegKlV^yi`Hw2WXarj8LXxbR;XqnTj` zR#nf+>Ikd|i{eHnyw}1+0@rZxlH)~ybBhTlWON}yAZF@!e&pb_XFMDVTl0CKm-IR< zMT(9~DeMriVoC+&RDb3=d{bNRV=Yx6JyqwwX##xH3>R-pad(N1$T-p;(~XGHS4?VaRb`J_aF6?8MFYtlBA zwv*5lT@KdykNh_{IUNB;9`u%=p^z?9OZ@-4`tVGD95S=Y92P!coJ{@*8FZ|z4}ykY zJsb)nQP3u0FKqcc22R(tz$Zhl3k<4;m61BCK@S%mqRsBIN^PKq}O`e%5416 zh_KjcCg8QkkPt_;kVl|fzufHWFqTb+7*2_{K@Uf}N#{R0=sl+0#C!i5%LI9!WC$06 z-F^-rWIdg07_$@lE!Tt){_J+6UuGV;V7J?Y2B`Pk*|Vt7F1qsy%IWVPk`N|f^5B~gP_>**Vx7RF`^1iZDO ztG6N|0ViGIkfm|WOXmVoB`RSTr$GxJ@S~*{rUK{+o0=^eJ#6DAM|b^-loZblzwH)` z@*dfRf4O6G0AA-ly#cFwaRn`5~! zN*Dr~i!6M~uHbGro8YS-IiN>qzNj*e+O0IQ!8C zPOk412TEiO2;tGNt-nwiyjEG`G0Jah}5^ZFV6Pv!5UialGcT~dbng#SE zLN6SFpXKR^*kem(UdrERxudN#gCna#)#Xk-sVVs4fK1=&;8VGm2ghFPAi$*m_WrTF z)ymQHXj3yYR~C3WlOI2>x~Nxbu|Zi1mZF!o&e03 z)4Fc>1BlI}X8e)rx{kF!B5QfEhD8?^fWmaU6u)wmVy|*Z1tXeHOj_BB&VkgMK*nSC z{MNnvX}W?=omwwxXw09_ImOPwY}z6kq|?h2$6k8z*Wd8rnM)+z93e%md6*PAW6|yy z@ZhT09LDk-0;Qmpnf87@wChLvFicNflB6)Wg6p_*d4*o`-gX zU)6u;0Zj@32m`6O(J5#|*PKzF%?4p}?Y$wRyR<9W6JNbDU*Sf6VmWHxb%+K`IYS-! zxxMKC?WZ-NBJbwc0;A%Fw@*^=SYc#qqzg0ydu=s%6w=qd1E*9=I>Rp;@(ewpVh-Uz zOP8mW9~iGqNLzkByT5#) zayX60g8h4mHdYW`(#SvR0SiPerP$aVhl!hqS?jt%wN}2x_v^|HR`j-#-)_*7Rl1!H zxgv@!PR3H7_8U!PS*$=SbFIWP)gH3|2g}?iDlR6cv4FYp^%!>XAY0BN>O2Wv|98nv}V=hWU}vX%CofSYZ_EEYYq$H3)0zCt>kc7%tWEzef?Q+L*W7If6cL#D{S;!zO0~!ta(;gXPpNm_ojxt zH83~soL?$S&)optB*s`-xe&l+0a^#&A~9oD-wT){m?8#A&nydU$_iS-ynsTZg_API zi-_iG3|7Ro)DR*B(K#N$m(Ac{t*qQ4#*IJ{Vb0>;uZ`3(pqGr{`GK#ve2%!tU;{t}Hr>alD*5H^K9HA4nEL!U-#H|Wjst5l30DtHMu@5{GV9^|wW4`uQ#pWh zACTg*%lcD|%E>Ba3w)n1QKe|!MZ;<_;O=yz<}vwbUC=L|@{upy8E;)!K#w-7nr^`*j-NCA1|ms0YmiBRjx5?(t24T ze?dd$HLP@Cl3^Bqs6I%*KSWD+*nIAZIK+|ip^b$GydyZF*J_IWg^E?}RW2=dB$ncz z32cN$mOfs2WNAc1*cB9ahiZH7XD_D4{N7~YFy`jh>!0JRqvcA;7M9d)vE-6RF&Tf6 zuGoXcB7$sc%ga{#SXC+EPS}^Qg}7U~ps@XsG^)KsuoD_;2l>5*1i34TeSYZ1Q?reS zwDY+;ZW+Q|y|kLWr#G{O;Qhnr8ec<6P-Jyrtm9+-6`zLNx>VA%PrgjpY9wLU`yLx@ zOh>bEr(RvDmJW2pYjp&n>%g@fe2bQvfjw{5jsDcOex)j46Juj75&qV`q6!G`tvidE zB>+5*;HXNs80ku%-!o0?mk&LSW9C?c$_>gVAlL{~!T^anZ7Ha?h4lLaIT&y>0%Hi7lJ1Um9MRw7q!6Qe#d?jg=PI*wvo2?FPI7W=@0Hp5G(VRNii zJP(`khz;=bKMd=SGob*W_;b@@^VW5<=hW(gvw$~~(!ZDGLqYVvkk>K>-#>+P8zrUh zS!7&E@0PBHiArnWJ6A?WrHh=^?-x{i^{UV8;)ijvbG8ac!Lg)(zl{~zKE$Q!Fh!^Y z#FEQ8rzC$rF`-Qj2^Nq&m_(wd>33OTHke$3E+17o1xBqpzcLo{?q$sqGK>eiOQ|+5 zbB9}1B;%n!5_zQVADr&xV)h3FChf{T;#>1j)X3K#FNfdEg<11g{|@#bOlaK=^!q0H ztl)W7QpEy{5OtmVtSrFXd5@o2*&Rs?m`Qlp8`IB0NEaSNX8-eyI^yeV;`_SSIG-yP zdC!te`mZ?2k>fU7Gbo#|oYE85C17t?%Wy!6Hc;_OVkaUG!1c!uDF#z+?b0pp@@0Xa&E16#z6h%u$I|7J%6w{9Vdkhp_lxTGg0aqh9l z2C33f0_57&-$e%D;Dp$@gzd~4VvnAylaUMO2e-!`^WZjqR>6%C7~Psdzz}o=s0iFT zAb&M25Z`Cjd zLz$eOEiTj4F5+FNUq&&!e7N9%R=)$ZSPpxQ%6eFE#`q=dqstG}JrG%J43j=<*ut|J zW&UF^zrH7=moS$3dlC}By36P4HJDHvy6<7@Xy{s>Bc&vVwP%gzh|KJB%ialfh6r6# zLV0Jig9mO^X-^mZcV9f1M=X*Wa8xvp@0K~`c^L9mN0}jWPBb1UeZSRb1QefURqJxT zjARFg)L!0}P3u7zppB5lSmE8|4*1#bMfT(wQU44Uc1bZy(8`Rvfm8*wp80#$L(g}> zY%PQZhPiSd#~+Fz1q6{3GT7pyu7~UEkNZyq(M`92-c>tf(Px+1#nts9d=f;4d)3+7 z=-1mQ_dVYCf52Yn<41q)D?l4tJWoL+_-%81R*k*K0qrM- zoaK^)@KNVXSJ1PF}nfmP@)OTiR%m?*o=M{x^SR*6TIrVw}$e}M3& z1QoYv@H+%ZpAgN9>3k>4UxI=&+En}BrNOF~C`Y37phib+3a|vZ;E-yTonrH(MEL0E z{PZDsu_?5~_GjL=c;rq1$Zu!gh;=-{$TDs;Jw*x0h@ak#8Y_ZwIjKN%Pqs!fO50E5 z#cOpSrn27}ukkN>s(t2{O-lf{mu@vrZ@Q@|_l68^VuwO+g*%iQYWekpPCdl0)S1?l zZDgLgbf<`joYf7rT5Vko5p#Jh<r>?hePK@p>RY&p>+)|~AsqmL zkm3?oV#>fxj%@?GT}yHc@G&DrpbLZ-N82fe-Dq468M;XP>D+mM)hdF>@p`5-x+iM^x{C`P%P{Q)P_1QQ#jy3ki8Iok+QRUw5M(cb1B==H~mjm_w;IAYGmS zEAqBhv4TVK%)4-Or8x5@1uj%|xPC6dcF7M~5&_BCz?#{h$#-adFEPTrqpIlb2b?`+ zg}X3}tmPE+cbpXn;>6t;J6??VKUrp!#vvb*7-K-a;bl^2n2yhcaxPMp!-QZffWZd3 zK-7vkAL@b;Pk~r4L(nT75+GyGv>T7YK#IO7uf<%T!-C?XR%70aFfzm?hG?LaSPJ2O zFgk{AtFhFr$0BvTZ#t!{|>6%)1ZdC=($KxlZ=?F~|m&lTc`_lFpLG`=pd7sSYZW z>>n&KTa9Bs7+uD-gZ{ch-#sxVVXvVC5fRJ@Iyp#7qZ`xk`(9}ksP(3xR~>NYOEBQv z^AXPoXp)8`$3=L@rE}AeGif=J^JEop5jY2(IoWy_BdvJOHJ_w=e&b+E2OEae!xPXX zE%@~n>}vbKAFC2|QIt@yljw_6XR}RtOVnb1qF?bwb(2q+_7RDk_aq>WkC4@z-(u*@ zrPUHsP^IMrJc{RMA~);0AZF0oc}ga6V5I=CDZZcjz+2aGOi87>9cFq?XXr08+>_6t zP~UY*%=O|)`<|W(o_y^;LgS6Nlsj@@4bElJ)>1n0OeA)LyPmEa40Sd1C?duzljP|_ zj_dhojZ?Z{uneW509A}iT=v&`R%t56g@LhPNsCb2GI*l8;xaZBLwBb>KfG~N`t$c< zXfMjUE_+!%`fvwWxcS?AvK_uOMJjz$RR%2P&fmh$)7MHy{+=ha ziGi;)Q8NzHrAjmlI0dVb zV4>o#m;sTywn^VR+oL1h!fnxa0(|F8r*Q{Y6qFh3I2?!=VRp`ku59X&FBsn&7!?r* z?3siAKHCB3Lgh^nyFA2Rtf6-fx-+w)Rpv9*rZ)E91#`~hPX)-w*n&JL)vTqSSIxq zEcg(ktZN2+yCvG9qu$v5jgI!SOIKb?bf>~E^^x?}+Qqdek9Qspe}a=wSE=i`^iJz& zVhd3bl2O7fS-k~O2mPonXNfVfQr?BWPaJQ{zLr~nkgwB>Al@m>bBo<$9r7%>w8vS8 zG=$G4+<^~U!0!azHcjWeJ8I9UW>G5!b(yLQ0c(CTd1fw~EObXF+=4va{pCF7Gc19s zf^*le-4&!lV3d7a)fUyn$NCGdClT!w2^01?bGBtMQQh%h{ zs1wh4a0;AnomvQ<^~s^60$A=NmC)&wp$&?Cm~kmG898^<=06*~xcnM;mx58q+HF0$9(Y&K(3mCnC!qMSRjI4j$S4GDMC8#oxfrQ(R)eax zB;v2DD}5=5&o)N-gMZs zFW{=Y848wn`%~5d2`WWPswolhX7nHZF=n+8*Dw0f?=WvQQoCb#3!6%JQg*h+M<FE2sEgooKQ8DEJC{*lcq;?r*F++g?j*RdC&+30&(AYw0ifr~GGW={+ zhgO$(D5zpaj=fIJDQ#P4>5^`?{ZKece&b>{fqlTtfz%JsOjbqTR*VA`!G-Ld>+{_^ z?cM@uu+lTQcdNu?$9?|GBn!cX0UaWRXo)nEyX<%L?WjQ00XDOJNyKv*jP_kJ6I(3z{)9q%eUYSK{m?xW^Jc>q;Q@-_69D46$P7i{Flp(-eD{!U1alA3 zv9S*Woizv6BJgiQJoJz9F zca-F-$*|b>-PI~k%C3>@_x1n%HB9@ec0Ce#{p#y!qKqZK$J0X&;?J&IS8sDd*1dus zpR5YGEso>ub9w+;MjDZ)usmdS6)}FhTz;5M{;FTwh}UDCAa5=&gfL`Q`7$1Ve)BY- zah38p3IeA15>P9{LEj*mnGWK@>L61b4&>0u4VJ&r1K|0K-i~VZdV>cm0eDILB^VBe zyL>+>Gsx;1mFdjmthxCM1;vITh?H4usxo*jSg!@4$^PQQc@3PkpBV$$9nV#=95{Xx z9KEg9mf0#hil&0_e)wRMPI>H$Zj-}?0RVh%(e&cwQ+}eQae#M*?gc^6dd-_30)F{g zGBU2M&&XRb8ic3m1i6QQh)|CS>&{_qlsIm`W4|Bz!N7n%H{vT=>Hj<{lJtJ|u>oc1 zA=9KqxNL0CY7&`mF?X*JKo^+tzN4j5&JSAeFTUy=xll;_TBKgBF%F4TucAyJ9*-9d zK&2|{l6@>`A{%()E67M{_~Yy zirG4Hy)2;eRSSM@6b3pzPuZ%^q;7r!cjoO=hwt%ZM5M((iy%UO$VCpkAky|O+3oA? zfL~FEsUY@9+oI>&{MpzeOk8nmwqZD28iVc5HW*a92lVi@iT|{8vyWe|t zlkaAY&wYFfmD`i4s&xx$w=&3h7@(vWA1DCsqX-Ze*cpRdTeZ^Rn*1>O2wT8O{2_5e z-iS%05yU*(aj;G?!coJv<=KbhPhkQIQoix)lSOUUYaO8tq1ae;_V&zXaUN27iN$e0 zjDT{0N%6bLH+yt}y*+^xr7cT^mk~=q`$Ua(PsS@{&SxibW#>nm7t2p==7Is`Go%12 zEdy#leE5lPQ~uz|_GG>+lED=`Cf?o0mh#63z9v=x=p~ zT=k*S)cP6|&W-}oY5?TipOikG-v8%uF5$vpa9v)hl1QomI5(-U%*8+#No9h}gL$KH z1QbF(vA#}`D1jl6IoNc8icb)0Fp=w$Ln*U?5S4Q4i?Sp9`gXC<2J$Qx9G5tTla=%+ zxZ~$2hw^YJ5~5Kd>leFv65ke75Ev94c8#@~A%T^csHDg=&FbjAH{SM;4*3d1;Pj4z zW7+z}gEa#ha|njwppF8R;LW4V9K**j(Sf$8+91{xkdpW*-R$p45SwImM)UJE1?ygBmoHE8EBC%8&OV zK}2Q(4|Tm(6Q!azJt2?d;)CF;LP*c01Za+<=g{EC^AVNS7~Zh7lI|R4@nV&sUy4;~ zzQ_rqCtmwAgW|f5neD0W%xmapAe( zxD!<~mm4$w9iub7Yz!4&TCxOB#mnd1(Bfk1ez}skBTu9q>bl41w@GRza*J5ty~mIn z$yT%VY*@KAvV)ZFuz-rBgdlDl|I^<&e@n8(sZb>{)lAcSeJX&B-Mm=pOJYZihnRK8 z5tv2&Si883BwoYN408YI+f$RBeyU#Ct&08)=Wd6)+9OI%RwiGjGR<-hWs%+zBj{}> zzI+qp8+&uo!Y7JQnZSwdl1-OwP`w>7 z^Mu}0J=-P?(lGlN^6FV{^@6sLQd;JdUzbFK=+36;HhFuk4fV*DOBhM3e(r_ ztXgB>@g23=`phDk78`Uh7Nk#d^(&`W^6y1y{)98f%!i&;y|T+l&@13nhEpldHM3GC z^Z;j)RWLQG zH-Bf~givk$BOH*)w7(CPQBFharg;snxT|q8nZYq@pRwNRohabb5GT0Ps^qnTD6%q$ zY1AxxmUNY)iTQ7k3#0x`p5~l;UX^zrOh9TEUM-)PI-ZkTHyv=Ty6250DKe&!2XlKFu!Hy%#NaJswFKLkq z;<(56BUu3tprd-N(mghNwq-8)f%B{uczz;kAPu%%Mx)ih6Y&KYA#NJ%joK8(0U1w@ zonyGPuW>8)WgS)SxL@ZUD6Jy|b#LhgF1Wb3dO=~sG`oW=c2=Z?8$=SKr*y~eXYXe> zxzL=0H}IF<52p+`d3ftoKFIsD)5uGXxbuw^KKf+Tl7y_VPKS{I?WC!t*w*Ht!UjdE z2f**Kn_HT3ip=(veA5w4y@1Jw7o- zw9y%i(<=HYRcZtNq$V*A+q)+d<)A+SoYeQmplzU2P-_b*k%|V6Re7X+XP>u$<>8V% zVhtCC6{J>DJJ{0=v^Nnd9b#HPC;0pak8R)gKEmL_{nGr|)k-LO335Y7;SpQHwvAN{ zR`YYCU$b^h5{+1>+O%AkSq0lys2F2h)j%xXh^BcH!HPB&+%0cvB=qb;IAx|V8z=#~ zWd2^}#l5Pa#-U<>eme+R>0e8pRAuGkQh4mQ;iCnJaPj+~Si4CzM!1XRZl3jhrcLXK z4-}%*;jtt8FSbrB?KLZW05#QsRW!TjfEoi9DiO}0UfVJu52%m?;MwXITgTAHy9@bV zPl#kv1mS7wkSDApIuCXQ6|WuUv>-ncRF_c&^WWp!qP;)oEZgJ+gPh3nd!Z4q60jei z&_<6)R=w6A+19 z%XECGTp2-)(g9|7;uWy-qn>CSs1R6VMuSdI#r$yqw&0|KVf+&MhxBv~DSB~$Ztubx z8ai0wIW%_CQ?IZ>$hy*DTt1iN*)QtU0G$k1ONVR;on7KUFwk`1QB&4q;FD;0v|Kc+ zEzMCsusO_M*8m#&5V`WhCv1@Y3KBkcX_hAw+U!JZoZW~PD{kP((8u)`aDjDilL}m? zhJy?%1QP|~7u|Cym~9>(PK>^Xi;m=z?O=X~MSlHh-4+Ce9obxezYiWM(H3WjIR)3Z zoX%F`os_r&m_E&9K7X;DU5@OaGeYwLgxXL9CXjQWUgFLYl0v836(4q+tBNU*9uiL> zanRRm(SX21@`^w1CsFglffVkH4n$E*+ztU82hT%lztza3P97CDiZ`;ljoqx?P6+zg zRAhZ?I>JrzT;td+GFsVuL>6xU+ZlgtH<`i$Z&{w-p3QwX%V|S))&0NYuVF46MrKi8 z{3a@_rxx7qzZaoAjOk7#f9uz`+?0we0BS69q3M#;N2(3Vw)3GY$LCZl3ZB7>JMhR6 z+mWLvZm!?VeohIcTEUolo_`d=GI!tH;>3E5Qcz|j?m%tLD-aS+b}d*ePx?TeO-9|3 z7jz6&%1J2D3{j~ipR!*Z?Sm!srk!M`lUf)4wYO%=&&W?uc{r>llhY->iXAe%t#;R1 zNXrF|lOf1OYNBOK&Gtb7OGM*qS7Y=qpmzvrkLWAyiK#{Rp*u(;)E9zxkmWeHy%dw+ zjihw<=$V9?=t4e#@>FWqq#rbex}>V1q>UMnuMX8O9*hI8xHitm3C|d2O7W&p|zDGo=$0VDJv%64HO}N$>SY zWw`4It%~eFA=$nqL-kpe$^xEI0bP@~PIeaFGuV4Wreps`hSQQ{;?Q?iUTxNh1>b%{ zeI%K*hw^^)cUepearF1ZV~v$wA<;zHqK!tZ{D1WrW<<`bF&Q&dRQh`Wg4Xi#89~N(HR7<7Z+i}qY#gY@+ z%G|o%mtaM!(|w8mPzzaW_}F}k24gLvljFLNsr;zTEp142C{2PcK;VJ@vi*dsy!sDl z8Y){DN?3{Dv$2p(OG}K<5aaVgX!kGO6o(em)6C-*r*c=vv|Spr{dXbgxg%3GJix2~ zNt0u5@v^(Ha_VVr;U#D_)krXd9VZ-~h-;T|`x%eYG*n7;7b(1}=V!cj{{xHU{(D4% zOWVqt)_K#Pjk!p+KwnE8U+4c^I2a@Hrn#5v$AQz&`~IRDYyn;ec`Cx*I6b897?H=( z^_}0NL+Vj3zDByTZXEIS*bL(^wF^2q$f6_)jWiX2fsSfjyG2b|dzP+XLs-h| z;uEaiKeq|ck&~dcNcUa1w(#6DAF$x0T`A!eSkL;Q?~=gid{Otg>Rrs5Rsv?jIoeN} zZJHl!f-H@?uR>hQgwlw_qSOZ-wEsu`;+MS9I2I&FN;>^B!cM$orcQ5FK=6fhtQ~Lo z{6#Pat^(`oR`DzDoBE-zWq7SBlItv+=RrqZ5cMbNw3IiGCYF&iH)376bGv-^Nnga> zajcy|)Ic_S@wY@!OZ7YM*vQn5EyoFI3DM7A`DulQ zbV--k0m5VlQ)4jFl}5Ix(txoEVJZs^NNYc!BTzYhd?n@G$Rk)Kjdq(PieeuH;U#-p zLs-fuKnv&efNW~nI3N(p<(y(Qd(RLIzP)1~Szd!O0poUJpHzA+6)y{yMou>fo5%^x zj=_H9yy>dfDtS(-#fCyi9Sz_?kRV@IlaaFO!yIPYFiv*k16Pci=--~NiXS(BsiSPE zS@?M2*|Pm#79HdPh^Tk#)fUu~4pQf-@_OI(t;rrFnt{#>AEjz4FL$Q76p&S|Zh()$ zWAQU}g)$mzIRv%^Y8c||5}Yd=@{M9M;oM54iGmpjP4#!7TWhApC>CBfr+<|&JW_J1 zM&1mCRefQ!eT|!RZZ)3}MY`8_kB*7OVUYkKfmgjLZ3Yh7)5pPV4a}%u__769-JE)- zoLInWNnfVBA47;%8C530(s3fOGIt?6p3g8;4Uh=~WW$6XIBU?+#(}KWB%lS|TRZUNl<7f;34XqI}O+BB~w}04L@f+ED%n( zbw)=fg(O<;cb$(q73wSB3x0-|MvMM5%DoKtG9~3XL~8m$ho7^03&QV{huUBt6?40F zTIZ%28V0P?d&iksYHJCkjSx*pr)k#ZJ=^seWE<3s(|~~?3S-mrn?L@#DUDO0dCNZ` ztXSkw1>2a9M5xW|d=pzr`ymGCG>+C-*ji@E^ug^#ce2H9IHk+dfB5Db3}*7p1q&yn z+frkrOZ5%TiW{Go)Z==Fc*|2Kytdo5gO14-ECMF5&ih2jO(;$-QnoE1J^;fwgElh- zn`|3)s9pf-0tuk+SnHqgSDOCcy^EvH(y56flf?Ms^lkrzI)rOr$M%@Z17}+*zl)H9!`(P`Z@Aq$-tHR$>cDw za@*VXj3TX(UV745)p(w{D)QnS@nBlyIS^tE@if{^(sCOgzQWJSk%>PC3aRZetGNE` zNtcp?a?$frfL)iBZgG8rOQBk z1qLjUJsE}X%cQHUY+rwb_CAz_r*cVCypOz@OJ}6;1ZB8S&^NzbPcn2B2taDD+%W}K zK@aw3`BNu{C_h_&7zgL?)EQ@=SlWE=wHYwCt0C8a!Xs}(^@U7ANEX}3j& zx-a$85y6677pE;_eQKd1hqS|;O~qyBbvL;>=mF*Q`IVJ!f$xuc6NHi#_N4{ks^%5J zx-u~B5E|6DdBW)FLmY4Tbw;-!kax^qpKfZ)9OL9~LVXlBP|ru(B?-g*0{V>L?U=KH z*JdLc9xB)I zJCRVb(_7q12$U8)&twV`==Hadh6afhwzq?4N>z zUsz(!KRPS4lZCy;9`Z`hW0v7My+_*3Ly(XkD{=Y#J)IZgXTW(90NId~QvKsOca}*b|$R%D=o3)b~(3rbAL^k&R=Z=zuiWzQ`_?3>rIj7)SQYJa-QQvESi zn+=5AF1w}1Z62c$GPnDRZ4q>BeZ-NZ)PfjP68GAI(h9Ha9nnS7b$H#coAwrs~m%dO$t z)=h)<^INSxDjG>F4q(lXQNr^txjHs?+c#gGO~v1utE+z)wK~r~+z0PSn?g2;mTt@~ zJnQq}DJ?%N)wwbh?w3>T6J19N_x|ZBZY7bkve(?xBc>OcYO(EBE0;<(kVU@w^+_lM z%DR1m9UT1!C39la8ErRnbKDU=^h{;X(hz-icBoj_Y-msANKzeRxiQ?8o7^2pN^z`% z@Y8HJ&*h?L5t0+#`r!an2w#$~#+JD>E&NGge%Y{9V6N`vjy#;JqUtS}BG5&E`4~%- zt&=9CuZkbeLqj5CQ@88~C!v`y82K7TYQGtIBdFSQ?{YP}z(jOv$7_*hw*N}HHnz+f zbS{&&O0~}7VDHAygmp#*#<>Mjo8TkPM-QM~a!%9+60eH?f?4Xv<{$Xym&Z8F4S?=d zojiIM9^Z#lw(?s^mD%2E-R4$~9M>E7g2abchX7eJuUNgSNESy@QayUnggM|~rk8*E zioUIR22nlw!$KeEsc|NYyNS<+Zxixk3w^3n{TCw<(?96pq-E|jiWHf%md*qA8kW|l zysVRE=f9o_gS=8QQUB$&3v$!c85^5Y=t1Tm7Zq}(-2!)3gKxHy zH2?!~5kkY{%-iz0pv#$#sCn8}>hIOV1||kxTeL4ez)y^O^}A2)1DgH^Nw$+ur$CW* z^;ENdI#pi7NsuB^C0f*GpS(StDKZvRphQCCkMkHp5_WkTqOk5H(%9_uE;T%K>H97& zx)FKPM|k-Xb{`yKj>4k%t#l@Vsn_tAGFJ6;=2r>eTv>-QdSB|d98sp-Gw<6-+in+g z)Z}tmqQWP0o%(pUBk+D-$w&P7efNa^#y384rv~H+`>1y*b{m$TETc;gKL)Y@j%pi$ z$8B()C3HUcX@{kv+Jy{-I96Zo@&T23)w>_?lxzWMbE%3!iMC*^Ubx|Q2R@%mb>Q6M z9|wD9wr0%*e*_@JsYXTOy25;CF8wyAaoC>fh7#z?oasLb1}Fxv|C8mT^-EwCvQ9=j zUkXAYe#4Q+4OQ_3mD&SGo2~=U8CI`ehi`PpPo>=77@PYiMkGfqu zZ5}9L=8x$#JM#L~gHwf)`C=SjB=y7Xl-NDoVeq5vm;fpvH%+91o*fQg*)N{igUeKj zzijAZ7J3-p#@uYp@SL#OI`FduXJdiE2+i!GxE4e3>!7FjExk*-VZ(i%S?1dHwmB(QP2 zZlkjK5J~!d+W4zv=nYUyl|u1XT2;uo?K9tooe79b3K*h`{{dHubJYnHyg18;q+H@r759Uqk>S`OGL@Iktt=;3%C6+4|ea3 z06Ujq?KSkA`pvjSbXYtb7*-qbt0Stxm#arQufSsoPX!(!Ln)8kZ54tLge(8|Qs**= zQY~(?Pd=9XhL8-*Zf^^z#ipvlwJox-3*sbjT+l)iZU9P6Zl@izzeFV!t>zNfw7J|; z--Vn&6x%T8;@rHsA8NktzKuk-eaOvvL6yDtMeyLocOCYpItqLktLHBtRcfmS?=_vf zNw)ZD*(F{5xu;o)5g|P10DJ=h-PcMB&R-t&AG6z~tl<658v+b@88GMe3(0uEqHX-c zSvwS43{_#yzj(o8Glr&st``Sq9Q z5zHb#W$Q%OxMO2bgjCx*O9Z9?4QlegJmzAi)zFZLdkzTWwz^o-icHAW4)aKUF46q$ z*J9zRgkUZ zDc3SvoDB@B!%8b1>*rbXQ|L)jDIc~sbmq-F)bWNvR;iirjX7h1%mwttX;2)N4Pjj? zCQCP>1ZCU=xB;XIlr1xpVuM_gjm2sE!;&+OZ`$`+L~qthGqN?Ftn$p!sPGu`Ym%7S zmlSmNZFUHtvdGd8?&jWMp#&^fsX;|{Xk`Y~Y|GC`rM$f7zH9jd9#;fpGL%U*8}w}D zQESr@b#JDg;mWLFk4Sp91i6P| z-X5CBV-h93vGdsg2)KAuVz(HO-Xr6^4ItV-#RY9=Q<94o_vkUF2RF$YS0#VRw`o#IVk(D!E9Jki{ZOQn(_FX=3lj%getTds2 zp+g60z68;(Z0GkThSt;uD+CyEW;b&o5o@4E`y0L0fqwbIq&Q`nU|r&`XMdUL`9P9z BVb=fv literal 0 HcmV?d00001 diff --git a/vignettes/spatial_dhmv_query.Rmd b/vignettes/spatial_dhmv_query.Rmd new file mode 100644 index 0000000..93590be --- /dev/null +++ b/vignettes/spatial_dhmv_query.Rmd @@ -0,0 +1,397 @@ +--- +title: "Dissecting a WCS Query: DHMV Case Study." +output: rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{spatial_dhmv_query} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +```{r, include = FALSE} +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>" +) +``` + + + + +# DHMV Data + +Flemish government agencies host a lot of useful web services and data. Some of those are available via web services and can be found here: + +- + + +This vignette demonstrates the **query of elevation data from the Digital Elevation Model**, "Digitaal HoogteModel Vlaanderen" (DHMV). We will do it "the complicated way", assembling a web api query. [In the end](#orgd59526e), you will see how to use `inbospatial` to get the same result in a single function call. + +This vignette is somewhat related to, but goes beyond the use of Web Feature Services (WFS) for spatial data, [see this tutorial by Thierry Onkelinx](https://inbo.github.io/tutorials/tutorials/spatial_wfs_services). In particular, I will document some paths and workarounds to explore if errors occur in the default `ows4R` procedure. + +**TL;DR:** see the `?inbospatial:get_coverage_wcs` function to query DHMV (or other WCS) data of a given point in Flanders. An example can be found below. + + + + +# Situation/Motivation + +The purpose of the code below is to query elevation data for an arbitrary location in Flanders. It can be found here: + +- + +Unfortunately, documentation about the API is sparse, so let's hope it complies with given standards. + +We will use Web Coverage Services (WCS), as standardized by the Open Geospatial Consortium (OGC). More info on these services can be found [in the "Geocomputation with R" book, for example](https://r.geocompx.org/read-write#geographic-web-services). The go-to R package for WCS is `ows4R` by Emmanuel Blondel and contributors, [available on github](https://eblondel.github.io/ows4R). + +Unfortunately, neither the geocomputation book's example, nor the vignette in [the `ows4R` package](https://eblondel.github.io/ows4R/articles/wcs.html), nor [the INBO tutorial](https://inbo.github.io/tutorials/tutorials/spatial_wfs_services) could be transferred to the DHMV usecase. The code simply did not work. + +Therefore, I ended up going back to the nitty-gritty aspects of WCS by **manually building a query**. + + + + +# Limits of `ows4R` Package + +Before revealing [the solution](#org803f24d), I will document the error and my path to working around it: the core problem was not trivial to see, and you might run into similar issues. + +Because, in fact, the `ows4R` package seems functional. In the tutorial mentioned above, [the `ows4R` package](https://cran.r-project.org/web/packages/ows4R/index.html) is used to query data from web services. However, `ows4R` cannot handle all niche server API's. + +First, we need to load some packages. + +```{r setup} +require("httr") +require("sf") +require("ows4R") +require("terra") +``` + +We can connect a WCS client. + +```{r} +WCS <- WCSClient$new("https://geo.api.vlaanderen.be/DHMV/wcs", "2.0.1", logger = "INFO") +``` + + +We can easily query the capabilities: + +```{r} +caps <- WCS$getCapabilities() +``` + +This would grab the same info as you can find in this xml file: + +Note that the *capabilities* xml holds a lot of valuable information: + +- First and foremost, search it for `CoverageID`; in this case, I was interested in `DHMVII_DTM_1m`: grid coverage of the LIDAR elevation data for Flanders. +- We can also find that the Coordinate Reference System (CRS) `crsSupported` is EPSG:31370, aka. [Belgian Lambert 72](https://epsg.io/31370). Always good to know. +- Finally, the capabilities xml provides a `version`: 2.0.1 at the time of writing. Yet keep that in mind for a bit. + +The "capabilities" are, per OGC standards, your go-to place for finding API documentation. + +In R, we can receive further information conveniently via `ows4R`. This works via the "coverage summary" … + +```{r} +feature <- "DHMVII_DTM_1m" +dtm_smry <- caps$findCoverageSummaryById(feature, exact = TRUE) +dtm_smry +``` + +… and the coverage description. + +```{r} +# Get description from the WCS client +dtm_des <- WCS$describeCoverage(feature) +dtm_des +``` + + +Finally, it is important to know which dimensions are available: `LON/LAT`, `x/y`, or maybe `time`? + +```{r} +dtm_dims <- dtm_smry$getDimensions() +dtm_dims +``` + + +So far, so good. + +Now, following the tutorials to get some real data: + +```{r} +x_test <- 148600 +y_test <- 208900 +radius <- 1 # (+/- m) + +hopo_boxed <- OWSUtils$toBBOX( + xmin = x_test - radius, + xmax = x_test + radius, + ymin = y_test - radius, + ymax = y_test + radius + ) +``` + +I will write the file to disk: + +```{r, eval=FALSE} +tryCatch({ + dtm_data = dtm_smry$getCoverage( + bbox = hopo_boxed, + filename = tempfile(fileext = ".tif") + ) + dtm_data +}, error = function (err) {message(err)}) +``` + +… or, maybe not. The function fails, somehow. + +*Status quo:* + +- I receive a `tif` file (because *I called it* "tif"), supposedly some kind of GeoTIFF image (because I *asked* for `image/tiff`). +- I also receive a couple of error messages and warnings: + - *"Start tag expected, '<' not found"* + - *"cannot open this file as SpatRaster:…"* + - *"not recognized as being in a supported file format. (GDAL error 4)"* + +Maybe most useful, `ows4R` briefly displays the URL it used to attempt data query: `https://geo.api.vlaanderen.be/DHMV/wcs?service=WCS&version=2.0.1&coverageId=DHMVII_DTM_1m&subset=x(148599,148601)&subset=y(208899,208901)&format=image/tiff&request=GetCoverage` + +Let's break this URL down: + +- the desired `service` is indeed `WCS`, +- `version` is `2.0.1` (I would guess) +- `request`, `coverageID`, and `format` seem to be as expected +- there are `subset` components for the respective dimensions. + +Feel free to try yourself to paste the URL to a browser and download the file. + +Still, the downloaded file is unreadable. Subtle symptom: even if one adjusts the `subset` (i.e. `bbox` argument, above), the received tif does not change in size; the download is bbox-agnostic, so to speak. + +Opening the file with a text editor such as [vim](https://www.vim.org), we see an XML part, some generic binary stuff, some hints that this [should be a GML](https://en.wikipedia.org/wiki/Geography_Markup_Language). + +There are [sample geotiffs online](https://github.com/mommermi/geotiff_sample/blob/master/sample.tif), and they look different, or maybe not. Gml is clearly not geotiff, except maybe for the binary part (which I tried to extract, to no avail). + +The file does not download with an extension, and it is still unclear what it actually is. + + + + +# The Lead: QGIS + +Well, there is advanced software to open GeoTIFF'esque files. Or geography markup. At least some software might be able to identify what we actually have here. + +First, if R failed, Python might work. + +``` +import rasterio +import rasterio.plot + +data_name = "/tmp/test_hopo.tif" +tiff = rasterio.open(data_name) +rasterio.plot.show(tiff, title = "will this work? no!") +``` + +… but it doesn't recognize the file type as raster data. + +How about **[QGIS](https://qgis.org)?** *"Spatial Without Compromise"*, they advertise. Unfortunately, that program also was unable to open the file downloaded in R. + +However, QGIS can actually connect to WCS directly. This does not help much if you need the data in R. Yet, why not. + +Look and behold: qgis can actually connect to and query elevation data for Flanders; good indication that the `geo.api` is, somehow, functional. I could zoom and move, export images. I could even export the data. I stopped exporting the data when it threatened to entirely filled my tiny system partition (the raster data is more than 100GB) - good confirmation that we want web services for this. + +And, luckily, at some careless map movement, I received an error output from QGIS. With it, QGIS gave me a working URL to query DHMV: + +- `https://geo.api.vlaanderen.be/DHMV/wcs?SERVICE=WCS&VERSION=1.0.0&REQUEST=GetCoverage&FORMAT=GeoTIFF&COVERAGE=DHMVII_DTM_1m&BBOX=162064,165735,170953,168882&CRS=EPSG:31370&RESPONSE_CRS=EPSG:31370&WIDTH=1622&HEIGHT=574` + + +```{r echo=FALSE, out.width='90%'} +knitr::include_graphics("../man/figures/qgis_lead.avif") +``` + +Let's dissect this URL. + + + + +# The Solution: Query Building + +If you start at the question mark of the URL, and split at every ampersand, you can extract the following components from the (correct) QGIS URL: + +| **correct:** | | +|---------------------- |--------------------------------- | +| SERVICE | WCS | +| VERSION | 1.0.0 | +| REQUEST | GetCoverage | +| FORMAT | GeoTIFF | +| COVERAGE | DHMVII_DTM_1m | +| BBOX | 162064,165735,170953,168882 | +| CRS | EPSG:31370 | +| RESPONSE _CRS | EPSG:31370 | +| WIDTH | 1622 | +| HEIGHT | 574 | + +Compare this to the (unsuccessful) `ows4R` attempt: + +| **non-functional:** | | +|------------------- |--------------------------------- | +| service | WCS | +| version | 2.0.1 | +| coverageId | DHMVII_DTM_1m | +| subset | x(148599,148601) | +| subset | y(208899,208901) | +| format | image/tiff | +| request | GetCoverage | + +You can selectively shuffle and adjust components, generalizing the working query and learning about the WCS API. Which feels a bit like [fuzzing](https://en.wikipedia.org/wiki/Fuzzing) the `geo.api`. + +Here is what I found: + +- `service` (`WCS`) and `request` (`DHMVII_DTM_1m`) were correct; the latter could be swapped for different datasets +- `coverage` is the correct keyword for reading `DHMVII_DTM_1m` +- `version` must be `1.0.0`; it currently does not work with 2.0.1 +- instead of subsetting, we can use a `bbox`… +- … but a `width` and `height` of the output image are mandatory; alternatively there are `resx` and `resy` (not shown) +- we must specify a `CRS` (`EPSG:31370`), optionally also a `response_crs` +- the `format` is `GeoTIFF`; slashes are weird in URLs anyways + +After some more trial and error, I could construct working URLs in R and generalize this to a function. + +```{r} + +get_elevation_wcs <- function(x, y, radius = 1, file = NULL) { + # Please note that this function lacks a lot of + # assertions and documentation. + + # get bbox + bbox = paste(x - radius, x + radius, + y - radius, y + radius, + sep = ",") + + # the URL components + base_url = "https://geo.api.vlaanderen.be" + endpoint = "/DHMV/wcs" + + # the query parameters which worked in QGIS + elevation_query = list( + service = "WCS", + version = "1.0.0", + request = "GetCoverage", + format = "GeoTIFF", + coverage = "DHMVII_DTM_1m", + bbox = bbox, + width = 2*radius, + height = 2*radius, + crs = "EPSG:31370" + ) + + # get wcs data + if (is.null(file)) { + file = tempfile(fileext = ".tiff") + } + res = GET(url = modify_url(base_url, path = endpoint), + query = elevation_query, + write_disk(file)) + # note: saving this to a file is optional, + # but might prevent double download or loss of data + + # re-read raster file + data = rast(file) + + return(data) + +} +``` + +Example usage: + +```{r} +x_test <- 148600 +y_test <- 208900 +radius <- 10 # (+/- m) +test_raster <- get_elevation_wcs(x_test, y_test, radius = radius) + +# we can extract a value at a point: +extract(test_raster, cbind(x_test, y_test))[[1]] + +``` + + +Voila! We can now get the elevation of a given location in Flanders via DHMV web services. + + + + +# The "inbospatial" Way + +My colleague [Hans Van Calster](https://github.com/hansvancalster) had been facing the same problems with related API's a year earlier, and he wrote a function for it in [the \`inbospatial\` package](https://github.com/inbo/inbospatial). + +Here is how to use it, for the same case as above: + +```{r} +require("sf") +require("inbospatial") + +bbox <- sf::st_bbox( + c(xmin = 148000, xmax = 149000, ymin = 208000, ymax = 209000), + crs = sf::st_crs(31370) +) +hopo_raster <- get_coverage_wcs( + wcs = "DHMV", + bbox = bbox, + layername = "DHMVII_DTM_1m", + resolution = 1 +) + +plot(hopo_raster, col = gray.colors(256)) +``` + +The function gives you quite some options of API's to query data from. + + +| **wcs** | **layername** | **reference** | +|------------------- |--------------------------------- |---- | +| dtm | `EL.GridCoverage.DTM` | [here](https://www.vlaanderen.be/datavindplaats/catalogus/hoogte-dtm) | +| dsm | `EL.GridCoverage.DSM` | [here](https://www.vlaanderen.be/datavindplaats/catalogus/hoogte-dsm) | +| dhmv | `DHMVI_DTM_5m` | [here](https://metadata.vlaanderen.be/srv/dut/catalog.search#/metadata/9b0f82c7-57c4-463a-8918-432e41a66355) | +| dhmv | `DHMVII_DTM_1m` | [here](https://metadata.vlaanderen.be/srv/dut/catalog.search#/metadata/f52b1a13-86bc-4b64-8256-88cc0d1a8735) | +| dhmv | `DHMVII_DSM_1m` | [here](https://metadata.vlaanderen.be/srv/dut/catalog.search#/metadata/0da2e5e4-6886-426b-bb82-c0ffe6faeff6) | + +At a quick glance, we found that the `dtm` wcs seems to include canopy points, which is not according to definition; see here: A general advice is to confirm your data for a region you know. + +In addition, there are `oi-omz` and `oi-omw` for "zummer" and winter orthomosaic images. + +The burden of choice! + + + + +# Post Mortem + +The value of this vignette seems to be limited: in essence, it provides the specific query function arguments for elevation model queries with the `geo.api` of the Flemish digital services. Quite a niche use case. + +However, this is also a story of tracing errors in existing tools, and scraping other tools for hints. + +Can we actually trace the error back to a source? It was pure co-incidence that QGIS provided a working link, or are there general strategies? + +In retrospective, the initial issue was worsened by unfavorable circumstances. + +- `ows4R` retrieved a file, despite the wrong query; yet the error was only thrown downstream. +- Documentation for the `geo.api` is lacking (or I did not find it); in particularly I missed usage examples, vignettes, or tests. + +The colleagues at "Digitaal Vlaanderen" or the DHMV group certainly had enough work on their table, yet more documentation would be desirable. Same for `ows4R`, judging by their [github issue list](https://github.com/eblondel/ows4R/issues) (see e.g. [this one](https://github.com/eblondel/ows4R/issues/114)). On the other hand, [QGIS is free- and open source](https://en.wikipedia.org/wiki/QGIS), its queries seem to be well maintained and are accessible, errors are transparent, I could have read the source code - a good example piece of software. + +Yet in general, if you run into issues like this, do not hesitate to contact support or file a github issue. + +You should not need to fuzz an API. + +Thank you for reading, and may all your spatial api queries be successful! + + +# Table of Contents + +- [DHMV Data](#org86b1211) +- [Situation/Motivation](#org75073fb) +- [Limits of `ows4R` Package](#orge6d66b9) +- [The Lead: QGIS](#orgfaa5a3d) +- [The Solution: Query Building](#org803f24d) +- [The "inbospatial" Way](#orgd59526e) +- [Post Mortem](#org575ca41) + From d9b274173ae30cf68626788e3409c91ed4070784 Mon Sep 17 00:00:00 2001 From: Falk Mielke Date: Fri, 11 Oct 2024 10:32:45 +0200 Subject: [PATCH 3/9] dhmv: adjust/extend `get_coverage_wcs()`* - dhmv api support - adjusted roxygen - more assertions - version constraint - case-insensitive wcs --- R/get_coverage_wcs.R | 55 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 44 insertions(+), 11 deletions(-) diff --git a/R/get_coverage_wcs.R b/R/get_coverage_wcs.R index a28cade..d92a192 100644 --- a/R/get_coverage_wcs.R +++ b/R/get_coverage_wcs.R @@ -4,7 +4,7 @@ #' from which it is read with `terra::rast()` - if needed reprojected - #' and returned as a `SpatRaster`object #' -#' @param wcs One of `"dtm"`, `"dsm"`, `"omz"`, `"omw"` +#' @param wcs One of `"dtm"`, `"dsm"`, `"omz"`, `"omw"`, `"dhmv"` #' @param bbox An object of class bbox of length 4. #' @param layername Character string; name of the layer #' @param resolution Output resolution in meters @@ -20,7 +20,8 @@ #' - `"omw"`: orthophotomosaic winter images Flanders #' - `"dtm"`: digital terrain model Flanders #' - `"dsm"`: digital surface model Flanders -#' See [metadata Vlaanderen](https://metadata.vlaanderen.be/metadatacenter/srv/dut/catalog.search#/search?keyword=OGC:WCS) for more information # nolint: line_length_linter. +#' - `"dhmv"`: digital elevation model Flanders (contains dtm and dsm data) +#' See [metadata Vlaanderen](https://metadata.vlaanderen.be/srv/eng/catalog.search#/search?any=WCS) for more information # nolint: line_length_linter. #' #' @importFrom sf st_as_sf st_transform st_coordinates #' @importFrom terra rast `res<-` project @@ -46,35 +47,56 @@ #' } #' get_coverage_wcs <- function( - wcs = c("dtm", "dsm", "omz", "omw"), + wcs = c("dtm", "dsm", "omz", "omw", "dhmv"), bbox, layername, resolution, - wcs_crs = "EPSG:4258", + wcs_crs = c("EPSG:4258", "EPSG:31370"), output_crs = "EPSG:31370", bbox_crs = "EPSG:31370", version = c("1.0.0", "2.0.1"), ...) { + # prelim check version <- match.arg(version) + wcs <- tolower(wcs) # case insensitive wcs wcs <- match.arg(wcs) wcs_crs <- match.arg(wcs_crs) bbox_crs <- match.arg(bbox_crs) + + # constrain version | wcs + if (wcs == "dhmv") { + assert_that(version == "1.0.0", + msg = "WCS `DHMV` is incompatible with versions other than `1.0.0`.") + } + # set url wcs <- switch(wcs, omz = "https://geo.api.vlaanderen.be/oi-omz/wcs", omw = "https://geo.api.vlaanderen.be/oi-omw/wcs", dtm = "https://geo.api.vlaanderen.be/el-dtm/wcs", - dsm = "https://geo.api.vlaanderen.be/el-dsm/wcs" + dsm = "https://geo.api.vlaanderen.be/el-dsm/wcs", + dhmv = "https://geo.api.vlaanderen.be/DHMV/wcs" + ) + + # assure package availability + stopifnot( + assertthat = require("assertthat", quietly = TRUE), + httr = require("httr", quietly = TRUE), + sf = require("sf", quietly = TRUE), + terra = require("terra", quietly = TRUE) ) + # data type assertions assert_that(is.character(layername)) assert_that(is.character(output_crs)) assert_that(inherits(bbox, "bbox")) - assert_that(is.numeric(resolution)) + # resolution <=0 will give a `404` + assert_that(is.numeric(resolution) && resolution > 0) + # assemble the bounding box matrix(bbox, ncol = 2, byrow = TRUE) |> as.data.frame() |> st_as_sf(coords = c("V1", "V2"), crs = bbox_crs) |> @@ -83,9 +105,10 @@ get_coverage_wcs <- function( as.vector() -> bbox names(bbox) <- c("xmin", "xmax", "ymin", "ymax") - # build url request + # prepare url request url <- parse_url(wcs) + # variant: version 2.0.1 if (version == "2.0.1") { epsg_code <- str_extract(wcs_crs, "\\d+") url$query <- list( @@ -114,17 +137,22 @@ get_coverage_wcs <- function( RESPONSE_CRS = wcs_crs, ... ) + + # build and run the http request request <- build_url(url) file <- tempfile(fileext = ".mht") - x <- GET( + http_response <- GET( url = request, write_disk(file) ) + # multipart file extract tif part unpack_mht(file) file <- str_replace(file, "mht", "tif") - } + } # /version 2.0.1 + + # variant: version 1.0.0 if (version == "1.0.0") { url$query <- list( SERVICE = "WCS", @@ -145,20 +173,25 @@ get_coverage_wcs <- function( RESPONSE_CRS = wcs_crs, ... ) + + # build and run the http request request <- build_url(url) file <- tempfile(fileext = ".tif") - x <- GET( + http_response <- GET( url = request, write_disk(file) ) } - stop_for_status(x) + # raise http errors + stop_for_status(http_response) + # assemble the spatial raster raster <- rast(file) template <- project(raster, output_crs) res(template) <- resolution raster <- project(raster, template) + return(raster) } From a1014bc8557e9261321a11add372b598e1f60f93 Mon Sep 17 00:00:00 2001 From: Falk Mielke Date: Fri, 11 Oct 2024 11:11:49 +0200 Subject: [PATCH 4/9] dhmv: vignette --- man/figures/qgis_lead.avif | Bin 0 -> 80274 bytes vignettes/spatial_dhmv_query.Rmd | 397 +++++++++++++++++++++++++++++++ 2 files changed, 397 insertions(+) create mode 100644 man/figures/qgis_lead.avif create mode 100644 vignettes/spatial_dhmv_query.Rmd diff --git a/man/figures/qgis_lead.avif b/man/figures/qgis_lead.avif new file mode 100644 index 0000000000000000000000000000000000000000..2de3cf7832a4143751ceec4a9d4c2f62b83af7d9 GIT binary patch literal 80274 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 BVb=fv literal 0 HcmV?d00001 diff --git a/vignettes/spatial_dhmv_query.Rmd b/vignettes/spatial_dhmv_query.Rmd new file mode 100644 index 0000000..93590be --- /dev/null +++ b/vignettes/spatial_dhmv_query.Rmd @@ -0,0 +1,397 @@ +--- +title: "Dissecting a WCS Query: DHMV Case Study." +output: rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{spatial_dhmv_query} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +```{r, include = FALSE} +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>" +) +``` + + + + +# DHMV Data + +Flemish government agencies host a lot of useful web services and data. Some of those are available via web services and can be found here: + +- + + +This vignette demonstrates the **query of elevation data from the Digital Elevation Model**, "Digitaal HoogteModel Vlaanderen" (DHMV). We will do it "the complicated way", assembling a web api query. [In the end](#orgd59526e), you will see how to use `inbospatial` to get the same result in a single function call. + +This vignette is somewhat related to, but goes beyond the use of Web Feature Services (WFS) for spatial data, [see this tutorial by Thierry Onkelinx](https://inbo.github.io/tutorials/tutorials/spatial_wfs_services). In particular, I will document some paths and workarounds to explore if errors occur in the default `ows4R` procedure. + +**TL;DR:** see the `?inbospatial:get_coverage_wcs` function to query DHMV (or other WCS) data of a given point in Flanders. An example can be found below. + + + + +# Situation/Motivation + +The purpose of the code below is to query elevation data for an arbitrary location in Flanders. It can be found here: + +- + +Unfortunately, documentation about the API is sparse, so let's hope it complies with given standards. + +We will use Web Coverage Services (WCS), as standardized by the Open Geospatial Consortium (OGC). More info on these services can be found [in the "Geocomputation with R" book, for example](https://r.geocompx.org/read-write#geographic-web-services). The go-to R package for WCS is `ows4R` by Emmanuel Blondel and contributors, [available on github](https://eblondel.github.io/ows4R). + +Unfortunately, neither the geocomputation book's example, nor the vignette in [the `ows4R` package](https://eblondel.github.io/ows4R/articles/wcs.html), nor [the INBO tutorial](https://inbo.github.io/tutorials/tutorials/spatial_wfs_services) could be transferred to the DHMV usecase. The code simply did not work. + +Therefore, I ended up going back to the nitty-gritty aspects of WCS by **manually building a query**. + + + + +# Limits of `ows4R` Package + +Before revealing [the solution](#org803f24d), I will document the error and my path to working around it: the core problem was not trivial to see, and you might run into similar issues. + +Because, in fact, the `ows4R` package seems functional. In the tutorial mentioned above, [the `ows4R` package](https://cran.r-project.org/web/packages/ows4R/index.html) is used to query data from web services. However, `ows4R` cannot handle all niche server API's. + +First, we need to load some packages. + +```{r setup} +require("httr") +require("sf") +require("ows4R") +require("terra") +``` + +We can connect a WCS client. + +```{r} +WCS <- WCSClient$new("https://geo.api.vlaanderen.be/DHMV/wcs", "2.0.1", logger = "INFO") +``` + + +We can easily query the capabilities: + +```{r} +caps <- WCS$getCapabilities() +``` + +This would grab the same info as you can find in this xml file: + +Note that the *capabilities* xml holds a lot of valuable information: + +- First and foremost, search it for `CoverageID`; in this case, I was interested in `DHMVII_DTM_1m`: grid coverage of the LIDAR elevation data for Flanders. +- We can also find that the Coordinate Reference System (CRS) `crsSupported` is EPSG:31370, aka. [Belgian Lambert 72](https://epsg.io/31370). Always good to know. +- Finally, the capabilities xml provides a `version`: 2.0.1 at the time of writing. Yet keep that in mind for a bit. + +The "capabilities" are, per OGC standards, your go-to place for finding API documentation. + +In R, we can receive further information conveniently via `ows4R`. This works via the "coverage summary" … + +```{r} +feature <- "DHMVII_DTM_1m" +dtm_smry <- caps$findCoverageSummaryById(feature, exact = TRUE) +dtm_smry +``` + +… and the coverage description. + +```{r} +# Get description from the WCS client +dtm_des <- WCS$describeCoverage(feature) +dtm_des +``` + + +Finally, it is important to know which dimensions are available: `LON/LAT`, `x/y`, or maybe `time`? + +```{r} +dtm_dims <- dtm_smry$getDimensions() +dtm_dims +``` + + +So far, so good. + +Now, following the tutorials to get some real data: + +```{r} +x_test <- 148600 +y_test <- 208900 +radius <- 1 # (+/- m) + +hopo_boxed <- OWSUtils$toBBOX( + xmin = x_test - radius, + xmax = x_test + radius, + ymin = y_test - radius, + ymax = y_test + radius + ) +``` + +I will write the file to disk: + +```{r, eval=FALSE} +tryCatch({ + dtm_data = dtm_smry$getCoverage( + bbox = hopo_boxed, + filename = tempfile(fileext = ".tif") + ) + dtm_data +}, error = function (err) {message(err)}) +``` + +… or, maybe not. The function fails, somehow. + +*Status quo:* + +- I receive a `tif` file (because *I called it* "tif"), supposedly some kind of GeoTIFF image (because I *asked* for `image/tiff`). +- I also receive a couple of error messages and warnings: + - *"Start tag expected, '<' not found"* + - *"cannot open this file as SpatRaster:…"* + - *"not recognized as being in a supported file format. (GDAL error 4)"* + +Maybe most useful, `ows4R` briefly displays the URL it used to attempt data query: `https://geo.api.vlaanderen.be/DHMV/wcs?service=WCS&version=2.0.1&coverageId=DHMVII_DTM_1m&subset=x(148599,148601)&subset=y(208899,208901)&format=image/tiff&request=GetCoverage` + +Let's break this URL down: + +- the desired `service` is indeed `WCS`, +- `version` is `2.0.1` (I would guess) +- `request`, `coverageID`, and `format` seem to be as expected +- there are `subset` components for the respective dimensions. + +Feel free to try yourself to paste the URL to a browser and download the file. + +Still, the downloaded file is unreadable. Subtle symptom: even if one adjusts the `subset` (i.e. `bbox` argument, above), the received tif does not change in size; the download is bbox-agnostic, so to speak. + +Opening the file with a text editor such as [vim](https://www.vim.org), we see an XML part, some generic binary stuff, some hints that this [should be a GML](https://en.wikipedia.org/wiki/Geography_Markup_Language). + +There are [sample geotiffs online](https://github.com/mommermi/geotiff_sample/blob/master/sample.tif), and they look different, or maybe not. Gml is clearly not geotiff, except maybe for the binary part (which I tried to extract, to no avail). + +The file does not download with an extension, and it is still unclear what it actually is. + + + + +# The Lead: QGIS + +Well, there is advanced software to open GeoTIFF'esque files. Or geography markup. At least some software might be able to identify what we actually have here. + +First, if R failed, Python might work. + +``` +import rasterio +import rasterio.plot + +data_name = "/tmp/test_hopo.tif" +tiff = rasterio.open(data_name) +rasterio.plot.show(tiff, title = "will this work? no!") +``` + +… but it doesn't recognize the file type as raster data. + +How about **[QGIS](https://qgis.org)?** *"Spatial Without Compromise"*, they advertise. Unfortunately, that program also was unable to open the file downloaded in R. + +However, QGIS can actually connect to WCS directly. This does not help much if you need the data in R. Yet, why not. + +Look and behold: qgis can actually connect to and query elevation data for Flanders; good indication that the `geo.api` is, somehow, functional. I could zoom and move, export images. I could even export the data. I stopped exporting the data when it threatened to entirely filled my tiny system partition (the raster data is more than 100GB) - good confirmation that we want web services for this. + +And, luckily, at some careless map movement, I received an error output from QGIS. With it, QGIS gave me a working URL to query DHMV: + +- `https://geo.api.vlaanderen.be/DHMV/wcs?SERVICE=WCS&VERSION=1.0.0&REQUEST=GetCoverage&FORMAT=GeoTIFF&COVERAGE=DHMVII_DTM_1m&BBOX=162064,165735,170953,168882&CRS=EPSG:31370&RESPONSE_CRS=EPSG:31370&WIDTH=1622&HEIGHT=574` + + +```{r echo=FALSE, out.width='90%'} +knitr::include_graphics("../man/figures/qgis_lead.avif") +``` + +Let's dissect this URL. + + + + +# The Solution: Query Building + +If you start at the question mark of the URL, and split at every ampersand, you can extract the following components from the (correct) QGIS URL: + +| **correct:** | | +|---------------------- |--------------------------------- | +| SERVICE | WCS | +| VERSION | 1.0.0 | +| REQUEST | GetCoverage | +| FORMAT | GeoTIFF | +| COVERAGE | DHMVII_DTM_1m | +| BBOX | 162064,165735,170953,168882 | +| CRS | EPSG:31370 | +| RESPONSE _CRS | EPSG:31370 | +| WIDTH | 1622 | +| HEIGHT | 574 | + +Compare this to the (unsuccessful) `ows4R` attempt: + +| **non-functional:** | | +|------------------- |--------------------------------- | +| service | WCS | +| version | 2.0.1 | +| coverageId | DHMVII_DTM_1m | +| subset | x(148599,148601) | +| subset | y(208899,208901) | +| format | image/tiff | +| request | GetCoverage | + +You can selectively shuffle and adjust components, generalizing the working query and learning about the WCS API. Which feels a bit like [fuzzing](https://en.wikipedia.org/wiki/Fuzzing) the `geo.api`. + +Here is what I found: + +- `service` (`WCS`) and `request` (`DHMVII_DTM_1m`) were correct; the latter could be swapped for different datasets +- `coverage` is the correct keyword for reading `DHMVII_DTM_1m` +- `version` must be `1.0.0`; it currently does not work with 2.0.1 +- instead of subsetting, we can use a `bbox`… +- … but a `width` and `height` of the output image are mandatory; alternatively there are `resx` and `resy` (not shown) +- we must specify a `CRS` (`EPSG:31370`), optionally also a `response_crs` +- the `format` is `GeoTIFF`; slashes are weird in URLs anyways + +After some more trial and error, I could construct working URLs in R and generalize this to a function. + +```{r} + +get_elevation_wcs <- function(x, y, radius = 1, file = NULL) { + # Please note that this function lacks a lot of + # assertions and documentation. + + # get bbox + bbox = paste(x - radius, x + radius, + y - radius, y + radius, + sep = ",") + + # the URL components + base_url = "https://geo.api.vlaanderen.be" + endpoint = "/DHMV/wcs" + + # the query parameters which worked in QGIS + elevation_query = list( + service = "WCS", + version = "1.0.0", + request = "GetCoverage", + format = "GeoTIFF", + coverage = "DHMVII_DTM_1m", + bbox = bbox, + width = 2*radius, + height = 2*radius, + crs = "EPSG:31370" + ) + + # get wcs data + if (is.null(file)) { + file = tempfile(fileext = ".tiff") + } + res = GET(url = modify_url(base_url, path = endpoint), + query = elevation_query, + write_disk(file)) + # note: saving this to a file is optional, + # but might prevent double download or loss of data + + # re-read raster file + data = rast(file) + + return(data) + +} +``` + +Example usage: + +```{r} +x_test <- 148600 +y_test <- 208900 +radius <- 10 # (+/- m) +test_raster <- get_elevation_wcs(x_test, y_test, radius = radius) + +# we can extract a value at a point: +extract(test_raster, cbind(x_test, y_test))[[1]] + +``` + + +Voila! We can now get the elevation of a given location in Flanders via DHMV web services. + + + + +# The "inbospatial" Way + +My colleague [Hans Van Calster](https://github.com/hansvancalster) had been facing the same problems with related API's a year earlier, and he wrote a function for it in [the \`inbospatial\` package](https://github.com/inbo/inbospatial). + +Here is how to use it, for the same case as above: + +```{r} +require("sf") +require("inbospatial") + +bbox <- sf::st_bbox( + c(xmin = 148000, xmax = 149000, ymin = 208000, ymax = 209000), + crs = sf::st_crs(31370) +) +hopo_raster <- get_coverage_wcs( + wcs = "DHMV", + bbox = bbox, + layername = "DHMVII_DTM_1m", + resolution = 1 +) + +plot(hopo_raster, col = gray.colors(256)) +``` + +The function gives you quite some options of API's to query data from. + + +| **wcs** | **layername** | **reference** | +|------------------- |--------------------------------- |---- | +| dtm | `EL.GridCoverage.DTM` | [here](https://www.vlaanderen.be/datavindplaats/catalogus/hoogte-dtm) | +| dsm | `EL.GridCoverage.DSM` | [here](https://www.vlaanderen.be/datavindplaats/catalogus/hoogte-dsm) | +| dhmv | `DHMVI_DTM_5m` | [here](https://metadata.vlaanderen.be/srv/dut/catalog.search#/metadata/9b0f82c7-57c4-463a-8918-432e41a66355) | +| dhmv | `DHMVII_DTM_1m` | [here](https://metadata.vlaanderen.be/srv/dut/catalog.search#/metadata/f52b1a13-86bc-4b64-8256-88cc0d1a8735) | +| dhmv | `DHMVII_DSM_1m` | [here](https://metadata.vlaanderen.be/srv/dut/catalog.search#/metadata/0da2e5e4-6886-426b-bb82-c0ffe6faeff6) | + +At a quick glance, we found that the `dtm` wcs seems to include canopy points, which is not according to definition; see here: A general advice is to confirm your data for a region you know. + +In addition, there are `oi-omz` and `oi-omw` for "zummer" and winter orthomosaic images. + +The burden of choice! + + + + +# Post Mortem + +The value of this vignette seems to be limited: in essence, it provides the specific query function arguments for elevation model queries with the `geo.api` of the Flemish digital services. Quite a niche use case. + +However, this is also a story of tracing errors in existing tools, and scraping other tools for hints. + +Can we actually trace the error back to a source? It was pure co-incidence that QGIS provided a working link, or are there general strategies? + +In retrospective, the initial issue was worsened by unfavorable circumstances. + +- `ows4R` retrieved a file, despite the wrong query; yet the error was only thrown downstream. +- Documentation for the `geo.api` is lacking (or I did not find it); in particularly I missed usage examples, vignettes, or tests. + +The colleagues at "Digitaal Vlaanderen" or the DHMV group certainly had enough work on their table, yet more documentation would be desirable. Same for `ows4R`, judging by their [github issue list](https://github.com/eblondel/ows4R/issues) (see e.g. [this one](https://github.com/eblondel/ows4R/issues/114)). On the other hand, [QGIS is free- and open source](https://en.wikipedia.org/wiki/QGIS), its queries seem to be well maintained and are accessible, errors are transparent, I could have read the source code - a good example piece of software. + +Yet in general, if you run into issues like this, do not hesitate to contact support or file a github issue. + +You should not need to fuzz an API. + +Thank you for reading, and may all your spatial api queries be successful! + + +# Table of Contents + +- [DHMV Data](#org86b1211) +- [Situation/Motivation](#org75073fb) +- [Limits of `ows4R` Package](#orge6d66b9) +- [The Lead: QGIS](#orgfaa5a3d) +- [The Solution: Query Building](#org803f24d) +- [The "inbospatial" Way](#orgd59526e) +- [Post Mortem](#org575ca41) + From ccfb7781c3af3631253876af555ca2335dd11e9b Mon Sep 17 00:00:00 2001 From: Falk Mielke Date: Fri, 18 Oct 2024 12:13:50 +0200 Subject: [PATCH 5/9] DHMV API: rebase, mht adjustment, vignette* + rebased to follow the latest dev by @hansvancalster on parallel branches + incorporated review suggestions + modified `unpack_mht()`: the function will now return the tif path + additional vignette paragraph: using DHMV `v2.0.1` --- R/get_coverage_wcs.R | 43 ++++---- vignettes/spatial_dhmv_query.Rmd | 162 +++++++++++++++++++++++++------ 2 files changed, 156 insertions(+), 49 deletions(-) diff --git a/R/get_coverage_wcs.R b/R/get_coverage_wcs.R index d92a192..2b5809c 100644 --- a/R/get_coverage_wcs.R +++ b/R/get_coverage_wcs.R @@ -67,8 +67,16 @@ get_coverage_wcs <- function( # constrain version | wcs if (wcs == "dhmv") { - assert_that(version == "1.0.0", - msg = "WCS `DHMV` is incompatible with versions other than `1.0.0`.") + # warn incompatible versions + if (!(version %in% c("1.0.0", "2.0.1")) { + message("WCS `DHMV` is only compatible with versions `1.0.0` or `2.0.1`. + Consider using `version=\"2.0.1\"`") + } + # recommend crs specification + if (wcs_crs != "EPSG:31370") { + message("WCS `DHMV` only supports CRS Belgian Lambert 72 (`EPSG:31370`). + Consider specifying `wcs_csr=\"EPSG:31370\"`") + } } # set url @@ -80,14 +88,6 @@ get_coverage_wcs <- function( dhmv = "https://geo.api.vlaanderen.be/DHMV/wcs" ) - # assure package availability - stopifnot( - assertthat = require("assertthat", quietly = TRUE), - httr = require("httr", quietly = TRUE), - sf = require("sf", quietly = TRUE), - terra = require("terra", quietly = TRUE) - ) - # data type assertions assert_that(is.character(layername)) assert_that(is.character(output_crs)) @@ -140,15 +140,14 @@ get_coverage_wcs <- function( # build and run the http request request <- build_url(url) - file <- tempfile(fileext = ".mht") + mht_file <- tempfile(fileext = ".mht") http_response <- GET( url = request, - write_disk(file) + write_disk(mht_file) ) # multipart file extract tif part - unpack_mht(file) - file <- str_replace(file, "mht", "tif") + tif_file <- unpack_mht(mht_file) } # /version 2.0.1 @@ -176,10 +175,10 @@ get_coverage_wcs <- function( # build and run the http request request <- build_url(url) - file <- tempfile(fileext = ".tif") + tif_file <- tempfile(fileext = ".tif") http_response <- GET( url = request, - write_disk(file) + write_disk(tif_file) ) } @@ -187,7 +186,7 @@ get_coverage_wcs <- function( stop_for_status(http_response) # assemble the spatial raster - raster <- rast(file) + raster <- rast(tif_file) template <- project(raster, output_crs) res(template) <- resolution raster <- project(raster, template) @@ -196,10 +195,10 @@ get_coverage_wcs <- function( } -#' Unpack or extract the `tif` file part from an `mht` file +#' Unpack or extract the `tif` file part from an `mht` file. #' #' This helper function is needed on some `WCS` services from which an `mht` -#' file is downloaded rather than a `tif` file +#' file is downloaded rather than a `tif` file; returns the path to the `tif` #' #' @param path A path to the `mht` file #' @@ -207,6 +206,8 @@ get_coverage_wcs <- function( #' @importFrom assertthat assert_that #' @importFrom stringr str_detect str_replace #' +#' @return tif_path the path to the extracted geoTIFF. +#' #' @keywords internal #' #' @details Need three ways to read in the `mht` file to get the `tif` file out. @@ -228,8 +229,10 @@ unpack_mht <- function(path) { pos_end <- length(raw_vector) - (length(lines_raw[end + 1]) + 1) tif <- raw_vector[pos_start:pos_end] + tif_path <- str_replace(path, "mht", "tif") write_file( tif, - str_replace(path, "mht", "tif") + tif_path ) + return(tif_path) } diff --git a/vignettes/spatial_dhmv_query.Rmd b/vignettes/spatial_dhmv_query.Rmd index 93590be..d7f9417 100644 --- a/vignettes/spatial_dhmv_query.Rmd +++ b/vignettes/spatial_dhmv_query.Rmd @@ -24,7 +24,7 @@ Flemish government agencies host a lot of useful web services and data. Some of - -This vignette demonstrates the **query of elevation data from the Digital Elevation Model**, "Digitaal HoogteModel Vlaanderen" (DHMV). We will do it "the complicated way", assembling a web api query. [In the end](#orgd59526e), you will see how to use `inbospatial` to get the same result in a single function call. +This vignette demonstrates the **query of elevation data from the Digital Elevation Model**, "Digitaal HoogteModel Vlaanderen" (DHMV). We will do it "the complicated way", assembling a web API query. [In the end](#orgd59526e), you will see how to use `inbospatial` to get the same result in a single function call. This vignette is somewhat related to, but goes beyond the use of Web Feature Services (WFS) for spatial data, [see this tutorial by Thierry Onkelinx](https://inbo.github.io/tutorials/tutorials/spatial_wfs_services). In particular, I will document some paths and workarounds to explore if errors occur in the default `ows4R` procedure. @@ -120,37 +120,49 @@ Now, following the tutorials to get some real data: ```{r} x_test <- 148600 y_test <- 208900 -radius <- 1 # (+/- m) +range_m <- 2 # (+/- m) hopo_boxed <- OWSUtils$toBBOX( - xmin = x_test - radius, - xmax = x_test + radius, - ymin = y_test - radius, - ymax = y_test + radius + xmin = x_test - range_m, + xmax = x_test + range_m, + ymin = y_test - range_m, + ymax = y_test + range_m ) ``` I will write the file to disk: ```{r, eval=FALSE} + +mht_file <- tempfile(fileext = ".mht") + tryCatch({ - dtm_data = dtm_smry$getCoverage( + dtm_data <- dtm_smry$getCoverage( bbox = hopo_boxed, - filename = tempfile(fileext = ".tif") + filename = mht_file ) - dtm_data -}, error = function (err) {message(err)}) + }, error = function (err) {message(err)} +) + +raster <- rast(mht_file) + +## to solve the errors above, see below, or use: +# require("inbospatial") +# tif_file <- unpack_mht(mht_file) +# raster <- rast(tif_file) +# +# plot(raster, col = gray.colors(256)) ``` … or, maybe not. The function fails, somehow. *Status quo:* -- I receive a `tif` file (because *I called it* "tif"), supposedly some kind of GeoTIFF image (because I *asked* for `image/tiff`). +- I receive a file (an "mht" because *I called it* "mht"), supposedly some kind of GeoTIFF image (because I *asked* for `image/tiff`), yet wrapped into other data chunks. - I also receive a couple of error messages and warnings: - *"Start tag expected, '<' not found"* - *"cannot open this file as SpatRaster:…"* - - *"not recognized as being in a supported file format. (GDAL error 4)"* + - The raw file is *"not recognized as being in a supported file format. (GDAL error 4)"* Maybe most useful, `ows4R` briefly displays the URL it used to attempt data query: `https://geo.api.vlaanderen.be/DHMV/wcs?service=WCS&version=2.0.1&coverageId=DHMVII_DTM_1m&subset=x(148599,148601)&subset=y(208899,208901)&format=image/tiff&request=GetCoverage` @@ -169,7 +181,10 @@ Opening the file with a text editor such as [vim](https://www.vim.org), we see a There are [sample geotiffs online](https://github.com/mommermi/geotiff_sample/blob/master/sample.tif), and they look different, or maybe not. Gml is clearly not geotiff, except maybe for the binary part (which I tried to extract, to no avail). -The file does not download with an extension, and it is still unclear what it actually is. +The file does not download with an extension on the author's OS and browser. +On a different OS, the browser automatically extended it with ".mht". +In fact, it is [an MHT file](https://docs.fileformat.com/web/mht). +More on that [below](#mht_solution). @@ -224,7 +239,7 @@ If you start at the question mark of the URL, and split at every ampersand, you | COVERAGE | DHMVII_DTM_1m | | BBOX | 162064,165735,170953,168882 | | CRS | EPSG:31370 | -| RESPONSE _CRS | EPSG:31370 | +| RESPONSE_CRS | EPSG:31370 | | WIDTH | 1622 | | HEIGHT | 574 | @@ -256,13 +271,13 @@ After some more trial and error, I could construct working URLs in R and general ```{r} -get_elevation_wcs <- function(x, y, radius = 1, file = NULL) { +get_elevation_wcs <- function(x, y, range_m = 1, tiff_file = NULL) { # Please note that this function lacks a lot of # assertions and documentation. # get bbox - bbox = paste(x - radius, x + radius, - y - radius, y + radius, + bbox = paste(x - range_m, x + range_m, + y - range_m, y + range_m, sep = ",") # the URL components @@ -277,23 +292,23 @@ get_elevation_wcs <- function(x, y, radius = 1, file = NULL) { format = "GeoTIFF", coverage = "DHMVII_DTM_1m", bbox = bbox, - width = 2*radius, - height = 2*radius, + width = 2*range_m, + height = 2*range_m, crs = "EPSG:31370" ) # get wcs data - if (is.null(file)) { - file = tempfile(fileext = ".tiff") + if (is.null(tiff_file)) { + tiff_file = tempfile(fileext = ".tiff") } res = GET(url = modify_url(base_url, path = endpoint), query = elevation_query, - write_disk(file)) + write_disk(tiff_file)) # note: saving this to a file is optional, # but might prevent double download or loss of data # re-read raster file - data = rast(file) + data = rast(tiff_file) return(data) @@ -305,8 +320,8 @@ Example usage: ```{r} x_test <- 148600 y_test <- 208900 -radius <- 10 # (+/- m) -test_raster <- get_elevation_wcs(x_test, y_test, radius = radius) +range_m <- 10 # (+/- m) +test_raster <- get_elevation_wcs(x_test, y_test, range_m = range_m) # we can extract a value at a point: extract(test_raster, cbind(x_test, y_test))[[1]] @@ -316,12 +331,97 @@ extract(test_raster, cbind(x_test, y_test))[[1]] Voila! We can now get the elevation of a given location in Flanders via DHMV web services. +Major grain of salt: we could not use the latest version, `v2.0.1`, of the DHMV API. +This is not a minor limitation, and should be taken seriously: old versions become obsolete, break, or stop data updates. + + + + +# Using Version `2.0.1` + +Apparently, the exact symptoms of the failing query above are somewhat depending on your browser and operating system. +Your browser might detect that the file is an `mht`, or not. + + +Here is an example of how to build a query with the current version of DHMV: + +```{r} + +url <- parse_url("https://geo.api.vlaanderen.be/DHMV/wcs") + +# the query parameters which worked in QGIS +url$query <- list( + SERVICE = "WCS", + VERSION = "2.0.1", + REQUEST = "GetCoverage", + FORMAT = "image/tiff", + COVERAGEID = "DHMVII_DTM_1m", + SUBSET = "x,http://www.opengis.net/def/crs/EPSG/0/EPSG:31370(148000,149000)", + SUBSET = "y,http://www.opengis.net/def/crs/EPSG/0/EPSG:31370(208000,209000)", + SCALEFACTOR = "1", + CRS = "EPSG:31370", + RESPONSE_CRS = "EPSG:31370" +) + +request <- build_url(url) + + +# get wcs data +mht_file <- tempfile(fileext = ".mht") + +print(request) +print(mht_file) + +response <- GET(url = request, + write_disk(mht_file)) +``` + +With the `mht` specifications [found online](https://docs.fileformat.com/web/mht), it is possible to create an unpacking function, which has become part of this very package. + +```{r} +require("readr") +require("stringr") + +unpack_mht <- function(mht_filepath) { + lines_raw <- read_lines_raw(mht_filepath) + lines_char <- suppressWarnings(read_lines(mht_filepath)) + raw_vector <- read_file_raw(mht_filepath) + + start <- which(str_detect(lines_char, "^II\\*")) + end <- length(lines_raw) - 1 + pos_start <- length(unlist(lines_raw[1:(start - 1)])) + start + pos_end <- length(raw_vector) - (length(lines_raw[end + 1]) + 1) + + tif <- raw_vector[pos_start:pos_end] + tif_path <- str_replace(mht_filepath, "mht", "tif") + write_file( + tif, + tif_path + ) + return(tif_path) +} +``` + + +This way you get the elevation data extracted: + +```{r} + +tif_file <- unpack_mht(mht_file) + +raster <- rast(tif_file) +# plot(raster, col = gray.colors(256)) + +``` + + -# The "inbospatial" Way +# The "`inbospatial`" Way My colleague [Hans Van Calster](https://github.com/hansvancalster) had been facing the same problems with related API's a year earlier, and he wrote a function for it in [the \`inbospatial\` package](https://github.com/inbo/inbospatial). +We now refined the `get_coverage_wcs()` procedure to solve the `mht` issue. Here is how to use it, for the same case as above: @@ -337,6 +437,8 @@ hopo_raster <- get_coverage_wcs( wcs = "DHMV", bbox = bbox, layername = "DHMVII_DTM_1m", + version = "2.0.1", + wcs_crs = "EPSG:31370", resolution = 1 ) @@ -373,16 +475,17 @@ Can we actually trace the error back to a source? It was pure co-incidence that In retrospective, the initial issue was worsened by unfavorable circumstances. -- `ows4R` retrieved a file, despite the wrong query; yet the error was only thrown downstream. +- `ows4R` retrieved a file and produced an error; another error was only thrown downstream. Neither `ows4R`, nor `terra`, `sf`, `rasterio`, or `qgis` were able to handle `mht` files. This lack of support questions the API's design choice of packing and sending an `mht`. - Documentation for the `geo.api` is lacking (or I did not find it); in particularly I missed usage examples, vignettes, or tests. The colleagues at "Digitaal Vlaanderen" or the DHMV group certainly had enough work on their table, yet more documentation would be desirable. Same for `ows4R`, judging by their [github issue list](https://github.com/eblondel/ows4R/issues) (see e.g. [this one](https://github.com/eblondel/ows4R/issues/114)). On the other hand, [QGIS is free- and open source](https://en.wikipedia.org/wiki/QGIS), its queries seem to be well maintained and are accessible, errors are transparent, I could have read the source code - a good example piece of software. -Yet in general, if you run into issues like this, do not hesitate to contact support or file a github issue. +Yet in general, if you run into issues like this, do not hesitate to contact support or [file a github issue](https://github.com/eblondel/ows4R/issues/114). You should not need to fuzz an API. -Thank you for reading, and may all your spatial api queries be successful! + +Thank you for reading, and may all your spatial API queries be successful! # Table of Contents @@ -392,6 +495,7 @@ Thank you for reading, and may all your spatial api queries be successful! - [Limits of `ows4R` Package](#orge6d66b9) - [The Lead: QGIS](#orgfaa5a3d) - [The Solution: Query Building](#org803f24d) +- [Using Version `2.0.1`](#mht_solution) - [The "inbospatial" Way](#orgd59526e) - [Post Mortem](#org575ca41) From 72a83d21685b5f4cd239c736f16e7ba6af7f38fb Mon Sep 17 00:00:00 2001 From: Falk Mielke Date: Tue, 22 Oct 2024 14:58:26 +0200 Subject: [PATCH 6/9] DHMV API: news entry + a bug --- NEWS.md | 8 ++++++++ R/get_coverage_wcs.R | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/NEWS.md b/NEWS.md index cb0bd5e..c9856a6 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,13 @@ # inbospatial 0.0.3 +## Features + +* `get_coverage_wcs()` can now query data from the Digital Elevation Model, Flanders (DHMV, "Digitaal Hoogtemodel Vlaanderen"). + +## Documentation + +* added `spatial_dhmv_query` vignette demonstrating WCS queries with and beyond `get_coverage_wcs()` + ## Bug fixes * fix parsing of `geoTIFF` part from `mht` files (internal function) diff --git a/R/get_coverage_wcs.R b/R/get_coverage_wcs.R index 2b5809c..cef0fda 100644 --- a/R/get_coverage_wcs.R +++ b/R/get_coverage_wcs.R @@ -68,7 +68,7 @@ get_coverage_wcs <- function( # constrain version | wcs if (wcs == "dhmv") { # warn incompatible versions - if (!(version %in% c("1.0.0", "2.0.1")) { + if ( !( version %in% c("1.0.0", "2.0.1") ) ) { message("WCS `DHMV` is only compatible with versions `1.0.0` or `2.0.1`. Consider using `version=\"2.0.1\"`") } From 30bf8eac4d3aa9379256834a6b6c2e12f1d4dd0a Mon Sep 17 00:00:00 2001 From: Falk Mielke Date: Tue, 22 Oct 2024 15:03:25 +0200 Subject: [PATCH 7/9] DHMV API: author @falkmielke --- vignettes/spatial_dhmv_query.Rmd | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/vignettes/spatial_dhmv_query.Rmd b/vignettes/spatial_dhmv_query.Rmd index d7f9417..a489117 100644 --- a/vignettes/spatial_dhmv_query.Rmd +++ b/vignettes/spatial_dhmv_query.Rmd @@ -1,6 +1,7 @@ --- title: "Dissecting a WCS Query: DHMV Case Study." output: rmarkdown::html_vignette +author: "Falk Mielke (falk.mielke@inbo.be)" vignette: > %\VignetteIndexEntry{spatial_dhmv_query} %\VignetteEngine{knitr::rmarkdown} @@ -420,7 +421,7 @@ raster <- rast(tif_file) # The "`inbospatial`" Way -My colleague [Hans Van Calster](https://github.com/hansvancalster) had been facing the same problems with related API's a year earlier, and he wrote a function for it in [the \`inbospatial\` package](https://github.com/inbo/inbospatial). +Colleague [Hans Van Calster](https://github.com/hansvancalster) had been facing the same problems with related API's a year earlier, and he wrote a function for it in [the \`inbospatial\` package](https://github.com/inbo/inbospatial). We now refined the `get_coverage_wcs()` procedure to solve the `mht` issue. Here is how to use it, for the same case as above: @@ -465,7 +466,7 @@ The burden of choice! -# Post Mortem +# *Post Mortem* The value of this vignette seems to be limited: in essence, it provides the specific query function arguments for elevation model queries with the `geo.api` of the Flemish digital services. Quite a niche use case. From 98256b4f9ead75edcda2c111c66ce25c7cf2ec73 Mon Sep 17 00:00:00 2001 From: Falk Mielke Date: Tue, 22 Oct 2024 15:37:34 +0200 Subject: [PATCH 8/9] DHMV API: checklist spell checks and linting --- NEWS.md | 7 +++++-- vignettes/spatial_dhmv_query.Rmd | 16 ++++++++-------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/NEWS.md b/NEWS.md index c9856a6..eba3e0f 100644 --- a/NEWS.md +++ b/NEWS.md @@ -2,11 +2,14 @@ ## Features -* `get_coverage_wcs()` can now query data from the Digital Elevation Model, Flanders (DHMV, "Digitaal Hoogtemodel Vlaanderen"). +* `get_coverage_wcs()` can now query data from the + Digital Elevation Model, Flanders + (DHMV, ``Digitaal Hoogtemodel Vlaanderen``). ## Documentation -* added `spatial_dhmv_query` vignette demonstrating WCS queries with and beyond `get_coverage_wcs()` +* added `spatial_dhmv_query` vignette demonstrating WCS queries + with and beyond `get_coverage_wcs()` ## Bug fixes diff --git a/vignettes/spatial_dhmv_query.Rmd b/vignettes/spatial_dhmv_query.Rmd index a489117..7f32bcc 100644 --- a/vignettes/spatial_dhmv_query.Rmd +++ b/vignettes/spatial_dhmv_query.Rmd @@ -25,7 +25,7 @@ Flemish government agencies host a lot of useful web services and data. Some of - -This vignette demonstrates the **query of elevation data from the Digital Elevation Model**, "Digitaal HoogteModel Vlaanderen" (DHMV). We will do it "the complicated way", assembling a web API query. [In the end](#orgd59526e), you will see how to use `inbospatial` to get the same result in a single function call. +This vignette demonstrates the **query of elevation data from the Digital Elevation Model**, ``Digitaal HoogteModel Vlaanderen`` (DHMV). We will do it "the complicated way", assembling a web API query. [In the end](#orgd59526e), you will see how to use `inbospatial` to get the same result in a single function call. This vignette is somewhat related to, but goes beyond the use of Web Feature Services (WFS) for spatial data, [see this tutorial by Thierry Onkelinx](https://inbo.github.io/tutorials/tutorials/spatial_wfs_services). In particular, I will document some paths and workarounds to explore if errors occur in the default `ows4R` procedure. @@ -55,7 +55,7 @@ Therefore, I ended up going back to the nitty-gritty aspects of WCS by **manuall Before revealing [the solution](#org803f24d), I will document the error and my path to working around it: the core problem was not trivial to see, and you might run into similar issues. -Because, in fact, the `ows4R` package seems functional. In the tutorial mentioned above, [the `ows4R` package](https://cran.r-project.org/web/packages/ows4R/index.html) is used to query data from web services. However, `ows4R` cannot handle all niche server API's. +Because, in fact, the `ows4R` package seems functional. In the tutorial mentioned above, [the `ows4R` package](https://cran.r-project.org/web/packages/ows4R/index.html) is used to query data from web services. However, `ows4R` cannot handle all niche server APIs. First, we need to load some packages. @@ -266,7 +266,7 @@ Here is what I found: - instead of subsetting, we can use a `bbox`… - … but a `width` and `height` of the output image are mandatory; alternatively there are `resx` and `resy` (not shown) - we must specify a `CRS` (`EPSG:31370`), optionally also a `response_crs` -- the `format` is `GeoTIFF`; slashes are weird in URLs anyways +- the `format` is `GeoTIFF`; slashes are weird in URLs anyway After some more trial and error, I could construct working URLs in R and generalize this to a function. @@ -421,7 +421,7 @@ raster <- rast(tif_file) # The "`inbospatial`" Way -Colleague [Hans Van Calster](https://github.com/hansvancalster) had been facing the same problems with related API's a year earlier, and he wrote a function for it in [the \`inbospatial\` package](https://github.com/inbo/inbospatial). +Colleague [Hans Van Calster](https://github.com/hansvancalster) had been facing the same problems with related APIs a year earlier, and he wrote a function for it in [the \`inbospatial\` package](https://github.com/inbo/inbospatial). We now refined the `get_coverage_wcs()` procedure to solve the `mht` issue. Here is how to use it, for the same case as above: @@ -446,10 +446,10 @@ hopo_raster <- get_coverage_wcs( plot(hopo_raster, col = gray.colors(256)) ``` -The function gives you quite some options of API's to query data from. +The function gives you quite some options of APIs to query data from. -| **wcs** | **layername** | **reference** | +| **wcs** | **layer name** | **reference** | |------------------- |--------------------------------- |---- | | dtm | `EL.GridCoverage.DTM` | [here](https://www.vlaanderen.be/datavindplaats/catalogus/hoogte-dtm) | | dsm | `EL.GridCoverage.DSM` | [here](https://www.vlaanderen.be/datavindplaats/catalogus/hoogte-dsm) | @@ -459,7 +459,7 @@ The function gives you quite some options of API's to query data from. At a quick glance, we found that the `dtm` wcs seems to include canopy points, which is not according to definition; see here: A general advice is to confirm your data for a region you know. -In addition, there are `oi-omz` and `oi-omw` for "zummer" and winter orthomosaic images. +In addition, there are `oi-omz` and `oi-omw` for "zummer" and winter ortho-mosaic images. The burden of choice! @@ -479,7 +479,7 @@ In retrospective, the initial issue was worsened by unfavorable circumstances. - `ows4R` retrieved a file and produced an error; another error was only thrown downstream. Neither `ows4R`, nor `terra`, `sf`, `rasterio`, or `qgis` were able to handle `mht` files. This lack of support questions the API's design choice of packing and sending an `mht`. - Documentation for the `geo.api` is lacking (or I did not find it); in particularly I missed usage examples, vignettes, or tests. -The colleagues at "Digitaal Vlaanderen" or the DHMV group certainly had enough work on their table, yet more documentation would be desirable. Same for `ows4R`, judging by their [github issue list](https://github.com/eblondel/ows4R/issues) (see e.g. [this one](https://github.com/eblondel/ows4R/issues/114)). On the other hand, [QGIS is free- and open source](https://en.wikipedia.org/wiki/QGIS), its queries seem to be well maintained and are accessible, errors are transparent, I could have read the source code - a good example piece of software. +The colleagues at ``Digitaal Vlaanderen`` or the DHMV group certainly had enough work on their table, yet more documentation would be desirable. Same for `ows4R`, judging by their [github issue list](https://github.com/eblondel/ows4R/issues) (see e.g. [this one](https://github.com/eblondel/ows4R/issues/114)). On the other hand, [QGIS is free- and open source](https://en.wikipedia.org/wiki/QGIS), its queries seem to be well maintained and are accessible, errors are transparent, I could have read the source code - a good example piece of software. Yet in general, if you run into issues like this, do not hesitate to contact support or [file a github issue](https://github.com/eblondel/ows4R/issues/114). From dcb3e83d7fdfcd4acafda88b66b4dbb22bb3c891 Mon Sep 17 00:00:00 2001 From: Falk Mielke Date: Tue, 22 Oct 2024 15:50:11 +0200 Subject: [PATCH 9/9] DHMV API: checklist adjustments --- _pkgdown.yml | 2 ++ man/get_coverage_wcs.Rd | 9 +++++---- man/unpack_mht.Rd | 7 +++++-- vignettes/spatial_dhmv_query.Rmd | 8 ++++---- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/_pkgdown.yml b/_pkgdown.yml index f724786..7bcd842 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -26,6 +26,8 @@ authors: href: "https://github.com/florisvdh" Hans Van Calster: href: "https://github.com/hansvancalster" + Falk Mielke: + href: "https://github.com/falkmielke" reference: - title: Functions for getting or displaying data from web services diff --git a/man/get_coverage_wcs.Rd b/man/get_coverage_wcs.Rd index 95afc33..5ad289c 100644 --- a/man/get_coverage_wcs.Rd +++ b/man/get_coverage_wcs.Rd @@ -5,11 +5,11 @@ \title{Get a layer from a web coverage service within a bounding box} \usage{ get_coverage_wcs( - wcs = c("dtm", "dsm", "omz", "omw"), + wcs = c("dtm", "dsm", "omz", "omw", "dhmv"), bbox, layername, resolution, - wcs_crs = "EPSG:4258", + wcs_crs = c("EPSG:4258", "EPSG:31370"), output_crs = "EPSG:31370", bbox_crs = "EPSG:31370", version = c("1.0.0", "2.0.1"), @@ -17,7 +17,7 @@ get_coverage_wcs( ) } \arguments{ -\item{wcs}{One of \code{"dtm"}, \code{"dsm"}, \code{"omz"}, \code{"omw"}} +\item{wcs}{One of \code{"dtm"}, \code{"dsm"}, \code{"omz"}, \code{"omw"}, \code{"dhmv"}} \item{bbox}{An object of class bbox of length 4.} @@ -51,7 +51,8 @@ The following WCS services can currently be used: \item \code{"omw"}: orthophotomosaic winter images Flanders \item \code{"dtm"}: digital terrain model Flanders \item \code{"dsm"}: digital surface model Flanders -See \href{https://metadata.vlaanderen.be/metadatacenter/srv/dut/catalog.search#/search?keyword=OGC:WCS}{metadata Vlaanderen} for more information # nolint: line_length_linter. +\item \code{"dhmv"}: digital elevation model Flanders (contains dtm and dsm data) +See \href{https://metadata.vlaanderen.be/srv/eng/catalog.search#/search?any=WCS}{metadata Vlaanderen} for more information # nolint: line_length_linter. } } \examples{ diff --git a/man/unpack_mht.Rd b/man/unpack_mht.Rd index 3c594e8..c7b93f7 100644 --- a/man/unpack_mht.Rd +++ b/man/unpack_mht.Rd @@ -2,16 +2,19 @@ % Please edit documentation in R/get_coverage_wcs.R \name{unpack_mht} \alias{unpack_mht} -\title{Unpack or extract the \code{tif} file part from an \code{mht} file} +\title{Unpack or extract the \code{tif} file part from an \code{mht} file.} \usage{ unpack_mht(path) } \arguments{ \item{path}{A path to the \code{mht} file} } +\value{ +tif_path the path to the extracted geoTIFF. +} \description{ This helper function is needed on some \code{WCS} services from which an \code{mht} -file is downloaded rather than a \code{tif} file +file is downloaded rather than a \code{tif} file; returns the path to the \code{tif} } \details{ Need three ways to read in the \code{mht} file to get the \code{tif} file out. diff --git a/vignettes/spatial_dhmv_query.Rmd b/vignettes/spatial_dhmv_query.Rmd index 7f32bcc..bc97ddf 100644 --- a/vignettes/spatial_dhmv_query.Rmd +++ b/vignettes/spatial_dhmv_query.Rmd @@ -60,10 +60,10 @@ Because, in fact, the `ows4R` package seems functional. In the tutorial mentione First, we need to load some packages. ```{r setup} -require("httr") -require("sf") -require("ows4R") -require("terra") +library("httr") +library("sf") +library("ows4R") +library("terra") ``` We can connect a WCS client.