geosphere/0000755000176200001440000000000014677706706012257 5ustar liggesusersgeosphere/MD50000644000176200001440000002356014677706706012575 0ustar liggesusers7f22976807c2cc107c3f2f88362a3e96 *ChangeLog bf70aefe51169130e4dadc3936c9957c *DESCRIPTION 823071db3a642bdc2d26dacadcff50ea *NAMESPACE ea5fcc0276d17d2012801761b5c911b8 *R/RcppExports.R 43807c455fbc2424fe107fcb978a79d0 *R/alongTrack.R c603e867d2d36b565c0223b52c1c769e *R/antipodal.R c85737b543ca52765261f0d48c44ff6e *R/areaPolygon.R b32846602a0f755c189e48bae7d59a06 *R/bearing.R 495cb8e6ca1422490b1c6058f9450a46 *R/bearingRhumb.R aeefe269b66e57f93cdd2acf0547321f *R/centroid.R 1743d120f033b849e8e77ca463d7c815 *R/daylength.R 1e9e4acd9a27238f46135af46902db60 *R/destPoint.R 19e711a9e49bbc7200d3d6a92af583c5 *R/destPointRhumb.R 825ed606555476f8b20a40c25b34a63b *R/dist2Line.R 7f333bbd90b64c3aa7f9d34b39ed539d *R/dist2gc.R ef4a2cf12c3ed6b1f6c685ad3c9640d6 *R/distCosines.R 30118ba1a360d8679c7f8885f76a2f32 *R/distGeo.R e46f596d3547a7918d737a7d1c4b43ff *R/distHaversine.R 0fc2aa7858bca0fcde0168aecafc3582 *R/distMeeus.R b76298022a9e7e04a41bed4963e4f31d *R/distRhumb.R d86e0dbc3e707a4e765afa6d4ecc7b76 *R/distVincentyEllipsoid.R c91231d7fd536e01af2bcebf5266f40c *R/distVincentySphere.R e5d8a111f45a8958d3c1550365ac8be1 *R/distm.R a8fd9e76e34b8ba76855fb68e0268c5b *R/finalBearing.R 71f5cb986eea1e42b7af9a26f358fd6d *R/gcIntermediate.R 7907332e1c86fd152dba4944eeac4c5e *R/gcIntersect.R df3e5ff050196f694dcb830909576d54 *R/gcIntersectBearing.R 4983e28ab7a610326903f3f8c968e346 *R/gcLat.R 9ee61a5e62351c7c8693abbf7a25b103 *R/gcLon.R 3195f1d7d786a931e8f07307bab61d62 *R/gcMaxLat.R ed6f29123a6c6eb832574e97e4fb9ec7 *R/geocode.R d0057355a3a1dfd076e94db19a958e77 *R/geodesic.R 2081dca1de87b02dd38dee2d21857e58 *R/geomean.R e05b9ce8c5b6851519e138156fa0527d *R/geomedian.R e83d7662049f48f412d7f54a5766c3c8 *R/greatCircle.R 2818b0933c09267f0c05b1ae07bec869 *R/greatCircleBearing.R 088fe0172bbf3794e16cecc29e17a3ee *R/helper.R ea4c7189b67965e4517e648f27e062b2 *R/horizon.R a6cb94430b50c900a10f0d8fce1b6102 *R/lengthLine.R 2fe3bf69af5f16df458a3e21ae436978 *R/makePoly.R 323eadc05c03f5d11b51558ec412640d *R/mercator.R 430c0a96d811acc0eb31638a108ef44b *R/midPoint.R 13f88662ae5bcb6f0584facd6bd57e29 *R/old_destPoint.R caba5729f0e9429c56c9e6dd6c0d4b3c *R/onGreatCircle.R 70aa176635f101570c71808e71c4353a *R/perimeter.R e50d15fc59606d5967fbaaf2ff495739 *R/plotPoly.R 1c72c4ba1c75cdc485bb545238459995 *R/pointsToMatrix.R 63372c1d29b6fd85bc82e2695ef831cf *R/randomCoordinates.R ad94d2fb3c7bab9fcc660132ae3534bb *R/refEllipsoids.R a0903ff2b54c613bedcd723a0b3784f7 *R/regularCoordinates.R 4400c83027e73243e6d8e9f30075dda2 *R/sampleAlong.R ff01ac40ecb1cd5d7051ffbfe7c2d64d *R/span.R b54db8794555342c4feee5fe0b1b8f5b *build/partial.rdb 3c25c136eded52ef9afec56b9ca679b7 *build/vignette.rds 990871f1c55db0d5b160d786c86e6850 *data/merc.RData 464a29b93751536caa7f2cf583124960 *data/wrld.RData 538f4c2b1ae4ddf2242766b02f340b1d *inst/doc/geosphere.R 5090e95e97f748525ed9905c51309b22 *inst/doc/geosphere.Rnw e3493e9cfb8090bda87f77e9a5fe0337 *inst/doc/geosphere.pdf 81ce1c4eb1d5bd1302cd0e07987e9186 *man/OSGB.Rd 6d96299e3d47a6bc59572c331080d5c6 *man/alongTrackDistance.Rd e3149675013c8042a7e4b1d189ebb502 *man/antipode.Rd 2c3927acdf4de92b9470bea1cb288079 *man/area.Rd 3c1e67195e91c173dab816fa1ef556a5 *man/bearing.Rd 759fd642d8d30a6e4df829f4ad83e96d *man/bearingRhumb.Rd 9f635d7f7c92d5a35ca58634f9d4aca0 *man/centroid.Rd 5313bdcb42b9f847a3cfe5a6662122f1 *man/data.Rd 919193497deae5b71e7b2ce8586aa695 *man/daylength.Rd bb669fa8d574e4635055b22f1d50f4c6 *man/destPoint.Rd 8c9abb053076948c843bb6aee5bc8255 *man/destPointRhumb.Rd 308ded364b826af6300a8fdd4ef87ef9 *man/dist2gc.Rd 01a22370f20c44a9caaa72f910c6e514 *man/dist2line.Rd c5f5fb73bb34f9a26752da3e52111dba *man/distCosine.Rd dd141627647789d50a684905fcc436a0 *man/distGeo.Rd fe4749f348de0dfc5e40628e2e0d3359 *man/distHaversine.Rd 18bf5b4b4721eaa101e44787e6c3cb0e *man/distMeeus.Rd 6b58e5faa130ae3e37cfe14ca51c94b0 *man/distRhumb.Rd e885d31e77b4c95b3fc5f38b1ffc2524 *man/distVincentyEllipsoid.Rd e4e1780d70108de0d7bd8e9fc864490b *man/distVincentySphere.Rd afa1c56dd3db517d3d1605943a1c1826 *man/distm.Rd 4b6f1d4603bc1b515b02b5e00f33b356 *man/finalDirection.Rd 3c4b544ec73c1fe20b6071539c427a0a *man/gcIntersect.Rd 45cb5bd7816f9245b501a0cc194185e4 *man/gcIntersectBearing.Rd 6cb89752de06fa903cd398aeff8f7eba *man/gcLat.Rd 4765b6196ab47333898170efd8dfccb2 *man/gcLon.Rd ac3f7fabfe8b312bb0a432305d2d4d15 *man/gcMaxLat.Rd 6fa655576b9ef5b129e1f4d840772857 *man/geodesic.Rd 48cb8c3ad419c5c376828521bcae65c2 *man/geomean.Rd 10e81cd9f8a6e505dd79e4583749bf99 *man/geosphere-package.Rd 4e7069024be6c2df3c285532b4a09a3f *man/greatCircle.Rd 1fb55c4fcc4dc6832a62ed972ed21e72 *man/greatCircleBearing.Rd 2fe4ad438c887c4afa1b6ab8ec397c8e *man/horizon.Rd b5f2fe72f907c3f528e62213eb87a231 *man/intermediate.Rd f4041cf233eff9ff59f433466b12c72b *man/lengthLine.Rd f914ee7fb7d8814771cc6b9030d80874 *man/makepoly.Rd bb5594fa360f7bd43ce0e5a3e7669765 *man/mercator.Rd 1f4501ca3c843ed15e7fad9ede71fbd7 *man/midPoint.Rd 59e5771608c5cd49199e43247d7322c5 *man/onGreatCircle.Rd d6584b12201babdd088d975b602765a3 *man/perimeter.Rd 9c6d6bf5d20a721a18e2ecc43b93b53c *man/plotArrows.Rd a62b2968097c05ee51730cf47c42bd02 *man/randomCoordinates.Rd 03ee9e2645c0d185463b1b7d39096280 *man/refEllipsoids.Rd e5a815ce847782faf61535d948b2681f *man/span.Rd a4f1af295fda57e6a3112e05ad49f5d0 *src/Accumulator.cpp 0aa8161898fd7d220aa8c9a6e55cfd7e *src/Accumulator.h 65d999d849559059880d30fa17c728df *src/AlbersEqualArea.cpp 613e27b027ce4a7d01e20f1c17ad1a17 *src/AlbersEqualArea.h 4f720c6a7880cac42563a6082aeb2430 *src/AzimuthalEquidistant.cpp 454f2764ef60b26ec4bca4d40db98a39 *src/AzimuthalEquidistant.h 66d28d9f0cd1a13c9d683b4092f7e545 *src/CassiniSoldner.cpp 9ad224a201a50f809afca481fed300e2 *src/CassiniSoldner.h f863389f50c731b61342aa30a9b2bf0e *src/CircularEngine.cpp 51e082771fb0efc9c3a3c8b3e78dd846 *src/CircularEngine.h b02a5ff1471c0c641e0f9552a6a02915 *src/Config.h 298f0446b13a6e9bc1c81482b4f4a0be *src/Constants.h 176494ce4ccf4d95521ce3e9b29dbb30 *src/DMS.cpp 452e04ac606d08eee8472f294d44dd55 *src/DMS.h bd4d742a4990b8c1b4190fefcfcf9926 *src/DST.cpp 84d4f37b1a949a3ae8a6bf560fa84846 *src/DST.h 2b15aa4044b0ac7d62596ce1561e2235 *src/Ellipsoid.cpp ba65b0b4b14faebc65ffcb360435575b *src/Ellipsoid.h cc2aac2c8587b421d8d7dc0cccbe50ec *src/EllipticFunction.cpp 270b441b7b7219a5a7a626793cf35d97 *src/EllipticFunction.h 15df156ad40a67e891718bc1c43f1f05 *src/GARS.cpp e8a9fc1081d2a90896e2cb4aba68cb17 *src/GARS.h 07f41ba8d52fdf4665569924a365c5c8 *src/GeoCoords.cpp 2fb3588bd0380ee788a8f1b19c6a7e35 *src/GeoCoords.h 42b5f8ec7145a610f7560d7a150f7c79 *src/Geocentric.cpp 9e186369dab5d975104449329300ccfc *src/Geocentric.h 0828f7d35c55c3fae12dff14af00f59f *src/Geodesic.cpp 5e03c52f08e49ada7587c69cde93b875 *src/Geodesic.h d626029da193038b914444ec50aff59e *src/GeodesicExact.cpp cd6c9f983799b305fd0fdad2fbc2d351 *src/GeodesicExact.h 1c52e19fffbe0b675d6102082d16355e *src/GeodesicExactC4.cpp 859bd28e47472e5c05c9c6c0122d561c *src/GeodesicLine.cpp 992e0cade521fe85ceddc6918af16540 *src/GeodesicLine.h 3b472239ba504d61d695d3dba9f30ec6 *src/GeodesicLineExact.cpp 73dd836a7fb8b8fd3a28a003bbea5903 *src/GeodesicLineExact.h b6463220d42691c0ffb93c2952b9dcef *src/Geohash.cpp 21feff1fa04d3fcc78b69f2dcd46a69c *src/Geohash.h 4dd9826e6d83b6c89d08685294bb2f14 *src/Geoid.cpp 724cc4f25313567d721c14c436eed644 *src/Geoid.h b84e90f1cb351d21452131a728a7d7ec *src/Georef.cpp 775509d3fca422cc65728bac75584318 *src/Georef.h 428e1035348953548c711941539b369d *src/Gnomonic.cpp 397e20abfb0bd202be28690e906f12ed *src/Gnomonic.h 02bf2d8b4380c368bdf6a8fc48199224 *src/GravityCircle.cpp ba5d092850216e35155d1b3c03846e8e *src/GravityCircle.h dd0035dc88ca6a93a7098d0f3c9272a4 *src/GravityModel.cpp 6ce12d35eda74e4d86d5e70da03a18e6 *src/GravityModel.h 9676b43e04fe0e0be8218144f66e5dee *src/LambertConformalConic.cpp 7df7fc01a622e363fa92ce373f2d9a66 *src/LambertConformalConic.h b347319eb57a2ac97c4b69f9162a31b1 *src/LocalCartesian.cpp 54bea88bffa43fdc3ae2459a896f7c0e *src/LocalCartesian.h b882be74d9757cd7ae2f048a674bc2d7 *src/MGRS.cpp 18d923b5a882e3c84cf55f73f602c6ea *src/MGRS.h 30bb9f629d15f6418326fb0d37f75caf *src/MagneticCircle.cpp 1ae0eebc6b24213eb5e42a9a8b6093ff *src/MagneticCircle.h 969e8862c07dd85a0ef4c380a8efca6e *src/MagneticModel.cpp ef25fdb0f3ed45c3c9fa15d47635032a *src/MagneticModel.h 382eb547fdb12d134f16ee34551e5ee5 *src/Math.cpp b3c07ab34c65495e5a3b9a1dcc5d885f *src/Math.h 0ea1f1f5292380a4a12b056995b8aa9b *src/NearestNeighbor.h 4f06f0e83ccd2997b9789a5a9dd60d39 *src/NormalGravity.cpp 6ec1fd88fa880c3ed2baba6677157457 *src/NormalGravity.h 9652d30e99789c0f098382e99ae9e3cc *src/OSGB.cpp 8d25b4cba73c7ebcee26bf733d1a6b5c *src/OSGB.h faf0e1ef694e3213d70ecc94aaa1db14 *src/PolarStereographic.cpp dfecb81a62c645b639b2010a755e1e62 *src/PolarStereographic.h e653d09c1005ae3c416a1aba45e1c89c *src/PolygonArea.cpp c3c9f2cd934cfb88631a7357973ef315 *src/PolygonArea.h 76a3ffc6ea694b29cbde3bc8db11a5b8 *src/RcppExports.cpp 4e696b8deb94baf24c9afbd3d0f034b0 *src/Rhumb.cpp 6c7010c04e7686a0204a6077c0fd024d *src/Rhumb.h 73f7f8dc4e2831e69c6ac126301f0491 *src/SphericalEngine.cpp 63c9ca32661471b1cbb24a90922b98a7 *src/SphericalEngine.h 8c2a6941999f8214a3c3eb352efbc5ca *src/SphericalHarmonic.h b015765fc4db3a70714508bc05060835 *src/SphericalHarmonic1.h 95f2a6ec9b16f9eed2c713ffa35efb09 *src/SphericalHarmonic2.h 1eaf3edd3970b709c5d9bad53230e5bc *src/TransverseMercator.cpp 405c21a9998da0d1411f02f47bc038d0 *src/TransverseMercator.h bfd1353ffff0dbd4e443e633a5b8f420 *src/TransverseMercatorExact.cpp c7ea66a004d40eab0e52a5c8da649db1 *src/TransverseMercatorExact.h 3663ed9f1fa29e801ea447b1d7bd2b1b *src/UTMUPS.cpp 7798d751ed7a751ff6712e34a4ec7d12 *src/UTMUPS.h 3b07e76a301647c1ac46db3de84905d8 *src/Utility.cpp 368b04eb42039edcd6a753e06be95f48 *src/Utility.h c92e9a174ac3b5529402c9795b612356 *src/a_dist.c be6f63b3c81cd6fd1ea61be6d2ee9883 *src/a_geodesic.cpp f0f94c31254b48429601bbbf75c0790a *src/a_geolib.cpp e7ed3cfd2ceb132ccd9e7c342ba7f0a0 *src/a_util.c 02b3ab8677d52f791681845435a5252a *src/a_util.h 12d5a31445574f0a6501536eb8563800 *src/intersect.cpp d554906e5117a31c97b4ed41eecafb09 *src/kissfft.h 5090e95e97f748525ed9905c51309b22 *vignettes/geosphere.Rnw geosphere/R/0000755000176200001440000000000014677357014012452 5ustar liggesusersgeosphere/R/gcIntermediate.R0000644000176200001440000000632114172663435015520 0ustar liggesusers# author Robert Hijmans # October 2009 # version 0.1 # license GPL .interm <- function(p1, p2, n) { toRad <- pi / 180 if (antipodal(p1, p2)) { return(rep(Inf, nrow(p1))) } if (isTRUE(all.equal(p1, p2))) { return(cbind(rep(p1[,1], nrow(p1)), rep(p1[,2], nrow(p1)) )) } d <- distCosine(p1, p2, r=1) lon1 <- p1[,1] * toRad lat1 <- p1[,2] * toRad lon2 <- p2[,1] * toRad lat2 <- p2[,2] * toRad n <- max(round(n), 1) f <- 1:n / (n+1) A <- sin((1-f)*d) / sin(d) B <- sin(f*d) / sin(d) x <- A*cos(lat1)*cos(lon1) + B*cos(lat2)*cos(lon2) y <- A*cos(lat1)*sin(lon1) + B*cos(lat2)*sin(lon2) z <- A*sin(lat1) + B*sin(lat2) lat <- atan2(z,sqrt(x^2+y^2)) lon <- atan2(y,x) cbind(lon,lat)/toRad } .breakAtDateLine <- function(x) { r <- range(x[,1]) r <- r[2] - r[1] if (r > 200) { dif <- abs(x[-nrow(x),1] - x[-1,1]) tr <- which(dif==max(dif)) x1 <- x[1:tr, ,drop=FALSE] x2 <- x[(tr+1):nrow(x), ,drop=FALSE] if (x1[tr,1] < 0) { x1[tr,1] <- -180 x2[1,1] <- 180 } else { x1[tr,1] <- 180 x2[1,1] <- -180 } if (nrow(x1) <= 1) { res <- x2 } else if (nrow(x2) <= 1) { res <- x1 } else { res <- list(x1, x2) } return(res) } return(x) } gcIntermediate <- function( p1, p2, n=50, breakAtDateLine=FALSE, addStartEnd=FALSE, sp=FALSE, sepNA=FALSE) { # Intermediate points on a great circle # source: http://www.edwilliams.org/avform.htm p1 <- .pointsToMatrix(p1) p2 <- .pointsToMatrix(p2) p <- cbind(p1[,1], p1[,2], p2[,1], p2[,2], as.vector(n)) res <- list() for (i in 1:nrow(p)) { x <- .interm(p[i,1:2,drop=FALSE], p[i,3:4,drop=FALSE], p[i,5]) if (addStartEnd) { x <- rbind(p[i,1:2,drop=FALSE], x, p[i,3:4,drop=FALSE]) } if (breakAtDateLine) { res[[i]] <- .breakAtDateLine(x) } else { res[[i]] <- x } } if (sp) { for (i in 1:length(res)) { if (! is.list(res[[i]])) { res[[i]] <- Lines( list( Line (res[[i]])), ID=as.character(i)) } else { res[[i]] <- Lines( list( Line (res[[i]][[1]]), Line(res[[i]][[2]])), ID=as.character(i)) } } res <- SpatialLines(res, CRS("+proj=longlat +ellps=WGS84")) } else if (nrow(p) == 1 ) { res <- res[[1]] } else if (sepNA) { r <- res[[1]] for (i in 2:length(res)) { r <- rbind(r, c(NA,NA), res[[i]]) } return(r) } return(res) } .geodIntermediate <- function(p1, p2, n=50, breakAtDateLine=FALSE, addStartEnd=TRUE, sepNA=FALSE) { a=6378137 f=1/298.257223563 p1 <- .pointsToMatrix(p1) p2 <- .pointsToMatrix(p2) p <- cbind(p1[,1], p1[,2], p2[,1], p2[,2], as.vector(n)) res <- list() for (i in 1:nrow(p)) { x <- .geod_intermediate(p[i,1], p[i,2], p[i,3], p[i,4], p[i,5], -1, TRUE, a, f) x <- .interm(p[i,1:2,drop=FALSE], p[i,3:4,drop=FALSE], p[i,5]) if (!addStartEnd) { x <- x[-c(1, nrow(x)), ,drop=FALSE] } if (breakAtDateLine) { res[[i]] <- .breakAtDateLine(x) } else { res[[i]] <- x } } if (nrow(p) == 1 ) { res <- res[[1]] } else if (sepNA) { r <- res[[1]] for (i in 2:length(res)) { r <- rbind(r, c(NA,NA), res[[i]]) } return(r) } return(res) } geosphere/R/old_destPoint.R0000644000176200001440000000231313472155746015403 0ustar liggesusers# author of original JavaScript code: Chris Vennes # (c) 2002-2009 Chris Veness # http://www.movable-type.co.uk/scripts/latlong.html # Licence: LGPL, without any warranty express or implied # Based on formulae by Ed Williams # http://www.edwilliams.org/avform.htm # Port to R by Robert Hijmans # October 2009 # version 0.1 # License GPL3 .old_destPoint <- function(p, b, d, r=6378137) { # calculate destination point given start point, initial bearing (deg) and distance (km) # see http:#//www.edwilliams.org/avform.htm#LL # source http://www.movable-type.co.uk/scripts/latlong.html # (c) 2002-2009 Chris Veness toRad <- pi / 180 b = as.vector(b) d = as.vector(d) r = as.vector(r) p <- .pointsToMatrix(p) p = cbind(p[,1], p[,2], b, d, r) lon1 <- p[,1] * toRad lat1 <- p[,2] * toRad b <- p[,3] * toRad d = p[,4] r = p[,5] lat2 <- asin( sin(lat1)*cos(d/r) + cos(lat1)*sin(d/r)*cos(b) ) lon2 <- lon1 + atan2(sin(b)*sin(d/r)*cos(lat1), cos(d/r)-sin(lat1)*sin(lat2)) lon2 <- (lon2+pi)%%(2*pi) - pi #// normalise to -180...+180 lon2[is.nan(lon2)] <- NA lat2[is.nan(lat2)] <- NA res <- cbind(lon2, lat2) / toRad colnames(res) <- c('lon', 'lat') return(res) } geosphere/R/distCosines.R0000644000176200001440000000242313472155746015065 0ustar liggesusers# Author: Robert J. Hijmans # Date : June 2008 # Licence GPL v3 # distance based on law of cosines # http://en.wikipedia.org/wiki/Great_circle_distance distCosine <- function(p1, p2, r=6378137) { p1 <- .pointsToMatrix(p1) if (missing(p2)) { p2 <- p1[-1, ,drop=FALSE] p1 <- p1[-nrow(p1), ,drop=FALSE] } else { p2 <- .pointsToMatrix(p2) } pp <- cbind(p1[,1], p1[,2], p2[,1], p2[,2], as.vector(r)) # remove identical points to avoid errors due to floating point math # problem reported by Bill Monahan i <- rowSums(abs(pp[, 1:2, drop=FALSE] - pp[, 3:4, drop=FALSE]) < .Machine$double.eps ^ 0.5) < 2 p <- pp[i, ,drop=FALSE] r <- rep(0, nrow(pp)) if (nrow(p) > 0) { p[,1:4] <- p[,1:4] * pi / 180 r[i] <- acos( sin(p[,2]) * sin(p[,4]) + cos(p[,2]) * cos(p[,4]) * cos(p[,1]-p[,3]) ) * p[,5] } r } # m = matrix(c(-58.65222,-19.65154,-52.985550,-1.484869, -69.652220, 7.348464, -69.652220,7.348464, -1,1 ,-1,1, -1,1.1,-1,1.1, -1,1.2,-1,1.2, -116.65220,72.01513,-121.48560,53.34847), ncol=4, byrow=T) # distCosine(m[,1:2], m[,3:4]) # n <- nrow(p) # d <- vector("double", n) # d <- .C('distance', as.integer(n), as.double(p[,1]), as.double(p[,2]), as.double(p[,3]), as.double(p[,4]), as.double(p[,5]), as.integer(1), d)[[8]] # return(d) geosphere/R/geomedian.R0000644000176200001440000000310313472155746014522 0ustar liggesusers# Author: Robert J. Hijmans # March 2012 # version 1 # license GPL3 .geomedian <- function(xy, w=NULL) { xy <- .pointsToMatrix(xy) if (is.null(w)) { w <- 1 } else if (length(w) != nrow(xy)) { stop('length of weights not correct. It should be: ', nrow(xy)) } w <- w / sum(w) xyw <- cbind(xy, w) xy <- stats::na.omit(xyw) xy <- xyw[,1:2] w <- xyw[,3] est <- geomean(xy, w) fun <- function(p) { if (p[2] > 90 | p[2] < -90) { return(Inf) } else { p[1] = (p[1] + 180) %% 360 - 180 sum( distCosine(xy, p) * w) } } opt <- stats::optim(geomean(xy), fun) if (!is.null(opt$message)) { warning(opt$message) } return(opt$par) } ..geomedian_ndcor <- function(xy, w=NULL, threshold=100, maxiter=100) { requireNamespace('raster') if (inherits(xy, 'SpatialPolygons') | inherits(xy, 'SpatialPoints')) { stopifnot(raster::isLonLat(xy)) xy <- coordinates(xy) } if (is.null(w)) { w <- 1 } else if (length(w) != nrow(xy)) { stop('length of weights not correct. It should be: ', nrow(xy)) } w <- w / sum(w) xyw <- cbind(xy, w) xy <- stats::na.omit(xyw) xy <- xyw[,1:2] w <- xyw[,3] est <- geomean(xy, w) estold <- est iter = 1 while (TRUE) { d <- distCosine(xy, est) x <- sum(w*xy[,1] / d) / sum(w/d) y <- sum(w*xy[,2] / d) / sum(w/d) est <- cbind(x,y) dif <- distCosine(est, estold) if (dif < threshold) { return(est) } else if (iter > maxiter) { warning('maxiter reached') return(est) } estold <- est iter <- iter + 1 } } geosphere/R/geodesic.R0000644000176200001440000000271714161534066014356 0ustar liggesusers# R implementation of # /* # * This is a C implementation of the geodesic algorithms described in # * # * C. F. F. Karney, # * Algorithms for geodesics, # * J. Geodesy 87, 43--55 (2013); # * https://dx.doi.org/10.1007/s00190-012-0578-z # * Addenda: http://geographiclib.sf.net/geod-addenda.html # * # * See the comments in geodesic.h for documentation. # * # * Copyright (c) Charles Karney (2012-2014) and licensed # * under the MIT/X11 License. For more information, see # * http://geographiclib.sourceforge.net/ # */ # # Robert Hijmans # May 2015 # version 1 # license GPL3 # Solve the direct geodesic problem. geodesic <- function(p, azi, d, a=6378137, f=1/298.257223563, ...) { p <- .pointsToMatrix(p) p <- cbind(p[,1], p[,2], azi, d) r <- .geodesic(as.double(p[,1]), as.double(p[,2]), as.double(p[,3]), as.double(p[,4]), as.double(a), as.double(f)) r <- matrix(r, ncol=3, byrow=TRUE) colnames(r) <- c('longitude', 'latitude', 'azimuth') r } # Solve the inverse geodesic problem. geodesic_inverse <- function(p1, p2, a=6378137, f=1/298.257223563, ...) { p1 <- .pointsToMatrix(p1) p2 <- .pointsToMatrix(p2) p <- cbind(p1[,1], p1[,2], p2[,1], p2[,2]) r <- .inversegeodesic(as.double(p[,1]), as.double(p[,2]), as.double(p[,3]), as.double(p[,4]), as.double(a), as.double(f)) r <- matrix(r, ncol=3, byrow=TRUE) colnames(r) <- c('distance', 'azimuth1', 'azimuth2') r } geosphere/R/RcppExports.R0000644000176200001440000000152214430062652015052 0ustar liggesusers# Generated by using Rcpp::compileAttributes() -> do not edit by hand # Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 .geodesic <- function(lon1, lat1, azi1, s12, a, f) { .Call(`_geosphere_geodesic`, lon1, lat1, azi1, s12, a, f) } .inversegeodesic <- function(lon1, lat1, lon2, lat2, a, f) { .Call(`_geosphere_inversegeodesic`, lon1, lat1, lon2, lat2, a, f) } .polygonarea <- function(lon, lat, a, f) { .Call(`_geosphere_polygonarea`, lon, lat, a, f) } .geod_intermediate <- function(lon1, lat1, lon2, lat2, n, distance, arc, a, f) { .Call(`_geosphere_geodesic_nodes`, lon1, lat1, lon2, lat2, n, distance, arc, a, f) } .OSGB <- function(x, y, p, geo) { .Call(`_geosphere_osgb`, x, y, p, geo) } .OSGBinv <- function(g, prec, centerp) { .Call(`_geosphere_osgb_rev`, g, prec, centerp) } geosphere/R/destPoint.R0000644000176200001440000000127014161534117014533 0ustar liggesusers# Author: Robert J. Hijmans # Date : May 2015 # Licence GPL v3 destPoint <- function(p, b, d, a=6378137, f=1/298.257223563, ...) { # calculate destination point given start point, initial bearing (deg) and distance (m) r <- list(...)$r if (!is.null(r)) { # for backwards compatibility return( .old_destPoint(p, b, d, r=r) ) } b <- as.vector(b) d <- as.vector(d) p <- .pointsToMatrix(p) p <- cbind(p[,1], p[,2], b, d) r <- .geodesic(as.double(p[,1]), as.double(p[,2]), as.double(p[,3]), as.double(p[,4]), as.double(a), as.double(f)) r <- matrix(r, ncol=3, byrow=TRUE) colnames(r) <- c('lon', 'lat', 'finalbearing') return(r[, 1:2, drop=FALSE]) } geosphere/R/gcLon.R0000644000176200001440000000262613472155746013645 0ustar liggesusers# author Robert Hijmans # October 2009 # version 0.1 # license GPL3 # based on #http://www.edwilliams.org/avform.htm#Par gcLon <- function(p1, p2, lat) { # longitudes at which a given great circle crosses a given parallel # source: http://www.edwilliams.org/avform.htm toRad <- pi / 180 p1 <- .pointsToMatrix(p1) p2 <- .pointsToMatrix(p2) p <- cbind(p1[,1], p1[,2], p2[,1], p2[,2], lat) p1 <- p[,1:2,drop=FALSE] p2 <- p[,3:4,drop=FALSE] lat <- p[,5] res <- matrix(NA, nrow=nrow(p1), ncol=2) colnames(res) <- c('lon1', 'lon2') anti <- ! antipodal(p1, p2) if (sum(anti) == 0) { return(res) } p1 <- p1[anti, ,drop=FALSE] * toRad p2 <- p2[anti, ,drop=FALSE] * toRad lon1 <- p1[,1] * -1 lat1 <- p1[,2] lon2 <- p2[,1] * -1 lat2 <- p2[,2] lat3 <- lat * toRad l12 <- lon1-lon2 A <- sin(lat1)*cos(lat2)*cos(lat3)*sin(l12) B <- sin(lat1)*cos(lat2)*cos(lat3)*cos(l12) - cos(lat1)*sin(lat2)*cos(lat3) C <- cos(lat1)*cos(lat2)*sin(lat3)*sin(l12) lon <- atan2(B,A) lon3 <- matrix(NA, nrow=length(lon1), ncol=2) i <- (abs(C) > sqrt(A^2 + B^2)) | (sqrt(A^2 + B^2) == 0) lon3[i,] <- NA i <- !i dlon <- rep(NA, length(A)) dlon[i] <- acos(C[i]/sqrt(A[i]^2+B[i]^2)) lon3[i,1] <- .normalizeLonRad(lon1[i]+dlon[i]+lon[i]) lon3[i,2] <- .normalizeLonRad(lon1[i]-dlon[i]+lon[i]) res[anti,] <- -1 * lon3 / toRad return(res) } geosphere/R/daylength.R0000644000176200001440000000326514334225267014554 0ustar liggesusers# Author: Robert J. Hijmans, r.hijmans@gmail.com # License GPL3 # Version 0.1 January 2009 daylength <- function(lat, doy) { if (inherits(doy, "Date") || inherits(doy, "character")) { doy <- as.character(doy) doy <- as.numeric(format(as.Date(doy), "%j")) } else { doy <- (doy-1) %% 365 + 1 } lat[lat > 90 | lat < -90] <- NA #Forsythe, William C., Edward J. Rykiel Jr., Randal S. Stahl, Hsin-i Wu and Robert M. Schoolfield, 1995. #A model comparison for daylength as a function of latitude and day of the year. Ecological Modeling 80:87-95. P <- asin(0.39795 * cos(0.2163108 + 2 * atan(0.9671396 * tan(0.00860*(doy-186))))) a <- (sin(0.8333 * pi/180) + sin(lat * pi/180) * sin(P)) / (cos(lat * pi/180) * cos(P)) a <- pmin(pmax(a, -1), 1) DL <- 24 - (24/pi) * acos(a) return(DL) } .daylength2 <- function(lat, doy) { if (inherits(doy, "Date") || inherits(doy, "character")) { doy <- as.character(doy) doy <- as.numeric(format(as.Date(doy), "%j")) } else { doy <- (doy-1) %% 365 + 1 } lat[lat > 90 | lat < -90] <- NA doy <- (doy-1) %% 365 + 1 # after Goudriaan and Van Laar RAD <- pi/180 # Sine and cosine of latitude (LAT) SINLAT <- sin(RAD * lat); COSLAT <- cos(RAD * lat); # Maximal sine of declination;} SINDCM <- sin(RAD * 23.45) #{Sine and cosine of declination (Eqns 3.4, 3.5);} SINDEC <- -SINDCM * cos(2*pi*(doy+10)/365) COSDEC <- sqrt(1-SINDEC*SINDEC); #The terms A and B according to Eqn 3.3;} A <- SINLAT*SINDEC; B <- COSLAT*COSDEC; C <- A/B; #Daylength according to Eqn 3.6; arcsin(c) = arctan(c/sqrt(c*c+1))} DAYL <- 12* (1+(2/pi)* atan(C/sqrt(C*C+1))) return(DAYL) } geosphere/R/dist2gc.R0000644000176200001440000000130613472155746014134 0ustar liggesusers# based on code by Ed Williams # Licence: GPL # http://www.edwilliams.org/avform.htm#XTE # Port to R by Robert Hijmans # October 2009 # version 0.1 # license GPL3 dist2gc <- function(p1, p2, p3, r=6378137, sign=FALSE) { toRad <- pi / 180 p1 <- .pointsToMatrix(p1) p2 <- .pointsToMatrix(p2) p3 <- .pointsToMatrix(p3) r <- as.vector(r) p <- cbind(p1[,1], p1[,2], p2[,1], p2[,2], p3[,1], p3[,2], r) p1 <- p[,1:2] p2 <- p[,3:4] p3 <- p[,5:6] r <- p[,7] tc <- bearing(p1, p2, a=r, f=0) * toRad tcp <- bearing(p1, p3, a=r, f=0) * toRad dp <- distCosine(p1, p3, r=1) xtr <- (asin(sin(tcp-tc) * sin(dp)) * r) xtr <- as.vector(xtr) if (!sign) xtr <- abs(xtr) xtr } geosphere/R/plotPoly.R0000644000176200001440000000356313472155746014426 0ustar liggesusers# Author: Robert Hijmans # April 2010 # version 0.1 # license GPL # inspired by an example in Software for Data Analysis by John Chambers (pp 250-1) # but adjusted to follow great circles, rather than straight (2D) lines. .doArrows <- function(p, line, fraction, length, interval, ...) { if (fraction >= 1) { graphics::lines(line, ...) } else { dist <- distGeo(p[-nrow(p),], p[-1,]) * (1 - fraction) bearing <- bearing(p[-nrow(p),], p[-1,]) p0 <- destPoint(p[-nrow(p),], bearing, dist) for (i in 1:nrow(p0)) { line = .makeSinglePoly(rbind(p0[i,], p[i+1,]), interval=interval) graphics::lines(line) } } bearing = finalBearing(p[-nrow(p),], p[-1,]) bearing = (bearing + 180) %% 360 pp = destPoint(p[-1,], bearing, interval) x0 <- pp[,1] y0 <- pp[,2] x1 <- p[,1][-1] y1 <- p[,2][-1] # delta = sqrt(mean((x1-x0)^2 + (y1-y0)^2, na.rm=TRUE)) # delta = delta * (par("pin")[1] / diff(range(x, na.rm=TRUE))) graphics::arrows(x0, y0, x1, y1, code=2, length=length, ...) } plotArrows <- function(p, fraction=0.9, length=0.15, first='', add=FALSE, ...) { asp=1 if (inherits(p, 'Spatial')) { bb = t(bbox(p)) interval = distm(bb)[2][1] / 1000 if (! add) { plot(bb, asp=asp, type='n') } p = p@polygons n = length(p) for (i in 1:n) { parts = length(p[[i]]@Polygons ) sumarea = 0 for (j in 1:parts) { pp = p[[i]]@Polygons[[j]]@coords line = .makeSinglePoly(pp, interval=interval) .doArrows(pp, line, fraction, length, interval=interval, ...) } graphics::points(pp[1,1], pp[1,2], pch=first, cex=2) } } else { interval = max(distm(p), na.rm=TRUE) / 1000 line = .makeSinglePoly(p, interval=interval) if (! add) { plot(line, asp=asp, type='n') } .doArrows(p, line=line, fraction, length, interval=interval, ...) graphics::points(p[1,1], p[1,2], pch=first, cex=2) } } geosphere/R/distVincentyEllipsoid.R0000644000176200001440000000573513472155746017137 0ustar liggesusers# author of original JavaScript code: Chris Vennes # (c) 2002-2009 Chris Veness # http://www.movable-type.co.uk/scripts/latlong.html # Licence: LGPL, without any warranty express or implied # Port to R by Robert Hijmans # October 2009 # version 0.1 # license GPL3 distVincentyEllipsoid <- function(p1, p2, a=6378137, b=6356752.3142, f=1/298.257223563) { #/* Vincenty Inverse Solution of Geodesics on the Ellipsoid (c) Chris Veness 2002-2009 #*/ #* Calculate geodesic distance (in m) between two points specified by latitude/longitude #* (in numeric degrees) using Vincenty inverse formula for ellipsoids # source http://www.movable-type.co.uk/scripts/latlong-vincenty.html # (c) 2002-2009 Chris Veness toRad <- pi / 180 p1 <- .pointsToMatrix(p1) * toRad if (missing(p2)) { p2 <- p1[-1, ,drop=FALSE] p1 <- p1[-nrow(p1), ,drop=FALSE] } else { p2 <- .pointsToMatrix(p2) * toRad } p = cbind(p1[,1], p1[,2], p2[,1], p2[,2], as.vector(a), as.vector(b), as.vector(f)) p1 = p[,1:2,drop=FALSE] p2 = p[,3:4,drop=FALSE] res <- vector(length=nrow(p1)) for (i in 1:dim(p1)[1]) { if ( any( is.na( c(p1[i,], p2[i,])))) { #improvement by George Wang and Sebastian P. Luque res[i] <- NA } else if (isTRUE(all.equal(p1[i,], p2[i,]))) { res[i] <- 0 } else { lon1 <- p1[i,1] lat1 <- p1[i,2] lon2 <- p2[i,1] lat2 <- p2[i,2] a = p[i,5] b = p[i,6] f = p[i,7] L <- (lon2-lon1) U1 <- atan((1-f) * tan(lat1)) U2 <- atan((1-f) * tan(lat2)) sinU1 <- sin(U1) cosU1 <- cos(U1) sinU2 <- sin(U2) cosU2 <- cos(U2) lambda <- L iterLimit <- 100 continue <- TRUE while (continue) { sinLambda <- sin(lambda) cosLambda <- cos(lambda) sinSigma <- sqrt((cosU2*sinLambda) * (cosU2*sinLambda) + (cosU1*sinU2-sinU1*cosU2*cosLambda) * (cosU1*sinU2-sinU1*cosU2*cosLambda)) cosSigma <- sinU1*sinU2 + cosU1*cosU2*cosLambda sigma <- atan2(sinSigma, cosSigma) sinAlpha <- cosU1 * cosU2 * sinLambda / sinSigma cosSqAlpha <- 1 - sinAlpha*sinAlpha cos2SigmaM <- cosSigma - 2*sinU1*sinU2/cosSqAlpha if (is.nan(cos2SigmaM)) cos2SigmaM <- 0 # equatorial line: cosSqAlpha=0 (par. 6) C <- f/16*cosSqAlpha*(4+f*(4-3*cosSqAlpha)) lambdaP <- lambda lambda <- L + (1-C) * f * sinAlpha * (sigma + C*sinSigma*(cos2SigmaM+C*cosSigma*(-1+2*cos2SigmaM*cos2SigmaM))) iterLimit <- iterLimit - 1 continue <- (abs(lambda-lambdaP) > 1e-12 && iterLimit > 0) } if (iterLimit==0) { res[i] <- NA # failed to converge } else { uSq <- cosSqAlpha * (a*a - b*b) / (b*b) A <- 1 + uSq/16384*(4096+uSq*(-768+uSq*(320-175*uSq))) B <- uSq/1024 * (256+uSq*(-128+uSq*(74-47*uSq))) deltaSigma <- B*sinSigma*(cos2SigmaM+B/4*(cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)- B/6*cos2SigmaM*(-3+4*sinSigma*sinSigma)*(-3+4*cos2SigmaM*cos2SigmaM))) res[i] <- b*A*(sigma-deltaSigma) } } } return(as.vector(res)) } geosphere/R/sampleAlong.R0000644000176200001440000000464113472155746015044 0ustar liggesusers# Based on code by Barry Rowlingson #http://r-sig-geo.2731867.n2.nabble.com/how-to-generate-perpendicular-transects-along-a-line-feature-td7583710.html # Some adaptations by Robert Hijmans # January 2016 # version 0.1 # License GPL3 .evenspace <- function(xy, sep, start=0, size, direction=FALSE){ dx <- c(0,diff(xy[,1])) dy <- c(0,diff(xy[,2])) dseg <- sqrt(dx^2+dy^2) dtotal <- cumsum(dseg) linelength <- sum(dseg) pos <- seq(start,linelength, by=sep) whichseg <- unlist(lapply(pos, function(x){sum(dtotal<=x)})) x0 <- xy[whichseg,1] y0 <- xy[whichseg,2] x1 <- xy[whichseg+1,1] y1 <- xy[whichseg+1,2] dtotal <- dtotal[whichseg] further <- pos - dtotal dseg <- dseg[whichseg+1] f <- further/dseg x <- x0 + f * (x1-x0) y <- y0 + f * (y1-y0) r <- data.frame(x, y) # if (direction) { # r$direction <- atan2(y0-y1,x0-x1) # } r } .transect <- function(pts, len){ pts$thetaT = pts$theta+pi/2 dx <- len*cos(pts$thetaT) dy <- len*sin(pts$thetaT) data.frame(x0 = pts$x + dx, y0 = pts$y + dy, x1 = pts$x - dx, y1 = pts$y -dy) } .sampleAlong <- function(x, interval) { if (inherits(x, 'SpatialPolygons')) { line <- methods::as(line, 'SpatialLines') } if (inherits(x, 'SpatialLines')) { requireNamespace('raster') x <- raster::geom(x) allpts <- NULL for (p in unique(x[, 'cump'])) { y <- x[x[, 'cump']==p, c('x', 'y')] pts <- .evenspace(y, interval, direction=FALSE) allpts <- rbind(allpts, pts) } return(allpts) } else { x <- .pointsToMatrix(x) .evenspace(x, interval, direction=FALSE) } } .sampleAlongPerpendicular <- function(x, interval, pdist, np=1 ) { if (inherits(x, 'SpatialPolygons')) { line <- methods::as(line, 'SpatialLines') } if (inherits(x, 'SpatialLines')) { requireNamespace('raster') x <- raster::geom(x) allpts <- NULL for (p in unique(x[, 'cump'])) { y <- x[x[, 'cump']==p, c('x', 'y')] tspts <- .evenspace(y, interval) pts <- NULL for (i in 1:np) { pts1 <- .transect(tspts, i * pdist) pts <- cbind(pts, pts1) } allpts <- rbind(allpts, pts) } return(allpts) } else { x <- .pointsToMatrix(x) y <- .evenspace(x, interval) pts <- NULL for (i in 1:np) { pts1 <- .transect(y, i * pdist) pts <- cbind(pts, pts1) } return(pts) } } geosphere/R/gcIntersect.R0000644000176200001440000000457613472155746015063 0ustar liggesusers# author Robert Hijmans # October 2009 # version 0.1 # license GPL3 # based on an alogrithm described by Ed Williams # http://www.edwilliams.org/intersect.htm # Not used #gete <- function(lon, lat) { # ex <- cos(lat)*cos(lon) # ey <- -cos(lat)*sin(lon) # ez <- sin(lat) # return(cbind(ex, ey, ez)) #} gcIntersect <- function(p1, p2, p3, p4) { #intersection of two great circles defined by pt1 to pt2 and pt3 to pt4. einv <- function(e) { lat <- atan2(e[,3], sqrt(e[,1]^2 + e[,2]^2)) lon <- atan2(-e[,2], e[,1]) return(cbind(lon, lat)) } eXe5 <- function(lon1, lat1, lon2, lat2) { ex <- sin(lat1-lat2) *sin((lon1+lon2)/2) *cos((lon1-lon2)/2) - sin(lat1+lat2) *cos((lon1+lon2)/2) *sin((lon1-lon2)/2) ey <- sin(lat1-lat2) *cos((lon1+lon2)/2) *cos((lon1-lon2)/2) + sin(lat1+lat2) *sin((lon1+lon2)/2) *sin((lon1-lon2)/2) ez <- cos(lat1)*cos(lat2)*sin(lon1-lon2) return( cbind(ex, ey, ez) ) } eXe3 <- function(e1, e2) { x <- e1[,2] * e2[,3] -e2[,2] *e1[,3] y <- e1[,3] *e2[,1] -e2[,3] *e1[,1] z <- e1[,1] *e2[,2] -e1[,2] *e2[,1] return(cbind(x,y,z)) } eSQRT <- function(e) { return(sqrt(e[,1]^2 + e[,2]^2 + e[,3]^2)) } p1 <- .pointsToMatrix(p1) p2 <- .pointsToMatrix(p2) p3 <- .pointsToMatrix(p3) p4 <- .pointsToMatrix(p4) p1 <- cbind(p1[,1], p1[,2], p2[,1], p2[,2]) p3 <- cbind(p3[,1], p3[,2], p4[,1], p4[,2]) p <- cbind(p1[,1], p1[,2], p1[,3], p1[,4], p3[,1], p3[,2], p3[,3], p3[,4]) p1 <- p[,1:2,drop=FALSE] p2 <- p[,3:4,drop=FALSE] p3 <- p[,5:6,drop=FALSE] p4 <- p[,7:8,drop=FALSE] res <- matrix(NA, nrow=nrow(p1), ncol=4) colnames(res) <- c('lon1', 'lat1', 'lon2', 'lat2') keep <- ! antipodal(p1, p2) | antipodal(p3, p4) keep <- keep & ! apply(p1 == p2, 1, sum) == 2 if (sum(keep) == 0) { return(res) } toRad <- pi / 180 p1 <- p1[keep, , drop=FALSE] * toRad p2 <- p2[keep, , drop=FALSE] * toRad p3 <- p3[keep, , drop=FALSE] * toRad p4 <- p4[keep, , drop=FALSE] * toRad e1Xe2 <- eXe5(p1[,1], p1[,2], p2[,1], p2[,2]) e3Xe4 <- eXe5(p3[,1], p3[,2], p4[,1], p4[,2]) ea <- e1Xe2 / eSQRT(e1Xe2) eb <- e3Xe4 / eSQRT(e3Xe4) eaXeb <- eXe3(ea, eb) ll <- einv(eaXeb) ll2 <- cbind(ll[,1] + pi, -ll[,2]) pts <- cbind(ll, ll2) pts[,1] <- .normalizeLonRad(pts[,1]) pts[,3] <- .normalizeLonRad(pts[,3]) res[keep,] <- pts / toRad return(res) } geosphere/R/greatCircle.R0000644000176200001440000000220413472155746015017 0ustar liggesusers# author Robert Hijmans # October 2009 # version 0.1 # license GPL greatCircle <- function(p1, p2, n=360, sp=FALSE) { p1 <- .pointsToMatrix(p1) p2 <- .pointsToMatrix(p2) p <- cbind(p1[,1], p1[,2], p2[,1], p2[,2], n) p1 <- p[,1:2] p2 <- p[,3:4] n <- pmax(round(p[,5]), 1) if (nrow(p) == 1) { lon <- (1:n * 360 / n) - 180 lat <- gcLat(p1, p2, lon) res <- cbind(lon,lat) if (sp) { lat <- gcLat(p1, p2, 180) res <- list(rbind(cbind(-180, lat), res)) res <- SpatialLines( list( Lines( list( Line (res)), ID=as.character(1)) ), CRS("+proj=longlat +ellps=WGS84")) } } else { res <- list() for (i in 1:nrow(p1)) { lon <- (1:n[i] * 360 / n[i]) - 180 lat <- gcLat(p1[i,], p2[i,], lon) res[[i]] <- cbind(lon, lat) } if (sp) { for (i in 1:length(res)) { lat <- gcLat(p1[i,], p2[i,], 180) res[[i]] <- rbind(cbind(-180, lat), res[[i]]) res[[i]] <- Lines( list( Line (res[[i]])), ID=as.character(i)) } res <- SpatialLines(res, CRS("+proj=longlat +ellps=WGS84")) } } return(res) } #greatCircle(rbind(cbind(5,52), cbind(5,15)), c(-120,37), n=12) geosphere/R/regularCoordinates.R0000644000176200001440000000173113472155746016433 0ustar liggesusers# author Robert Hijmans # July 2010 # version 0.1 # license GPL # Based on pascal code by Nils Haeck, simdesign.nl # http://mathforum.org/kb/message.jspa?messageID=3985660&tstart=0 regularCoordinates <- function(N) { N <- round(N) if (N < 1) {stop('N should be >= 1')} # subdivision angle beta <- 0.5 * pi / N # line segment length A <- 2 * sin(beta/2); # endcap points <- rbind(c(0, 0, 1), c(0, 0, -1)) # rings R <- sin(1:N * beta) Z <- cos(1:N * beta) M <- round(R * 2 * pi / A) for (i in 1:N) { j <- 0:(M[i]-1) Alpha <- j/M[i] * 2 * pi X <- cos(Alpha) * R[i] Y <- sin(Alpha) * R[i] points <- rbind(points, cbind(X, Y, Z[i])) if (i != N) { points <- rbind(points, cbind(X, Y, -Z[i])) } } r <- sqrt(points[,1]^2 + points[,2]^2 + points[,3]^2) theta <- acos(points[,3] / r) phi <- atan2(points[,2], points[,1]) lat <- theta * 180 / pi - 90 lon <- phi * 180 / pi return(cbind(lon,lat)) } geosphere/R/dist2Line.R0000644000176200001440000000540513472155746014436 0ustar liggesusers# Author: George Wang & Robert J. Hijmans # August 2010 # version 1 # license GPL3 .spDistPoint2Line <- function(p, line, distfun) { test <- !is.projected(line) if (! isTRUE (test) ) { if (is.na(test)) { warning('Coordinate reference system of SpatialPolygons object is not set. Assuming it is degrees (longitude/latitude)!') } else { stop('Points are projected. They should be in degrees (longitude/latitude)') } # or rather transform them ....? } x <- line@lines n <- length(x) res <- matrix(nrow=nrow(p), ncol=4) colnames(res) <- c("distance","lon","lat","ID") res[] <- Inf for (i in 1:n) { parts <- length(x[[i]]@Lines ) for (j in 1:parts) { crd <- x[[i]]@Lines[[j]]@coords r <- cbind(dist2Line(p, crd, distfun), i) k <- r[,1] < res[,1] res[k, ] <- r[k, ] } } return(res) } dist2Line <- function(p, line, distfun=distGeo) { p <- .pointsToMatrix(p) if (inherits(line, 'SpatialPolygons')) { line <- methods::as(line, 'SpatialLines') } if (inherits(line, 'SpatialLines')) { return( .spDistPoint2Line(p, line, distfun) ) } line <- .pointsToMatrix(line) line1 <- line[-nrow(line), ,drop=FALSE] line2 <- line[-1, ,drop=FALSE] seglength <- distfun(line1, line2) res <- matrix(nrow=nrow(p), ncol=3) colnames(res) <- c("distance","lon","lat") for (i in 1:nrow(p)) { xy <- p[i,] # the shortest distance of a point to a great circle crossdist <- abs(dist2gc(line1, line2, xy)) # the alongTrackDistance is the length of the path along the great circle to the point of intersection # there are two, depending on which node you start # we want to use the min, but the max needs to be < segment length trackdist1 <- alongTrackDistance(line1, line2, xy) trackdist2 <- alongTrackDistance(line2, line1, xy) mintrackdist <- pmin(trackdist1, trackdist2) maxtrackdist <- pmax(trackdist1, trackdist2) crossdist[maxtrackdist >= seglength] <- NA # if the crossdist is NA, we use the distance to the nodes nodedist <- distfun(xy, line) warnopt = getOption('warn') options('warn'=-1) distmin1 <- min(nodedist, na.rm=TRUE) distmin2 <- min(crossdist, na.rm=TRUE) options('warn'= warnopt) if (distmin1 <= distmin2) { j <- which.min(nodedist) res[i,] <- c(distmin1, line[j,]) } else { j <- which.min(crossdist) # if else to determine from which node to start if (trackdist1[j] < trackdist2[j]) { bear <- bearing(line1[j,], line2[j,]) pt <- destPoint(line1[j,], bear, mintrackdist[j]) res[i,] <- c(crossdist[j], pt) } else { bear <- bearing(line2[j,], line1[j,]) pt <- destPoint(line2[j,], bear, mintrackdist[j]) res[i,] <- c(crossdist[j], pt) } } } return(res) } geosphere/R/geocode.R0000644000176200001440000000070414430063054014164 0ustar liggesusers# Robert Hijmans # May 2023 # version 1 # license GPL3 OSGB <- function(xy, precision, geo=FALSE, inverse=FALSE) { if (inverse) { xy <- .OSGBinv(xy, 1, TRUE) matrix(xy, ncol=2, dimnames=list(NULL, c("x", "y"))) } else { stopifnot(precision %in% c('1m', '10m', '100m', '1km', '10km', '100km', '5m', '50m', '500m', '5km', '50km', '500km')) xy <- .pointsToMatrix(xy, FALSE) .OSGB(xy[,1], xy[,2], precision[1], geo[1]) } } geosphere/R/mercator.R0000644000176200001440000000077113472155746014416 0ustar liggesusers# Author: Robert J. Hijmans # April 2010 # version 0.1 # license GPL3 mercator <- function(p, inverse=FALSE, r=6378137) { toRad <- pi / 180 if (inverse) { p <- .pointsToMatrix(p, checkLonLat=FALSE) p[ ,2] <- pi/2 - 2 * atan(exp(-p[,2] / r)) p[ ,1] <- p[,1] / r colnames(p) <- c('lon', 'lat') return( p / toRad ) } else { p <- .pointsToMatrix(p) * toRad p[,2] <- log( tan(p[,2]) + (1 / cos(p[,2]))) p <- p * r colnames(p) <- c('x', 'y') return( p ) } } geosphere/R/distMeeus.R0000644000176200001440000000214213472155746014536 0ustar liggesusers# R code by Robert Hijmans # based on Java script code by # Stephen R. Schmitt (copyright, 2004) # http://web.archive.org/web/20070108024032/http://home.att.net/~srschmitt/script_greatcircle.html # algorithm taken from "Astronomical Algorithms" by Jean Meeus distMeeus <- function(p1, p2, a=6378137, f=1/298.257223563) { toRad <- pi / 180 p1 <- .pointsToMatrix(p1) * toRad if (missing(p2)) { p2 <- p1[-1, ,drop=FALSE] p1 <- p1[-nrow(p1), ,drop=FALSE] } else { p2 <- .pointsToMatrix(p2) * toRad } F <- ( p1[,2] + p2[,2] ) / 2 G <- ( p1[,2] - p2[,2] ) / 2 L <- ( p1[,1] - p2[,1] ) / 2 sinG2 <- ( sin( G ) )^2 cosG2 <- ( cos( G ) )^2 sinF2 <- ( sin( F ) )^2 cosF2 <- ( cos( F ) )^2 sinL2 <- ( sin( L ) )^2 cosL2 <- ( cos( L ) )^2 S <- sinG2 * cosL2 + cosF2 * sinL2 C <- cosG2 * cosL2 + sinF2 * sinL2 w <- atan( sqrt( S/C ) ) R <- sqrt( S*C )/w D <- 2 * w * a H1 <- (3*R - 1)/(2*C) H2 <- (3*R + 1)/(2*S) dst <- D*( 1 + f*H1*sinF2*cosG2 - f*H2*cosF2*sinG2 ) # remove NaN for when p1[i,]==p2[i,] dst[which(w==0)] <- 0 return ( as.vector(dst) ) } geosphere/R/distm.R0000644000176200001440000000106713472155746013721 0ustar liggesusers# Robert Hijmans # April 2010 # version 1 # License GPL3 .distm1 <- function(x, fun) { n = nrow(x) dm = matrix(0, ncol=n, nrow=n) if (n == 1) { return(dm) } for (i in 2:n) { j = 1:(i-1) dm[i,j] = fun(x[i,], x[j,]) } dm <- dm+t(dm) return(dm) } distm <- function(x, y, fun=distGeo) { x <- .pointsToMatrix(x) if (missing(y)) { return( .distm1(x, fun) ) } y <- .pointsToMatrix(y) n = nrow(x) m = nrow(y) dm = matrix(ncol=m, nrow=n) for (i in 1:n) { dm[i,] = fun(x[i,], y) } return(dm) } geosphere/R/gcLat.R0000644000176200001440000000201413472155746013624 0ustar liggesusers# author Robert Hijmans # October 2009 # version 0.1 # license GPL gcLat <- function(p1, p2, lon) { # Intermediate points on a great circle # source: http://www.edwilliams.org/avform.htm toRad <- pi / 180 d <- distCosine(p1, p2) p1 <- .pointsToMatrix(p1) p2 <- .pointsToMatrix(p2) p <- cbind(p1[,1], p1[,2], p2[,1], p2[,2], as.vector(lon)) p1 <- p[,1:2,drop=FALSE] p2 <- p[,3:4,drop=FALSE] lon <- p[,5] res <- rep(NA, nrow(p)) notanti <- ! antipodal(p1, p2) lon1 <- p1[,1] * toRad lat1 <- p1[,2] * toRad lon2 <- p2[,1] * toRad lat2 <- p2[,2] * toRad lon <- lon * toRad # cannot compute this for a meridian notmeridians <- ! sin(lon1-lon2)==0 keep <- notanti & notmeridians if (sum(keep) == 0) { return(res) } lon1 <- lon1[keep] lat1 <- lat1[keep] lon2 <- lon2[keep] lat2 <- lat2[keep] lon <- lon[keep] res[keep] <- atan((sin(lat1)*cos(lat2)*sin(lon-lon2) -sin(lat2)*cos(lat1)*sin(lon-lon1))/(cos(lat1)*cos(lat2)*sin(lon1-lon2))) return(res / toRad) } geosphere/R/helper.R0000644000176200001440000000142113472155746014052 0ustar liggesusers# Author: Robert J. Hijmans # April 2010 # version 1 # license GPL3 .normalizeLonDeg <- function(x) { (x + 180) %% 360 - 180 } .normalizeLonRad <- function(x) { (x + pi) %% (2*pi) - pi } .isPolygon <- function(x, fix=FALSE) { x <- stats::na.omit(x) if (nrow(x) < 4) { stop('this is not a polygon (insufficent number of vertices)') } if (length(unique(x[,1]))==1) { stop('All longitudes are the same (not a polygon)') } if (length(unique(x[,2]))==1) { stop('All latitudes are the same (not a polygon)') } if (! all(!(is.na(x))) ) { stop('polygon has NA values)') } if (! isTRUE(all.equal(x[1,], x[nrow(x),]))) { stop('this is not a valid (closed) polygon. The first vertex is not equal to the last vertex') } return(x) } geosphere/R/geomean.R0000644000176200001440000000123513472155746014211 0ustar liggesusers# Author: Robert J. Hijmans # February 2012 # version 1 # license GPL3 geomean <- function(xy, w=NULL) { xy <- .pointsToMatrix(xy) if (is.null(w)) { w <- 1 } else if (length(w) != nrow(xy)) { stop('length of weights not correct. It should be: ', nrow(xy)) } w <- w / sum(w) xyw <- cbind(xy, w) xy <- stats::na.omit(xyw) xy <- xyw[,1:2] w <- xyw[,3] xy[,1] <- xy[,1] + 180 xy <- xy * pi / 180 Sx <- mean(sin(xy[,1]) * w) Cx <- mean(cos(xy[,1]) * w) x <- atan2(Sx, Cx) x <- x %% (2 * pi) - pi Sy <- mean(sin(xy[,2]) * w) Cy <- mean(cos(xy[,2]) * w) y <- atan2(Sy, Cy) cbind(x,y) * 180 / pi } geosphere/R/antipodal.R0000644000176200001440000000126314161435516014542 0ustar liggesusers# Author: Robert J. Hijmans # October 2009 # version 1.0 # license GPL3 antipodal <- function(p1, p2, tol=1e-9) { p1 <- .pointsToMatrix(p1) p2 <- .pointsToMatrix(p2) p <- cbind(p1[,1], p1[,2], p2[,1], p2[,2]) p[,c(1,3)] <- .normalizeLonDeg(p[,c(1,3)]) diflon <- abs(p[,1] - p[,3]) diflat <- abs(p[,2] + p[,4]) ## FIX by Gareth Davies # (diflat < tol) & (diflon > (180 - tol)) ## FIX by Jonathan Rynd # (diflat < tol) & (abs(diflon%%360 - 180) < tol) (diflat < tol) & ((cos(p[,2] * pi/180) * abs(diflon%%360 - 180)) < tol) } antipode <- function(p) { p <- .pointsToMatrix(p) p[,1] <- .normalizeLonDeg(p[,1] + 180) p[,2] <- -p[,2] return( p ) } geosphere/R/greatCircleBearing.R0000644000176200001440000000054413472155746016314 0ustar liggesusers# author Robert Hijmans # April 2010 # version 0.1 # license GPL greatCircleBearing <- function(p, brng, n=360) { p <- .pointsToMatrix(p) p <- cbind(p[,1], p[,2], as.vector(brng), n) p2 <- destPoint(p[,1:2], p[,3], 10000000) return(greatCircle(p[,1:2], p2, n=p[,4])) } #greatCircleBearing(rbind(cbind(5,52), cbind(5,15)), 60, n=12) geosphere/R/gcMaxLat.R0000644000176200001440000000255413472155746014303 0ustar liggesusers# Based on formulae by Ed Williams # http://www.edwilliams.org/avform.htm # Port to R by Robert Hijmans # October 2009 # version 0.1 # License GPL3 gcMaxLat <- function(p1, p2) { toRad <- pi / 180 p1 <- .pointsToMatrix(p1) p2 <- .pointsToMatrix(p2) p <- cbind(p1[,1], p1[,2], p2[,1], p2[,2]) p1 <- p[,1:2,drop=FALSE] p2 <- p[,3:4,drop=FALSE] anti <- antipodal(p1, p2) same <- apply(p1 == p2, 1, sum) == 2 use <- !(anti | same) res <- matrix(rep(NA, nrow(p1)*2), ncol=2) colnames(res) <- c('lon', 'lat') if (length(use)==0) { return(res) } pp1 <- p1[use, , drop=FALSE] pp2 <- p2[use, , drop=FALSE] b <- .old_bearing(pp1, pp2) * toRad lat <- pp1[,2] * toRad # Clairaut's formula : the maximum latitude of a great circle path, given a bearing and latitude on the great circle maxlat <- acos(abs(sin(b) * cos(lat))) / toRad ml <- maxlat - 0.000000000001 maxlon <- mean(gcLon(pp1, pp2, ml)) res[use,] <- cbind(maxlon, maxlat) # lon <- pp1[,1] * toRad # maxlon <- rep(NA, length(maxlat)) # i <- maxlat==0 # j <- b < pi & !i # k <- !j & !i # maxlon[j] <- lon[j] - atan2(cos(b[j]), sin(b[j]) * sin(lat[j])) # maxlon[k] <- lon[k] + pi - atan2(cos(b[k]), sin(b[k]) * sin(lat[k])) # maxlon <- -1 * ((maxlon+pi)%%(2*pi) - pi) # res[use,] <- cbind(maxlon, maxlat)/ toRad return(res) } geosphere/R/midPoint.R0000644000176200001440000000262713472155746014367 0ustar liggesusers# Robert Hijmans # October 2009 # version 0.1 # License GPL3 midPoint <- function(p1, p2, a=6378137, f = 1/298.257223563) { # by Elias Pipping gi <- geodesic_inverse(p1, p2, a=a, f=f); destPoint(p1, gi[,'azimuth1'], gi[,'distance']/2, a = a, f = f) } .old_midPoint <- function(p1, p2) { # author of original JavaScript code: Chris Vennes # (c) 2002-2009 Chris Veness # http://www.movable-type.co.uk/scripts/latlong.html # Licence: LGPL, without any warranty express or implied # Much of the above based on formulae by Ed Williams # http://www.edwilliams.org/avform.htm # Port to R by Robert Hijmans # calculate midpoint of great circle line between p1 & p2. # see http:#//mathforum.org/library/drmath/view/51822.html for derivation # based on http://www.movable-type.co.uk/scripts/latlong.html # (c) 2002-2009 Chris Veness toRad <- pi / 180 p1 <- .pointsToMatrix(p1) * toRad p2 <- .pointsToMatrix(p2) * toRad p <- cbind(p1[,1], p1[,2], p2[,1], p2[,2]) lon1 <- p[,1] lat1 <- p[,2] lon2 <- p[,3] lat2 <- p[,4] dLon <- (lon2-lon1) Bx <- cos(lat2) * cos(dLon) By <- cos(lat2) * sin(dLon) lat <- atan2(sin(lat1) + sin(lat2), sqrt((cos(lat1) + Bx)*(cos(lat1) + Bx) + By*By ) ) lon <- lon1 + atan2(By, cos(lat1) + Bx) lon[is.nan(lon)] <- NA lat[is.nan(lat)] <- NA lon <- (lon+pi)%%(2*pi) - pi res <- cbind(lon, lat) / toRad return(res) } geosphere/R/distVincentySphere.R0000644000176200001440000000150213472155746016425 0ustar liggesusers# Author: Robert J. Hijmans # Date : June 2008 # Version 0.8 (taken from Raster package) # Licence GPL v3 # Vincenty formula for a sphere # http://en.wikipedia.org/wiki/Great_circle_distance distVincentySphere <- function(p1, p2, r=6378137) { toRad <- pi / 180 p1 <- .pointsToMatrix(p1) * toRad if (missing(p2)) { p2 <- p1[-1, ,drop=FALSE] p1 <- p1[-nrow(p1), ,drop=FALSE] } else { p2 <- .pointsToMatrix(p2) * toRad } p <- cbind(p1[,1], p1[,2], p2[,1], p2[,2], as.vector(r)) lon1 <- p[,1] lat1 <- p[,2] lon2 <- p[,3] lat2 <- p[,4] x <- sqrt((cos(lat2) * sin(lon1-lon2))^2 + (cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(lon1-lon2))^2) y <- sin(lat1) * sin(lat2) + cos(lat1) * cos(lat2) * cos(lon1-lon2) dist <- p[,5] * atan2(x, y) return ( as.vector(dist )) } geosphere/R/randomCoordinates.R0000644000176200001440000000101713472155746016247 0ustar liggesusers# author Robert Hijmans # July 2010 # version 0.1 # license GPL # based on suggstions by Michael Orion # http://sci.tech-archive.net/Archive/sci.math/2005-09/msg04691.html randomCoordinates <- function(n) { z <- stats::runif(n) * 2 - 1 t <- stats::runif(n) * 2 * pi r <- sqrt(1-z^2) x <- r * cos(t) y <- r * sin(t) r <- sqrt(x^2 + y^2 + z^2) theta <- acos(z / r) phi <- atan2(y,x) lat <- theta * 180 / pi - 90 lon <- phi * 180 / pi return(cbind(lon,lat)) } geosphere/R/alongTrack.R0000644000176200001440000000170214677357014014662 0ustar liggesusers# based on code by Ed Williams # licence GPL # http://www.edwilliams.org/avform.htm#XTE # Port to R by Robert Hijmans # October 2009 # version 0.1 # license GPL3 alongTrackDistance <- function(p1, p2, p3, r=6378137) { toRad <- pi / 180 p1 <- .pointsToMatrix(p1) p2 <- .pointsToMatrix(p2) p3 <- .pointsToMatrix(p3) p <- cbind(p1[,1], p1[,2], p2[,1], p2[,2], p3[,1], p3[,2], as.vector(r)) p1 <- p[,1:2,drop=FALSE] p2 <- p[,3:4,drop=FALSE] p3 <- p[,5:6,drop=FALSE] r = p[,7] tc <- bearing(p1, p2) * toRad tcp <- bearing(p1, p3) * toRad dp <- distCosine(p1, p3, r=1) xtr <- asin(sin(tcp-tc) * sin(dp)) # +1/-1 for ahead/behind [lat1,lon1] bearing <- sign(cos(tc - tcp)) angle <- cos(dp) / cos(xtr) # Fixing limits for the angle between [-1, 1] to avoid NaNs angle[angle > 1] <- 1 angle[angle < -1] <- -1 dist <- bearing * acos(angle) * r if (is.vector(dist)) { dist <- matrix(dist) } colnames(dist) <- 'distance' return(abs(dist)) } geosphere/R/areaPolygon.R0000644000176200001440000000557014161540713015050 0ustar liggesusers# Robert Hijmans # April 2010 # version 1 # license GPL3 if (!isGeneric("areaPolygon")) { setGeneric("areaPolygon", function(x, ...) standardGeneric("areaPolygon")) } setMethod('areaPolygon', signature(x='data.frame'), function(x, a=6378137, f=1/298.257223563, ...) { areaPolygon(as.matrix(x), a=a, f=f, ...) } ) setMethod('areaPolygon', signature(x='SpatialPolygons'), function(x, a=6378137, f=1/298.257223563, ...) { test <- is.projected(x) if ( isTRUE (test) ) { if (is.na(test)) { warning('Coordinate reference system of SpatialPolygons object is not set. Assuming it is degrees (longitude/latitude)!') } else { stop('The coordinate reference system is not longitude/latitude.') } # or rather transform them ....? } x <- x@polygons n <- length(x) res <- vector(length=n) for (i in 1:n) { parts <- length(x[[i]]@Polygons ) sumarea <- 0 for (j in 1:parts) { crd <- x[[i]]@Polygons[[j]]@coords ar <- areaPolygon(crd, a=a, f=f, ...) if (x[[i]]@Polygons[[j]]@hole) { sumarea <- sumarea - ar } else { sumarea <- sumarea + ar } } res[i] <- sumarea } return(res) } ) setMethod('areaPolygon', signature(x='matrix'), function(x, a=6378137, f=1/298.257223563, ...) { r <- list(...)$r if (!is.null(r)) { # for backwards compatibility warning('remove argument "r" to use an better algorithm') return( .old_areaPolygon(x, r=r) ) } # calling geographiclib x <- .polygonarea(as.double(x[,1]), as.double(x[,2]), as.double(a), as.double(f)) abs(x[3]) }) .old_areaPolygon <- function(x, r=6378137, ...) { # Based on code by Jason_Steven (http://forum.worldwindcentral.com/showthread.php?p=69704) # Reference: Bevis, M. and G. Cambareri, 1987. Computing the area of a spherical polygon of arbitrary shape. Mathematical Geology 19: 335-346 haversine <- function(y) { (1-cos(y))/2 } x <- .pointsToMatrix(x, poly=TRUE) x <- makePoly(x) # for some corner cases # rotate? dif1 <- max(x[,1]) - min(x[,1]) if (dif1 > 180) { x2 <- x x2[,1] <- x2[,1] %% 360 - 180 #dif1 <- max(x[,1]) - min(x[,1]) dif2 <- max(x2[,1]) - min(x2[,1]) if (dif2 < dif1) { x <- x2 } } x <- x * pi / 180 r <- r[1] j <- 1:nrow(x) k <- c(2:nrow(x), 1) i <- x[j,1] != x[k,1] j <- j[i] k <- k[i] lam1 <- x[j,1] lam2 <- x[k,1] beta1 <- x[j,2] beta2 <- x[k,2] cosB1 <- cos( beta1 ) cosB2 <- cos( beta2 ) hav <- haversine( beta2 - beta1 ) + cosB1 * cosB2 * haversine( lam2 - lam1 ) a <- 2 * asin( sqrt( hav ) ) b <- pi / 2 - beta2 c <- pi / 2 - beta1 s <- 0.5 * ( a + b + c ) t <- tan( s / 2 ) * tan( ( s - a ) / 2 ) * tan( ( s - b ) / 2 ) * tan( ( s - c ) / 2 ) excess <- abs( 4 * atan( sqrt( abs( t ) ) ) ) excess[lam2 < lam1] <- -excess[lam2 < lam1] arsum <- abs( sum( excess ) ) * r * r return(arsum ) } geosphere/R/finalBearing.R0000644000176200001440000000111014161534151015132 0ustar liggesusers# Robert Hijmans # October 2009 # version 0.1 # Licence: GPL3 finalBearing <- function(p1, p2, a=6378137, f=1/298.257223563, sphere=FALSE) { if (sphere) { # for backwards compatibility return(.old_bearing(p2, p1) ) } p1 <- .pointsToMatrix(p1) p2 <- .pointsToMatrix(p2) p <- cbind(p1[,1], p1[,2], p2[,1], p2[,2]) r <- .inversegeodesic(as.double(p[,1]), as.double(p[,2]), as.double(p[,3]), as.double(p[,4]), as.double(a[1]), as.double(f[1])) r <- matrix(r, ncol=3, byrow=TRUE) # colnames(r) <- c('lon', 'lat', 'finalbearing') return(r[, 3]) } geosphere/R/perimeter.R0000644000176200001440000000344614172661303014565 0ustar liggesusers# Robert Hijmans # April 2010 # version 1 # License GPL3 if (!isGeneric("perimeter")) { setGeneric("perimeter", function(x, ...) standardGeneric("perimeter")) } setMethod("perimeter", signature(x='SpatialPolygons'), function(x, a=6378137, f=1/298.257223563, ...) { x <- x@polygons n <- length(x) res <- vector(length=n) for (i in 1:n) { parts <- length( x[[i]]@Polygons ) perim <- 0 for (j in 1:parts) { if (! x[[i]]@Polygons[[j]]@hole) { crd <- x[[i]]@Polygons[[j]]@coords perim <- perim + perimeter(crd, a=a, f=f, ...) } } res[i] <- perim } return(res) } ) setMethod("perimeter", signature(x='SpatialLines'), function(x, a=6378137, f=1/298.257223563, ...) { x <- x@lines n <- length(x) res <- vector(length=n) for (i in 1:n) { parts <- length( x[[i]]@Lines ) lng <- 0 for (j in 1:parts) { crd <- x[[i]]@Lines[[j]]@coords lng <- lng + perimeter(crd, a=a, f=f, ...) } res[i] <- lng } return(res) } ) setMethod("perimeter", signature(x='data.frame'), function(x, a=6378137, f=1/298.257223563, ...) { perimeter(as.matrix(x), a=a, f=f, ...) } ) setMethod("perimeter", signature(x='matrix'), function(x, a=6378137, f=1/298.257223563, ...) { r <- list(...)$r if (!is.null(r)) { # for backwards compatibility warning('removed argument "r" to use improved method') return( .old_perimeter(x, r=r) ) } n <- nrow(x) d <- .inversegeodesic(as.double(x[-n,1]), as.double(x[-n,2]), as.double(x[-1,1]), as.double(x[-1,2]), as.double(a), as.double(f)) sum(abs(x)) }) .old_perimeter <- function(x, r=6378137, ...) { x <- x[,1:2] if (isTRUE(all.equal(x[1,], x[nrow(x),]))) { x <- x[-nrow(x), ] } y <- rbind(x[-1,], x[1,]) d <- distHaversine(x, y, r=r) return(sum(d)) } geosphere/R/refEllipsoids.R0000644000176200001440000000263013472155746015402 0ustar liggesusers refEllipsoids <- function() { data.frame( ellipsoid = c('Airy (1930)', 'Australian National', 'Bessel 1841', 'Ethiopia, Indonesia, Japan, Korea', 'Namibia', 'Clarke 1866', 'Clarke 1880', 'Everest - Brunei & E. Malasia (Sabah & Sarawak)', 'Everest - India 1830', 'Everest - India 1956', 'Everest - Pakistan', 'Everest - W. Malasia and Singapore 1948', 'Everest - W. Malasia 1969', 'Geodetic Reference System 1980 (GRS 80)', 'Helmert 1906', 'Hough 1960', 'Indonesian 1974', 'International 1924', 'Krassovsky 1940', 'Modified Airy', 'Modified Fischer 1960 (South Asia)', 'South American 1969', 'World Geodetic System 1972 (WGS 72)', 'World Geodetic System 1984 (WGS 84)'), code = c('AA', 'AN', '??', 'BR', 'BN', 'CC', 'CD', 'EB', 'EA', 'EC', 'EF', 'EE', 'ED', 'RF', 'HE', 'HO', 'ID', 'IN', 'KA', 'AM', 'FA', 'SA', 'WD', 'WE'), invf = c(299.3249646, 298.25, 299.1528434, 299.1528128, 299.1528128, 294.9786982, 293.465, 300.8017, 300.8017, 300.8017, 300.8017, 300.8017, 300.8017, 298.2572221, 298.3, 297, 298.247, 297, 298.3, 299.3249646, 298.3, 298.25, 298.26, 298.2572236), a = c(6377563.396, 6378160, 6377397.155, 6377397.155, 6377483.865, 6378206.4, 6378249.145, 6377298.556, 6377276.345, 6377301.243, 6377309.613, 6377304.063, 6377295.664, 6378137, 6378200, 6378270, 6378160, 6378388, 6378245, 6377340.189, 6378155, 6378160, 6378135, 6378137), stringsAsFactors=FALSE ) } geosphere/R/makePoly.R0000644000176200001440000000740714472423123014352 0ustar liggesusers# author Robert Hijmans # April 2010 # version 0.1 # license GPL .makeSinglePoly <- function(p, interval=10000, ...) { res <- p[1,] for (i in 1:(nrow(p)-1)) { if (! isTRUE( all.equal(p[i,], p[i+1,]) )) { d <- distGeo(p[i,], p[i+1,], ...) n <- floor(d / interval) if (n > 0) { pts <- gcIntermediate(p[i,],p[i+1,], n) pts <- rbind(p[i,], pts, p[i+1,]) res <- rbind(res, pts, p[i+1,]) } else { res <- rbind(res, p[i+1,]) } } } if (nrow(res) < 3) stop('cannot make a valid polygon') return(res) } .makeSingleLine <- function(p, interval=10000, ...) { res <- p[1,] for (i in 1:(nrow(p)-1)) { if (! isTRUE( all.equal(p[i,], p[i+1,]) )) { d <- distGeo(p[i,], p[i+1,], ...) n <- floor(d / interval) if (n > 0) { pts <- gcIntermediate(p[i,],p[i+1,], n) pts <- rbind(p[i,], pts, p[i+1,]) res <- rbind(res, pts, p[i+1,]) } else { res <- rbind(res, p[i+1,]) } } } if (nrow(res) < 2) stop('cannot make a valid line') return(res) } makePoly <- function(p, interval=10000, sp=FALSE, ...) { if (inherits(p, 'SpatialPolygons')) { test <- !is.projected(p) if (! isTRUE (test) ) { if (is.na(test)) { warning('Coordinate reference system of SpatialPolygons object is not set. Assuming it is degrees (longitude/latitude)!') } else { stop('Points are projected. They should be in degrees (longitude/latitude)') } # or rather transform them ....? } x <- p@polygons n <- length(x) polys = list() for (i in 1:n) { parts <- length(x[[i]]@Polygons ) partlist <- list() for (j in 1:parts) { crd <- x[[i]]@Polygons[[j]]@coords crd <- .makeSinglePoly(crd, interval=interval, ...) partlist[[j]] <- Polygon(crd) } polys[[i]] <- Polygons(partlist, i) } polys <- SpatialPolygons(polys) if (inherits(p, 'SpatialPolygonsDataFrame')) { rownames(p@data) <- 1:nrow(p@data) polys <- SpatialPolygonsDataFrame(polys, p@data) } polys@proj4string <- p@proj4string return(polys) } else { p <- .pointsToMatrix(p) if (nrow(p) < 3) { stop('cannot make a polygon (insufficent number of vertices)') } if (! isTRUE(all.equal(p[1,], p[nrow(p),]))) { p <- rbind(p, p[1,]) } res <- .makeSinglePoly(p, interval=interval, ...) if (sp) { res <- SpatialPolygons(list(Polygons(list(Polygon(res)), 1))) res@proj4string <- CRS("+proj=longlat +datum=WGS84") } return(res) } } makeLine <- function(p, interval=10000, sp=FALSE, ...) { if (inherits(p, 'SpatialLines')) { test <- !is.projected(p) if (! isTRUE (test) ) { if (is.na(test)) { warning('Coordinate reference system of SpatialPolygons object is not set. Assuming it is degrees (longitude/latitude)!') } else { stop('Points are projected. They should be in degrees (longitude/latitude)') } # or rather transform them ....? } x = p@lines n = length(x) lines = list() for (i in 1:n) { parts = length(x[[i]]@Lines ) partlist = list() for (j in 1:parts) { crd = x[[i]]@Lines[[j]]@coords crd = .makeSingleLine(crd, interval=interval, ...) partlist[[j]] = Line(crd) } lines[[i]] = Lines(partlist, i) } lines <- SpatialLines(lines) if (inherits(p, 'SpatialLinesDataFrame')) { lines <- SpatialLinesDataFrame(lines, p@data) } lines@proj4string <- p@proj4string return(lines) } else { p <- .pointsToMatrix(p) if (nrow(p) < 3) { stop('cannot make a polygon (insufficent number of vertices)') } res <- .makeSingleLine(p, interval=interval, ...) if (sp) { res <- SpatialLines(list(Lines(list(Line(res)), 1))) res@proj4string <- CRS("+proj=longlat +datum=WGS84") } return(res) } } geosphere/R/distGeo.R0000644000176200001440000000123014161534041014150 0ustar liggesusers# Author: Robert J. Hijmans # Date : May 2015 # Licence GPL v3 distGeo <- function(p1, p2, a=6378137, f=1/298.257223563) { p1 <- .pointsToMatrix(p1) if (missing(p2)) { if (nrow(p1) == 1) return(0) if (nrow(p1) == 0) return(NULL) p2 <- p1[-1, ,drop=FALSE] p1 <- p1[-nrow(p1), ,drop=FALSE] addNA <- TRUE } else { p2 <- .pointsToMatrix(p2) addNA <- FALSE } p <- cbind(p1[,1], p1[,2], p2[,1], p2[,2]) r <- .inversegeodesic(as.double(p[,1]), as.double(p[,2]), as.double(p[,3]), as.double(p[,4]), as.double(a), as.double(f)) r <- matrix(r, ncol=3, byrow=TRUE) if (addNA){ c(r[,1], NA) } else { r[,1] } } geosphere/R/centroid.R0000644000176200001440000000333113472155746014404 0ustar liggesusers# Author: Robert J. Hijmans # April 2010 # version 0.1 # license GPL3 # See http://local.wasp.uwa.edu.au/~pbourke/geometry/polyarea/ .basiccentroid <- function(p) { p2 <- rbind(p[-1,], p[1,]) P <- p[,1] * p2[,2] - p2[,1] * p[,2] area6 <- 6 * sum(P) / 2 x <- sum((p[,1] + p2[,1]) * P) y <- sum((p[,2] + p2[,2]) * P) return(cbind(x, y) / area6 ) } if (!isGeneric("centroid")) { setGeneric("centroid", function(x, ...) standardGeneric("centroid")) } setMethod("centroid", signature(x='data.frame'), function(x) { centroid(as.matrix(x)) }) setMethod("centroid", signature(x='matrix'), function(x) { x <- .pointsToMatrix(x, poly=TRUE) dif1 <- max(x[,1]) - min(x[,1]) rotated <- FALSE if (dif1 > 180) { x2 <- x x2[,1] <- x2[,1]%%(360) - 180 dif1 <- max(x[,1]) - min(x[,1]) dif2 <- max(x2[,1]) - min(x2[,1]) if (dif2 < dif1) { rotated <- TRUE x <- x2 } } x <- mercator(x, r=1) cenM <- .basiccentroid(x) cenG <- mercator(cenM, r=1, inverse=TRUE) if (rotated) { cenG[,1] <- cenG[,1] + 180 cenG[,1] <- .normalizeLonDeg(cenG[,1]) } rownames(cenG) <- NULL return(cenG) } ) setMethod("centroid", signature(x='SpatialPolygons'), function(x) { if ( isTRUE(is.projected(x)) ) { return( coordinates(x)) } x <- x@polygons n <- length(x) res <- matrix(nrow=n, ncol=2) for (i in 1:n) { parts <- length(x[[i]]@Polygons ) parea <- sapply(x[[i]]@Polygons, function(y){ methods::slot(y, "area")} ) hole <- sapply(x[[i]]@Polygons, function(y){ methods::slot(y, "hole")} ) parea[hole] <- -1 j <- which.max(parea) crd <- x[[i]]@Polygons[[j]]@coords res[i,] <- centroid(crd) } return(res) } ) geosphere/R/gcIntersectBearing.R0000644000176200001440000000442013472155746016337 0ustar liggesusers# author Chris Veness, Robert Hijmans # based on formulae by Ed Willians at # http://www.edwilliams.org/avform.htm#Intersection # October 2009 # version 0.1 # license GPL3 gcIntersectBearing <- function(p1, brng1, p2, brng2) { #crs13 true bearing from point 1 and the crs23 true bearing from point 2: toRad <- pi / 180 p1 <- .pointsToMatrix(p1) * toRad p2 <- .pointsToMatrix(p2) * toRad p <- cbind(p1[,1], p1[,2], p2[,1], p2[,2], as.vector(brng1), as.vector(brng2)) lon1 <- p[,1] lat1 <- p[,2] lon2 <- p[,3] lat2 <- p[,4] lat1[lat1==90|lat1==-90] <- NA lat2[lat2==90|lat2==-90] <- NA brng13 <- p[,5] * toRad brng23 <- p[,6] * toRad dLat <- lat2-lat1 dLon <- lon2-lon1 dist12 <- 2*asin( sqrt( sin(dLat/2)*sin(dLat/2) + cos(lat1)*cos(lat2)*sin(dLon/2)*sin(dLon/2) ) ) lat3 <- lon3 <- vector(length=length(nrow(lon1))) i <- rep(TRUE, length(dist12)) i[dist12 == 0] <- FALSE brngA <- acos( ( sin(lat2) - sin(lat1)*cos(dist12) ) / ( sin(dist12)*cos(lat1) ) ) brngA[is.na(brngA)] <- 0 # protect against rounding brngB <- acos( ( sin(lat1) - sin(lat2)*cos(dist12) ) / ( sin(dist12)*cos(lat2) ) ) g <- (sin(lon2-lon1) > 0) brng12 <- vector(length=length(g)) brng21 <- brng12 brng12[g] <- brngA[g] brng21[g] <- 2*pi - brngB[g] brng12[!g] <- 2*pi - brngA[!g] brng21[!g] <- brngB[!g] alpha1 <- (brng13 - brng12 + pi) %% (2*pi) - pi #// angle 2-1-3 alpha2 <- (brng21 - brng23 + pi) %% (2*pi) - pi #// angle 1-2-3 g <- sin(alpha1) == 0 & sin(alpha2) == 0 h <- (sin(alpha1) * sin(alpha2)) < 0 i <- !(g | h) & i lon3[!i] <- lat3[!i] <- NA alpha1 <- abs(alpha1) alpha2 <- abs(alpha2) alpha3 <- acos( -cos(alpha1)*cos(alpha2) + sin(alpha1)*sin(alpha2)*cos(dist12) ) dist13 <- atan2( sin(dist12)*sin(alpha1)*sin(alpha2), cos(alpha2)+cos(alpha1)*cos(alpha3) ) lat3[i] <- asin( sin(lat1[i])*cos(dist13[i]) + cos(lat1[i]) * sin(dist13[i]) * cos(brng13[i]) ) dLon13 <- atan2( sin(brng13)*sin(dist13)*cos(lat1), cos(dist13)-sin(lat1)*sin(lat3) ) lon3[i] <- lon1[i]+dLon13[i] lon3 <- (lon3+pi) %% (2*pi) - pi # // normalise to -180..180 degrees int <- cbind(lon3, lat3) / toRad colnames(int) <- c('lon', 'lat') int <- cbind(int, antipode(int)) rownames(int) <- NULL return(int) } geosphere/R/span.R0000644000176200001440000000443713472155746013546 0ustar liggesusers# Author: Robert J. Hijmans, r.hijmans@gmail.com # Date : April 2010 # Version 1 # Licence GPL v3 if (!isGeneric("span")) { setGeneric("span", function(x, ...) standardGeneric("span")) } setMethod("span", signature(x='matrix'), function(x, nbands='fixed', n=100, res=0.1, fun, r=6378137, ...) { dif1 <- max(x[,1]) - min(x[,1]) rotated <- FALSE if (dif1 > 180) { x2 <- x x2[,1] <- x2[,1] %% 360 - 180 dif1 <- max(x[,1]) - min(x[,1]) dif2 <- max(x2[,1]) - min(x2[,1]) if (dif2 < dif1) { rotated <- TRUE x <- x2 } } x <- SpatialPolygons(list(Polygons(list(Polygon(x)), 1))) if (missing(fun)) { x <- span(x, nbands=nbands, n=n, res=res, ...) } else { x <- span(x, nbands=nbands, n=n, res=res, fun=fun, ...) } if (rotated & missing(fun)) { x$longitude = x$longitude + 180 } return(x) } ) setMethod("span", signature(x='SpatialPolygons'), function(x, nbands='fixed', n=100, res=0.1, fun, ...) { if (!requireNamespace('raster')) {stop('you need to install the "raster" package to use this function')} if (! nbands %in% c('fixed', 'variable')) { stop('bandwidth should be "fixed" or "variable"') } if (nbands == 'fixed') { n = max(n, 1) } else { if (res <= 0) { stop('res should be larger than zero') } } npol <- length(x@polygons) lonspan <- list() latspan <- list() lon <- list() lat <- list() for (i in 1:npol) { pp <- x[i,] rs <- raster::raster(pp) if (nbands == 'fixed') { dim(rs) <- c(n, n) } else { raster::res(rs) <- res } latitude <- raster::yFromRow(rs, 1:nrow(rs)) longitude <- raster::xFromCol(rs, 1:ncol(rs)) xd <- distGeo(cbind(0,latitude), cbind(raster::xres(rs),latitude), ...) yd <- distGeo(cbind(0,0), cbind(0,raster::yres(rs)), ...) rs <- raster::rasterize(pp, rs, silent=TRUE) rs <- raster::getValues(rs, format='matrix') latspan[[i]] <- as.vector(apply(rs, 1, sum, na.rm=TRUE) * yd) lonspan[[i]] <- as.vector(apply(rs, 2, sum, na.rm=TRUE) * xd) lat[[i]] <- latitude lon[[i]] <- longitude } if (! missing(fun)) { lon = sapply(lonspan, fun) lat = sapply(latspan, fun) return(cbind(lon, lat)) } else { return(c(lonspan=lonspan, latspan=latspan, longitude=lon, latitude=lat)) } } ) geosphere/R/distHaversine.R0000644000176200001440000000500014032771416015367 0ustar liggesusers# author of original JavaScript code: Chris Vennes # (c) 2002-2009 Chris Veness # http://www.movable-type.co.uk/scripts/latlong.html # Licence: LGPL, without any warranty express or implied # Port to R by Robert Hijmans # October 2009 # version 0.1 # license GPL3 distHaversine <- function(p1, p2, r=6378137) { #* Haversine formula to calculate distance between two points specified by #* from: Haversine formula - R.W. Sinnott, "Virtues of the Haversine", #* Sky and Telescope, vol 68, no 2, 1984 #* http:#//www.census.gov/cgi-bin/geo/gisfaq?Q5.1 # source http://www.movable-type.co.uk/scripts/latlong.html # (c) 2002-2009 Chris Veness toRad <- pi / 180 p1 <- .pointsToMatrix(p1) * toRad if (missing(p2)) { p2 <- p1[-1, ,drop=FALSE] p1 <- p1[-nrow(p1), ,drop=FALSE] } else { p2 <- .pointsToMatrix(p2) * toRad } p = cbind(p1[,1], p1[,2], p2[,1], p2[,2], as.vector(r)) dLat <- p[,4]-p[,2] dLon <- p[,3]-p[,1] a <- (sin(dLat/2))^2 + cos(p[,2]) * cos(p[,4]) * (sin(dLon/2))^2 # to avoid values of 'a' that are a sliver above 1 # which may occur at antipodes # https://stackoverflow.com/questions/45889616/why-does-disthaversine-return-nan-for-some-pairs-of-coordinates# a <- pmin(a, 1) dist <- 2 * atan2(sqrt(a), sqrt(1-a)) * p[,5] return( as.vector(dist)) } # lon1 <- p[,1] # lat1 <- p[,2] # lon2 <- p[,3] # lat2 <- p[,4] # r <- p[,5] # dLat <- (lat2-lat1) # dLon <- (lon2-lon1) # a <- sin(dLat/2) * sin(dLat/2) + cos(lat1) * cos(lat2) * sin(dLon/2) * sin(dLon/2) # dist <- 2 * atan2(sqrt(a), sqrt(1-a)) * r .distHaversine2 <- function(p1, p2, r=6378137) { ## following wikipedia toRad <- pi / 180 p1 <- .pointsToMatrix(p1) * toRad if (missing(p2)) { p2 <- p1[-1, ,drop=FALSE] p1 <- p1[-nrow(p1), ,drop=FALSE] } else { p2 <- .pointsToMatrix(p2) * toRad } p = cbind(p1[,1], p1[,2], p2[,1], p2[,2], as.vector(r)) dLat <- p[,4]-p[,2] dLon <- p[,3]-p[,1] a <- (sin(dLat/2))^2 + cos(p[,2]) * cos(p[,4]) * (sin(dLon/2))^2 a <- pmin(a, 1) dist <- 2 * r * asin(sqrt(a)) return( as.vector(dist)) } # from Thierry de Meeus .distHaversine3 <- function(p1, p2, r=6378137) { toRad <- pi / 180 p1 <- .pointsToMatrix(p1) * toRad if (missing(p2)) { p2 <- p1[-1, ,drop=FALSE] p1 <- p1[-nrow(p1), ,drop=FALSE] } else { p2 <- .pointsToMatrix(p2) * toRad } p <- cbind(p1[,1], p1[,2], p2[,1], p2[,2], as.vector(r)) r*(pi/2-asin(sin((p[,4]))*sin((p[,2]))+cos((p[,3])-(p[,1]))*cos((p[,4]))*cos((p[,2])))) } geosphere/R/lengthLine.R0000644000176200001440000000150113472155746014663 0ustar liggesusers# Author: Robert J. Hijmans # August 2016 # version 1 # license GPL3 lengthLine <- function(line) { if (inherits(line, 'SpatialPolygons')) { requireNamespace('raster') line <- raster::geom(methods::as(line, 'SpatialLines')) } else if (inherits(line, 'SpatialLines')) { requireNamespace('raster') line <- raster::geom(line) } else { line <- cbind(object=1, part=1, cump=1, line[, 1:2]) colnames(line)[4:5] <- c('x', 'y') } ids <- unique(line[,1]) len <- rep(0, length(ids)) for (i in 1:length(ids)) { d <- line[line[,1] == ids[i], ] parts <- unique(d[,2]) for (p in parts) { dd <- d[d[,2] == p, ,drop=FALSE] for (j in 1:(nrow(dd)-1)) { len[i] <- len[i] + distGeo(dd[j, c('x', 'y'), drop=FALSE], dd[j+1, c('x', 'y'), drop=FALSE]) } } } return(len) } geosphere/R/distRhumb.R0000644000176200001440000000223113472155746014534 0ustar liggesusers# author of original JavaScript code: Chris Vennes # (c) 2002-2009 Chris Veness # http://www.movable-type.co.uk/scripts/latlong.html # Licence: LGPL, without any warranty express or implied # see http://www.edwilliams.org/avform.htm#Rhumb # for the original formulae # Port to R by Robert Hijmans # October 2009 # version 0.1 # license GPL3 distRhumb <- function(p1, p2, r=6378137) { # distance on a rhumb line toRad <- pi / 180 p1 <- .pointsToMatrix(p1) * toRad if (missing(p2)) { p2 <- p1[-1, ,drop=FALSE] p1 <- p1[-nrow(p1), ,drop=FALSE] } else { p2 <- .pointsToMatrix(p2) * toRad } p <- cbind(p1[,1], p1[,2], p2[,1], p2[,2], as.vector(r)) lon1 <- p[,1] lat1 <- p[,2] lon2 <- p[,3] lat2 <- p[,4] r <- p[,5] dLat <- (lat2-lat1) dLon <- abs(lon2-lon1) dPhi <- log(tan(lat2/2 + pi/4)/tan(lat1/2 + pi/4)) i <- abs(dLat) > 1e-10 q <- vector(length=length(i)) q[i] <- dLat[i]/dPhi[i] q[!i] <- cos(lat1[!i]) #// if dLon over 180 degrees take shorter rhumb across 180 degrees meridian: dLon[dLon > pi] <- 2*pi - dLon[dLon > pi] d <- sqrt(dLat*dLat + q*q*dLon*dLon) return(d * r) } geosphere/R/onGreatCircle.R0000644000176200001440000000166313472155746015324 0ustar liggesusers# Author: Robert J. Hijmans # based on Dr. Rick's advice at: # http://mathforum.org/library/drmath/view/66114.html # August 2010 # version 1 # license GPL3 onGreatCircle <- function(p1, p2, p3, tol=0.0001) { # is p3 an intermediate points on a great circle defined by p1 and p2? toRad <- pi / 180 p1 <- .pointsToMatrix(p1) p2 <- .pointsToMatrix(p2) p3 <- .pointsToMatrix(p3) p <- cbind(p1[,1], p1[,2], p2[,1], p2[,2], p3[,1], p3[,2]) p1 <- p[,1:2, drop=FALSE] * toRad p2 <- p[,3:4, drop=FALSE] * toRad p3 <- p[,5:6, drop=FALSE] * toRad lon1 <- p1[,1] lat1 <- p1[,2] lon2 <- p2[,1] lat2 <- p2[,2] lon <- p3[,1] lat <- p3[,2] newlat <- atan((sin(lat1)*cos(lat2)*sin(lon-lon2) - sin(lat2)*cos(lat1)*sin(lon-lon1)) / (cos(lat1)*cos(lat2)*sin(lon1-lon2))) res <- abs(newlat - lat) < tol meridian <- p1[,1] == p2[,1] & p1[,1] == p3[,1] res[meridian] <- TRUE return(as.vector(res)) } geosphere/R/destPointRhumb.R0000644000176200001440000000235313472155746015547 0ustar liggesusers# based on JavaScript code by Chris Vennes # (c) 2002-2009 Chris Veness # http://www.movable-type.co.uk/scripts/latlong.html # Licence: LGPL, without any warranty express or implied # see http://www.edwilliams.org/avform.htm#Rhumb # for the original formulae # Robert Hijmans # October 2009 # version 0.1 # license GPL3 destPointRhumb <- function(p, b, d, r=6378137) { toRad <- pi / 180 b <- as.vector(b) d <- as.vector(d) r <- as.vector(r) p <- .pointsToMatrix(p) p <- cbind(p[,1], p[,2], b, d, r) r <- p[,5] d <- p[,4] / r #angular distance in radians b <- p[,3] * toRad lon1 <- p[,1] * toRad lat1 <- p[,2] lat1[lat1==90|lat1==-90] <- NA lat1 <- lat1 * toRad lat2 <- lat1 + d * cos(b) dLat <- lat2-lat1 dPhi <- log( tan(lat2/2 + pi/4) / tan(lat1/2 + pi/4) ) i <- abs(dLat) > 1e-10 q <- vector(length=length(i)) q[i] <- dLat[i]/dPhi[i] q[!i] <- cos(lat1[!i]) dLon <- d * sin(b) / q # check for points past the pole../ i <- (abs(lat2) > pi/2) & lat2 > 0 lat2[i] <- pi-lat2[i] i <- (abs(lat2) > pi/2) & lat2 <= 0 lat2[i] <- (pi-lat2[i]) lon2 <- (lon1+dLon+pi)%%(2*pi) - pi res <- cbind(lon2, lat2) / toRad colnames(res) <- c('lon', 'lat') return(res) } geosphere/R/bearingRhumb.R0000644000176200001440000000221113472155746015176 0ustar liggesusers# author of original JavaScript code: Chris Vennes # (c) 2002-2009 Chris Veness # http://www.movable-type.co.uk/scripts/latlong.html # Licence: LGPL, without any warranty express or implied # see http://www.edwilliams.org/avform.htm#Rhumb # for the original formulae # Port to R by Robert Hijmans # October 2009 # version 0.1 # license GPL3 bearingRhumb <- function(p1, p2) { toRad <- pi / 180 p1 <- .pointsToMatrix(p1) * toRad p2 <- .pointsToMatrix(p2) * toRad p <- cbind(p1[,1], p1[,2], p2[,1], p2[,2]) p1 <- p[, 1:2, drop=FALSE] p2 <- p[, 3:4, drop=FALSE] keep <- ! apply(p1 == p2, 1, sum) == 2 res <- rep(NA, length=nrow(p1)) if (sum(keep) == 0) { return(res) } lon1 <- p1[keep, 1, drop=FALSE] lat1 <- p1[keep, 2, drop=FALSE] lon2 <- p2[keep, 1, drop=FALSE] lat2 <- p2[keep, 2, drop=FALSE] dLon <- (lon2-lon1) dPhi <- log(tan(lat2/2 + pi/4)/tan(lat1/2+pi/4)) i <- (abs(dLon) > pi) j <- i & dLon > 0 dLon[j] <- -(2*pi-dLon[j]) j <- i & dLon <= 0 dLon[j] <- dLon[j] <- (2*pi+dLon[j]) b <- atan2(dLon, dPhi) b <- b / toRad b <- (b+360) %% 360 res[keep] = b return(res) } geosphere/R/bearing.R0000644000176200001440000000254414161534017014175 0ustar liggesusers# Author: Robert J. Hijmans # Date : March 2010 / May 2015 # Version 2.0 # Licence GPL v3 bearing <- function(p1, p2, a=6378137, f=1/298.257223563) { p1 <- .pointsToMatrix(p1) if (missing(p2)) { if (nrow(p1) < 2) { return(NA) } p2 <- p1[-1, ,drop=FALSE] p1 <- p1[-nrow(p1), ,drop=FALSE] addNA <- TRUE } else { p2 <- .pointsToMatrix(p2) addNA <- FALSE } p <- cbind(p1[,1], p1[,2], p2[,1], p2[,2]) r <- .inversegeodesic(as.double(p[,1]), as.double(p[,2]), as.double(p[,3]), as.double(p[,4]), as.double(a[1]), as.double(f[1])) r <- matrix(r, ncol=3, byrow=TRUE) if (addNA) { c(r[, 2], NA) } else { r[, 2] } } .old_bearing <- function(p1, p2) { toRad <- pi / 180 p1 <- .pointsToMatrix(p1) * toRad p2 <- .pointsToMatrix(p2) * toRad p <- cbind(p1[,1], p1[,2], p2[,1], p2[,2]) p1 <- p[, 1:2, drop=FALSE] p2 <- p[, 3:4, drop=FALSE] keep <- ! apply(p1 == p2, 1, sum) == 2 res <- rep(NA, length=nrow(p1)) if (sum(keep) == 0) { return(res) } p1 <- p1[keep, , drop=FALSE] p2 <- p2[keep, , drop=FALSE] dLon <- p2[,1] - p1[,1] y <- sin(dLon) * cos(p2[,2]) x <- cos(p1[,2]) * sin(p2[,2]) - sin(p1[,2]) * cos(p2[,2]) * cos(dLon) azm <- atan2(y, x) / toRad azm <- (azm+360) %% 360 i <- azm > 180 azm[i] <- -1 * (360 - azm[i]) res[keep] <- azm return(res) } geosphere/R/horizon.R0000644000176200001440000000022513472155746014264 0ustar liggesusers horizon <- function(h, r=6378137) { x = cbind(as.vector(h), as.vector(r)) h = x[,1] r = x[,2] b = 0.8279 sqrt( 2 * r * h / b ) } geosphere/R/pointsToMatrix.R0000644000176200001440000000512714472422775015606 0ustar liggesusers# Author: Robert J. Hijmans & Jacob van Etten # October 2009 # version 1 # license GPL3 .pointsToMatrix <- function(p, checkLonLat=TRUE, poly=FALSE) { if (inherits(p, 'SpatVector')) { stopifnot(terra::geomtype(p) == "points") test <- terra::is.lonlat(p) if (! isTRUE (test) ) { if (is.na(test)) { warning('Coordinate reference system of SpatVector is not set. Assuming it is degrees (longitude/latitude)!') } else if (checkLonLat) { p <- terra::project(p, "+proj=longlat") } } p <- terra::crds(p) } else if (inherits(p, 'SpatialPoints')) { test <- !sp::is.projected(p) if (! isTRUE (test) ) { if (is.na(test)) { warning('Coordinate reference system of SpatialPoints object is not set. Assuming it is degrees (longitude/latitude)!') } else if (checkLonLat) { stop('Points are projected. They should be in degrees (longitude/latitude)') } } p <- sp::coordinates(p) } else if (is.data.frame(p)) { p <- as.matrix(p) } else if (is.vector(p)){ if (length(p) != 2) { stop('Wrong length for a vector, should be 2') } else { p <- matrix(p, ncol=2) } } else if (is.matrix(p)) { if (ncol(p) != 2) { stop( 'A points matrix should have 2 columns') } cn <- colnames(p) if (length(cn) == 2) { if (toupper(cn[1]) == 'Y' | toupper(cn[2]) == 'X') { warning('Suspect column names (x and y reversed?)') } if (toupper(substr(cn[1],1,3) == 'LAT' | toupper(substr(cn[2],1,3)) == 'LON')) { warning('Suspect column names (longitude and latitude reversed?)') } } } else { stop('points should be vectors of length 2, matrices with 2 columns, or inheriting from a SpatialPoints or SpatVector object') } if (! is.numeric(p) ) { p[] <- as.numeric(p) } if (checkLonLat & nrow(p) > 0) { if (length(stats::na.omit(p[,1])) > 0) { if (min(p[,1], na.rm=TRUE) < -360) { stop('longitude < -360') } if (max(p[,1], na.rm=TRUE) > 360) { stop('longitude > 360') } if (min(p[,1], na.rm=TRUE) < -180) { warning('longitude < -180') } if (max(p[,1], na.rm=TRUE) > 180) { warning('longitude > 180') } } if (length(stats::na.omit(p[,2])) > 0) { if (min(p[,2], na.rm=TRUE) < -90) { stop('latitude < -90') } if (max(p[,2], na.rm=TRUE) > 90) { stop('latitude > 90') } } } if (poly) { if (! isTRUE(all.equal(p[1,], p[nrow(p),]))) { p <- rbind(p, p[1,]) } i <- p[-nrow(p),1] == p[-1,1] & p[-nrow(p),2] == p[-1,2] i <- which(isTRUE(i)) if (length(i) > 0) { p <- p[-i, ,drop=FALSE] } .isPolygon(p) } return(p) } geosphere/vignettes/0000755000176200001440000000000014677403144014255 5ustar liggesusersgeosphere/vignettes/geosphere.Rnw0000644000176200001440000004033113472155746016733 0ustar liggesusers\documentclass{article} \usepackage{natbib} \usepackage{graphics} \usepackage{amsmath} \usepackage{indentfirst} \usepackage[utf8]{inputenc} \usepackage{hyperref} \usepackage{hanging} %\VignetteIndexEntry{Introduction to the geosphere package} \SweaveOpts{keep.source=TRUE} \SweaveOpts{png=TRUE, pdf=FALSE} \SweaveOpts{resolution=100} \begin{document} <>= options(keep.source = TRUE, width = 60) foo <- packageDescription("geosphere") @ \title{Introduction to the "geosphere" package \\ (Version \Sexpr{foo$Version})} \author{Robert J. Hijmans} \maketitle \section{Introduction} This vignette describes the R package '\verb@geosphere@'. The package implements spherical trigonometry functions for geographic applications. Many of the functions have applications in navigation, but others are more general, or have no relation to navigation at all. There is a number of functions to compute distance and direction (= bearing, azimuth, course) along great circles (= shortest distance on a sphere, or "as the crow flies") and along rhumb lines (lines of constant bearing). There are also functions that compute distances on a spheroid. Other functions include the computation of the location of an object at a given direction and distance; and the area, perimeter, and centroid of a spherical polygon. Geographic locations must be specified in longitude and latitude (and in that order!) in degrees (i.e., NOT in radians). Degrees are (obviously) in decimal notation. Thus 12 degrees, 10 minutes, 30 seconds = 12 + 10/60 + 30/3600 = 12.175 degrees. The southern and western hemispheres have a negative sign. The default unit of distance is meter; but this can be adjusted by supplying a different radius 'r' to functions. Directions are expressed in degrees (N = 0 and 360, E = 90, S = 180, and W = 270 degrees). If arguments of functions that take several arguments (e.g. points, bearings, radius of the earth), do not have the same length (for vectors) or number of rows (for matrices) the shorter arguments are re-cycled. Many functions in this package are based on formulae provided by Ed Williams (\url{http://www.edwilliams.org/ftp/avsig/avform.txt}, and partly on javascript implementations of these formulae by Chris Veness (\url{http://www.movable-type.co.uk/scripts/latlong.html} ) Most geodesic computations (for a spheroid rather than a sphere) use the GeographicLib by C.F.F. Karney (\url{http://geographiclib.sourceforge.net/}. \section{Great circle distance} There are four different functions to compute distance between two points. These are, in order of increasing complexity of the algorithm, the 'Spherical law of cosines', 'Haversine' (Sinnott, 1984), 'Vincenty Sphere' and 'Vincenty Ellipsoid' (Vincenty, 1975) methods. The first three assume the earth to be a sphere, while the 'Vincenty Ellipsoid' assumes it is an ellipsoid (which is closer to the truth). The results from the first three functions are identical for practical purposes. The Haversine ('half-versed-sine') formula was published by R.W. Sinnott in 1984, although it has been known for much longer. At that time computational precision was lower than today (15 digits precision). With current precision, the spherical law of cosines formula appears to give equally good results down to very small distances. If you want greater accuracy, you could use the distVincentyEllipsoid method. Below the differences between the three spherical methods are illustrated. At very short distances, there are small differences between the 'law of the Cosine' and the other two methods. There are even smaller differences between the 'Haversine' and 'Vincenty Sphere' methods at larger distances. <>= library(geosphere) Lon <- c(1:9/1000, 1:9/100, 1:9/10, 1:90*2) Lat <- c(1:9/1000, 1:9/100, 1:9/10, 1:90) dcos <- distCosine(c(0,0), cbind(Lon, Lat)) dhav <- distHaversine(c(0,0), cbind(Lon, Lat)) dvsp <- distVincentySphere(c(0,0), cbind(Lon, Lat)) par(mfrow=(c(1,2))) plot(log(dcos), dcos-dhav, col='red', ylim=c(-1e-05, 1e-05), xlab="Log 'Law of Cosines' distance (m)", ylab="Law of Cosines minus Haversine distance") plot(log(dhav), dhav-dvsp, col='blue', xlab="Log 'Haversine' distance (m)", ylab="Vincenty Sphere minus Haversine distance") @ The difference with the 'Vincenty Ellipsoid' method is more pronounced. In the example below (using the default WGS83 ellipsoid), the difference is about 0.3% at very small distances, and 0.15% at larger distances. <>= dvse <- distVincentyEllipsoid(c(0,0), cbind(Lon, Lat)) plot(dvsp/1000, (dvsp-dvse)/1000, col='blue', xlab='Vincenty Sphere Distance (km)', ylab="Difference between 'Vincenty Sphere' and 'Vincenty Ellipsoid' methods (km)") @ For the most precise distance computation use the 'distGeo' function. \section{Points on great circles} Points on a great circle are returned by the function 'greatCircle', using two points on the great circle to define it, and an additional argument to indicate how many points should be returned. You can also use greatCircleBearing, and provide starting points and bearing as arguments. gcIntermediate only returns points on the great circle that are on the track of shortest distance between the two points defining the great circle; and midPoint computes the point half-way between the two points. You can use onGreatCircle to test whether a point is on a great circle between two other points. <>= LA <- c(-118.40, 33.95) NY <- c(-73.78, 40.63) data(wrld) plot(wrld, type='l') gc <- greatCircle(LA, NY) lines(gc, lwd=2, col='blue') gci <- gcIntermediate(LA, NY) lines(gci, lwd=4, col='green') points(rbind(LA, NY), col='red', pch=20, cex=2) mp <- midPoint(LA, NY) onGreatCircle(LA,NY, rbind(mp,c(0,0))) points(mp, pch='*', cex=3, col='orange') greatCircleBearing(LA, brng=270, n=10) @ \section{Point at distance and bearing} Function destPoint returns the location of point given a point of origin, and a distance and bearing. Its perhaps obvious use in georeferencing locations of distant sitings. It can also be used to make circular polygons (with a fixed radius, but in longitude/latitude coordinates) <>= destPoint(LA, b=65, d=100000) circle=destPoint(c(0,80), b=1:365, d=1000000) circle2=destPoint(c(0,80), b=1:365, d=500000) circle3=destPoint(c(0,80), b=1:365, d=100000) plot(circle, type='l') polygon(circle, col='blue', border='black', lwd=4) polygon(circle2, col='red', lwd=4, border='orange') polygon(circle3, col='white', lwd=4, border='black') @ \section{Maximum latitude on a great circle} You can use the functions illustrated below to find out what the maximum latitude is that a great circle will reach; at what latitude it crosses a specified longitude; or at what longitude it crosses a specified latitude. From the map below it appears that Clairaut's formula, used in gcMaxLat is not very accurate. Through optimization with function greatCircle, a more accurate value was found. The southern-most point is the antipode (a point at the opposite end of the world) of the northern-most point. <>= ml <- gcMaxLat(LA, NY) lat0 <- gcLat(LA, NY, lon=0) lon0 <- gcLon(LA, NY, lat=0) plot(wrld, type='l') lines(gc, lwd=2, col='blue') points(ml, col='red', pch=20, cex=2) points(cbind(0, lat0), pch=20, cex=2, col='yellow') points(t(rbind(lon0, 0)), pch=20, cex=2, col='green' ) f <- function(lon){gcLat(LA, NY, lon)} opt <- optimize(f, interval=c(-180, 180), maximum=TRUE) points(opt$maximum, opt$objective, pch=20, cex=2, col='dark green' ) anti <- antipode(c(opt$maximum, opt$objective)) points(anti, pch=20, cex=2, col='dark blue' ) @ \section{Great circle intersections} Points of intersection of two great circles can be computed in two ways. We use a second great circle that connects San Francisco with Amsterdam. We first compute where they cross by defining the great circles using two points on it (gcIntersect). After that, we compute the same points using a start point and initial bearing (gcIntersectBearing). The two points where the great circles cross are antipodes. Antipodes are connected with an infinite number of great circles. <>= SF <- c(-122.44, 37.74) AM <- c(4.75, 52.31) gc2 <- greatCircle(AM, SF) plot(wrld, type='l') lines(gc, lwd=2, col='blue') lines(gc2, lwd=2, col='green') int <- gcIntersect(LA, NY, SF, AM) int antipodal(int[,1:2], int[,3:4]) points(rbind(int[,1:2], int[,3:4]), col='red', pch=20, cex=2) bearing1 <- bearing(LA, NY) bearing2 <- bearing(SF, AM) bearing1 bearing2 gcIntersectBearing(LA, bearing1, SF, bearing2) @ \section{Triangulation} Below is triangulation example. We have three locations (NY, LA, MS) and three directions (281, 60, 195) towards a target. Because we are on a sphere, there are two (antipodal) results. We only show one here (by only using int[,1:2]). We compute the centroid from the polygon defined with the three points. To accurately draw a spherical polygon, we can use makePoly. This function inserts intermediate points along the paths between the vertices provided (default is one point every 10 km). <>= MS <- c(-93.26, 44.98) gc1 <- greatCircleBearing(NY, 281) gc2 <- greatCircleBearing(MS, 195) gc3 <- greatCircleBearing(LA, 55) plot(wrld, type='l', xlim=c(-125, -70), ylim=c(20, 60)) lines(gc1, col='green') lines(gc2, col='blue') lines(gc3, col='red') int <- gcIntersectBearing(rbind(NY, NY, MS), c(281, 281, 195), rbind(MS, LA, LA), c(195, 55, 55)) int distm(rbind(int[,1:2], int[,3:4])) int <- int[,1:2] points(int) poly <- rbind(int, int[1,]) centr <- centroid(poly) poly2 <- makePoly(int) polygon(poly2, col='yellow') points(centr, pch='*', col='dark red', cex=2) @ \section{Bearing} Below we first compute the distance and bearing from Los Angeles (LA) to New York (NY). These are then used to compute the point from LA at that distance in that (initial) bearing (direction). Bearing changes continuously when traveling along a Great Circle. The final bearing, when approaching NY, is also given. <>= d <- distCosine(LA, NY) d b <- bearing(LA, NY) b destPoint(LA, b, d) NY finalBearing(LA, NY) @ \section{Getting off-track} What if we went off-course and were flying over Minneapolis (MS)? The closest point on the planned route (p) can be computed with the alongTrackDistance and destPoint functions. The distance from 'p' to MS can be computed with the dist2gc (distance to great circle, or cross-track distance) function. The light green line represents the along-track distance, and the dark green line represents the cross-track distance. <>= atd <- alongTrackDistance(LA, NY, MS) p <- destPoint(LA, b, atd) plot(wrld, type='l', xlim=c(-130,-60), ylim=c(22,52)) lines(gci, col='blue', lwd=2) points(rbind(LA, NY), col='red', pch=20, cex=2) points(MS[1], MS[2], pch=20, col='blue', cex=2) lines(gcIntermediate(LA, p), col='green', lwd=3) lines(gcIntermediate(MS, p), col='dark green', lwd=3) points(p, pch=20, col='red', cex=2) dist2gc(LA, NY, MS) distCosine(p, MS) @ \section{Distance to a polyline} The two function describe above are used in the dist2Line function that computes the shortest distance between a set of points and a set of spherical poly-lines (or polygons). <>= line <- rbind(c(-180,-20), c(-150,-10), c(-140,55), c(10, 0), c(-140,-60)) pnts <- rbind(c(-170,0), c(-75,0), c(-70,-10), c(-80,20), c(-100,-50), c(-100,-60), c(-100,-40), c(-100,-20), c(-100,-10), c(-100,0)) d = dist2Line(pnts, line) plot( makeLine(line), type='l') points(line) points(pnts, col='blue', pch=20) points(d[,2], d[,3], col='red', pch='x', cex=2) for (i in 1:nrow(d)) lines(gcIntermediate(pnts[i,], d[i,2:3], 10), lwd=2, col='green') @ \section{Rhumb lines} Rhumb (from the Spanish word for course, 'rumbo') lines are straight lines on a Mercator projection map (and at most latitudes pretty straight on an equirectangular projection (=unprojected lon/lat) map). They were used in navigation because it is easier to follow a constant compass bearing than to continually adjust direction as is needed to follow a great circle, even though rhumb lines are normally longer than great-circle (orthodrome) routes. Most rhumb lines will gradually spiral towards one of the poles. <>= NP <- c(0, 85) bearing(SF, NP) b <- bearingRhumb(SF, NP) b dc <- distCosine(SF, NP) dr <- distRhumb(SF, NP) dc / dr pr <- destPointRhumb(SF, b, d=round(dr/100) * 1:100) pc <- rbind(SF, gcIntermediate(SF, NP), NP) par(mfrow=c(1,2)) data(wrld) plot(wrld, type='l', xlim=c(-140,10), ylim=c(15,90), main='Equirectangular') lines(pr, col='blue') lines(pc, col='red') data(merc) plot(merc, type='l', xlim=c(-15584729, 1113195), ylim=c(2500000, 22500000), main='Mercator') lines(mercator(pr), col='blue') lines(mercator(pc), col='red') @ \section{Characterizing polygons} The package has functions to compute the area, perimeter, centroid, and 'span' of a spherical polygon. One approach to compute these measures is to project the polygons first. Here we directly compute them based on spherical coordinates (longitude / latitude), except for centroid, which is computed by projecting the data to the Mercator projection (and inversely projecting the result). The function makePoly inserts additional vertices into a spherical polygon such that it can be plotted (perhaps after first projecting it) more correctly in a plane. Vertices are inserted, where necessary, at a specified distance. The function is only beneficial for polygons with large inter-vertex distances (in terms of longitude), particularly at high latitudes. <>= pol <- rbind(c(-120,-20), c(-80,5), c(0, -20), c(-40,-60), c(-120,-20)) areaPolygon(pol) perimeter(pol) centroid(pol) span(pol, fun=max) nicepoly = makePoly(pol) plot(pol, xlab='longitude', ylab='latitude', cex=2, lwd=3, xlim=c(-140, 0)) lines(wrld, col='grey') lines(pol, col='red', lwd=2) lines(nicepoly, col='blue', lwd=2) points(centroid(pol), pch='*', cex=3, col='dark green') text(centroid(pol)-c(0,2.5), 'centroid') legend(-140, -48, c('planar','spherical'), lty=1, lwd=2, col=c('red', 'blue'), title='polygon type') @ \section{Sampling} Random or regular sampling of longitude/latitude values on the globe needs to consider that the globe is spherical. That is, if you would take random points for latitude between -90 and 90 and for longitude between -180 and 180, the density of points would be higher near the poles than near the equator. In contrast, functions 'randomCoordinates' and 'randomCoordinates' return samples that are spatially balanced. <>= plot(wrld, type='l', col='grey') a = randomCoordinates(500) points(a, col='blue', pch=20, cex=0.5) b = regularCoordinates(3) points(b, col='red', pch='x') @ \section{Daylength} You can compute daylenght according to the formula by Forsythe et al. (1995). For any day of the year (an integer between 1 and 365; or a 'Date' object. <>= as.Date(80, origin='2009-12-31') as.Date(172, origin='2009-12-31') plot(0:90, daylength(lat=0:90, doy=1), ylim=c(0,24), type='l', xlab='Latitude', ylab='Daylength', main='Daylength by latitude and day of year', lwd=2) lines(0:90, daylength(lat=0:90, doy=80), col='green', lwd=2) lines(0:90, daylength(lat=0:90, doy=172), col='blue', lwd=2) legend(0,24, c('1','80','172'), lty=1, lwd=2, col=c('black', 'green', 'blue'), title='Day of year') @ \section{References} \begin{hangparas}{3em}{1} \noindent Forsythe, W.C., E.J. Rykiel Jr., R.S. Stahl, H. Wu and R.M. Schoolfield, 1995. A model comparison for daylength as a function of latitude and day of the year. Ecological Modeling 80:87-95. \noindent Sinnott, R.W, 1984. Virtues of the Haversine. Sky and Telescope 68(2): 159 \noindent Vincenty, T. 1975. Direct and inverse solutions of geodesics on the ellipsoid with application of nested equations. Survey Review 23(176): 88-93. Available here: \url{http://www.ngs.noaa.gov/PUBS_LIB/inverse.pdf} \end{hangparas} \end{document} geosphere/data/0000755000176200001440000000000013472155746013162 5ustar liggesusersgeosphere/data/merc.RData0000644000176200001440000106205413472155746015035 0ustar liggesusersý7zXZi"Þ6!ÏXÌá~5ïþ])TW"änRÊŸãXVÀØø%>Áƒ§"UZ t»Bk×öô}ùMI™ÞÞtrøàÎî€U)ËÓW*v´î*‰t6€_uXý­¤éŽžS…H\±5èKØRahwX¿A-H€±ÏF*˜ÓË«f‰…\vfÄ!Î0"q¹ô=ï1´Ê:ï¨(±m7AÚþ$*˶–Ê•¢MwiÁébj ˆâq©„©ºÂÜ—‰aÐ(î…Àû—,Âz)¿˜Ø=àÌÖJ«9(årD†ï€Nå–rQÃ葹#rá<\@Í |üPâ¹ÏÒl8ðŒMþ›é…Öq4°‚hR6ÉFÄ ®Á¡¬8é¹aå^|}íCby<Ûª€ãÄEC$qŃ׉ü>øÞ1ðßЄ¾à‘Fâû½Þ…±¿B߈æÊï-¬¼ ŸŠ*p}º“…j{Nk0vkIÉ3£­+tG¬þð3¡}rè:­íâ9vd^ {ý¥"éñeú'¡•¤BL­ÏËYþSŸU»AqëP(¹Ü˜úLy±OßWôÛÏÒ8N÷‡Ø5P‹™¹àŸÞ’ýÞìÁCº!ß].45è@èE¡Gà°Ö, ) ­n#¸f¡Õÿ`'Dà)”èáZÎSÓâGè´*ˆÚéÜÔ0h[0·še¿Ê©‚8^[ôÝœq´š‘†>J_±lß ás¹£|ø Ä ÿÙÅH"œ^Iùp?}ùë­[﫟®sÚDÛ[`FVvÍÍ“›94q2rPs4f# ûÜhù—)!­”ñÀPLˆ0Åä_F‰é°”ÉÊ«§õF76Xèðÿ|½Ã1â(á†X Í&Ã]tåøêƒ ´ŽÚvö«*•ÅzoË ƒz™æ^@ãËÝ{r.É´|tIâ´)´¨n5¢Ä=;˜»Ê5–˜Ã̽åÁÏ.SzÏ6ˆ·’–ŽšëOo°O:°y[û-M…Occ~¦KôGÝë·£>;Ÿ4_!¦Ÿš†È4Œ½ŒCý\oº²´©ÚXïü â ñJÚ&ÓÚ¿ß}é-‘U 5Ùú¨ye\¬Çª‘¹ªŽ‰WçÁßÁÓÌ ƒ•hÞæ£Á™a ³‡4€æ®[ðœíã\8ê80 ׎F-…|Ê?ã=__5âX½‰< ÛÊo ß 6'ÅÚ~l„$iyQ’÷NCÃSÊbsÀ۸ľ‘ŠeĹw›9¹Q»ÉÏR°QS u$ YñßÁ'׌âôv#út¬>ÜP°ˆÉ | Vå?Ú*ÏpY¨ð5Ãþd¨¬UÆRqR¨%»l…|÷ÿ CYÆ.;œ½*aBä¢aÏþ8V¦1‡ËÚXfm´¿ôu•80·•Æè ….G¨86ð¥Únµ °€»7ùSü—æºÓ¿Ñ­†UðÛµ¥¸‹bç }ñmëòIU±lø”~†fà®,çË•œkž$P$KÒZº=$ñ‹Sy=EЬÄsõ£ë•]‘}w|sêqXH|n™ì”Í÷°–g½?Ë( J&ޱcZæf xrßcG`¡g?k÷dObQËw¼"EŒ1Ä­Ëzâ4¯t2ý³,‘ Êä]rU{ûbçΦ’LNŠç™åº ì‚æ7Žãõ¡¯œƒ>}£¦#Qæ¶Ý¹;€.¯„õ•pc‹·ÚçÉ{H 8çY¬<[œ4Mž[x†# L£†Æz ëÕ?©·Û¯%tfF\àx†GOq°}æ]råúÅB= Ò­¿8Ôd´5…Óì,ÙQ±¤G¼›§J¼â?NÄ9i3åÓAL‰R¤F /¸¥ù»,‘àaCëhâ`‰§dô7|^}¶|œ¯c9”Ü^ÐÌz-ñåÃ<0Älßø¾×Òy-Þ ´ ûPY‘ÄUé8Îó’ÜÜRý¤Ëkã™’ûÚ7Ò9PúC¨D‘ÓQ%¨ó0oS,JÝ@=ø6Îç÷8œ6IþF¬mYTwà-£¹¸ØOu§Îøž“Mñ¦õ 8Ò·/¬‚·=àUäÛ è| ^ ʋ패3~êûa2e– •x°1R)=7>±³_ÓÍì™ã§ÓáE&ÃD¨mRþ.os üCÂàfð}P‹]MЋ$èu9Hªl (ÑûøD’‘û ãôôÿÈZ½ûä¦Zœ›^:§º’D#ˆA>O’™0å‹kˆ¤k™#ÅH…ðˆz´¬aÚ1ˆvœDÐÝie¾{uˆ.»Ú“ÅåÒü•àŽu‘Ëü?„|h»ìŽbrUB¥¹bA<òá>pU½‰ŒG]"Ø:µÈ_¥v)Ú-uѼýó•ž”Vk(;Oi•€ÇâáMàŒÆuOò÷`FæH/§÷<ª‹Q4¯ S輌@$Ã'¬ðÍÛ‘JãÅÈÅkÛBòDU|9`‚¸©gŒ–bÏÍ•¤ûpÅ3‚ÉوÚV•™;G£2‘„\¨Ã"iNËe_Ç^nä"æ©Ö$Ÿ\øÜ¶NXVî/ Ä"¼q؆úA¢´™ÝF£Î¹qüh³ ¨+x Eè;k(Ðܱ€BŠU1]¬`)lçdM†„`WáÚŸ3—š,|Éß#3´Ñ³%Š”²;l_8ƒ’Ò—NùntcüèȵbYß<†¨x ê$î·pÎu·¡4& íÖŒ×7‡ÝU*ˆŸë1zK¼úü¿:!nu¢±fÚP’ÿþ5:ð‘©fiTææáöSª"§À]°$,?__–Í:£^\xÝ&ÏFžÏ Åud 6¿5¾RyÉjüú©Ìpò®ùœH$~ ùgàÆÓL…=°Ìö1¦í|ênËû·Å4Ÿ'޶nÈ·;ˆ¶Üéwáo§boÙSª…Võ½¢²9…Q¢ø½p½† îì{ lTò¨pÑó³õfßê¥W~§\+–«d ½`¨“ÚØl î ìèµÈ3‹€AýI„ãL†úßÜ€j6"©{/¢ç*’ŸƒZH”PßÁ‹ƒN2p/ þ €Sö§Iœ«V§¦³»ð ÈNg7A˜Ú‚_šGÄêÛ)ø"Ú#Š-˜Y©–‹Z®*†ó©çÌÂ鸎“+0Ìñàa ˜z¯ÆÒF%³ÀZ÷uú°?þ¾=˜4²ÈçNgdz‚W »5ÄE,…a){z ‡wºmŠË¡£:»-Õ7·èTÁ þQZN6öØP{BšFI| pñ ¥2ÕNXvwoíêê³+!ÕSßl屜—ÞÄp#öÿ“ð†"e¡^ÌPà yâ"¿ewôÓðûs›ù:.ïÿÕ`€W¤Á§ÄMùã%`æ á¼:Œ"ÆÎ£¶ n `´M{¸fð{e‹úö¡ÿ^å2ÃyÃ]AÝt‚¸Œà=$É×¼óœ\l bO›.pœ Ü­³ ³Z¼_`%ÏXرÀsžFdã ôÏ©^ïÐð%PÍ©ažŽæi‚±ý}ñÖŽÊS>„²jQÉ ±¥~ÁQÛßÚ(qÄXtb_:žB¨O`³Äréã¦l¬­3òÍ[‡wôþ‹s›cDºu¤-û‘ÖcݩתüºÂA˜ "Ÿý­¶cH€£} ðŠ’.¨ŽÞ$k‰B÷ˆ\wc¢­ü€ÅB¶ï ’Û„“ê×úÚ-¦ÝKs&ˆ{K oê¨ð‡Ü!É O«áPd ñ]WNkñ‹, '‡ž–r+Ï¡»klè§¢GŽîÚÄGoóRד_«¶Ç‡°~9l>'^OœuDí#þ[J‡K%šù‘xG[QÇ0õÂþ&4Ì‹ÓwwêHФ Þ®úĆFQk–€ô²B‹`ûÌרMl5ÑÞŬm­iñI R]Á,™Uð±Î‚™G'·Ü/bÎ i:ÖþžnpW¤AúòÛk,Sm÷û?ºœJ»–Té£Hzêcó¹²}{±žâ;5,—,§²·•g^ˆ½z˜Ñ;ÎݪŠûÊúÖoæ>¢j“Ò÷E2(Æ@&Ì@Ä9‰Ü×®q<"þŠ¢¹&â=ø8ÿ5!£Ù…±¥Nx(ÖÙì¡ÔËêIÃè>´ÀCÃum†úðö¨ÎÎm–ô>Ïj­¾?V³þ{C¬%I«È¦¶o^/a[ÎÍÔƒÇñL^ K\í^÷úð0ÉŸú§Öfrjq^UÞcJ{¥­N~—CD;N`?I±ƒßé…ãUòe÷mÓó}ûÖê¿ÂY6ïµU¹—厽§Ó§Ü)%«š9ýïä‡,7Ÿ—s޵n@cS†#ÊÎó9YýZC˜•Å›ˆrïVoIqMóìΚ™Ë™­TÓæÏNÂñ|–ÜÈÆrâªaD3°¿“ràhk(É”¯²ìÄ{Ⱥ$˜ÉREÇ0rO‹œ®0—ÂþÌ¥ß2ˆ#;‚YWœ$ƒ8*éMÔúv›šM•hº•úx]½ÅU ±*—,e›i’pï4³ Ý@–ö8êׇ²^Œî+f‰•L…"^WôãðÐ+OWEèéc†à'Ö›¹øžDÈ¿‹…¼y‹obÈì¸+CýݤE9ª[ê,„5_"ÉñÀgøçãÿI°¹^É—CfF öâ㇡4‚rHUmÁÝø Æf"ÆÍAÖùÉA-­Ñ&WÞîO ¡#ÂhŸ©®UÕáß(îI*ˆÝ<,L£ŠSéM=n¼G×zÕ´oïªJš|8pôÛÛSN³]ÒÁü7¶MÌT<œBaäH‰BNþ™áœdÞz®“mØB+y !Ò¥‚ÐDÊ=/Ü8?XøÍw.{§S~@JÍ–ÙÁFóCØ»~²¾[„#-mdϵɮ˜ã”ÄÎ µ8e†ª c¹Ïä{6Ll˜!=zdzÒÏZ¸oæ¥~p:.êÝ¢`ŽcBǬHh5FŽ!ÜcQ”#ˆ”°,"S–¤kKÒh—³Ç©6«3w +nÐYIΩx ãø’Ùæ-N9NW€;ŽŒñ8Éâèõ²]ʡӹx«ÿÛ 9ú§u¢1\X!óß3cŽ‹çE8§DJ7Áç"š6ú@Ó\ûxþ˺0%üMo’ŒÑ`•õÒÁü9bt”¶¿c°ØÕ _PìÅÊxmhxžPË´ ™‰S6Dj1+:|ïÎÏör “s²÷Z}èבɤÒ†_e-iB7Å3:E ï˺|i[äuÇ Av´› ×™ì ñîJ=¾uŒ3ôгúÚNô¥á]µ5ï„s)†}Žrƹ_7³X_)ÅcP·Õ³µJ}È©h]ùú;@z´€[àEÿU·<}æ?è˜GÉÅ1¤] å!JÃw¶Sò(¯éÑ;%«}õ±é½MýO³%mÉòWêŽ{%…hß-á‹xÀ Õg귚Ȋöjo¼I IðK°a£Éþ#×L{mÿ3÷ vÓ‡¦‘¦™_¢}*kÙ™WtyWÿŒ¨–$â±+ fڄα·bÕozš|ÿoÊ;#JCO+nzX³´`’“ܵ×∠•ÞQd¾¨ûºHÑòšî޵”qNÌ”PÛL^P‹ØÇ4æ{s9ùò‹d$è-S?,)d¬Ñ”¢³TÎyQ;ê±&ÙýÀ›”s•t> igð—WCé ™Zɲ‰Üt*h*j»–p_öeÊjB¿Ùõ)Æ DjiJ:vùĶ£ybïï$ÕuÍíégö•êD¥eJÞJÃV‡àû‡»AŽ«Ë>Êú£‹5ù‹²²ßÉryåXÔEñ|Å‚“ÉNú¨/©e|°ƒ2Òt¡ö,Ó¢•4Ÿ|yì¡ÍÆð‚Y’x©‹"˜ÁRÓ¿9€Ê¯‹ÙÛ·L0 Àv .ú÷Ì)‹ Ðn˜ªÜ_/ª²9é+õÏïì9j-8{¸Á)kÀO.ÁìŽB]Á¹ÿ¼`%bæ·aî L'Òö×€+ WZ<ï# ÌÝrµ/îø¶¥„ÝDPFÑw{¾ .áGcÞïÓ%áNÛ"È4Dm –©SÒÙ&´q*K)¥±ÿa(c!¾÷Ö^3ŽWdü&fCÉÁ*½Õ©—w§£ØŽ‰û&$&±ž†ú¡ ‚±Ù}³{v¹[–7Íô®â”˜{MÎ9sE"0 ð³­F¹«]±4g‡ "¢Ìó¹@óœT‚‡'SG‰ad¾¥kÅ?ôZMA ¡ê£Ù"oð,žCÖP3-•0!b7ÞL«dŸpµ · ®x/šÝúâJh€K 0Îó›éz2 $¸£@Ig{R¹ôaçØ¨úÇÄLqwbV¾ƒ ¸º1#ô×r@b/»¿*ЫÉ>P=3ÐõÌ›YþNLÑ£©ruÛ¯ !——õ,tf9eÝžŒ0YùX¸;Õä\1ÇG«å¥Ò’ãþìId–Õ‡*§Ñ³h`Aa5ıœê˜‹\+ÌR¯óÉ&ùÖÃzN¹÷k#œM(¾hdÃÕÁ}㎻Xȯ%–÷«¦lLb~"裪˜qk1ƒ´K9ë,(Q1tßݱ=È ìˆWc¾x“ÄŠB³#5ÆÝºHiÜ34›²CÌ=²Ñ_»åŸX‹ -§™”L‹bê.£z˜Y}oÐŽ—çÇ@6é‡@”“E E\âsˆiG¹pgÓb¦‚kào¥É>†²ºÕ^,„ÜÈQ^H¯V'Ö(Õl“Ðqj!‡½Ñ mü‰¿áEJú¾?RC  ªŽ¿3º‰½]D7S ¨öü'Ä?’ ûÈò–·.ëÉ‘ª“–KRK,€ÈÓá#M4Ûa‰c¢{kXÙk`ŠýŽcæLd—öp`°àA_ŠMÈUD’Æ-Sº=¯~`i¨Ð+¬@Ö@ºë†¯ªŸîèP%ÿ¸.é˜ßû—’û§´n¥px8ýˆ¢…Žo.7¬™—†¸žÑË\DüZ+<Œ¯ŽÏk±íáŸÂƒOn½–=¿ùkÒÍ>êÊp QøÈ»PõA#|e‹z©{ýG…73§" ¸ŒZJtþ|upÂ-ñÖt[E÷þ.Z5·$ð²Ï­ ½•IœpY.½Wàgg1‘ çB ‚–Ȭ>¢fW\Å<Ü€Œz@Óx¡èܲïQGÜ>' wÑŠ’kšö„ ©Pý„‚˜N£ì]L§Û9^ú‰ðûh[ðEÊO9BóáU;z˜ txS<ã~g¨Õ<àfšúÝhºÁ ?¹~ææ@â5×`™gèæm*Óä;AŠljÊUzÀc•…G›öB s0ÇXr=æ…ȯv‰Ï=e7À´ÅÆÕ=]“Øî”yÿ÷ —Ÿ»þ\âçàˆiªÃõÇ~¹ÒóëRÂO%8†_AšC‘•d¹>::Q¸é×ù¥4KòiIÙK‡\¸­zEDo¿Ì Ú¬5eÇ4Q,éA»·7ªÅÃAŸgì‰Q›øÐG²øO"°oâÿH7ŠêKtŽÆ)QOÜöS¾- a4»çÏŸV„å ÇωZ4ÓÂP¬-ZÉ\hl´ï ýáælI35ç[;~>`Rj.ðŠÛÐМòŠ@–y¾FÃk+,uÜÒˆtÂü°î2šôåêS^tÂW;ÈšÔÏAîïb¶[¨ ÿµ°ê™®úagÿ‰Á0f±¨£ ý›!7wáýð㑹ôvü°mÂÊQù—³öc(VÜ •Aî(œK ‰ŒÌl¨æÐE$Ö•¼°B!x×EÊŒ[HĘ·ˆLÝœt˰Á>xÙP Õ‰¹ÀÛê°ÍXãØŒ,\éo¥ÙÛ|j1£b­¿Xbዸ•·ƒPH7¦,9\‚|žõ•; 92 #2wÛËè^ödå9òŸÔHñ$hvÞíŽ(X$É|•¸÷Fié‚‘&=Ü·ØüE«sÒ{`GOÞljèË“¸úĘd.§§ÙèF"Ð× Ôæ(¯µ©.ºÕûÔ3«¶æ £6+V@†#=ŠaÏŸ¹ËÑóùчßy•SâÃ[þ¹o>]?iÀÑl¦œ8½—Fa’&²Ã÷ùNz_;¨Û3¿· LwÆžø¿ˆƒÕþj& 7Ó>¤DWÕÅÔ9RóR^òÌ4«¬Ä[¦ Ò Æ·PWu™ªt áϾý¶Áü†R¡±Ë5Ç¥<ÜD'CeŸ”uiŽbñ“½ü’vùÌIˆ˜Z©GfÞYz¨61´Å,Yqóû +ÝõËTAæ®n¸¥ÑUÙÖ°BÓçé…Ù‚ÆÔ.LJ¹R{¾OBs‚¦à$›ß'3A‘ðžæÇE)ÉG¯V7×ðHáÎÛÀWA­}?JW2_ýldúMXQ©Ti£œrž„×ej_ù&¿šwŒ‹;±ƒkÒÊ|xÈŸøâÜò>4½÷‚ΚïÃ`ƒÉW/´ÏQrªwh"GÈÀõw¡B¿’.:!˜Å;âfà|ÅÙ¥N¡ñé K÷ËÀLÓ┳¡pqø˜®ü‹Úà’_ ÙÝæo•Ö¥QÑuu³»K»ê–Æ!ðÂ4Zߌf ÂÔƒ ^Ɖ<ÑÅ*œÜÌCÅ00 ß±î½[Ó3ë¾Þ0ŽvVyïÏa£ì÷Z»¨AtõœÏàëŒHº¼U•³si*Kñ[–½[¦òP̳HÝÕK‰„ÞOï”ê@Ý7Ë5­›Ûë¬a,Å"N²“M{ç|Btü›K³hºÎÁ ì|ˆVåÕl# ã®eRÖhß >É…V!ÏT>ÿ»y×ñè…·µkA~P"\¦Œ­jgîXi›öÎr{€¯ÄPÍJÞ‹ñÏiì×(˜\ŸŸÂ6YIØ+â/³œJÀÙí,ŒXªo"mΠ2qà¾kŸÈ¼ïa™6"_íZŠb”ß_¿G›ò碭º û¿@@f<‰s”¾ÆÓÏ&K¬ e»Þ¥s¹fÆ„œ*åhóðËŒvkyÙ§X½ÞÊ '±åàh{(¸õ‰r|Bä·³r= "‡‡¬TƒhUt“Þ!šÁßF·‡8W&óè9æ]ÐgÂæ×e™¹¢ªlI\ìj+ß4ư¾¯ú2„ìN ‰GL)þÌýnPð€½÷1g3 áÇq~üDp„H LV“b¥˜`ò,ø—SZëˆ '‚#w¾¢å*óá·ØiîŒ÷h¬›îèieÿŽB語– ‰æïáµúóÎ;±²WEÑ‹•÷l¯Až «ÉÊÏà‡êW}-ïóÒá^Ùljîõ=£L&?T™Õ¤HÙÛÛž Ô{•¿]^NŽû­í©ÁYŽÀ÷œ#ìÌùÑò<.î;Rß#4™.‡ÕÝ߃‡-fµeµ‚ÈmŽô#µ5.05t±2¹"V)—Ó7þ±†š)›&ó8$œ¢¬¡=ØÀkX¥ášë®ýK”®dâóÕ¿¥9”—h#£ 䨑/Çoôÿùw’ÞÀAÔ½·Õ‰tOLQh¯@=¢Í Taà¢=µa \;”N)ß–m©ØüÈ ÌĽlkëTÉö;XÂ!×É9@°ßºßt›¼wÈn§§DÊT§+ÔèMrA‹Tàõ65lˆyì©¿›r}XßÉ(ÏŽ‹›û3¦4ÉÍüœ<¸ (Kyš—ÛÇOî´¢9“¿™ ÃņQ¡EÎq®b”çð¾‚Zwò’w¦¨(O¸¢:„Õv$QÃYøø¡¤%"Hœ<¥àêB­=g…ªñŽæN Y¦õ1YcŤŒV½~z¡¿½R¶—S‹(¶ó—TÕ×”ÛwƘd³Rfežï¯“ B$*¤ça¦€H øO<×ëÍb‡•bî§óàݼ‚+ÝtМ´%‹/gì7߯FX¦òo°C‡(¾‡€K ]ÕC{@År ß+”æéïñ=ر(ÿ'ANGöôØuÙG–›ÝSfåý[«‰[ UžZ…%3/ƒK7ðп7Ö‡²<É;_>«ÐÚ„±ïÖV7Õ2ÑO÷tëÏaÙÜ, xâ oТ¬’DNú 5¶—œ^Pbáôu–]ßÓë‚iwTXxsÀ±ä£ë}/ç>4nzÁzRCVŽÑ ƒÐávQéáØ›¡wbøõrÿäs½¹"±è?ùÔþõºƒ-нp☤CjÓ¢.]1°ì>ú–«î;ÀY?ÎGÉŽ‚(¶7þjkWäze/+¸6ÿÚUç %{Tû÷¦aÕ9ÙÆ‘ G—š„-ê'({bàL=ˆ¼^ Ô®ºdPõølXaÖõnÀÐ 7´G»zëöž ;…ègŒYG”ž, ¦YÔuÅ€¬•ß±ÖÄ"5pƒ "ȬÁ[>‡ìpn+k<ä‘uÝ:Ú…ô%šÌ6dÔö¿ì3Û¥e<õÑrùžFÔZÉïŽÈd`¾Z}Êút·ñ˜ÛgVTPàý”ÁyjÿZ¡ŒM£›ö#; Ê*¦dÚƒ9 jôT2rü r.¨ E‚õ˜ïŒÂ-ëy9"pyú¢õ5Œ™Ûâû{Žª€ärëJK´û™wz©îçÖ´K yc‹¶UMycûçETØÀ-^p¾C׊ð.Öqwù‰¢R+I§<Ò„'§\lÿÅÑŽÃuü©êzpÑœ"@–%æYy/Òn^ÑèòÞÂ_m±E@‰Æ1§òÚôem_ÈçÙ3Nïۛ¥Q‡'G\ ¦k]}lýÔè¦Òã²òho'{lsv3#eÙr؃óbûR¨°!j/û‹68É.䊔ÉS‘ªñæ¢É¢*:»¿‰ó7ïHb:Ò¶è /[ô±µ{ôs(gb»ß¦[ç‘eAÇät`ãÅéŒ`‚¸ ŽÅÉøW7ÀÖɇ‚¯üí -W@HÁR*Ã(+1Ÿò #ÕY¾$ÚÊ¢‘^7›À€ˆ®˜1ŒXÉHü[Ùí¦Þp²aW÷cvø´\û~àäM/Äɲ§ö–ÓAá5‚ôD^ÜÇèíš~ÊÓ<¯›¥™‘w^j8A(†Þüׇã¬ATqÂ$§P¶60èæñRì»JÈÝ? ÜDz ÞÊ*~b{z ¹æÀËsÖZ£­«6LuÞks=¿hB[dð/UÃ4Ëe$ا¹F›™¬˜Å)‡"Æ¢O·,²Œé=ÅW1æ–qíù¢­ !Dƒâ(øsi‡Àï™Þr´€·½M&«F œAFwðŒ¨_´Ê PÝi¬.NÐíi"ö;@'ÿO¯Æ†‹V²•%¹:ôÕD-¸OõU¢óÀDü1ÌvÕÁ¦éAÒ˯ÜÞíBÉ6Ì2¾@¢çJ d™{ C`B‰g/ª‡ ÕÍþÄ’ÎNÔí©àÐëmð7B/%†Öëö¼²’ºbrÄžã‰xuLLW ‰~»;±u9êî@“3fcTªâÚF JÊ)`/lé~R¦ù}Ó?H§ÂÎt>ÜSÒ͈ˆžX¢E^iÍÄêg‘ê\ù²ÙÖà­5?h8û¹Ï7³à²L¤ÕÝ‹=8^W÷(„ˆz@ñòaASÍZ´nìÜ"WCo…ˆ‘s l¤Ž¼ƒ%êL7V7¸fÒ=™-¥(é0C%Ùz¿Š&ìžlš›Ê“ñŽ B™M±T¶O’Èl*¿—ø“ì¹f]¸ˆ#-çB!?Щ׍[OÁëï'JÍä¡@Õ}!—ñé×Ìé¨çT|w/:Fßxy{÷ˆ¾½#lÖƒ›©U¨®Å)fD)R‚€òœY@=fn¯Ê "çïC=c,ƒ²¥Œìô/ïrà º|gü&˜«a Ë4¨Á ‘¡‚§j0*k̨vYíÏ¡çû mõï*I/Òæž¶ºE9›f%lïò+UÀUÔÞàÅ’õ@÷¸ŒT+áæòªÃˆÿOÃÏ¥þEK;r;¾ä>VštÑ‘^ã|µ.b{ïÛÄ›­ûψH޾L¿7ÐÏœm ž§„Õó±×­:l}xxOr>Äí`~#ÚzÅ4ëñNt n)ý¾¥êÛÿ$Ø¢}Uñ¦?­5>Wœ¾t…=›´½…‰Д‚bPTzäÔ ‰y‰ô\dÊÍ…JOx©µ:ƒ>Þ}ƒ ´äþWÞå¿#Oøz™r§yDCè;†8Jð\Ý”‡21äêŒhPþ/Ä¥&À”ai ¢Üž¨°Ù×] o(Ê8HîÅU‰\ä+­#7 xŠkxËQgWéhê¿ÚÚhÒjqHÆPyc…ƒºxÏÍ Rǧˆ‘ªhZå•©µ<›<Ü¡Žò‹ã ý°Åݤ%¿öy–ÑcFî¨ŽÄ ž«­‚7Øž­x&nWoK…¨kYˆù$QüvÐý9úF½±J%õkE¨§kÝL*¦›è!N‰ÄÿÄ8{7îÐSzP=ÞÖËB_3ÓËg+ëL`TƒûpTø“*Oªëñ‡Q6€:)üÐ §ÿVôì 0„··—®P9nX8`ÒÎ|ÎiÃ].¸Éá…ñ>×è‡ÂL<È+Zü«ø°'ï×~ÆxK™¼uhÐ3úàJÆÇÓútsÎþ/Éêî=¬ñ ƒöž6“{l8}êÜ£ÉÐ[ ªsµ%¶ã¦EÁ»4³xlŒFŽê®}—R¹sj†«oJ¦æùώɦåã¡Lmt-'&z[áTVkT}<%u×°!£âƒUô–+̈6Ig¹¹M;®+¨1²+ßzˆt4L‘WÖ°7 ½ÕSNÆ[ªtîƒPlTäͧÇ(1)´J…ÜïÜoØm?Z2s¨â™¢CÆ[«¦ÎÕÖk9–DÝÔÚ4ÌI^þíª{¯ $MÈÕçq­À¨<$îîNd×^À‹›ëG,ît…ª» Ïž 7+öÞì6øôœÒ~n@`whÕ`””! ›¬½œÔø›â¤øÍŽb£šîLº)—òçÂ\õ%ñÿD‹öqÚiŠFph”EøÐP´øùÄ/ùùÒ1æ|ùPÅQVú á+‚S<–Z<Н¶&nü‡/~]Ñn)‡8ϼ´‰o÷k‹=]õmÊod [kâ®îI0ÈLašôgA“Ͳ¶oàÓnî‡F§—±â¿Ë}»/Ó¸ ø%“þ³L  ©¦ŸIà^‘*;á+‹ãÞ€ìÒ¿kD2´ ËÛ=Ò¸TlÚû7$ÝÍEýÖv×›Èúo\{ÄÈKHºxï­€9Çn\ðÛ4¯N}Ü\¨!—!;´7HÛI¦Ô ¨‚ùƒ÷béµÌ¦DÚZ!zVñëµAŵ÷9ñÀ³L4{ cDµv ·Ÿ¾2ˆ²ìˆt;ƒe…ýP¬°Æáõ’Zf…l_¼ÿ°“€Ò´&}¶#èøWÐåá7\—›ê«»6þraˆíogö¯MêšN9r7ÛÎm³ÀÝÈØrгÇ7ûJÛê¤ ·ëÍ%‹fxß§<-Ës(ë®QjÉH8A¥r W–Ž%\M¤¸0è¬)ؘºBì„‚áþû;L§då’¡~DðÊ7·£N={ûÍüÂjv!®\˜-úvÚ‡xËŒë¦öð7ÖÔKÿ+Vˆäûp„!ˆ|Ø}º©B7ÍÃÁ“/^´j/;mmÆÃ^HU¶‘üˆnº"5)=g /ðcÚ#ÄíûY´òÛ‘”<ÄÈy•'2ÜÁ|«vɆ½i· ^ñÛöžÿšÁ¡a~¾;ÊG̵—˜9üÄsƒû#Nb!K–gG:aÂ-”#>«é•©µ(Å8¦`À'&ŸûµÖyçeõÏ/ÓKŒ×ì$}ÂXz&iˆ)kàY°8=¥N[MLÎ[„”¤F-‰ññtC›€‚çÿ…´A×”êwI6Éfaö…p¹Ä~ȧ|9„9ÔŒbgÍk]$ 0ókXg[™‘¡¹Q¸ÔUÓœˆ±¼Åßuœ»¹»³tiíQt [*P,“oï9Ð@£6Š;¸Éá)Y%×{‹‡ÁQ°Y–ô!¥lwЫAø© ÎÒfLô>Pá¶crs&$Ô["ƒ‹¨ ‡ù à×y‹=µ›8õuÓYÏT ðO9Ic FòkŠ£úÿR¢Ð¨3 fj-¢É£¬·c `Q˜ÞFVœ×¶ËMt!«ÎÞ™!§5ËÚ»Ú0“'wPðõœ…Ú=|8X> ¸çÞó{¶‚øjÚT¿JN TÀù‰|Qn8‘#à0›«îü•¡£eÃLý‘]ãëY22®~RSΟN;ÚñiíG·[ÃнkÌg¸M›¹| [1Hš²IÑP«ŸR¹Ü`j’ýñ±]è©,®—Y“ Y™aPiÆØ5SÙ°ESú‰~´=ÍÿãÚô4Ên`O»|ÊKl+›¨ØyµØ"m0?RþÉZ‹nÇôOZô0Œ€ýzá®t—bTœx_Úyr?ð]­$_lÁÜŒ,¤H7‹R[f„ªG`5ßÓ•¥.º*IgAÒ\íÈÀ$a\dë†Ûsƾãxq—TG¯lîÅ€Ñs8_¡Êày8~ŒÆ¦$féIš^Fb9ÐÅ9Î&߯I£µ3Cú"Є']¾C‘0r_åçysA‹ͺ®kÄdzÝó;뫟T1¡=àb±m¢CßIOôûN%ÊjoeËšÓA)FÎÔQ†‘×¥ò»»ÇÁx÷†nŽ ì$ÄAÞÃB›þs$®´V±´¤%îS ©ŽûÎÀr¨yghÕØÖ¨~òKŽî LMkíÇM.´Æc¥pÁŒ>«®P¡o%ŽkÁ1dÁÑŸèèL¢a¤—„„Ž… Ög׿5ì‡Xȹ2D¤)ò‚ªIñRœÁïH˜ó»Òó nÔÜlö¥¥« º“áˆrÃwÓÐèÔ÷Ì…µŒùZÃÞ\mbp@$bJÒºã *ÝwñP)}ÆûõâÆªèÍÌXÍ‹}ÄÞo%¥/šš1ʪýâþ#!†3ÖòÚXG%&È¿ÔKfýÛ’!ˆ]B?Í5Œ{4Ux6‹±E#hÜ¥{îÒv;S™CØ=r0d‰¨j~ÜÝ^GØÔ/`æ­GçfûÀ¶Ï= Ë@Þ[P”‘DÖ«ÚÒñšýW䲌’bÉ5þL¾‹ºÖµwå;ëÛIÛv†¼d_÷®Þç§bQé½C™ðôÃΊÓCìÙ£_Fpà^‰bV=/ŽbìÍñ&—6{ã *™g›&£·PuOóf d…°Ñ’“…¬ÿWØ>OÀdlòõÖc—*O½MÜÕ¨…0 ¯‡ÑWo-ר-;H[õ¯oôf0À‹•¹Í6p`D~€ 5ÓA—3´bÒ¸ ‡áGˆ1[’ìÜÇO¾‹÷8Rìû¸÷õj7}j…—ú?MýÓ¼…Óµì$zâëœóéŠ@¾*§w`›‘SÇ?Ý®=z“p=l¹àx¿0“û9u½Úô¥b5T ®•é c „fe2ÝDÏ3;ÇEÄ I9––›ðøO'ç{aƪEA©•‚±O7Àx3ƒ¦»¯\J‹[)Wá0-@‘ÏX’ÀîzÄl¦vŽÕøìwÆ?#m;ëfKæ¬d~¥f4~ñ¨e¨4Tå-Z\_"½¨ko>úX±¬½ñÀúë3fAëÉKäQ€ª) ¦:ÐæÇðó;œ«³òlîJh8j¼ò@’QxJ8nLj†Ek ¿|£žvuNÎãµ)‘‹i³‹çÙ#Ùi#»{’ê…õœQ‡ Ùl¹—'uŠ׊¬…/eþVlúÊ<‹dÖ>¾%½»ÎU*K¦êyEqÏR¡‡–[­ÂáÄÅþѧö]f˜VÌQ˜ú1;sT1 °ÜØmÉÕ3;^÷â&ã²ÏÕzÞ[ êÕa›Y;Î7²©€âÐc¥5ñƦg*"¦’mÖvœ}³ó·%}Kèø†%»DŽCí4"ž¸ixWœüëNÐ^àü|GÎmc=1ñ, Zš¼Á©:&ñ—™Zƒ$„"TÕœ ^ =(Bü‚gB¦ÀòD]ÈŠEC˜ÕÝ÷¿ƒRò°BßÿŽð„H'سrƒ¢9¦¯–$ƒÃ΢8}…NĬO<Ÿ`R KVdnø÷‰²Š0»_ HŽY˜˜\Á{»TƒþÁ“¾D`ǃ‡g'œT\S:TlwaÇ<¸isl—êÏ]ÿâefjùkšKï6[yÑ]4xíáâØö‰ò¯!x?Å/ýà|x¸Ã[q›¦‹ŒÛãoÃ&õ¶¼öÀ ¦»núû{:[„QßA@2á¯PwX«köšöj~OE|t@äO©¥–-g©±0DÏί/ÊA7ɵþ¢K‡*žÅ%9„¸Èd[Ò9\›ÃÌG“ôãy$ä0wããòºû$¨±'Šž¶šÅÀø^ù6®MÜaP„ÿ}ù6o{,Ì{ ‡¦~ý‡+ÈGLŒ5¬9Ÿ¿Näô ]x| ˆ ?Ä.´ fP"Ô¯æ»ÝÚ¹ƒ½™vfðXLa…9ÎbêsŸ¯žffû¤²Qßqˆqp$ãzZYë³3ÙìïPA@/ UÀkƒgGD"¬²Ì+-iœ}Õ¶}k2ä!KÓ–Dï‘zL°ÆE`Õ§;‡§þ¤ø?•܇‚!¬ð%W7^PYQgX¼¾8h·Ø²KO§ñ¨È{²£–KxfVÀ¾éU öu\™;,ÄãVð[£‚èîm÷ó9w²ÓŒÅÚ«@†¨oFŠä‹Sbš—]²ðξ4øæÑtêÑZˆ¾ÉÌ. é ÉΗˆ2;i.0h Â¨öö¦Òˆ} H¦ÔŒ¨ü‹M/ÄwäZ5ŠZé“L‘qRÉ@ØR`xÿ¬’k¥9Bù8Bn hgØÎpÔÚâ£YœÎÎÝÒv¡•¿ o*a˜es¨ T™ã*TM/Þ¸ T†ýlʯûùº5Dîœwä­EÅmîŠVÿ¦·ãútsZ­”7L#'7öŸ&14‡·Oº”>&£Ä©òR™T‡p¼a ªqÁöøãtÕï’„>Ég楘Þ)óû@ÅVœjˆ=;q‹ÖËüµƒõ“Úœ^ó©Þ%`T©Ì¨Ù¡v3 غ´ðÂu1‘…Iú>,j@<­nŲxeŠ^Igu+Pâ­·×០8b´KC5ñ5¬~.¢_+«Ê·{š&ñôÒaì–›£šœè&ò@pJ±ûdñ7΃Ò«™FÔfQ!f=*å¹Ð‡ŽcF‡Å žÙ­P:ý*³L1k¤¤µêÀR:££>ºj_²²w†N>êdÿ`Â.ÊlELˆ™>{–\òs)ñ[Ôæ4 ¾b¥øØüO,È?û¢­„”™Š€§Þ:–øöx¼ºu©¨K‰Ò'rÍ*KvâF>Ðæº;–f–çu»SØ ·2h‰Húí¬3·Efßh‰wP\)@´”Á4µ7Sñ?|½ó'}¹@:WËß鞣¾SC] *T¼5‹t Û<ïÙZ6„õîÊêGhü0Ö:Ú[ YAÙb-ï^M›Æ½‹üey‚Ñ£H¿ò“TO1ôxÈq1å¥Mä c? s¯?”ú,Ñ#/õ‚ìKû7ƒûEÕSÄè~Ø ¢q µ…7C‚‡ç ÿ`K}­©q•þ,•x‰cô·dû$V {–¬UJr‘‰àIòl/hp9{xʆ¿dpGCz“$éýóºZ6 G QfÐÊìGt·ÃI‘º2Ig®MI,„72]8ŒzÖUJQ©¯—‘Î=4<V4g(µ×qi©;ÔÄ C±Î›6p€â«Úo7û+ZŸ'†q7grƒ¢L„:å,DùÉè6s´´J&è)p È4« ¡úTîÌ‚p¡ ûÈ/ê$|S %ßññûAŸ‰i˜NxòE *Ÿ6¹k Š©·±V”6`ÙZ|p\5¦/W¹‘žÇ©læòé/Ý5N_Jæ:ß.si¯/e¤AëgåXx°ó›óä.%§Ú5¬Ž®–m ì…“{ÌVƒµBR“áËF厾¹u™ÀU§]9ïfë€_Ã&Š…„î,&KàeÚQxc‹ÞD êÜ6- L§¥·õ/Ál}Q=t.%«Bó;áò¶LACq^ŠîÎEÒê_yh–‘VÖÛÇÍéÍG¨w°noØûøßmví æìôU î ó¯,nvt@^î]ûŒ »b¬§òìͳ–eœA5Ì8o~¢Œ“商ˊ„¥aÕNEX®EâTµ ÞøFåÚ¿eEgþœݬǸNö®ÿhvø`©¤d™!.óE˜OaíyŸ%A ©ºµS_Ò|Æ=ÃЊ)Ü÷ž0ÍHHµ›YwßvJ!¯RœqW¶Î¾IÀ-94¤én¸KSß¡”;@îú¬@å‹@ õ³¹µu×®EØzîâÔÁ—¶Ì½1ůmŸEc¹=Ñí/ÿÌiÆ< m2¦„ìúGÕgÚÌžobóG„Å®W£Í€ÒÔà¯å~þÇ»&ÁÕ³ö»wxž‰­ÊóÙgÇ:R™¥gðÖØ#áÎ!dûŸ< |þ²ÊiÏ})‰ÏÅÌq˜²@èšpü³†dk~é_žÒ\e0é! ^èp! Ç£X–9¢Kî¶xŸ™ÚšÇÙÂCÎÄÇ8¡¬J:§ðãr©Å†ˆ| z¡ÈŠ™$q˜˜‡M™Ïi¦Ï!'£L°MwAˆËóÚ®}ÃÍÀ¸wƒCw0Öw@jøñY¸Ý.¯;ÿ½_¿1(ªÊ$ÞÓtÐ9%Vf¬”8ìE(cÕ¸÷»šX¢ñh§ {K½tBÐ|3ælk±b÷T}>þâ+It-1—Ù¹ÌgÇÏ¡ ïr Èc«=ßUm9÷ZTñþ›’…¾2XNÃo˜Ó º˜)ºwJ´šNê. Æ1j¸ïfBÊ/ЩûeÝêz7É೯ø¯Í¨êz¹¥±D;oލtçÓ}Ÿ¨ø'˜‘…™ÃXdÝ ¥9*wa¼5è1¿€°{Šíã¯e'àrÉóc9ñ>BXhpX¦ÄCÎp¤pzaä(ÃÚ,?¬'Dç•;_§'†ÕŽž†ôÅ\Ðz²™g«±/QÁxDâ™O÷Ov&ºÔôÉŒ› ZÏØx¨U3Ï÷/¤¥_#ÅZ÷MÿóxTB8I“6«ë¸w7dcçAáCóf›V$‹©ñÍjùVOÄÿ©MÜ 3 Ü“êJ™èìvö]9…Œ›ù›RŸñáiªó5I‰™L1‰´ž"sŒ×°6ŽjG§• ©˜}ÒPC™©gé‹Ô5æßÆû±…ïyæ6#)¸¾ÑÄÀ܈(ê³S. 좤óy¬¿3ÚÓ›‘úJ=8Wg÷V Ôÿƒª²9œÔï¥Á—Ëh G44y)‡™y;tdzuû§Ô¹ôuù ,PGl3©„ÊD´ÏýçÕ²¸ù¤É˜$ÎæQDmO0ö„S©.xŸhÜÔ^ðî¹ç>ì’J° ¶ˆ=Ô0½€Vθí¾Ôú}—U‹¦Xh †c(` N± ]·½Ä5úÁ-š`…"‡º"ç®·]”‰<èòÜ…&– <𣚄|$Iu>/Œ¥Âññí‹;°ù£^Ÿ¦Õá—ö– \œÃ‘·E½; ºä+ôu>N†Óª³(WŒVQï½Ä}ì»gG„L—vaÀWØÍÞ/VñÄaÅVÌhxHÔ–µ}‡H\ñ^½>ð¾]&]RðGzÁ×wÓó`OIB>ŸÜ âv¯»§>þà„ù )ñº{§Çƒ* ü‚kÆÓpSñ1+K\¸x6V$úciìez'êuW¯àw¸k½£ËÍôMÞè’ás~,g2Ex¯ŸîªYï~r$—Î&“òjF&GiéþÝ™Ý-†½b¢üÁÆ ÍÌ7äè¾ Ë7¥ŸFœ‹4 /Fè¡›MUkl­=â‘ÛÛâ*(ΚEé–Q¾y§-²©_‹m:'þÎM=•±¨0:ûg‹ñxáõ…Êñm«›˜ÙŸNiöæsb²/‘Ô›š˜¤;W  sÂäø©Þ3ãk€mv{7ú›Cæ×£qdþŽõ¬KC-–ÔCT3DÅØ“=E@9Í×-¢Üù[<æ°ýžƒ…ëWƒ,hnœ1\ W±.½ ouAÜx¬3‘Ô#0™þAcP¾ÊÀôÉ •žáUéx±›×lnüƒè^)õ¶‘ ¤’‰³þ»´Œ7ˆbŽR%šƒ'r®båÓ°ó:ÿ*ù˜¯ó¤öÛèÆy6Ó%àCæS‹ýsݲ…U¦¨Eú‡¹°âA?ÂÍ":•YÏÛ–ý3 ‹2éѪ=¢œ¤V¬ùÀ® ärkt‘áã¯û ´cV³­¸ùÇ—œ`9Ÿ’d~}ò:<°¢%×Ôo±?OUŠgcÈŸ´ÿJF{õuÕ¯€ES°ŒŒçÌIk£z†˜B†g)ýûlÜ “ ŠKôJÆÓË×g¦¤„˜Â,ï20#œË±Wðó¿x"75Ÿ—½\2è[tUö2ÍÆ§$ aî»i‘QyÌnïÍUD »é»½1IߨP ’5ÄÚ]ÕÂsBPXªjè”o{§ïçÌòþ4ŸBsq~¨‘ÓüÒÙQÉ P*BaÔëlÙþ¿Do_ZÚE`¾ÜeŒ´Ú—â"ÔöâF^`6²HtØà€~ÊDÛ”Cï‚RñaX‡}#ªï0t®všÉä/ZÇcÕ,æ˜Ð„GZj­z´m'(ÍÑ›}jWØQ®cˆ(¡¾ãÛÞe¾´gL ù{Ç8ƒWÏ~<¤6ÿüŒ€#u NÎ@³ýüŸW0Û]‡¼‰¦ôàtă² ÂP ¼@æ!¯˜/û%Ó·AEVÊä &·w4ùÑf¸ÅSä’" °ÿ“2)ÑPéÿ;O¸IJ‚PXRaXË(Á¾Bîc« ðj4-‘Õ Œ¦f|ÑVZbû‚•cÛ§¨ôîÔú›æµ®K±Ž†Ïàòù·êÀ_‚˹ý2 ¬/çú ‰kl­ÙÏ w)öO8wAK£BsŠSƒuo– ©Áº™8м-‡m¿ø¸$ZÝâ—» gF¡-²ªt‚…U|âŸÅ~_…5 c uÄ ÂË%ž“h$½ó?üÞÊœ#À#΃eVS—Ö:¨QùºÝ­6²~ðÐ,“)Þ\uôÒÜZM)Þ¬Åê/ Ðjºå˜ãÊÁÕššùºÊ?ö%L¿U¹í÷æ˜7ÛŸ5Ï>‡4•/-Ù<v5Å”QŸŠaÿé„9˾èÏ|¤g•Tnõ×" ¤ü]¤Ñ¢àF` =WHVE±RéàYäxbò;·˜«‹µŸî îÉ8b)¦p#ãYåtÀ̬¯‡ÐdÕ«Óêƒ v.F;æ5+åBôÄ2óOq¬4[Öún„7?z’t‘ Gö»­—F„¶‰Å{ügјjÁgæ W¿Âf¨õëÚ¬P•-¬']µ™4qíCÿŸQS3uÖˆò¥Á?Ó$¶Ž¶6Âd/iLNü¸ hé3Œõ“©kg-Å÷Z(›;OH~7ˆmv}]­°‚>ŸÔ*ùŸ¨1JÄšßZ¥‚“ÿVÁ|ziY㱜aèºÑÍȬeŠÝ¤åSÀˆæ·˜ÙÃâ~ †*l!Á’l7$ ÍŒ·té ¢ެQû]÷î‡^¹êíÉ^w‰Q¤)ìgRûÈ-«ôMón¦4±[VàHiF¾<_òXmM¯é7$çÖ;9ëúÌŠ‹¹:ø9ùÚ­KžH˜Ìy,“…&¥6vjv‘6tgÛ±}zø9+* »¥Ã¤WêÿãÁq­Â«9õ´« SóÊsrš¥<du ±_°1¤´æˆM£}E“@6=ª’’Ÿ«g!,\TÞb¦ >çšÙ«¸Á•Ï–sŒÞjû_¹ËLÈÊCk*D“Ø,!*÷Hì2žøç1Îö¢ý ìSMBdŒõ&Ø<xmyb@dÏ6 W~ø.TœØ'ú³¢¬¨pàñåŠ"`\N›ËC9ºÆ8Ô=ÿÖòÒëvÙ©‘ÿWxùƒŽ +“ +òm}f¶D?‹ÿŒç:Â`9ña[C¢®»‚Opÿ“¤ö=Y£vÅ‹<ÆøÏ¬‰Ÿ§3th‚ 7©ƒ¾.ÓjüaÖ D'—5Mz^À®pͨzÜ á3z̯xY™bJ*‘¡$hKúyå‘0è<ìãÀ^÷BöYQDÖ1o³“¡CNüßêÍDäÞ•¬ùÿ‹z°§ û[à|ÿ4© É* åixÁ<%øg€&C¡aA†ë›™ð;u`]Æú×0ú"¤’üܒÊŽËâlÍðn*‚¨¤¤Dà.Æ€(¸»é_œ>Âw÷"û0ËÁWà^ºÎL–.÷ƒa~ÁHî˜ )"7Š¿âëi:”5Öô¶œ¸:>ÆéuåsŽ Ì.îú„û–cˆÍ<3 d?žÓ¥æ“KôIˆì‚©ð°pý8¦$¢¥ª–ó9ç‹P[:X¼ó®ø!ÁøQèx"‡)Ô»uJIpÅÕüÒáµe¹§A“‚ €µÞA=P!±óµ0ŸÐ®¥›?Uœ‹+™tÒÛ©™VÒmWªY ½Rq5¯Ó ßÄcUåb’¢wÛíj4,Áç‡+v‚>›zÍô…9ù?ÀeÇJmÁ@ófÔc»IvÅ3S7â9lÃÆ~R¬cjBÊ¢°‘•F„ ºfÂwFkËwbF,Ó´°Pq¥¶:úC…b"NTŒS¼mƶ)x@øFMlAòÎw‡’*–ߣâjvçÿb—’N€““Vü)¬» æQŽƒ ê”ðÁéÑúÇJÌ‹"†Î-FDi4ÕTÏy‡kÈ Vkk™Cætæÿéá„°#3ËÓç¾J°ÑZnèñ‰«/k Ý~ÎCÈ5ib '‡~VWV,·Ìù¥ŸÚbL¸‡s“WŠëØŠí¨²2;ë'¸5s,×w|V;J‰Ë-Œ>œ§°ÁñZÁ§l‚+Ôœ•ý¥I÷°ŽÅ"û®zòvý£Ñ‘Ƚœ°fuäãhX*ì2Œ\Æ£“ó!Rž õÒQ…ìð*I¸Ã“î<“4/ÿ‡âhÓʿ⎟;¸Ã&•bä®ÞHË]å¼ M\LØ rJ9L­v¥{ÿ˜în >/g\ ÅWO‡, °t· ‹ ºG­K’'å¹ÛÑ|@œ‚%€à€æ0>Õaì³m©êjw”mL¬CvMpḧf[–!h\6¼‘é~#ù"/œï\2Íš06™°r÷˜=Y8kØÇC‹ä ˆßôúìžÒéN¬¨U'y0‰·ÞÌL6¤DO’äÃX0éêKoë¦^HÂH…¤–9Á©{ãž.Ú»ÞJŸ¯t¡îÙ,c¶6²šS¦èksõÏÔˆÂÔ\o¯$Q¥¯‡/ÃL-ÈM=â ðÌÚiŒØd)Ò¡Š"IÖ‹cH>fV^ðpÃÂÎU¸±ì#¤mß»I§9\{€ãi¸S‰sñs•AÇ…ï]ÄkáˆÛãeÔ,¶èPâ×û,=©pøÍƒêÎ- Þ!ê—¶Ïš±@ǽ¯º¿zp¨ÿ{s ‚ˆ¦¦›ᘱ€l@ÉÔ· Ïp%xhÿÌñ]O×c•P‚±Ywb?*Üî6#(øÉSË;ã^­öscF›rÇ﬿Õˆ V CµÅ¾OºÁ",´ÿ«è®[Yóry¦‰iÏUK>=œŸn§k!ÄN«zNQwÅ··øIy$ØEŠH2½Kˆ†âVGS?*¨ùÆãÕ-Y¨Úƒ‹ïø„¢ & #¢’?1ža¥¨£ãÑq@$>_ÏÓõéžxO×b]ôGøèƒx%¯F»J )ÍA€«ÄL+’àîKþÎ }…C€FQ Ö6]ñÞÇ{¹F¾‘¨¡Õ@WÔ_Ðs&þÒ«EáÅ¢ùQtyšèHİçãúxYüG[š™ð»A1žÚžšmǾSvªžL‘lð+,G^Cƒ0&Iá<6]‡˜ÉÙb Ø›/˜])¢&K0BSܳ¢›‚7&D¾b©¿im´ ©A” ‘ô¦/ÉÃS͑·‡ÌŒ1—pÀ âHcºƒòÅn`固ÊßÒRIOK2k<Î&Vf´š·Œç¤\_qô¬U• Æ–Æp·€„½×àvW ^YÅ`¢€œ´FÝ÷¨%–ƒê†«‚qË(%y’h™«çxdov?­)ÌÊ’Ô\õÁCÑ«p²UpÀ€Œr¹,Â@C.Ϲ´ŒÀX\Ó&±IXî»ì w—¿¤Æ^›û´ é9½ÿ×ü’g4iR‡Jìf_2:Óafvd(ÎíæŽ@“¡w-جbN+˜¶¸Ñm9µfÒ¸ßÙiá‹@ý®½²È¢P®G¡m»Øv4ø€ÈªÒñ­¥]g\˜à|_¸ÝA¢ÄŒ€rg¸Ol?qt; §1×%|Gy)\MÀw$¿ð¼ì…d=ãmIþâ>z½lp³ÛéKE7´ìDîÖ—I•9¥Z¼iŒJÕ Ðø’?й´òÔK¸j‘Ójó”” æ|µ]ŽÝl« ºc´¾KÐOQ¬ñô$ˆe È’ÑâúÚÉ}ÁÐÊ»älØ”„ß1âÌþª„Fh±;ýOtƒ§6“0ѳ`=blÓÔd%c¸ÅãAcFdnêÊÿPºc¡ÍB¢U‚¤˜Úi?¿JÏ‘u‹Éû‚¬nžn¥%XK§TuxÎ4-«ìY?I$ˆõÊ~Ø9£16ŒŒ•“dz~:ç$¨¤Q•λH=áñ®Ú_¦+|¿ë9Ês—ðŠ}Í ÃТmÛûQµ'‘µg_¢í¸xôÖ›þãt›ñO̘Ûócˆ1KʼTDù¾ý€Ì“yj­Ì:qYÌ5ôvmäÿx’È*­áP*ü¼¬ù2O¨‰(ÑÅ…žÚ¦¯ÇT×fä¥x`ržØiο­@‘ ᳪFQ4?3ñ! 8<§N=)³‡ÇJœÊ¡x~6 ú¡¿ƒZ¶åqÑ> ¤^(ÈAd.,/¬¶ƒS"Ñ«å†u÷ñ‹lÇê*’ôÄÄykýØP£¾ÕW)NomùQ+ÊC1·RY_jYÃâP*Цx7AIˆŠ %ÏÛoLj§þ¿óƒÀ‘´ÚË»‘x. ÇZéͱzÂ*×ÿ×#Ô‹Ñé¹É‚Yèáe4#9»q^e1­pð°*¬™Ö>êSݤ7OŽà±3&êm¹îÙÞãÝÇýÿªu›¡¦¬G9ø‘ðâ°Á*Ü-ýÎn5ºÞ X«Ú|*åg4sïZ2ò-Ñ$Ž BIs’w”ˆ‡¯€–¾ó|PY\ÞÕRSBy«]1tTÛGßMytŠv ÛÒÞ~dý?¼èçÝ|öÁ_SñÜçz‡ «„ë…éFÈm4í xå’c©ê>4¸’žIPz÷x÷wäûZ€{Ö]…†Ã–P 5ž±ålÆK˜2‘†°Ûïø îtÍt–q½Ð{z·Nj¸Äv~HCrÛ-0Q„*ëV©‹oÑ•wOç.H:ð„7¶º°¡Œ ®L±’AŸýàØjÚY³to¢daž?… ÔÍ]U†Ïf_%ÅwJö™™÷ŽæÀÏ0åX %ÀÙZòv cXgiÏ^Ì}l+Òõ¤dIÔfäN6Á³’”".Ę=fÆS$ì³éÎVGÇ™8û¤# >ÎwWͦ`(+þâ©hbõfðº£Eè|ˆ2Å¡@7­Óª0m‚‚f-,ù”th En•9Z¼`,¡£h›n…îr.¤''#î@-Š˜²C§M:´A+à7ïhþ·e*û m-¦/û3€pŠ&Z¨è`ïÎÄ„0A‡BJ$žß†ðð¼Ï‘Á 8¥"Õ,àZÆž«û© ˆ˜¾I E"(,m‹Âû§¯ƒ3º[¢öˆá‡%É$±κxíÃq².Ä'©íF¡0h¨ d¾Ú')Qäp¤Ä_¬¢Ùe~µìá®ÁøÇ}œ…˜Qƒí“Ë>¡·´%ó|VñarRÚ+FÕ"êÏH¿¾ ´Ç³î¾¹n9¯2÷¯±s]ý_ÜÙAèæŽÇÍžƒx8ZÉ›DíŒáÃ^´•S¨ 0Ÿ{1*+Å6L«Ã/øk{ÀÒYÀ•^@æCã< ‰ Ö_Ï è™ £ Œ}ÈõÕ3”@Š…eÖË‘œíÃrŠô ¡7™ÅqPK„‘µÑ^ÇÛƒVŒ´@µÆ Ûkî¾W½][ÙpeïÕ—ŒÝl¦ïí¥Dz¿[@Nÿ?,: ?ãQP9„Mµ¢ª¢ßÌmÆG®¬)ù¹3N×.bbÉÔ­МFʶõ²hj› £Z±à@·ÑÊA—7(E²©1nï §@$s³ÕîøÔiÊ=¯w'~xe›šnWàñ8ÆUuô (@†±bø1 lB6§íý3Öˆ×<(W»»éÖÞ×k:¿h@\gðþ,åa´G^¯gO,õqÑÚBpjÆa_cõÇΰãC ûÔÐÕ@;7òE×s׊<ëÌ:wúm€bLë\¤ù3ݲŠ[)(=­[LM`Nº±¿2澜È­xD®£pbTÏ›7e—«aB×èG ”Gþ,ï8ÄéÆÑñY«åzäI¾?i¦ÐšØæ2¤ ç­Mº[þ"²–Âmmz¶,8‡`õ¾KÌN:XhbÏHiSïL4Æš–󿍢UÈí½» à±põyR*CnÇÖaÏíÍ$½4‹1ÎI¦*(ÀQwžªFž/ÂG<¨üÞ¡à–‘ÏŒ³FWBhç%ÜdýäGG$FaŠœá.¸º/©9¤ß@mü]q¦šW$»CÜx[U±POæZêt„Ÿ©‚wOa×éî F?íü}þÚFx«rÈQ6ig™ùÍ :™)m/5P'9/)Þ„ðÓ‘÷ñjUË\Õë”×E©==ªhÀäM%”_q²¢­Tí‹0hŸÙçåC,T­!§™fï·‡ÂiUÚ÷Íî/yœšÒÆÁ†˜i&™écE42© 3WMÍ«ÈÛ `ްÐhчè=E·üFÅ‘*†&'Û B“EW½ÉþOñ MåNâÀq4Ö¢LÑhÌÓefâ£Ic¼DgÞ-0N+§â"×0Ä£,Ès뜇x³\™¼>z‹=Ù}$ø¹“ˆ¤IaÒ [Û”MíŒøüòâHí¶E]¦AŽéå‰3AÐ!Øh'÷1^¿›½ÕW|6–\Q<X—~аN5i•ºpõîÖbb1†È®x8o¡å«ªê1¢`vŒÜÐ2ÚfüEŒP¨¾¢Y ù¸–ÁýцáqplŒj=¼AÏNˆ6ôÐHÓÒŠJó ÂE ›ý©^UJ§âíQ‚`c é[HÁ!¥9 Vˆ›†|`l Ú{Ä:*fWጄt" ÿEšCL80IôI±À„ê lÂú`j±¹ ìn¸M“ç7{_Ú䙦M$ðz@&|íŠã+34wƒƒìºîÌÞã¢'iw× r»9—á:ƒ‹2§²¯æjtÿ(×iñ`5»Ëù~ÆRÆoç¡@dOGû®1%w“á³îv,œY‡—D7]@SjÍ}·o‘ÉÝ)¤uÄæÂDËÇŠ8ücòË—øÁ›\ <õ,SKÐVɶó*Ö§hW,-´Ž+Ç@šv ÉbÓ …àn¯Ÿ&ÜírˆþJ&~ŠgÝq‰¡1Û߈Ò4æ/_<äQlAŸ<¢u®öÊ“3øüŽFŒÓZs¼¯Çëƒ]€.j”~ÅüÉê”ÁbwML–(ŸšÊB2k‘týÀÔâà-6™×hé‚–…/y„‰(ô %žéhû ¼è |6ÛS³úŽý×ÝîM ±%Rõ3!%ºtKa“v_ή•ÿ%h!ÉÍWä*‰+%½ãk n€ pQØ-²IGMðç™ùw4ˆZ˱L\ñõø 7–ƒ¯,Šå\ô³ÎHj#pû³‚üŠÁÚ?âËï4’aŠ£M.Ù–ÆÜöz/€â8¼yGr¸ö‚ùÚa–btõt}55GøŸ7 µw±æ«%ª®ªâgH뉟€Î×™·UŸ™8o˜nuë|Ù7•vÝ®åæA°°Ä§ÕÓ?в{óª(D'Z”¹÷Þ\ÛoH +Ež\ý±ÑOZÔÙ‰&i,ˆï!¢‰¾ª¨ iw"¸ï¸¤Ê<…Gæj“â’¾µŒoZ Æ^~¦=Uëé3¦—")Ìxæ÷ª'H›oÍð VˆO`ãõa"·ÕØ)ƒ³}ai‘L<Ò|ùKJíÚÿð)YB}Ó­¸¸ è‚/usU§MÀÒëÙÔÞ•|÷§8v- £ é¥HVá!A2™—<Ù ï=Uk–êj·e¬€lÎðŠfœµB¢xuÆ0caµ 2ß ù”–¼ž_|Ì8sk£/ÊÌã;ãm÷crôÈߎEYÉ =­`s¯­¨^²uBN¾ƒ«ÐþËÞ„NÞYƒ´¬iJe”eËÁÎL_xâ~w¿¡jጩÐï]˜©Ì.mPv¸iõÉä-Wó,Ó+ -tØûa–cþ¥yÍ[Ó&ýÒ ^"”gð²áú¦8N”ƒ3àëqHUxZ㉓þPÅ÷{_†w9§·S1”„3KŠó‚(æPÙxoÙ†ðºähœG«Ž¾K›ÇE©¯?kæø[p»p“ßBJèÈlÖè^’Yq¨;%qÓÀ‡Ëô+ÈžWó›D £S°ëZØsˆ½ë_Œdˆ|Z¿IGÖ)u[eSfOÒ`—¹Q|±U}Û «øAñõR!Vyç$va$}aH_š»ÄÌñÎãÂŽƒáÝeHæsA6+J²˜–4K>øP‚‰%D‹í|úƒû0N 2Ï(Œ‹1KO´¸}a+å‰\¢¼66rÿ/L×òÙ„«ûäXõÖÑ`A§ë¶G[DJGÒÎ ’b––Àý7mÖÑVD é§„‡ ^0÷t ³¤Z=ºŸz¥î³ð&¿§î½Røt[›ª ¼ÐË8¦Iù,á!Ä{#WLåMs4É@€AÀ@’M!ŠM©ôG?Øè>[Ûe–ö†½|B©½J -vêŠ/*žV™ŽÝ%/Œ–9)urÃÄä,ï#žÁSì}ˆœ|•´dÏQ,¹¬ªù®.°ÃÜÐ&ïÒß+£=Z‘± Ú˜³ÐË{ÉYã´°"O{v}VÅÂÄx«}ÜOL#­! 0ÚŽb°ë‚Úvb‹9¡¾îBo^íƒ/µìüyê”=Mt¢ˆ›Ð…r#vNÇÔ‹uê h”&•JŠ$_ÅÏÍüd­êXv0Ðx¢ŒTS¢¢ì[f«ú?0ƒŽ_ Nc‰Mj’ƒ=äÁ¬˜Äg ñó7ïd!OR¯Z›JáSIJâ[{0,GðË@Ä%g“×{wÄØÈ}RÍÁßà5†pÅØWn¡%^ÍzÎ=ÝP ò—–ÒBîwIû5ÂÌ/BÔ¥S­œ¿‚¸¸Œ[[Îwª²,U ±»>Ÿ+ø'}Ál†,_€ŸX†#R•ƒžƒì+ 35zÍ¥dx±&§cvÄå¶)6Ž,vÞ›iRñ™E1Pò»¿“MÇ2éiÒ Hë½H‹ ,»ŠE¨pk½ˆiqó¨º}Jæ]Çážp°O¿©[.Ë^÷;sàÒÀr"N˜OVÀ|Óç¥ñšÂ£4ãP²}µôé°‰¼qú‹ÜvF`¾"dy9Ìð¥PÒ,·z“·ÓŒ\|>Ò ÁO£.—'ÚÑyñŹÓ5†”Ž7h4C¤ÙSd†Àº$õ)²߃ö¿QÁiï¥Ïµsã§hß‘atVΡŒ©þÂ/*ª2” ­™¸·»‰ ‰»° ìú÷û’гn¾¤ÓËÚ’)fƒ†ÛcX)¶µ¨ì®tBÊ ,qú¶’mŒö„e}T¯ŒËÇ9]:kY¨o#=™…Ý4ú†ïwb’dÿZ¨spXrÙGlSØö Óvþ#ãä†7)lm%…³z1Ò&frT —ÌžÓ4™Nå |Ž$ª…G˜k¨°c<‚·'¿h.aat½Eàçq~Ü û\™üÝ,-M\ô+¿ n_9|7–¿iÝêëw«ö×^¿^taò(¯óŬWE6q²² ï›Ïjˆª“€¨“•Èt×ó–2™f’’iw½ØÓIÅjl•ùb˳ï}‚waWò}Ôýó_x×U¢Ø_ø· æƒPä`²q‡–u¹kÚ²ØÂó™”ú/Ò¡ü®Xãû¸à6]6ŸcioÒZY#Ä‘=WvOK7âç!q€à“Ü{¼û×kç°ôú\f ßè§¹$6þ1ñ)3ðiAcÈû3Ð9ƒü(“÷‹ô,g4Bò·®…~o‘šS%7|]õcõØžYÄx(®'„h<’áº"#‘ÑÝ&áƒlöýˆïEÀÇñ‹ªQ7)õ#…ïÿ|œ‘ð§¤ûûíópýÇÕç$ hÔ`zÕecÑBÁóÖ›¸¦$ç¶íã{jS+É ÈáCâtGáÉÃ00cÃðLrÓjÕŸÌÛä(z0()¶„ë1ÔÀ‚yÕV:*›¹;!%‹¸f mEQªhv[ƒ%é¾zòªR]Cò%–™#™­Ö"|gÒõ5˜ÍF-Y‘Ôô Yˆµó¨÷U( ìì™ DÔ\ F' Áó)5jf¨²[šÊ~.€¢(F;%u×¹iÓu´˜y8€•Òм»Ÿ†ÿy^ŽC²W›Ã™9Oo^¼ÔOÚ4X“[½©'+€Ãð“ˆc„UvÝÓ¿Žx‹÷Õ/ýkŽ×pΔ¦$BJy• U«èZ;5Z(HçƒÁÈ:é[OYè³÷CÑÂë_Ê¡Kžy3^CH ,eÌ8«z=HS PV©h—Š™ÆŸ”õÆ7ò /aBé‚XÅþmðÛîì%eëXs*ë&JxñYøúò2}à F…Ã>‹¬_$»úÿ%Y¤d;!oœÀKÛ­¶b€Nà<;E>[ùðD &Îà;¢›O ; ïj㋉u2"§Œr6\’Y2 Ì †eµ tÉXT<±’aù…¶V’Ý5No42[\OM€aªi7š÷¡øV´”¡€¼„Ôíà¡üdRÛÒ,lÙzë”ÿØŒ¸n W€P©Vçà•W-ï3ñ†7|£º '{:iZÙ¬0¾™÷ã?ÎUî!RµéÉ÷“n{J¨¸ÿ¡[a;˜iE#YêÆ>ŸPâà¥ÎŽJþþ1ó»žñ¿£Þšu[ŠeF_mäáYY¦cÌé<Í<þž™.Ð0¡Øx%þÝ÷YÕ]E¡.¯nHîõ„ ÷‰ÙÛà2ÐT–¼©q%f¸q÷vSg"Í'b*1™wÖc¼ÝËL£Ucüºº}ÍP¯ú¿(fO|2qb²Åo•Þ¸“š©¯ïð›˜v‘qÎÁyÄjlþ]sØÐã>lJqYéŒóÅÈÙOà©þ1$Èú9l5@F_µuÑü©Á·±´%”MFú‰ïgÛî©y–3×> t19È7|•c^ÑYÓño0ž³¢=WÈâ7àž”–Ê#œÄX7g" Š:OóvàÊvÿ’|:”HÝŒ–ÜŠS2iDãÑñEQ)§Ÿ“é«'=YéšI$úš¯Èƒ¯lþû8ì¡H„s”Ž}¦0!é ÁÃ]Ö^‰VðìåL4÷o¥‹ä¥0—ô5Úš 6×Áø|£ö‘kïáž±EO?_„ Xè媙ï¸ú¤-×ú x)ÇÒ¡ƒ‚±X¼B ;\Ñ IÛ<‰&–h–Ì=ìú|ïÿV¤ÐRQéM» –@¤–¾e` 'ÅæRûÑ\õ›:hcñ`7­"ñ9hv“c»™G mt˜ü¯1û²úHCO´5¡5’0§‹Y¡vKþ_°–"5pŽB•séªêæÖ_ÔÜùÕÓLå:…òÜ @µ~4¹».9UØŸ1?lÚÄšÌw”WI°¬Ó”v,±H`±X´tŽüõ-<ˆfi$175Í>°L%©~„8]~¼S484ÄnÖ!.ÁÖ9œÄ`ÞzE&cñOŸ¹¬¤\÷46Ð8vݤ'ê$½?C‹JÔÐ!ÆõtGÎjE¢Ç×J¡>î¸?Ãl5((ÎØàÇ&wå?VýÂGv–~Ê.Öe±¾ø)½ÓháOê–ÏjN¢ú[¯†òÔ±_Ê+¬è,ñÔ7B¼N£%þ»âý¾È/(\Š¢> ã‚ §µ¯©õr.ÏP÷Y`'Ös?ÅýUS, ;eÛH…SiI˜4o¥©$¯§ðÖ&M¨Ý `&n/NDLFwÐ"Û9?žùB b~0ÉB?[½¤BX†’@Á¿õéãå:r\â7÷èbƒ7˜t“Ï´Ø®B²_ÇyÆe8I½ÖìX~§³±¥ILŽW‚œ)÷enH{1•5ÆE®µQmë£:Ã8i;†50ªÕE‚ÈFqDÔ¢ƒ)[ ±}͌ň „ šnEykEŽý ÇÇËóŸË¢Ö™lï57ºóÒÀÓò÷gäôq…ZFuá‚éSôË¥ä¹CwX«C2!ÝÙ&‡L$¨e!Ñ@½~`Ïó&z>üuû³(5“výèxôÙæ o û£sÿP´Ç•3“\w]°Ëo¾t^ƒ¿§ŸËy¸–ì„Ã}!ûÄ7n·@P{ÓX¹>üÒ¿—ìâd°ç¦[1þ£vnUJ®Ûd_EÂýÌh3ÝÿÓ™»Q»x«R†•ŒÕ·òº<¡ÈkåC_„²ÆŠáu‚ÊQ‘^ú¨eÖÓ=®Kx(ZúÇ2bOo‘ŸK‡Õ3½°Í»­JÑè²–U„Yé1I¯Ã㤩¼­–.ÿ€ÕY®2&:9GÂÛ3¾ñ¦µF§0ä„¶Q»…AÑwø~QCàBçIÀq:bFíìqÌ4m½¥ý1芼XA5vväF¯=¡‚¾ìÒáû7WŸ?ÍGQà¼Ý0µlèú’ƒ÷Öl»³]䌘Ý:PMY£<µ; HQƒ¬ñ¯ìÒè ,,~jø)ˆøjLÛµføÑ¤.PÄq¨L{—J˜ÆÞ&Š÷øÂ²vÚD¨64­Ù—>/¬1 ïäPE}„´? þûûXrçß¿ÿöÿ]Œm—â¶ûCÌEÛ»¡À²uÔÂ*I†Á,~ ½u¦Ùw ¥‡<º ñáè·i*¬Röv­ùÓ]zv*çˆKxŒ®¸=‘,9³s¸„.¦@TŠPøÜ&ØÓ–ÆafÆ\ƒìXžíÛk{g\Ì·}¿Ó˜±w9bÏã#æ?KËu¨KòµÏÃÉÒñ¢P!)2¤_Ü_Þw¿Ša¡_RH'E* „©>ˆÏku_ˆI¸ÍkIT& #åo”kQòËE ËGHW¦EŽnn¿MoÙQt€2þ’A²"EíYMm<64"N´5FËð¿>¦¥R6ú§[-7HKò ™J)¹~S‡†ç…6Áþ1¢]d¢rùb¶­ðBªÉœRùο@.¨IÈr2Ô†‡“„¼ VÊUʦ¼4)µF€‡ýbu©³hûbAOÒ#èu–m/¶‡p£©ÑÛ;¢Ø›\Z3%¨±¨ù0–æÔ•ô¸oüE›i…µ‰™+¦•W/a&R+œ-_r*ñΔ¢h€ w°Ÿ“S[RÙ±¸0¾96á옄¡n¬æ ùx zÇ—O;á²9's0GàNºžü(ÒŸ /g–ÝüÜ -Ú Ú0RìS]†BaŒ¿<—ÐOlVç$É×$®$¥2"Qº#„[åé…ZýE‹îD&bè5^„÷䙸à 9íá×Ò¶¦W{á’DÎ7}cHàyŠ’ì†+¿Z¢žrDaIЋ)EI¯ZŽ)ž¼b_¼·™íV/jêa8o’Wè8”/׉ÉÇöîó–«*f†–ü•0M^pÒP×¶Iy>ák¢}ž$2Eý×2Àþº>{>7Q5ßžÍù”kS=Âs*íþ{¥åuv…¶ÿà-SAm¿Ê]7Æuû}‰èuËSDÈ£·&ÅÙN²p¿/íØw\¿_ßl›vèhê$áV¯üÓs£Ìæj2¤W§]FWè³àX.àœãíö²·ú]ÏM]kLEÌ_ºÏ\0à>øÔüaG1Ú ‹å9¢p^ÌÈ¢w’_­+GkÜã¯ù‡¶ü?ñ Û©b9âô7[n´"ÐNðñWZLy޶­~Í{6î$ˆggG¸ïþÛ@…¸Úøñp[¬ô’05/ʱ{vš¬a·ÜЂò’u4Øs”˜Øê U”VË.i†{ˆ?щ]W¢Šíj%«ß¬^gB¬R§¡½{/êÚÝ’."bã[Éç,šQL¶@,­ØòPð•»Þ•ƒAîðè¸.úX~ºùú!ŽÕƒ‡‘+áôA(%–Vu7I‰Guqæn=@µ]lžI>À'›û)ý’ß_dÏj‚ßâœh¡I@!q/¾'ª4zì¾.Æ:i·ZƒìÑxEª‡ðÀVÿúQÜZ„}·ÀP•7x‚Ö”ByŸÿ¸u}숪âõIv‡1ªdW¤3ÛÕ=ñ„ïUHw6L‡Å¨ïÊ]$5ë Ø®µ_? šä+yã§Ùq2ò(|‡\ æÑjjlÇØŸÕ_˜Q}S¨òH2r(æî§aªdqgk«Oöåô³ û ¼³WÉs3s^ÔÆ€8¥ìœV„W†f·àËߟAAéÝ{…'Z¡%ú_ù+Ó`ÝáoOXNá!äÛ·j#|" …‰ÛÃ]NavÐê¦ÏZL®LÅÿìyž¤ø¤=1?wóš+‰·ÒßSGªzqš=º®ŽÄe&æÝ*¢õä÷)¥KéYsªeõšv^ÐczCtªÔ Ç8Ü$Ç~Ã<¶ókßAIƒüÏ»oȉÁ¬ãØh'©OwDÏŽÅôŠvâìXè§s¬Â¦XàŒ)€¯ÛFx£½ÅW%Á+‚g[X¨ç]v›Å©ÝD„v†ïT¹!ß_íVJó ÌJ ^4‚ïè* L>Ó•žé^BîH9äS¨ˆ`_ªyÛTW˜õ¬9vb!P9$—XsuxµJì4PËè9¥¤2̆»Å”æO†ŽÔ¸zßévçÐ1‚·BY+ÙV ‚èLJ60|O6+;Òyênvto"´Ø;†8âyðàl°†s†v_tr Ü3üþƒã!É—Æü‹gNˆën¹äq÷ü0¢P9dšñI#¼/ÚkãjÜš5%úóº*Î/LÍÿÐókSÌ­j®œ ëÅÎ@E+p´xÖŒJ8­I“ …Uˆ'Ï/¶úqßÏdžèG,ùi3¤ð‘Mö"ôž,ÑÉJuö‰¨ ­±ë\ž–*»lqÇË_&·I²¸#FÇSðM— ‰œh (Ìô('{¥c~eˆ´‘¦Õ‰4a‚eX˜ŒÊ¹¹­RlÀÕª*¢öàt•/ç%©õÚ:ù ›%ouˆÃþiAp•~õC®¤íBŸÈzt) -Ý‚ÌU ˆ©j[î¨yg>Þùüйèq9`&[Ìñ>Ñf¡MÌTûVghˆÿÞÇÜó‹íIÑ—¼8Á;õ¨^ý·ˆ­¨šcTq-»×Oë%öêáòê9ãú΃اÃÀ"8÷›@ý!ùºy¼0E`}Œ1tÊB²L²§š\F|ñ¨?4Œ*4#‚üõ­þÊAi3ž¯:-!‡Š¯ÉÛ&.9E69‚õìko‘‰²älç‰ì”‚Ñœð"( `?Æ4¡–9œÂ T$Ždø¢‹Ýq/Iž`sLÆê]Ú5¿cÍPYùS¿æ{b¯çíôŸ'þ?ºqŠ™&üåÓ»ÃÎOv«“χ¯Fñ{[üQ´ÏJŸŒž ¼|5)*ti,dìh,D†¦¢fU-x0Fm,çªSÙS_:œk°}mágÛµÊø`¤¦²ark-t_ZÅʺõßT¹å.ýê±ÙöE‘¸Éð©•î×6ë•C[Ρ®T«ÝïÅ“”YS¤Uz”¥/NQ@‰|Ýrsæ{=Š( ÁÞŽ) iÑ]òÑ™ß.C¶æþ Ï}HÚO³ä…-\|BQw¶t7¨-³àæm˺â¼3S.g¸3!Ô²Rú‚ »™Ž1>Ç¥–5êËô·ÙkGHØàÿj:%3ŽoëÄSÛDìÁàoöÏŽé÷3«sÇqô„iû‡§-O1¿M,\Σ7èŸgµí ÒÕ-› ći“¥ò\:™ú>E–ñå4_hëHÈX'üSyG‰ :ÝÞ>É 'JZ¦Ï] Fª5˜q„ö¶Y¥Áf5yôŸ‘Yy+H|Uº]{'NY¯=Áš]%o)\SÜè]//°ø÷¯ùÚ@œùFâ¢í@=5»ï—©à@€t58Öå’Õñ·ËV¡ƒª||ÊØ‰A  l}‹qA1üÖŒxŽFÆ %Ö>ä)u̇œ+ðNärsØOù£]ûIò4,´®iØ”øßˆƒœ×±wË'`o#W—çããˆÃžPþoøZ‚õ&·¿=vQ6’1¯ Y˜@´(ÆáG¯«„é$Ïï49LÎKç¹ë¡Iz²µÿ*¥,¼´KcO<úüqú}ýÕR59¸0]­ÃWmK9¹ú^ l°Ý¤Ôç6Y§Éê&J'²{jésÂaáZN …#99+?f\Tï&«o“ê0™¤õC‹>!ÁJÀˆûj&º6yeß æ°µU€•¢te(ÁWqs,:#ÂÞ.¸Š`š$õ)k ¾üläF›Ïq Q¤¢Ç< r Aì-’³*ŒrÔNƒHP;¼ÍgîÚ5ººs²ø6MެßbúH£Êô†îàN©È¹ÛYþ"ˆF¤Ä®xÎ3UØš‚¯æJÔ<Í^'ËÐzCë"ñ­Z·ŠïÔê"öòGÞJá‚ <%¬—š3¬ '¶`C¾U= úƒw'V[™[™/q&.0™D4"Ò»¬ºSú­:Ȉ»UÌP—ŽEq‘ø{Û*¨ì½¦ ¾6úêÝjBJY‘$0?ÉÏF$©¶šÐ‚ɶycÖJYÆÔX7’a;ÄšCКPõŒŠfÛà•‰¦O«Æ¢ÀÜ×6ãž§«ºÃä<á ·Y@t×þg»­ëóÁéÄK8勵¿lñöü??MC«·É QÉâð%”úƒS¾u„jðöÝ ¨ZvJ²³_¬“_åT°àM“†fÚ˜ý]°ˆv˜N“j`÷—ªæ?ÜJ7ïM–«é3ÅI£àf.õ„|v&qpiµ*~øèpx£Ó½üa¤}±.ë“vø|†6ê¢!W­ê’I û”ØàîkŸª¢¾z õñ&ܳÚÿU¥׋ß^õT¨½9:ÑЙX‡?…Ψ¹ù^8É]{[`¤½‹‡·žqR¨ëâbDiO= ~&4ÉõÝPŠBgùHÁj‡¢£ÒL1^ÝÍ7KåPn*Ë®åz"t›i‚Ó°Î+M;‹ûi‘HÏYGh œ# ¢S‹# ])ýúD?âô1 (u3Ò²óòÁ ceê± Ý6éaßjqUò@Rxl ÔÞä3Ä4ö¨Ù…pmé*Í1!»aÌÑ|cÌòƒ+Êš­˜·C»¢3Ó0袬AØ]önFñ—åjô(Ý['•œD©krEÏ$Në2ÆáÿtÎÕ’rŒkVéÍÉ ÀÑç'ià  ¸ë®nØ9^në´¹Rà7éÔç¶S—ê‘óâòDÂdr{d âq¹Lã09Ñ,/×oÄÎ=ê›DUðFâðdR0Q>2ârR©ÚÐÔíâ ^\7-Q,nW­bKk»ë=ù†,ŽB«œ`@û4¶‚"…À•·póxEØ}åŽaTè¦Ä[ñ…I#X›ÕQvMásq=^hzùD÷x2BS(I¹úm‡GÚG¢”v£¢•ÁD5Ÿ—ÆAâi_é@PB•¥—°ôž”#_© ƒ}<*öÈY>…¹µ®F!ÅÒ\ÊÇõ{uä*ŸãQMÐàÜJËl¡gjîÀ•ç IÏ •ét=ÑÞPíŽ?î»Ê;Û¯´™5%³:AIm‚ž fzÁÚ_ ™ÁÞèØ£Ž*,¤Ã^©àÂîç[‚öq€1¡#oþ… eaµ­ˆÙ0y)Ì“¸K€VêjÜ8f„@BP;QS:ÖŒ±9—|/#áÉu.1(É%+ÃÖk¶bŠF)/¯]C·q·«ë­9ÿ~9ú¹ì8j0¿`;óÍ^Mä/`Ú/nšñõG2#hwøÉu3Ee¯v}Qú‚IÐnëOß®+›±ú2$‡{ÕfXSå­‚—s¡.”?ïCî¬IàŒ½‹i¥‰PJ+ºe °ì®[1J(9íÏÁ ‘ÉÀž5•CpĽ‹nÌo°Ì¡çxõf›fÁVc' àW×0úf¯ˆ ’£’+­ i­>¹¯5(ðá±aR¸=¾;2™DµÈa·›1ô½ßÄhžÂ<§%4Ž<üä+9±£™­Ì! 2ê®Da¸2i}¸u¬T^Þìä,ï-ëfø2Â6Íÿª©“FÝ1¡°âØ=.Bp’ ©éÒlrab  ¶]¸§“´t2¨Ã×¼i¶SÖɯú̪‹jSÊû3ðåÁ„ÒÈ™>{û¹ïuBbtK… lµ ­±~ø ¦u)Îe'Ø ÿ›ˬ!t¨ê׺«^¶Ö%:tMQyøŽð«¯%‘T”=÷ j1ù7í¦vª0œû3i¡TSSåMV²|Á>Vròµ…ºh”û³|ÈM]ÉllÊ–;IÄuŸã7Ùî&”'8ûbæ_ øT-•YÓC8å#›hÜÛéLçÁÛä®ÛæU94@Ï•æ[á¦S€ÆËîæzQïá¢H‚Vx® Kp:öJÆÑýu¥y2§³ ,´í¸9èQû°zN•í ˆ"û£DK±€òxs©vÆr“4›uÓ…Zñµ™AÜ“±®ùRº—}4SzRŒ½ÈÐBHz„?kP‚VógCÊ~³Ÿc±›GØÎÞ\W+ÇèÅÛàäK(0‡b§Í4%³òPðì»6ü>ý uÆ« zï)f©­NÆc¶Æl=×~6ÕЭ¾—÷ µTÉt„âʸš`|\zká`aM³É<¾ê=&_Ò"ä#ƒ¤Xˆ&ÚuÕ’ìò6á. >}vn¦º-ª:Ìx ¿¹ÿâxØZ’å’|ÂØ$T•õTͶ 1w1šï;4¨‚Õ  co"DaíÄÔ œÞ|vpÐ]öÓÅ0Ö ¾ùw*zgî]½dq¥rðókæx€’,ȑÓ™¨?·O(m¦WPæN¹~PDŸAÉž•Ž˜9ëšC¤fçí“¢¶G¤5¿ÙŸôÚ¨Ú¢zfmºþ»´î ç|hФž´†×´¥•KÚAϘôéAt¨7êœ/ÔG$C¾¥Ÿîúv‘äM ó{¡xö{s¸ÙmÂéWÔÑ—Y“?¤:aâ¤çšcŸy¹ŽÆ%…ÈÛèáþ¶ ¥{ØþÈŠ¦nR†y¤Üw!1Kcžjü¯8^[:°%‡ðXËO?n|xÏŸ°uC}†äMJßïi­ó-ö‰aFÁB`(,î¯'íT¡×ZÆŠ¤Ð"‘N+-D›˜Ð‡Û~ ч¬ÞÞ„Õΰp´=~·Øôœ»JóûçBa¹€‚*¦)ÕwÙZ#Ø}x!“Zy•RV)ƒ«A}\ºâ²Þµ¤†Ž.I“Ò ƒÜŠƒÉô¾¯¤uF†®ÍÎ­ÙæÏn æanúû¿IÇÿG7p¬Óˆ—·’oÙ{DÈ\«ºIPø¨"Jd„§¤<#º„K Ì N¤'ãàR¦tlö‡—*‚ u|¤MÄB™2zäGÞ‰á«xeW»RÖèøÊRœ;ó5#qÛ8m¦,­’ÜÔ…N²îu1éqlŽ8¿„Ø‚Ý?Ž?ŽRc­ÂY%V#{ð‚wYP®~ïݳ¬Åî §œÅ!‹W§¹ã6ˆ{Új*ÞV'iˆ_|ÔÌõ ^Ù™<ìiÆ¥o3·ßwuŽ“±—ËåƒRØÂxó=“©»µ9Ñ’†½ÌÞ‘àÈðEſز(õžƒ–¿C‡~u}޳‹©è¿——<­iêʼn„€® á¬8·~i;'NîJé2©7Œä¸4ËGs ‰ýæÄÍÙAÙ†wþ—´ûùÙ ­·ÜÚ…&¡—löÄ úñ óqûF¡}š¿ÚU‚ÊÔVhøÛÌMæ*Dù½s䟢ŸrjÒ¶ x'ñK£X±MàbsÛ yò+kÉoK@:ÅKí?Ñ£t=0dÚÀ˜Õ0m³_÷!t %ž‰{ B[¢Þ<Æž£ê#¦6Zªý ÷×̪ù 8Z8 »S€¢!îpÕ¢ëÿ* P‡æ6õDvk7žòn!ãs.]Lš¿‘›™öýÈì@ ÑWåæÎjAÐ&9<¶ôpüßl¹Ïç‡Z[º‚µ yé2l$ö3# ê4¬¡æÞeœy9ã¹pIÝV$5¹”tM'Ã&F€¸þüËlݑΩ§ ÒÊ ç8wTD9ãNü [ØÑÛ6ñ[62Ó;g:vȇ‹"ϯþO½Z½yxÌâ$eÌÊ;YÃê'(¶RC9_¹-Õ»¼©9êO¶P>NñŽÕ“J æš{je¨)ß­íjš»A‹ÅRdµÌnÅÊ!Ääí`O-ñƒxȯf„I Ô`">TÛýž­ª×üåá“U‘úÜ nMnÓ5PÏ9S'9í;ýF,Eë•+”JÜñ6Öb ‘ÎâñXÄ ÿgø+ÄÙX ®ùë¿ú„#·ÂÌ Ì7¡°Irž'þ4‹HÏߨ=5«ÌCÓóV8ö.1§(Žb©ßSD šüDX}ãÍõ/$qôd&î~Á3–P­ž³¦Á…mYàLˆ¢-Ü#ÛÃK›þçÃ~»¿ˆWkx,ЬæÍî„owXäIñ×%ú;Ÿü]¢ôa½gç'Gr#“W(ÿ aD­+µÈ éƒb¨Ù)Ö¤ù3çF.哤¡Dh`QzK4œ&wzT".ð·9~Ps²Í2Õ*^tã[:ÃL_Ÿ¯¢¢Ûú­iœo6*©=,PŽÍM\w°ëJJ ;²@_Ék3ŸWzÔi_0¯ ršüSÌï·z­ÉCƒÀع:{µáiÝ©x2ó8­Uûhƒ$]‰4šçu:EÁY{ì¸ãòëÛ–M}ú¢vkšÈÜÖ7q^]@Ðë9U³‘Ÿp‹¦˜¡Yù ‹ 2ã>À/^žfð&·±Îüí<2 Ôá”+^‰EDž×¥ÐÎÌ{/bÊ ˜¸è›¿úl‚5O<[ÜàÍÎØ2¿@Û¿r„ØÎãƒë;[^%«œ†Z;- ·þÚbnV3°&ï#`ÃW­_U,á¹ÚE ï4q{?ö²O+V9q¼ÃÀû!·¾ÅQ$Å›»Ìs@=ªôu@éòsËŒ5âàý·òÂkEòá"˜Ÿl‡æê S‰Õ¾·sjyþC“8ÒX­&RT⯇·Ç5Àüµ Ë O•‡0Ó< ¦f …LY¼[Šó i£ç…|TèÕ0Ó}¶£cíÿ;eW5¿æ¿ #q™µŠÒ2–QiW'²ý““ù¯wËö®>š.„WƒbÌ_ÿ*¨²!÷‰÷µA˯¯SßAÆ4Ä‹H…ºÉDûÈÇåƒhÌO“ÎÊY:,KtGÏØ*8ÙK3cdqÊxvSX}Y$Q¨y~šhq6,S!Õ›]u¿WßÔT¶ ˆ:öƒ¢9»¾˜çl„pªp„ôñµØGïÛ–²Öj%ýVŸ)É„MV¼Ç3 TÜlO¥ÏÊsß0ë‡>á@H"X¯›O\ó"så·¥ Æh@ql°©ˆëœ '”î=Üg̽]Ëä9¹¥EaÕ];ËáÙ·€E¨ ôØTìw ½ì—ùŠºÂ¯è¶ wºq„%€¹ãXÂZCì™Z02ÒU¹ƒÚ•ezAûlxí,Bœ.¥©á*AÞD|AHþ»JÁ4šøiŠVØ4o®²ä8$'a¬¢.dëp½3•¯¡õêÇâîdï ä6x]kêºâÁhc©é#[Tç,ù €‚°_‹(i`r,%×,zðôXfb~Œ 4Sߟ¹U—N{)Û¡ˆ†,™ÍðF12j @fê :Si©PÀŸô†÷©ìá|gm!fütµë"˜ªÉÙ™A/d-ÐV»¯^ì¸z^¹/‡–á¯èx»‹ò}õýØøSôý$šqqŸ.š»ç©¯ ûwÎÈÍièà~—˜«A’.G¿RÈ¢o¸R©˜|‘Y¦@3ž†œ®G+pö—=Êz¹Œ äv¸ÕÖé JñàìâÕFöÂèpϳîá=œà=T,«³w@Ú`E[QY£qÒ½˜œ¶ê|ÔiïÂ)×7“Ó.gù³L·v•’ÆÇª„¤ƒv ;<¿úåÃÕê³Os{1¤Â“æ`†Bú=½bȾëa{s»×ïzq„+\li–ï½!9OÎiF‹²4­fikØú—:“ŸL0÷ö-¶¸Ä£'¦\•¯o›Än – A÷ И Û}Š™x’”“!©fäî?8ïþ2z—y‚¶¸\D¤,Ö•*·½½Ä–ä³Ò²5ÞdQŸùÀm~2¢¿ :(3­L˜.”-œ\ÈÔÂMíÞT·q¾é‡I&¿PW¤VqK‡Rª¡C|)@©Dk±-âÅXZØÕ¹&rS'äm4~@;àƒôý£ZHòÕ«&ƒ“SOˆð˜¢âjÑ2ëy|B¥;¢DK˜¤ƒ×¢ã‹›"¦þìDÕCÌêô»ÒÎaºÀŠ÷Ý$>¾ÌÄʰpš¡Õ¸fþÏçg׸C=ÂcëjDô âχqDã`&6v|4†_wÓxWó¦±Ü¹äãžF½É8ƒñèC^I@ýô‹é¡è²Ñ[)6ÄÒL½ðÊeg¿]®–þž.DP‚­ °q$hVî¹Úï:UÌ‹õé,°\V€Dȳ,[¢hv¿°["¶Ê£Hgs¢m°TÈ÷¸ãàKôŸ»î<%R,²sc TO¥«¦!xhå÷¦ßNs™–$!¹Wµ¢ÑhiMS¾hÙxb,'ÇÉ’ž†8óéɈ ??g™‰;þ9I· Ó’àÎj»•Ì‹MŸ>q# Ë»0`QRòêøMQ6Fk;… }ßè‰/ ÖÔìD“gG¥ÏEϹaCH×î6uKŽê0QY”!óÑå8îbcŒõYº'8—ÜL ìC@Üý"ÿq2â+§{ Þ i;Šnð#‚Eó›È´ÄG2XzÚ’F*æÏÈaƒZ„³Áípfä¦iº&Ä!Úo Æw;ôåAz"éµùÊ¡ºÓ;Fï܉ EQ° Åöà<34®:…Ð3º'¦\)ã ÜD6.R4¾î~>¯É"Àü]ò¹fvbº8qa¡µ[ùðìm2¥95òG¼´y»!Oïlîæi¿l ^”¼Kü…°-ÆšYäÂò¿e‚-îbát;VÇ{æ×23;Ö<‘"­&n‚^îa5ö#Î:HZ{8–mì”øm´IÛë†ÊŒ'ý…ǯ¤Í¢+úáµÙØ1èdÇ.?“ ^eËÏT›kµ$q]Ö/е­(þsÖ2‡é¾~-YxŽ6‘ëX}ÆGáÆúÜÖöÆt»Öá˜_ÐMÅ¢7³g¾a˜}œâVçǽ,’.0ÿçâk›%J.ÈR§B«§c÷ ` ½c[£„÷lÒ7eI·U… [†4»ßÔ_ÄIâGJÿ ÷i+¡¯•ŒÄÉ?:´Ó:Üd"%a6ÀGÔ´µðÔC¨Ž´4SMï†söç-ž>ôLpÀÀ"EÖÆú–èk놊™Ù†o¥rŠëà˜DöLN0H„¬Ì[·¿«˜ÆÔµ6¨) )Ú«‘6‰haÍa?hÌf”é!”u€<|`{ñïðD4:}*‘oóš°ôPþoJrNË]*±m³ÄÛ+*fô>Û#RwúñY×k<¤ÜC­!þ¢†çìʱVDüQ¸g›”¨v¾' Oá›Y²gÙLå3‰8¡æe‡ñYÊ~æCWŽa%¥¶åûW³›ôûŒ©½oô‹ø8ýA¬iÍúìŸX) ˰|Ýî$FDCã…3œ9 Bî:×c ¶Xø6»qSZÔY?ƒúëòoÿ ßj‰÷SÉ w¿ãÉÎ'[,®h+3ñ‰žhvÇFº>ý­¿ÉÔwgwƪŒé›QzZƒûà#åã!}ì Ê„ažC}ºv‡¦/YA ‡S•9/Bw’m‚µ±½¶Å’™i*ÀøZ„³ueqBƒ?~õ•i çÊ_qZxzäÜ#O±2ð·d€ Û+Ðàþ/„ÔêlUW”­Ñ‚’‚CÃU–õØ–±»“#XOÅ«ŠËSÆÇî THÛ¥v“ÐÐvzãá¾~ŠØ<˜ 6çøu÷`×1Ò,ZcgNs@£áõÃ?pOÓ:|z ›(pG:¶ t¦¢p$ML–0è8WÜæWWËi8NGé'£ÏlÛÁ†‹§8¬ÍD“WϹ+—x—Jø˜§jI÷Óx0¦ëŠáÆqñ’dêdnsÍË•£ÏRÄG&ÐÁžë¬Æe žYÆT—Šþ~œ|éá…yåp+Nž’¯ÕŽÆôÿëÂK ·+Ã8Yè$­q#ØV/Áï6³9…pV¹ßö”áZ;çãÍðÕìõ‡¦ÑSCù²STBÉW–X†ç»Ózßê`kéñ^%\#l‘©ï;Úî4 ëà`Èqß&m°óadËP'ŽÀªw·ÌŠU·àcPì›ÛCÉé¼|Å…#dfcét‘6ƒ7ÃÂÔí‰MñÀçbí¢øå©cÚ(:EnÜ·—J10pÐjp ãM9Çz9Ê-ü –Nj ¦ç$WSæÖ¸ÐíýE|Ô_¸oTLÞ¼ß$CBA^)§Ò-'šÒ,ì(’/ ªÈ…Æ—5yN0 *˜J‘þ…ib5JXÔ›~¯€;BY’·P3mí¨àfΧ/m¦”°¢‘0ð$c¢6 Ò­ìéH˜Èô¦]þJ]qÒpWzÍ"ÂP‘eUÙ§ÚÁ*,ì/hÛœI9ò²þbŽ{Sîö€-Wz÷ú£.¼Æçu°…ÓdÇS®›ªûùÙx1À·Â)I»]˜$]?ºj•Å)ãë®ÚjPÛMÊ\Ð9AÏä8‰„l¦ïË6}Qý‰NW©<öÚg .#mÞ0¸~„Gx÷M‡¶!'Í ¡Å`šR®Šày ]šJa‚ä|´nq⸤µv™a6p½¤è¡Ž–Œ’%º´>ÏÀ;¨çüIEˆWÄ¢]¾=Ùº<Ư•SZξ3Ų(·3hØ AÓtÉ(ZçQôN…¾ãÔí©Ž‡Ïß,ªÐ'>#·-1ÿ#ýñgË4{fÆEˆmäØÎTd”„ÛÅØÊ®.ªò«ÿÌH7ÉÎ+¹§Xß.“ðý£­ùÿÞ.û$ÒÖÚ–÷‘}Ò) Q¥yþßzÍž Ï[99S8}òâb1oz™Ñ×i©ýÌŽ©ì@S¦¦C CHpÚ-!!/«i/#åþÆÄ¦yåj,ò§£¡ï‚ÜÍ›°R¿«]cžªyÁ] äˆ‰Íë!-Mf" y°ægŠõgã,žknc-Á™4›ñЙ†ñ A‚ŒÖŽlزâdèðï[ômY¥ÈÊ"攜ËÔ ŒäˆJ¯9õý¶ÇY%¼‘ 74kœõ{¹ˆW8Æ©;ÿ³½™ægDeÈ&±”ìëÍ/g>Ûö„Òè ïëA$üVnÃYYÿÚe怢¤ªÚnY¶Vn0^âºþžL$ßK#ÊNÞÄÏ’®§ØJ kÌ †ZX©—qq%¯ÏG…°X7® èžÔ.š%sv†øw8Q`px+sb`ãwAb¦2Ÿþõ¦¿è·j+\ì,Þ4<€~•q n69?®+¬Å…Ýüè3µm”Ž“=vºðuðþ9-tp¬ù0Ö“ê²3c< S­B†<cj"Ä_™"`ìRs,‡µƒ*ü9…4j¿iÅ£ ûÐ(%Ø =4ßTÒZýþBìôªŽÚ3‹!ÕDÎx’"Að?˜ ÃàÂψy?â ²")\!ºó7FÒîc÷:îõôrl]DBõkuC¥a5“ÜIØEŒÆèë8^óÖI$ÅðÜEydF ƒ©‡š &ëw‰·úm õÿ‚Mð®%>9 Á/ ÓïxÈ‚vF£+EÇç¾â$žA­ÝI*—Ûw´ºªó‚á Ò€7Bˆ!ç›Ä@μîçOwù3±­°溣ìžÐ#úº¸çÏp+joµ‘9ªÎ(„l†y¿ÅØòãÿZ Ïzhâ°V9ÀúMõ¸Ú5¹ÔvIÝ–oZP\[Ѿ‚­k£#"?qnôfäþàëÔÿÿf$Ë–(I'ïÈ^Üã»À;ã(áåÿ"ߎ°Ÿ.¾Qµuü(¼ÛÀžM<UÅ=9 Å¢ìŸÀ(Ò£Ð{¼áD(¨©Êœ­^ ç…”…QýW¼²<|VF§[ë7ôXˆÓìq¶™Wl_QjS:q0:!*“g3 +ˆ ¯¿ç plmÀÚ Ÿž¹íÈ‘7’ªrRíä"…Mó3m1$Á]¨ÈfmÄ'„]\Ê?ó^O`3\_ÞÎ F-³#Æv‘®Ø¤¼¦ë7ÈäH¨]LË¡8gË]”J]&¼ƒr–µF^Ö\Òîb÷f…í“¡ú€gÈÀãÎ|Rý„¿Ú"×ùíÏ®¨_g>¸E6d{ïÿÄ%øî¿oâ\›²ÐKl„|yg;´¹†Fe–9øÅ뀳±bÉùPÂA %Ûå?ƒWƒGòˆÿahª~5°ÎÎm“Ã1:ØŒ>O1(*xâj‡hÇ¿™ÀÂÙ»ˆ7e¦yb‰fš«ÿÝ€ÿDþuß™%ó¾kk·mŒ1z&Z­X:×àÁ·Ðtɉ|C<^(äÀ¯ž@1åà­ÍõüUw•âxI.«›ê§6‡›á˜{$†í–KÒBÕšãß%¤õŠc´“W¡Ñ¼³ `XÁ—‚Í!“ØŸ¯]û1h݉dÎe³tÚµðÀÒ½w!;!²‘Ûý¿=©»Ã=ØgXž9”{µA mk&àùždÔúkDåpï –”ÆÀeV8k>=ÇŽšïI¬;<¿r[üÒÔŒs‰pcä‰LJÑÞ @"`ò‡FÍ®0¾ ’K¤ð8óÊ'3IvУ|UŽxòõÛ6:å¬R‹Oñ™’‚Žî®â³:(]ô_¼ý[|»6- Ò4ä ”1 ü¼ÀüjÎòžO¨²Ãvi-Ñ×ÏF<]â,Íݰ-s’œÌvµì®"@=¤˜¾@ næ( Ë"sé#²ørAÑsiÛ8B9a±K¿¹U$ðxZŸ4†›»ÞÛ²–À¦Ë”¸Z¢é3±ñ­YFa“xÒ°÷Ôî}ô¼:ëð!0iQÈ ÷ߺ_db’¥Om2$´8áú+?¼ÒÑœT󛞑ôU%WW°v~ W =Ô#ŽMØè8LâÖäáµPŽô=ÿy!ØÙNçÃ[‰±ø¯Js«ÖBŽÂ'Ç0UV>˜î½Z¾l©…;vN¼8Ø z9ÊCÛ‹-–X27–7œùú…`é&²~»@øk)AXT%iìßÓß—-»ôs`±ú]¹["3³‚Øk$¶^‡SÅO¨owêb/ËJ3Up+N ¥i¤tŽf—‘GGÇíMIâeó?~,$?Zð)Ty IÝÿ '×·ý1!ëv4r¯Â4•%çH¼ÐpkÉeúï`Kè[¸4\=¹wm\–‘n­>¥šüÝÔV˜/Ü@IA¼ §·^ÿš‰AF,·äJ½]º¨Œˆ•ìØ3t b¬÷6oÿÊy„Æì1ä *…¯Dø¶­ýYVD,pO\þRĶ©#÷ýñg/'JLþÃ’4’ uÌvcuÚ˜n«ÁŒ÷^“IÚë»ÑŠÔŠœþZx|ô!¶ãŽx«ÕJÙ3égêX툀²å¤ÄîÏiÝØý¾U§„å|)wlÒŽ(½#zŠoÑ‹A«“…2·µ•ÌnáÜæ$å& g³N½¾™h+ߌȪ6Œ»Œw¬_õ„»(a•›}Ó·Pê7ª ¹Dü¼ÆÅ Äžàñ2á­ˆ¡¤vEùd«ü­#‰Ù%Å1à÷ÒrÝ%>hIÝôߘäKPåX[4Ñm¾Ë‹Ì¹Ó=onh%øãÒðäøCµ¸ª',ÖƒnO­Å¥¹îü?”VAÙ.|jÁѧ{±ôãÇ’!¦Dë¤ò‘ø›è˜£n|ìúÊÀ[•QÕ® i•s¢äPRÆø¡Uæ–F]˜bGß(ç릀²šÏʽ¸_ B¼šY˜@ªþS¦.-E¬o Þ¨üVÓ/ýçsU•«ì~XUÉÜ8 AÆK"L Jæ¶XÉÔغ‘K†]œYYÌrUf/ôCèÏñ‚G,ð&¿•aGA> W¹¾nï8áŽ.B2^.Gq:«'yzÕÙJP›5Â6n³éš\GA | ^[¶œ¸{%|QºŽh@¤·Ùåcéøzl€ kœÃeOGb!HìéP¢B-aldDMâh6ÏWÄ‘p¿+›g>‚ÑaØ ø‘VäFM¹ÀÞØ]ºÏ»Ñ€®¢o.ÖÛy«"+®Ó“8þšÙÅ;0X„úðxÄHÓÅ"€(2ŸÔü;TD—$ÐY ap¡Œ©‹QÎ÷l1ÝùL'ÿ±ç§Æ q)êWòþ¨‡†Ì&:¹böá‰ùè·¹#]ªÏ£Ê­gcÜ. \¾ ©'·vÒ©K o[ÈŠ{‘ê€È×á õ¹©CN)›²ìF\¿Î8wÆžÁ¥\‚‰Á Î. ˜ö‚ÑÑØþ~ÙÄñV'žãwŠ¢òúZàž üõJZ‚L5Ðë€( )èÉ› iKû{} ޤÉä æ›AÎØž¨…~6æE6ö$_¢^¨¸‘{‰ÌB€ŒÚ'ñ¢–ì‹›êÂVýÖ>ò‘ø¤T¶¢YLÈz9C¬2Þ<¸+‘ü©tÔœö¼Yä7OZl´›fpÄ•³àÇüqW#×ï=–ˆ2«ÂM½Õ¦úºG„ù9I“VÅFÇSô'×AÎ!T9 ðëÆH8äœwϾv©Ï*ƒÚ@‰»J=K­}g]I@J ÷L“#™¦¼0Wçhàx¨¯(A:[Ù-]cÂc„£H°îDX¶Ýí€*ÿ™g¼¥±ÕºQˆÔ`GŸ‡‰û·Ô!Ï(0ýç1w±Å£Ê(Á&o!1§ŒÔ™V•îøW¢~™çl^Ö±ŽLäQþ»­ïEª’§¹tª—tèª[žNÛ€OŠZe÷¸›ÔóÓ`E©¬í웕Q,±’zãÝx|3»íf§/6ôTM¨äæÃ“tŠ\Ÿ0D+`ãy×à”SK@ðyHi~HÌht½%¤b ]ï òâ T‡Ê¬‚f]¬}¦“ßJ€ècÀœÜá‹x›©,C™ÊÑk‡(¸Õz×u×Õ#¦³ôÙA,…ô¹T‘n*¦BWÉT=èdŸ(f+â¶Úü-o¾34ÿ64ô¥¨4毕 ]^ÖXUˆ}ñØu“Þ4äŸSq@ð<ÀÌ (ç¤rÚÉvZ+­«Ø¬;¹•å"ýõ#àòG?ø$ò2yÀ±ô©¤4æÖq bOoEë(¢g ²Í&ªPÀ·~j£ÿ ¨½²¤¨]ÐIç?’ïa­¾$ Œ+{Þ¢¯5•äF‡-WüÊlìÞ¬h6LØš%œ^¸p™Ät¿J`eÂLŽ:`?[\˜V†Óö` wØýt!EôÏéEî(eu³ç}M¤Åd`GÔ,(¯ÙïdÇ~0ÒjmëS˜øöòê«,-–4BSt…’iUº‰Gxl(6“ZªØ]¼ån›;Ì »¦=UGÛ?ÔWÐçÜ;†T‚NXû†’Bþ½ÆóŸä£pj$‡‡¦"ÆX Ã5U°¾î›°°¥è5¼bþùßð§AEfUI°8Õ¼UŸ¥ôŠ}@BºÛªÑ™b"+ò•¢Çëû“ŠÊNéD†%Ì`æè·ÙPÇT¿åjÄÎ[½ëÖÑUÜ©¨n¤ÑàŽFßl4‘ÿ¶u³HW"ËžÏà¦ó"ÄPg&kǰŠn,ï^Z¬‹€ò)Þ¸­ø¢þ‹Úºµ49MnÞÇ@¯ìòiÑ`3\YA8­(íùÛ »¼—“a‹¼ ù¦Žï^[$¢)oNTéÔ£ÙOÇÁDìjuzJVoا‘ð‰ð?œÁóùvVXÜ œÀÜ4‡¢éºñð•í8Jï§y$_ºa±»ÏÀ¬1…m[µdDðBù†U·ÆIq¤‰ì<~S Ìš' rw~l,'­ž~åq;¬¼ï=ŽS×ý_G6o<ÃÁùuÙH®O½)qoz—œ†P_S£p©d¾ÉW»›8`9UMðHžt£j—²‹.㈗+ÞD&YƒX5ÞÙšä®…»óðj/EgFbá•~2x\à~ à§…uW=¥u¯Šïýöžœ!㜿AŠSýßLiûô£§œ•I­f¶Õ3p˶¥‰+£”°WIvÆjÞã•õ¨G+¤õ’8Å'Ò4Ö|jº÷ÈwyC »1Aõ]Cߚݸ*ØÐJorÞ3¶—CZÂÅ]7WB&¼±gW%Á§Lmø±@©D·ë~`CH]«™Ã¥ ‡ø·¶¥I•›sxà}Þ‹­ñ[-•õ»”\)IK)ïaë8Å¥Î|[­ASUÜíň6'í‚Tù&H‹â©-°‹¸ò¦ éBz cÌ@¬¯ó9‡†ú¦=¦@²Ó}µË ƒ#þGX†eß~¢¯=y¿‘3+„|ž¿2¥7Ȥˆu:"îžXË~_ÊcüÜh泃ˆ÷î3î¿?Œ½üá „b}ìy„;Q[êÐÆ ’×9‡±kÁ[X> íÅÝk_ŒfîlêÈ4Ïé<º8Ãs÷Ïû§ƒC2™Ya™Of~#Gutpå_ÇF7ïw¦*©ÚÔ/ò“´ÝùùwØ@ïå ç¾Ãs ±œëIoŽó&9ªx.Š„«ñRT ‡e'K™=ßkžV‰gÄØ0ðâï[{lá5°#,íÓî>JRýZ<ˆƒr¶)*úí*Ý2bFËÁWVǦ GÚnëi§l¹ÌŠoö|‚£™¼Ëåot¾‘é ŠGZ¬¾<§Ÿ0„Æid2+ª…i× GjØzì·Ü‡ù-ëlÒŧB?žæhüc6oŨ&ËÖ³« \•uA30yºôæ°ëÇ{“g¶®=!x}xš£w¸hö±¹^%¬,yÏvÙë¥R…G¯ÝëeäÊkÃsŒÞ™ ÔÅ¿ ÷W‚:hiLã)Œœ÷€m >^ÐÖ£$ãr{ÂAÁ¶ÍܱÔr9S|öN!VÙÄëKÂðÊæTtò¨Ä± Í+­Èe¨Í1öJ=20mÌ`Ý-OG¾;5À“ä«S*å*²O¹4B(‚åÕ Ä¦Òòg*e¨ø3ðíÓ_ùƒ>Ékw>Ãíž¹¼è—í¹Ë êöÚq¼5ZÉl<.jé9Ý!RÎyžÚT gE¿uvðÓ™‹#yÈ [E¼|ð×H>: iŒ5?þr:=Ü“Œ>ËÝaÝ‘g­ÈlÀw¬Î„b¡-÷Lˆ¦¬GQtyÔ¾®£)µ!Ò·w‘* ÷6™£ÈŸ5êøîVÇ2Fü׎·N ÿ‰çåк%œï<ç )ÃÂúvóRú¦ºv¡ˆêm±ëSu]F2VL„öxn’5Æéü´&n¤Ã’F»•ЈV¢àÈ–Ï1ëþLl…)¦[ØFQcbÙð‰xkNQûÍ(ºýsu•‚,?GL|3Š3tèÌ*Œ5å"  C¯ª0oUˆ›mf×X\Aòî.ÒÎ?qhd "@^œ˜Êµ#×C£€s€ì!z2Òùc­-S€aÌ0›fìT?nyî¤;µ·ÚJ¸wš¼•)2¿&AË{N1C-Œh*3Á~Ó×·›r´ñ‡bh‡ï’lFO«èOy¶¤Î¢ÂyãO¢óEfÖ!£ü{ÀEüç£éR”H'$€tN{E=ÇêŒ0<N{Bâ±1z…n¤Øæ]jX ²š!àr:«øY%,lmNr`èY7 a&íÌÌz­sûøîhÎ…F£A«·þºAl¨FAç>i=©6Wb~EU¥–n2Ì‘èÿR…(£eêÎNãbx芆¢¸¥”˜tÐU»`ª#ŒsX›¡&DE-À6ÞË©§Ýý¤Y¾“V»œWnÌ Wj¤xB€D£}«Þ…n1GUzîÚ&úÍ]–¯y"f[r?vÐzïÖÇëÞG#4Wì@¾¢fü[§Ë¢qw”É1V2åƒw4"iû*ðzOê˜Ò†¸mN;.;tĘÚIñ>Ó9w›xîQá[‘°RÃwó´¶ ÓR¼SÁL ´ÉùåÖ \.<½Êl‘ÆœÝèR#vm¨£¸SŸ1öa€)M£#/†/^ìoî0›Xh¶èL¿ö¥öø³eX›Àr'.kqEŒ“˜V¤sâÜ’Š_URŸC¦Ä% *¶=ZÜ»Ó_)õä…®-Ç¢i7óÉBÂE°w^èÏÇ8éãúxùÁæü!]5 ZHB²¸t°ò3³§}‡5ëLv 0ƒªÿ¯WqÒÖ ¸`J¿²¤?Ý8nFêv#¥o 3܃ý- .ª‡›£µ¡Á4Æón^Á,÷äijí,ßõ­¢©.HrªÆÉ £}Rc(èBÇEÔ¬ˆÁYwHÍyx7 £°½T³oHðÄÁÉ¡ðØÚĤ¢5nw%‚…öº‚{Úc-"ºâѤ;Sçh7aˆƒþøÔãÞ¹+ãQ2ÓŽ'•»+’4ç+œÚgA•fëøÊqÝĉ˜ ùkìªDª{žÆø…w72øqýE-å(2ñ ùÓå#t¢úU*µ-«¨‚²yê$¯vÒ©óèaò%ozr‡*LýÁ·ƒË‡@¸÷‘ž¯LgfL‰ÇWÑÃÎ5–RŸÄ~¶4aÄÿqð¼+Tozmبt¬Îí‘o˜TÎGäK¼×lÀxŸß øáòŠM½=›¨!þ[ª‡6—¢ Xx†ˆÆ°é}$°½—a`Ù°°csÛ’Ï¡ÞÓ”8{9'†oàB*ûˆiÒ¾´Ý<# ¾cBïEt;Í„è£Ry²:Û(›qÈ!ê¿ÅdMŒŽîŽW‡ ‘K‰ðéþè›°žŸèÕtQ<°Ú“€8Àƒ’½·µZŸ ç§çò›~&²üæ©Å>Di€'ü­{(g¦9H,¦±-OGeË‘>3Õo¨s‘æÉ&x>¥MŽ«6ÞèÚZÿ‰µàð#JüLÊ’åVFªIòšòÓ5Mê4¨‘”Mü –®–F§ÅöØTë—ÎêNòªØÀ^>pдš·Ä&ï]¹©8üøTa!ŸúÕuÓÑ ˆHSÖ@›óR÷æ›e‡Ð1°d•AàóúçŠ%Á[ûNбHó«™Ôh^!Ÿë½˜1È­‹ñ…ùˆƒ}Û¿ÒHÑ&r©=É ?ÕñeðMÍä;”Oî:cÍP†¸]"’eÃõ"&ààþRÒ;GÕ}Ø[úþdHÆu±f L–¿¾¡*_ý3‰.ºzܤ*Uyà4©ùšÊûÉô„þÀ¨ŸÞn#Û4äìªN—6–»ÛCkP*èÉ´fB{|¿òHï_5н))TüÕ4ƒÙ&;e?'ð(X®OéÌ~Ó«”A—ž¬wtŽô³~ 0Z2@c1 ê‘øö•E«3zªyå3‚õž?0ô\»;l,;Ú<7‘»¸pl‹yC{ÅáÏvk$]»åަ²Ö„ýÑòÔÍùËw‰òðV k=6£ŽøAÇ¿q÷ö„ñ„Ö®½ó½Ð2? ûÖª tüë!EÑ®È+÷ÔoÅ1 ªõŒC×ø„ ¸²ö­:á`hÕ}|ŸK±O2ÃÀ¡F³#[Ú_]Š&Z(ª÷ƒå¤-»}•ׯ;ã÷x½éSþ¶ÔOÅ6cB­º3ñ:à|ò•õÈ¥ÊDR `Ž8 Õ¥x³s£J\>ë™-2Ýx~—>þv9ÝžÄSm׈ôý2µ½R´"Àð¢i[›¼» AÕ=OWN,Å×µBä)N}f]“r8ÕöLby€CQ€)[µÐéoàФ¹Œ¥#ßmAdy·9µë·|Hš5nÞZ= }¦5¬j}C¯âns ·ô ï˜Y” Y#ôí”ӖA%>TtpéîÑNH”¼pàL#î…—àÛ%L¯¸Ž”ãþÒ´Öà©ùoŸI \N]e'l©×E"’T€gÌaVÖµTãy¶–üO §ÿ‘õ¨>ŠÔuÄbo€åf ÎÀX¬‡hyuÌ1&ÏeR3j´‰—ƒÙ- »õé`ªcª¡ÜxÖÓÁ>©Ü>ôè¥]lÄ®RlŒA™@EÖåCó >‘Ù~]ƪ`j°ïq¶Bj2\ŽhiLXwNõòä캾‘卑1®VT¤ ÍäTX» y3o”v§Îƒ¨Îެð(sö¤2‚« ƒ :‹úúh8w*Aÿ¨þ±P£ŠŸ§ŒC¾î–„nUIíâ¼µpmÜ(^Eþtšcé¹3·Ïn癜nšçð¬P…Iß/ –=B T>ÿ=?ˆƒ°ÏÐÊi'6µbÆî]eÒ¤ñ¿pÍ$‚é( -à è-ˆ°/†‘/oZ9WÇ·¦ú¡+zDë^iψ&3©ÚÓ…Ê›ÐÉ‰ÞæŠr/0ÖvÒ µmèv‡4>Ï+dž1&\ÿUþt ]Ö ÁG¢ÓQˆµ²®0ÛÀjé-†·]èÔJ¹¤åYÝóÌDª¶ës$¦Šøp'£w$ á#•`yÊ'?&pº:ÃDauåÖçFáûe8~96A00Ø/ZŸkBC~±^3_qµ5Zi2gÁ+e3½¿q¾ÚŠ7'ãž·Úœ!FËð/²ð9\±ü5pC‡ê«Cwîu•¡¡°Aù»Ìfœ—³›çâh¥ '+Ãòk·.¸lÀr-q4ç·í›–bEò¾ø¼YøŠdÿu…NS!À¢`ìˆH ÿúç×¼äüXÓBª½˜‘±øÿYÆK’nË>!‘˜ùYî_¢,i—‚"bR†[ãÑ ²‚Ïnv$„„CÆëyÔ?9‘ÞJ¯U&Õ[u0Êœ²!Ÿ’tÙßQëD…æ4xn¼‡Š.o"s(c\¥+½6•Èt§‰gáEsÝ/t€¼Nø·;¾É ÏYÕ¯€-Ëj@â"0Ø:C}t¶=xÒIxv<4 ¤Ò3äºattbÐ/¹ñ ÓßâMeþêñŸq0&¥¶œ¦k ¿­:ªãÊv^øImƤtàoUÆE„*$–ÝWKçi“ë.~îZ0âì]‡¨]/m]|̽{¸:)4ÛøRÕ)I—ú:8¯tÍ€¯[˜ïÿfÓˆ'á22³î÷o0›ì³êÎÝ¢úØO“i„Y›E=Vi`A Oq£ª`º¬˜”±|Q Á๠&eš>Ê7z–t>AÄ3Q³HswK«µï¶†å7©8« ÿ›BãJ¼À!7­¼1WM»Ö(Çã™òd{MS—ËzÈó¢#ÑÅ•9ëÕCÒÏTo‡ú¨…ªõ¬Yy­ :M†2g¬Ï‘¼÷§wHáßÀ‰I±©ÑÜÂq†=òµ^áÄγ¼m\0B{i€†žÙ±GÝc×#3ÇJ%eׯ…‘wÎ>nÖ³fG“V/C]®7$zy×¶Ç= ,œ¦FˆS ÈýÜ+c´qZ·*–1íÅ0Eì–!e¨ôªžÁt|µõ{èÊDg¨n)VGv‰HýšýÄ¥™¶6†­» /Í6Ï£Úú"F‘l–úñ`f™£ûídƒ—”.ŽhnØ|ªï¬Å2Ø’<©ž‚=ä ûвqYÖ„ØQ™;°­Ö7oÕ‘hssç&ô†˜d€ã[÷ÀœDב¼XZ…wÏÎHÑÍ‘e '±J(WÈŸ|ä ¿°…ÝKª”Ôæ¥?ß&ƒ¿7>µr6ÉäÖʵèšaG¦S:\›rIz3€áóõе¾‰YÊžqéÞ(¼JçvGÙ‹VÖ–WbÄ\ýmßï+zç^ün%Muð„Mßk¿VF°ÈwhÛij›’ýÎrÆ£&bÌ|'³žiÐîÅ4xµ¼Ï(¨)Füyg¹}É#ûaܶ 3Öa(ÿ‡àý/ ™€ï£Hˆå¬;ZjBìöÄXƒ•ò¾Ûûj2"êÈAÉ“^Yy€ƒ‹¸ ΜÖã—½*S\YÌ%iÊf7¥N âÿË#+âV‹gFeÂb&ºR%ÌÚ:É« 5Á³J×õÝÿ¬yK$U…áÊà ù& DT5Öx¥fZNñ„žäÕJ$TÖ¶¥b™~Õtêj$º^`f;­'Ÿ=h“ÀŸ•ðÑ74é‘u»Ë\ê2]gNšÆWlj©K¶Æ®7hh¡ðýó,Ûi)ÔÊoÖe΄UÞ"s§ÐmQ¹É((äî@Z$²¶Žš„J×5LO¾ßrµõ³'§F5Í9§Ùh ßfÓ¢¾†” Ðè©l³äI>:¤€ÃÙÜ…Íe5ÇBÌ Þ Ñê¼>˜Tª=¡íDdÐô%/Ñþ±:=]ör…äNHHÛõFÁéô}Ë<(:îIÅ)·ñ³×I[ô×PÍd% û°€¹qûls_G¤´;ÕÒß×?E÷¥ŒÔ Eµì˜˜éE1Ý ŠÃ*Kí4=”p[l?„3O ŒaE¦:$ölOÀìíÂâÚWDqeoyS©Î 5j¦±TGÝJЍ\+W5Ð^TŽ{ÊÉHœdbK§„'ö:d½}*^pÜü*ç•9‘ t VYØG#â¡ ‰Ví;Þ$#YåÙº‰>ºÃŒÎXúÿžRõ÷c Ì9iæõ™Eíä÷4¿eó"+ê]UBÝÕ£'-úg± {€´•…=–ܻF£>xïV@áyóSX&q¼uÊÊÜ6ö nØ6ê…Ïϸ*&w.!]JeŽàÔ¦¸ûxŸ‹NᓇÔ=ÛÐÄü\4©´ðLïÖöòÉe]¾§% Ÿâª$LgóVA¤fŽòuüƒ,’µädzYÌ¡NSSÀa)Å¥Òü Í’ .lè\òÞ?¥ñÔs!!̓&ÅF.%K‹,\pêø€“Õßê*Øæ–¶®ˆ:{UjŠßwWíÚ…[e`}~À¢4bñ°5[º;rÀÚ¿¨Õëñ#¯£®±bp¤ÅkôIJK9QÍ•Øú¬ïd,Ëv.w<Ô3ˆßI°NðÖWäoò,ù"¬u"=þÐS¢–€„y¡”ضËɲ’úŠ” ó gÂÙýyg]°Ñx’¡]þ„fùMO"ÆÒ%븚Ò󿂉pBscÆÝl»Òœ—Ó"‹¢ï¿Þ]˜=Qy‘z9(í!°0Òë(ˆu½Í CñÏóð¹Ñ=ܾàXɢ˜£ŠÈ’Õ¥Þ»´5æ#yó·ã7GÞ OW'Ú¼‰{­Eñ¦€AµYF5~©ˆ ~QùW侓ㅜn8Œ%&qó<‡±e…FHSNßZ}}Ú°ŽíŠ”:Ô®r9ÌïËI&#O‡ÐšžOù*Ë{b\BÕãñ’/Œ¿=‘¯ý-[N£»–_€ØRp}V _ꎤÄÖ4|ázŠ£€PúI¬ÉW©Þߘïá B ÊÉ4ƒìlØÀŸ‡. ™Ç¤M Œ³’áqRª œ‡‡_¾÷9¤^«‡Ægé`öŠ™–©:ë—/ŸËH/“í×EQ9 !Å’­Ö±›¼€DO” ¥ãH#†UÁÂWU4VQ£9Q/ì„çaEwqïú|sƒ‘3e[Õu G ŽZœ9YóxíÛ£ ƒ˜LžWW&älóÆVÒËÂåz‰IKéCþÊ}daÖ«åÿèÀ .)Hè8Ó¬ŸÈ¥¥n©ËXrÞý²é$ÛD€ûº;Cý¡ü“üøqÙWÇÚ“:œú`ÐL­bâë+•{Õ@Ë{j®8>‰dÅw Òã‡ÿ†ï™øÍ@ÖU8õ»ŸZ «Á’ò¹ n /l\ 5›˜ÇÊÚeV»¸eôó=Êìw4{³›Þü ìß´8šQ]ÈÞa= ^ñ´À‚šq<´ãýTt³Ð1{yò1w»..î¿$?µáÃÓ†bšˆ‡JÂÏ2“zHgÁ¹æ0˜Ú3OÖ›A~Ùþ©tÎD;ü1VYrݱò%[!vyw0Ï¥ZcÿôR¹ÕteQ&ɯ ’ŸÝñs†w£Ûý»0gü.$y°²ÂÿÊÊ™§QÁ ÷ÆKÔÉ»iâ\âÆwë’Æ?[×ÄFpv3Èðúª¦ÉZ_Àr’kkÐeùh‚Ç´y‡Zi¸N@ªÁöaÉèÖ´xCÑ%Q%ƒ½‘«–&ÈM¨ÿ¾Öðƒ® L$Bk;“ÑNJGÇð2ž×w`z•ö|eSý›œnß·±'iQÈë«Õ\zß] âD»>‘}`¤_im€œ8Iž_¼ÉKæÈÙû-Ôo|°~ä„ÀçM`cšqч¹Ó‚$žY¥ä"MT:ÙÔÀÄîA¹‹Áû= ªbKÞl´ºu—eär1wSðxW±®(óåñhF´)ðÿ9úNZ‚HÓ®TM²?0º3êTÜg)m,ÊK 'ý{ÄвMhëu/ÈÊ+! oY‡Zê´µ¸ð´Ÿ [Dja2Í9åþ_ ·Æ~L‘îÒô¡y}ñÑn¸tu(1nÖ½?퀻¸ÅÑ~af…ÉÔ N¿;47ܺ¯lIôî@gºër UŸm~"‘aÖ8œ ÎYÁÎn¬ÉY‹—g¼Íb£ìoA43RýÇ*öŒóYIÌ[ÓïCWªFŠÁ‹ýÍ+¸Š `7q5{7jIW¬!õñšŽ†Ò)²„ú8·rVºÝ R£ÊÐ Ö'¯'TËEê…»ø.­ÁúêjPÉw¶Œmwìg¨è03Cr0Ktã§NnV¬9 c‹âÉÜÑÕ›B˜²Ð‚m…¬tgExN.Ép†(_ÉõãzÌü®V¸Ÿå½-ÝEUìȲù¿Às³ k˜"—D'[­Ü¤ù4ô˜îò¹òبÌ)3#(ÛöÑnGŸMQT½ ?-KM1t•ÎJŒh¯¤œ{Xá>¾¦PÛ|V‚ssú}íÂI¦4ƒÃp?ËWTVV)óœŒ=v*æä5‘Ã(D·x#ÔjÀnúˆ&h; AÅš!@iÌ|ˆƒÄ4WÚ?ñåDÛÆšj5æ9Õþ‡ËÇcd˜0 ”®ÞÀuøþ!’ˆ w OüzËr8ôýôô2ì…¶ÅZJ;½C-Hid™‘(Y«&6[LÜ((K{–ƒr¤(‹ 댿‘kTâ²6GŸlâÏ h¤pv8ºOã#ì+LIQ|[€Ñ‚:GA~Î Ó‘ïÏ:pòÏ‘ÀL#­NdÇC W;å3ÀtžR„ÕËJ[t*­qï \2³ÈI ïD5'¹÷°Nzsúp½€ ·ÍüMíÎkø<|†êª ÿ©P !첕~Q´S‡V¢½eÚØy ÚI! 9"ï§yc*™Š¨78@0(ö{¯)[Uܨ%û®Ë €k›¼\¢¥ãÜ@pƽy¡µÔ¯Ï–—:[œshÂKúŸ¢Sôp¾­À<’ÒðRÆÏÓ<6X1’|×ׂ& !%±ÚLZNlšg|²wÍNáö”%1f›xŸï~;õe ÄCoÓµˆ8±Ú3a—ÈýC>ß".Ö},ÌdÙáª?yøZ9ú:ë3ù#žÿ-.ÕúÇ(Æþá ¡ÿƲKy <95§å±!ß}¼ÚŒ»ñÅ[oÖêBGð%tèNÁÖµ„ãA¥­m)d.B`EôÊ¡]l÷iYâa𞃗ŠÉóúv™Fµ Xœö[ñM?&AÜ«¿°ùκ'&%{ôv‘_ï_U»'õÛn+>TH| Þ¸Ü·i©…kAèÿ¹ØªˆOÕ‘£Dt¸87öqÔÛA¹ûf§EéeÙ_¦ü<¡+VWhí4Ex”òZ[j¤‹Œh9ÿÓïiS$¤Äb¿Áâ_T›ÔŽ”ÂCøßõ{ÄfD<ÕáѨç¹I0Ÿ«=8µë"9ms _ˆ»ö9¸â/ÜnÇ¿¾&OÅ gÆb B,äTég ÈZHØþ(!·hÎJÃk¨à— Õò¶’|Ô!Óÿµ×ßÔdwô½JÊ|.Œ: –‡÷?ÎášrÈ·‹~ÚŸ[0Ó BýRÄÉê)1o‰&•çÑRï³fòühVQ(Á«1ÅÓ$yãÕóåÓ LÚ'´}ÖÕáˆ=C×ö&'TQùä¸ÕjpmÓ.ïç¦TœKÑ_nózSõïc*ý§`Ó#]äúëaµV#îÿ¦—A,èZ…~GN8TÞ1ªÉ¢hð—}[Hfm‰³ÈLoRòâÞ&DìÄÖ,ªŽ¶®°å%H¡uÇî‹b§½($ÞÊ>z žc“®#¼a¹ ?oEµ£«ª³ì_/IÀš¹òë‚Ûš;€Ëõÿ>ní½¤TqùªtÄàÇûQW¿QÊZ´bqÃØUd‰˜».<}v‡ˆŸ×™†Sµ(ÑÏÆÝ±h¥FjàH ævõ[7t jÑuáÛÒ¢ˆ•$¼îÿ滩ƒƒæ‰‹  m“oC:dÄÀó .õ|úê“­ï𣓈@©…õ¼È‘ÜEemšGƒ°fz’}N –Vô6U*ƒY­ÉOœ³ß%Î*Qv>8o‘x‹ƒhÝ÷@ _áà¡fˆ%V&"á^ ÍÛr¶ô©þþÁ­äqúy³ÉÂ¬î²ÆlC\ïJÇŒ`Úù°JK϶Èå\ó‰í¼ë±4Žÿ<4ˆÛÕ¸Éeâdñš”Áùv4U !˜O=áF_¬ ^V¦É‘…ËæKa÷6à~âbzŒÅšL®«Z© ð1Ïu÷­‹Í¨/ä”–,ƪÖÝ `ÆÁª‘O—¬‰)ß!8 ‹Ý\P&°æp¸}IF'É: nÁò`Í®/iŒÐæŠïn¤ùâX^‚m^KP¾R þl /²• ÊÅ” ý’T´˜^|}n´ÝuÀðfù$ˆ ü‰—äáÊ|pÝ»êòæñ}Gõš*<îö_ w‰¼CLƒ„÷Ä”¼°è>»+ÓÇ~ÇœéñS;œY}DÇ€oÐ ¼Pbdú`V8«y™„õtù·gÂÅ9~X®–‚!zîJãç {Ò¸k7RÊάqÛ%}XÀYq7#œPc,u‹p]ìÀ{Qˆë• åSbnz*Á9öC3” Òóùå“á¹e*ÍDk1ßaîW$ÀßL(4â,̇‚ñ¶+²†iQܳèŽñ[¥þ"i’¯A¦m¯Dë]ÏC2–PÐ<³R´1_*>WðÙáê!\*7Æ)£´2&>ÜíZCiàNÂ7¨%å”6¨°8øü¶Æ@–r±ÑKÝÃ)»ZðoÎÛ6ÛàB˜ñ~õbðOs5%F©¥3‰ÑA¹—7Ñ^=—a ãPåWÊÊö+Ÿ.c#)NUQKù”€y™÷'EZ²½xû,Äl™¹~ÂÜáqÅ2ÿn#}«+òLÃ)wùn!K8–OæTWUÚ`GÙièÉp*7‹xHÛîî9x­bB!” ‰÷dkr7U쪺¸ç( jŸß3mz¼ÑípéNL°Ài‰¹Du”ÖŒ#QýщLuyž¢æ¼nAÓuc’¡óÇô³¹Ò$‚TdÁp *BN¶v¦> ­2( u-gõ+¢Ù|.HËmÒ˜Øn+2øžOJÓáÇ>жzj&ÌÚ„Çk4Õ‹“F,1—cuª³G¿ðAª„by¹&Ž5ûFÅP>}aFäÍ`Ù‰´8ò>%ìÜ<¼ž7Zùì-‹WX«f»]À*e쩃ûÔä'ñ©þo`¨žgàˆË¬±\ZY*ô3¤º¦äëgΘavw¹»šÇ÷šÖAûÍ_òˆq/>ÉÀ¢”_½0”Àicá~¯ø¶`7Îöò™„gžc[¼]:÷(Kke˜ªõ_2on*>ëɶ“ÞsG:¸Ó¿[[Tƒ©‘šø„W2òLM¤ž.Àô§e8 ,y¼-Ç5çÛ^z+MæÍΔ¯¶¦ þq­(E¿ùÞ¦0ž`ÄýmðG,§ÎîÛï©΂¡ó$Gû:¯òÚV­<èÏÁÉ7)– R8!tg›šcþÐÀƒ‹8ë\IÀ~E#ÞŽâuh!i•à«€²9nÕ;9eWÒa×6* Lëb(ÅÏÈ—gçP&Ãj¼›ažs3I\9}ÍBˆà´…›XÚ!¬¦5•›z”2Å„¼EQŒ*µV!D¸ p˜Z^>Ùj§úù"øÎçF躆êÓßDÌ*&˜G*’Vª¥R$¬¹ ]DB ¬+Ž…W8×)T°¼ÿ-J ³XQžÙ â(ó;èï°þ IáÜ›”é>–ÃJýá¨4OÀ38XȰÒIòûwãFgbÿVˆª7¡Ým+¤<}2º’R‚€ ïn!y·Dí/O¸¿Rð;´!×­%èUö ”:{ß›·tS”Hµ©I ¶|„i}°?ÀN•£Xê“æV'&ð†7zXž>âR[ÿ ]#,ƉM$ÍG¢ï$® àFúF×îÕê$/ô|Ȩ• gæÁÈ»œ5bwÞŒj„±vm)\ Íö\L|æÕ *º›dÚÊc!²q¯Më~mD¸¥ ¼àbԒ΀lVùÑôëZ·IÏDoµê‡ƒØŽº>®'X>@F¥â\Ñ_Ÿ`zÜý¶ˆ›±ÇO¤ Äÿ“ð€ d±|_X]®wƒO$vWl~žˆ¥ÁTÉ’–±åÛ¥ËÉÅ!–Ö ëø M Ö{“£Ý·6cÌH¹0:¶4ýŸ/k»ÚýXæÔs=4;Ghž…s*)^(ãˆ|ýøŸUn®§öÿUßÊ\<ràR1Šá:q)\ú÷Þ€Ÿ×3 ÈZÖ‰fûñ³`e€mPšÏ-[ªòD|ñø+qïü¼êsª7L¸¼«²Å²K ‰¶»ëd,©éœ[v³Ò_e©¤ºH6Ë^QïTã³§ O˜ÀÀ S€Éd€[¿ZÑøÇ²oÓ‡í%«±‰/ßÜrLMX iŒi&aÊí[â™tX^aü<²ì™s¢¿¿géÇÏ® æsݺ,ú‘}à6Ì2Ýx9§«ƒJ‚<Ú{.Lm—S –¡<°+=Íÿ6 ôh*8}ã îýÐ'cÜ ¤¨£ø÷6³º3ud jøš÷úp ¤ÜQ~¼C”9 fU3 ÚöF¾ÂÅ ´ŽÐD¬(—ç 3‹…¶‹n…Šó6ªõKûgÝk"0å­¨ž6Øp"Šr|ÆÌÈa¶ß<9®%µXö æ7U’ÙpûGËœ@_ 7}*zVÊDJÜr´—(íY5çxY£aMÆlí„U¶ÿ“óõqæ$CHJ^U&°¸&˜õ$zÍKìBS¢Ÿ$Eg²ÝÙ›®×â"/|PGÃ"Ä\Iq©ín Úá¥[R¾è÷/‘˜ wª5ni°bô[sN¬pãªÏãEƒ—™M Òg ”™º÷\}p~sF«¯Åˆ/®ÑUíüA×'1á@ö|eK‡?Gõ¸ÜT¦Ë<àYߎ°Uã:>M³ö³é6o./žµË™>MËnذÚÎÑeÌëÊUÌóZæ@P(gò95Á/”Ô@ΆÚI¡$oxl©í ^XPìScKÐî "ÑjÓ(õÕûÍêñÔúëymŠO³zJx×áÆ™mÑHûâû]šBC;G!oÖ‚d.“³­zäŸo³†lûÚn椭H"~úuGEŒº™“D3§=6« ˆÂ^è1[ñJÛPÿLÈ[ãp ç³#·»ÎEM#ŒºTd ¦´?™ýn‰¾#vj¹Ò¦üq)@Ã[¿©ÃÞш¶n<ðçÞe íâà¡ûücÿVxæ3Ï/Ln ·ì/ççijçj¤&õ°mC'«Ë,ð…*¹HµHUw ²ÍÓm!™Þ¥KûÐ@Ws®I÷pxL†´êh ïß׉b`*P^þ §ï¹>4T¢_1B&SPa?Ÿa‡ÿÙRż¾V¬÷†Æv‰qýµëžë0]t>hÕ€Èð^?K^¸3 X²^à?½À’†c–)>MÕDóäH\Ô?Åôž–k?¹ÒÕ}d’ËÇÖGÀ)‡„*«†Åì‘NW{,9‚@[›?q4Úç·9àÆt"KÈ8xgYÝöÚPp¶¯EûK¢·¨&ËEh;Ùí•ó2á9ñEå$Ť™x˜T &…£³Bôå[ZÍ“éa¡Ü_¦Eñ"§%=‹A"XÆ5tö‡.EÆ• zæ4깂CV6S‘¾-gá)=ØÑÒ”YXÆ ò‰"™2m«M¡kè¨Â™nöË—Ùá$ë³Xf}z’±×¾û­OùØC̯¤¡šJ;¹ûL“=ø±P£ó…ÿÅ€ÿ¡×êì#cÍNp¹"ë˜+×-î化^¸Šˆ4hsÝçM¦^Aßê…e2aUjÜ—ã§…±Xò„`·6®Š”!²_¸wnÁ-¥½¼V;4陚¸w•“+õ®p ywG)ɰöó©øõê¿õjآÞã¹åÞcÿ£NšF“”MÁOZŒh4Ëèg¦¯Ä»2µÀ“Iˆðr3¹Šu,tÖļõYó‡¼x7bÈÁÿ$s§ed¸7Ùíy¼›.»N²uMçöµK¯s°ûÐc™XÖ– +÷P$¶Ç%G¡äÖÕÌ¡ˆZ5lËP•÷ |Ì 3`‡L"ëœÙF‰Án->©]²Ùâ}oU×ßu¬Ìb+Öo>*ÃB‘Ï[#”í>ßLsBèCd8-'ô=‚ôìúƒˆþ7ЪPô´-oøÄéV¥”ßùW_ íÝ¡<ãÚq‚nš)§œì‡|Â0è2Þ­&"ÞI4™œ+'rdà(“˜«2§žçòY’‰º;£ÌŒ²O÷'#ñ_/ ’^é‹E?’ÙѦR‚EYVs¶_Q✽ÉŽbBü^wbãu*_œ<Œ?À-ëDfYgZÑ[¥ª7C†OÖØc”…v¨Ø9Ø’N³ó´“Ê”ýN*œON¦ô5 $‰‹ó¹KÀ¸mKÀ1ï¥ÄÒ¦ë}ïrKœbmç¢_²“`ýë=ór_jvéø\ÍÕ•Ía_hšˆÕlQ@'éZ o,åC`•d»úëïž§pJÉ5ä3µ6Ïøx¯ãõ$Þ,ëMvæ?Ø®ŽóÇŒ‹/;:NÇ68wíeõ"]h@8»1#:¹Ò?à¼ó:”òhœ¾ò{"„åÈ?×Üwª.àðmašâæt·ýz3Ø'¿œ…ã‰ÛïÊ7²C⺞º%ÅœƒÁàJ->óªŽÆREœË9 ö—5Å¢“ª!ÁÿKÑ+vlh£3R¸û¢Ó¸+¿W­2Ò‡ ¤W‚®Cì2@ f_ddï§äýTE<=¬š{,çOÌ£Np%Ò )prDæÇ»‘¨Á‰êÞà ‡¬ºpFàH¥’dÝðj§Ï‰þ^I@¨³–Áð‡RV~bކ#º±rm 4ažÚèG….²Lbfd‡&‡Šð¬!>7¯@ ëvÔÐBõ<âî;,š‰=yùŸcë£û¶f×ࣇ|úl”Ñ͹lâoEЧÿËò*¬”­ÊÆ ‰Êu ÙT”³7âEŽ8Ú+ÈšAPÚ°²òœÌãY!Èïþ~¡}¼’üŠ´;1b+°ÇCÇÃ)ó8}-·„سÂh(²Ñ€Lâ‡ê‘‹ jí@E¥i£—äŠÀ3¸ŸÒÆ=¯h<>}š5ñflÌ]{(´&{Æj½â:<äÖÆa~¿äêÔü_%3ÈKXx¡Î—L0𛀳;`ê‹:ç“§=þ½ÍÓ7'Ò¨žUÜ{ǸŠ,à=en±Bhÿ ÃÌ“NÅìü ðÐÔ4>BÀìÃ¥ûÐØXx¹ºˆýÉ„9 VdðuÖ=¸Ñr«çíu„ÉîËè©®°jHùÅD{v§Ÿ‡ãÒ¯eͳm)ªrÙØ ;ýÊ”«F‰ðä/ ;uûåÏu…: ÜhøZ6™;ã¹£É;»Ƨ‚ Whµ½]:f„)Õ%&{[ª=¿ÞÏQeûÇvCS?K‚Sæ®É5™]OÖ†ËLu#WG;’0ÙyºÇçkq¿¼Å²Kz5ëÑ_/À)A¹ñŒ$FÙwí5( ‘Ðjï5üCb¬­âÖ¢ÔOdeуpË?w[:`]ä¢ÔçKªÑqÓ62=¯Ôü*j£ÝŸÉô ÍwXº·l¥ò6ËW›©Ò=eƒyä@ÅHû¹k[žDIëöibˆ#p©`ð}¢DÑ 6æeÐ?/'¼¨Ö6kÙ«ŠAÖþ,ý@QEüVµ5ÅSaÅ žñMWv¶H÷F_<ã—{/?4Þ²‹Ž%>Ùiý¬e(£-wˆ{JvÏöjn "¾sXc(ðÌ9™œ4hЯ¯ÿŽŠwüöiT³ÍDU×ê‰{%)@îâÊMÐGN¬'2>êøì¼ÿÉ ©Ä+ÿLª­?ûÙŒøïIi¦ÒJ8beë&Öü>ž/Q–ëHõ˜iÌ„ˆZÝqóÍJœü8ØwqÐ6.3Š ËV¢J'22XÜ<˜hD\þ³ÛÂ^tr¨w?sÖ¾|þ®çÅL³Dµ ƒÒ£á¶7ꃗY'³lé‡ÞPŠ7³®¨D€"íü.׋³ I+k0³4ßaSíuë{ÇìÌ ˆ'Fúhe‡¬ÏªTÎñ»Å›Xâ?lLëJ£ sÈEzi_ *Ëïä‘CLœ|(v‘ž- £Uduú Ù$ç:VsYÏŸ–̓ÎVÃøÙ²E9ý·ßÊôàðÁO$™|ŒŒHïõ9D”PÕ%­HÆbîGV7í$R¼dR÷]ú$/(*xi_H®ûO/ œøìšÙ ¨Nªnf;à ÐË ãXd®öß…ÂxÒ)ÏÑ~.ÀAåP¯gq_ñ!˜m?ئJ‚@dò¯¿1øt¸×*jâ¶4¢ð§=ƒ²º`4ÇGäE¢yM¯F\”¿€ÞîÙ·­0b ò´G±ÿWÊV¥Æyš7Yòî:•u‹ ÞŽÏ ‹JíüªÅ·8¦&ÏÊÅ\åðL.hÝ9à'y‘[u^…-l‹6`Ï<°Jí}w¹ ¾½Ñáw›¾–‚h4ŸîtÜ*ßj‘îðdkÅÄanˆMÜ+3#ö§Y‚ãpAè?A¯n¨ÚrœÌ @a釳8™ì3ö÷÷Š·MGþ´ñ£õ𓆠I#Ò5µÑ*h.ÝQx¢.+­ß‚ßêYØŒõS¸X«gllò‚n|³c ßr\ÌžE.eW…xZ© [þªÓ…{]¶h;Å««a½E7ñŸ4¬×ÿŒe?÷‡Ø¾ž˜ßhâ]{ÛÑ·/üÿjj×£ÛQFPO1»iÿÞ&€McX]=6¢’º›Dk„ë5Ã^ˆëTr¾ÂR¬&Tãþ.§U&ŸÑ‡V“4›«“u·N[6dk SPbvHÁ·äG¨t íÅFC 7X}ŸÇ+[æý¼9œyáD·$;tSÿ¹¤j ª2Õ‰P„ƒ»îd§ð/®X‘‰Ü!¹¸Í’¾Csœ°¿ˆ:^Åh{Ó^ L)†¤+ úÁ޾R‰Mqí. ‹†ºóõ_”¦U…ÈUv:øD6SùÄB8Y+ iîMÜ}™væŒÉ¤/:G®eüè¸ôbíö-qÈÇlÈÛžî8;˜Ýæµ\hÄšyê „¨ü·º‰œ›»cQCWe;to¤à­Ý[;ã‰s&ô?×€ð鯖hÔ¡äO6Ú»lƒ›ul U^2¼Ó-!‚Ïa).ß™“>Õø$­J_'`ü¿6ªÚóqròf¸oÚ õÊnCú’½03Ú ‘†£Ä%u¬Ñ/ƒœ )W"Ó7C¨m”òÜen#âq q’Í'O„Ãð&2/eçŠ*u”œððæÛZ íÊpÃÇí$E€¹ Ë»„e踙;õI në µ‹Ôwë½¾€cMEé*ìKb+F³Ö…%иÅ$D”ݺNÿÀï§Ü¿òý)7XÁªOã³éî^× 1GQíË]p&uØõ`†J?¨Ÿ!ë:Äq™‹m‘º Ó÷ݪ£[å‚!æ“_œ–³=×uL£àmhþHñŽÇ©ó¼ºÅ‚ۡL{MÌÝ£ƒ–Eõooñou[®÷<ßR þR.Õ>ꌽ=KÄ-/¸f”7+м{‹ˆÓ0ÇÆ{7 RÈi@Ý59s¬aÞzðOÎw>NPµ£,P˜—禮HWȺãO_틞|ÐLô()!¹!Ù-بúMÿ· R+ Ü~“>jn°õ¸ Š e(:b ýȳŸ€çÜ’ò_!‡ra;G@«åÑ®Åí¿´ƒ3ñé<6ÁôeKZÌ"†°LÊP/÷N» ™1Aôsݺ9øý„}ß*ýª¯ÓùùûóLŠ„/¾ÁõØ]Ÿåà7J;k jÆÈÍÆ»U^(Gžî+æþ¥…ö1„ô0LѾ1¾[Øê‰š´-; tw'(Ú¦þBÃÆIzͯòúŽ”qµ{åY lÝUŒ³¿j’©ífâൢÅ3d!ÇÁb¥…JoRÙn@…žýkŸÜ_7„†71ÏfˆÀa5—}ºÜ¡]¹ §€ d®,Ñb÷I¿è]Íã}q+@†t9Ä8}8Ái CYÖgï Hf=q•óqèÙ§“ƒwwRz/a›~µ/®…–_by(a(J–êñÒ(Ñü;‡?×jm—˜ÄÃày“Óª_}}â€]†-}‚|í0º “#¼˜ÊÚik–ãW âÙ…53UCkBrMG“|ªß}z…*w˜npÏÙl"V{âLëЮX°±y—~KÑe2µR-l%WIMÓmϺ5’»?ÓúÏ/|?-W¶AÓ£¤ K`x/jGɤ=‰Ð­âä~S-ÿ$®’´ñY@Ó˜6j ñ.þR³Ol4¦"¡ƒMæì§Œ¯\Ôyh0ÎØ2ÈP½DÚÛ×îf½¼Mñ\9(‘![Úrï“·+¶Ô>¤Í¥(}ìÄSÝO)šœÅŒo·¨)OX=ñgÞ'ùˆ•š·ðdZPC—Oøx ~L$üêw>ö‘ÉB †Øã1÷MD½PÇæ,ÈM~¸DB£GêE9?Ltˆ{â‹èÂËÚµ,Àm?L×%ŒZCèœX“ØÂ× Ö¥èÐ=#‡Ü)IŒÜÑRöxÒ, štNø`±r3ýÇ´S2K4Ї ®hA ×U´CäƒÜ"Ž%GéòÓ›'øÿÏï4Ùgr]»q•l[=”Ä^ïÕ¼´”þ;Hi…œ¼ª%†½ß³ÅaòüðR'ü7àá¶uî>æe%*Û¶E!!ïïû^•0BÖ­LjsâWVy³®eÿ³•0üì$m£ð³Vˆí°c?¾5=ò•Žx¤BÞZ»ß•1(s2S¿®qÏËçѱ:‘oÛµZ *4¤åPÛØÆ ¾| Iôœ“D WæOQ\ÜA,B–!Ù€Ò¿Dë…Ê#e ¸äÚbd.½3f¦ÊŒÊ©9UÚC­S…ÅVµk˜ÒÓúÿæÒ/µè-VVŸÕ‰Æ.¢ÈT.z_6}.·“ÁŸØýo>¡ÖˆSÔ°U†m–iÔ1º§èŒêÆGº» ]}fW§ä›¥ àzb³Â¹ÉÏù:º»Q ?ŸòÌ)' _to¥¤p X]¯-î³0ðI¶kXïè”p, ¡ÂáP¥ÛÀpAÃ+FžËdI¿QRKÏ$ÐEJ=ár»’yð©ùà ²DO2š^AµDj6ƒ ²aŒUŒÕ|;5 õÆ c÷¶Ý·ª9é³Sô¡U¦½YÔUu Y(D:‹‰ÝÍI}Á .¨Ç/ÿËÚ©FTß7ŒFu,o jRÙÖ½Bù55Ô‚¥Óš:Ú“ËîNÔl7¤Vl`ór€B§?¡¿Ïò#›€Ž°Â|SžÉ³Â§ˆ¸ŠÚübÝŽvAýìÏߨ‡÷ÈÀ k^S,fW΋qÑbÌ——á˜v{8“ˆíØ•2{ãºróåšdSØ;‚ÐxÚp6žUák~Lðå¨:øh†‰5 ˜‘…´~G@Í{X"Â0ÂLçÖš 2‡â0Ãc™¹EJ$b¸{§£šS{Å1»üÃ4¬ož8°¡(/ú JŒfÈ¿†bûݱãꪆœêÿ3PðöܲÂeü³y%‰ùPOè;ªQ&A¤l˜!ó[ù0­íʨeeB(—¿±»k¼ûß–![ù|j1‹„Üž “„h·Uõ(:yŸ<ÝYøì‘ÁÙ|Æ-$ÐSÒ¾0Z€Ú÷ Vù}h&ÂYbÄÌ‘Mq–˜‘»‹À‘ŠSeä}ÛÒN©ÅwˆŠ¢ë]›_hÛ!›…™SFQ†Mÿù3ü ¿—Z-ºÍ)ÙÌYR|‹ú…XíöÔôièÌþ8ÏïKY¥÷í'#:#j£70Ô¶_Ê’?Âú%%{ñ';§+œÿÝjb¬ÐSÕô·cWšBH4vߨЅhM^˼}ð›C¾ê5O¼Ø¼ÏuHÚŸèuÅLV¦²ã¤ºãk†ð›QMèW=mÇlǼð Ú”¬´ôSéÚhcîùv]lkáâ.HÊý¨/nœ]-AâP 1¡—_ï[èãbb€´çÙU»W>å 7meòlŠõ62ŠôÁ"öùãDÊOÈ­ð *Ü£¢\ùË4â§Òt|‘vXØk4–¢9Úƒ¶¨Ïk³õ?5˜Hœéh¹Y½'Œ€oe5 Æ M[g¬ÁƒO'q$¢ q„@Fyçã;ÞÙ¯ ^¡Xb? ‚ÏŒ RV8”MÆ9zÊݸíº/ãMŸR Uˆ•J»@o /"‡M$G/ ctoB­¨±ÙÒ§±Úeû‰¨§‹r³ïîföµT–¦yù'¼øèܼ·Z/ŠÄI®&¹¶Ï3º£äëÊrjúø$ãhšZCÆB­ƒ=؆oºQÿdØâœ‡.5ƃ~ ‰»1ûúžKä_ V²/ÃüÊ ŒÌ ÆõªÓÉåì6‹ÍJªÿAi@”PJ fœë)ËÅt·Û0Îll‹ÝCá773ÁÚ†½¶eÆN¯¾)úPFÛRjlp^EDÍ~ø,™7]#¬-H°Sõ§¿z¨uG"'&“#ù¯h„´ÿ êp¼I{. Cß̶ìÇü% \$xcñNuý‘ïÂoɹzº*“Ü1F¾ŽnÊ&ó­ï´˜Ü4}øp¼ôyØà¹ƒsa@ÐsŸ‰l‘á?Iggz4JÓ’Rf»8C›‰`¢Ì@`KgVep’õ?+ž¾éSIg¯É_O¯oç¿ëØÏíÛbheFM 9úÌÅ`õÎCË2E›ô—§ãúFìüô°°c­8ϸZð!zĽý%ßíTÙ4¸É¡×ñ|Û¥þiÄ"-ß+HãUT¬ŽH®¸þ1 ˆ`‘r,ØP`Et9Ù~Óô7@@KüÓû÷Ẽ©ÜÝñ€QÏ]”ê {úPÌûJlªçÚ¥×fŸ£ææ¹aBJãcC(Èš¦&l Q~Æñ×÷Í–8rmfímÀ¥Þ!™þ÷oX ÑÃS 3p„œCµ¨½ˆD¾¥<ùTŽÆR œ$>œ“ÆÖŽßõÅÌO*¯µ…K®È I0;¯PN5¨@_º{.ðKw$šÉPøSýý̽–ãx+Z×0–®ÏÉën—Cô¶9$ÄíºäIÙè Ê2‹hŽ„•©ßZilÈúÛ±¸3”ïŒZÏ÷º»¢`ë0†à¢^FMkª…9:ÏÏÌW¸Ç¢…þ³<ÄF†x‘ÔpKP}šÀËÅ(™Qùâ¤úÑäF§ ŠAÍ•Æ=æçÎhäY<ú‘:Ïzoöû|ûØ:{F½5ma»‡6Û²{ 'ÙE³Ú sä4c9œ» ¼´A›b;ŸøäØXœ_‹°[£~Þ ÊÏÕóÞùñ«¿ƒ—’΂‚E¤ƒ™ruq5`Ø$a ¸mÓŸ‚»M˜3.©¬µ ¸ÂZRMõoÔkÖ"Ʋ´ÚÜ]vgGÏl„^®ò2ˆcŠˆÑ“š»"kÐW—òë ŸGE‚ÛÓ‰ð¼6\YÀB[ŸÃÑáH°Qƒö¡Ò`|£3­h|4eÝB@Gú@"_eVÂü, ?kt =N8Çqlå>…’mUðI=²„.5®†É¯K¯^ñh‰o²1VpæˆBS<°r½Û“1ŽyÔúº(µ6µng iúP&kÖ¸ÝÄv!aD3Žõޏ¹TIX>ñÄÞÈN‘¶TEà"Âe7W ^2ûOÆX*˜ñCÿ|Iì˺(jÑ=0-ä+3ø®´Évƒ5p6ð^/>C¢Ó”1|ð7º»ÆYÜëA Ÿæ×oz„Qbˆøâí].LzÎÂàÁúDtÅÉdYB½ƒ³ÐðoáW‘N–s]_™AtÇðÃËeN ؇Ìò‹¿`ŠG¬‡È6ƒtîdâÆK˜®›}Äl\u»· Ø")«@å«cÇšÁilŠÅ»ð¾´zo°mè‰ÿÝkJUã¢@Ú‰®•ºèJQmÔ¡ }±&ó6)ÿ©\DÕ”l‰ßTìÉÖoð6H›ÒK•7‹šOÞēڴ-q3®ÕK‚XñÁí4dEÿ¥ž_¥÷¬lpá¤è|€Ø<É,MOXˆZ›q†¯vU¸dåY,”Í^áa~N¯Ðy`F¹CsÒýì¶,¤C`~Ábp]€k¢™Q3Ö«=>oúôÂÏÜìb$% Õh÷Gžh¹–䤋k¥DxŽD¬“–ñ(Ä’ 'VýCϱ¥4‘Èù[Uv³¯ |@3dJTw¯¼§–T%³¡ä¼} |ªA±ÚEdq;÷‡Ô1¹, à8‚&<Ç®;E±tèÕ7cëŤÜówrUö»C·ŽjG:/É #º[@”GFtÜ{wšM ¾Û)Ö›§þCÝùÂøÊRŠ`Hdf\Üàƒ1å->䃥fôjçÙ¾xhµ÷–sÖñ£Lxº$xí§žphØúQLó¤§E“ô¼Ûak@û^ñAÁ‡ÇÕ…æÒ¶½›‚&â‘9äêåÚµŏ¹¾BxW²%Y~ 9uÁ¢¾»æ&8HIa+v€—Of›ÐŽ‘ã·‹âÍÓ \œú=^ƒ_ÚngK<á¦ul•t”’3€šê!ŽOw·sªÀx¼©£åOûAš« {o¯E'm%î6ù,}Ù#©ƒý ˜’«©>‡ß`E| 2ª÷Ìw`·<]°¯Ò +~sKêo›jÕ“À:ûì•U?¤ØšÞN­´ƒÒ§ñö½Ô–®¯ÓéeÄ"ªi¤}Ë|äùöŠà‚¢`ƒˆ>hS-'8jú¸—¡@Ëùdàh’oŽÇ3l*"¢_š¾Ú½·Í‚Õ¡’CÍÛåô¸5ÓÎѱ]6çƒCýÌ;q¢­8謥JdoyÃÏÏâ²äãÞï£|Ôe‰IùÌëjˆþÕŠö"»¨ü££ð?%’~…ÆÂz‰£ä^$˜XÔÆòçø³‚/é‘!Ë[~Wë0À“†Ëý%eðYŸE~eÜ‚åéuU<~HÁþõã#s¬kTw]ð»Ùr^2³rcŠýwØÊ#U!8&÷wœ^¶;½G›¾ß4œÔeߟ„›HòÊxÝš®Ygu¿sùÌõ´gÍ„#ˆÚXl™løØM0ùDkW!¨³º’Ê9ò\ƒ«Q¡D¬¥ßç»âXÍC\äµÖwšxz|æ‘¥L«“ŸCG–ÝAsxnw¯ðl’Œ;B&T«æ (çIˆ+¿áÀŒ3ýÖÂÝ’ôìÛfÍM†;)Ÿ’äuUêŸËÚ< m”fÎaÌï±SXŸ¯p±¼·G0>¶nåÏ~Œ"ƒ~ó[]7Ëezßès›‹iÂó1,àIq&Ÿº‰(hk­ÏÍàätsGƒzPÌ9RE‘ |°E÷:cnéÂ¥ËÒlñ˜…ü¯h¾Ï7ÓCºnB«®Dh5"éôC`K»‡~<[Ð5ÜCMÊîTåÈ3KM(Ï/yh0 DÖB¯ÑŸš‰ÌmÁ;fÀ©*NÈ® ´ˆ×™÷—rlê]4+¦÷–'Ãvе‘£À;NâCx–fñíÿe§Hz¤Æp9gAŽ•c0Étk?[3K)iR& ]ýB¸`Œ‹ª&·Úž„X&¼b3.Á ¢ÅTcô æ¾iz(½Ô¹IÕ2Dí™Øx6â[äDjÉÕðºÈ—}@ Ç™ ×K™/xO tó­Óõo„v!ÿ»°yaü¿ˆžU¾°­ ÔàäÊ<éY\ãzüAlŽ–=¹$´#Åþ–¿ÃLrM<ÿ,Ø¡i6вFÙKãf~nÅ ¿ñ¹!Io8Ki;Ë´^³î†(щÝX&îFç0» ÷ Îã”1'’V¡ôørKæ"[ <@ÎfÜsV< y2[ðaß_å—åûê™±ôæêihÃ-ݵâcÛ%ÀTšäŒùéSK W=J!ɇ)â\©¸$òsõT¬Ytdú%£D¸—úÓ[Æ Ü¨ÒÜ^'¢ ­Å^½VeL=útªžÆÆ›o’Ä&ÕŠ_”ù ÃÆ¯¢U1;@Q–9[4d8šÂ̰4 *@Á âkáá d›!QnGb§A!Š’w‰Ø9È Á.ic×S¯|åWØ …‘­Â`õŸKF²g6£;|mfÚ†ÅlHfç¿ÓŸÍûJ~dܨ Ï_)žíéøëp'(™½c |-]K:*jͪ%Cô ûßà¦-¾z,ª·”btX‰Š}ðÆ¬³-wO0ãJÀØš|{6VÁ¸Oãåëz¹\”ûúUàÛja`¯õ0ʦö(¤Ë ˜x.*¢ö–̾éÖì‡ä¿¡?•OÚª˜ÉÒ1;P‹¤åÓψ Ò>‰ÐÞïüõ–°"?ÎÈt^‡Fœ/¾Úx Iýò¡Þ Û%¸ðÀM3 `ÿmIT'æ×¶ó¸‡û"2*bë2ú¸ÉŠUÅœ4ô-nwKK¿1ÈrΖ~– ¬,SÑO1g4¦9ɉ |GR»>ïÞ¢ý^,þI𳯨s¼<ÿ?+dãS143EraéaÃ]ûrÕ B±|®Ai ”3qÍœ€ÑɯjëU—8Gå ©–ÿ6s3¯æE¤ÔBBû+GI|€!¤LÈ).s²gW‡ç&£I¨w…vG2Ÿ&fD6ÒHÈÞ{ÕYl¿ÌF£?dPóWÇÄ…MQ4YÌyçG¡ 0U|DCbÿï¦A­îA~wô°ï¯Íݨü°ãÎEuÓüAu‡ï-üØïN7‡)o´[Q3™KÇ\òRC˜þ¢@ÍaJ=`ð(å¤D]_´\ç:›aá§¢˜bþw^ÞGÐë¾=6ć÷1ÙT‰ˆGÞMºÆÏ\{>lÏßO‰ Y—aòíߨþ~A WÄ^V½h7PQàJ–\8x¨auB¸ÖEó”Û;\â`|­Xµ±6ÐL= <ŠeÒ©—d'Àl¶áH6ÕŠ3˜l<ÀUÕŠ¡3z圑tÔ7O¿–¨*ÃÊ‚édìužÎZnßÌGÄ€ á½ ¯%%ÿ8á뚟)JÚHüÃy Ì—{Zº óþØ'&Õ’k5ç)›ËjRÐfµ(·Ù$šxE—Ö–C¤÷(q i'’|á¡Ësê/%sþÏieO¸¥{(Àb;h[áoF«¸À°T –7–ÞŽV±l2[ªudÊ·4#©ÒÛt‰>²gúnh”LFUX”$!;ü’ɧb¢“ñ/Qªî-Ý«ÑÌÀuG¡‡ \‹p NÁ!`_˜ÿLgqY ^6ä¶sðÿ% Ýl½G Ú¯u:5mü¦†^¶–Ð…K`ê<|úÞ‰oÌ™›8 ¼œÇ^t5Œ€º‰t¡mÏpéaÿ¸÷ÿš‹ó ‰È1ÞÉ#WTv쮉'³6 ESÛõ²q§ƒ·uÅ4ÑÝ%r¨klØÂ®u„Áð¡Ë8¢-bdÑß§í@ˆ·‚ø²~æLk]ø†¢xÔ—[1ƒR8ê`}š¦XìS`“ÓÔÕ 3ãqi¢®,t„ù|I'ÕVRE8fŸh7¹)y”x7m…wßÖav“4÷T”;/\.]¡Ú% 𸝱Þq–>Í÷áÕuXŠ7ÿ2™äœîs$‚€Äfµõ¥Æz˜Â³JªvÖ¹Èðó \¨xr@;¶…s-ÁW@80<Á]WNƒžf§Ã¸+0w1’³01+™%%²÷œ4:çd%Ì0Ç)®3À:DøJ‚5îÊI~YcƒÚ ƒuÓ¿^5ù.Ù1^f¦õ.ÇÇò¿x8xüØ<Ïû¬¨†3í—¸ëÏ ÿ“Æ5Áœb#žµÏ ==œüØ‘4îò_Å!ˆ4ÔÑMß)uÇ9¶ö"žÎÂh {ìΊó'(wÄå"˜M¿ØÞøl ìm¢8²uQÛ¼‰j1Ñû.“oçÐJÙÜÌ.1SÈé¦5ÙqSŽ/±EɬádSæ|Ì82å †2Ï„’!åŠD>¬RSøýÔ«“Ø0l¹}RÇAcž åV:àò¸Áo¥¹èê­P¦‘›iü*YñK™è”eæ[¼sj\תÜ&}žÀ”&ƒNƒ: eúnxsZ)ä36l´.KßÂmÆP@µúœøK haJ’HÜÆt´tŽè/e’÷GW»Êã¬+ê³XÍF°y†¢ëDÏœÞXQÐ-˜£:rÉ?q „oÞºc•ì‡&î2¼±i÷$×]™‰©#ïù,k¿ À…™›•ïJˆŒÊ±ãy±no0i2ÂH38E"ûQ_ùg˜›Êò¤Éíqî–1þýÀr·Ôc!=Ò,ž…1¥ùMY↯ªy¯Fñ%úWäM¼Ÿæo$YŽmój- ´cE`ÐÛp¾vaOg‡ÀÍØÜ>Yï!„èËû;ÅX™›K`ó[Dò˜²³#Rìâ*§ÐŒ²°µ ‰»üúÀÌ«µ?ç¯mÏ=äŒþ»–$ó“{M#úm¥ôª4'÷û*zìçõ2ƒô#a¡”—ד¼ØµRË5µÍãlé»3¾©qò´åi¸j0–!Ç•óÛ¯ªÍY¹×—yYËÁ¬ßUu•ÛK€ÝVKƒ’öJt¦€œÀø9³Ü£Ø‡KV‘ø&uÛ²‡„¬XŠ¥æðÓ<ëPB˜tÞUaê=à™ìu~¥n²>¿ãPÍrƒŒ¥ ïò¥1òIáXÿÀÏ(ËZÿ¸Gƒ Ñ?Þz á¯_:Ìô ¥Ó³p *%#7šÏÊ+WŸ¤4&‚½0.î£]1,H†øýO‘¿±[Žªç”¢Ra;cF“®ýo,¿pI3Î  ø|¶ÖG}FÚ´xït9à» Dæe #M£³; 1<î {É1&jOó#5¶º/|ùkçMô¡‘Vñ¶®ÙÇW^ÒOô‡ÂçßxpÆŒ?™çŸHª¨J(DV^œQCìZW-\ =)ò)ùá^¤8´ÎÕé¦åòÎA=ßå[ƒbšyám¹&’¼íØ5p›þæÍ·¨Am¨ ia‡“…M{g cýN¯»¬šŽem:måÔî«ÃtòúLnSÆnÀ¿v'´ÄbÞ+r¾ÝÿØcra”ñ،ӋJ±II%>„ÒSÑå 5¦QÅ¢Ô–@™Ç>ÓeS(Óû+«_ö$®ÍVñM_‰NËÈéRåEhÚ‡ g°NÅ\ã5»ÝîoŽ —¹×êu• wL1P24#ý G[ÈVKË’ Wq,š…£H#0'j_,aÚt…¢¾´'½Ôg7½'9í\!ZÒZRðÕ»’´2}é"5Úr\ˆ f¦gt¼²|àV,f[É’ÈNô!rüJØ[¤10š¡üV:aé—³Á&Ê›, n }ä v–¨ñ§tb¹DHRJ±Šä ~Ó,R›æ¾¹gZ>d}™ž©çï ðãX«ú‘*‘k¥eŒ:5…"|q_å.ЭQ^Ü —Í6VK'å(|Ud«x_÷¨ä7·9ªí,{Ø‘NÓ¶hò³Ï)h*œÜc‰Ýk‘ý,ÍÝò¥U6#%ÕêC-WÒuDº“ê]`ô'í~e$ÕŒ°¸(¯CS\ª•aþÀv õÌ DSI÷„~Sÿ$Â~ÿ‚ËãÀ9‰°äÌ’$·c¢Ô ç-¡ÞA'³ß»;w€ÓìöêÈaúcÐoõ#¶!õ¨Þ¤3ãh#„–uêNºTm2³¸¶W8v*£è1ÎSoðU&ÿnA¿ùèQ€8­0ä±+;6ˆÎ&i•è¢Wà›qà…vAZñ±›æû»0ð÷=ѼD# B†4œtË¡ÂwÞ#:HÁÍt3ÞPŒ"ªšÔ{ª×ŠqxPû˜›’ˆÁsaû‚#hNÀ(Ä!Ÿ¹®ÕëÕÏÐ(«`&ý¹`Á¥}¶–Çò¬~Ø ÄÆ4s†4M£5Ù(²fç9¢Ÿ•osŸª™}æp€i2 9÷™¬‰ûÁúÁ”¸ó¨ ~hv´ %¨•ÖSKä÷psœÏïUœI¥ —’ÛÀ »eÀºµn±‘3Põ}zÎQ c1O¢z’øNÏÀÌó@/=‚³·½9÷jóøùþÙUzìóE OD‚pâZ*Ñ4³†¯s´´ñ'Ñ?f^'æ’èÒÂ:ÀJp%˜d ýTN©¢³ÆúkT÷ßÙÂ*ÕȯY¯DÈ"ª¸ÑvŽžðOÖ={H0‹ÈP6'Ͳï¼TÁü0ãRêøžÍ"4{\Æér µKAÆâÔ'xëùæ…—ÅMƒÌ¾…Z H%ÿ¢©©?'±Õ$ËÌ9uŒÍ^Kß½>z$1ÞÛ˜‘ ä€k·Î¬\p¹ÄÝ×xœ¬xWX?,0ŒöÒ´zïZç=> ªM-@§<¬ŒwÞúÏN ËìP8czEDÖ¥ ¡Õjtóznj!vG`ԜάçŽm›º9GbAGZކÞ„²ÒQ“r—R‘çÞn¥â]Dwš!ìåk1‹h©™&.â³é—F¾ñ‡™´#î«ñ\U—æö娮âbuZk×x‹–gÙ;?XÁ±œg#];‰™ãÔHÇPÀÓd¼AWTaQ,KøVçTº§•“F\„˜Y/è¼ØÏ¶‘Ž*¬B0–Êc¦ò@ï›ÊÐBŒ0}Õo_ø¬bƒÜÒå S‰©Bøm*/ÉWÙ»’Éc¬â‡zzåbIþ°Ôý«.X_¼¿ ¼6»ÀÌÍžî,xOˆ¢°U ¤¯óœ«m·Á%"`Ð|ó‘:ŸÀ(Fò!GŠ¡Ñø*QÓÖMxìó^.+Æîy³÷×Ȫ;rÿ)à@+'#¾µ_)^2QàÕßt>ÆOO|AlÖª7ïÝBö²ä‘äϤé .ÈÛ]nC÷@h¶Šþ’Æà,ÂýÒ5׸*€NáqÔŽ=d©—JugÛž$ƒêø6uÏh$¨Uò³Àñ$9¸ë¤ØB'VÅù+H 0óbáz:@ã+¥]΄”úr Ýg(áØ«ˆÿ®Aß,ú‚%ºg¶»xϯŠ.‰ „õÔáÛÍ:òn0!ã³öc÷ó*3ôžwW¸w£)™¶‘jÿóÀšc¦_sÄÞ QDœrƸÖ,帅)’äÎ-Y>K…nÚ^Ó.=æÄŠÈv‹·í_ÑÇM\Ô·GË L#ŶšU÷¦y§Ý¿²½¾†‹8%àùP~Õ±‡˜~c3˜É ©ÜØ¡æ¤ÄÊ韕V¥kNB®œ]t¸:d›:jzË䵦Vl³ûBû^ò›L›Ê§pwœÙ%źuôûœýL¥Ó‡}W9ˆ–„¦FË–UXÄJŸCT•£î¾æ±lü¾¨b?‰‹¼w|=Óµ#)XÅH}ˆ 蟚URÚtì¸p ~¥«¸ËåŠÓóÞx -rT2t>Ä·LZ­t½~Œy É$UØ1xݼºÎ¬«Uþ«hxmó7F´‡ÎÜýH::ßl/±ãIÆdC/ÒrD¯ß2TðtcºU·á„([ši‡(¹h-Òú¦ô‘Ì-œÿûÊQrÊÎ_û‚D¸æ$nÖéN')<Ê"¬—¨}9' Íiè*´àÚ©WyªH2!»/Tžv[ëõb·¿y6Âj-i€m‚<@¾¹’¤¹Ø‹ò8 !tý8èý—Š÷ã£BÑÒ4c’h-pE†;ºì±ê§¢ó¦~»’Ÿð|¹˜(eKd¤žÂˆ/fx‡ ©Ë’bãEk4ÉÊ>KE&ðgQÏ*Ÿ²Õž¶ «„ò‹€:Ï$‰¹ÅŽjËáÍxK–ÏX¢m{Bso"%?–9„ÞW6•ç6*ÿÊuBV辊Àô7ZÀÙÈ n]÷86äzÝLæ¯w76GAC›«UcBøôN+ó¹6v^Ç™¥yCÖ;A"¿é¥¤ZÇ”[Åà ¢ ®r\{)ó1¿fÍå8øµ¯QÑ—¨U¸'k ,±zèõKh\Ä­¬lh »da÷³½!>ÿÇõÇt-ô•O!@¢ ¡ž]Ž-¡)˜Ú™ N£yù…ДæÂ¢ÙÔÍ×¢Õ“@‰1¥yßn‹»îÐ¥ T/k2Ä=ºICÒÝ”¨:Á€®É6nb̸.FJ£d¨ÔƿϨš·[Ö/uLU* `^ͧ,ùìH~3ùú‹%2ŠÅäŒ6-fcKõΠ•ï‰Hj åÁêà°.¼ÏÕÃFZí †Û‰s@”+‚ ŒØ„Jj©úݶsƒc²„Ô©û!ŽóMuØ#ÿQ¡*ÎXUéµ.kK¾4ÔûžÀõªðC*9ÚMÍ#z›¶•F^Ò«ÑP¼!¦¶¢HU`ÀÞ ‰gý_F-ÏðÖ„‹Ý°`á߉hcí?nÒFæÝ„˜^Õaý‹~U–:ËEñ“´C-L tíÿÐb¥fpb ÚJ ý*š½Êƒ|W.7úôŸêâoª"ÚË9Ä¥ N±â¶oéÕsÍ@c{ñƒæÏa˜t™áCOàÚ®7¹qt«bú,(å qÆ¥Ðãµö_®VgMMŽ‚Õö3ð=<ô€ <¡4›/éØW"ÙêÊ‘Ëg缾YÖoÎúh=K¾Ÿ÷Ó…+/øH!èèÀY©ÃtÁÖ”¢BÀÑ_Ë_ï†çæLùªç3Ü3Ì jÿØ8•Fºû|W0.ßÃyÁƒ$ѳî{±œ<¨–šÇÀö‹9ǵ°L´±£ÍÂ]{úFÌùÍŸ–F#П™DðT,Í>Ͻº']¿mü¨«hq@\^ÝWr½1Ö|¤„ƒœÙ•®Ú*ŸƒÊ?~µ Ì#½ û”³ý'ò6êb“®©GJäŽìj†P&ûmŠˆ¡d]z~·Î+J=Û’Ã ÕöÖÏRƒx¯×P_½ £zp0–÷ù Ù쟖«F7@œëÿÌQ·\)6p(àKªÖç*âú"üãI†x/ä²3hUœèŒ¨±ÂËÔ–»*’?ÀKóNѧ*¾'¬äÛ­ÚËÓÒCúi8:Ï»¯a/ækhäƒÖÎ(0%£ÀœíT¨Æqr"ôù#êÃ}ê£GýÚ"‘Úý‹OŽÒ+ Í»®žß5»åt1¨ã)®…W×­¹š¿ÄÃ\Ñ @BT²¹†p¬ýÂìåÐ[ZÁb<&ÜæA½øç®ÑŸ+teÙÚœ;› Щþ-ÃÄéZgšjð9Ša e@šj[l¿nuD[sÌŒµÝ+¶Ž;Ÿ|WœC˜% 'ò×›¦Ÿ í¤9”¨ª:`zó®“|þ´_A.:{&­ "èôN™ÓÍ¿"ÎÝ©ÇÚRàþ¶ZsŠ@‡H…RVår¥‡ÉTTº4ÿDKÅë*þt²Ú²l¤á£·¥k~ÛÀ욀‰Õ$™ìÌôrœë?ž‚O'¤”ðΰ¥œ­lâg{.7£°®T¢;Xu#ÝÒI•À"ë2¤;o ¿ÒÒQ©ZP'¥1­€‹DÑ-ìöü¸w&#Ûå‰i®oñÈøçűj¾éC„YskœB€¬RÒT‘L;JHO¹öœè E€†Õ‡¿»ìÃ5Biµ}¬‹Í¯PsÚíæÚñ|³‡uáH‹†âÈy%ŒHxEo•îTÕô;&Ú]Nl¼U®ÚDØ&sÈ%×”èP^ õI„L8Þ–xjøÍ”:¼”OØgÐóNÞ?åu# bjÝ]tš§JŠõ?â}ô¼bºíé»Ë»‚’uý5 ýФ%ŸHÿÈ]|>Q ì]0¸:‘©½»ÑW«ÖXy´Q„Á¬Ÿœ?]Ûßû{ºYÂâ×f¦†ó]ÕÕ†s¼Š–a!ÈŸ/?¯¶&i F¹~bK”C6ƒ‰ÖI†õ«˜1ËY$@üáéNVÄ›/Ÿ“à#“½âqôŠ\p«÷­o^‘ýº›×m}~Ó!BSÀn¼áìnL{V“ñzítâÖGõºµÕ~|+¬ˆ¯ †c×Riï„h7ÉÞ¯öWبaŒbvô”P18PÑÖyá5lAdÅþ¹l,eº1W0k¶¼HºÍßµY4׸uðc<ø#a»½©;Ãj ï]̧÷©KÀ…k ¾“ûCÍéj0BXƒ$UÌzUÍ0yîY0¬VÀcƒ®§ä&4NÜܦb•¤FXÏsh[’=I¹‰=ž× —m¬óÄØ(üæâu{8½‰çì½À‚}¿h•v,˜Íeë ×PHVÞ[ Pzç^El ·º.pd.å—©g¦cQ€pÆöË…0¾È¦LOšñkXECåQŽígÈéþ n$ aŽo [.rqY»• Pñ‘¶©"ø\@§=Á´°RìªßNxtÅœ‚2áõŒË½6ÁQõ¯ÁÚÅ·@»=¡7¬tçø§?šÔ–§mJ> \ÜŒƒf߀ê✵é“hØ¡>Q…ÆReL"sÆÎ}¹}éMXÿøjiü‰¤A‰mßãÿmA˜­]+Óü~jªso‹Xú&ýmî÷S`ÛÝKüAWä8^@WȨKØxð|$ƒWòðä]«y8™ÊÊ5O'†—î]±}¡×8ÔÇãò‡£ø93µ±„OÙ^y Ú€äÉàIʨ\ºALÜô)=ú#¼Š™¨áIÁ'´Fãÿ ‰¸óG×ñuç²lÃW xËÔìö-¾ÛïòÌ+p³åû\-“K(ÞäLºg¢¶°ã½f$]'Ý k'ÅSè%ú3Û䩞«/gg — Á•¾†ø %ûöô}±­Ò0:Ø­é EÉv¥ü+V ´GÜWÚüÛ’8|äüáßXû$p/+³˜yJ´‘t&Žîóe;¢$0J¥ÅÇ%ÄÄgôÅñó$' ‹èÈÕ̶àqã•K€Ð/,%¬…œ_LÕè‡Ð¢FßÚnóåsËdq 4û³ë÷ƒW4<ßÚWëæ¯35h¹þœ—z"â)˶‹üIV§Ç®0O¶@F:gO­ŽMÌ’Ì)¢˜p‚æÊüAœ×áb2ØíË(±eTlu¹< ÎŽFt½ÜÅÓe¢€ oÇÿCØ2‡ëBeÃç^çÈFùŽ7ïÙO¨´låçkó¥`XĤˆ’Î䌪Ùi£ Ay‘.=jÀöwDêY¶ùª',ÎM'ŠY[K²¯éS ±A‡³G&£‰”YïÈ1ÍÇ G\±p=4/ߤ‰)ºE·õ»©,… =‚h»”÷Ñà;”¾â'sšã®èƒ £åÔœêm»Z{´ú_·¬2ÄeÏëíÃÜ5QuF„Úé#·Èh/KåÀvÈÉïìñê:OµhÂÛ\ZÓú|m>Èu[ Ñ¢ÆY¯ß ÎÊí³Ü_J),È\UÈäŸ-ˇ·Ð-‹2³%¿£&ý^‰0ž Qɶ!êçñÁ93Ƽ¨ŠSË+&éé[—[1Úº$tQtV¸QKß"m/ÿ®lâÅ9@‚gºÔ-çU™ Ê·‡Ã­lNÇb{˜˜k ’žˆZäÉ['7·Õ»ž4WîB>Èw(2$a/cÄk”ìñ¾|AøRJyñ4\§ Ñ&ã¡·tjô'ŠÊH¸F n„ðat9Ÿ^ÍÆ ÿGDÇVÚ\Øíá29âNÖÐìŒåŸœ!çFt w?ë WüÄ«8I~žF^„+0?O€üjì+<<׿¿£S«ÕiýzFþŽ>éÜW _k]º;JÐÚAº‚ñ°P™‚òäôö¨[&#©ýÛEå t¶ÉU ¡×R浂½>ø¼÷×âÉ`ƲÑbغ™%bê>w}Í•ÆÜXJÐ0IÙq˜ÍŽ—ž’GpÃÚ¼y‚,ØîÍù°»cuAàHlžµê+¯—“h+´s1ç¶W€& `–È€TGê³»‘ Ên:È& ÚNÙ2Ó­¿ÿú=ÊÕýĤå6À§§'+ê–ÂÖ6S§m¼¿ñ;ÄÉs›EÆî¾­¹ö°33qÓÅežß[¾¥2ÙÿÉÅÿ48D.‹c2û D`ÜB¿A(Rtv©V ´æíjî˜tAfBÙ3ðIÿëh•íNý“KáHª·¢{&„F‰Û;zp[5YK|p›P,Qºë¨cà†[%Äzük–ÌTÒ+`2›óøñ€ÅòsåïÊ¡ŽêŽšÝ‰ë¤ {öof1XIËüq-JI`'Ÿµÿ\ s‹µùnKÒÎs_/*³IÄCŽæ›^Ä®"ŽSî+˜é0•ÞþQbC@Õ9(]ÝÅëQ$qàË´ƒŒnï¼· 쀓Õz•­t§Äàžu¼Wé ½ R·†ùIFyq–ÿS´ I|q¸´£|'}ú7Ç~úzT†²×N#ÉRùªm€w©DÖ3·H‚Uì[¬Ü=²ÇÐW|‹©&œZ_ýÉ©%Ò‹*—p —c‚Kêt²ËzÖ!çãe€K0üÕµOY¯Ä5G3Ç£iïêò"ÑÓìydøµŸEâ˜/2ÃCS³VÛʧk…<ûˆûr,âæ§'Wa¬Èý),gâSL|¹ÛÊØùÈ !r!2:hÄôt<¿šþ+A8äk€Ì{2eâÚšïþº!Åìxñ“ý±jß=szU!â¦_Ým•Õ™J#¤ 0o÷ÙSè¤b(’‡Ú[qãŠÐW^j,_TÞcʵ=TKôÝ>ƒ£”„ÓkºœÀúk7œèÐ{k¥ùá3™×Ò5ØI#Œ[Õ'¶y«ˆ‰`Ôîùþø¹Kðn±º¿æ\?™ûºì…ÍrRyÄŸ„ÍÂ@p/Ýf¾ì3¨Y©²Lž(ÈŽqÓ…!>í`Ñ@¨öÀùT §tl‰±Í ð€ÞÔ;lΪLG m[{¨Y¹€Ý²Sì}c¦‚ñïÏ¡Ó<òûD4Ì¿iÚ•üL®µ¯ÕÆéÁqo2ÇÜXŸ‡†°·a¦Ü˸ߖ¬Õ{Ÿ1ÁD@ùL1vV_Ö>Èfƒ3¡}¥c%²e“Áºq6@jÎ-Ç >iÒË…FLçðµœk;ñÑË¥û¹{ËîÚ(*‘;àŠÄý½Jõ65+µî¨–”•Á¤ M}oÛ¶mIoÅÞ,Ÿ Ey\§cºñ%±èŠÓæ>5h°²=¤-3U+Ål!mê7~߈¥;†…³œ²mÃ?ZžýªMòŠ¢Q ½V²aÚö¬ÈÕ†ÚõQ]ÍMTy³ŒÄö§%œÉg}¶ ~˜¹`ƒ{qò–W}†²sìo}CSj¡¯û}dN-l[K•%Àdñl·OTKxÿ:UФsÈ'»ìdÅ»‘ª„”TŸiÙ €Œ­§†íÍG ˆ<\œ ¡ôû¦djù6U÷`,– ô½9ú%¯ÝÁëg™±0 ®ÚMzâ¸Ï?ËTb<¤âÂU [b³oî‰Ú¿öóxÜ~¤¦,E.},)¸Ð¶´Ü¤—>|þÍšŠõ¼]@Ï躗#9ždK¸¡ùð ôå½Ä°Ù»_Ö}牆ˆa+“{³BœÛ•Ún¨xÎ>qáßæÿRsé&­m|?²6׃r}•ؤ*šŸ>ì:sj½]‰)t6=ijí¯D&SÏya»ÜYˆRFEÕ°{„Tucod/CîIvÿ¼ñÓ¼”vΤ1fHÎÁ¡“âᆙö{/Þy“‡‰ÑB”; Œ…JUçz†½+>8!ARF÷-éõ¨P8x¸±‚Ð0¿&´ŸŽƒ”‹ÝÅ9øgucžöæ>à2*ú÷#¥+vüã×LI>å)cQ3@.TƒdÜ´¢¥­AÚláìO½‘à e{-l×ÈbÔ£°h¹ “0…˜L’zO~àâ nbÍpÈê’Äê³û:)bôÄF¤¶À`¡ ¬I®Êc%2-ÝÞËÕ£6ø©GK±§ uÆ)à€U ±PßêÚÒœ½r±îeâ˜ñœÝÄ¡´ò}M„S7y¬% ã¿RÏó©Ia¸=¶ý:Û¬Åg÷Ï›ús‹7c Ä«)À(X/¶¤”_è'¶ÓYKÊÇÆ)ÇéÚ:=4dW ŠÛC%Ô; Ãd` D„áaÊe²ÒÿoÝ”„Z? „™ÈT´ˆ2I†Rj˜±é ª8À aÖåo&@´P"š˜5 bÚ…¨U9*в晇‡p Þe>Ö ]&öz2Íe8kó”ìšjo*#á|Ž=y]¥¢¢öu,‰ªÞÁ4£ ä.}›Íí_è¹4+ƼÊѧ£ŒírioD_'.÷$ÞÐt£êK”4†Æè׃´nE,Êù,d Ų.ʈ_øçã58Ã_àV·±—)6ÈvÁI«ê¿]l^QXiá¬}Ñp€ÜãtÝùï/ìÜÑï´SÍí}Fè«2/Tè ÚK.Ïoú÷Kxü}7û}Ò'—ã¯.©¥9çùQ`*å%Ù þöøV7Yp”Ê6§ËDÒL;Ã:pȼ¥Å(ŠñDKE¾S[Ó)ãüàX-”_Hük׈âl÷\½A7)[À»–ù†T÷ÁN!a¦VbzÕ+eÜý8lŽ·!çÊæøP¼´ÄŠ)MÜÍ“@ìUrOö:ï„°ýÖÞ>ßVLËh&ÁýÞ.¨ŸöU°!özþ_6RÇœÝ$äW.ÊlXóÙf,üFÉYq~»GèIŽFo¹kZŸÒP³7d‡¹ˆw$ˆU`’x€D+oÞê2…ËrÒw{¹±Ñ;-T˜Hc)´úÇ¥xñðÄñ1EPC7¶ÁZ7¼ì¸ø= °9Wæ.ô\òþ–x×2r‡„/Ám„¯–œÜ×¹§â‡ŒÑ³÷_‡´}2»äTŸ·ŒÔ¸ò+©^æg0›¸†Ÿ3fÓ"ø¾‰Zˆëî#_¯7†R“Sz8íeô,÷ä|ÖVI˜#¥h³¾„MçJY ¾Qظàÿìà¸ø[›h"×Ë 3µ‹!¯p©‚œ½Ï«™éêòʃ4ÎÉžÔµŒ¿°£×濜¸:Žz5éçoºE÷ÜMjvÃà•™•ß噆ÅUüþQIF¥ÚXŽh5þlÿ 8$ w@ŠE—à\Ù«vÿ ±©Ž¿Î+¼ VÌà1¶-œ¬KøœÏàF´óMÑŸ©"œú µ\í10_úÉvÅ~„2¤Ã±‰G: ®±h”mwÏL²ÕÈ8Ø‘@‡Ðxz©õ§'¼c÷•=aÖ¢‡./Oç'Uè=÷¦˜Úƒu9ÙoúøKÆ|Ùi¢nŒ]‚²0øäAvjóŽÓÁgÃÞc€Âõ€TóêRãЇÁËgàO]¼0®ÿKšMûÊIh"T|&´ÖÕ" ºzvyåuA¤BáHNðô=Xz.V±™Þ&j¡A«vã7NýË{Zµïá#bêk£¯9’Ê@Þä{ÕofÜ' dÃ9¯@ÍõÇVÄéR}³|Ï㌷obŒ áÍúµ ó'¸ó*oW]¹ïÄ•‘%–É?FýcT‰i[öÊ™!cO˜ùG¦$%Ë‘Â#ø]ãOɧ½Ö`5"9¾m¤¸ÈV‹ÃC±Ë§·†ŠÚ°«J².îx1"5õ fá« JÀèMwéZ„è /¦ ‡ÆÅ”øæC ¿UÇÁÄ©%KWrz¾ZHøh…† ¢n6z„“¢×.&Ì#ÝÅv5±$8Vìf¬"Û1 8ÕqçgJqzþlÊ7WŽÕš<2š%%r]©ñÔªFkq¯ƒú'ßG]Í…™X}c¿©pn¶û˜¥È•sB /ªvÅ?“Œ:ûÍY¤ÒŸ tÜÙh?ª€˜Ä0ÍÐ8‰5o8Zì·w&êÐc®¨lE¹³ÛeÞ÷¤ai%’v»Ú¦ Œˆà~㢘¦ÅYMxRüØ £zûÔ¶ Ãà7ò@s3ý©CA<‡ŒÕ:)¶x2'X6 ®,µWœø’°†{Xˆ ô\¼à§ˆÄ¼øHEÜI"FX6¸‡'Lýùý={Q¸ŒÉDg¼ÁY)óÙ À´Ó®r¹“þcOäLx‘ß—p—Žk»Ý§ gZ$dT¼N1*NŸ€≪:ʇ l1¡OîÑßsw©i…%¿€çhÊ #+Ø<·aÏ’Q¹²+1z·žo+É„—1O¶Û*q°Ú‹JSïÚÜ)ĨÁŒÚHŸའ.ïFg@çúêøšzíðôƒ våîØvy¾(ÛÇ¢IãÈ">Ê©BÔ¶5¨NßÑ£ÌÀ•rF1`ŠÁ6i䙲%Ÿ´¶dþ/"F¥ (“s¹|U]»UCr:·wá`¹Ï´V1€¦v¬žÒÖlTÕ¡ S¨ 5MÐt¡´å.”fOQZñ¤ÄÖ¹EZgɽ÷òZ„˜ç¢¯–_5â(k8ò¸1íñÀ΃ÁW-4kéÒ?vGyh^þu' ‘xÇtWžOçýÞP£Ð â&«ÔÙc•Æ1*¢ 9!ÉŸg¯A¼çîÙ§›F™û>µZ8‚ƒfÚª‡I"ªñºwTs’ð»u–¸-KòT™ôÔ~ñ:‹^À½¥Q€´WCW!hÌ÷áî[5˰ôO]gR#î9uóæÍ¥d¿LÅŠšJÞc+Þgá)õè&÷#$”é ™Ü]NCYrÈ<êVŠÛùzâ½ë‰}?æ™8u¹O«ÿþ ¼ÿjQ²×¦UÃs7_ÏžbÍ@sk¹Xȹ;R{”â4>V?ø’ð`+-°i]ÄöïpÞh7k✃Äóp‚kÆú×Q܈ ÕˆñhïtðÝZ#"ÿI¯Y¨DÄ|ƒcôÀ$6S€S~{lÜ0AÐ6¯¾¶hÆg™ÖÇŽ¨[ò×¥¶¾w2ù÷@iP¶v#’¿9V£qó+Šg7DЋ+¬7Ëdš‡q‹–òî‹Üz7»}ÄûGY`¥›}Òµ™Ã‡­þ§zQÏ…-Ѻ–Q‚îŠYÏ*°±ÆÈ¹MšôñÒÛí¼e°ƒ,ÄâÌúi>Ú #ÑKÑK„ a¶øÆ4_¼º-Á&ù^å2IÆ!= s/0k×Çdðã@%\§ç<.ÊëylfñvûËmþ’ɱ&©þqYrfäÑßJbPólµé'¼ ³ Åð®uÜ„>âÿm˜õPb'f4ÇÚ¥ÎJ·;,`ñ ëé`(Ù(—fyv4ÅÈ å.ÌšAÁ¢ò«%{[œÛŒJyÀ›ÆÓ¸iïMâ&hùö $mc5-U’ƒ!s"Ó zÿí=Šâ¥pxrUí…±#EA¤¹v/:ßÿ$=écÓ¶?C&ºA®Ê냖†¥rB¨tƒ4¦{\Ð.ÚœRæaå.„ÃókŹ֡½¬z;©úÕ?}dVÇ.Ež\*Ó6&˜eÿ‡ÝÌß´ßöu¨¼7rÍ*æÍ²ºòض-ÔŽHaSæ}Iqºº ‰ã3ù¬rlÍѧL:Ûªwß•_…(ñ˜'Î,>(À–^ ÖJ®s+4Íî²ñRbÕmÚ39 ÎN)¼ley"¥ _‘˞˪ržÃ½+ þr𽪩 íS &^¼6QŒ~{n„ÈDIù”El}¼{vì ?®'Ðjªb¢‡a–4}3SîÉH¾ á;F•4båìQmºúeøíÙ„T¼"÷D¿ÕWJ½½Àé* õº^Êſ²z÷Z ÛE8ÿ[~Np<¡OXªvª³õH]¨Õ”îäuLüC©¢G¶}=Ý?²,P@z&J6PÕôCÊNžÐ¿P Úÿæo߹ݕÁ°´ùÜþk¤‰7DšßªßÊŒ]ËëDöX˜Å°°oÇ>¤1pÿ~¤®’e×U“JÞ$í_Hj/Š?oŒ–‹‚jÚú|׿Tp+uòÀ&+cBÊ9ÙýšX9øþÕ‘>O<Õɽ'QÈ+­FW°8ðÿh*Z“‹–ÎΟâš:eÀhƒ‰ö{Eˆ‡çx`ðSp;¾£ =®ïïlë„áVƒtéèXz€i-[ýp°Ù†F™ôL¬B[}šè.¹ %Á4ºT-ÞyÉY‘ˆU~úLƒœ Ž®å³o×;H5Œìy§!1*æOk¬8Oö¾äUГœ…2Üò¤)ú®Ž×ã&½ê@ëˆtðkô7:,g„‚Þ ¼üª< çÁ½oˆ¾ÿÊA£ÌÄAÛäïûÁã•иA ,᪠N—Š«n¹.ñOꆗ½‹#q-3Ú%‚ÿƒß`jÐY1ïq&ÍÆÓ³YüxÛ0Æ›C."À X'ãM_z"ÔÓ_0£%ßÁ>Ó½o®H/ÝmZ­sKѸ›@eO]8ê“KÇMç}ß>yq¨ë$m5’üYòøÌÎ âœÍ””§•Ð.rIÎç`¨s„z¼M4ô´| ¥ d9ç«\p=ÚãµæL8ƒíÉ\*œYTÝØH ¢jª¦Ö@ª¯ã(4·_;ÔBü¯ ûè™.^‚:4‰ù &*Ò‹;ÿêü$¦PI­à@È~S?~9pÖ½@zÚžo›uÍe}¬Äþ!þ‡*øl¹k†‡ž‘óÏfŒ1܆>TÁà–ÃU*MûñAÑÅasîWY=Y ÀsèR¢a듳õÚù¦RÀ­X«{=m2ÌJ¹Ýù›Ð* *Ü ¦4cy’ÇûÏjÑ7Û0‹ ²+pD Æ.–"‹ÛÑâ z·¦¯½€h7‘²?…¢ð CΘ€ÀóÖŠÍ‘Ùv所ø!¤ÿ#š¼~c ilo|ÞXÖµŠ,@¬SXúÜY$cޤê‹:ö‚o?ïæÚ†‰énãI³´™ò³Œuæ܆ÉuŠo›ØÃ×Ã0. µZGçè„࿺iXÓø\ÓÁü;Æ=±/ëƒ7ý:ÕšÞcw5®CËÂrÂJI8з)"³s`?qwhØ‘‘eeŽù–¿ifó 6O¹æºw|ôªÝ˜þÒT°äYVò•Õ½a²~yŒ)±7’äiæÕùi׳–«óÄ­½$>²1Í)‰ßv„jq%¶÷.pô¸¼±gùTBÍж¹$³.] ¿u^ä‘éøŠCr.`eeæM'%MäªÁÓŽÓ%1ݺýA–N?pZ†& ÷è±&O”ô]&7ÌšÒ¦eHú²Ñ.„{ešJZÚ¶Oϰ¤ƒ^B7üÎ6i[÷„Ef|é†×ajñ†8Ö¶œlšÈ‘õ`|Xë±iÞ `ÿ mþÂ/,™|5_ÍO‘l0#yõr°BFï/ÜÆGaEè<jsÃÄ·8M¹$´˜ë£ÛGfõ%ÕæÒÄ‘¤û½¢Ý†ÁŽŽ°±}=T¹¢|›;Äfuy–§H‘AeãaLKfÖb ¦xW]ª¡T YÎVŠ­± 0ÒÀÔë 0sá8æ¬må· `°¿Í½úé ™±>AüÅŠèh“º$¹w·5¾<¥– æAü"Z C¬§Ôõ\‡Ù^jÖñº”šÛªw(ÕØ÷~Ú.a*zAæaÁï Lô‹¾cúþuހġEyÔzã•:‚w|.yþ?Ž‹åŒ".Û…C0ÄþùÍÖH›ÛßïPŒ:„òÝŒyïû{98ƹ o½z™f Œ¼üÒÞÿËööI²jÙ©îÔÒE‘bmX  †JíìÕCÒÊØµ¨÷"NL™˜—?´A4ÚµS >ýž iÿ-H„\oð—â^Ia€¸?@öåb9 1SÈÌQOLA£ |jDJOA2[@¹mã)dfK—3¹<¥¡÷Mð¯Ê„›ô~I.—1þ{T¡:£¯Edånö_Œ[íÆ_ÂùÏ3ñ¦TprrLÑÄ>oÍÛŒ:E¨ªbëh ÄãØPt‡|ÂõkY×ËÏ$¬´#FýÒK æà¹q7oÛ{B2ÉSº“[p~sèŒ5¬…«¦MUðV…×Óz½œÐNУfsð|f3¦‹éuEa €3íIÇ"ô-„][ “õB8·®Zú'£…ßö8¥MÕÛÎÇño¢\€&sñF¥Q d‰,æ<Áºv~žS { Y—Sž½†ý†H²*s%×tÀ:`×¹õȽõ\m„ÿ$Ç Ä­Ð Ys´C}<𭨺öל¤ž6¾Çè÷ìÄwCj°ë°ÄÞa=yðß¹G«ÆwÍ4ãz„¿|¹ân~xŒP~hÄÂê'²ÊÓú‚zzþ¯PqÜz;D`zûñå{ñcF8èý¦±"j¹vîifÄ%’·>•á ‡pGˆøŒ._ï~ ¤\O ÀÓ‹‰•W­iÀ7R±(‹Àãúé)ñ•ª â‰æ®Ýé`Ìv¶¤„`ÖU“…bÍz  šÃ-ÁïùIF¸²oí;p‰»õÙ±û3#lj1˜•Ü~z“KÅ’þù¿¤$`¿qÿ¿òJtòsØ nònbà\ÌÌ÷ù+;äǨòŒÃ0‰sÓ2/5?~ò†1¹ »|gýÿŒ#±Ì¥uiøJAk¦«±ÍÕr+RÛ‚Mª‚‡ãüwLìü*ðïPIÇÈ_ýEŸÃ°ÏµdG „Zc5x¿Ôy·æ õàü× hyŠÓœ´‹è^™â9îUbõLVx©ì ,n—Û¸ºo ÛèÖ*†KÅ+ïþ oø€¼~ìò/ëkbTFÁ·SV½O^ƒT îDiÑÿ¨ÇÞš$ ЖoƒH_†ëÿ aÝÖpU"•Ôö–ÎïÉ|¯áz7ª”?³œ NTáô>Ü@#-ï³Ô×{é&§åÈܤ_œÊQ¡–oã{/Jï¸u‘«Àøò©YÉ‹€ÕÜîcQ¸6‘Ê¡Xrpí‘{:vñxïcÌÖ\ßÔß'\%ä¶³¶´.Ïæ#¨j‡•™yɉ&ýÕš»žÖ72ïö\]üÄÒ)YùyvéÑL•û8=y@›ás­šc¦b½˜JðC”«ñ²H7LåÁ¤¿¦¿üäÖ²Û{»§öÒïåßøgQË%7Ù¦XDÖÑÅŒ&‚¶…#ûD4‘cdíÇ yÅ•FcõÅÍb©1RöÍ4ÿÔU×ÒºÐ`h¬¾ì²¦2ä‰{½xB¬ý!fLÇEql€F‘K1?Ä‚ðQáŽjj8E3ÕÌà¢}µÒz3ÐSÐpkÌy-ª¶;å«àêßÚR .:À5eÖ7%/jßw˜K­+é¯H-9É„ûÁ<Áçàñëú?ƒÿôH®Ôô…v£|˧i nÔ%® ç 7Ã?[—îñýT¤tç0 ÂÚ…œlºXÞî0òœ½& ÿÛ·°ró×!{šÌ¸üv]˜¹C„¹³Þã-? ¨|(R÷Ó/|d"›íÞµþ¥Dd‘ø©Ý!Ù‹úÄÉGéØÑñ›Œ´\¬¨]p>¡]iI23¡nO<"U˜[®–Õ.²ª¬“gHÌÔRRuƒÌÍ%ñ±@¦ÓÛàwúëwƒÓa6\1€6q@ƒ",ÉZªK ºH.KóBaËŸ „óÖìp‰uæ~ýÆ,cGÇ?Q!ð£Ì½ [ÿh‘ú¯’n´>™\‡²)EÊHBüY¬Ú๒Á A_sR0ÍÖfBGŸpjRS kæ.iyÀ¶¼q¼_y¥ö½Ú„úÒ¬­°qe+­Îî>ÃEU2œw`æƒôùŠž:Á áWÃñÑ.¯™]^êÕÂqG8å:óm_6’¹”ÂêINC™¨“Pò!ŠÑëB Š"0 ‰üŸ‡&=Êúè~XÕ诇žû,m휛bË eäÐm·(êWtMH†ï$b_°Ç_j53Šó<8 <éqbŒ[zCÍ«_Š$2}0¤¥ \ó¯Ë¤YD(R$Äi0k‰ðµZ³¦KógbÍðÿ¸aK¡Ç6 ­©Ï§ƒøñxiÙ‘§Qת £ÆœÖ=™~‹ËÅ-o±\P•ÄK&—V½&£¶mL5_ÊT²¼ÃeŽsp…žÎ…rž¦³¿ÌP ÒÞ²àMºCÎáÛp¢MBPLëZÜ»4Ú Ã8ŠÃ·A/ë$dÖ`Sa¸ùØ/w¤Ž_i¯Ê<鬃DT&Ö0I¸]2–á‚áS¹3E uÑžôøeh]$ú·'’L:—=°Îg.®‚þ~~©ù„·Nlv¡díƒM¢›ŸJúäå» Â+èBáwÚ6Û›|òñ[­ðBÿPÄF^¬ÂÅ÷Œ×œy}Ùu›×4{ZêTùvjàÈJÛ6ΫD|ƒ³J~î.Ù\Ã^º!—‡LzïeÜ)W–ÖÐÁén¨ yEŒìÁˆi˜ÓÊ|Yã/l‚S[Ã+Ú°éš uKëÀ«VV“-ŒO÷ÍÃOª<•›ìÌ}Ÿ¦·/8¸¤nþ÷"_]1)”ÇaЃX+«:Œðw¨Bîa—e_ÌÈ(×`§›þ‚ÇÛå‚OÝ\ßåª;A:¸¯‚‡¥•Wa ß2£ß‚Çu|'t!É3JÇ×;Ó¤íÇy΂¢¼8á¾Åg£ƒgVÏü‰Û95ÆŽn×kK¼!/¬y¸YmÝ^Á…N| ]}ÈBuùê´¦ÀŸ;âAb^e–U¨O­ö^ÿ@¦‰±…™½ÅíW=£s%÷¢vÉ…òÔI%ã >DñoÒ^å¥íN*­hH™ÀkŠ5,:c±¶ŒØ íQ0+Øзõ€ÂBP,t»»g{¼–mØMô.»³SÑfÁ40˜…y•×óÙÆøœ¤'™¹KbÈî‹à`’Ÿ(~:Áy9oôÑE!t´0U/?²ƒD“üå;áÔ'QôyW«ú¨=ä—~Þ;g<(G§CRÝžè;'Yh­Æqºff=¦„dlëÀ𡦠â?|b¼ó¨˜¾ $HÉù0§«‚Ìáæ®¬hèJPé‰+7¿,q}{( xÖNKwý¹j¬Ž‘Éï\Œ5>ˆg^÷¿„y¼à7“YL†FFž¢S™¶„>jâ…¾‰M{ñ*òÀgU<IËhçì:íÆ|Öh³ùÈ/0wìýFcËfSž >GÝÎú¸›ƒ‰÷‚³%C2 [³uŽY”ðS~RïXBY|À(å®ùhÿ8¡r‡Ú½s~A‘PŸ‘eÜoÀ<Æ}±kI†=›f§IMîlÜŽ¹x‰g[ÉÙÆxœjÊŽ!øÄÝÞ±Mȹ“â‹÷º¬Ù“œÊÇI–ý~/6È_ÉôëUÛ»,¼ûªˆý’—"6 ù‰¹ „K)Û”Š†§=\ƒË[½LtœÑ¥uD•Üìé iûf¸|löÏåâbp€N*-?}{Ë£ò.ܶÊgSt€)ä‚‹•¯°Üͬ>ê êl¬ækGîEO)?¬ÃIݼWçm9(•Î?9NÁ@ælÊ27ÃÁ>óò98úSëe·mZú˜ÞÝ:fSÀO"‡]¨i-YA,.ΤéØá£ƒmÐ+0ÓÜ1ýX¥Y{’‚È’¾5xçö®óaÌÕ?¶72vðÞgNÈ™†–áØöewQƒ7Û÷D@¹= ©!Ä]J ôÃ$º(C€«( Ìv©#Ê€óšqâÈäµGro´ýp1ó]$žž¼o„$>¨9Þ2¦®±Ã÷s‡9"ä)Ô”•¡ÖÒ éûˆø·™àÝmûuª$¢©Ûf‘òĈˆx±…Ph *[Ý¥ÖE¢M)`¥cîiàv¬Û>‚ÉÂôÏÑ0Jw;·OÀyôB”e­¢ê\ÏÛõiMæ'3jLcë7‰pr…:òV£±eI/Æ%# ’ÞPú» `˜ó¡8Ã;Îωóß· ¼‹,#f‚—™µ'ý:òß\3""5`«íe'"J/ä$’WYHr8Žòæ§9ñ‡ÉÙÓ« j(ÌIUA<_줞¨¦ôÑ\^™ÑïEn„ç6×J±%x7á¸Hiöö9s`ÂJ€3¡Ã'½:ý~4ékùR4¹‡ ƒ0mŸ×*.4ÈÞ,IØ»æA\üRtSÚýrSƒ5zn®1í}ÄA€ù?2ìÈ+¦V(#á^ñà™Ée(ݶ®?7b<Âú:`…YûÆÑtm6i|Æ#]4˜e17OM¯Žá´€_1üQ_Å8Ûu\$CL;­èx§ù ¸a˜AÖÉ笑“M\+vè&Áˆ¾ûk{ä >Ôš=V–êLBcüN†:Ê‹=2Œ©ôÆáw<͸.£gÄ%ó{sÕ]ö¦•o…SWïíDGòŸ¾ž::<­µD-rݦÁUx©j›(N·ú0¾k!”©pÇÿA"]‰!3ÛIi(;Wíráã±Ê´QWѪøg §E2üMåwu‘«?ò‚Ó3 J·=Ø}€‚|¡ ‘!8mGlAþvð¼BY¯|kGHg5šL~ÝÞ^G%{1±›'A…¿×{W|¦ÞŽØþÅ™š‹ëÎHR4yþæÁ×Ñä2gA}´ïËTÙçäGõŠÅÀo˜øN‹ãkæ°a¹“ !L¡Çÿß1žÔ'ÂdÚö7UÑe€é~Ñh5õñ«·Vî÷†oءӵ¯Þë½£ ^¦qžœnmsÙIHîÊnQm‡ÈZê'DОH¢Ô¯ÕÊÑÓ‹^­¼<%>ÔÿßÂL&&' ˜Ûy…,k­L1!g?ÄÕÔ†g/ëO²É©¶Æ¿ †s²§Ø òvVúªê —±Zó츆 €­BHô^2¾>›ó*(,Ùš£xÒ A9òÕ¾q8Ÿþú’}&ÿtÎØŸËoñôÀ~Û•ˆa¦-*Z~$Ê¿Öù„µD- «@%¡ûØS·ÖF1«Ô^ÿ×s.Z†uš"¸æ£ì mW$2Ȩ ­ ¨O`B~pLAXõù¬M¨¸2$ØÚ,‘Àcã ähHéû¸’<ø,ÒÓ(PÛs<› ð, 9¼ýÀg¹rNÏþøi±U[ìÆîÇ—<úóx;Sk÷ »Ó6òsà½üÀMhm)‰dfâ™Ð42Û+ô~E…_/þˆi¢QR±bÎÍu=Àg?8¦‹ñ³Ž’Þ8¯µ©!A}ö^ƒñé§€dh›—‘üBðL̵Z‘cRо: ‘å….$O»°%¿«ÈèhÆ×¶³öd‰[µ‘qò=F4V>Æë_ÉáNBÑǤ‹‡[r«Õù_¯Óþog?¥OΖc¨‘sÊ‘x—¤g’ ÿm¼›ú?Î>+NHñÔ,S=i†néë4ît×àØg‰²·=èDòû¨[5$w®ˆÙG¹s}÷ÞÁL/ïýƳƒFì蚨¨®‚Ú†:',ÌhÛúíâÍ .yÏB& zæ†þ~ëþôÿQŠ’4ä²(üš+Ó øù»™Ä~˜`?<÷›ÃÌ=èÓNŽK)!ÏÕHö‡+R®|ê5ï SÞêräŒËë•ÔG;ˆ=¡/WŠÚ.Òt5ríjêó)ºj#~HÉÿ9 "5@˜Ã‘†€R8W¨ê½6Öµ[=álè2 âåhÖ”ÆP#®‘UŸqR·ËÎ-v$´íþ­h¾Œäª”D`ù|\TUË ÿõqÜõ½æ?J>£p²ˆ)L×[Lß¡Oš<_{IcÌRé =#˦Qå“|–Ç.EF§¤75hN¢ÚjuÑúS£ Í°SµƒèœRoŠòñ ìÈ7RˆØ:7„æóDÕ3}ª&Þáq Ôû²d·IpyãŠ!¬”—…Ò˜™˜¥a´'jíÉgásY @¹O¦¸›\_ä(íI¨oÔu3…0ÃÖZCŸ’Ã°Ì ÇæM!WÉ¿\è ;b½èØæ§®Ãà4Â}Ü@{'1Ý?ÿÈROÅêœ (ãcl˜fŒtŠª4RJ LÙLD%Ð:­Ä{oÜbÈÙÝœF ¾9WiºvàGƒ¡­&Ã9÷6oŠç4­ªÕôÒR!«&ØÂÉØå„ïõ¼UDH÷ZQ/xu°€#›NÞÝOvóÌù'…S]¬6þÅ '‘Ü<ÅtÍOàÕÔ'I]Ï!aÃÎÿ‹•/ïÑ™¤[,á&m"÷÷Z8”&ËDt¤Ïîd轘¤ÊL–ôzŒRµVxntÓ”¤´vQ©˜ÈXPª¼¼È ’gŠ•ØòüK(Â.‡“º<¸C8^¼D=!Ê Ä׸c­R*Áãòn—('Õ¨"4 u'ËtÕÎ9‘€lq…c„—w™š}©Â‹oÂJÜñ:#IËFŒ0Kôù†Á1D}BgóðŒCÌÌ6J”¸,2lâš“^Ìd¦i…ˆõÝ¡•½ÎµèiTszC¹µÈ¬ 0'?tù— €Ä}¬†±uø. Ù·çVú«¹@ʰ8—ú~ RìF_8KËŽ­ZnY3n5o4ÇÚΧ†¥ò„‰\Ê>À˜ÙèÜ sg%äÛà‰‚îE”•T{|a“/SB_H®•»´Döª"¹ÉGù²~¢Ê®‚ÔÅAZš9ü}*/"ƒ ˆL>*Á]µë&ņz«zI`£Š»W?Ш‘yäå.v‘λh‘šÄZç PŠƒôZaÔ<㪯sة늄 –7¶½±a ƒÑn*ˆæ%ý:ÎéEÔqÆ=Ktqñs©Jr Q Ã>Ñ+"Àg¿€(šL® Èœú!¬Y« £åº}¨|*ÒÚÖ¤²bÕ“—.«êm·ƒ¾øM{\óµþÏND˜×Aâš%-V-³®¨€m‰e}ÃøLq¤ פ½¦ì]W”㱓{ýÈV‘×&ª 'IÏOä´ß×¹Švš-œ¹c2h É€æ÷Ø oW˜ö¦ Ô®ê+¿öÿùÇqÎ FL„zªuÖL0Õó) ˜·¹Ù%"ºkAÐko,.åœgj\ñÎÐ:§C‹`zkBÔ^4oÄt« ȸÕå{ððÄîI/rã4¯³Ð¯z'¬ÏŽÛ#ƒ¶ÉÖIÔW\6 ^/Á.û®¤\qÏKÖáXRaÜ+‰Fmýoí)ßDQMhnL˜Ž ód¯í¼n_´”²~yAf$l£Ž¸ß#?fcxÜ’ý½ç¹ÅT¶¤Ë>G›'5èKšþxúnÐÈ–Í'DŸj-  µc@åÞ$hŽÖÞà·¹ØÔŽ}N¹¸GêMö,5 P`S4Æò f3¬gX°Vù<ÚË+N@w‹è=䯄œÜ™0ö:§ößÏ)¼îûð1Ðe­ÄyÐʼnj7û¢pU@”øG¿·hŒšµëR°Bè©ÂÖCúÈ52¤za@ÁzÓðt4~ O˜/oS±Èµn‚ÀËòvUs—ª/kð‘eJ¨¶ì)#ÄÀГ·8£nÎgÙ< RkŽ§ã™¼ŽåS1<Ö¢AbQ¬Ô“™â©ÆéEWCKDQ͉7tQŸ¸óÌeã"ðµqäÑøù6v#û¸å­îÑ}¦gKÌ–¬¸šp8Ø<–þ÷/“¶ífd…;h´\š›çH…üÅ^ƒÜÝ£D—žÿõ¼ vÕ.¯îY¹| –b/öBkbÉCÔókc†!L$=(Uoüžk÷C‰î Ž%)·ILŒR:“UõÎjá™ VÕèo0k-ËdlcâåÍü-E¦„ÇñcŠ`á© p?åÇeC&jYØ~CïãüÕ{·Ü º”lc55d¬Å¬!G©ÏV!ªKnü#5¦(™¶ÓeW!Äm|z‹J§xÓªåÉHÝ?èk3:„7îur݆ûÏ?så…Ú£äu‘û~Øú¯ê:hêd«´f7Þè©¶÷àÚè,…t‡=8F¤Ð~[4wBÿŽ|°ž~n×ï/©VɈ™e¸óµ"ƒõCâ¬OúÛË‚SMÕ{„‹+=ÀÐGõî Ë]‹"*Eq›Ùëåú³WÄûÇþÿ½Ð^)Ò&6kq£(@:µÅ?Ý!¦t»H@h6ß$·õáp¾0a˜F…iR‹Éj:ûU6Æ“Îûä¡«†aÓo."K¾wÏ’”+±&#õŽœ²$à}*ñjãЮm¹óÔ›%I}µf³ö¯žç†nk̤.;Ão×Óa`kp‚ˆjT°‚2Œý„0ç¼m\€‰ö¡ëÇqæ¶®Ñ*[ {ÍÉ CKÊyÕÖ°mjswhh™¬8Dæƒ_ÙR2»v@qìㆥÉÕ=."#·ÍÊ/´)÷-Iå0€ŒJª[ßLóXk7M=|†SøUš.Å$]»,M<•Ã&Â)SÃZô Æô¤sÍ'¬æÊB“©´Ùì˜ßêÞjŸézZ<ñ¸[\…D¼Ž±ÈtlKóƧxîWÚdõYÏ[Àìq×–óºûÉŸY?´°À×ÏÊj¸‘,û¨?ÞC ZS·iÑÆ@<RÙ¢‘0=s)ü\¶•bJ®'Ç屦!H­îÁx~Ž²× qqGó€§è”þ¿Ä25•ot$'WD»L!°» kRåfÞ¹¢sаý,¾ü„ ÏáNt ’3Ä'{–·ÕÈo9‡Õ^€rB.ø¥R—ik)‹":¨Î … r›äYŽ 3H(ÜrüóÞÒ¼„rX)ó÷þùëJí´¤Ä²&1ãsîá@ `gÆí¡÷;29¾>Á×0èÙÂ\ç/»žæË%·…?ÀvKwsØYŸÃåSkéÄù#÷Õv[6rˆ´®ð@ãÑ ª‚twޝ¹ÚÅä3†ZS (ÌŠ_v”·Êtz5 ê5ë[W$GN:7Ã,¼tvÑ´Úwɇ Mã¦Þeþ<ç+Þ¨¨ÿVû3þ$¨v‡‚RÞ§4ǃ5ÉÉåv­ ¨LíÃ<ð‚ÆÓ­ÎMA,?¡ab3¤Ú=¢ÿ¯šÅ>#èNö"qøêu«/û*üh#~߯¦sM«ó%¹Hèn3κÇËh Ý¿£–YjFé‰g¹¸×s ‚ø²_§¥º""äfmmxŸÚ d›o ‹¡]±BH!Iê%AenUвm%9>@üÙ¡rëËrøD»Ug$‘E±C/¢ï@ÞÔßôÁ(õ`¢¾ô懼²=Š_—D¦í-òýí‚!‰)jãfÑ™oj Ê]ÌÐCW¢Kb[ÞSÝ D1¦BgßÐEµÞ².ó¯Ûv—ª|ÙqÕñÛy]öÈÓƒq„Rò,‘Wp® w.¶ºåÙÉqƒY³«}½u­¸P*0Äý1ÅÑoðŸŠíó5®ý*)ët®O¶?¢ßìüî™tE~gr”hÃíZPðê€XG#“t©U”E˜óõø©ÈÜx‰EØ ¨O¼¸)鸡U[þh“ù#f†]ÏqÉ‹ö+$d€E\þ]Û¤«‹e}ˆkÞ;¢·éÏu{«Ù‹‘lC0n³v¹óAc¡×ÁbMéý¸’ë ì8(& 3hÊ‹ùÑ„¡¡¼üŸFu±ƒ÷®AÌ—3wTŒ=“–Gú ¾•=gŒgcIn¢cñžNHcýà<÷·ƒ2O­UzG¸+$ô¨ouw]µ‚M’pÓ‹mÔr¤Íôú´þ;4¹qKÁ5+@ªãª¬9–§›©¬&ï\À±~ÕÍ} õÑEúô([>ÆòÑöM`Œ˜@>ˆü¼ì¤ë²JVäBåL‘…ÙXsj„»Éíª­lM°¥jóãBm‚ »èúr½ålvÆpÜA‰mAÔ°n³7®½eq׿ÓÖßñêºþ-Î=LØ&û$}?ÇçÅáêÄYU>®GMP±“î;Ûˆ]ñ¡Üz|ÚÌLuÅOô6¸ ã5†›øtzúÝòèj& ¸õ`sø©z‘–¤žÅeiC(£GG>`pFûÕy4r“畳sŽsä£Pžà•J…*Ôúé¼4°º–°p†§Æ7šŒ¹a¢í4ê§c_×aø¸Pž@`³Š,Jkž?`ÔT‹o;²+ øðk—ü ¶]eÙ”èÛ^úQƒh33¯X¦.¼ÒŽÙš ²<'Påê`ù[\M÷”ṫrzà»Sxa¦æ2rüëoFÑcg?j×zÔSdg¿½ð—“¬rø$|Gº9dΘc¥^  ¸¤3:ÃðR¦±Ø+ñfóÜh@sSq2Sb×¾dþ—ꪇƒ6Jÿ#ûŽzµ> ñîøON¿ê—Ò-0öűñ˜úµ½&. ŒòöÕ(¨œ Jì„7¡‡ëàC©õìDTwè3æþ²5δç—Ñaó:$3ÔmÓß:1§=InUÃL»Ú:.[©‰&ž²a#À¼}BâõÒJï ]P®‚>I»:JžL‰/hoŸ7³×÷z޾ þšqâ¨IM•ƨ®uÛ.CK~°y; Þ/µ.§ÀŠÇú0ƒÜ“–X ×çÞ ajtŸ±c‰S |Kg¶ôn:°Â4º3Pve «Êð'ñ¤ÒêTìo4r‚ìÀ–Ž;V<9NÌët÷†Éº¼®€Õ¨%®Y„A÷TȣƵ}˜¶~´Å:ÞR,—âÇÛ.ŠÓÇU`Ê»ƒ%(¯ "Ú‹á6¢g&cr¿Z;gŒFåò:Ǥ`~²&½»°}‘g'V'…;å°ÖÇ]K’ SÛÀ#sbçì,í&U§à¶&@¯±œXaãK§£F዇t#â1 ê+n1¡ÛÖ—æÜð®…åÝðŸÃ‡XÔjyÉЩÚÅ“|q¡ITè„OO‡Þ€TÜðþcõÀ–Ÿ»ñä¹cZ‘7°+)ts„'Qr "Í&\è.˜–49±E‡(>Tâ¢s½¼=ù~*”Sq“¸4s Ðì&£Aù'ø²Þ:„Ÿõu—\êhûü\³ g”7>ô&˜Þ©ßðelìDs³e1ï·pçq‚2FÉwOJ°ÀI¾<ñÜð,Ü­b+Ht!Ó`y¥¬”£öÌ !QkÉE周Ôï©=®&ÏŸ5-ƒN<îHk)hï(ë=Ê!Z*]:¯Iî›02Á­nÓrL&Àï÷Œé:Ç›¦´¸8T!HÝîå]7X2†¨¢ P kE$ãöh‰ç&` ÒVë`{d¶zwå0XeÐöY;Sˆ¢œ¿NëN-¡ºÃhêÛy|bÎ4ÞÓpA<Þ0ȹƒ{´»–VnÒv`Nu:Ü:ËÍG¬ÄZtØL9îô™Î(R¥ÐÕø÷Rm=Y·ˆ$sÕão rwG¾{ò¼­Á°{|Ùs£),„>Ží;A®+18ëú×v” ýûQ’4¦oˆ6ÆŸÅS+¦ÍP÷á³:y@…žäÏlˆ;ìþ0&Ã{ÖL WÉkà»Ö¢:cmºdF‹T4½O…«ÐÆË«dPb¼Û¹!™íI·(|ê¾4”˜”¦ƒð&oêYÒ4”(Fë×ïO_Í)­ú}vò‡¹“øÍ ½¨­üøP}¡£˜Ù1 @AK"Þ5ÞÐ+½…«]“Ŧº²X\Ü­®²£D<ijOˆî¨Þ³7LÚZj^~%,¯+÷¶ p‹íÆTþn“²?yâñO²v ,gpñZ25Ñéü/­¥´ÿ‘‰:IÌd—ìÑÁçžç#_êßÑR†ÕÃZ{‘¼w/[Ÿ¹Ñ7Œ·^ . õêzÐõà JËž“fí¸<± þô×fð …Pá}”Ÿ—e3Ԉ̓¦ (s˜©ÕûPK9 øom¸ÏMA’•ÐÅŸ‰bârrnãš0.&dƒO\×á ÀîÉ gj¥ŒÐÍ–´úœ¹¦ô:ýÌQŽúŪaZDÕÖ妞ÙEmš{–é2ù`.-·$X¹Þ®@B$Š3©>‹7 UPŒ®Ð)pºPå˜&ïÑíÀ¨ð%ÀñÞ|-h*\’ƒÛ¸ö„Ž3Bygé}G)^ã®'p0éz/RpTBMIÅÜxе]7!ÿèÁUuÑÃ’؇.bà§G§Îž–ÅÂjø·lŽž›ûÝÁL8¶+·;ÐÒýQ¤ ã3Ã~ç%à[®“Ñ>G¥¾.E6R»o_ŠùýÐ4'ŒôAa¡ÊR~âkž‹”<$÷0jaðtè‘RX¦èàd·ízÄH©|öp½~ -<˜ë%ç«¥{ t‰¨` îM$ X†–>`ò#§¯XÁõ‡•øT >°œ‚}„·£¯Á.µ³á~OP]:O ^â«Ù"MõîE=Èfƒˆsƹ¤[úÚGÈžX° vÇ› â ïm2Òf=ßVöW¡=®†¶O¼ <¸vy¹¼ffÄ*°ìäqáò9„‹:DÒµ.žn^ãöz«Ñ¶ª.¾ÝQù7QÈöf1žzÀÿù1é±%6n?œ“ÒwxÔ¿¯Ä÷X¼ªÊÅœŒA´¹™:«ÀÀYn´2:ÈÅxÚÇG~ûªâ_èêkì9¯„ÛE3²Å†Ïí$Ý«Víç­·W´åé¯!íÚ¥ýÁ`Ï[Iˆ¿“[.½¦oá.fâÉj5çê@Ÿl8~Û¿ªçîLG„ÞjÆÿkEåFßå’–jeôÞ‡Ës`©bklÒ|ÙÎ7`üÈoâ6 Cç÷ê³ÓÏ$T^ËЇôm‡V)Ûž T…f»yåÒÆW–üÝbsxN@V¹ÕsO[BNek!) eÁU²P~ w¬e“ÓdÖ‰DL° [§ J°ž¾9's÷[;ŒŸV³ÖDU ±¤ÕÞÕd÷G£`ëßB¦v·fO”‡Ý1ÚÑÀÁºh#Ê÷Œõq€„$‘êB%h·¸ ŸcÝŒu£+iÙGŽ’Äkܾ€í\i÷Ï „d¨“V=3ûà‹à¼Чw¦‹>äÿ}wƒ¥Ã ŽFO”ýJ …ýáʲ-TÑ¡[8BA1•ÿÞ³:{ ŠnÊD³¶±zxc¹¯ž»¡Z=úãÛôæwŸ6„/À½m’å£^ºòÍÃBp£gGÞѳz6Ç"`Y¥¤ñeb}¿×8)Nê d`ï!DOØÅr·Y“îmçÏï:MÞ\¼¤­ŸHW±Kü6¾°¿eÕvÚ}V¦+ßO4 Îüo”Ž©@––E»{„_Ñ[uЋó@+eîK³.½rä®uæ_¯&XIܯӢ‹6¶‰Û%]¡ê%Gµe—Ó&´Nv6x¥cñ¿Ür’‘q‰Èƒ7£%B/' 8mý4)½ Ê!ÍRŸ\Ö\W\å§Cd f ±oÈ}¯8&¢fÑ'Ô¹[½JÓZ§¡ø°+$ŽK¥Zýa.úʉ4Ù•þ;:ëy÷E`8ÛR3ÖΚ„P?CÆÀ¸P{yÞÇãŠLNÒbfx0¯t'†œ‘‰±¶ø‹%jaö­Rþ– n½¬è&>»L/¶•Ñã –=?ªnê3;fû—.,®r —ìuR†Ø»b<†gò×ÈϲFSB½ ûe»[h÷‰b¨<ØšªM_1ãsìÚ®àñËå°X­·îaÜi\#”WÙnBUò-O©4°{=*Ì«x¨¼°®»YæûN®)Èx£1 Ÿ2+DðdT­S, )çbbØDÉn“n0’VDÆÒ ÿ–/uYgãi‰ÌÃ&í€jï‰Þp–p™}<Á¥ÇêùEZ>. À‘–Ý€Ï^ ™‚˜ u®•€¾+€@®œ½߬®jëk/;#ƒŽ–èïT>ßNÌ:&7Hš‰oN4éæµlÚwP5‰-Ýn î&(&ÂSÊ«D³+0à2ÇÁ­™›ÌNeØB Ý6±îfø³bM‰Ñ(Iqíœ ¿ª>æßбjlÍÇdD]ņô餫‘†ä¾}³­Qʲ²:G"xæ ÓøÃ°ý`ÚÏ`PÍ´×˺Ôu(©WÃ{Pöû(б Ñqh]iß„0sËÇk,´×(ŠÀ º|0#ODùÚL‚6¡VU\É~µÌ?•E´6ÛTHI[bâ¦Hé21² w2 ë€xæéáñpª[k"Å?¶ßQäVƒïbÃýuºô 锂´5ÎI”¯n;èDZô­<Õ?åjR8Ý!ó~¨•øÝí@ƒ1Þ/¤ÝjHè¬"<(¹â`4»·bgzQÍFr»=='ú/f¤VyÜò ó"pÎ-(÷ìN`ýZ±¯©Ú;Ho°£L2ƒüu¶ ¢ Õ85šøí…‚Ki­Úò`ÎJûäwïäjTêÊ`_ ÌÇ>³<#©9¦£ùרfªjd4X ./¨ÿ—DJÞÿ(sò¿jxÿä#?uØ µY u’’r”Gµmµ´é;x•ÊÈgK¹¨ºCíp5Þâ"µdš$ž‹ÞúÂy ‘Kì-m @…ÎÇá¨ëÄj¢ÊÞšìB*2Ijû<¦z¤x®ìºz7ô·! –ð=æ8M[&,z‹¤R)¥œEõŽ`ñí#h`©S­¢!C^zØpxŽÁ7@-fSe³¸DŸdÃÌf­.`€¢Uù§ž¸§¯„Cƒ ̽3k•îˆü¹ÜXh±ëÔgþ_*ß+ë#Ãö¦Ð{·Z¼–3Ó˜×öÔ€îÑÇ2<ô>HŸ„ñ™â¬·Ô|x o¡˜¹ÎŽW–2ZaC•÷ËV¶yh 8ðAªò—e¶œ£¤Ò(êI¹>•$~Åоá¯Ô$ØPÞZz>÷Ó …³R ©Û:Ç‹.ŒSõù-Ñß§\}7´Ü. E7?¸œ¤™«ü6+ûÔÒÝÕ*ÌU²´äÎGꕨl.‘eÃ|pt¨lä$pMÜ{ÃURtWgkb›rõxQnÞVi;‡†AN.U¦(ÍkŒ’ï·ÔöD~*ƒŽWN*׿¥"°ž¾›~/Ø-¾¨a^¼Ö“ÞKîbä½oX+k÷³"âŠcs´I‘xM¢É=¯÷æ«;í„G_z9ˆù“_[=bõiuÒò{ý¡C÷…àÕðyóþƒA'ÎÝr»@"[Óý–UGp%ž˜¿8œº@à/Vˆ­áFwOc¼ürÊËgG0øˆN•¤AT¼!É\·*¬¾Ø0³þ¿ØÃÞ¿ÝÍâzõè´6ÿš ˜ó9ëÛ"èh@‹÷=´e3ŽÒ L-b‘ÈÜGïH&©v°·s÷8¦Âzû‰ÎÒ¤ ·x1¾ÅS“”hQ2^ÿ㥯¯ž¹L Èê|\vS}ƒ¿»O1²aÆÇîÓÕ­2@Û| <+ßýþœH¾¤f­Dæ·ÛÅ‘¢<&p–ü(åâýõˆo©W=cÛ¨ü/lÒŒu&ö"Wµj{pÄ‹!aŠ–8q—tX"ïã= F3^ãÔ21$•ZPd¨ÃE|s¢ÂïËÒö“l}äåp½ïNG 5¯òÏ‚pY»õÛ^JökàãáûoSôiLƒE«à¸N{Ê2½]äQÀ ¼±vµ³\GÞÖ(º Ã[Uƒ3¦LñxÆéä5`(|•rÑs‚[®´÷Vˆ‘«…7ð¦­Ã_»»/á ¥ž;ÇÂ0J †ë·¨©†ø[…ñ#°lKN þãoV†ÿ²GZ“ÍE(ZŒEÆÝêL“ØÀ-6Ó¦yÖ:â}]õtÝÑÿA¾„¿Y–üÌK,›~íS#G+Cßµëšó¦á6(Á¦ÊÕ©N7ԣ騹¨î\TbB æøÑ톌û}\¹~©Ý.•u4¥ûkQ›SñZ©ViÇmÑßet[±I›iI!^Ùvà®ñ$NpC“½¡¾Ã­H£wCdnÕ#²ucŠ‘Ÿ±5|“´4Z8Ýà‚ö1i¦ÆPÜEôóãwp¥š¬‘„Ñ€ê&MÚš4øla´…å'(k‚ZÇlÓ o¬ ©»P„Š¥bˆ¯¦ÊdT¬þ¿ð&„…Œ´;…'!nµÊ'‡UIà7ŒbZ{–ÛI›I­ @Âågâæ|À¾Ñ%—ÛCú‘²(ŒÛqZðâçrkˆ8,Šû8²¡­…Ø’g_ȸ׌µävìþ_ŽŠ—ƒ3þeaÃc¾ãÞSûß4û½b›ÝÄçϾ ÐßõC :Éôrðˆ7ÃPˆìÿÌÌb|Š=H€ZdwD5¥‡Í³í…'“¯˜Gô³6uÖ8´Wß­lÄ}‰~‚¼‡è,Y׋3ðëàãy çGü«KáQÔy.(Î{Ʀu¶«Œ±2ªJ.ñNªÃW¶¼ŽŒ¦ž‘Û«}8!uZRf%ÛÏñ¤´Q‡?Êrù”í™­ÃONÎÅ¡ì½V™+™cþ8˜'5—!!xFÐᬽ‚Ö„VP›n‡?¹oÃ*=;˜é:qI½# Äù™’¿°¬Ã¼:i¡5ðº­Dcü†Ç¦a÷‡¼[ÆéØù-'’½E~YgDR€äÕKâC#)¸Üt²:£¼Û;ƒ*÷„å¯,Ò-˜ µîõÚ¸õÁÂòÝi6$-Ä¿¤*ùõÛ:L«^„`*.Ý‚œöY½‚ƒ½ î– ǺP7’çƒqLuñçøÊ®´ªØ ‚Sà‡{ºGÞ©þÝ€ªØW†psa¹l} ©4wDˆø¦U!­ÿ’ndˆ¿¼Ýn°­>ZfáŽÇ„L%Ö3á÷MÜ"¡o!?q0Mñ'&Ç)B' Bãæº!jiøïÏM‘Â’ŠMöÜÒrÓˆ/{"'Í0Ëž“5Ãé(êÎHq %žÂ’†íÓº1×'þü—1Œ<Ÿ]Ä!…ƒÿw¾ ”Iæ3-̳á›á+C¥!–Z5ϣũc* ƒ¸½P*j%¼£¬ Ê´Ç<V¦6º?í}ôV„RXºØÅÁó‚à6jÏ[gÔ‚Øp²ßšF‡ë©m§» TË;3uC¥„'ÊïÙ4òUÁW>ˆlé_9¼GÑ|Úˆºïgö"®;ÌÊÊþr9ü îrrØäظ×r4w%tãmKzu,šþÇCT®JhO¿w±‚î7çt?:‹f1bšúàd÷öNBDz˜ÙŸ½a vÝ<Þì³þY7ïÞ&¸`9ý·÷éùq¸\“J `3 ñ›¶3 "úAís̉0-l;N¦óm Á.¯&ƒ‹L¨ îPƒ%=Õc_Ò¤îÅrp>âL/ í¹Qr'!êˆã¿-ZÀ1Žßeµõ'¬´‹õÓ#Øk¢…šš‚uûA·tÍØÀ߇bª‡b7¡Ú™´‡h´Úè:ËG&žÜgÐ2 ¯¶é‰äË»ÈrUÇŒ?¬¯r£·? ä»´‘‰½²gY…îµdQ¦Daú:œ JhŠ„i‡®¤¡çêZ˳÷ã¾ÃdöLdÎjŽTØF²yÕB)E3š~÷O Ö¢Oµj"L¬Š®gî”\±‹ÍL·†¯‘]ýÊLæŽ[«å×ïr£U·jjëKÄÓ!–-eKÜÇÐEÕÏÎçÆ½§øýêælé\û†¯t¨TÑiºœâÊ計E ’÷”‹¥jÓ±·韻üG]ßXúÙ-»e-f9ÁdïèÇ4§Ñ„±ÈVs¤Oñ”$2þ ݄Ļ úæI[.@ŒîW)›Cî¿Ï×T5¬qCt¦ÐP3v ͹%©…ËÿO¿~í‹íüíÔÝη¡èÎ5+ÃßÄGGb<úçeZq[„¡Ú½ HxôX¶€4©a ÙF¥ì×!ÐyŠêžFD(ááéÃÜ9˜ºŠÑRF¿þȆÏåψ k ^hŒlû_ \Y§§Å%m—D‘!ÓÕ6-Ư¬”?H´Ò»oá5hûì&©²"ÓÓiW}°G41Bíÿ@6^)»ÐG¸'äo#¬ªd5®Ÿù¤ˆwý>°°¿§™¿k¹29ª[¨a¼&£Ýhøe{ ¤¢âÙÄŒlE ç˜o  Z02WÛ¾³µáTŸË§´9Ä!\ƒL¼s!;†‹‰wTÇC)0µL‹IáZ£2Ë5?…‚_æ¸Ïþ˜òv}¹±ý/¹ÍYЉkúR-¦ˆƒ$»+éA§…e2IWš¶Kôº1(þCˆÑi̱©¯¡<ûÀ—uÅ4×¼Ë>­Ü“ÍõªÕ.#s÷0Q€qàÍ?@ê/¬ }Çp“°ïz—/ ƒ~î¤ÔoÌ\L ¸`˜G‘ûª—€LYé 79RÙIh&¸ðèê¸à•¥¾†·×ÐëËsF?YŠpŠ[ÌÒ@J&W6¯ë¦n­Ä Xj£›"z9 ÎÔÁ#˺ OþŠb”|EÐæÝìXXg¯Ö ÿè}uHÜíï,X›s”m=µ¿ /b †ÔðsË1˜†kî’}*XëÍïà£î·oµvŒÔ¼¥Ø2 1q·8@;™°×ß;Ð<+¸5>J:7Ç–ãSÅCÊî”h²ÉIå³ç%+qÄËÞÙ¿õ|3hvôÊ gèD;+ IJžúT±¼&èìÙ3(¿Kµ5=ßMÍëŽVsƒ˜ÊR6Ëûuš…×䨲ˆ s;nש=•-k¥Ò½™·ìèlrvüçâgÁ“é÷ÿq  ®»Öÿ4º®JýaÖ?´wø4g( }ëUkõ^®{^4ƒ#Ä×ì~æÍ7¾N\Ö\Ãþö¾B•Å@6‘x0ýG-ßL;%{ý ¥,`ï3¢DÀó²v‹SºË”oÌ}Ljdʧ¢cOo‹ÙÕ’š»è®NÈ–¢om̪ Ž™û§… 0Û<îl«a*0~â¹É©<$uX ª¨T±Ú’Ê-IQ;Or”j*¶jq«ÌÜp²VA©÷Þë$÷4¼,‰LHÜñã À š_ˆS CËùÍå¬IqSxHªŸûþ˜Ä¶j «@°õpæ 2“Öeº«Q¦û'ØC¡ïmkÏJN]‰^’Ô“rÄ• ‡ÑŠý¥=hUX9·6ßb«v.ã|¾Î¦”úaÞӋщý…:¡) 1Azrêrê䍿‰âï—·µnù´QˆŒ» K‡ ½gE:’FkÁ¤Žä2ÿQ%C@ ²2_ŠøÁ€£ :vuqe_Ë®Möúà2àáè°—á±Éo•=—³[ðè}®Ï,\¡ÌgvþFK ,Ô¯¾´~ø"ª2áÇúPÚ æöêÃl6\3÷ĺVsn§R¼ªÿröÙ)‰‚²‚gÍ/è[Ó S^œß™Z2 3&&Öh‘¶¢Âð Ù²ãETÓ^Á»ÞÿkP™ôÁŠÌIwÎè >ІöI`œ}wå²Ll׉z‰Di æ(ÖHtÝþp8Ò­/Ješpy½>½¾aÏ~þF$;ó£æË¨äò¸þ•((úŽê:kaä ìTGã-s àËõ8Êmבp€,|€*yx•±›ÑYu©XvØýýàÇÌx†qÔmYgˆSáËÀÍœ&…ÓlfÜ’tŠzó³—\Ð§ÆæõKoáòV?yRë΀ÆgˆP8B­è1ʸŸº„|A=Çmm¼µŸÁÓ$V8"غ6–»—l¼¾sZÛÝ¢ó#™›ë„éÄ©»r ^¤&×jÂKT}Áåf"Rr!—讹šy‘]€d|o| NT€¦!ööiQêûkº°ŒHŠ% nFõ½Fq––(RÚaÝÕ ÜÝmh{Z¹Â¿?£ºAW€uÑg²Ãzn“YpÚVRQ¦[š Gµ9!Ï,¸ó[ùhH'О¬`¤eþ‡Ü¶ÿü„¼Ä%øâš7ýÕ±› ½$þAžïºÁwWñQiŠ$CÕŠ®ñ4ù·È~3=õ˜~UVõ+î+mHd~†Êï»f´maÜÓ–jcöÅ{<¬j…5M¶=ò¶„ãfwß! Œ«vNQL6{b=§:M¢€Cªþök‡?'$Ûïϸ§icÙÑ)1·CÔ"j~Sõ|˜W9(,óH®¼t‚ÛH§ƒ+—ÛmŠéÍ‹n£ŽV÷Ýþ OM’ß|L7XX]jÅ¥RΞÿùXý_dÁ µüH‹¸Dßa Ý« Ÿããþ“9Q=¨e W¬z½R3ßfö¿3ë–Ã&V+ËDédÊ?ȇΆerâ_A`¬Öv^ØÖfÂ_x 3)ÍI«Z‘o×¼ ÖØmƒµsÜ9šÍ'ø_J2r”Mr¶'AsùQÛb•jppÿr©Ýׯ;¨¯O<‘?GTWäãLL9Ÿ6B°‡w:î³·n¶ºyÓŠücà DI߬€±ÂºMΩ¥¹m[K8^”Á“¸ûɦ”*œpݪFæ·[JÁLÇÎÍq“í§)¼'FÞT ò³Ÿ<T/×FÐ Z[¤šÔ¹–áíº±äyAôôëPPÁc&+²óéL"ŸQC°<úä[Øß$ƒ$ÒÏÏá¼*ÑήSãs~ÈÐòF9æS+Îmæ­RÆø4Sq£4‚A®þϸ„c³æ0¦LÊæÛú¹¢Mbª} õCú˜™9µa·¶à*‹”8ðœÐ—2Y(¼Êïf<5Á–hÊ!k<¶y—¸²½íN(ØZQpº“ÅN¼ï?‡ ixÌ©‡ÅmùJ×Öó(':U“fâHZã–½è­q#±dHùÏe]¨rZµD1~Öä6±f\-Vovz]Ód…ϱRžºB^=¦<Ÿ]¸fÈ:§Ñ±Œi§¢ÿÅVÕSð;Iz?WGÝýk·›á°¤wö'dEW]ÄaÃ]a8¥ ·ÌöµÍÐÝ„ØM±£‡US¤l„bQDÿ÷€¬ôƒ»¾e æ6Ä—©pÓd¥Šå²Y³L½Ô!²c¦nÉI8§^E,K&lŽqãÇ;j@z6eTï¾èØU¬k¼ÑH-þ©=7ß-¥BR3•@,[ÅïëÂ>¥è/#$†ÍÕ¬)D‡,œiL_÷z—†=glˆvëx$þ.Ôç!ÞlŒ|o´Noýyÿàù išŸM1ª$Ð4C¿w²þ#Ã…i„yôG¦¼öCÎéjÜ:è±í³Ö5â’)ªû[Ãï´àåèâßš—RD‘7 “SŒ¹ÆToÝw–¼úftˆJqRBÒ×!«D¦† ¼3ÚÄ dŸÿf[°êȾ]9»Çdêa-†tŒˆg h–)@Ñ_u%æ'®‚:‹üBÛ0[±iC™cñõ8ÿ$"¹LGA€kô2ç‘ú³7e«JKËîhQ‰@QÜM ÅÊ7<Âèv‹O˜ÃÀ÷©½ÅÔ`=­¾6ÅP H}rìöôpaééz¢ifljË4Ú¿»Èp½˜jsæ$¼}Y†³¾v¹°noècfA%·¡Ö ~4<ú¸¥€`Ÿ°¨îå4 ›LÕűìñ~î¾Ä?N3éä|àÿ¢Öž?·åÞD á³a2›d Cã6ÉC[ß²zèÖãv4T}‹ç,®p}yyAØVárí)Ý¿lõba‚ù­üû¯Ò1‰;pütglY3ujs9ø¹‹U©ø• )ýô4- òèà¢~‘}Ûv¬Ž’éqÿ4V:ᆠ œÙèúK¹< ½;h}“ð ECûÈúEDÉ’+ÁâËe`{êÀ` µ6iF¦¸#oÑ Ûñ":y‡ Ruö~qÒ"O$ŠXTßš6Ñí•N ö+±+tXoOµ»£‹Éu·Ì„ŽüdÀìÖ$¬ºG4¿ŠËÒ›¥¡!9GS"-pmYqÅÍßDJìyh2é3Û¡†l?ÃKRø v_¢*4†½9ŸÍz¤-!ß”èͨç^öDfö{›ôÞo‰gyœñƒ7´X⼦ë¶McO™ŠñDèб¼#(CáNi‰€“uØv&¡Õÿl„£QE¬§6 ì¤üšñ² ‡Ñe‚'¨Ê¾""O-ÑÕ+¤uEmˆQt­™@ w­Bš­oÌß0)#ó2¬ôRãÀ˘XŠ˜}Òôt]fwƒ˜U‘VEÇ…R}8òˆ*ˆêrΟé,Äâ„5µBÌ-¡éåŽhÞcš©ßm¥úú‘:®¾‚UòtEGÐÁË:Š«…ø|)×õR[R> ·x4˜0#öŸ—€cØžeçBG:a‘ ¸SŒ5vè]1 ŠÄö“z÷›Ñ[e[Âè#©AöÑ¿‚)Ï…?)-oú|ЇʼTl5(µ½Ää"ÂÕwF¿aI9Bl24Ì?|±¥æŽ…ÊoG-)lä›Ôÿù1 ^茖7›„p诡íë^4M”T ÿ—B~mC]•|í¼njgÕD˹\†w ŸôàúZwƒk/¹×Ç€Š˜@ÂÇ­7>W–¢¹‹¡Çð¾Cê]•/‰€¥žŠe”à³ëá@º<8wögETàeõÉbkžâö-²§%ÙJòK1ÔÂ3Ѿt…Úés3Ì&¢Ƴdu‡%õMor¿þ©ÝSeáÓ‚V…A˜ÃOÒHMw·&Oe+™;qX®.üÖÏH2Ë›¿{»ÎªÑ{ÀáÂö_pJpÏoŸ­ñÞ‚ÙbƇÞ7B2f:d¥ä7æÌæû™Ÿd:.Sx>o8Ì {UiÏEö¶·×7—ÖC9<NuB:„_S0®G xö $º ë‰(Ç mHs«}+h¹†´›@´Ð•·CYAM\áLáànª" @~)Ë”¸5õ}ˆšlÇM‘ZÓ2¾Ä…ó&ûÍ’™³#Uó[Y± c›¬¼›x$U ôøÕ™ à^ØüÇtRžo ¬ Tâ‚)¢;15ëÕ¯÷FÅs'^ÈtÛõx9áxÍÊ“òq€è¢Û¹|ëÌX¡ó Ä¼å±lÍãW$Âg¦GèzrÝ,_}¢˜6=ºýóA îÕæoEÓžðŸÕ¤œ‹º,×óºªf6Ý\ ;Ãâ˜M°: ôÕC˜¥™, ÿS%—Šp$Õã@©Çˆ P~.Zå…ö æXj  sœ¡ -j6Åž‘ºC…Êu%|Oq #ê’Ö–í~å—ËÙ$±ÎÜŽP/’´–]«CN7t˪[–¢ò%ÈÂ5L“ãýÒô™tSµ² óU=åJÄà’ÒP?¬…ɲËü2WÃCÔ•w j)tλղBÔ*O`¤°»ÑÁ1XÆÑ`Iq@)±Mp€˜ì}º¼‚ò8tŒ–ä-?y`É”¹&™¯ª–½Þ¡‘Ÿ—¯»Fw7f;7#7¼ôˆ0¹u#9RÐãýŒ2Ê1ã‡^ù?x«’]gECÕì•I÷;-T-,´ƒmY>!—Ÿ Q€µÞ Rvî4Wý¼RÃÃÏ Ø¾²ì|Ûy$i5ݰ }&i\%Õúò£œ™26sL¶‡eœmò3 8¨öĦm4zNiºl–³í‚¬|Jؽ Z¯ÄÁwë,¨¸©Lû *‘ùêÇßÎçMì?·pà#™»Tˆ\¦Â°bÓϙ𡠬#سÓo¡sZzÇÕ² îw‡¨T­¾/å·†|Ê[Nðl o)ˆSÏBkNçúúú~OÜþÆ[ø÷™o%¬Æ–¤kѵQBßÄ óÙ™Är’É|_&*ʉžØÎö@†Ao©7º¶£Öê‰×5ÿP~ñª­„Šå|:U*íËÚá‚hÝþ6uÈå`Œ`§puzý Iuaw‹ð>‡¥üVÁTåÀ®ÓoñA)›æm~ƒÅà›¥¸f7šÎ¸WZ¥üÎ'×Eæ#Ž4)q £6@Ó%¸Ÿl`¡ZbÄcëð‚ùß#¿Þ.Y@G€Î ½bjw¹ri_,Êù‡…Ù}Î"HÔ13¡Ì9c‚ÐÍïìÒ¯`ëZŠk6zW3W ¼·CEdšIsSþg>€;ãùoÕ tÖ`B]vã²1ôÖ< ƒ£XﲟúUk–ÙÊa½„æ¾Ýå”Ò¡[öŒ<Ðxë•ñËËÂØ×¾š¿m43tyËa,@<Æ‘“ârU¯Š Ë¿¢‘Vƒ¸Ç ·Àh§|ÅTT'Ë#ã°«AÑÞyST|ÿ`{“Çá™Úš[ˆ"®V;`@6l­Nx1ÑÒ?¦÷–{ß«Dâ¹küy8%Ą̈(õ™/(’TPFXö·>Û-£p¼„Yêîíy§sU?fÃt•¥ úí˜ö[?W”8)MS„¶RQÄT瘮9‡[+ÉO')]¤šxß`šú”Çy¯”÷àD‚¾Êã~È`ÚJŽ%€1̤`ö)ñl³lü‹FÊf¤uDRÝp÷¨1% ×ÅŒ[í9,ÕLÅó"3ˆ¸S·× áÝi£²`µb(£ú*©†á¶\48Ÿ›8ÑÛ6é4Ìi®µÆ |»Ñ÷|ÚåË,_[¹R(]7£·ý\ýP@i²!Åh„,ÌŽ—¾ØUå%x}çø?ÿH ÏžfÙ+ç¼Î[á^q«4P"þ |UW´|A4Çï:6Û‹æ¬oHŠ·?dF§"Lö¨8«…/Ðߊ,¸åï æÎÐúT <îej[Ð?@³íBvXÞ¿+»§¦ 2 QT|ÔÌ2!Šê¦SìÝÆ1šoEF“i¨Æ¨&â÷*ÙŸ&ŽÀõØ'ý:œO9 u|ÐÍ.«Òˬ ü æ¢age¶¦]¤Æ¡½ &šÚ¼s¥ Ýç\Äv!ë%o†ö¥4g`쇶ޜ É+m1ò"dx­-)‰pÔÛ%Ï=¶Üw¼|Ék@èƒÙÞ_‚ì 0sYÕ$%”@0ó{;ŽËA¦u$u­ ëü¼ã~Ǩþõœ{Ý€eÂ`Q+Æù-}®îhˆª@L>0‡¿ì ×Rº½â,@gªºœ%Ü3;Íér ´qéfÒÁ "‚o󼯪yÌŸµßæ1â-Ëóz£ç¢Y~’’Ô¶¼cTAszÖ@¬†9• )0Ý×whD:‰ñ÷ˆ-mdåŸ;¹VPšG¼’Y(ÆOÙÊ£g¶¹–ýa yN&§»#S¤µÂL›±´›\èîS;±ÑÓìõÝ”îÈá®ü$Àai2´ïŠÄ^™žÚyIe œØôï³”lÝZ¤ÏËyV:U>'‡è™}ªÅÊÿ<¡U©C⌿Þa+ùÀïÄÌùÒYŽËÒ1eÑN.ÞÛä[Ãhðuká)ÛøÀÓ¹¢º„[†b²‡ $×ÖÐk†]Fþ<Vp?˜ ‚ â©ëÚBÃVí4:gºÿ^Ë=Z³Ý‰D÷xtn´Ñ¸Úûßb,YíŠbˆ¿ïJdt¬C?Ðb>HÛgóÅ£D°Smukv9¹.u|h˜5Wü7=1u¨/ÉžfʸˆÖ&ßÕ Àé£'À5ñzs‡–™€œ~£ ”bOm¹¨@8‹f# [#Q‚/_xÛ¬Ÿ¹^3 ,SFmÒ%;I»JŸefƒJ¢?ñLRmœ_ 7ì~$bSI$ˆàßÙu…{m¾Ð8]¹ÞØ(°œÑáµeTV˜Dóó4ÖÄcV^ëqÞ1¾6ΫVÑ~ư>fú-W·$ v bVœÄ¾è;}Õ½³SŬÎQ!­ÁAÈŠIøõšoÁ|7ý»È7®A«s¶y^‘¡#óß;U „Lí+¤‡$;°à>}«&uÐþþ@ꯑ°u<ƒÆÞó¥¶vIh=Ä7£8) hÝd0¢jÖ…ˆ&Ǽ"+7Ý-öFFK&Ìð#Gø<æ‚U,û“_¥åF¨ a¿«K‚B#·ÿJáD·0 ‰ÞÍ\å’­œ£wy/.{Oâ¨néâ i|¹t󮕇|ôzU ;C‡HK¡¯‹ù£§,45Ê,ýÅdŒ]ÛXË»,6QTªz}#†œ{)õ5ðÐÿúàÅÈ×Hè¿£hïQÏÇ·²!É£…“?é0QÙŽs‡Ü´m0J¹Û-ô]¥N‹¦ÐÄ~›7Îë¶›5ûª’üÜKí>yß6'pú¤L~º¬ú˜‚Û¤2 .ëÄ~w¬´[uïê)¼U“*Õ¾ßk+’ÔÒÛDÏ;BBðè68b*mÄ™f‹ý,2]ovìÂlëüÁ‰?®’°U{&u;üÕõ3ô&þIAÆ=NëF¼É­2:uUö‘&“bê70v;–®Æúwˆo–¥Õë¡[!5¶­Æé£z޳9›^~Ч®Ex ³*/ˆa' Áœz~œthùõ ‘kÈ9€h«÷ŒTÓê7`e.õúôø\ !Q8ÔÈ•/ïÈÔ?«=IÐ3ktßý5•ñ‹²¿·nÊŒtqëuÉIÄ`7ýuLZ•:v°4ˆ^ž‡wŸ°¨\v÷‚ræUö%L„™¤¢7ÇvEÿ”¢Ï¹É†«0zN0ãqµSªß“@Ôø@”׈f™ú xèj%F0ÿCèýu'yãÔh³¡KXÆ7<4C»˜9©®å“‰CVˈUM®`èZÙÚ/Ïø‰Ô‡Æj²N>O°®Ó~HTŧz8J$t¢}W²Ú?âü£-ý¨¬ÁñÂÊb3ÙÝ'†®;œ›¢'·daâÏ1z–Z(ó ÔF$™’u–{µ'ØPNqZÃ&¬…3/jíVG%¶q¯‚GmE J|.ù 3‹–ŒoH̊¢V6ÝåÜ4dävsê{Û7ŸƒÁ„ýPB4k“‹P4§Ž„K`X¢wh)xe'Ž¢åsr‚rº°g%iêØæ¼18¥áe*ä·Æiº¤íÚºÖOpm4Ës˜Gç‚@þ|ZtÅÿÊJSÛu½‡ËVüEƒNEèJG«˜¨£g‘‚ÁPW8æ86ÜzUbÙê3~FîQ²·¢kØBúHáQ!rs ûêmÕà|…)<ð6oô[ê /~ÆÙTAÃ1A½†¬æÁg¥&ÞñªÀÜè³qˆ`ûF!¨OôÐ:üáôkPƒ·<ÊŠRšÀ¼) ü~W´u"Z!®.#ýßHüóÙ2YdD€¾ >&BM¹ýsnd£dg¿x°ûïs‘£Ò`Óº$Ù‘F#'Ú>a^5M*:zÒdëN»4Žº³XÒ\09 ~ãU[ÅÏÏY“^ô¤c]* @Ô¤Í" ¦žôôk.Á…›à’Uš pjDTºQüdÖé}‰tAr\MÔ$ÚÕÁóm½øðØI­Ø\»a{R€tôÊ[øȇùDÏËzÜ©pëvk¯ªÓWÎxšsµäеæÕ*Ý;»”œÛwäpÃá"±Buг*¥cêb1öuØ.FÊK w/öߨKôIŸ„oÒÔH[û²ã€ÜìšYuš°–gI<Å;ÁõS‡êçä|hñFù±0&ô £†M^­t‡&­aÍùÛPs2‘° ‰zǺ€ŸØÇFAì†@_˜TÆõFµ{ö–<’á ÉÀW‚… Á./¡·“MBî/!†TÊ)‰ „+Þ´xj]ÆÅP|³Þ9éa$e&Û iŸÒ•ØX¨ +å+¸$ÏþÜyGø¬.T„Éå·  oBeRQ\ôÝ·NAL$üY•Rü¿¦ŠcY¡‹S´)yp±“–Ú †¸?Yå“[ÌëÕ"ó½UMú”"[³X3‘ |þõ²õ™¹HÂÒÏtÏIŽÊÚ˜lþ¦Ö¶<ãÀ¡5 aë¥Cf±È|êK73#¾6-×OÂAó¿û×Q4‘ÍðÐ¥XUÞ…ZGׇ¬L™Õ9ûŸ¼@y¸qZ§>¦Z΂£-qòÛ‚¼¢é’B79yŒ’x!bt1ލº³°¤.TBiý€¹bŽ@b'ž[‘ä¹S9ºO[ =½Ú,k³ƒtSêç{ÀZ>‰'NBê(ß¶”ô/ù½¤~»?Z/ˆ¿‡¨Õ:z n+´Ö9Uêô+FãÜáü Ò–¨¾±dÇ©c-FÙ®§BépJÁ”eä1FóÆ(4¹E; QJW%êw'UÌC·!á.k„…€ïÓÊ ¬’DRoÀüçüw£ä @¢¯LÜõ¬™FÀ]ÿ÷¹›ÖÑya9ûÄ’´vD‰”ÿ§•¤ó,,NzãWìÄß!i+?·6ÒxciЦ¨Uƒ0rúaü(/Fìó¢÷ñ?ªóÇQµx“vírà”žÒ©¾±Ã2uÚÐ'óvJgö ˜Žé@¤æíŽÂq»Ûúã¤çè£æîà¶¢¹ J8‰Ðœ½%kËÎriýŽã"o?ùzÙÄgÓŒÐ(‘\:Qæ^è1ô¹„w™åÈÇÌâxTmqD¿©¹ ûD¢ÛvDK?)sÙ‹”ñŒHé~/4›ÅY[›‡+ÿ®9àØçøæÚäçúÂfãáSŽòÓù}úç^Åðãø ¬ìôÆ.[ãtYû9W¹PxNÎjƒß¦É«Ü8Öq*d‹ƒ¯¥½0k¾ÐPƒp"†ÇJ@<‘ý@£HZ¬‡O–n¤QC }Ó‰¥ÆHkÿø“‘!¦¦íì(²‚=d¸…’pôüÍpX2DÛW6…÷÷°Am’æ+d“-“¹¹#œô jM¿U¸Èbù^د³^Pýþo»¬¡óX2Þåß›~ø~Œ-iŽ¿,Ý'—éÕëˆzäùý¡fi@¶¢ræ”Ý>ž´ÝzF$Y1ŽlÖVˆ=Mê–¿³·ÕCðëÍ©ŸÔVH¾$ ‰àø .îøW{÷šÈ‹ÚîÿåfM耟ÒCrÖû˜µ4÷_c¥ÝÐñ\î’R°U–ôµäª9ä1©U‡”u6.¨»©—3‹x3²ÎRWO†šŸvÄq­RQ¡gWœsS¤ðë<ŒU<¶ë4ѯYñEÙ9ë\?šS¬³O Ý¶ýÒÎÎékK-î¨ÿFˆ‡ê·¬ 5šã4ó¥Œ2Ú1e& «¯¢%ŸU£Tu•ó „‡Ñp›ëëwqœá™‰U ;^,¸Ä{_!iÞççrÁÒý¾zGWXaW×XaÝ_æ_âí7‚:êÕ¹¹ò˜`ÌR+ÉmÄ5æ0WçË´á²CÔÓ/Àý䘅¯°qzw4*éÞ“öM“³7+‡ ‡Ç` Xµÿ¾ïù‰ÏÑ_q*´Þ²½8z’ lüö›³òW(·“Î2^Æþ¼•×íÀøh¾ê,±Lì¬0³UJÞwIüw{:"°´ãÝ G¨ô×3¯Þ„~ÜøW[ŒÖmxµ¦TÔZæ‘á¾ÇÅë¨IÏlØMíó–eD'y̪}¤t*žWu\Ø—ÆßÚõÖêÔÅßÀ¤cg°ŠZXÊ·wyoyDÊ~bM çz›lÏFZEB¯\*Ò+›Âý½VÞ!AàD¾è±›”?ÿÚvÿŽb"™iÔ"G¤²§ÄkzC›|ãëLÇšÊ|>y¿idìs~¾ ¿¢@æò•|.Ãc¼ùç”·â©´J²ÍEöâßr mÊAÞÝísNŸ÷§%ú 8.y uú“~¨%¬'"ÙÛ¶ïì˜ 4Án”E’;Ïþd*!èË 4ÑMJÙ¨Á´ã[s\—1PžÍIêØªàrüHéQl ih¶‰Êw-ŽÃøÎÈNØR2(hÏèC>?\-îaç²âZª¼¦u ¤2:m1½‰Aõ®A½Cp¼¦3*ÒͲöZ€>ü·ã°QKp°FñµÏp‘„c6~Ë7•a¡n6%²º;£z6 -g>ŠÂýï‚–¯5P^/EŸ ;d¡O¶òP T)1ÈÌ¥ð 8¢/Yìðw™[¾Ð)dôUZÂZꎬn’—ÁT®GÜhëy1–Džå™÷W{îFØß‹³'…8WÎàâ|32µ`—·3øÂ9>©«Í8¶rö ªòÅD'¿z.Ô˜e†1[F.öž'èvDC‡WBfÿÞÈÏ£¡˜Ë!j!‚ëF?»Ç‰±¶ ~|&àÇd‰R.‡•æ(¤Ò *‡"êDÀý,pñÎÊ¡ê“I:xžf`kÔ]G–Ùžãt®ˆ\GÎlæ¯Ô$Š‚ó‹ýþ½^O³À :¸r‡s2¶á[¾5û}u·J݃3à ü(Å9G<“!“ŒÀcØâ™4)rŠS¾L GºŽþ—BÀ©.e ÓÜÊÿm(aûGWk×ãZ§±ÙôkÒH°œšŠÒºã‹±l5Ϥä©]Âo“÷Lîãß»(Ö‰N¿Õä_°\_ÕÕÙã{Çi…2U(jÛ^§Ö"·˜lº€R®è•cR¤Ä;Å´äk ÄD z=g¡o“0œæ^ÁÉûBý³ÒÆÛ9L$E;¤‹\êÿo²¤"¢„ñQà7âwtùå¶ý$LÓl¾1S2ùt6¥ì=̱3QÅ-®&it7 ->¢DZ2¢òHD™Ø#])…ô*¨h†°Mxª™Mi¼ œØãË9Ñ%·äDЍw<žOå ?†ÊÒ`€™CšåÂ%ŽWõËN(¦ÜaíZÑ[åƒ`˜Ù>Û&îXRìì4}뉦WûT@¡œ*/‹+ð™lm¶¦)ìz·ã¡»â3Å Ü^î™ØJ/ÿõäAk_.¹wÌàï¿|›bï\â˜¡Ë ³9±Ä ,=8SRþ‰—KKС.ÄÅ¢åç™ä´øó†œÊ[ø8±³®& *É×±Ð:Þ õ%œê×Ò ®!G˜Á 2wúoòÈ”¼Ù¸>Ù„2Ö¶¤L Ä9¢Üv˜»*ŠâµëáFTÊɾk¼ƒ—“á–ÜŠ­Fíº_Ûž cš^ey.2Í5âãîg ¥â;ìG;Ñ èçÃpô˜—i'KóƒMÔÿF¸ƒ1"úFˆÛ¥¸°ùô(hÍBI4Pí¯EºÖ% ìKJ‰Ôa,{ Ž“ü~7¯Ýši DNîx´ä ˃M%mOÑDt¡Îí-#â_”B7T¨7×EŸ0ú@ci+¯+ùÁd‹=³è• Ë´y•ÆÜEÃêÂëäÉtVþµ@6‚" ¼âËZ”˜*”>ÄávMüã ½[™÷ï"“2ì$Ö±ÞÊEÍß´}ÄXùp1݆œT.…„:…ƒã9È¡[¹Çl³ºoˆÑÐû‡63@M„ lß¹t@Т'T+¼ú€uõ(7צŠO+pçAƒÆ²0”)yì'3ñÞ¶PêËiû„,RÊ¿ ëàTk4¸Ç½œÓ”ÌÕæ`¾©%<í']<1O'»yøhô,ÂÈ&!qèèã4CÖ´÷Ný oÅ–‚ þ‰\h7^¸;kbÂv.¤@ÊUɦ\ëÂÛ8ü'/ÅœöH•›å3^\á\4æ·T¿ w”ý±:o·€¹ñ8‚<laÔÝ„ë#åbµLýã†ñm-VføüN«7KçrúµÃOíÁD…vì.«¤b ” »:±Àbî'gI=ð¸ ÃÃËÑö4yþˆ0*(XHÒ°£/¾ ŒjOºï—éÏ?(tw¬¨hÁN_û qyš¿hÁ2¸uHí’›¬Æsð” {‚% Óù~ʨ†$}¨fLÓy;WcPÏèWi‚æQÙ‘õ¯SÚü¡u]74‘Ì^¯µ%¼‡KAÜór5‹{îï%-¾Fûtº«¥(Ð#פ– «Y0ü}jüA*­(¯sâ<Ò‚7SCoF>@"a>zVÔÇÜï¶ö؉D8ÄŸA·èÐÄ[à·:1ä6Ö:¤ky"TXÃð*­ï¾ÿ‹{a@ÐɱÝ„ŠŸF &Äåa±pÛàùd>ÑìÕæôÕ¿PS¢!>uù7äbNú†DhŠÈi–(yt>³l.æ•+q·eiÚRÚ ˆÑ¸ž‡fW:4‰dN•äš2Hµô“!ƒ¬ë îil_ÏsëÎÀþ‚".¢º‡ÜÔÍÜýÀ/Æ´àüQþhF¶ÂÌ|g#Œ‘„ý<"[r(Ð2‘Œ¢5-Áiްp#ÎÈ+ÅiþM‘a3×D ÂõùÈ.¥¨ðÒ3RbƒQ"´/- +þ”*Y·ƒŸÎ£yˆõÑ—Ðv˜&Uí_>¢¯!)™TýºÞ/³sÇ’Bž$ž/2¹/Ø#y«ÅÖÒ é Îðt÷ܨ/@S{§CH» ¨[îp•]ÂfÞ7ØI_¸JKß`’mÉE>¤+—ÿSˆ@[Ë/R…hCŽ*IŒrÚpe¦Ð2 ©„ñðê>íÄÏyÕ•àØ›ÎÚL@P¾”‡å’sL¢Ãñ«2ˆUŽbèTlZXcP:tw~7¬W( “7&g¯&[Ý¢¹Õ‰¼UºŸñð½®B‘Öçú›êkÑìQZ aPË<(9k iûÁú´nJ©®=¶ÉœûˆjŒwƒ$sìã]V>^t†€yÌÕ)À)ï^—uºa›.vÝ©$o5:—xìKÍÉÏÌ÷aŽàòûÚŠ«Ëa5<ö,¹×—Êæ$“/¸ÙýQY»$ù¬f‹öÒMÉM®Ð_ÃEñ™ô1ñÊ&Ä>¶EQÕ§ºÕÎÙ#¢…¤AíÉE9µh_àº8úðœ+f¬tyñü.û™ zRÌŠ×w½o\èž~žÖ2lÛ$kã›äæÒ”ưSþjeÅtAHDN>ŠÏÖÐ\¹ -²U3ÓKT׆IJU/«dTÞ[‘x˜É˜Ýô·“øle ¢&nËi•Œb!^yéïîp 9nÊv5oÚ’KóŒK8™CÍÙP»ÿD\YŒ‘¾:@¬¡c;ÇkºvéÊXm»‘Öž : ‘/÷$LÇÓx—J4V>âÉ™L° ¾8¯ÍU²Zšl¬z" C sñ½|LŒ¦“†˜ûÕx‡6Á¼ºk{}þt‘Ê$Ã6î±J² |(rí©ó‡¦tüvŠÌ÷’P.¤™šHïQ…g$ Yv~"aÏ­é­©:Î?ÿNVZŽºŽ„j^^Y~R •-‡œ¨ð~{Zq8lhô~´W•H¯1Kѽ6ã–IDýB@Ø ²®ž¸H53ß–µ¨¦ دØ>õª´n0§vhØZ ]H ‰âö_Ý5gNomü`%ÏÜGXÖT‹{Z*‡ ‰’©AC½*¿èn³zÞ·¥@LýÌ>ô Qód¤éºTßĤ8õ¨àxLÌß!jJ2Íh´â“T÷•­yþ`pl¡‡{jÇ{oȵ/¼r|!î@Vù ¦’¢x¤²t«"õôkÏÈ q!îÞ1ăZÛ5]O òp,’Z¡C’ßsijRÿ¦ÿË••ð8A ª}·ž:žcJ¦O~KÁ„9v‘vP¿£gÝ WD¹ŽÙÌ40Y_ð½ð2]öc3_sè/Í ü¾mõŒ‚‹_®¥ÔöÝÞó¥Í8PÖÉ¥–ÌþýlžF`ÝÍÄõÞ5x#^yY7íûøÊ¼Sgã/)‘S…¢šX°hRï_x‰#iGoK€;… UÐáÙмU§Â 6/Ók¢¢fôK”PÍl6v5¡A·Î[=¼Ì€úEµÞ mÙÞ}}t8\Š,kñD*…Ø[;—ì™3ùtp0e¬V3 du]ByäáÆe¡,IÅ÷“0%ž©¥åÊœD^']ƒæÇe¹Ü[Ú}¹Õ÷Â&'Í6¯ ;[…´;ç8*nJ2µŠ!îl•Ä☸¼l Ž®% x ›Ïvˆ)OŸõ# ´Aï  Î¼Ãf;:J&NZŸ4 i‡¿Ó”‘ñHfd~÷/DDãßè\º¸Åm$% fÛOjØÌIã?hVŽÄ¯rI¯†Nå‘eäSÙ:hþÅi<ÔöÔš@[µ!>Ê"#pùúrìÇ–$È´•Û3š¤¾zNJåTýÿpÎŽW7ˇúÈžÏë”p¸u‹<öc¼2ÿš-eX{šæ:°ïX^»Ÿfçƒ;!#7EÖg#õpŽ?V+ô¶ózë]äîêóy@Rz¢ZßøßètÑ(hƒ71Q‰eîK”ÃÒ÷Oí¿•Îë§ ¯ jVP‡ìËF€Owä¨Ì1]à¤Uyæó-êˆý\›#JH݈!* åÝÊRð òðî—‹Þ~ŸrÁüðRz½Üž¹¹çõźq>­ð7;•iAzé}Ö£ô_PúbÖNsvnNõÅÌÿÝÀ;€ÂÅ> ¼8qL̉©4‚¿ëÚ|qÌS8‘øäë<+’y5Pìæ²¹4äîl0YèqëñŽ»Ë!˜×{ƒJVT<@QWh·u³’Gù´æ‰RÖ^–ƒÅ tÙÔÒdû†+&bõg‹ÕçûÒøÉ·9a•íø“ Ñô—ÚNˆvåA‚ó ¢W‘ŸË%V\Ÿ5Ú ¨"µ€š2(ѬëÁÁ<ánÑUQEؘwAÚŠqÒ0›ýh¿Å<Õ³2Q"0ä±…J˪ʭРgˆãH#–†ËØÇê@}Xœ¿y"ô¾’KÌ$ô& àbª+lcP…ÒÃ^w”( xEŸ®#ž ÀUºN³LÛon¸`ÁÈgÐZR•ò6Ì3ãÝû÷:e„Á¾7î’9pP ðTò00«b·ŸWÝ% Ê ,C9a~ž…µ¹Z­û„ôò!Ât>xÂ4 në{4î’ÉîËN»Ç¦Ú2Uw¸à  ¨0hÉÜ>ëùtõ§ EwjÈEÚ[äªç6í[Õ.ábƒI;`l†Ù‡U5?'¤«Jší ý€"pac%åK$­ ‹ª?á¯Û‰7³ŽSûmîˆ Gà2¨Ò ìôpçßvÄ\0yï4gŒ?vbœ/÷HÇ>n§»þð¾LÅXÃÀë<Û%ر(IÉš’ö|_Ú…jHèU5qÌ:}|áæï1r“G‚ |2ƒéÅ/z4PàVz½—kgàŽL…hà›§HÞþrŒDñ5¶^ máäÞ}gê.éA#‡¥wÚŒ‡qŸ^-Ɇ@V]3fwTóŒ©,n£¹Q»§ß³J«Ð&ÝCÏX„‰vª /Òä´¹¡Qͼù„Õäë%c…t[ wÅ¿è‹G"!-aÆ^8CÝåÔ ŸöjŸ8+*jB5À †Á<Í(XXÕŽq¸\æª×62µ…wõÖªX1Ë– ™Ä]³à/=æS¥è¶—ÕuÔp‘óOm*ò{jÍä©…Ly§–•íF5, §=% îM?·Oß%Ùl/J/ªéz¿èïjÆm(Yµ?¢Ùek'©J‹câp:Ô䤚€ÖlG1¶™Ò²iï|ZIŠú&ü¢ÁFË€Â[\ û–6ò7 n}ÝCBÚ FAí{aF>±<"šƒ©t MŒÚ3¥ÊXñ@SÞ¥¦rRÞêî7efãçW[Ýít 4Q8¤áÑ0j:½ñP‹ã—I{1WDDvÖÍ&švEò¼ƒ€HNHæ·øšûê•I޽/­ŸëöZÚžˆ:dÝú3òÖ–57ßc»]‰¹cQ¢OîÓ©PD-e‘T;/÷ÅYa°}±W4UÜОæÖZÃ])ªÍÄ…Áƨ ʵX’•UàÙ·÷¢@3þÑ™') pŒõxÎà¨!×[‘¨½ÅÏŸÊò-½›•Pä¥|¶¶.­4îó\°‚Uué 3RV¬‰ÏWŠ4H¶ØIg°C×ky(ÁÏ¿C"㘜,“Ò×” Tó@ÇRX7­°ÿà “Á\tr…€€smm\•lËP}Z=A‹B36›÷,¹ÎH/Ò£2ß»¢Tgún'Yyk³ÍT[Gº4ëQ $•B\‰Jq6g æ)—_T¢ZıÃE÷ ¦§À.§#“péIíÓ;~÷ÂËÑ%<ìKŠ6ó"+ýb&±Õ´ÿ‡ünË“^å<ôê(cfYøý[‹R]0ġҬ‹à›'²I±|yÂÎ&£³ ‰<ô x)4™Î"fó©>,õCšM7æ¨=œÈiä•BhÇS6>+ζ0x¿_š 8²Ï{>O5g¾Ñ(zBðꟼ´ºãê\Ÿ§n»þ(6˜°t˜@›Ï`ÜIÖTdÉÉoÁ{0ä ÔF“7B0$Àà>²ü±pá½îãWDûÑ£¡·®œ @}‚ TëÑ3‹…#=*ŸðãÉ£5ïY°,#Fî´¯o©dûDl ˜ó²N†Ä“ó-Â&ÆÔ¡F…^¹Ö˜ö¢O´ këE®°Yˆ¤ÆÑ‡†o0T9ÉÂgææpúí[0o©7òUï¡<¨B‚¬djœ@‚¨µ‰»ì=‡zAA™¶|mà«$z‚×>䜔_½}º+%+ù]·ã~&ÉrXòÔûWÞy§ÿ`$š{ )Ìíbð—,¯ÿÞŠ÷ÕàðRÐ*i ™ÚΑÝ(È`BMA~iyïê<:ß÷ºã–"â§{w°ÄÝ›¯j¶`15ÿ‰½=”û"l«ž—Üͦ18.bä1ÎehIä ^*Q>/cqed29…íU ØÿÌ–ê¢ADëGÄ…c:-t"gt=þ{,ˆ‘#`Ûè£ ®y `ïXÎÓìeɲzË´ÅûÎÑìþl«úØÖàjJx KU¥ÓîÃÀo•x5ÌÒ®Qd}ò=BFN",WdÏÇÇTK¼.àmêàåuÞ®^–ÆöÓ“#Y ŸTþ—#iH†„Äñ°É£ø+uš` Ö8AÕçäô’™Ý6JÔºÝrÆ Þøßá"èOR 6è–Tœ§mÑ{¨ YP5Ô¡Èl‚úÖ³év7Ç~€rZ€m…^¯ƒÛÞã3„Hµbá§¡…/#òöR4Ty÷àï&ýºŽo&öÏÍNQÝ|IÁr:t!0ï¼Ô=ÝzÛñ¹t Î(ö"Úˆò¸Á*­¦`ÝXºHí^¦JF)GvXä9P–»Ú÷ü(7–™i›0ÇD¢7\–¥sÂø¼ÔâBZotG8„Û7]~—ÉÊcö¾3jñ8PânÛQˆ> yJ·¦O3ö€.s$b«¦ò̵Ž5ÙrýKÛ®‰â™œuþR¾Dê\sNVÝ‘Uâc‹wŽ7}›ÀN¾òÚ:8Øo%’"jr/½Iѹçñäéäf Ô-Î-ºmd×¶4÷.ç•Ù__,÷¿ÄøÝzÀÑ—©/BþåxeVÕ¡Hö¶àHý€{5ï—.•ÓÝ–uT¯§š›°=“1TfÖ~?è·ÊÁÈ&7¥¤ÌUúñŒÇ¦™0 £½ÝT ãˆt 1Q d1¥TØú¤2œi·t¨£ºŠZ0ñ>“<[{¶-¥ ŠÈ<ŸI«dï¹y!°\õè\îGÙûYZ {œ©Vmæÿ¯f\éòiÆžyù;U<•+¢XO¯õ ž t“Où“â­fø¦è§J3´ë·›â‚ÚÒ” Éî¹E“l½D÷FYE7æ >ß"B[ mÙ½«\¸:ÎT®”YžVlÿ–& ª†²‰êì.RО7U¼6,÷KÒ+ ÜÖ=g3žç ª@®ÜI½ÉS6>Û}㬂©:rÎ7ý3ÛÖqjœ wãP¨Tu²¡Úz4Ê›S™í[í0A&é9ðÃ`°‹ÍvDåUv’í†ßJs0['_4~4=†bþ½,"LÓ¦gž5ÅɥƩ”Ì´ˆ±ŸëT“æ]ñîU¤ æÕ™›åÔtónnÏ®õÝM熇ү%®;½±Ø‘@ !aàµÐ„ÍuT(‰ÚÁ®»²ÌYµ_Z˜ípvd\ÿÍöŹ%éÕ+HåÜöü9@ú§Ù@ƒW Ò¢t·}`¤±8í¥¼­;º’Ó K‰NõÓ?“©Ç6ƒSã[v•F§ëæš߀-“k1„mŽpÄg¹ÐÖ+5'2 ’Ëöµ_&š‹7”Ë­ûϳï»%1ÔÒ-•Aª˜¸ë4ìò…²˜CŽÂŸ½bYðê žä¹†Ã»Ã¯²yä¿Ñ=ûb¡g…DzmÏû*÷F°ÕÀ,ª?Ä÷“$_«‘ª‘Q¶cÇA‹Aå‚ñÀÛöUYvf!òkªTçÓ­LWkE TUæßžèü‘±RyAY®ý&í+·)w"ö‚i$/)wÚº±3ÛNíÆCÚR£'öjÕÙŸÖC•-T›:E†[9ü¢Sn}ò—OìjïH 8{¬yþÔè=Ï,h‘؇q(mË\_cW-â¤Kæs:>Z»'ªè.nw²Ḭ́•t¹™dì$ST U}bür]x&K2‰e¥>Ð ¶´ÈÕè§'RaK½·Ó( öW$N…­‘ècWG.y¨lšM±»é›¦$v2aFjr¶fÇžñk½Œ¬ë5Ëô¤uO› •¬ÿ—°Ö Û²ØÚËßðhkzbŠ;¥­rØ[κPTÌÓå9ÛÞ{6Sñ&GtE”÷˜í™1e¶MòجÎlˆ°\z{O ]¿ªî ̹³lÛ¯{r©ö(³'ëÞ7;÷i¹–ñ¼šÿ Ë›êXСÚÈ}5Z9¨¨o@èƒ:ÿ¥J\Ì®,Íç¦ ¡ÞÛ­æ¡<ùËÂgàÿ¹ë<+£°ÍøQXLEá½K ö}…¶uÚ+!¨ëBf5ŽàªHƒ0#jžXðˆÌò)‡”ä·±DœÂ®ñ1ùÍ4Ý vP/jÜï…ÂL˜w¾r”#EÎ,‡r­²èÓcëlߟ$âÔkÆ‚ ¡ý=ËyâNX›ÄþbºfŠŽ¸‹·AK…f­ø¼Øtøs½ã³Fûh¼)#D_"2\¤•ÔÑûu»SÜâp9—íSÕVY°ÜœÎ¬ôw-*Ÿ k9Ž27ÿ òây¼Ž9ã§×ê­i;ã<_ôjÑÃÚ¢’¬5æšd«’Æê4P7Ü (ú‡A #ìÇ Öåž( (Éd¼2¸*Âÿ‰Æ€¥ˆw^ô]O^œ71M—.4Γڄó"–Ôż¯9‹5@}®Þ êÒ€0ˆ’ºªxèmî߬†”;ÚÔ&‘ƒ‚qH…l·_Áü¡È>§q¢ËG!;á‡ù(“îïþõ|ªMùÓó­rå`Ù ï$XMöʺë<ìü©ßÇx§“ž µ,ðÎ÷©²ÌWçúçSËÐWÅ/®u6Ø„¸‡‡—"ÆãøXQB7ÙzqL\ßÞ×qûf¬—þ›Ù»­I¶Í Ý€ìÀoò}É!‚€«3Nâª}h§(véAJÌ9Îëc qükZå»Ì˜ÌB*¥rë Ô=ÏS»Wk±Ó Í)=:Z™´ß±XT:<`öygh„€”ß7ºÁ­eë· GöxK ^}ô»²ÜJkø³Aœ¾aØä`2ý`º×™³ÕÍê×B²ºÏ±®!.â8Tc9Ôm¦¼´EÏRÏXÛö«âûB£/1¨¤øD5uC² RLÓ#ñå7ƒ(7Ü÷näêÆq$íž<™káŠ9åá«ü¿L#7>Á X(œ!×C’íl{~9B 0òïŒDo²9ßù‡úR–àŠå¶òRL zƒYý´_\E$Z¾Ò„mjdQx]–6L¨>4Ö(ÎÊè8˜=ÝžÐÅÌV%·…'°M¢B& ØmæGLw36 °fßàc)YHA†ò›ƒˆ-ž}mò:GêâòN äŸéµ “,)7ûÁêŽS!\Uƒ_ˆÓÀ{abzJQéCâ¹ÿÐq×.+“üU[él—å0 ‹kSwäÊBkˆÖdµ[âm1•ޱ ˜¬ÓD“yI(®ê°ŒÍÀ(sùùKGø¸° f€8Ì*×çzaÌ`Ù…¯ÚN—d?årŸM{Æø\V¿íJË$é ƒ%EË* 4ÑCìFÁ8›P¢¼?¨ø/“P _ÜjÓM¯€VVd¯è Kç=T@À×Ltÿ¯–ïr¹€âùYl5%eZ\PcÀû°P

zcïë¼Õ܈A¦7«¦oÖEØA…Òá]r •vFWÑÚ© +œÑQæeXºŸC18NŸ@+jþ#œºånµ;Âä8í¸¡“Œ®­oó…œëQáàÙž†5ÙqÙãÞ(ºõ(Qþ®e褮Œ,ã»5‹²;Y2åN ¦²‘Ʋ£hëŽÇ!þeøé²B¥ä­êÉe*j‚ÈÛ|:ìK=û¢ŠH¢AüBAå¹ÍÑÖÜ”|ñhœ:FC?öksNÈp‹ÜàeδÝx' ¨1vâéõQ@ZF‰Ù³`ÉÏKt!áð" D*c¤jœþ >Òiåõ•ú`:‡Rróàô`ôDÇö¦ÈgMj0JÎM¼SqR p›úÈÒ°¬‹¢£´ö’‡J†dÚ MééÌ<^E/½þ#öY¿)‚-tߌ5l>ngúW(#?»Ú£†¥êúËýÐ0yA^Ð4}íqÎd´*¨t=¾Œ¿r"#…RÄ ÿ–Öá%R‰¸œ4Âý GšsÎ[ø.8Šï‚g›]ªƒ=Š©¼8ÛAÌr)\CpïôÐâÚSΞZ\ú­àelŠ­ÿ`©‰9¿x÷ŸJ’– ç*)‡ ½û‹^®;F‘ƒø¹é!>0ãjg¥Vã[ˆ‚hgJ"n‰»ÛÛX¤¿®a?þ­E lNµˆIÍ¿Y…£…ث̬CÎ÷.èàÃq•Û€m»Þtti>%9½=Ñ«j/… ©q½–ûr•\iPÕ»´‡yR k&þÚêi1æ´Ùˆ61¸&wè caÈ\ü& ­ž¾w•©èIsß’‘!g™ýeܵ[šº.?l¶ƒ4ÂEZ:hJÍuÖ£ç0vfÆLƒâ–SòcfPÞ²•øùZ© °•¥EvÔµ}¼Â¼çc¶jQlfƒ ½ÖNVˆî½}¹aG[ö}YÖ²¸uÄ6©±ƒaPÄÚQ¦çú¬j;yôš×éÔ¸çñri“®ßÖçHzñWÜ®2JMLbœïSUSóJÒ> %â5O̳ÏÿÍÜ¡€~ˆ7aí„„‰ÜÃAµ-XÈ~El7Ôì`¡dÜå?¨˜~>ˆ*m™ˆ×€²d˜]xË©8f.¸0:v¬N¶Íl$Íq¦Paë‘ÖóÝþCþ8wíÞƒ]D ”æ}¨‹Û»\­èZ‹®Rñˆ+ù¿(gcîä˜fEÔ›Bª·ÛÔ—ëæíò¢ŒŒ­Ìè~½ôFœ[ñd]ìÁáˆq÷±׋Bˆ‡½ÿ&>mf#µL“}Cª?÷o #à©A£âZiO³m¢(¹¸¾¾{J3±h}ÚÿØ;îB3+­ç9hûUÆÙ¥–Q![ËÄñ¥È¥ i©éI‰ýä¼ôoŒr¶]f»î2M‘ròˆžd] BShû°w^«^$––r‡!|Q,tÄô)~§Ñ­Ž.AyzºG {RÕsŠì_p2ä¶§sºan¥Í—O¿/­j“ÐU–˜nfá’v£^Iaò?ö¬¥<…·’MÕ.¢vì“xãOÀ©ù,ßv$Ä zßYê[’OH'Fø•òèØâ•tYvÉä%A\“éÒ‹¶ýØ| ˆÙ"¢Ê•®8~ ,È•Þéc`¥‰ÎU)ØcÕ¡ãÂŤzÔF«ípEÚi‰]ò›¹dÆ2ó…VëX­Ó'ßAƒåÄCQÄÈãËQAàùšù³u¦³£¯‘-"­…sНºW 9*¯‰× ž¿ÊHÚ¦Më]ãHs$•GBÖ #×|ôè¶wÜÖ/)é¡)Ø4w{H!ž]c‡ÿ~O1³¬h§OÙs¨Û ž}¶[jæH/"­D’‡€ýLkA¬©€†˜­/'ùjì»{`kò_ðJð2\"5öÈ·}S­x„Ï´Rç~×~k:®M®Åa"Ö-N-GAmÕNit ¾Wï¦ü|·×FêgüýU É‚¢½ÏÏðº@ŸI?Rùs{ zÏæÎ~Y'X|*¿ÿG´æ¤½ªÔeW‘RP”Ù°fVtCÁüJêä,‚š‚¢dÝWd½çHß­_;u­¡²f#;årëÈ€”@¬GB2ý*túù-‡)ÿýA<Íém*ü\‰Ès9¹Ï* —ÝST»2ºUH$ØÔkdw¾yÞLù'øçh!öaŠöëü€¬óìnIÆ^‰À39@/Ü Ó=XG™ÃüÝMŠÔYÙšø‘,Õ³±¿,%ÂÒa§èrIµ˜2XæD«e3ÄÎN ÔpzzG²’Kk _%’º@ågS~T¼;ëÅ9§=’ñÁUŒïüÚi¥–'sÖÝGÀ¤>©Ì ¶`wâ^‹±%¥ÊvfÚúo÷Hýžñ¯½ša§ø¿IXŸP²ÍF‹‡ú±€äYöކƒ”/–íPAq©þðœ´yQÄ‹÷Tþd»¨˜IZåÏKÛ9ñņÀIㆿK…-óÌ­šÑ 4fÝàÐò0l»éía¢RâS{žºà7«-O°ŸÙñߦ ÃÒÆ#ÊŒr…åYJ0K-ÿõuü¸ö–]M%Ç;Ø0R¿×Òë(j…Š ŠQÓH·˜á3ˆ×áäœbrƒeíô¼Å I!µPa6 ®¼º¡„½L§ŸâˆSý¾Óæ·§W¥}÷TظpäËü‡.øò%jK¯–.–j],­™»ï°?Âùùª]Ì¥zîq€YÍàdº÷Ÿa Žÿ>.?ÏmLì.f/0Œ¯5ÒðiA\>­­Ú³†r—ýµœ7rX‚[¶‰~¿ýÌA>{äÆW‡sWAöšï€»ŸNtW[íg1B ª ÓTdãÅÒ*YЛ­þ sů€ÚÊ®^úÄ»‹ní«¿Œr‹¤LÒ¾~+?Æ|êÖˆZ Ã,Ø<’]ᥳ ¹çQJîQ¦Ë§uƒKk ÿúÛøË*Þz`\ߨV ´4¨5áMÊHVQ¸¿¿‡¼ˆ<¬àt€gÔj8J,MÛÌ¥|¬º‘ÚÚˆlƒ+þƒqÿ§Vâ33&½ŠùÍ4r‹Û,ž`r@HFuŠ–l£Pwd)ùÕ˜ì¬;åFà’$·%yöþ5ò‚êèMKÉG{åW[A»~›DzÛ,Òèd’ƒt£~s¬(Ãñ– >_ý.w€ðÕŽàdFÚ¡Ë ?[*œô«äZ‘è© —Ù)ySe¿X€ƒ6@|¿c“-™Z!·wŒ½ëáViÈ3òÚo§b/pç×Õ˜P/« ß¿»O9üÅ—²›Rxcòyä4ÑÓ'¹.h,ðûj3ÄÄb²ý…w•ÕÍç”…êŽÃëâš²íçecdŒ¾AMjÚ Ö|JÖ‘;vHüO ^ìºØíª0Ю¤‘+GX5+ºHH76 ›X1¬]Rt´ðü\„‘›@ã¥'Ѷ„±¨ÆV|{i">Ã%Ýë•Æ{\edc”="¶9ßP]xS‚ƒ|ºlßHe3âæSq/ ]ck1NÃxh>Óf’•Di¶‰YäîKÉq`åG*Ü+H V0KJ™^â]cµ­­ZÄ*B¦}yZ¸•PŸ"¦ ™Ý°PsCÇSÒÿ:Â?Wi<h­X›:UX™ÊX.¯êXHÃÃ{z»ìûį`Aì¤fQØCLö“ÿù°eOüeOII4D³6ûíi%§¡®E&…àÜA(ºY¾jÛÎÈUpD™?wO2o̳zÑ“J7L7>‘’ƒÍšÂ(ÚHž†h·àÐ_± ¾#\U…VÑž®ž’ ›ô| ´uOý'Ç´œ(ÕùvVzKøe®-^Æs\ åÑr*hM¥ÍEŽàŽÅS ×`’9^ÑHGé…RŽa¼Y*oœ‹Ôçâôv"6M¶Áydtî@¹’I,±Ç·ÈòÈìÎ<¤%µVrt¬OUxG›%‰²Ñu‰_×EzDûP®Ú{"N£º²ó7î›Â¸„LÅ]ªð_HÙ…8¬¬ Üa¯m¶À…šËf½Hpµˆ²&Ú!rHÿ ð<Öe¨?83¬hs5x£ñ/縛֌2Œtw£ÏwSÊ ¢Êb•À¸Gm«ãD¶ T“×28Ђ…z„=Ònô^tXQ–¢é¡¿‚³ªßP÷5TðZŠ^ ´Ó¼_òRè ‚$vßyî!;j­ë2ƒzeßOÕ*Eÿ_³µD˜).ž*ÿ`ÁrÍ sç ´s\$Ø ™ ÚŽ¢W^»J™eÎH3Ðê¿‹çWmf¢ùûe—µH¢¿ÂÖáO–ü|Tx$„ ]ÓM·ëª4¬´w°”Ã>€G6Z§Å© ½ ù½Ôvz}»æ<»‰ˆŽÁ'¡éÎûz‘þ¸v+ÛZuSTÂÔ¶ô‘.ÐYf–¹$ZËü}OºÒ]Ú(ß3°´Õð$B§ñxDÞt "|"ÐAÞëB;³x- ƒVsâõ1¡¼žŒë‰žk1õp¬5D¾tÝü+Ø´;vTç<³-Ë¢vêR²‘#ŒTíø ×=b»çJRnºÔ«hVƒy»ÑÍ×Ôºù$ažÚîï~ÆuÙòê&UŒ>î@~kst«û"ÜD¸Ê•%>žpð~`Ò‘äDG§n4 B\×^ü{L¨™ðœ†œ ŽûLIÁÞõå’͉<SÕ ¹ØÊe|êºM*—žbôÍÖ~¢¦ SÁIЖîC(…òXC˜›¦›bè¸e˜Ïî Eº}ßä–¨ =ÌXÂ¥J†NÏV™´‘à¡õ7:K^S>ã¤áŠϘÞ`ÈtñªT!tßifº"¼Z#åíO¶þŸàçXíT¯ÿxÚl”U€PÅB)·ªÜ¬ü'#rð-Ñ{¼œ«ÒköïÍß"ÛõÀð”䙳wesvÒ‡óûÎ ž2MO±Æ¦>óìÁÁD€w·èLk Ñé”&ï;!"‚ìíô93B•‹SÜÊÆeê&cà—¥ÿNšÄ”GecŽ'¬Î(~`€¼"‡ÅkÍßnLˆ‡¤g`|¥Ohïó³9”ÖPæžk¼[ˆBå€J‹èfÇ+¯% k± ñŸº@‡v˪­Š¯Ä[ðõ¥½\ZE››YÈYÊ–á1Z’QÕš”0ž ˜¨%v°Ú8—ª­­ƒð¢4fMø q@t¿:S« ¨ÛŠ­{®Èï¨6¸݈î¡v²Ò$¢u¾=’93ÈÔÀÅn)I›ýݽo8è -Õ!Ë{vƒ‚º‘ü<©î#„í6ùÞ Hl¾¡Y"c4Þ‚àùšÇÂR•@ƒt B±ãwÛªô67>wÝÈÏ“Ã^ý4Àñ>˜ûÀººìågÿF•‹r]$Ê™È@c Åϸ‹ÏA§²¾:†MÖ8á;óåÖÞ+ØÊ^pÿÑLßBüìØÜÒ FÕ ö˜‡{[8‚F„¾í%zåt<µó_>S:zÙúš/”5‰\*.@²äFð·]¦øLÚŒhF6£G?WÛX¥pºÈDÊj£Ÿ‡wßê¥ÖB-½Õ-ýcä6­Þhê‰ ÷ð7>I|ÿ¿—†bÀ©‚Ñ~ÎèúF`‘¿x²·$EŽÞzÀé` ½_F×)gs‚ 8YäÝuŸ“1Ùžàz\t2Árò„"vµ_î`«¤ÜD²6AÔ»7‘ ÜÆ S\ ’¨„å%É!èÖ;zx¥ÎÜKZ¡½|‚ñ§µØmÔ½™ØµŠ»þ¦·WÐ ›Fô«Ø`†jêÛn 7i°ú'5}FÚ6J[a×ýãk“/…`;Щäh¦÷ô× Š™Ç]e§/ѱɉ¾:ÑÏüwҪDZ+‰²pí‰ÌMƒyzÙi’—|Fßá'þÿ[D‰ ý¾ðw]ˆ%Á!p¹bÑðÑÇ d®À‘:¿ê$åq¹3”ßzb­+Å{%ç>­ º}o:XùAÖ CÓ®ÊSÁGìâq®¨–f-€}í,÷¡*qÉ/qƒ¤ƒv€åÛ{¢;SnW (×Kú#ûå>kÀ½¸Í 2÷šÊ_lh Ì€ý5¶:} ;ÿ¯ÉÎiž°Guâ«ØÒ”¥6—ðòC ;`I˜ÏÏýQâ…ÐÏÖ$ºJkCá3™fÎ4ý%[|§«;¦Ê¿¥)³ù’l‰íãHØ?skþüÑŠäÑœÄ-¶&­·_ÈC£Ü8-&ßXq#wƒÕ 3m}V‰¹Ûåæú€aoN‘‡…}ÔDèú­ð’µºþÂ2ÞTƒüÛf><§pK ®t2tÁmº4´û@\kéPKaí­µo2ÿNn@ÀÙlÀ¶ùß™iy«a[n‹FK”‚d¥™?Ç9P²Ì8ë 6ïH»”­„ƒáUïþ[#Êꮵˆú^µÆçP{¸_R$¹_”ˆRÞt' €ú ú#s­T¬¡LŸb»f5aWN@/ÕÎX.¡þÇSc\Íä—½tšVÜIuê:%nû0…Ù 6ºgnõ¯ÂgÌ•—*ä¯ÿnl¡âÀ¬Í[å}ŸšàPpѦ=:Í„÷`³j5Üå*}bS@a…ˆ¨‰›£–Ø`dب1hc¼R²h¶U†AÏç¯":~š½U ÏKXåDÒ}¹íÇžÔPlBÌæÒtùü~IX0C“»ÓgºV‘ |6¯(C„#W/{´uÛLÞév9칯F»¯'yèöøA@àMâñȶqn±*HÀ9I:-ÑÁ.˜Üä3ùÿŠ%Ø;‹ÔÝv >¡æ6ªG$PF»=ø[3-´ ßMéÎæ˜1ÈöË\ª]ãMÉ*r5mÏx”ª(ÉÔº‚ó¸ä ËµV˜EÿYJ 4ÈE½²âcñG?×µKÕàwPž+ RQZɸrÉ5=-TŽÈ+ ÀÝ-ˆ„ù ÝÉ冯¥ÄÝ“tï¾ÝÙ5e6O¶ýÞ›¤$í©½Îjk´•!ÆîÔ”'qÚIÖ³‚¿°ÉfÓº¯W¦ Ñ¿ #[°#ùÂ/ÅcÝa@Y§iÿvF2»lú«öØïDTto²k= ,e½[kùÊ<ƒ #-é‹ tì‡þÌÍ&TÆ^ÿxýE„´îP«ƒ8ÝN‘ÉyãþN·4q1QnTºðå¬ã¬Á:áµÖ,I‹ØЭËb$-ñ›l‹ûû IRƒ„\aêQÞŒY9€aw¶;pž¹çö’öZH¢cH+§ep%’Sù®S*‡ ЍuéȪ~ÕA¶G5ŠI€ÞCQDÇ’KÄÉïû‰¡3¾ Ü«â®Iªo=ŠuEÓ Ƶ³Sk)ØOq×¾“ãôâ&´,n8‡¤9ˆÔ84ûˆrì$GdRä%@ Ò¸"£&¢„Í,E°(ÏÈS[AB—ú#Ši6ŽÝ%êÞÔË]\ÕMå÷ï1‰ÈŒ(ŒV&Þ#XcÚaÔøª´cŸê8ëœ^è–¦¤O¦ûñ¾²²ÒÂ%"+!át «Xqå6¼˜])QÚµyËÏMª¢-M’L™¡qØî{l"²C ãØ¥eöµÔÓüyZ0Y”£‰Ó<Åÿtïé8¾=¬CÙàáƒi%N4¼à¸ÔÜŽrµ‰à=vÈžœDcýhv1Q&%×P°-Ý-ƒŽŽÝ0镨P î2;î˯N¦¼o˜,É›GŽÛZþœ_%m™Ñw!ºöƒJ€¬¤,ÌÌñáZGö8¤¢¤Gfô Âxu)ܳe'ÐL¨läƒÐã‘#@ó±ŠtdY” ¥ÕM1(?Ô?^]¨ ÉîÂ!f'f NN^ÿB̆p|ä…”?»E_ó³|Ÿ¦/õçUwOÆ–Ð6ÐX¨ýƒyñ²Àçí}_²Éû]ùñån°N•@?CY1ìÁytþª˜|wÆGn$yïàn0(p¹ÐJèéÂè?ý !–±€aÒPó¾óZG§„ŒJ‡ùÉq–Mg?ôïL´5ûà¿ÆB‰.ÖpÓ=w,K»Ñ„T­H͈Ê5ªá-ŽDÕó/BTìÆ¢½ ]"nììÝèM <ù@³“PõðI+€ërª[¿cÞìÇK³Ç#®}ä¤ÈûÑÅ-á›|ÈL6hŸš›ž‰\ö~«ßÁrmýQ •Z‰U…Žtcp­¹¡»M\Þoâ\«IR™ÛqøM$öQ`–{Éów©ÐÏimIQ›µ–€ª×qÓ¯ÛJ;òïV¦*rÚuÇÞ—ul;Ô6Š~þÃnB7ÂG‚?yB†üKš)¥ þAéŠøü0-´ƒ²s Þd·LS¹æU×|½ÀP–A(*æV~€h è²°4 „E±k ³‡Ø+œcT%Û'ц©¯š—2`)PšÒR΋ʦ2÷g¯0À¿²“{L–Î(Ë®Ÿ¸m°&²×ÏÍ©j9q´ÁÓ´Û”OÒ,êôÁ_ßz1APýPh{éVWQÇ&F¬bA\oÄÕ;¬ÃÙåÎæäõq³ýˆìÃ\_ëEx*@L&MïotÁÜ~¹²þ)ç‚ZÙº}ý£û ‹*ø _1BuÚŠ{&R æí0wÔ‘a“ÙÕ§§bQÍý(FùVlñ Ƀàš6éJ]×í:Þf¸¦›4‡j9vý§DäÆxݼ²Óã{ÜÇÓ?.Aoƒ-* ¶2K¢f{‹sЬ•L{sÉ\`U2G-禬#[cñv¯nó3<Ã2ÕºAö°á/g±Ÿ.Î#xs¦s®ž¾L ±ò×9QÛ€‚¨®”ÛL¨¬z=Î…‹9)åïça¦SÈ“½Ìðx«9@nW•aÑOÛ¸ä0’òÃn,é‹IJÍ[ꄞMx~Ã8*­»Ðõ@UV,I)û¤… ¦6=»ç\‰™°á"'%Û«MúæÕ·_c§ÓmVˆM­ÙœŒõAª¸É¬¬6OS(ú^| HüëÖ*Mço(…}+·!VÚw{ï‚ã›\ì2s¥¡žHÌ‘¥r“™…\Ò!Wl€ö`2ÿ2gØFŒ’’³ÎƦ¯ôWôŒ¾ÿy‰½Îp"‡$ª eªm9W7ŽæÜª6Ž»Ÿ‹ðµn+ÉHü&Ú(T#†;oOÖ/-ן,‚MOvZݤ£±©ð¦Gòõ”«¡È8ãÒuPïH\“È`ân½` ýÿO dªmßSo—#×Úi}ú\c¤ëµèðE–‡%=èŸä±—!}‘bZl+¢P¶ÌDÛ$&Òßi>6@@l*5öy˜3  ½ûA9kÒ.`)yº>Ç… “0ì¸Ú,¤jÓU¡NÌy]¾4AÔÒS¯i â|‘œ›/°µzÏé¹ðƒ!£û««àr@ö“I¸¶ÈÕwE~<àF¾¤áÉt¹ÔÑâh࿚¾3^Rº§vŒHŠClF®5Xäs'yÙßÁEåµ8Í•%å‰+Mžã··á-#5Šô¹…ަó¿U´ZĘ‚áˆÃ1ýwß™€iŠiƒñ¥©ŸdŽö%NîwÓ[(êç6ñiQ°!ë2~0(ùÍ™¶m¢VÌ QïTÇø@ǂקÏY”=e !-¸€]Eï€~Û.Ç·¾Toí`8©„Ô1BK|³Š\#ñ@ Sê¬wXŽl“Æb«<‡°¬ýW³`Ç™)æ¥'³Aå3]ÂdÑC÷b5B5–kWƒmÞ³@vl@“Vt5íy9>šyyÝ„Ðusî f ¶^n+~2Ir>ÚÁzÞMŽLðXcˆx¼‹Mã'’?r©ý%`O/h|0^<^VõgȾ jA.¶P!ÔNòÈœe‰<ØŠä¥1v'›'™8^î´¶²u¥ŒÔ€ZhÖ¬“ï,M8•zY;ÅÜäÔÜM‚ŽÎØvLåhÝ/Ö˜#¶çsœ{·€TÓÂ^ê®%"Ô%îÒ_lk×Ëíc6e= œ ™¡Ë ‰nÙ}DUa¶vÚœ»fqìë$¾Xæ,,ñ(c%Í)¦‹&`Œ^¢L 1Z-Ù™}w\m ˜çª“ nÚ–À ΆéxÓR,‰v‹+ëMdµ<˜9‚¨íqµ.¾Ìƒføo¾[Øa%ä?äöܾï…Q…ƶ„ý{ôùÞ·ÛáI¿Lòƒ;À:©±áþ$L¼i¶c~S¹^dÐtåìsüÏ!—l´™Êx¹*œr%ÈZò@éSõŒD'±PµÕ@¤!°« Ð²[:fb™ ’à »57c þ|pïEÀ¬3œ/©nº+šÆ>CŽ•¤÷¬‡õîM252AûÔCðÂ&ÌÍò…㯸߇umtr˜ÿúBfàkU¡TôR±1áµ²!Êmz ›p®K¾Ô±¥wI#œà ÿ¾ëÛN¼&ŇÕ÷IWcF{S¢·fñs ÌøUK!ò$5®Œ2za‡`i²ãªÂШöiŒ–½Ÿ#ÛE¹Ï±—¡¾ãÍá å^Ö¾`6iªˆ6”y½¯e",óüƒîö Ò”Éûòœ¦whW|Ÿ¯z¬*!ä¶ï$cŒ+}3å3D›Y¢]Œ³jyz›ÚØ5¯ò‰ ™œ´m YZÊ£×’7P‘Éžv'n-ŠÐ/žkèÀ*eèó¨=¡ü<ë—fe¦€æEøÅvrÚ22üóÄeætiÂ'0•¢¤¶~Ú(«øgO2í‚AXç¡n™7JÚ§lÜq׆ÄÃ5u®2ò ]wøÌ=^š“rN\i%n¸Ó˼Â:Ãð+>À±=¡²–JÒá9Ú*«b£·IH3«Š0¦¤ÝÖ‡_¦.D묣Òm<Ò?T‚Ä ·^w†€œêú9“ÔíNNu›J,Ö’üO.Kc5Áo6ã䓬÷L!b8!îŠy)¹Ó"÷Ké“ m-iÛÁëa ÷%ûÏ9Ûí~ÃÊ÷,;j4/a ˆq‘hÔD‚•W6Árg¯s5Chéª$”+ؤ$̪ŠÝŸy·’SK•èÛ—²æz˜Ê"lðúÏ®$¦€1@ã& h꣖ØåË—U†¾(Ó>$¾ŽÌžšÈ5ÆŠ§±”Në;£š¼x¿zžÿ jüiøOS9«äµhôC†6玩Òº Ñ¿Ä{ Â\íМñá#nºgðŠ^íP†Ó¬J8f²®þÚÊm¾qDêk;£\,5{Æ%ÒŽ’6HÄR+›T„yˆ4+ JÿòîòÑÖÚ¿¦ ™Ô‹Êed8’D<ÕjÓõ!uúI< ´…û;¿u$rísT‡çVñS?Ã# Æš’fl:œ£%Wôëô²ïŽGhdˆ’#bˉ.­Øó³œª ÿÇÓçÎgY_£!}H°çõ”~Gcm_ÄfS2Œ Ê–¤x€6DêžÑåÆóî¢À¶¬Ghªü§mΨöÕe:Â7hÔ²•û9·¸A@yš¢s·6u}Ιwˇ/?—¶^ÌARßïÖ—ñR%†½Å®7w5¿[ó P÷ˆŠõ¢ú½ ÀöÝõǨš~Öà¸Um§¹•*ei«tºï~Ëwmíó­F­J°ÒÅPЇñ»EåÄéKæ “ÝHñ«3Äõ¾AŒbßö_¾…'½C9!rI¾†ÁžÚù‚½JŸÈ¼–n±/Õøë3Z˜eoŽüÓe“~%>#!è/¤‰¸-›cF}.†v3ÝíÔªôúÑ£ (eÏwk—ŒŒ´ŒéZˆ¬8•)†ÜØŽw*} HÊV+²¬^bÉÕ mY[qᯕ£íN–CN“>¾¦Ì¾FiäðRrú¡¸zQI¥¬Öñv^ñÏbù dµ¥ï¥‹S[¬Àóµ1Á’ä14@ (¶Ýàps"QZMÖüax^~Q*×g“¬‰ð‡?®ÈEÇ+PiÀÞy u{~Oô„i_rñHG¾Ð°CÕ»÷ V'3/$l"®ö]®ñĨ#…ŒX¹ðu gÞ¶¡MË}k¨7¯i/„WUŒà×c¢BŸv ‚CeXále-ð–¤âÜÂ/(FuËí Qá™ÂÌPX…“~hˆ}t&jTB¢K_D ±7.àKe!ën[úHaðãW8‹‰VCâÅ¥Ñ]§Gè¡iÇVÖe'Á’nè[n— ÖUD%ô’È…û%æÉ‚’©¤ÒìJêrÍ[y•RdÎr®eÒó³Þœ—ŽÆû¾M¡¾¸p±þéI(Sº6>ѺGñâæ8ZÎ}pQýï‘é£ýx®îŽ­#ÑV]ô®õC«î’OÐɰ཰èò¥c.º–"~G5­…Ð9´‚Õò¿ ø°_û Ä5©–†Œ!ÅÌMÏÃ…¶È;yÿ6² lwt Ácia¥Á@¢ù¦Ny·¬3Wd™žü:£2æW(F§îPxƒ ÷0XçCÇîå{ò:‰$PbœÐv‘Ç›:f6¹.!J:I˜RTñ}þÄÉwqÌ ÔÔ݈t="ŽùÔ¬~ƒ„Ðâ6Ô…Ñâ©í?ÓÖË›þ˜H«Á9;o8gšÏ(¸ìyG×IHž–À^»ïÑb›åå7„‡Ýjã ëxn€gZÕ#o OÿbX¯ôµ½dÝ—D9Isô^…g§¾Q´ ,èõ]è`T‹„¤¤pSKÝ9G‰•~œÐoþ`öw…Èä0—dÜq> 9pÑ S"8·ƒ'}ÁZ{dÓU)ñ§÷wì‰ÃÉéNjÀ"™âmüéaGÏE,KÕ™ú21¿ÖºÎ àFÉút[†¿Õªk‡ÓZ“)ÒZm6ƨ=%g¸µËŠ+äD-06(¯¾ ä«È{ŒZtJ ILcºxˆ:SHª™Sþ“Ü,¹tÝñ~œ L7ç|z$9v¼6nà=ú”W"Qà!ß‘ð·SÖU£Ed ±ó‡à¯Nb瞨FÙ¼é‚ï»9`f~xRmñ´íù” 軼kjq ŽXgJ3HÉÓ{E½³™÷e‹ó½:5PÄÕ)iñ4¥'”ìÓÞ&eæ?oWr,¥%w];š‘?_OyÞ¾ \ζw‰9K9ãš5ŠIû¶Åµ˜Äg‹AÁ=±-€ÙÇÜ`^_óÑ0á?¨4m‘klgŒS8ç·61# üoσ,âymÒÉ7yº¡š TÿÕJõÚO!jsuA›D)Ó‚Æÿïõ½œÑg¯L`2ùõ"ð‚U7X/Êmϰ=[ ýMTäÉßÐW:‰Ò~¥è¬Yå?(·(ÙUÒh 'gü' YkbxÞ™aPëƒ{¡¢NdWü”E6Í­hŒÕN7a^â•&Ö°&Gã^`N)õô¢Í£6:wÀ7«gYà ‘Tв¥Ûti›–k„¸¨Ï…;n0Pïà;ñk†‚d ¥&›.ï6èPÂÅÑß_Ù•sc÷àûI†c¹ƒªé\fP¥¿^¶4møÅX¶a¶3wÐ ·5:½A¾OIÆä©£RÄ<²^ÝÊ­ŠÆˆŸkàñ,„5°ùÊ f‡š”`·á éLû 'Ñ+Z(\ BË]_·×7?+òì{ ø›p82 G¶ßÏ"dAÔÕÀèX¯h\F:É›ôæ‰> [‚Ô®1âŸu€wÍ.wÞ£raéÇ/, ±ÅHÁÓãÒm¾®Þ!âtÚªóŸÜçýVQ.‡’ U3íÕÖEÙKCß øÍ­Å“£æXŠp¹ÎO2~mò '•¿¾¶‰IqKªËoˆMÝœÇh–ÉÒÎKFÏ» ˜Û­do¾³ú¶Zo¼7<7Çn€sOn+€l¯Ì±À¬˜u,Xê6¨¸=Î]¢ø âV®? žo}ÿM†9¼^ìº$£ŒTÕìÇuü+þ~4ýhž>¢o™¨aê:Ð#:ô{Q+ÿÀsæ6eãJiIL¢V}·­çñGÔªŸw$'f&›iµCúc„:ó!ºtÒQKžr:·LdÌŸo¯Ræ7ÔAî…DJÝŸ¾~Î6ÁÚM!Ç6™çö¥c—Á¢"+ © ·Pwºj½“i±Ì[K&›“¡Ê%¡¹[€´­äøe?Æ.¼—µêU©ÏSŒš(V7w‘7.Å+Á  ]µµ.2“5WEšOãZÜþJ&éHlžb#cïŸ7ó.ÛÐÒØaåwÅT¥ÑZu¾è#*N‹WFHÜ^ƒïÿNbàþ¢ç¤‹<}Ë¡|µ¾0$«\ÑÃI¨¾lþ{®Ò?:–Û´óïÆ>êülºûØ:;ß=»ÉöhÍÅ„^ñÀXFßiÞéŒÃR¸Òž_í¶Çir++_r=ú570t)ƒÞš ,Ï —z@};K&ëÓ/¶TÆ©K‚4¨™M³Åõ‰CÇì<«™<‹Å9›FÂÈ)6›G¼ÄîÂÈO‰f Nb]@™µj ‹jñ–eë ¨œë1D8[á~È Á„ jð|"¶ÆÏÇÕÑ"w³%Ÿ‘ ­Ô¹­ôì훃ÃXãŤ3‹§*MnO ²gÈís- TRª^“í÷ *†~ T¶æç£_}ý?¥%Ê ±Ë‘¹¸Ö#¹ûìÙNs<íkì[%öµûÇ„|*©Æ¾cˆŽK§ûŒcr@¡(IŠ/ìhò?sÉ´‡zN»ð³uzfì]C#±d^è©-Ý'p˜o‚–¼{„aè)w<+ûï„ÜÒÒ–\LâbŽÞ¾ö æxšíäÌ wV#1 ×H«s†å/¯’êtwå&eòÝÞ^ºÈ™‡L“@¾9Q^UŠïž0ëŒÑä£~FGgÞ¨;©ÑòOnx”çzöñµË–È+½„gžûu7u%#/2Î,ÈÕj’òYÚß› áé2àòÇè!V¶=|—çæÂot˜ÁŽž ͈h`¯€e¸0ݰÂ5§pDCÀAç#xÄí˜â¤*Í6 ‹ªß„Ö~®ýY´iõ»¾u~,ŸàžOª+§Aau h)&Èe“ž #èOCD×.’CsïÐ÷ONÄvë«áVÆm ªP"0ˆë9Êè- 8RUøÑgiÇ6Ø›¾üÆÞ“=!ÕNc@BTšp‚Z´ÇÆ-øÁ&JÆÜü¼+6tÿÌcóÜLR¶QãW~ƒ³òë_¨z wàV@-‚@{Zà¿-~¹\nx'HÑ‘ÖE♊ à ð£µlu¨[éàškÖ`  9`ŸÜˆ¨˜æP5§ám"ËÚ‹M7w¦ë%Mò@åÛw+bq[Xíhbÿ­F›ƒÐÙß©Cå®BγÜCYyU¤jñ@Ê$чgòªºpC]%>~c]wêÙÕ¬]Ò‰WáØ–GIâÉjDV#‡srØ3÷RŒ°°fÁPûЗ­ÁqøÕ^ÚÌ^½CH9mI• ªMz%Ý£FkH¨àB,¡RšTwù冎[Å&âC€Ø¾”*_ž #JA cjiÒÉ-¸ïH©syDDPž ®M091!Ø<õkŒƒ)uò#A­©ùŠlri1û¹û\Èä-0xŽƒÀ í­ƒïð`issßd¯3Ûoðl€²É)Á$õjf8´¸Æ8Í5•:;Ѳ$pµ˜Ó=:rkG:˜áUoPˆRÍùçÕh–_K$º¤^’G¬¨ívӳ׌þáÏšÜC>J)ŽÚ·{Ó¦ÍAõQTÖËS„«¿´ÈÖG’-ZnžlšÍùYkómæÏS£[R?wÜ uWÆœ€i§QÝ‹ƒþ4ÓQLxþ9§ÉïÆâ»¼jÇžª^E–è^«Õ:õpèaIµCS-‹¯Ý}—ª5o#µ±Î’N™G„äg¦XÓ†¬ò\Ž:lþ{ÚØÀ}éùr`”»”QA¸/!§\E‡gðÔœ‰¨¥‹4éÈrÙµUÏÐY°AÃÙ$}/K~ëÒŠkqó]üÐ"„ÖÞi=hÀé—&mÖÉ ˆßOwllÊ‚“ý-[—­Sp×,½šGiËP‰ÍÐàµßÿ*¿Œvþá㘑*¢ÄžÝ"_cµm½û„UÚêTV‰àfŒ‡.ºB£p‚^Æöߘmì„Ù@—­ÝÑ6"áôx׋+ºàŠ|JÏóòìv'‘6¬Õ0jp oöù¾K¯·´»Ü( f—êZååõu˜eòÊw1 œñ€Å𘘬}c:^[Tþ¥QiáRY븘 öð/?U€L ²  æƒ[ÓçÙóÞR8ÀräÆÛ ÿH×KB[A`OAúB>žA{ຳØT°Á4‹þû•dÅìsÊxk#—1‰¢¥0§u•°äñ7ãýÁxEûZ¡.Tßç¦$·”Çù0ÛÁ1š³¶ãÅ™ñ¦O%R`×l3¶è’Ã!áqc»¡3“G;l¬Î"5|æðƒÅœse¦—-[Ãêr±Qˆ Ís:v‘öòaáÉ®T,ò³¹ý@I;WσBȼ¼î".l/ÓW,…o7øØU UV‹A­ªZL•®"Pj¯§ëØ&Ve¹Çš)Š‘FP#¨îW­ïKªYĬò]öÏp´’;u°uy>HÐ68;–Tya9û æV¯Ùb•à ¹…à0ø¯ÛŸ´Ï7¢ˆÌð]Ç*·Re6…%û ¥‰Ö“ñ¹^³M&€¸˜×ͯ7,_-{‰Ó¹• ß/ã÷Ê®¼ ¾Žÿ‹§ÃóäËÔ 5(¸ºyÁºg,%mPyMͪZ¸ÇÓŒBß$g³pëdµ ~á«’³Jß0˜½Ø„GlÝLD€œ>y/e<ÙÌGHYÕ,šnÈ€mõèç¶Ð‹À±‚83×b.¥,ð-ò¡-ð¨ÝË”çAoŸ ølïí鱬ÌýüÕ.ùÍ2 KìmbzžjpÁ¢ì‡NødŽa•äðJBhùÚ¢£.ÎIÇýVI?VñxÍò¦„­Ç}TËÕç¹ø€ÅÞ‡ß7„Éz’ŽŒöE53V'‘ADº oÙ–’ÕvíÒ¤¼L¸¦i‚œôÁ×eúš‹‚”á›ÖÜ~ÄWéCdDžä÷ßêL-‘²œ¾±¬˜ï|·0¡3«6D §VóÈ”ñÏÑ!`Æì¼Z;J:7ûÊ3úVáÔ•(¶å£¥2æ¢×žd§yò.È‘ü–ITó–ÐEBúLÆIS‰Ÿçú¡¢ÄZÇlñ=hèEò‹ÔGÆŠ:Á%‚²ä–¡n­ÿž}}@ã Gq)=iÏÓ–=÷ˆ ",iÃÆakOGõKóñßàNÕ·qIÕŒ{dö69Áa)\Uëa•á`½š¼ éllïkhàÐxŒä#Pê‹èf> u«f¯qi˜—R%pÚ•O³à×µøë¡.L~°×ìpB*–úæ ÿ¼•ÕÿêÄU2LÑéd£ˆbïl‰IÕVF t=• Ã!Ùl‘6„eðÜB'>hêû”vÍð5ÌÝþ•×Þý¶P…ÑÅÒÂ-“󢡃©¥eÓ«'‘E¯ûß{RÆF4¡éö´|zðš®÷ó޻߼éVbXb[|E ž›À9pŒ ^‚¿Œab|M,Cí5x×(”(ì ø¯:—A {Åì3ó •ÙHÞ !,”¼ [™:qEX Vü…óLüêk:Ë™gÜl=¨À<_øñ'—Æyß7í´:mÔ6'¤ß± ®xR#åxnµãgTj& ÒÂ,Ía?DÈ1¦ÿà\1|–z1w>Õæm§šà‰éö?!½É€%«„!\wͱ‚2v‘ÐQ¥·¦»V> Žî£Û«¯ ðj¾ –€½ SË(–OžÂR>ø*ÊnÛ+`üØ.Hî9u"$ÇÏö®Ø5`Ïyj(‰6gÚìXn£iIèÚâé*ØGzbiÀ°åÉiZ_G]Œé•ç_ Õ û·ºd›Qþ]ôt•…˼A±G Ì.Ô@ž¡†RÌ9Ø~x<ý…uŸïVÍß> 2eü'h‰‰ÄuÅ 4ÿÛ§˜å–añË•°ÕAÀÖ‹÷MðÖŒkć—íÀü‰BìÝö’! »#'°=x‹²’ÔeèÓ^ucšˆ7·î³$~qbƧȅߛÅ÷"cKGèÇÔ‹CÍ­·ÂêùsB­à‘Ó×™ª¿H§ X¦»éH'/¹ØÈBìAÖ@½õõf ÿ½”O¦e0C9£áõ4¬;©ö£d-¦.xиMya1€žoæWP°£$0Þ?vJðQæH¿ÎCœcjDCIêÂbUF¤YK¡3“æÄÓ4Ý­õ—£,?ÙÇMȉÚHrÈ(Mybs“eÂM#Wvö†¦ÑØõV½XG€Ý†â¼|1E‰:îqT >çëù0£æVHW«'duu|H؈'VL+î &ç ¶ó%2C¢Moàò6Å=˜l_º-,6%{u˜š·á»Dªa˜%FôòòvRÛÂ֮ܳë²Æ¸Õ+ssŠØ†¸÷Ú (;?gä/—ýAÀLr?´»gQ‹£[í–é§ù$»¡Eó9"f«>}§ Ì„0m´w§$B« [`ã_Z›æ•k##‘ÿÊø(¾i”BòïBÄŒ7Ñ…p€Ê?Ul2ì|u¾:ØVpïS½óïù¼[ƒ´õgô;:Á½â¼Gš^9¾#ø–Qá_&)¶ÉB+kϦ8 oT O)\è1D„skõuEP´ÌQŒÒÓcIF$ƒZÛ¾s!"u5(Ý¥:™Ü“Ð9†N¨JβrÉ2Ú뿜µ<»˜×Ôs«ƒÚ´¡ `¡zˆÅäÅ\…lÖUhW°ÑîWªQzèáT]O]ÂG0 dâAÝ<Ç$ûZA*:P”Ô™r|dóÎrr‘| Ýñ˜ãÊàG™ëe“>¨Àw¢÷9[2ÇžŒ*ž.Ë4ëÇ'…˜ÀbÒ}ر«RÙª¦e­ßÒ—2ÇA¶ôuκáÅ­¿Žt´ ´)Aw´.žÚöM;Õ2ù^³“×O%Þ(Öw¾ÓZ„¶ HŸ¼ç.ÕÇÕ( ö!@àéYù[^êÆÿ5†€vlB‘îYo¥Á„út>’¹£;õ¤Ì|®kì!ßÑòîÂtò åJá@cŒKÉNÁÅÖJ˜³¨š?*ÊüÙ4sÜM®a(¿«züg”½)OuS0:^K‘ºxœBû1/(Ý芈øsKõÑ6–f±Ë¥‰bUx«íû1óâ.Ô:!fꔃþôïÜ#ŒQëÓN·šC†þ1ìÆÂ†¯šåÚMÉnÅð‰‰OÇ×㌱ÿˆZËÑ_‹/½î5RöŽlEŽŠôÂB j«n‹þœ»yƒãym;¦Ä ÆÚ"˜Â³ù¤ #*(ÀF¾Yçñ&À{–® Êó« ”ìc8¼ÍÆïk࢛J¨zÙÈ‘u:»3‹¹"T[a âÜVvì$àڻ܂Ÿ°°,Ú÷Rä¿…%²‰oûE„|Š•U6bÕ¯¯S¹C½¯’¶$XÌ[䨑c\™Jh°R$“lÂqAäGèï5"@*ÏT¡ãºI•S¿`Bñ vš)QÃü–]ÑzAçë«wuüèi5Þ|+ãZo¤OK¾ÿŸÈ<ç‰ë·H/¼ ‘²¬ ÀGâ _âDàbáBǦÁl!¾”Ú4ÔƒH唪à–{¢™}ÿuJ:xü_~ï>Lª¿ÀùäŠbxö‚Ý0H‰>Jœ›Äg©Y×ØÎ 8] Î¥ÂÍ# { èî¤ý´Ü à :ÓÒ¦l¿¹¥éˆwKÌ { ®:=ü7šhÇs~¥žúƒ1¥(Ïý:dÜï?<÷¢”¾È¸v[5j`‡ÚŠ$á{eÐç½wòÍ¡çÂ$Ó ‘Ù“×ßy–5òh†(õÊz<ÄÃl²¯ÕóáBÄãqO©çm¼ã‘5†¡@±ç Z¨×,ÛýŽo¢àiÎN‹HQË›–Q*[6,÷Ûà3øñ%?ìÚ/ÛLôXm££­Àø©Ü˜‹™ºÊßÿ6¶ƒ6á•ȳVǘ.ü2 ,ÜÖˆøIOlû„¨*LvX½OÎþ„#Á»óÉoz¿Œ)Ôÿmr ªèc/¨áÝCÍOkÓ[VÐ}dUâA5 š’Vç[Ÿþ¨äñ6^.©â0ì=¦ ú|8ëbÖxM„Ž ¢ö‰#K€Ôú2ù<µD2§‚ß‹ÆmL ýÒ °Bm*”qRBµŽ×7!¬Õ`‡Æ~ýÇúõ7êbiÏɵõ2ÒüÖ ®Í«Rc ÁÙ YÍû–B¬š0û‡m2èƒí‰,«£Jq·v§Aæ,qêh|uOPÎÀc×ãØÌÊA8Ù­K-Ë„¼%*ðQª4Uï´°î pwh©Â‘™Q=ÀC[ÅiàœU,^jÈÞNC{.“#W‡[Ö[NíV•aM5ÊJ¥ÚéägßœÞ|¸Àz¤¿Ã–µ†]qf»÷@µ”5géóˆ‹öâïOß· …–¡ÀFk–³üöæoÖŸE¤fŒÉxÛ uHå^ô4Ínþ°ðzýRuÝy¤×ùDMåßÀr¡!ð1<ÎL'%e‰à”(,ßöåüPÖfзÝ\—ùãâ‹ú÷¤â ]cN'æ"²ò¡O8P·ÎÚÐVcó*é×£.ÞPÛ±d£à€×A¥¨¹eì²jn¯xüÞéç׉ʢ1KÝ+ßÛL'h‰’}ˆÔf‚å<œ™gF€¼mÈ`ÇÓ-C5ƒnhWú>Zç¥?U[WôózÑ[º‡<þS$o'mª©C*g3$lºù`£ðªÂ»G%ø@Œ ¹d3*ÑBƒk³ ¯×ôrN¹ÿdI¸c¯âSJÖøwâ¹#ßGߥâ+hŠþ»´õæ§)_0êýIÈ*ɈÌ8Ôƒ…úâ/â‹ÚÑI«R&ã6ÿ5õ‰Ÿ)È/°9hV²?¬Uè³M)a•˜LC 3U$j¼ ‹ëEóÍÊc†å UÀ—¢`;Ææ–{Œ¢Ó6lDBåáN¿k‘¬¹Èi[ÉÏLÙ«µ†y™Û¥:áÄKbÅ‘ráRB  )b#‘0ñ¹C å=X<^™þî¶ëÑŸ‚es;­®ÈÉѯ uKõðB›(ÿ$N)ÐDÅóŠãvZ¦Á˜û‰ŠiÖý/2¿qßxŒ9FÖ¸µ:'¹ g‹€Ð9[ýXƒb’<Úcп{µ½o†YH0¡†Î%Òx5ÎÕBeÜÄQB¡†gè¶«DHÝ2‹«`¿V^CºLüé*)ܳ\ýG+–Û›çÇ bWf¦‚bÖíj"ªÅ9ôTâc0»öŠB`vûÆxÏ`Š¿N_¾¸~ÄE7‰»_ RfO(¶½Ã ²*šRŠ1‹©ù €e© ƒµÔ$ÝÜ.™AQI9M 6ààWþèÙ9eù¨@wJ_™›!e X+п_óü=þ!ÿõ¯Ž´ô@S²*v¦X»ÔÕ$)h;V݇×÷Mo³æ®G9íÏû x–©oói6vzm×ý8¨ÿZÿð´;üŽ%í¥+0‹ëÊ›: D2–Èyë ?C$f1l³õÍn†G~ìq•l½e—4‹kˆQÕOqì1…ûušM{D¬ªë¡.øøF5çŽ@…öRÀœ rÈÄx6“œ®·¤…ào:ÃZ°þ6Xb-@UºMÇ:)e]•û|xäÏM´[t  àí¼ jÍåÚ4ôû˜$Ì@QŠ<ŽPLQ´ž8¥Ív²?—³"Ù°®~¯In £”q„/ÒoCü€v3µ£…Tèñ;2[òA´æÕh|M4­ª»¢MŒ0‡ ¢ÂL,É‚9†©^ª`£k׿›¤öJßùoö(õa€ËT`¶®8ŸÅnyá.µ,dõÚ?›Y$g:M3øÔjUâò#QéÐA×ʧrd). Küt‰-ùá6¢Ãêÿ.¨îf `Ÿït"0ÂÜêºj¤CƒñŵóÈmñûuÂæ4tßd½Ä M¨@“Ý>J¯ä(gÕiv¤–ñ®°hå:… 2"OC÷@Ђáaò©Ë A}Ôøi5E0‘¾äÕñÍbPqôÑúwÈT€t¿•Ruá&—é=ГCì-Í“AÌ;­âþngÜzðIüÒ»ÂC~¿Âpo.)¼ž¾G‘Sv±¨IØAŠ2 Õ{þQˆ¹Ç"–Ó:aË8â|DîµìqÃÜÀS d{^<÷bÜ }Ó:%Ök+Nõ³B³Ã'=z—ì¥/£z?q~(zü•èÛšöºÇpvš^“Ÿƒ¾ÊÈ ò ƒ^…[.‚nsåƒ2móIÓž»`5±5AêBUݽô ­‚iNÂ@O(•ÇnôDï¨!¤èÜÞÈÄ9Þÿ{¾¤ø.xè}ðøx‘.¸Ã³‹Ïå>CµS’Ÿ9õ3rH­\ÆZjo®¡í@GÌgJ8‘É€„‰ö/õB%u'±kÒc~½Ûˆ8ùüm &d™!?%-+:f±†’¨hÄÉÓ4Æ V>R–Ęl÷½„ÒÕ.#³´ïð©&¢SËŽ¼‹¿YÐ(h:GÜ=ïÑ,¬ »žC³N-‘šÿ‰¤£x<Œ1M˜«+ kÝÅצšøW}rîbO2_¹ˆ€ó_Ä24¿Ü-oïÇ2þ²y¶âÏg ÷{v{$L­¸¬!.~ý&kE衬iÛw[ã‘ø/ÖF¢w¶#(€½‘a¹‹¹ŸSûf>ï°6ÿ‹ þþô–7ù÷ê‰À§”ƒL<¥ýØ—S ÐïÉl(iÝé.º:òŽ%Kß L5›ÞãðR-ëTÕÂ-(P¾?‰W|OþÕ~Jöua}Pú‘×õ~-¢Àu³¤ÎC¹1ßsXÃ>mÁ1Ÿ¬¸¯DQTy ÆÅª Äÿ„gKCR;GL”'cÐÛ¾zNV+cÃþe#ôãŠædaVÕ®uŸj¿@I1?NFÙr1Üex“>ï·ÖšË…àR–~Ò&(µºc÷WhYûr\ü¡›±:ƒØ€øòîÐéJj>@íitˆ–ÖUÊK ²ð3ü-I‡ÙÂðM×h€ÿÝJù`€&q˜¬öµ~Và§P{˜p.¬~Ĭ°×WxËPË!7­Â¹òØ)ÂÄ㹩¶ËŠtärâmÊ»æ<çtÙQå×ÍT{:ôîÎàhcŽÓ:!O 0ˆän%V€’Öµ±û¤Ñ ²$3äT¬Rný;™~•é~bý-„“5÷Ê+ï‹ÌþÏTè‘mrê ÂóE»i¯Œ?Å58Vfá †`(Ð95t¹Díædíþ8!`žps»ò¾] »ì‡íS¸0“LÍ´ƒ¼úI‚[\¬îmÍ|0!öê§w„ùé$±)Z$K½]3Ý–€cCi ƒÉèn\C—%©Š¯þ4Ì>ß2J÷r¤Û.8u_­iý«Wëó‡u¶*L«Óã¬þ¸ñmÐ+¨ûýgà4pþÙÄ®xÉf¯Àw+ãî㪕,yêÿFr·þ¾ËnÿU¯‹ƒ5×ôóµùGi¶‡åŠ±Ú›¸zÊi€Z¯z*E›Š³·‘(S”úàG¬‡—>~Hàâ|Í<™ ÉÙªS±§:¦ÝÏ.I{‰Ç?þKgZ¾^M ±v›£®í=/0ï!à’Óíñ¼ ¤¦Y ayETÚÅC¢Í–èR÷'df„p×÷%XåÝ’dý':VJÐuÇlÅ“WÁ¹šFpf=6˜½4¢©¸Zô|¸ý6•œÔx±~õ Ï7P~Ñ È•iïoãÙý±wã<ƒqÉwÉN.m±cÁ·Éá¸QH¸ïFO#!C0•I/pØ^+`”Ö,[· &,¢Ä뵎¦å1.˜²‹ì(0BJmK(bµäD‘‘\¡îryºÄ¨fñTZì3µÚ%érœ $;4±PØèë*Çßì5b ]¤pš ±0¼%·NBúžÐ'p~èùzÀæ™ÝÁÈ#XäÃ…á (᯺ö±¦óA A”"üPRnV%s Â`ªDyt56Чœ?lÙí«ž¹WZo!£Šàú½=ÍÐ>üïéÍÚÒòKç«*¤(Ÿ)à‘Wd‘I¢Cc:|YË_6ùn^ZúÔ)Î'K轜¥ÒœÂF»¹F™7‡¼õbÐF\¤ûÀ¡UëÚ€‹í´ÿâ)¾Ïë>G't@¾Rw…ÖÕÜŒ&€÷%Z„XôBM‹^=ŠÌ  Ï”g=z©A†;ÏYß®Š+×u½’‰"Ÿ%gC ÃFf]„a  µ©äÀ+îÚOˆJ{¤]ò†=š»óJl+ö-&r‡¢7$dîPÌâVaU/R6ê‘Mq‚"uÑñåçv§a™®,Ë?ó ½Å×Xàå€KD¯äÇÖ ûH‹‘»D\ЂsÕâ=²™kФûÆm‡&ÝÂpWïx±7”¯+ólÎJJ6b·Õ°Ù)Ho;ÂÈè; +ä¡lXW¦*f Kæ„]Ã÷‹"Øð¶Â~£dè•§¨œÍ> NQuFÖ†¬™º[qŽûÔ§ŽI€vÏ/ËÒ‡¶÷,yp@u4‰×Sª1òýW•W˜B|°‚#Í&«¬‹TsÈî’Þ{GMÌ1I~Ø2 *Ð+9x¯ô¸ ªëçõãˇ7¯×œS ªqï´¸-Orù³^E·å¾v1¤µ?q?n.ŽËC}âƒEËSדùÒ÷%ºícÝ]ú:®ÀWIòÐÊõÌÆòý¨§‘2@ÌklŽJĺ9.+ZÇÒG€ï!Ó)ÔÆ=0?ÏÔî¬'7©Ye_HÍ+ÅQÁ»¿–ÿ1Nõ˜ºçj()/$‹g¸œ«Š¶C¨C(‡sKKH¾ÐSaËФ“¶«¥ÜH pËÌE«P÷åSøœüæCMáÆŽewï{îü¤ozqвK A£…ð_|o8¬]rIOì¯ Œæ6'J›Öà–Ø¸V61OãŒVLð:{VòÑ,ìÒ.lÙ¾H] ®£h¦ÍoL„Ñwj&í4óÙïú©Sä姇O¡iJÕ:}!ªuw%ìA-['ýaÓû ž«»¯ãƒËgL;l÷.Š4äæö¶#Élýì‰Zo q“êZÇ+ñVqiº’äÞÕz\\ÆT¼ml`)¦oDÁÎïš È5šô<èº}ŽÔ±¾ÿ,V×ú¡%¯™ÒF¬@³>6‘Äö4$šV:Ó[WmuÏÀ þ6aöU|gÏÂ:2_‹n2HH” QŒ„{*“Ò{Ð7íR¨Ê¬±Nÿ9éU ~×€hœùð¸6†e-Ý„<Ñ.ó[XÌZ€áÖÏâq ù…îÝÀSø^Y”Bp,‡Úìéæœczü²q¦¦Ðcî“¢ûµsupx³‡ô˜Ò× æ›O¶¢ñæèÀKrF¸2%4Œé~ 8ËJBTÜ œ„ ϱ­â“G’ã"›ù–mÁ¾oiL«u¤D[d-ÚÞijŽl±.bé}ØïK•¸t«;²à¥ú»îEÊ„ÉÉ”ÐÀÛ"•%³>ˆTú½Uˆ›*LTÌѶa§L£P~­\ˆ0|l+Ùé§ýÏ]0§¹­äÈ<‡V2’5Ë\ëJÔe¡ æKœ€ì¹»4'?´@Œ^*Á9ðð'ÏÝËäw«Î#h`*w»âA%Œgè[=¨Ót’,UáýäãP­çNøãñ_>¼—7Ì‘åäY½i' þ\zj€1{/íròÛÛìBú•HàÝwÐòàÉ5ßU%¾QÌâÜÙåo ûFÌ¢ÒÃШ¥6wÙn¸î ‰MÊ^ˆ1…S€OU^q[ˬLp1ÏHŽÄW·`#DÑèv^Zc5„$|—p‹Èç+¨(YòS|vîgIRýš§FÀ{çïœ.Ä ®$r$ƒh4¦}øyÑkK„4¾ˆÔ‡Š”šÜ36†V3¥{û#§"Vƒ ú?>ä·òFšè>cÿ¿…üØŸ!›Ï#ÊÞ?uZù欺Q”øM‹ú(NØl‰ ýu,e¡ øè°ÈD¶u^µ$+íüVL0Р胉ß:ŸYÙŽ¥òL/颺w÷ÕaUG4i”ÆÆGrWåѽ|­A·ö¾(imûôÊ#Ö³ÙÄý:ÓÏTúD÷É\%K?‚Bö"´ù0 ä|¸(ôî¿Æížâßì×{«d—Q#‰Æ>óýÙÙI„îÀ[w kè6À—g$Øor¥ƒÙ‰7p¾­BÌS4¹ô5{*Ñf*¢Xe¨FÞnå^æö1zÕ\@ôît,7ž=ã¾0$žW‹iîmD'ÄŸ5k/J±©hâÔ!@D`§\®-±Öesá~[lYnŸ’‡^®ô$èÀYîwʰyœß<Åh¤·­r°—ª´»ïJÁÆ9×”ø]¾ñ Pjëvß…Ê®4$©bçZþêó`†«‡”òܱÕ; EúF<érƪËqíÔÞ0l†38`½åz¥q·“WŒ%:d䌽RþðܪQéTå®c?«uK”æ}Ì ¨F®Þ xHz€ ™çÎÉ”´e%ëI °Õ÷£Bk –¢»~Ò :ÙB‰¥NÔ’Þ|)£pK+"?ÇÜk ®ÝùÀG®ßKÞ£†ä2y•³³`Ô9ä—_ú.Ý÷‡+áæV–Ð(§œ±¶[ã2DÂQ­¼©É_ÚÚ²ý@ÌþÞ\¨$-å¿õÌ!™%!q@•ö<ÃŽ‚Ø¡CkÉD3¯½2Ë0l„ûšeÉ3|YÖ=\µÚ§¯ì°ÆàŒw.3aí§’‘ 7„ê}¶³í‚ŒoËSVêrÐsL …À~·;'5ЪSY|ØÏ2ä9â[,ÎG'!2,[ÔÎÒbKk­ÅÝ'nX*pÝ.$kk €·ójõÍz¸ÀBDù¢Êä]ƒLÙÙîœCóY?Äl^ùW<Éýé@'[ëŽþµši-~~òm4é¼(èYðf Ìmt " ýÀVÍ£$] [Ïs*¨Ê‹“„{‹d ¡O½üF†S> ã ôÛH£6]V¸ÍÄä6+§YA/‰ {s‚„:§ž‚ð·çžnÂûJú+šôý ±³~ÚI¾-Â_mÁgóõ‚û‘ÛÒBf †5;xý~SÔdQ+Å\¯ÚùÎ=ù0£0V±4¸PΦµŒ,\å¤Jœ­¥4€Mõ#ጇŽLÇwmˆxð…U°¡«ƒK)ͤƒ'r×-—×u¦>p74ß>¨{uLËlo¯ ]À¦? æ¶GÝxǬO&+]>ƒÜº_Ëoõ¥Z‡y§þ{¤wÐÜÖ·Ú ËtÍ—4\ßÞ@£Á–ëªô9:ü™ñ’L9~NÉnö•sL° ©ýlÎÉÊ©C©‘NÇB„ïp6™£Î¼™\&¡)W‚éxXù3UšX†’6 B$#a öúôÏ I|™”°¯Ô}]<íÅD‚6tq|δ¼CrÕŒˆfxj+¥ôô¦’³ ÿ1N˜ö½%/¼ ˆ† Ad lô]ºVDÂ0oß3Ë;¢£Ûz´V?Nò-k],¬STPúåéÁRQ ­d*×Ù£G+S'·9¥‰"?ÄP keY¤óÀK¡DÇ|Š 5%Ѐ߷„°iš;~©þÐY…hñ'žhI´í/2Kʺáîr,£XµÆüõÓ—4j§†qŠXé7R/E<â¥óå{%>dR¶™ö,:2…]g®æàÿáPJ´êr ÿ绵X¥ÕÂn~h­ ”—}õùw$ú¾àç{úaù£Ö¬´›È£AƒP)ÅþЬuk¨ËéÉFeŠ&‡Òk#Xë -’‘"’§žìa\Ç.˜•Pˆv‹sVŸ&ÎÝšÐ!Zf¥™5AØ1ˆýw‡¼.¢^hz,(øüÖ¥Ò¨3‘GÃ2‚2øªGT')ºÎ8Õ¾±éðx¾!N, ÖæçŸ{¹ªq«ÿi@v@]€”ò/F›`–šyóM!Yžô®Ñ9AypÞ©Å£‡¥q"]SÀlXwLp1ôÜ»ùºÊ–Ù÷ŸÅžT•Ä9y rTÙ#ç?ÙY™ø‘€ÙÌ(4¦Óî[‚K DAô×ZrÜL|¿ý¬cÄÕø>›áÜQ3+ûÆ98Ðëò>Uí!º  62^MÛ)ÁP©•2úÿO³'ëjªGù"X?Ç€D~X‰„%‡£¢!‰Œ1ù—W¶Æýw‰˯ç¯/aàof0Û´3&…û1.ò ™ÎZÄ¥ìËx¿ôŠBcËW·LÌÌÿMá(í¡ÊÂ0ì Î2 gú×Ù©xs3NÇ]¹’_HvWç¼ÀëC8[cr;môîï`ÿo·.ÅPuCÝ}Èý¯ iÎûW›‹&o“y3}¶ ŒK~ýJz‡â÷÷τ赳Š)¤Y…<&óžªW[ºãsқşNrRù1¼xôê™åJaSû‹†ëÈ«7°Ü ï)[•T­3œ%*ºUk½Ùñ–Û£! ƒ»x;ŸhÙYæA=½ëâËJŠÉ /å °X¯µÉ}µ?j))$Û@­¢&檩˜dVõ¤þ¾á½nG©(EM3Œ„EÛ[±;¹-ø 'm©¥¡•+1'P\Édj¥|¢€Vû|ä$îåùèðèZ¤€IÈZá1Æ‰Íæ¬«GT*I «èš}wå°Q©¬XŸA`‚¡¬ê€ VÒÞS98D£O²G2ĵ^\a?f|\._ycçn4X ‰ËWtIMß„4ðš×OñàƒxÈMuñ:éV"€šŸ!š+ªh¥²n&H‰ßõ¿Ïp]~YQo çÙª*”‘ך—fC? å¿d‰©ó*U #éUƒMUö‰y§Ôïš Þf¿´^+yà Šå ¼Túq¡%¼ ÈZê>Ù/çÆôñ±ŒmªW#¸Z¦ÃÁf§¹8û£vÁ–å׽ܰ«d(âûÅM 1^¥@i'¥6T¥Ç/Û>vWU.¯P­ù˺‡ékÒN‹þ-²Î†¯k3À$ô¬«ýgRæ!vÁΔ¸,³'qt ×gE­êËž†ZeköÝò}­ñ†ï©jwpÖ‡“>«ŸÙ©@1;¢}·‘®±š(Ô…Ìž# À<ãü`%S~w c kÇþ;:tÓä?¦Ìo·¥ÔE'üá¬4d›µd£i6 ­Ø˜K‘ßQÌ:ORr™ {B^ÙËd °e¯þª‹ç¾ŽOøjZ‰êÉô&—ÖªÙ·ðE™nVóôc)±Ñ]*Wåœ]¢VÛWyе¦r(ïëé!•¿à="#Ä÷þ¢’V¸Må 3¢–Ru1•^4Ç}oü2®â2Æ ‘ôêSĪ-ÁE(Kÿä5ƒè}ÆP5J’^²{²Í¡«t9&4㛬M ¶"²œhLÚ†î£ÁƒŒ.) Y¾ÄMjÕK–°Z‹ß»Èm ×c€­]SZ2Ý?Êd9ÇwãøfZ²­ºÿ¯ó k rÁÎÚ}Dë)ƒ€¿|)21†½£Vd c ´ W\Ü>¸šâgéF±‚ë½ÈÀ|í§œcçpÏE†¸Fdñì×fR¥©4[ÑÄÝ$ܲ`Ü$ÇŒ<(çvñ¨t‡«ÜÞL•(ÝÛà(×—>/Á]+ì"µWÿML€|ö “uH%.LµÅþ#7à›&‹öΖ .ÑhàÃç„ÛóU‚ì7¥–÷4¹À' Ë´uãõL/³û voLD‚‚‰gW»ÀªðTw±ÿ*œî_ûÄÖy`Ñ=£vèí:Q>ÐK¾l”z\K½‚Œ5ŸÎ˜ÝKÃXå 6?jÍã›÷sŽ]H‚¤5#§CžAè¹>: ä>¾çpQ†pa*„eLÛ¬è¤þÒ AÇu‰ÎÒ6m¸N.*ïÌ;˜ž¾¿ï7åù<)6éQöp9$7Ùtc À 9y+ëc¬mY}u6ý˜1‰5àÕTŽÏlbì¡lºh¿ä‘Òƒ¹,MÄÐ+MüƒÂçû¸"<¸På|çy#õÚSkãÄÕ¶Ñ’ßX}çVîN|°éùÓ½œ?¾ÏJ,Ål6õ©µQ‰K£XÞì¶ =úã¹>ðŒ„<4âöÂt°Ü€åŽ%25P[ ³¢¼Bï¢ø;_¬n'õ™«ŽôT¤×„ˆ/-?ýpßò!Mk—íÍNdRYøËzb¿^h àžQ[}&,éQŸ,·X ;È8SÆ«Žr§ŒØî¤ƒÊQ18úÇõÀ«Õn[½iÂŒ]r-…Êù0oj+Ö/)XœýŸZÛªii2²Ç´=†b¦ `rÞez-úâÎx=D>÷b%ÕmxÐY½ã4j¯àÚÇòºT÷ X®‹ÚŽö J‰ï¹nèÒÜÞúC?µO,3.í\Ç›Pã´á¦h£y?<Ÿ båHÜþ¨ Õ‚ÂzÔŒ¼øÿzà à‡k&öRþ³WUá¹Væ38ox‘66 —.¢)7û>][˜ÍÞ³‡ýøÝ/l)¼6èº\—íÁVŸÆbHrhýôDÆlÝ“I øç ¤}<‹Ê®Ô‡Ÿ& ­Kr23±e0¡¢-Ï:›ƒx%²ù8';×üI[’`”Ù¤¤ãEo±ßØá ŒX~éâK{k÷à¨rŽêîy¸ßþ]S‘´C.šùëß‘£Oàðm¿jzÆöB¹¯Z—ŸÂàø¶«ÚáËD0ØÁq-lµÏ7L\ƒø¯d¨¼Ú˜¯,X>AR“öÕ.ÃÎoþ ‡¦?¨b_'ù¥I>S÷ÔŸÔ³WÜ'8Üï´(h 31Ûèˆ&ð—A.Œ`†– b—·F!è+ú›Œ„úwŽ^:¼às왬Qhhâ\Vò–ð’™ó‘—ïß À :LjâԱ߂ÕPŠƒ–ñ„ÿ7ôÊÛPÍ£¢´sžPtçÍ5GI´VZØKç÷– ñf³×#Òò¬ÄœæZN{ ë×ëͣĹgÎg¼# î²ûÊè^Qܨˆæ@ÞĆÉJ{,c0Çläµ´ÃèoM¥Äùâ4+ÐgÏ€Nõº”f¸A ü!ŽxŸ:ªÎEêÅ?qtJþá”}üÐä"'Ï-›„Iÿ›K®…’Qj/ ¶I|o 5ÿ ÇGÆ|ÌvØ­c\ˆzÏÔ9 âö¯ÕìMÇ›˜C2¹Y𶉪[Õ qÖ0•hôkÅšŒ ­·ðŠ­¹à½{ÿC~êw³@°Ö{~{8nÛÑCÊ%ðNG@Ìlü(ãÙ"T„«Øâ-{$·¨Àwëãç ±ù“Ùy²Ž&±^ô!U®[áÕ&µ†tÍFx»Í7ä—Dz{ûÜ<ÞË}“’ÉÞp(ÄîíIS¯[Eš8ív†‡™víia`¾§•œÊ$ð%¥ù•ÏÞ–‰”ÿ4ùu‡N¬WÌ&%•µŒzz*£LzÅÇû#f,Ï´ _À=¨c“ЕÈ:ˆ³Ø(µÏ\f'JŠDY"ï"o-ý¨3–©ëDfaŠÙ¶B ¸Ýjë¿Óv1¸÷ÆÂ *S{õpðúØ“>l¸>ëOqQQk(ÂÉ•0_Wç¤yVã®d¹…†Xæ,ŠýÿÐh+- ìÇ‹üžIOJ ®:ÿá~®$yw•]ìT>ÒEžT¨—•@­càX*á/·óèO1¦ÝÔll´ ܸÐöc/e=¢3†%p‡ŸN>Òjygë†ÓoÌŽéÓGNköG-aZWŒ-ù• 5 ÿíMÍæWšÍ9û¦Ö“Ñ]ù>·•£šÓ6l€Ñ?LñÒÓ§œ­Ü•Æþ"-NÙ4t8|c¿°#"´I>߬+ Y/aï¬Áªo_¯~¸ÂMýüÑGý wcˆ‹µW¿"Þwhû “vEÝIzm”aÝMíó—ñ:ÅkC—A•ÖPD¼'z¼e£ó‡Ìnd]nC%ŒZ‚El ƒÝqŸ÷ê0P¨×Ý Ÿ=\,5€#´‚Z97¦ÿL,"¶È#!û¥î `ý¹ÖÈ™þt͉ñ¼n ÓÛ¶ä ˆ1þÌ)¦R톺8™,ZPl{BÉS¼~*Æ·Õ5 ¶Bho7Þ´ßý '3 Âb mm@äs«¾¯\­·‚å[—4/›«äÆHj²òöŒa3¡yY9>X©«ßìÊ´¹Kå om­Q«Ž–"g° E¢…Ñzøà*ó“©Ms彌fsÌcÇÈ ¹ x)Zʾ„^Û¼¼é%‹y>þS¯Ú^<áHZ¾áþ K̛޹õͧ7y1[];§æbhõßÒZL8Õ-Tw‰A¡6OÊĄܼv?a0ò»»ñI“ñ—ƒ”Áy˜–„ú×LáŒXû¬„c©Ú¿Û_Õ9TèÊÜ!À_H„ñŠŒ´%¥R”qâv³é?ï6¹ÂÍ»oQ *XQj©açþ¼ÔJ4£½+ŸTN~|G›pùÞ9WÍ5Ò‡"ÂîÉ«×P‚ªŒÍBE`¤u÷ËÞÞÒ:œ÷ vÛ?Ai”ìÌÊb/†>5:J¨Ä¤Í7ÜjÛ²Z,­ŸÚÎïÉ>6TG¶Ð ç7>"öúÙ]Gtäç•Ü@¤:šBöŽ÷ÿECøÄÅIQ‡ÐÚQ„çjydwwAl™‹ŠÅ—?8N«Š„nO‚ô6çˆÂn»«̬͡#Ïu‹¬ †’窪}RSEµÝð;ð’½ûÖôE½ø2çç×Ûb#•í¾Ž«"ðµ”{¤40˜+c?ÒøŠBÛÁQkrt¢œY„g½2@Åüþ¹Í£nXÛ@ ü8>Á©Õö®$Ù-è£ ¥*¿ýÛÅÛû,úß!±Ó•Ñ+¸'C[GCTˆD¬èÿ Ypé´ØDmç‹~(3ΑžÔfÜV÷ónŒµÕ5Z½.qx#X&Âñãp7öëï¿–¹¼Z~NžKÇŒ½íAì<c5Ÿ 6ä.>…wø™ô°dþ.ÀDvXÄß)Ô†‹¾‡{^,óùª‹0Ñ"16ÃH©z2UÛäÙ>6£Ïê¿_6 }ŸúÏü"!º3“xr¥ƒJäK.¦²* –-ŠÈ_©q±âšLe(mÝÞi5KaûT¬ÐyÈç—¬›?äÑí'áÙežõT¤…$ÅQ**ç—ʼ?…ù»¶Fw3|–qYs³ñ:]÷æØ7|4%~•Æ(QE¹†ÕšYA4h̸X³yàí³ŸL m¨;£ ÔÞØìpSžè±÷˜ÌP [h(üÑÀë;´¬${ÈéŒk?î,|SØýÎiŠÍÁad˜(—¶Æ>O#|á+¨oè˜@zw`:Ý}T›}¶…AzG8fÄù;.â!âÖÆH³«ÿ¸*ú ëÇìyÒˆõ<ßëÔZ•rÚöˆÈ—u”X&|ÖB#^íV’Ýõ¾/gõ hÚß*þzI9î²ÁÆ=øH9Í›ó¢Uâ&´ý‰“&ÙvEDî>辮 £Þ» ò#yá¿Þø®íq¹4 uèÌl;‹¨¢¹í|ò‘Õõ´tßf±ñ¢»Ÿ¯¤¨´ŽÖõhŸ‡ØÁCËF˜u´MŽæMú¢tמÊ÷¢8£ãœ?qkN@jÍ_AƒÿlÖsCŸ‡í(#D©á‘Yi½»iOŸ®ÕO‹ó£c)ÄzÝsïÔ*ЏR—h1ï»Pæen.,fŽ2j‹ZƒtYGÆ/~úŒB‰mY…q“E¿Õú5ÁQ̯¼óK’Ù}ðÏk€meÈý Ù~Š3H⊈u çÕŒ{¬ÞØüë×®»e%äú&µW$a }b<Õ\¦5zcs;&fxʆéE¾heÒ`à%{4Þ¿ýo¸QU³Ìç—Qð¦Ÿ«à ¶aAž«jÅFQjÞUî"Õ5ʼØ$=7öðÎe=Y0oÂÿ’®‡€±â— +Ì”‘ó"Ðyôñ„„ׯt~c§¢ Nm'¨±…?˨蚡]~§töƒyµ?h AŽä†´á£<2Ԥϭ48Rê²ÜsÇõÕ=,ÓÄmÛßát©‘ÿ:½³HÔU•Îܸ’§{jÀÐ öŠ‘!fâ=ÿæ~š!\;A–%M„JOî{#Ù-vÅÂf7±¸Ì­}6;6&O/»È-m{o Ìá‘€ÏXîx¶É»NÌ­†º¬DÎ]sÀôÇ}‰ãP~Iû®uµäk´ÙßuþOD_úûHxÍ2cÂ#5NèiÕ@}J=ˆÆœXÓ’RÎJ¯ü(×G‡øâ"ýqRåOK±¸½Nm)±Àáæ·u=\´ 4V¥Y}´=/À—±A*›ø¶´Qø…f¨þIÝ q:*[^ÈL5ó# G îyÈ#‹«:fS¾¨NP‹­ôz¬ù~ˆ@(!‰ÅQIt¸Êþ^]™_ÿ”†¯·êƒtòœB…™i´Úþ4U$vé~XÚÝУx.çÈ3ͩ݀EúhIòÎ"„Ñ9>o ¦¸ò?õ“ì(÷Aª—ÌÄÉ­Ûè£zߓע®1g“Ë2¡ªø¡XJ@õîæüÔk¡Ñ¸Ð8'î ÑVÛ²¤Òù32ãsµ#ˆ jèOè+Uh`d"„æ–Û@è4 ±ˆ5{½u¸?Ëv™x¿¢¥ð™°>Œw!(±‰4â¸ÀU.úl˜D€ƒ'- î™ÆB¼e3¡Ÿá±ÞõP}©‡*Z½šöU»Ðwߛž„™5a>v)Ó%(½ß¾² [ÂT?î:ë@©ç5ß™T‰e?}NAñÌ·aW€÷›[ÂSÈPÂõ‘!FÖÜÏXÅä ž. ê`X§H~Ü¥ë2ÀÁD²§—úŸÍ«}ò<£™…|KÕEÂ…ò,HÞ7Ñ7 @§ð/#¡^ÊsÍSüð¥ÔËJ°¥´ó‹éÒ $™Ù>XëK ÖpO7±Â­g^¯¸QnYï&¶,ÔèJPˆÂ—rÉM­o’YÒôà€†ëvð¬9v©[.®¹ hJýzDNhïx·Û9@¥ŒxÝ9ø²Þ¨j߇žPH;x(‚7\ð8Œþ®Š²á$ÃŽ½&±Ú8 †n]:Héöä©î\QQ÷ y:+wMZÙ•iˆ+(ož¿8ʼ«>¨jðø&ÿT¾-'z§á ŠîÃÛ‰8k§J¿¡–ù€¤%Œ©Øç1Ÿ4âÞ#Ò}ÅÅág|¬ó†á­šãlA/í«^Œdþ7AZô ˜£ç.‘¨SŸXg†@_Ïæ82ßv —úkh¯þ/ ¶sà© ›ŽÇ‚hÊ*% µŠK^SŒ#œnGGtò="gãêóªÍÏÅäVÑUÅz­ï"Jú‚ûië*ƒ’~¥úñªp+íž;­û°¤"çlâ}ª2º/Æý[<Ñ1TºLù-ž3!Ên6NÄN­t†ïMÔJÝ»%š&¸Ž×£yKÎ|ïœ÷ñbm NWM…DÍ5"œ [ üUˆó2Uy@¹1|ˆ"Ggš¶’Ep•JÙ´¡a“ò8 3Ä"3†iÏ V>ÄT7 »–Ùö`6ØÀ ÷nn¦¸ñE8¿toâ}ïhltîªdôÔRÐóŠÏM|ya=ãmÌ»ºZ 0µ™î¡$*VôÇ…27ó:U™FU™óÙF¸ÃÞ~]ß¼g”bFAºÇKÞ`;/c6‰UôŽkŒWüIv±ÏC¥ë†ë’V,#ZÉ|¼ 4+ ôó'lñô÷ÒJBì³év·e0IzzûÈŠ×úÌÉðBq ã54—GÛ6>i‹QÁÆo7×X1*>9<Æ Xl“‚_¤B2̈k«ÆWÎ,(ub¸I1ͦ‹·°­@ögã¤ã&ä|…µ¹”Bþzi•eøsHB¥Ÿf8Ýüo,:™žÑ–»,´c<Õ‘™s¾³ª‰ÃÀÉ{ ì áùÞÅ€à/uÛû{"Q\Oðí–Ú– Zy·"eš óÚ.ùé'¯¶+wð¼§L } £™sÏù\b#Ÿ‹I„f=§(â —Ø™ý:RÀ#…]m‚އ™Èß©ÉàäMÈN¨ÙÕ’•aäQ6³Ïë™Pn6‰T«í(;0ÿfN‰T*ây¡Ü‘&0Í®ÊøM´1¶èoí$(FÕÿð•­èB%²ô&;éóÍâ‘FŸßÐ'´6‚Àd>!¨]©`qYQE©Þü_v'ý÷gû#ÁX݈°Ùp¬XÆM³m2‹þžåïÛ>KäĤ|åþx <ׯH/°³ŽbõËe¹ã˜@7Œ¼ÿqíÄÓ©ª$íý Pþ£G»'ƒÉ§¦Íy°/kÆsI¦œ™~÷δTE-å¹JžÃvBP¢ Ê^ZXK8Ö¾‰ìÇyè{M¯±Óª¥Œ!h¾íâaWŽ=DFI ®Ø“ÍᥠÜZZwazð ('h›T ” ÊÝ+&=÷Nxwúu¬ôL}Á]øàIÑZ5Y½=R7ý}§5o¿cÊî»kYxß9ß; èjߨھK¾©wú'ŸÔø-9ðК"“[yÅÛR 0ǹrÎÕÇ'ÆŒ‚åïë72|aAÚ ‘ëÎ ƒÚ¢ƒ›1ðQSc£úIÞ–”Lèt «ÙÌÿRõq«Fo× ~Åé4ÔdÄÛ†²ï­™6 @ÕŽ´¼rÃ8U¸u+__GmÖôSò‘·\ÓÚMòͶ …G­Œ|GQ¨&h¹³ÂÕ_öÍös\j±c¸W¬r¦F •chZ¹u±Œ@˺‡n–AÊLézžBSOZÑò™Ú$Ýk˜¶‚Eè¶;PÊRrþ³ÿUÊxBXd.¿RÔ h†ÙPûµt}ÇV €`pä´{3šód´ÿ¥ïnvÅ‹ Æal­hv„ÛϾÿ‹QK¬‡/ÝÆÓ-Äo0™ãl¬.‰¦¿¼÷d¨ôv‘®2öFÚ¨½Ï΂÷eÛ<ƒÑݵ©ÝBN>¯3¡„ègwÿ6£ð:O¯+œ0‹²£‚¯WEÈPàaH©W*Žd¾00&±ïØ`h­ÂEªÓÀB?wwó¹§{±á”—WÈÙZéb`]|ªÀzÞüˆùíb³ ’;¨tâ¹°C¹ìM2“ÇɹšÂíiðÝ€íõóñ&I^u(x éWe¹5¢ªY_óYóÏt—žZ‚††*rBà ¸KÈçvM×Ast?êk2ð•V®üz4‡†¾TWàÜ7ÞAûÃð›/0xV‘lš…½;dµ7Ø™I·pÿùýr>ôB/¯k±u{a0 ‡!ëL‡‹ÁVU3›=>ëê¯ò šAúàÔB”Ð|´n÷e’Xli éï°ÀR¾’Fn¤Ò¨péaŸßL’“é¢âŒœ¾{NÃwÓ~ê"Zoý:ÌQÎvÌŒ9…b¢¡A¤•y,o󴵯yada¦…ìµ­ãßÌ\\®uË.€ (F‡¦ÆÑŠù€•7RdýjƒeºûäÖl¸œ§Ø†ÍBö©…Ý,ë»™å†l&68rTµu&®4BØoºPŽ¥Ç*RUÜUkgS×§n Ã7.^¡m‡r༠†Ož÷ìös6 K°¤©‘†ß7Õ ¬€Èá¡o;…+ËOúÇP¼¬ªxé">—šÄfUSvŸ‰¡…Å ˆ<&8fLÜ“ùwË7‚E¼[.RÉÅ «á"YzÛ3F†ô¥2Ô7{sN£"DýGèéBÕ™¡BÇWóX{N» ?ý'Müz0Ô’¬Öú‰‰ïwrSòD¤5Í bzò+«l0Þ³Ø' _|+ 31P ¨²‚ï\K¢W¿”/Ñ[#üàÌ¢ËUû;6×ìíúç¿ÌôDº:ÚÆ/pÎY*ÁH¡¤«”(¤š™½š¦ ©%>­7¢usZÛyœ²\n™_n~’ [)P Ê¯ž>w=zr¡µ‚”Ĉ“5¼‘?:Æ%ðÇëulÿ1§¶Þfž)Þj‚¾²-›Œo_¤Wd˜œýuÞ¬ñagp®m€‹-à –i!-}ÇÉÊÌŸDÇÕvwÊÕÕ^#fäê5Œ ˜¶Iê ry]÷ªZ\¿*ƒÓ{ç"‡»>>Ýt—Ô²¹‹WDíÜ7X`‹ËÏØÄKæèù)K|°ñe5€œ56ìб &4s},äÆýò<ô©œ{Ùañü¢½Æ´éµÕÛâuÔT¿øNºQ×HêîSR®Mªeú°Œ$Ú^}æ YÇLlNNTïsF¹RJ©ïÖOñéÒ³J´ô c€~S ´[ß <•WânaS€äßV+„Hl`ò™ anšYáD Õà¨Xsæå‚?5:ŽBðP•—• "FÎßjf[!ã\=s KÄYµ>Ƌ؎æ2ðÞUd<=)L¼nP4ò³<bÅiMîîaL;ƒKLµBªxû‰‘™½fô®“¾}v¿:J葟~^ª_#?™š)&æ Þ}Õ&§RWÛ~|æ©´d|¿FZTr^Wf-iXðˆ‘¼RT=—š8ÍN§†¦HJº•†àø{j+’@Dø :0U¶z¨9BøDoáÌóf†ßÈu8Z?A>?Dˆ<Ãëø€/P3àœ.–®<EN ÖåÐþàóUÇÙæ×Âa£½GíRX¨Í›ýå=@½Në|XÇIp®¥§|Õ ÒEôùÔÝšŠ#2 ´¸è€Ãf)eÝ’‰í‚ùŸ²…Žå°û:d¾ AæËA°ÎÛDD˜k ¼çé ªî/·’fèäkPëLËv[ÍcÊœÌ;$`³Ay2U ˯ðÍÁ¼û~Ïh·„…$Î ú^­uåBxÂuPïë ?á Ž.è󤉕Ÿ¾rï.èAKŠªZÖ˜ØölR¨tË][`¬>C°«L"¦á»Š<¬8¡£ñ€+¹—~a6FN«ùI¤«H^õëÆÌJ6¹©l‰YêÜ­ež PXÍÈk™´Ló‡gÌágŸŸ|‡®¬S‘mi—VêÒùÄz€ŽùÍ”ÔɈ{OçÈš–jáG.÷ Ãâ³Æ5ë†Øçµþ­ådÄqÎ_i ü»üÁt'ªËw¯€2ýÊU=á2Ü@±¶‡{ÀôëåÅZéÜšä;Š*qúttˆ¯{_1ü ð¶zaI¥r¡k´®h~´©[¦~)Hüëv!ÒêI»U[·O’:Ik©a }»/âj±›)åêr_ù¼Æ—X@¯k?9Th;¼%ÎA6÷L,ðŸâXnáe‘1¬ôl]^Ñ#iÄùˆ¾°>„•D/Û¼UM'`5±ukö Rð •\ÎÎÖuÐÎxÔ†bF÷v.Jè½mŽ *zq|ëY ª[õÅŸãBøN,ýw>"4OBå"D—«<_< ‰ Çkùt9b9…˨&,d]oÏvA¨ãø§Žü’ŠŠöRQËäÕ΂ŒJÏ‹ õ k1伕tZ¼#:j´CÓ%Ðlbs­Ð÷܉™ÙlôV‘ óÎj§WÐ ¶¿ BÉ:(īآmêÏÏý žvwç^©. ÍLPìYÊ0&Ýù|–鋤(Ã!} J¦üLä)ð/ð¹›ë!v µØŒÓšè~•‘ã/úFBŸk7# W ª‚N‡¦zAuß¿+÷›Ž* Õœ„׬rÖLfàBJú#Ûß‚'²Ã‰|ì4f}ù¿êÂÈ8ŠâyÒ´çåŒwÐÌÎi¯l‘r…ª­Õm#yƒ ‡Qg‰Äól8ÛHž‡_ÏØmºµ!fý[Éâ©Àëƒ9žgûmlPÀMž§È¡.}É?9—†ýp}6Ã9½Z+÷ ío¿¶¦ñÓà¬P.š{wŽÖ ¢Ø©C.ò£_ROÓ èN[zû6<‚œg}òúu@¢x ›Ð4un*ñÿvªE#3‹€™D/.0©0‹ °,/ø|иÖct˜Ê Bo½Œ|ÅDußÚãƬƒÀÕÛßÍ6D€°DB8Â-ª;_EöJÎÍãíò˜2aÄ2ŽO[Íuî€TF¯´ˆ€G¨-<geöi¾l”µœ"`jø[pd*³Í¡•¼‹â]Nà^›$q{a^zâ¾O+eácËÒu…:^íQ@Šø±“VÇO6×SÖ5ú¾òîvqó`§°E ÌÙÒSø°•fÕ!"ÞØIѧ½¹+xÝ$c]¨äI­ºt8çÙè{óo´Å~¥rÑÇá0ÉSϮ֢ìdÍÅÕhÜ™Ã.= ªÉ²Á«(•” Ú&õ›©‘&Ö WÐÁ”As 68pÆ%Q¯l6(ÚŠÜnHG²7õp F>"©¢æ/&^#¥•&è–ÕÚ,’TxäÛ0èi¨!bíö™@ËÔŠí}§ÿÙ¨òñ ‹à=mÈ;/ðCCŸ›ïÉŒTåJ‚"^/œŠûÖ.w†eèÙ)þÝÏë9À¯|˜]˜› 'Å{elRæèÍýÌ‹àj€¿"±vq»¢³ÜW$J…õׯ¹ï/¼¦V~¥Ïã`·rcr=ãµeÝš½†”©®‘<­Â;Ìô¤“7Pêeà¯Ä=IÌš-&ÜþQ0Ùàûú ¦ÂÙnGq,ÌìÍf°S¿áЖväÅ?§ù%ùÙ÷x £’Iª‚Ý[u)Úk㼆¹#Þ÷Z¹É˜GÚiÿÆl »(‰¬à ÷´j&ÞY‡›e0o .¡H×UI¼ú4±fª£÷9=h±o»ýüTÈõ½ÑKÀdÊ8iÊä,m…Ù@"ˆçô‹qõ3w÷Ž’¬Ú['FÑóèB£„£#²4‰Û&_zÎÇ Ãì@aYÃz‘Ï'F‹áÉxÿhÙúŒvê‡$&Cwšºcè–íÏø±/ý¦ûbÀk§U¥ƒ¼VÝ!1ïgcÃåLË\ÂÖ«T’u4ï“~Á³öÿEDoGF^>LµS5`bkÇU/ŸsŒt®E^‰0_Ñu¢™… ­""^&(íë§ÓÞ½7E-®hÂ!ôD*&ưœ!V8†E»~Ój "~m#z ÷_ Y¯p9Š/ô8£Üñøh cè9 ©<ª¥¾!²–u“2ìѺ§çú] u†©Ø¼áGªv X L&—¢îôÞØOßʾ`y1w£ ¨ð`7ž¡”“èèjoÀbÌ/vÕ\Î×Ò#Îraýcªg {A‡=€{„z.ð—.,C6Í`¡k-¹bìdù€O©X›¿ë'$áÂ%í&nÂ+Y{üŠ;Åõ,á²äCð¦˜,´|6¡Í9¯uëG¤{ek«\бpwð¯ªrÉÇU½°”ËÎT”ÐëOêéâ›Ä,Áê†!òs©Íf%”Œz]~mY†/Û÷¶zݘÛjK„[s£’ü:@àáÒ»®Ø:i|vþÂ! ±€ }Ý“dŒ9¥ ÓæÇ#Éyzà|*¿è‰î¥ÌŸÊBàP0Ï)Úõ‹.ý{¨‘ h§ˆƒ jÂ^7åüÐϹ*qgˆÊß©-¥5œ¡~q”–K:ð߈!wWÆî¥™°Ô;&ƒoEoðËÊœ=p2¾ ÇÌ[¢‰pôjj b$OW¾öÐöNä0S¢úÖ¤¯ôæq nÉPÕwã=˜äȹX¨žEw-EàÛuÆ1ý±¤¸“f‘°Ù°ÇÅb!Ô-,4ײ±éºóë?Ùîf’$ Qã+ ¹ ÝùÑv/’«1!¥€u\Ë¢)°*ð÷âe•C¦ð½œ0ú²CuH‚fíyJ5ISp?‚I,­KÜýúŽˆk ö[ "jOÉêø%”ѼßΑõ©˜1Q<õëZò™¯ÃçÑ<¹" >¡üå°‘5 Ã#ëh¶ê¹[?@„ÚÕ=»ŽVtVã+9¢õ.ÉíÓÂDÔÉxjbÍ[· –g•[.Ó3ø-qdZÖ‰ >;‹äïUð¿fo¬õBa±E‡†ý æš—)C+Ê|•–\.ëðÙq¡aŽ4æÈ™(õü;ÿÎ3§|10¶f;§±hÓÊÖ~ÕæQ†g¹KáÙÑèK‡ˆ›n* ìgðß~Õ·,ïbøy®ggˆCm%ð™êº?±i@¢2&Ì¿º™t3½á?Ï+¤U§S(Ê€É'rýÉ1ÿ&¾Z$¼1çÍ¡gQ¿ìOˆ*mѬE¶x_¢ô<0 >ZO$õiu8ñà¼àEHιÖr‹rÊ&E'§eªÕ¶vÇ”PÌ!,qôÍ5kDmÔþ_b‚Ó<§¤(U_ºtƃE_RÊo·Š¸.c¤A«*Â+}ì 0é+AéSz3ò@½æyø=«@ëÀ^ëÙhñáD–Aµ,>ŠcÒú /៘0bìwñ²;îîC·d¾^˜£ùÑ©Vöt8«íNºõ®ý©a…Ó4¨B“ä¹à¨xŽy+}éÐã>#¤ñV†Q,VøgžVtqÜ&ŒŒnÖ=hj ±ÑÎÞ¦°zî=­ ÀåÞ@0"¹ødXD1r<$ñ ½¾ÚF=²©´ÀûIΤ¸V÷´s„BËOc6åzÿDTR°,­X‘Õ‘UµÒBžÅIø5qÖ/±Ý¬ W¾¥kBÚ±1Оœ.bvÂj›@”Vþa«P:è¦'Ú`+JSÐᎫê5üN­{Ñe]æÅ}+LlWîCŠjᬼlk` ÉÄK0’ø±3È<±ŸÏ_!³:u0ŽìIýZªž/S• Þ}ªàZ–ÊoGÃü˜ ,_ÏPcL• “X §:ò™“6Š'¼píbhü±Ñt~l”ßio.Š¿ ü¶3ŒKBºo}€h2M”šºðR§|¬€#0Ñý±ù6¤½)cŒ€×eNüüÒÛ“ÑdL›OáÔ[ÂKÿ’ûÏj%ÚÏcXþ}FÍð7âî(²ðàB üÔqÔ™ÖÏ7KF´–Ø7‹øžËº¬ù¬?:+ÅÔÜpÛä Q]¦ªTw‘€F‘_¼þËMÖœZt„|—›p½õèÕ×þé™yGZ‡lÕ˜BL‚¬…kŸ²rÒbë–Éy‰üÇCXÆ7>=Ýø;®qF@ œF½~]•M|6[¦‘à¼mK*}&¼cvA¡R§Áoøùï$6obŽ8áûúëL2‰áá;P†P#ùÆ?zìÞ«ŸÆ/TÌu‡Ú_·})¬ÿïâÐcôö˜NÓc@ñ*§ö~M:-šµð›Á(TR¬X”D ß†¼€®ü6º«m6ØÏÑyØÖÀbõýûÜõ0Ñš,ß`5•ü¬ãÇ-6„‡ØÄ(©:ɬBwA'f3ŠêÇ ¿ÏÒÞ›P÷¦ÖÛRêW韑鵻û{JRkÉó÷º %z´3]K×1Çf«Ò’È q{(Ôwfqüêóep²}*ã „|â¼#;`Äw· ®dȄ̒x›È$r ñKæŠg³Ól».!]ÝKUÐæQùÖıRö?k Y³—1sC•3×kWšåŒE¿ìIv„×ÂÛe=éä…§‚oÇüçDÿÛ¨˜x9¨ÉÙàtþ¬íŸ ïάã6¥~QÞYša;=|Ì}<åhü£"¦s¡DÍ'^ïùÝQçó™/Ö`½ QYJÚYë?o~£RÐdŠÅcpVèÃ$Y7+¼=Eî_ó²Üî;Û+ÄО4Õë²n0éX*«¤ƒ‘GÇ9žÆYyéü“]l€7é¥D•ÍŸeÆÛ4mËÁî0w³Œœž«a3Ý‹ù† ©7ß<Ê=X΋RÓ/Šëà(‘ñc¥õkV¬Š8áen„«Ð¼—DZq~ÔÌ­¥¦^ú„fW HjW@1µÈÌlÑ•«Ö.3ýÚÎ`ěﱲAN_ÉCÆ òè.YO©)mù>¨×&j¹NË2s ˜™º.^G2x|;ÿ"ïØ=Ö®òÑæÏ·ÍY›ŸôÝÖíçð›Å;C 5ªílïAŒÑIw&CX—¡“²ë\Æi2!9,eÎý ^ÍÐX÷pµd´Ç¸¸ÐEßû“¢ý˜™.xZT?×mT€þžP—Ù±M-:3Ø:RøÌßIœAÀáÖŠa¼,:ÉH>ƒš8:]™­GM­q m/JK‡9…™wá–w2·¿èdz›éPuåÂ#Ç~àÜ£µ‹X*[’È_µÙm>ʧ÷[À‰ßÛJ€FEÿüÑÎ:5Q®òBí[f h\b‚.{·ó››tƒ÷.KØ£§Å'ègã©îOö¸oeˆ$T ¯¸2þƒ÷ª¸q}_Êñ‰h,@)¥Æ1ÓD3©qí;DwüÌêè_šO¦ ŸÒ˜ESÃx‹îKSGÚ„ OÖ½PÈëäY3ÆÄ6Ý È (¨ã/v÷:˜ž?èS¡[ËÚ¯^êvó"¯‘M¸ ÆÕx|³ÃáVÔ׋l¹ÞÑr|¿ÿE;í ²¹þÈä>XÝC^Ðù£÷ð ­ÉË6ôBÉnxtšÌ*‚ß.ûà”AËÈàÔü‡I‚÷$¶ÐW Pfž­Îìm5iÏ"‚h€OfÞ^`ƒüfÑk¦pKƒJ#AÑÕ›£@µ<‡µÝp”˜c<Îä™ ÍsWrÈÉV¿Rç íæÿÂl©Ì`<ÍÔ<ÓÌ=ß­ÀUT B“.Í…n|~” òºÚðð¼+Ô}%ÅO*¡G¬øåìëVT##ë&ÌMÒî“<š;èT%Š­œû=¹ÄãFœ£µ¯bŠïÉ*㱞Ô!C£‚ª~VÇ^£Xg>Ÿµ“ ïÆ ªo‰°Yÿ•>ž'éz‰±~œçuìçªW<ðû,&>/¦ñ=$r¦ÚEˆ”±’[%kÖˆž¼1(Wò[b#°òD3yçȾΆ֪ؓ›Ã_àï !M$ÙL!tÊÐæî†þ/ÞÙ¬ ?#)n1øðÐüÏW¢éÛTã›%ÏMOÄ¥fªý¯"–Ú† ó†šef_cÍgŠ˜‘s\~–[½EÇáíÆ;K¨ÆÓ’wI“b=Þ….MµicWr™¨R /5¢÷õRµI5:BÞ›–æ¬}!©ô¾Q™G5›Ý{J ÞŠLçQšÎ*î–”ÇÕ¶üÎ}¿=6k´4öÌ/èX›­ìžWSä]DªòóÖ£Ban~+U·¢uâ\±éºèBD4µs©s¼Ž}O!&lž{X²f¹„!F¡OåMcKö–>åÚÚ€ž‰GVO&¼ŽÖ ©n[Rh}NK+8 £«]oðÐr^>›Ä{ËhVãÌ„æ/S]™±*YàÅmRLUraä5ªÌJSODTÛ0Çä‘“äý”ú½³ä>©’„ý%U@¡"Û†á¼j_¥«r&šË‚ˆHEÞ¶_tŽaãñS“"sŽÅVýçøŠ¹=Òƒl´¦ÿŒYZqL¿¹dA°ÂÉÂy/TÿÄfLeÚ¬*’•+Œ!áÉO¨zÎýÇÒÕ YFŒº‰š$ƒÔHèE17Û9…Ø;˰BbBûwØÌÞ=°åò£4¶^ë8ºËåy‚-ñ\qüË[C€(Î1ÏIjF<Ô=sªVdÎÃxfœÅ$LºÀTÊð§»ÊÍ'RBÎï&1Ó»ˆ8'lòI½¥{Ô\y(›5$Ü Ð¸±ù >\ÒCè{%Rªyifö2×8T+1žßÔhñ:BJcñÑ(ª;:sÀÿ“RÛ,ĹÂJT>‹)¸–lÛªeÔÒç|Èõ ¶ö#}@”Wehñ%I¸QÙÒÍz×qµ!}€ùŠZ™CŸ¾ù¡<—WÊÛm–³½Žû^-Ð24i'©0‘ÉñóD1ÕO:ËsOŽóôçA‰rý;VT½è µAiVYë¶£ z™r2`,S nÁŸ¥_†óý ÖŽ±ÛÿêŒXFÚ8ƒ šÉ”XîŸìŽƒÉ7ÖW·ôÅ|¬)Ð÷íã[·©D§6Ͱk ôŸÉò‘2•æê©E”ʳžÔmh»êjb–bW!nüfŒÐâeœÉ|M†¢:RÔOa®Pk’±>½¹ô" )ÚÜfIG øñmsƒ-I€"¶ÏÌó$‚_}B”’w†$aÎè ûnn¿¬“އç¾qØjõ™ÉPï=£9M;‘‹F€ÓÌÈÈŒ‡¯Ô·z´5tôÞÞoÕGÕJ×>ÆìJVu—KŒàÌ"ì½!¯¯å[*h—…§ø\V<Ù+Àp › møL¾é¦ÎÆ~{1¤­-GÊ,–H¶U"¢·–ºv&©Û‹o3ü™%;«ì‹ÇáûùÐ*i …°ðù{—fø‰bTL•gL»~±`÷„ö¾uHjHµžðoS³èÙHSóVÿuPhÿÓž×ZÍóºÂz­2—‚Ô#î†çáu½ŽS¯†§u¦ñ¤°æcñÀ{ Y:v|Ë­h/³‚àíð7õéÊ\ƒÇTTØ«¬U€/&Þ|µËÉéÆ Ð^»”eìÏu°¯Ñ1¼ª.ŸX‚¨è‹•um†}kqëßÛÆþ¥\Ò4¸J&Ÿ©H¿ì°Jä™L-¸OY\Ú¦ƒcÚËúòìÄ&‰D9#Áya~‚–Ûm’4uzpžêÉzK nOޔĦMª'L Uké*(‹¯Þò·‰(ÌÛ3Ï©@m Säo²_[À"U³¢ÏcgЕ2©WÙÍÎS˜„;mrUÍ&_¿Ã©7Í»5”Õy˜på²î¿Ñ Ô4Û·)K:x[ÿ­ ¯„%º±AµXfÄæoô k•Q[‘ìÿ:ø@á Ÿ¸8ã¶UF¸9Ù–`v–îS½ÅÏ®púH =ÙÖ¸þôφõC¨¡Œ½”T¶1¥öþQUÆõ]Š.Ö #ð&Õ„±Œ:„Ôq>>W_·t!6S}ØÒ¨Íq‚6à&jŸ°ù<¢Ôþ?¢¾Å”‰#χ`‚Ã×W0O¡5D+{ÙäÞ¿NúT+÷?‘p$¦õèÌôx©D׺f‘dÚ^™½„üMÝè1𼪭 ‡—‘ßIðýB¼Hý¿ý÷„¾¿—ÛsxΑ WÒ6°UU“â¢OÐ^a Ë Œânçæ1íØµ#õ W3¯D7&×sí4›1¼Ê^‘h¥ºxޤU s}©µR©^S}?×Ù}&†êMÀ¼B-``ÔÖxçWÑ–-LàYÏìóx9à˜OC}ª šv³Õ¢¶2‹kÈ ¼¤9þM ÐFljÄk¨Š}¨´žÕåjÃ|Ê.DÀ>h(u¨xB•(Ë{¼üŽáŽ R²Ä}Wœ$‹8nv`€œé¼˜ˆÎ¬°½<±}GÏ\£âö„o¦ÙÐ~OY.õµû] S‚ê|{û=[žhårêòÛW°×œJ‘w2I( «g–pfhþ¸±eÊ߉ºAëò¡žÔxñ’H¤¿u¿Ä5ƒ#‘7Ø âĉI\dókÂðÜ:nˆÃ„:ý¡L—ëëì+YÕ‚ûC‹BWJ< §Ïó ¯c Qs—hGÆw-ñ ÒËu¬ˆ‡Æ‰‚{¶jv5[¶ú !w˜EïƒKºä™ó*óȜ٢6=Fm¼1È–‰YLòg ïf\¡ä”}ßJ³#´÷ §!¿d„m¾€5R^¿ïB!÷X†D†rЮèBbR´Ì9½ó‚× ŸÀ¶“†Y= 08þXJóçK–ßã§Ë™ÏIŸ<| €^·~¡„··÷0õMeZ‡àþÌÓN‰¥öí¨M8ìùŽ6ÐyZ¨¡2O~=kªR»ªö90™ï¿VTÙðÎg‹…µÅÉO SëüãlîóËÙ¡™3å¿ÈäÝ ®,×´ðôtMw‹¢ðkþ·¸!z8$„)¹×ÏÿŽé¯Î{FjŠZê¡yrV 9ºkNBúÞ®YÞæ@Q^ó-cJO #²ªÛOuÊtÜ,-Ey6-¼O m­‹ž‚?´ãàY]i÷ålâ5O3Á'üÿkŠgéŽöÝ<Lj;S£ò¬K¿ë©Y?ÔXªÛçrP'¬€ðhlTÒ]Î}Þ¤RwV³˜¿F øÛ+tËPuK 7”•&`\g'¿>É Å¾\Ž´6|LßÜϧ9ˆ¾¨ô½­F6Âd^S¿û²tl™Ë°fÑ)"ÝÛ8–•5y2˜›dNÑ38r~9T›é["áA<ËÜKE~YpÞÒI™0®þfuÉç®Úf¨ñ0’ÿ­N‹ :è)Âl>ùÙ¯ò%…Æ·þeÆ¢0™¥%\Ɠ¹¨Z?̆w,ù ¹„Ê ¼–äÃx+ÿPt»44´ WüOŒ3nTF_C*˪ÍoknTZ#¤éÐÈÈí£Ä]•qK£=Ã\*v'9à5Ê6µžN/wñœskôqó°\ão ÜÏ(ÕIí‘ÎùÌ‹(C2‹©´j–@vA#UzNI-_/W¯ êò-Ô3çv WÙ—= =˜Ãä'ÇtÐÝùgJµXìÀï ë ú¯~yôðó˜{ŸÙ(—0’²Xï~ÑÊzµÐpC¸åŒSí‘è^W6à7gü¶æŽ)I;Á€%OÜ'ï&ÂNôc|ªÜ÷,~Þ‡\ÕOA©ÆÐÊj×7ÂÜ–âKÖ}ø’æs;_Â"çôž'ž_-ðêßÓ2s`Ž»SÚñµvÅÉái›C5}øâøGÛ¨©¢ƒŽ.d=ë&êþ˜ M4Øâ«¢×‘öªéŒÉÙàƒ.7¾ÙÖsYÖÉù!Ï¡ç%ñV“Yã‡O±Ò”HDßý¯Å1E±Z¿—º Ô¿³Þ¸™µó1·øž…útv¢sv•¡Ó~ÌSF pW¼ ¼°VH¬+{Bl‘ò5¯Í[ûß9©;5²©š‰Å}3šs^6¹ÀXò ’ANÁ?~ÕLðû?àðÅi[¦êÖno1VÑt?´¯ð·A¾ú˜°‡†ÁN¡÷ø¥Òè»Yk¡®Iæ¢%DÔü*&}[4Dgæi¬›A¾Û[sêî~`n0äŒnÃ=¬Á¡É!òy%3B¥³ì£Ã|šÅ‰9Ûý·Úç5t†rÙ‚¿ÑÊ–‰›+Ò².á$ÅæŽ4%Ýp TôäË™W$ÅæíY\‰gaôLÅ–Ïê  ¢FjΑÛ$sPÒ©V®íñÁ)*ƒÁyœîÐîQ8ÆÃÏ~©Qi½Cýñ=7™*ŒªúÞ¾h÷¢¨õ: ‹<®V¢N>©T²¹g-'÷È|t,‡ãòqæñz7–L- f÷͘ïjl×Ûm0º Œ~ù”•€ÃR7?˜‚vÝ!&´£ÚûÝ‘_äÏç§Ó/X8Íxò+™¦F¸ó´väÏý‚œ¡4^XiM•CãbI0γã{l}h;8íËöØ"AL6Š•ˆà»„6RòªÏ-ü›ò÷… ;ÆvÑøõÇþP èpôŽtÉtB0c\µƒ>;²GŸow{=[÷ø nëà *2‚¯¤ Cl8PÓÔN7TÉùVŸu´ºo¤4<5"5,éX©uz¸€ÏùãF¦_ ïþ¼Ã¬gÌvxÌh©w½ô¶S×ûþ&’˜Ð;g™‹É¸Š+fÀûž˜]Š ÐÍ)æZt~‡6]=¨ò5_[IŸ,øöošèêšSŠ_nc3XèÆ~ •œ=ò8`ßph°ÄΗ);!yƒm–ª^™GE^ƒëo8YvWWv^ù̾wž-§={Hš°ÒFðï‚b.SÛq H»Ýn[ÖIÊùæ9!|Â’ŸDg”Æ'Ë>j­Ö¼V‹Õ¥Ûã¿€ 2`I›u]ôŸ<°9å¾»çaˆ¼ÜMHl€šŽ^wÅÇËs/óû½l ´ð÷Í]¸aå4³Ó­ò‰Ç6Œ$PÇÃÏè¤S%¥Ô*Óš°2Z2Y’uãŽçŠÀ´ôî\šß®kª÷ûÈn+%lnù݆׋bU ë'—Hç@»ï!5*2Ç0¨6 ¤bvÈ-„»þ#"›•ˆ"èKŠàºû¬í\”Ía‘T¢=Ï—È üîë?Z3Ý®?K¶õb—XÃßo“©©sê™NŠ­ ,e"TÖçŽ5ÐG…JsѰðM®œ#F‡¸¦-p“Zq*¬ËÂÛðizƒºQŽœl|ÝU3“œ¸Áx§æÌk²bÿÖʉ'üÚŠŠ <š^3nÓk–±8ö#uþ!óЪÄi%-v(E—½¤›Û3 …}º¾Q-Šír ý2R¾H¬R>ž­kA%œ’åXîù Q†ºÜWØònA¼Àà‹»ø1ÕeV‡¤íÜrAOÆûYñlá!@#¡Ï_ø—‡N]ØÑäTk %°b¸LBs =i‹¯>À£xñk–«šN˜]cÅ9PÄKé‰í YŽHžŒõmåL‰k¸F”’AU‹RèÓ¤qá§æìª¶ÑÃÓeQŸ§ K~êƒjûe­°‰—I¶¯f„—CYÈï×´ÑrÍ`™eÐ9(<‚Ø…öг1Úq)Ñ8«•Æzß{9˜&Ãì)æÜŽæ¥r_4ùϰýñÁ°R%n~ 6ÉîÑWZåÕ(úÜW—³3k¾ëÙûíÓêO»ô” ÇökžºAŸÂˆ¾ŠÛ¸gKм4ˆ è.Ô«eÏCÕuw>Hêé±”E=/j Vè&ný¼pSš›»žŸ„ Þ;šä@ù1›g‘ÍV]w¨?P‰øŠ«1~  GʽßÒøsŠÒó„ê›…V5¶Br,¼ÑáM«ÉЬw„»ØPm¼âðñãé*i`4X|ˆDBªÞ¨Ì2>Æò’Ü%ÜÙ–»¥@KDÔiŒ²:K·À·Xa¤IÕ­°&±bÑ>—†;c\ZÅAä;×ïƒxù|»âÛLØ\µcÆín¼¥z…$Äͪ 29œL@- OϹmB¤]~ dq¬-¢q]Bxz‰9 }(”“ͯ\˜E´Î?Ú.Òó–Âs%Lµ5ù¢6XlùÐ¥èU]u sfP)€Ó+Š¥$-RŸL¬u‡­[¡_Õ ö³%…Î2ð«í¤ƒÜ Ï¿ƒûÍž²Yʬ6Z\m`ðmØOÓºÅiÖ^jMa 6püÖE8ó™.‡üÞ’“ÃP6¾Fk‘\qÉV+þˆ›Pc¹‹™‰É:h’?zÖ™Èt9ÿ\9¯QEˆÂ‹[Lq“[44Ž¡¡áƸdêø³³›Òl)Ú}­új˜Ñe7Ü^ÉÉ-Ô.háÈä뢋tŠæ~p½]@cIqOqZ’˜‚äF}¸¬ù羈&$ù —ÂàFós؅أ04x]ÿÌ[ š'ß„Ÿ¼V•¸þÔÙk•xð¼ßï8ÛñyóûJ›<c$ào¿¿{I$G}Ôê›îlƒ¸ ¼¦¦èQ's ­‘Š–ð.¶^&¹¢›P·õ~  rƒZ¿Eñ&ëÀ8Ìòæ<  s3¸ LJÇg ‰Z •f8 0I¹ìÚÚHú·;w{¸Å€ø{s%b´@¡+l˜çÖÿH¢#^ðŸ~nvÒµ)Ÿàc¾ñy¯‚#ùc‘ íÓn ¸ãuþT0¶¦Bßç€v¬d& –ÂW ¶û\®£M¦rrØ*[20=ñó¢j#‰×0 çÜ1 vnéÄe•0ØŽy#š, Á€%ýkµ?*·íîÚ#€i}Ák‡Ö.ˆçÁŒ-·E´6nïß<;¢'})‰°RCL"[•¾¼IàNï;Ð=þ…×±“ a0ZÅbÁ lK „ì³i~8¦Å1—+5\acPfÏ3n@ ;GÌPÌ ’íb/Ák”d)ü“ŠðÜLÂ"Þr€ôVID² ÿÝB“.»³Ãa=`Àž$ã1èVð]÷Þ'8+`wdq‹¶éÞܼږÅèT^$×à: ¥»(§= ¦qÒàÔ\¥Y°B·Cºe+XJ,¡ãÖ vâØƒÈHÉ0+5VfëOiYU¶1 ßhÓv&¥ìûeXµ†CLü¦-+æÂ;Ø*“ȡͬ’`"QýSö¶Od*y{6!m_í´­xhá°Rzñô9=iIùNR‘øqÕžýº/âê”kü<‘úš°¸%_ÌÂfzô{‡'u¬ž4 uæûgN÷áåFüÂ(ØünÖa2˜FN4«ÀÝç’!Ÿõ¨0ü½g˜kBL~ÜÚ©çñ˜á8ܪ¡®\ó¯iÞ–õx;áPzAe]¢7îgsÜ$ÿ–ŠqY6J¹ì˜½Êž­nÔAŸRV‚£ì,„ëÔóp¯gÅW(÷9QyUñhwMQ¦avŸãÂ3êju{Emü;µ,ÎW“×»^Ú‰êYDê~#YïÐ#§wŸµ]P>àÄ •yåD7¡u\¤ßjœ±XÞõI’%ä²[óxoÿ´(5»´´ù¹¯«QÀª.ƒ¦^ø?¡W‹oŸ˜ž‰P«UÞ“ Øæ¥åŽ}0F#Àäòó6ö4×½·~,¿öÁT‡pe‘Ê„œÄ—Û°Ît‘’UðxÀ|]kdz—~È|0Œ•#`:ëØÕ56%ó¯,Ö°»å±¸à‘™ö¢ê€uo Éf<°3Lñ×eý€í¡›N~|\Ф…9Pô~Šöá°ïòeBŸý‡…qÇéyšæB8ÖE‘B'øÁ;âãc¯wG7 Ç"¿CøµÛØ€óŒSÖ{Yü6*=7Mmrªp˜ ›sb5 û\Tb'ÉzùÞ·º¹k¸Æ¤/ê-ƒêë9D?î­%„BWRz¶m/?ÑQýž4èd4Žy„e×Ðw0Že[$ÉÓ©#ê®÷§¶fÜU)Œ dH¹<¬©‚½äˆÆ˜¢þzo]G¹ñw EÉÁ*ú¤¿¯É¡º÷` Ó$eZ™œ±/oKÒ¨3<ÀóHÔéuÆr}£†œšG¯¶qØßEŒo8Õ!Oð€¼#¨¯-d«ñU„Ö÷µop°ù õž0lƒÇG« ‚~窢sCoi„OB{ý€¿óK¿|IV,Õ2@!õÅ$Èj¹DOczH}».¹¸[0e^#ìÀÏHÉP4€NLº D_™–P ðn›äºÀ‘«ÌkµcïÂä"jK•æŸj—@ PéÏ;êžÄ ‚×nöêÌc6¡ö8«8såsÉ|¡5`¬½ÊRP§Ë,Œòýú„¸@1扣·_ˆÛ¦!“ªcgÙe:æšObÚÐÛü3Bår:t©ªÑkøì7&âÆ«‘ØÆ` wÃÊ"Û$„Ôf6½ÁÖ¼¢ÃGµ“ÄK·Q~XïyVxÅ ÒúÃ/•@oZ²n)p)öØ‘ù¼7µL~Øšk9ø¨§í1_;ý¾ÍÖ¥*òÍmó¦ #¬ANÊ>þäaÊÕ‡à¯&{î¨}y9¦eåWä÷VΑ)Y„©Ô\ßj4ÃOqÁ£÷}%F&«^•!´6B¥ D”i|JÍz“»s9Իɕô§úÑcSM.¹õÃ¥äbaÀÏ®÷Ÿˆ-¡ãrªo„ªJ6­­ÙŠ˜\Až…¬=,³ ÚL…þ<kôÖß¼¬+EnS_è*¿þ7¸rˆÀ^hÀ}ÿ5´×…<€W*Î%ltøÕèþ܃]l¡³” o[®Ádì5S¤µë–Ôs/äJ‚érc*š‘=ºQÐÎAÈ·”“8ÕM¤FclQÖK˜v §J+bB;Dâòd±Œ8>7Ƨ°r(Øýt±÷…\5Ãhª¤Og΀™SNewëùÜLÓ(åÕ]BÅÌêŽ)XØÍuCA½Ì>òqϯ¿èwú™pu0N·@h˜øxë@6ØEL¢´ÓPjsƒ~ÒD-a&ï8¥Ì^ £2^•oŒ~wƒ §ÁeÏÕ´íÃO„”h‡!{Çv‚˜0.8•™q¼·<ñ»Âï,’Å®k~›Äf¤Nšصö²ðô¶ìÁj»°ðx—býe:Òë¤Ц&ÒaT1Õ‹4“|P£³Õé|ɇu:’`ÙglŸ¨}R,Œ°–ª´ÓO‚˜í¥fKîJ[© ƒOVͶ#»AHú»Öv¸ óJ³ÝqË\êËš’ŽlT£8¡ïl½Yö‰JàÕÅ!…‹µhù*1È…@ŽFËòþÒIûëNk%YëC ]iÙ>s Þàwá:äÓmgÜÕ`s}3­Ò± ~8æY€åó8M@œÆäNe±)ëÊ©‰ß &`®W„:_uñ@úådé¶ý³zc%ÕEH»9T*˜Û–ûðÇÒqE„óPp=*J(B~l­m>ƒeÖ>aÉò•u˜WÃx¬/ú23‰Äÿ­Õ€G^ÿz[L‚a‹LPxF·G‹ž;í ¯Ùº  Ú¡»¸»î—þ•IŠƒú¬)»œ;¥M&H>G„-]’,%ð¬§Wn‰B½PÙbÓ(ú·¹¼c¿a=¯ÌüÔšC‡$«Ÿ+*Ùދ̽åê.Š»¯‹Í Æx®ôPmú½Y)Ó0{ªŒ I‘8Rò‹q½• à£{s_ζ™B|ÊË’Ùá€Ô•Ë8z™Þ{ÊIc†Ù#/?³üè¦Æ»ˆ÷¦f>‚3ª7ÚnRðd´EÊç4–0¾Ê‡æTçÐü¹ôúõV¾ŽÃój«m/ì;'¤ŠkPÁ›¶`@Ó|1y¸úºö¦£Áí¢Ux>xÓO_=~W*Ѯvh$Ñ+‚™×­Å<—ÛÑ÷¼šÔÅóqìÛxŠ3„Hñݦá%šäóºsõ›àˆm{"Kç Ó¥-î|ˆ¿E¬w'ÅLÎfûÅÊéÌ)Iñj¢a´?¬dƬ¡pÊüùíÔ;¨ òжMô0OÄá6Kã~tï[ï5ßâˆèÝ$S J7ÂÎOŠoª†œ:ÄS4í8Û|o*0î{UO8¦XlðòßX‡Ð*¯“­°xË^ØZÒâÌ&dô®@4È~a磽 ûb¼?Á ˜ÇfFõÒ6Ì ô‹tÛW›Gèèq)b>Ök¸q<ÏÏXd¼½®â@ø£ä³UiRo· ÇÆêä5…åÁ›)|UkGî&SûX¼´Í-éZ-gHxøá$÷î¢4oŠfIr^¶TÛ&»Xtÿ?µOŸ}q Ú~¿ŒR›xàq(µiO_x僟Eù*äX³y½f­z˜^jú/“YÏÂaѺ2ë¡!Fw?UfU´X@ñ ÕéÅ2µžu÷͈ßþô ô%Äe:0§‡÷lõȧò‚߈7q(”G–‘IÚG2ÉD2ìWp¯Ã« MÖÒzØÃ¨Fg¶¾‡‚Ù_$*û¤‘2›š]¹úmüö/ìI­1à‰ ÂPÒŸ+S$äEqz’£ï)Њ#ß}ò \ÿBU¬€1®¶j“ƒwm7Y¢xü|g’*×Ôñ0ø@^f§?@úáa#bŒ›¯bEÈȼi¡<¼šÔW¯£7ØŸl70}-p¦_ ¸¨ó¤=N 2Æ ß>ÎhTÐK‘å't±ÕݧŒœko§÷_q¨9ýéÁ†é™n]ûèÿè…zë&Ðë´U˜Ú\VCò!ÈýN5ä*f°µëÔ û™–Šñâ­¢OλX~bÝäJ>qw~mC2ðÞ7ò,`µ'ïá Áª‘©¿u­÷¸‘TFÿM:娆 Òì4k=þà««‹´YÜ«ˆcÊ&¶Ïo!’Kv"äKD‘§ùçO¸.Ö)ÙÈmíHåÖ_T ˆÈ/<“˜¤Qû¹œ+ ]✉'ÛÖøæ¨iÕt®‡*±KõÔ™-UÅ2³ ~·†¹¡ƒÛX;ûšñså[q´z—ù‘»s+§ÐAMÓ#L7ï–ÑY iWIÿWbÚüÔ8¤ÍƒÔמttÚ$xäzá¿Ó™©‘$¬«ÂÓ"¦—„ì#õê%*zîmš°–)Ö_¤µÙ/PZ˜Àm\aÁŠÞÂ&Ahý7-g…_žå]+Ù¨*e¤ê^9S‘Ä¥6Å´·ü¾Î–Ò…Ëļ^®‰ª«ú_0Í:ÞÔÜŠ,è<ÝšP)pÂlHÿéÀ}ŽÇfƒ¬ÒrnÞML;äT+ôÏ¥R¨C^‘ÈÓð«ùUÓÚQQ*/Ö ù˜Òa;ØD)û} õ£æš=$8V·×D5/ÚôƒãJ«6µšë›ÊºÚ;´º·˜‡Ö@ýÞªn àÔéÞPþ½ª¾Åé"Bî‘6øƒ1àÙÉoÞ[°0K·ð³<À ¦Œ2CÎÇ9~½‚5Y(s!.ø­¡Cq•còµ½{wC±9 ™MêC¡¬“`º-ÿ•v+m€9ÈÍ;oÂÕå´dþîêàÀÀóò݉›ÿœå@G«V»ýøéhw¶œJ‚íyM,骑V–¯õkÓÇH=F#Xa ÇMšÖ•ô§óqVé± á 0 çq馢7m`F e©NÐŃžhÒt¦Ê½Z”² ­$5?޳é¹®7§žYð­ß(“™34^ƒnS4t¹òÖN f]!°(x¡ãI^^þÁ½…S¹?4hü<â¾ÇUZº„8NãáJÂB;١ý^gîrušœËÛf”(¼·-ÑåY,ñ¡JS$<Œ4xLDÌ}Ç3ʘ¸a°ü V™¬ŠæÚßB£@%ý9£4ì¦ë#Ö\Õ<4E‡å>æåG6…¬ùjqg\r®¤°tÁ‚â¹ýâEs‚*žaaÏ-“98€ž8­#ˆ ¦ïòy8;„- g§ö¨t/|‹—Á Û°2¼53ÍÖ˜Ф?Ø;Èa¢ím°ªœ¨o0ò ËÍ‹²„ø!ãz9¹¥œ.^r@ûJÝ¢S,@&‰À冦RLX‰€WtÿÕ“å‚9 `¹xÏe˜!MaNÐ)= ¯ÆW7åÜ:™ èÛÈXC^ûí}9¹ÿß¼V‡{ Åî‚ÓN®K1'‹­ØS`îËX EEŽl ›êWàÿT™Ñµ°+cÛ¹®óGʽòU ÚÑ-\€e¢Îª‚ü¼ÍßâÚ³ k¯zïJŠ=ôYjƒDæ]mïä't$EÑ—1:jd‡Õ´Ü‘¬|hÙùÞöÄRžñG–!‚íoØ7Qx=]åOZ…n9xÉ Ú òÔÞèö¼_%r€ÇÄ‹$éŽúÏQÝ)Xë-}ÎRüë^£×•vðÐÒŸóc•¯çD{ä 3Dýÿõ0œðÀYvà\'à‚ë7Z¨‡¼Q¯Ö,¨ÎUb°Vt^ˆÖþì(ù=°uZèþ|ý:±'£è÷„nÝ_™Y«”ÈР½cœpG·¸HÐwGçÓÆåxc™|˶"ìa|šU7ňÓ}’¤†U"L悔X(â·û« Uþ•ê°ç5ÀÅ:“u¶9C6À´âá xZ–“”I‹Ìæ-çµdU¿1'ÇJ7XÇyn÷Ø‘ÿuö{Ÿ¨Ù¢t#¡^`^ó¢JýtªÛœ>}WPy‹öÙ©¹ˆâª§À¤9¬0^NJXåe…¿Dðå<{âiëaH»ÍÛ#çxŸ}U©l‡6õËE-í¿ûe×ç¬aî€ÚÊA¼OZé0ÓÍaR¯“Éø8¸j˜”c ob REùé\„9É V Çä#ç2É.w¹s®/‰È×ä0œZÊ–'¦wƒY¢É<_D»Ù`l[sdM£·/ÚÔóœ”[2wï•ÄZà€à~Q~¼—°—€ƒéðÝv«ˆ^5- ± ¤9‘›BÒ2ߘ  Ä""¨„Ä”Ø_G3àõ׽ú« ˜bˆàGRmsºh E.~ßÄ b»¸Pl|¡qßh¸d‚À[/îØ8uÐd|W^ÑÄØÍP:åÆ Dº¢Y¢Ô$b§  \ù§Š)p*ÅA–N`ó€c”ÎTÛ» ]+Å+=è ûª>ÈNÃo}- KAƒØlOè ƒG`ÄØá›Ò-°5ãfíËÞŸ€ÇEƒpó ûÝN_xÐ †®#¥û5LÇŒXÖ,ÕµÚÚP4ûƒ¹6þC͈/^ÉbUŠýP'æ¾'ѹ[4.é»ûÐŒëhLЇ% o~Î)ÿhKR`:O=ÜÉ…'@yÍÐTŸª:`5M>zâþ$W9’mÀÅ?dwrÖ/‘ë¿i°ìຓš¾ÄoÇó‘?›p€QIö먠½º×±m>nN{(éæá*©Ð]“F~+•–wå0hCIèvxœ«:zóØôêö"FŸ­¼Ü¸z(g¥µ®Vœ¬Y™ó Ù7ÔPMÚœj°‡Ùé× ·¥òÃjÕ:Õ‘«27<^…É˹%FQ= Me²ÛªŠZŸÖG*!€QúP8ZÕÅ!RÜÑ#§™¡+fMU%œÈ~rÎ0(NJq©±bÀˆS¡^FN=k¾­w|79qy† 9ÌŽe;´ŒG›¶íÝÄ‹FDp}]ýÜK„Êió, „ÕcÙ®e›pо øp`wÆihI7 - »üw-ãÒí¹w{P­2'Çnšp|Óœ`.¢1©àžÍÂû µ¦àØ'"xáC˜·Ø”ôBåQþpÏœ²"ù¡nOhÙo†íÀƒ´zl8`EÒ&á ]aFŸ›nm ²8eùcïS† wUÌîò_”·n¾ÊÄïªú–v„4=rä}ŸvTdÆ¡HèšÛÁ£A¾îŽª¬ÃÆ’%6#yEßM :J´1yPL#ú,ÿdyZË¢‰÷žTîÅ´õiÂ#7ü©§¯¿è@Îå#øéãÉ‘9‘ʧ‚ß;kizG,þ:ÑÕñZWR€n ¨í çnTd+j¾Í¾û–Ûö EbR,íD.Ó‡¯ÆÆ‹Cƒ !ØóÎc:À²‚ìzÑ5®¼Š@"ßqüâ lÔƒæLp]¸í…GeX"xnU£‡©Z†¸[~Äz¾ ¿~[÷ÈV_?ˆÕoÕ ÓgÞÃ;¤ªâ£ž—¦{¦Ñƒ‚€í¬JÉg〠@Œ¾ZV¦„@þ”ªDÔÊ7ÜöB­åG„ìÄJ¦ßî²H 1íõA´8^™Œd°4ËbEƒ€Pw^°e»ºæâÅÿ)½—¯,žG‚ë°‚ä1b8r©qÛýN¥˜ÙIðé¯;õ#äklEu©û+KW†ì´&î˜Ä†V`{ ”Ù3'?AW‘ä ªù‡¥Í±]íx˜hÙ’3ü½bþ¯NaxúŸÀY^Û«^¹ëbÖDTh¥„Í"-7¾Cÿ†‹²5x5JE®Ó«`Ô,a(Ý6lV®×ÂøJ1uz݆2T'±@Ú‘f äÂ,õÝâ¿Ýì!:©1b¢ýŸ2–ÖK`tŸäT×™(H\4–»Ø¿ƒ­Çy½`[^fªZ_ÐŽ ER6¢­zÏ1 îÄšžQ~æmFÈ-Å{ÁÅO¦•:“¼Û:p£‰*æ›!h½ö5gejÊÌ@pqx“&=(|NkóP æ´ÁÌ‘R2Þ(vÓúË’ º‹ rÎð”—ÁàX¨Î‡FXûþ@ Îz£YÜý~ŒPò¡µ¤7:erQ¬Y”Ö¯ãvÊmOá n†è¢ÇÍ®†ðÿkÉ4pæÀÄ” ¨q3ÐÃûn*Éù‹`ó¹6dÆì˜,9ê† ë·ÔÿÏøŠS@"'q ¼^ì[¸óþÌ¥…Œ`«sÝ\Ö`?pFÑËŽòˈÉ#Ÿ™þí±x2@šV¹ÁaHsÕ.ذ/?t¥Z˱ع$el#sy.5÷Ý»¶)[Ò^ZîZïˆYJ¹øuPž0/Â@w½ e ì«cæ>dôƒ £Ô^ð<ÎfgµÎ÷˜Òºv4͡õ‰n³¹eè0»¾·) R¨ÛýCá.°Ý„ê3¢ý“nÝÛK½a);¥üOáÃivžsiâÍm'dqE=kÛÞ#Yùb9»º¢ÆgYœþ& ½¦Ý&8‘@ªßÑ…ê’u¼œQŽYÁxºo.÷ax põuðq<Z1RŽ ’ëMGˆÖÚXàÌ¿lá7®¬zæ5eketr$·ð1¨5eÖéXÂ|CÊ͵–®,²ÏÁ¢û×Þ'תÒßA1V w.m”Ò?IRÆ;°[g:³˜÷÷r3 !ð{‹žz' ;¶å"¾‰ÊO¤F³ÓdÀ=dÜÊlLjhXt ›º†¤‚ZíÏ—9ÇüÑÈÍ IqÈ›_æ7Á 8·•<#yèàñQk`u(úŠÊÑö‘$ýß?ØxA uŽ‹.¬œ_HË}– ^kCé#ú·\|â§ Ðħ›»gãÚ`× 9D%k8iNÞ†¸w£†þì¿öt_eþì*ÿ‚~l†§„®ž|SC¿™nãUÉX”S©Ç ­5»ÄÍ>hãÉ_oK¿¦Ä\süî,¢l‚4©!(laðо(RÇ<¡OÆÆõŒ`u¤€ù”ÃtŠÀŽñæn’5¡˜VÚ!ëÃbß2÷FiŠ“ÁRìáºÑx×WÏÆ°6ô8jïõ¨$[Þ[tcÍÊÌ›÷!a;×ë¨ ²2c[I-iÅ4²wZ¿Ê! ð«\ëwpÛÎÑ‘Sú‡Tâa±šÕbž[inv¡gëÛŠýð­›mçŽp­9YŽ—ßˆoÏ*"ɪær>W8;“¯¡ücˆétÕmôå½þ9@&ªc³öcC-Xr9ŸœJ*;%JL»8l¤–‰€nø5ö®)óXPg 1'îI°äî#|¿ÛØ ÙD à«r_¼¯É‘9ŸÑcgÑáöÅ!›Lç£àÏf†-ç¾Ê†ÿ«ß‘Øîx+É`É¥wÝš÷~FuÁ-ÍöIâ˯ãÒ¯Æ$âG©Ôk1^k6Õ§SÔX2PFþæ”ñ,äôëç¸ØwL*¨Nb?Ú] d$š…ý=öš=vÌZ÷ŽvÚk:ûϼóVTlƒÚ‰÷ŒC΋ƒuò|=si 6=€ˆeʉaˆš•Ö[˜R8;Î?ûÇn9?ãq~¢G§&mãå‹è•Æ›ÀãmÚT/7áab>8AûŸ3ùÍí›ÞÙyI“<Ò¨IÇâJÕ&¹ç³[à8¿ÛÅ4ÝIö(ð«ãÄ}éSbÏmk8±ÔúWÛJÐ3£‚{¥qúoˆhÛ<Ãä‡ôn…ð3Ç] äêgÒ²/¡—~û¥ýåå(û"Ô°ÃA«/ah˜iòâo{ÂdýÅп4>Ð3¾¹Usd²”¦‡íÝåcMÂáJk*Úq{o —þ¥”y,¢€%Õ”¥‡nG°xþ#Ô7ëk‡pÉ]ÊzF‹HñÆÐ DË¢* q‰þëïio{˜ê@Úµ0'KþËå2î‡ïMTµâÅä÷ój¸!¸r†åÛ›'g7ô«oç2›™: ^*¯r魯}Á +ž/RHX•Þƒ-m}$O¨f_¬d3&3ŽÓõ/=뾕ýü¢ŽBÔ¶î×À̦¶É‡BÌ­mòê—^Vx-;ñ‘Φã )å —¨,hCU,ýaÙQ? ¥óhF'þþ‹“ùw.¹€áÈTð€Ã“HþGè ªó"ï 2¥ẨA}Ne!£¥Œq™,-$"}VSakjÈQú²Ó;øå©`Aßð¥¤Ã×6èsèÝb1@¼0Cä2²™þœP ¯vþ‰ÜJù˜îë#6`¬`jç6 i+„ÒÀ=`$Û¯Q‹bD,þ”L¦èBìU0Û1ó.O,õY«­¶*Uª"©ÿvœ`¼íTSƒ'e­h­n@ï-(†ÃLq±çJy×߆Ôàc ²bÓl)Z|äó»C꫹ÙE‰¶cE¯ ƒ«{ ß+)ðCLLýèù­Ga$ï݉y*ùØô,é‰o¡ë‡2RUgXm ì"±ª9¿+¦#>6ÅÆ$0ßO÷¹:¥¨@|zKÍþFºG wáw¡šƒšQÖ6­kÔüÉõ@Üq*Êr³ø7€i3´ÃOÌ-Þ‰-4䥊²ñ£žVÔ¢¤2\¤š ľã?3»Îò&Éö$ÄÌîgqa¢äT[†W,4 ò¼å¯ÈÃh‰žß˜êkÎ)%êu¹9{úyÒÚ—‡Eì ;ŽUZ3Gõ)ãÚt±MuW™{&¼6@ÔÏ–~sŸ?Hê³EÅÂf” žÔTJòo3çÕ®×ñ\½˜<_'blCŠñôo½ÅÐWÑáv–²2ÝŒ·G$”€©Ì^º7á?”L:qšëufn×®˜'2e>|¼çþ û‚Ùñ|‰Z³+Œ3f2„À€E/†Î<ñŽ*ëI˜º¹›Þ~-toN‰SñÁU¥ª˜„qšþ¹–‡vŽ ;EÕŒ™;¾ (V)"édUp{Žêù‰ûÀ›ëØãY‡U"â!½WtÄô§êY¶º[=0qNl2'üw9¥Šûž`^ ¨’£«ÎW«è™ ÷ÆܶÝ3[P$¦zOò[Dþ ƒ L¹Èwašc(Ýß‘6gdJ¹¢zAX;p¥•‚µ|Ø¢®ùf¯bec'îÔr¹ê0‹úÝ ¼ÎüÉ,P¼’½ïþÉs?×r»}«Ï§§õÒ… Ä6¥ÎÅÒæßxõÄÀf­æ¯öwd[îùØU!"÷—ç_UþwÒyïëžÑÝe†º•©DNd·†súÿPBlvØÛé%¡ïô:ãEð‹A¡eð5™[ï=êðÏijO«€BZ²*½ˆÈW_й’!P7Úmm|¿éèž•QDfЬ¡l$ñl¸ž9 M“jðÒà3Ç‚#,eþ$3÷öÄVâ`­›Òå©qâ°æN~þF>Ž 0n*\ìs´»îóí¯¾¼¥6σñMì+¼SÀr‡T q<àSf–¬†N²÷¦ÓŽø2pj²ò3ªJêÅ6 Qxóz:‹'V5vÌKÉŽ!ÊÞ•”¶1ß.%‘)T*[~üâT@CnáÆ]¿M­0áWm -‡D¬°;÷·p U7‡ýžšÉÊÁÿÍÏÑ ~:ñ_B>µvƒ®L²ó~¼ª Ãðü^ÓÆîFêjøVøY%߉µ?eÉ/\>N¯ÞVºHòâ O«ÍVNy $ÖQÆÉ7·£ø³×5}o»'»¢—©~ùC:Ý Çþˆ¡¢ÅðTà™áÎ}Q5ô‚ Î××ÈÄmœ„Ž=´×ëF@âʭLj&oõË­h‹Á¤4—€œpKÙ‰•…cÞŽ¶KæJeçiNJO3ضWµv]s&Ó)¨S˜‚Û‘Ž3Œº™È”ô½‘v3cç¸"†`Ä™þ L“{›Oïä| \û½dÕµ]òG|ˆÂTo…V.S%ÈîÉóµåP4¨Ìz°×ÎZkAÅbÑâÓÕ{fä#A—xñŒ®‡ ]M‡²‘ =ªB¼=©=È[<ŸZÔOžy´ÔßpñL¨Ð7^^ÆeÇTÛk ºAäðqw$™X÷ÒyKÂ`+*G±b HdEóô²¶´ŠüöŒ„…0>Xn™•¹xãïyµâèEºCDøÆîå]æïg|Ô™ðŸµ${b'„Ò*HyŒŽýA]ݲ»kéùJŸ't.w7q—4*Õ½Åëxp镤cUÉjŽVâþºÔlIʯÿ„¹n;µo±^V¦•RJYżç«×‘]îp‚% ÈÅÞÛÕ·{ó…ŽtʽNÓƒljþIÙÜ­æùù‘y5’›Ì»åé’Î×¹mNÏ ‚n=âJ-„aÊœv§)ŒH,ßÿÿý`#'%ïÕGVí Y©\N¼ÆM“Ÿ}‡òdv&m¨FJ³­@¥–,¸Žc5;Vëo¯->‹>ÎñÕPRÐ#˜®l5™-þB|[× a›%¦a%nÓººï”`n÷ þÙ»%7HwK‘.`¾ñw„}zCp³ÆvÕàæ³”\b:#hç¢jõ"I Øí惯¥réyÌ ñò²ê(Ï&k8I2ìroÙ*«ìô150©ô˜ºDqã[Õ=¡š]ÿÌR„vÂRƒÐÈÙaFÀ ª®Güž,k”ÀŠ£ÊÒ?Dƒ˜U§ª3Î+n¯IcU²l´$9É-ò$¼”ê$˜\È ©«%‹­3³¥ˆñVùÆwk.+žAµ¥éñ¸ñ?kžÜGÅ'n¯Ewv“—ñóòoç!GùW8R¹®dÚ[Lâbyë-¯GPúp(¯´%_3¤ÀÇ4•»qÆÉW.¢7YOÿßÄ’Ló⨖ñ©‰ö‹[°åbM•”,¬t¥_õ9ãÌó©9Ài^]|'sy™^ÎH*¤õº´.ñ"§Ã3H­™îÀ`·Ò?/W4»/6`Ø÷³³QyÝ NŒz=JÞb”o”K"Èû ýpðÿøÊÊÇwby›·Ë’Cig²yÂ3O}Þ& ‰-qmùW!à6Á¬)tß øõÀ™I¬K4«Áö’³‘ ì ñgI¤|U„ÑNqMÿz3eͧ³öeŒ¶â_ŒÔ|ñ@!¥½¡×|Y¬ “t߯@~€ë±îp­K¨V1tÖ¿µ{¨GSø‹ìŒQÈ‘¢Ù²dh•oÎW/h2™°=<×d¹½tÞ ‡b+Ã)O¿ë¯âOó-½1g‚Š> A™"Ò±µ´ˆZvͬ¥K|w)ìeÙ·‡Q¸ØI›\n–oÚeœ¬/í&£H²ÀöK´ºÇ<\:íc~KvŠêÐøSN먈s—¯Ð@îUöê?‡¡…¤jbô 5•Ö8ØwçH¬mͧÿç¢}ÌE ›ŸÉ”—% hœw_‡ýûO’ j¡.ÅÚ‘r~Ž^\Ÿ£XþކÉkU‰%A‘-Jô–Ù!/Jö̽¹PFœ„lÇé½Â~Ôâù¢µjù–çmÄqÉo†_B\ÛŒwªÏŸS/ 𓕬ǬöªÍ%àÚxa#mZ½ëñ`:€b%Âoc6ñƒ äL×óýÐ ÓŸ•é ›Î3æîvh?œNC¥´§–ÒÆöÅwú[DŠÃ*}»Õ_Øü@Ì:œ)޽UdœñšÙ¨¤oî²FœîaÐC\'æššW;¶v’çBÁI^¹ #äñy[Cö3!µfºM”0NN•/Ÿ`è5‚dÕ‡G*‚†%s¹Y~³šÀ~»ÔÃÄÞ½nêå¡ÊÎk XÒsìèõåûõ)3×Ô7Ò9åáºîXæ—Êà_‘åÑŒë6yË×z$°•@Wøà {ËoDÏ`µ¨)8öEÔNOß<ÿŸ«l`o‚žžÎÿ€ÅŸ†RÏ¡Éanø±;ãìF‹lÆ ¾å&Ï|ìh­[š€‰‡Ó–ñr÷Þ™æܵó`Ù^&°RÛæ©ñO…Æ}3*fz¸°Ví¿3ÿ÷ä×j:¯Œðc8ѨA_XmàÉA×P‚gäô‚éÙk¥ å_À",=Ö­È×&‘ˆv†¹ÿ{£Ç4hT4ø…Or"""\¹£ rîÐß¿8n'0ÃÝ1-{€mi×Jzï:…Ï!o:Kàï0E‘9Ä ¢[ê¤RÁîáOg*…÷qgWÄÔ ÈÒf÷Ç¡:èÂm@Ú¼3V3 œî“ô³»4ó ¿|QŒÿï`Û¡ÚIàCÆtW—1JÿŸQcÛ‰¦'51ÔìÜ¡K4Í‚B¹ÂŸã–Sêׯ)&Ÿz’×x øÓ"“}I‘Ì/zþÁ&øhø _R+ñÏKYS—j‘±Ÿ0šn€WE\)eÔ/à¡‹ŽYÀÞd*óå©ãqõxNEЬ¸°±8$ikl~­õPb¡ñ­toÅ``ç·+°fŒdÐIîŒ^š=·Rl‘ÙăŸ5 º«µ4V©¬„ºP™Þò+gÀªÐ‘­÷Z±,K f„9ò˜÷¾§dõÊÞ/÷¼†M€Ü_ÈÙ¹Cf¬È‡÷.@eX¸#–É(·wnî9ò{D³Ø4÷»‘‰~¹V®ÏãÍ é€Lä+†”qû‚ÛÀ<|œ\•¬¼U3ÏÓÝþ­#Ttì(ªÙNËl#ÿÀž)…^ƒÀ>60ÑÏdã}¡l%` jLÀk°ð!/²Ïp\bJd缎áoB©¯·o‹ÇƸ¹öyܬØÂWBÄsg9šÖy3ÕD_Uò¼ƒwpYÈX"ź§í  åõ‘ÅÒ®vÍÈ ”²Ø]¦øîÕj‰€ñ*ÏŽIžýk/«GÅ"nÐzÀí‘ÉU}i:‘þãXîi¶§3<MÓ­›¥ÐºÏòù™8^ÊQäÓGAI¤Oq©5¥ø*Õ8¥Á…í‘WÚfóçÅë¤çäX™ÛE­yÒ–çnm8>F)ËÖúîI:œ8èÚ‚øÜþÚ}`z4hª&È%¨[ö©Å!o,™Îç€s«£éÌ£9æÃ3•oéÛ@Ö·˜ÐÒ‚Egûu3¦É8ÒDbüXV6<‚*Ï©Œˆßê©Þj… þsfÆ.TôQpdåî=oà2òc9t[×?ÏÌrg»%·ðÖ²¼ÉÚ¾ñjŒÀ®@ƒ•£«ú ƒ&³£ƒ¸o¢Ëæò1y0ζ¨œ¯!õ½é„ÈΠk 5XÍPΣÁçÛ9¥ÖÜßF¿ÕÜ\i¯”þÔàŠ.³PéKž æHöžlq̤Dg;^¿NÕR¦rG/Ž”gÙ&$÷/èû7«‘Äq&P»<ÿKa/†êC´"N &ù>²ŠÿDûê ­ MOrK‡»>FE`÷Õ~\nÌ¢Ù°îüìkí½Mž=ËÍNUWªvØFíR­Pƒ½‡9³¦d¼¡wSJ•Õ~k)rØÜ‰oiX)+æ6ýZ;iAF½È'Ù§ˆ%_“Úß~¤®¾H¡û„“ÓƒYKùã*åe ǯ_¸ÐpD 36„óÈ{£ø^°}pÎRµF¨¯«jîí*Þ‚ú?¼šùó‘Æf PF΀XŽñ°üäM_š ¸.þ8,Á¾I}NodÐ>6ÄqõýÉÿ L[-…ÑÝ,½Îo5ŒèÕ~Èú¾Q¬é =ßõ÷Ðg±;!³AZ$­G~ú‘ ´?×”Mêæƒfê¤P;aåÑIZÇm¸Ùc~»=Å4uuiÅÒ,d»‡4%ÿ©Ì“$â`íƒoê–rªô3Ñ£† 2išy!ÒôP!«$Ü­êÛO:Ù9Ì%·G·Wßdhó–M80]ÝJ ¿”µ¨(Z@à'¹û:$È‘Ü];ª’29N(L«ÑÞp'íO»¤d~¤Zÿ}³æ—Í\‡µ,·µð g5å]¸C6±ƒ•\† 6y¨.­ ÊóâÂó=¿ˆà…;Ú³²ÞdÏúbe,,”-G/àü"1ÈÚ?eâÍ_Ž›ËÁä›ÎÝ´¨ D\Ýw`Àèœ>/k­ 7žàdaÁ>êâðërÇ笒üþfƒÔ%Ðñ<–N¶+ã NàX¸v 'ÅñÔM:ÒyDѸeQÌwS Þ¢àÀÂòOuÒíæoèŸTÊßf—ûmšóòÿ¯ ²'m_`äé§±‹š€N=úË hÁÇìªÁÒ]„Ó«ÿ³=á˜hjéÔø-ˆRRãK²S¿ Àb±™€èå±üÎ_ÐÝØoW·òã§ùºVgŒÇ‡žë‚þÂÂ*Wá}¼ÜøOÈéÐ< ÀåOýl°ïߘ'; lX‚4Å©/?¹GƒOŒùñÝ"Ÿ…v[4 ¿±º–3—¨߃úéë-iµk :ò¯é©ÖßhKõ;€U©(¿ä@£{jº¤AJ“ÎòÔ?1¥iˆÑƒðN`¬m;-DÊñ¢a~jVoe¯&õé¼/ÂÙM²ªÞ£µ4¢¦±˜tV¥—ìqÕÝÇMXŸ²Ï±“ò´‡”Ú &Ë" - Kï-Á¥ÄÈ1JQ;šaC³¤UZÜÌՖѤƒ«oœªcÍ'Zämb¹ƒ¢ÔÅÆGÓ]ù™E,'*6¥£±µßÈy#‡Z_3\‚MËKعö´àÞþ¹h±§·ÖuÓ¶üsÖÄ­,Ø9ׇ“Ú“-¡E‹Ó*%;±à¹ªöÔ]ðþ½óîú§.G <ŠýúƒÖYÆ"i­ðõõ¥'Ì™‚’^戅ûDÕåo&&a.¥éñ`É¡#t¬xåxUmø±'Äí&‚É‹ÊП«ÝpÖ¹£2„ @ÝkðU>Û΂& ŵÜau’\ŠÝ ÷ Üo‘‚ .g…~trpÌ…é¹\ºÆ0+± Lƒsa=e&)`Àû„¥zÇo|@è¡¢Ò(ÒµêF¤kC2k‹,d%ö`A Ë4Rãm¥ãÙ H7óæebäß/BCŒ÷aµÝYÚr“u—P©ÎG3kÎè t޽ÞAγ§~ÀN‡½³p÷ŽÓ‹Úh?½ŒðGƒŒÒÕ €:Ô 7 \Ÿ-ôw1,Å=‰!–XAZ”qÅH‡š—Ô fœ:h’’ƒ8þ7Ñ£“çà…kÆ<‰‹›Þål¶Ú@§‹Šyx+7diøD[±í±°ã»„Ø<±§ÁfŒX§ù.áß_³k÷`06.“1:­ÅjI†Ÿ×ô³c&¤œ6ÛñÀCI¡”ò-ÆœraäKWÖi•Y'‡*þçŠ]°#¥ÇòþŽûà)ëÅû§»úˆ¥‹Òá™ý(§¾Ú4ºv:8AíXAïˆáÅÆZ,Å(]ú‘Ðä$:]æ/B>Ö·ßæ¾.FU©ûdbÂéÛkCÚ¦64¨h ÿ³ÊnÚÆÝ$­ <°ä`כּkƒî½Š”D»yTyütè hÙŽC”¸xP¨§ýmþ.>’º)S éSp2n½â;á~`ÌFü×%g5±ÀåM{½¨æqx«Jiô©/ƒ¹»I+úý™7„-áAªúGÝ3@ ÒØ„µ™£LáÿóZ@[ÞPµF4bc‹é4eI %/£9ÍæAáBÓ%ñ²®K*f~¾uvQÄ.„F–×J5Xò‹‹”‚”âÛ—N4K °Ó~â‚90ri¡Yû}·K{¾1ÕÑúƒ[É;…®åÁß÷’¤EùôˆËbö‰,Ö7 ÌÚ2™ˆ)‘ó£ò–±ƒàškîÄk2l{}i¢”YFà;€­^!ŠI"§í‚oض˜r°KE(l’7ãv-ñ⯂á!Úÿ¬Cma£Ì²^ñ,¶$ç’ß/˜ñÈ,OÅpq.èÜ˨ƒÏö{vm*Õv_Í'N6×õ–\Í$Wí:\'u\%qU_Эõ»¸ë8öÒ5*¹ŸnÎ1üM¼0áõÄu5Û|®Œ2— ™Â–=ûV>ÏR¦,P°‘w†*q«–üªòå_* øqKÉ›Ñ<„ók 1ì?Œ¹BA« :_n–‰Í~v©÷&“ a³"$4ìZ /Õü«±³Vâ·YŸÊyÿû§“͸Á›¸lÑÁ9f\™AÙ^½ä#â›ÜÙ…,·áº*¿¿YÃOÈí€a’P‹Dybn¹‘íZ’³\%ËâÚÅá{°»„ZÇtôPÑ^‡ªÆc´’óŽ†æ9½2ÈlV+×ýëÁL¤½NMMªŒõ«™wz0€Óªe°›¹×®j›@|^¶›uZZ å[ü02ê6¬†÷Ýêì¢b¾tRA‡‡”áØUãbn>™Ñˆ{](ZÓ¸ÒTú}Ü3­‚rP¯ @BÈ—Aí4ž:3}Ä’Ãi×jàÕgKí«‘½¸ÆxË·’*îêéš\‚ÇŒ@ÎUtp‡¯†;ÔÖJËLÕýo äÂu¿,ƒË1}½(³À|è²&“KJÊu§eë}Ä×3´Ÿ«7ÀŸ$ÓÃ….k1T]¨®D‰Ujþϸ-¶È®'aÒ_¿ÛøVmç+•"¬‡ô–y¿qWøv[0…±u770@ë*=ªdQ¶ TP3SlæúFy!ø‚Ž÷ÙîX†§>°Î|õ†÷ ÉŸ™¾ûö$°œ :<ñ¥ýšÑq> –Dc„»(¼ëÉwòÿˆjf±v\+ø£À-ߑԨmGõLu°ZÍmý ¡`mç]YUÂã$ßNvÚj$F‘ÌüÓúŸÑ¤“|ÚÚ!%ì.L†¼ª~àb“­úÎâ¦eÑqœ}_Å“5¥ÛÅËÇ_¹ f„ òJm~ÿN¹¬sd¼Ãù凫È4tVÅ1¶®MËhÒÆô¹â;ÁÖCHj)söT,¾ñ-»”|Öó[Ñj* ÒØ·žeØÌÐŽ#=ˆ/7mõ&j±¬ûN?Ê`P%çMAÌgzÃnéò(rõˆçv×ê¶4ã¼’å0wºz!¹âÞ†7Ù¡zÎß"¶›:ôv=·þ¸8ùûã}ÆáºT·[ÿÐÌÆ¦OlÕ¤ù‚ÛOò|”&òð¿p"ò(F=ÒUíM³ïó>|ÿïIH¸k•HJ]Í y§s9ö”CV—ÝYr­ÌX…±Ù£WG÷ßÀba½ÆÈ؉˜ZŒš¿ÉæWÐ7Ÿ'%˜‡¢¬¶´k¢‹ÉÜé¤~zoƒáá )%Ü£À ´˜Gac¦¶£þàj!ï¿4ÖGšRpWÅ›)7 ªºõ“Œ'"UE©ô8¬nñbAïpîÝq¡ú2dyU±"ñCœ…‡}Ò'Ãq×þÄùv aB 0Eˆ½ÕÿKDzÏk1è9½‘JH£ÖðÆGÍ¦Ò CòU"’–©fIk ©]q}„kÚÕÐø|^ðlöµÙ!™sdUQZî–ªmö ¸ŽjCûÙM„kÚØN² ãÆöa˜Ìå \=k™Žr[˜Çâ€w„{Ô¢÷’Ñ °dÊkÖ=¿ŸÍ¥Al†wÒ8 v$­ôciòR¯Ꮀñ$‰ù®S9„Yw®^…F´³}áý(K~þFøˆd•l᎚f¡-²pl"Kù­Pæ&e pËÚJœè:ÄÒ„U¨KÒª/|÷öF{?ä´é!!¹î¸j}ò)Îî‹;Ò°”rÅ#¸²MµÝ6Þ7ö`5¿Ÿâxö1<€D@!;qš DÙÌEnŽ´+§»+FƒƒÓ†͸E©^/.óo.‡’(@À“¬$H8"ëªövл\Ðc -“|5ר°+,Ýx´Ûßñ’Ú ŽýÄÃòË¡NQn^¼¦2·ÚºÚSlbAÒ¸Ú"ßA>ªîƒµ´Ø3an”›¤`ú%áÙm¸APIÄ_h´~ô’„CÊ[ŽVkàº,Ó®‚ý~Ž€^JN@š0§¬³ß(ùí®Ä¡8š;iÊüÔùÐ~A–àš7÷6y¶U K÷ õn—ûèÑ|>”nÒ̺ü“‹dòXR>½2âVü™ºÄ^,¹©\Ð…ê5èWv.KÅòy<ªN7AâMHA°Ëæ³ù6'Èäpº|!­M/¨Õè³£xÅoH§a2²´Qð½ð¸–s‚b…Õ‹*Wa‘ ØVÑÆ )ã->-?¡dÁC9R6y™ #Çí€ïMrs:Žy;¦¥˜»;‡!û?®yz¥‚‰ûz‚Õ,˜7?œA’ò ›–´ Øæ6,ø¹Æ”˜29fÒ6ŒMV;;CˆŽÔKÔý6@mâì{ˆÕqg™‰ÇÁPý×»ƒ×.¸¾m£´NäÏ5$¥õEH"š¬ÁãúO)ù?ŽÀ4,*³›a‰<•ñB!¤-#·q¬+Zb\Å.õ¦µ†è…ò…ì—ñ¾gòç¢@°Þ™|-ëo<¡>k‰»— V™ QŽSörÁÔýèž:üǾ~  ]Øqí!Z3ÎÇ*Q ;þâ¼ÆÀäà II7ã!F"‹€ñ“CŠ!-šä15ÂË¥)ŒVü†SCLjG®¬Ó ÄW¹ÙA¤vÄÍnÔzV¢éÏU# ª©mCÏB“îùÔRÉD°ßÌPZÅI€Ô Ì£³ªÊî‹A+@è‹”ñ§%”Ö¥l–Ä®·»vîÏ„ ZÊ@؃Ž˜MRÖ"*·7Lh*<Š 7]µPÚnÙ—dEÊà,¶ÅÉ—s}ôÚu?Œ:>œ*ðð× Ws*º høª‘žã(Ípgp‡‹º H~Þ«:?œˆ±ÑT Þ‰Z ò¼ÉƒÎ½L­oCƒ}°'¦ î)¶>3Uú=+×C?Cå;7ôˆ8NîÎú_)LëÁfŠf3KÕäûÛ[äU|g4ÒeÆðyÉ(Í~ó3þP†s†ÿÂ%êhü$"PƬ ºnH„Ðú&EH”æéXØKi‡—ϹiŠä.NBÛG#Ä}ð؉üƒÌ­Î>‡ia§@”·IC2>¹ü]:f—·½§ˆçÆ!¦ T^JWCÝnÍ`Ø,ñQ,&0A`Q§[cvpV²àà3öñ:ÐYz9ÊR¥9+z9 × V­ ²K¥v¡rJI‹}Æ,½úMœ‹k)=Î5Á&E‹£çPÎB…/ ï·ö×W\ô&£4;NYíÎ\UG…3ÒjÊ%9eñrSøIŒ†¦ažÙK‰©øÄN“šþI–ÆcÏ*ãì®Ng[ñ ݤVt»Ùík6Þ°œ·|êþ<‰8ô[ÌÉ0«ë hRûUc ˆa¿<«DiF¸ëÉòYÀ~]J#}¬gg 5 æÒÖ÷å­’—y¦6µq}XÊìqR ·l_70ú•‹ÙŽôþ²»ñCНAaƳv…£ËIŒ¹ÃÄ€9]f·O(ÝÈd?š]ÕvoÀKÁ©¿jWòÕ/2t2dņ, ÿ¦”UkJ¼£ÍÜn @ ûm’¯$·¯”w Eå­”ÀEú脦éK 3ˆ¼ÅXQ8ð&gý¨*çé¬CÿýÖ*„šÄÒ +©Õµ–Ú³FU1IùéBHG•”|ëÎùJïPë\ž!þlÍàžû6ªS×D2ñ‹qA­ŽÜò’ÍÍ#‰ócØÛŠ*ntÜ‹HÙé¹èU¤ÂU±²4}ÛÄDq¦¬ÚäEñ$jü‚".N[£(9(=éç@³ÅP*ÝSÿ…r©}1¶Ø#ó`YVÉdQÕ´PŠÈRjÇxÿÈjÍ+a ³am='&zÖB >ï¤ÛÈ þ @&j cKä½ö^âõLæwÖWnŽÏ„úöžq14Ÿä÷CJ¤“s¾|@®tˆC´å¦< <¼Î¼B3|‰>Q‰‘I2ÚX“Å—AMUe!7”¸J Íå—ÑŠô´BrUè*KÔÐØØŽ0¯„÷ÒYî¨^iƒRÛ2X˜„žOk<%ÁlôoT7Ãrà JÅ:AÛfUô¦È¸x›·}¢»j69j8úœ b^]貈í?þ‡F/! éqý®ÈhIð ¦_C+Ååhu~‹ŸXær:x`òÄ]Àñi eJÂ÷T΋&b1œER®r÷@@*{‹4ìÐSˆ.”· óŽ·Jæz?Ûh|IHýZ9ÌXzy;f‰øÊï¸n…ÒIDÙx¶R…RmŸøÊ~™ä%R¾ ¶Vü|N]d×Ê…n©\?Ab“£q?ÌmñÌU…àº/Zg»«Fùg‚OEãÅqâ±>I. á‰nj´=ùfH¸=¹¶’0ÒÑ¢IªqÕ²“±¢;‡'è ˆw¥1–ôÇÌ;,¯çde£§á%Á®#HEOÒ½k¾É °¶6bx§¦Bï4ñBZìþ¬Š›¼ K»?J ×Çwu,frJÓH} pu&Έ«”¨úuiì«xŒ‹DGƒ^Þå§›`AÑ˦¶(ä—ΓµÇ–c;“^»JêœÐ.N[TþÑ\ÁñˆÞç©DuUfîfqûQQyà¾b\ïŠLxžC‰K&kwWKPU±âÔ„1°‹ˆC„‹¸>&õŠÎilPª­s”Ó­TK6ÌÓw'R—‚5üÊàÛ½¿x2TC%]†š]öC+ýHþ”¾ÕÜú5Õ2k™Mø(®’tf/` #Ox¯1Zm]™$yv½êµ Óí¶»RˆÊÿµ ¾Åb³Ã½B$¼öàPº}õÚ’ÞædVˆž”@(ÆB’·¢&c|¦–¦cW#¾+¶¶“:.5ñh”âáGuK?%Côî-Ò$hE(£N‚$[4òV}ƧZwš@‚ÞÁ9?è›zqX$m![y}¿Z2…õ沦Ñ0û6”ÌdQqGpÇš‹]ckÆ.Œuƒ{œpxQIè“sfúž2†‰ŒMWÿse·Ùw}ó.Èá¯Õ´/sPp›Â>]{¯P:Ì¢-Å}„2,Ø<ÿXUq”ブ·‚¨ÐSS5^ìÿ…5Юă(¶2Ábh~¸—§¼ÛÙ^q²¡DÚ¦aãsœaúð+…`•Í9Þªrahñìç²Ä hÑž«þÿš`#!¤ä5Ë!Bý½mTq65cª $ó*ûnÜb®8¡ûúÓ1Ÿ’bP’ç4 ‰u ŸEƒë“žž³âprˆ¼óú#Š|fˆ¾î#L!Kôkñ€9„ÐÒ–—T„L̃š1û½²Ú` OÍ„Å_N\ŠL ݦ̚H…î^@Œ‡­0h%#œÒq¡‚”«`ãfŸ[ÁáÁjVi£°©>(˜ˆBAŸZÙC­(Rö¥ØxNE´\Tº|,Eµd5¯îñs¥¹{(¡-ùOÛµX¯{bí5éCUšeD F–´Ð8Ø ddjNéíª‰ÆË«^ÃfßHà>‹kâÓ{~Ó°„TVMçêŽ#íC0×F/UPà›OHXMUá¥ê»[ ³SÓæWqºíoR°!Œ02pšÌÕ6uì×éêÆOÅ»›þÎÀÑûÝ÷W$Ð.²”hídDK"åÕŒ4â(ÏÒ@½Fçð…æ}õ¥(vq³ú™º@ÅØŸ ³øv~ºqÕK÷&²¤ËNeõ³—£sá´ËEÕÑæý…1ÛöÍSÕ(,c9çk¢uHÂС Œƒék‡è‚“Ŷßï ;°3]¥¹f)Œ[š˜A*Ë‘0áÆÇ›ãí0N>‘ǯ÷ÈŒ+':ÍrfÍYh8‡„ä:زžó‹f “XÆgc Ùs¡BÉbÝ"òÁ|®ýÄô³Š)i£æ€‰¹*ȃ–0¾k0eW¾0DTkñˆ"ÛJë¢ïà—Ûk…N¶±“£Ü }ËÉþIiDSìcs1ËçÃÑäï€â[§ÁFÕ¬ÞJGU`#—©™$$îæ:ÏÖòÂ$Ÿ$åÊâ«=%u Ù¦j.bœßBö¸\ý€»ÚƧ_›0²VÁBz$‰[zxNÄ87 ç•oAÀè‘1½|Ð_(ù{aŠÛ2xZÆpÚ›Umg•Û"þo6qÒ­¬Ã°À2ØÞõü+­Î3—… µ+Oò®Ïë‚á'µ¥•à˜SQ Òì\S¬•†%À'OQ±KÛÕÙá€æì~[¾“—ªQ£H¦öç‰Ðs–#ÏfªjÎ%?œÛƤ«J MØ.-«¸¿SŪÊtRŒ÷±JIsï©„«.{Û¿PåBØþˆ7Á?˜]¨ÜGû©ƒÄn\óâ3Æ¢•ÛêÜÀmÃÕ{–£ _f¬û¦Ø»Æbn¡d™éMéB›Ú”tªT­œ€–t™ϬÖ UE〞²œfi±!,ÜÁX»rÎ Œ:x¾*þuXè­Ý]¼ºàÝ5©2_³Žåý,AàOÎGä…–>ÄVò_:}9g¯‰÷À—7áËMÿ·en¬µÃq¾ýéõû™ÞÛOb§ûy•x³Ø,Að3E׬Â`¢5ØÒ%†ßUÁ’Øk³[“†)Q¸jPü«-Ù¯Í%N«Í˜$›ÍžžÞs=ÜÁ+Žx°é4æ¸Þ7 € ÏBA¡Ê8ü££çPòº_*©Æúx”)G\e$¿ :%.ΪZ±ä+â 4h½É@7ã§ëº…œû•Ì3e6½‡hXÞE¼Ú,Îd¥UÓð¤) ;cy¯K~ð2Á›CWó/Ðjt&Îhf·ó|cúÄÙˆÓV‹«~ZzXÔ'+ZÌ÷[¢5´Šø£âBô–,­´&tsã0(s¥d¸òÕÓ¼|kØ‘×䡚µÆÏµ¹} ÒRR­¼lÄf“À„ÕÚLrVFx²[çz:ê”ÐYÓ =_uÊa°¢ÔÉô“°lá8‘„Xc›DsÛ­e:a·ˆr4 {Þ' „ÛQ¡ÓõzCtÇç÷—¿k,&Y6¸3*eáµq•‹£,Hn°T’Z÷á”?Sû¾ @KÛO˜QC‚€žHÔù¶Ù™r–axQJ€³áÐrÌ÷fzZÏ|¡”Þ‚n1)+Ü_ï¹°@$æ:‚½À×P{³S¡‘÷™ßÅÜq¸i´îé3Lb VXF=Ê: cØïÞzà/¸:tUt )¢Dćäë<ì®#2õ u¸aG)¯íý?ߎäë1Ñ ¯(µ³"¢c çÂÁQïÕçóHBS¡ý Gäü…}s”ÎÞɇRí5þ¦°ÒÛì6Uð× p±±æ³:6.J.þO‹\Ë>+*c»cç~Ÿp ®¹¥Ù6÷„!¸ÜÅ¿!MXŽ«\½Ò y™Èd ~K»j?Aw‡á‚ÁYG××%ÿ¯Â 'Šwj¯j´†èÄ#:ýXOvÒjœ9­‘lq.Y~ôëŒ÷ϾúXšâ_ÅrÏÒùþH/[‡ðåž~¬µÛ Ó´Æ{Ååf7ç¹Aã_Ûˆl”šSVµÔNhä5¬]Ãqœúr¨HR²:ÀZNxS&=„âI ¨^RÌ!žX­ò¯‹–7Ã"Ô€.[2Hïgm˜“b!È,Äœ:ÖŠrkɼ)}øåFÎùnbÒé`—УTd&¿&¹Ð4¢×ý†ÖþnÚ ”Mk¡ºtΑ‡x~ÂlrÉ÷ëÄ­IœÀ  YBÝûj=IOùD\(:¢QÏÄÿ}$Àbl³ž7˜óÈSõـ쑨Ÿ£ºoàRqß&}¶ûóiÚ—•|À3õ ®[8ÎYú£¹{̪ g«¢Ä—e6Ö‚í=A½ÄU7pз×äʦ±…Ó{Éí'5ѼtÝŒ ‚ÉÜŒ'MàaÇ`ªKÓSuç1¦dŠÙg~¢ã>pºïw©1ûÙÆß  CÆó¯~E—‹[´p2ÞpeY‘0µÊ„H/«ñyºv0Kb™ÐuØÈ Ï™zÝÁSVžT¹è‰“3ŸÂ_´†ð‘4°ïœ¸CŽ„= Œq×3 Ž FŸ…áQÿÖ0Òa ú¤0Ï!§Jjâm<­xD…¦¼œùyJU¿*$xqdH·•Ìýî€â•{{vJj`-vI·Éî¤&ÓJ眇#4½jtöz JQ|œs± Í_Äd’Œ ð(jF¶/=~ŸÀ¤£ûC‡T4—ïos‚®ú{nò#°ß'ú™v¦7ò÷°‡ÈHu½Ýòh7AD§]š¬QÓÿ¡1±õb‰›Ã|0qEÁñªX9’d8½Y ü[7'Ì#ÙŹ®c¢¦Oîgg¸šÍVÓ¨ï«ÄÀAªsS‹MrQ |¡©¿ªQÅôš‡qúÔÍ1GÚíèÇÒý éšžÒÈ,…ØŠ°y?¯@UÜÓX°ß{F0(~Š-%ýweÿZ,Óü¿*½M%S@¾w6sFÿ¨8óµó°»Xa1ó‹`|Þ9PãpPzüs´4hXÈì©uýHï5Ïrº/ó1¨”áÀë·á2½‰¾íRâ,ú‹á$ºX¡®–—WH}þ©¢äžì½ŒêÝ)v¤’{›öHþ.úk§¬(`ƒËü-‡…,-/GX;u~߯QO|³h8~§z›†RR€f¾¼í“ü¨@Ô|ìµ*‰Éæñµìÿ¤¹‘爭À ¯¢ HÝ6Г…Þ¯\Ô©”¼^©÷s\NÿzYݹkå& ¤ q"PÞ@m Y)°(wÏ5åh䤑Ú[LǾnÁ)€vq̽ÅIqÖþGÖǧf¤idƒïü:ãÆäÔýn­I R±Ë”†›Bm´žXC­—¯ÖíÖtƒ8Ç«t~ø|¥OšX0G-b‘ÉœSMòàÍJ -ã/÷k.p '”HÒXç2-;%ÓÁŸ•݈6=éØ1[YÜäC*h}!ÏxW-ñwvÑ0âP89ÉÕÙÁ(V:ñ¤`KjiçU=ìdæB×'ÊßçËÁ‚XÁJQ *@B=ÉG¾:¤¨1T€uwƒme†STIÄ´9¾Ž³úAãä¸Ül¯³ýð¶CÇÓW¬Õëõh1hXJðÞZ/‘òï´_wIÊäªymƒu‡èÔ-ä æä—¼â2/˜•µX‡·~RÑ’Ñx 0 š„¸f±0å’/ (Yìyäoï;•=óïÿŽDÑW¹ßòºIΰn…|2OÔ' yôäY©H¢wûÓ=(ìŽ3ÙZTjæÏ­cZM.¿( jOv7’îæšfÝrav@'ÈÐWÖ†¼5Ó)÷£ic/”S¬ÙË ŽB"Žýˆí»`%ñr_Ù¦'ý!Ý¿¿~éo15‡Ä‹­¯ ¯À(¬Áщ  \x^3éN;L>ïú0ú{óR¨œÒRað‚êÊ÷oŠ?§ÍrüB¸S» Á'a\Tž ¬5á9 ¬“dÉDž¥ûÄ´>“ÔÁFÜ{L¿¯qÝ5o à7ßAz5/é͹.ñ±è û@Š›¹õsa®víÓ¨GŸ5Cê °Ö†ð• Çpo5#s\z×Ý3ÆTáyؼö`šD¬¥íVolS˜³–”EòóAX”(»þ Bx(n0™ÿ5¢EÞ íÆDÞáFŽX”*9QžÎAjPQKymÙ7ßï?H3ƒ”Õc`ßÑOôÝ“á u¼¦1›°\(ôq QŽv9Dég¥p—$‡ÊƒŽâ\QÕõAå(Òü¸jܡơqÛDíø*¥‡98 ß/£>Yc:e¥¿X:>Áf(̼ϻÿ+&úzJK´á±t}…ŽEÝ+˜¯A˜É”[c¿Y•»‹ãý^¿S&@Ö.ZRehx f<{‡‘›ë¨SBžJ$ÓˆÈ5ü*«`Èú”–ÑÌ~  ¸YûÍ€ýÂОÞÍwù¼Z®šá½JEŽ’b!¨SAÑéÃEE‹JÍÙ¹º±~›¾£ÄKŸ—‡`>!Ìd×ðÕRê‹Âp´å›6e2ÑÖÓê]ëÑvº„ô‘ÑŠ_I¶"Úýqó´Êï µfÄ^4C.w³9+ûa­!É`èJP½ue£¯¹æUS'¯Ë½v ¤MfœX¢ž ³•öƒ`vrjU­2\ |8ü{RÎf µ¸ö6ü±²¯hŠeY,'…GûÌkI w©cO*W¨縄°«%Ä¡^ýÊÿëà… •ÀSJYþ¢˜Öãd‰ÁgkWðá$¹[Y 8xú Œ(.ß};E,¾ã|zY¤Ø@4Ÿ²±¼W,i¤2@ ù³wù‹Ð=¤¶ÓŸî¥+IæUÏ}=ÜæËg;ÆT!¿vI9–†#Ò™FÛ4ªG‘šõv l°: (LïLJ~)q®¯@ô’š"›B†9 ~òqÀ}VÈ÷Õb°y kfûòÆf+É ,þ÷] I øe8ˆ«¯}WꋆäºC î ßÃdv8 &fzŸ?’[`°ÇšP)s0üÐߖ߳ผ$¿ÀéÕÛø¡Þ«8O—%ã2mâ~¨°•½Ê4ŽeŠØ…`5n‘M{!n7<`?dhBÂãü½G–Û’T`^¶c´ Ú†kn×X?NÄæñIÛÇ ¯¥$ãg¡×ö ŠUx™´Ö£ÌzÓû ‡”×û”$0.t¶È1ñqŽøÁ<0bŽ4zŸÔÁR’à° c¸³‡ˆ¡‹Öe 6çÜb4úm2aÄÖcèjÊê’Å®ü-½zöo5?²÷+L)€ ŠÛš³8 ¹]ÈŸDþ71#¨ôKûL£öíJ@ûZŠäÿÚJêæ¡TN+³Ò…ÐiMñ¶žV†=ýÞ ÁS©!†ePÎ çöèNþˆß{®çÝKõCÃAž¹âä@èä¼;¼bö¥ÔŸú;?’ éd±”Æ>£®.u• ¦ô—0é$¨LØá"ð¸Ob£ š NæÎŽœ‰&îL[OÒ¤˜)e¸ˆÉsÇÙèXÒ"›ÕʱÇýnˆ%VLÔ¼hõ"¾mØd4-›ÌµE&¬Ò1âÞ½·¤EÀ:Ó!ˆMUƒôn/DÙk‰ÅJË#Cõ鎳$>£bÀ™WK[çö´EãŸ#–==Gáaˆqlé´Žõ‹[à¯>D!•ßúö2>ÌM­”|…îÞßöWÆû¬ÃÍ•L«ç¢› 0„[JÛ[ñ÷·ˆ¥5Ê4í³õùì+À1ä›2¸:Öçç¯O-¸ ´}M¥¯œ–ê™rèŸÆL†»èKü¡†~mˆ6—FLÎp¾%Ê4Jn¦@5EÿCž¥l*R|l–ÖÎR–˱\nzE‚g¶+;}CFÉىŦð÷êøëÎ ÞõŠ¿n}ª36í³¨ÿ§üëa'…úxkÈ `,à•1Yh7#µW¤G»ê­cR}%ˆÑ’¼åo‘}„ºIV¿Ñm¶Šbœ5>t.€"²­&£ 0}noøMZászíé"__Œ;Z%Õ¢øÉd ¸$žë{¬&j^nŸOk¨aðŸá¦È–çvæ0]¼®ÁîªSÝéZ­'Òb¦ñ’S]ÛìÀY $-àõtZö|éF`;ö”Øš©ÔPt(pÍIu—ý Š/Tdž>»âñ÷Þ!ß{ÅY/¥ümæSñ8´r^Î ÃTK-¬Ø¥èe>¤®àŠG'ãáo Ec"(e½Íåá½¢¼¯ÕÈa¢—[%Ä?“,ÿ5 ¼ñÎJ°ŒÜ9È"¤…á·×IC•êŽÀ*ÛaæŽcáq}NÇïÇAgç<˜‹Rs`hüÝ1J,_‚?ª3¡gí7“˜ù~@IZ‚fg–8æit‚Ê+¬G¸^› "_Ü,¢¿Ÿ˜5–õ$Êö_Ó´¯Á»Þ"4Ø A²m‡~ÆÑ"“6 •¯H_èè¢Ãr—ÝÊìæIAw·²ÃïKv€¬4'øþóZÞJ¹"åQ—»qægb´&U—‹á@÷Ê8Õ¢µÆ3ˆ[by2BçÁÙ´"¨E1ådÈÙçc“Ñë%b‹ñ=cƒÎeŠÓôW—&,ì;õw ¼°£w±poý謃*ÅG˜BV­,s7S4þá2ýè˜ÙB 7ÛšN ¢¿¨ŠÚ¿Âruú“ü(®k¯ØnÚµãlëþÐÖú5<ÖÚÑä?}EС`h(vH;DgC6Þè»~Î}àåVŽÄ¦EÖSÞ•‡•b¬$QÖOk¯yÀkw Žá[À”H@V*G'Éôñä»…# ml»ü%%Zð¨Ú0‡±ÿ‡V›¯•éZÃsÈ|YsMË6;¤éA•ö ?Ÿz6Dâ’{%—Àa>Þ‰¢–óü4BMO½ë¾Ìu£Ê0°d¾¦jÎ-èóç:Î…_®(°¨S -Z<í݇y…bs@@Ow÷Uj™ëíðt¶sÈ]¯õZv9CÎÆÀë²9Yä¹kïùœfA+5°ÀˆL©‘Žú,²'R›WPšÿ¹î±SÏ.ÊÅ$C ?ªœ…!Rty«R¨˜ã$=‰‰Í¢¯1©›Óòù«ÞïDlý yHð:C¶SŽËµ;z O”ë·)H©¹h8 ªjê™!´û$S®¿iGf˜§âBŠž£ª•Q–×&«=ÀÞñ4´ÄŽjÒF~žQ‘ð?›A5<`~­Mb$Á&h•Ú¤Dˆ¢eÃÛÏ$ é0ˆ…£xlÖÕìFØëß' 5µªêVÔè·|£Ã+ÄÏuxÍõ»Õim^~à+o¼àª²A¬{9°_ßEËË×˜Ë¥óÆŠ”h/’âÍgØÔ¸EÛõ]*=ß4[sp b$Áð©-‚÷û¿›ãhÍòÍ@wõáT`zOŠu­H”ßĹõFtÓAFºÃQ@<¬ä;}œä0¶iu©ÀÏ´J™ž³ÃîÊ:×%òf2æ³KhÅ¡*‹ŒÁ³5DtDË…Nî{.K“Äà·Ä€€ìõÑ­fvXt?³F;n¨POwFUD$VãgÚâE«(qÄÞ7Âr,ö H…!]9ð/²› Ö+Ú߯\;,§]ø,|“€©"](!Pù$Å󨀤†L7€Qð˜l¾*AV§ÏL±vo¡ˆÓY¹ÈÙ—*ªfË& ¾¸@´“ñpl$…Yß" ô$³ö-CL¼5 ª‡_­×&;ª‘°¶}%ÄÙø¹Ò¶&Ÿ<ý›ƒbÃikæ¬É±…®dšÂêTm¦á¦¼ÉÅáž:¼¡¿âÀÿ¿ìX²ýÖ€LÙLøB„­@¥HÒ«ß )¼~›ŠIžOÊ¹Š— ˜¯IžEI,fG°²)Ù?ÕiwfÕQblëŸYG[pþqeã€fîÆ€´ÐT¹Õ ø§}ÉaÊožêÚþ—â‘©BÆ’·ˆ[_¨þè  GõD€#ÆêA¢”Àçú…i¾§zÜ„›$©bö){áÏǵ%ßö“Ì}XÀ;…ß|îÇËÇ(Ö…L(öí)=7¸j”kŽ4,K>ŠßgJ¤´vë¥(M˜6u²iuÝ:z…%Ý,F"‘$)ºašl¨«7žˆì@¤Á`v“¦Ó- ÖÖöò¹1ԯŗt‚(À¿ Ò¬í|¶sÍÔ1W¹EÆñY*]ÅžódÙGv@bl{^”\_yOQþ"ÊŸÕxZ’®äµ™å891¼•zB»²Ò7†6ØÖ€I“5QÄ ¹"°wRß;“l3ì¿Òfou¥-=Mk²äjf×¤Ò Jïñ–a§cÖy·¢ÕWZâJõ _1FAëTŒ¥O œí\|c‡zPit9ÊÍ2ºs=ÎûMœÔ§º9z‘”§v@‚fú¾)TJÍ»”,c |'¶üO7´ÛÊé;GÕK©öµ€ÜNØåÓ.—ßÝ6Uù™&hoÇ3T×ùÀ¹;8²1^ŸÐÉŸ¥ÈvKsan&î‘_òôµçIöð­T•ë×cüÍ'ï/¦$?!VÎûWTFU~¹Z.m¡³ì››zE׫‹“¹Ã« T—l~uàé™.Ç4®V*ѰÒö>žvBZ@3»òR2'$S¤nYxÞþÆÏ¼4Ó:í/õ/?Ø“hWŒÁW:¢jgzu_™ŸŽhôF=JÀ¨”e·M-oËlÚ@>‹ÔÎRà/†H{ÈÊÐî¿J`°K@zÔ%r<¸û–ÜE]·'‚?…©è¢1{Òèå¯Ï”/„^‘Ã<=šâ§çÎ:Æ¿áN©‹X †…0è‚MÅzN³ogÑ”ª2ìwEe+¬ o'Îb‰EŒ0ÄÅ:Rçqç:ãjOºme;ÿA\[NúH,‚Ú‘ârÖz-]ÚO6¤Ë<Àw2C¹i!«´û¶s,èÞïæåsðwmí„•±ž Ebþ"ß É,f\´£„U~5ƒíyH¯aMЋ»ÂÛ94ÎÆTnS'‰ •[çéòF¸ägÖªsGíÍe¹D·îV5–ùájº¢ þ? EkÕ=/ÿ¬~ÙfB?:•qZ;õù3d]-Ý •ÒÕÂU/8÷ÙtD:PK~êÐ:%Qš¾ÌbÙÇÆ¸”׺ÛÁ9§Î&Y>ÍÈ â«-øç™Ë.dþZò ÜÞ©©æ‚$].ñöÒÁþNü3¨Áž%ÿ³}‘6,‘“®½±…”úƒÛ™o€qúø­0‘(j»›Ïr?lœú2w¤-)1kæA6ÚÊ;`À¨èÚΟ¯žsæO·3Ç‚h¨MÉjáøØñK¿A¦MÐâΜ‘r‰]6–¹+iB„Ø3 7OÔ&»ñ]×Ëh©Ì•Gg·9m­N6»^“NbÒú®÷¶êMŸÝÁi„M~±0ÌÀ À+öëcy~6f„üúÆ›d=v)IżæÚl ¯›Ëò[{3ÝÇ ºa¨ÚÇDLÕs5Õ>c¢•SâSyî¹<…ô\:<7/ç YH^öÿi/!ôVbÚŽý¿Ù5§šö(g;âË=வÒÎ`Í'â² EþÒPb F^ÚÚU¤Nd¢Ïï¸èܾk45»,Z:øFt——Ê;\Žj†Uå"#­”ѯb…%ºà€"”7ró±"VÀ®gäFöë.X:¸tÒ–=a ï’ÀX Å+´€‹$hà0‹Ä÷~~L:K¤ˆ @§IN1)È÷‡#Ô9zõY'óAüO‹rWö˜ ‰V5Î@Ž¿ÞrBŸÃÎctí×Vö!TæÔ–0òdš‚¡ìQb® ª$;Cõå½ò3-¬jQùõÝVLøº›˜ûÍõçÊq›/‡B¡8GaZ'˜SxçýŠã¬ù_Z… vcÝìz6õü aÝ e Qá!ìI2Á®ŒâïYqþãQ'²oRô¸öá/8Dä¡Nùf„ìFAÂfÝY¼BlU¸‘á­†;‘òµE‘Δ9"êuYX½>‰m0lvÖDs†ñê}ÉãÎ ø1ž?L^¹vÊZuØù)LC2;9¿Y›CP€µ˜WåÍøiw‡ær ßå$Ïl2Wš`bvЧ!¤;çÕWƒŠ+z8ç¨ßD—ª–Z?lÿ®múÔ‡YÃŨƒ‡§W‹Ñq'â,/]H`µ~‰ µy¯Ó RoÈ~t9~|Ž‹ÀŒŽ»<ÛTzØÀ£ê6(±S/0ô–r‰• ˜~%+ýù¸¬ /¥‰?~ÌŽÿ‚ÅË.ëÃYÔ­Ù¡ýØûi/¼‡¡*ÚAÊÚ¾3xGîÜk .*nh‰1ÔÎSyuÙP[¿kLEá¸NÇÿj6(ŸžU“™f½ƒ0•Ø÷1ÿ×XùÄV_'KÀŽQqö³^]ÙƒÚÒÃG Ì€Äc¢ù¨µµ?Ò:ÿ©ñ4›7O|€ôct,Tlßè¶Óêí󞿆©Â)œºÃPƒ¼ k[pˆÏŽ|ž¬§+¢gá+Ž5&q±`t¾&ãìÅ<Ø¡nšê`…ÊÏf³q!Qåk”fìÇ Íè†D]F˜.úàÈÍòkC9,¢–a?EúÑ;æy‹™9†rÃG9†Àyr}òٰٗ×GCVc„5¶YSQÊU¨ig•üÃ$V‚®{õÀN^ñ'ëËR^ÙK"ÍS”N!ʵħLßÔÀ‹$8‡?2†"tWtÌõ.(†˜–M.ùõƒÂ Òà ‰óÖŒ6#ôݦ*ÈÃ_wçõóržÎZBÛ¬j=wc±yì1ð¦ üOe·÷¶Òn‡ywä ª°2œÚwâçµæžoë{lOÿíäe˘›±¶N‚©„7S˜ÃSßÌ“$ä®Âa¢zŠ3ZaåÀö~]ó; \ò_þ÷²—E- æ ‹fK¼Ûe ÐA¤GíŽ" —ÚNL`–¯3})á%s1R6“.5ßkt×÷*cD7öÆÝa´Ñ苃í;p[Àw|ýr€@ZµEÅß»"ÆÕ¾qžÈ{0iôq­à·áG‰`nz`SZ jsd±€¯²Eçxúq”†iá¬Romx¤Z#\ûDGhœ¾˜yô„—,åÇ@ò±†ªaˆ§Lˆ2DëZ-ÔlÔn‘Þ"øö!¿ùkM˜Ãþ2’¡˜êñ 1w*™Ý„Bü½”a”7A“¨l´ «4v¥E3¾S•Œx°^ÜÔ%Ðyë$âïä¢ÞPN{Àä?~sk v©z )¯ož`\o?N.@Ø+kO@F}Á;dÜË-ZÄ2}—Õ² ‘š¬"³¿¿Aú/Ž]'Ä>ð]úD\äX‰ê÷˜.ùrÄ?DAÓ¡Þ"F÷óä½k[šÄ5ïÅœ£Ä ÖþVøb¬m—o$ûk¬³U75>ÎÚú{q~:š5sƒì™„”›ZইëÀà™9 W;®¿öUE¥Žñ6çÒ 9?Ñ9&-ŒQÚœõ™“ÿ^“nµ„ôRð€¾•Œý9 ¿ºOõÈòlNŒÈ½;_¿•Ýï±ÌÝʱPÁx«°.ò´¼:ÜUƨ.ÿE0Å(ŽÏÖÊUŸ: × &[ ©?% ªb]‘W° ¨®›¿Ö\×`ó““Yr“²„ @³þ dÖן“Ëj§k¯eÑF°_’µ»Ð#'¨øÇa/¾qRt¡ËÅoÂJÿVŽáçPqöŸ$ä—b𢠘Ýã_ÓTÙ8u»@ÏmÅü ×É‚T~5ŠÌrñ¤¤7›™æ @R0ü¼±ï«¬e,c K¸¿rÙø*]°[>üQpÏuÓN65 ·‰ß}f~ô„Õî/?ã‘øû*DuÑ/ƒãÉô g­…*ÆÛõ ò¸‘S]<áž]<"ó‰ry¬ ¯Êt<­tÝ«2³Áñ- N kôk?­†ûõ«y‰o$“7Œž½Ø×ÐìíÙs˜awÛÕ‘0!v¢|Er‹dR$ÿ/œÂÉ’X&q]è•¥êvG‚ÓtV "¬¹´Ï9bB„j¿ÛÀ{ÚÓ`—zIµÈÛC,m Ç»p¤ð‡ ÀBÞ.qæ¼i4¿¦ÆÀkÉŒã§nçm!x¤HhR¸¦l8ƒéÅN>} È¢ëÌÀñÆåYŒDëöÄ×­ ˆ„›uÿÉ€¥¤Fðû=ÙÖ.y±jìÛÇt(Aëÿ„gÝ4T‹A:ù“AØšu£ 3qL`ë)hí4a9@.2€ÎsËàò>t^»çcaH6ÄÛËX¼ìº ÿ¤MتÎÛY¦©Ú{_ª0ràòê¾®Ïí‘GÅ5¿+{âý·Qá)CMÇ®¤ÍgÔ°¤$½ŠL8_¨ŽîôçÛçZ!…=Ë”ü†—m™¿ F“1­ËÏÿ#;tþöñkÈ‘ö™¡O6ðÔ–å ÓM»›îË’Ö ,Þ—¼oU°{¤ã´ÇÌþüö;hœ¯Ð½OöO´{ OœänUÛ²º?ɹ9±æEY\­YC¹ßåŸï_aw»£¾¯·¿;ÇÙò¼¢=¦°Cr®œù`$5Èê¿`É¢–°‹Â<¶üC)Úb Ñô 8N9M o–¨Õ!4‡›5Gl¿l¯U_ÃÂ3¤ÙÖÈð,¢¦ñ~‰Û„Ä}v!.·_‰:€j- ¡ÁAZ:ðîµî†6fŠð¦ƒ’ÑW%"€ÒXU¤fFë€zÁ¢ÿS;"À˜l<Æi^ ¼½\–0,q&Åýàâ¡™Ó»²«èÌU«{lÄT튽=z|lÅ À-6î­îü ¾„pPØíódÍÇÐ ÿµû$w€ñP†±—/ Ên>›x½-†&p N¨J™@ïßÛÒd;I†e6ᦉcŠ#\Êz³_MtÁþ™±&j+/°|É"ÚØ¬ éé·‹‹¤Ì:h’4«JÓ ^‚NÙÞÍÙè„N’þž@h“5-ҘطVÏ\ä«n½_m`z ¬SIŦAú‰mš* vǸuŸAoV6-BM½`>TDþÕWÃ.™“—R^“¡u>Œ‡†(¨~o)y`ݤsëñá„PÌJû?i}ðtÛˆg )ØÚ´ðqO"6y9EÃ_o'æe–_­ Z‹kBvü[NÕ Rû{îôæY3¦ûô½ Qò0­žâú &ÿè…ý‡ze°*/î,KÁGlk´UžlŠM¦}“hoà}¶Ëá¬r÷»So€ÃÁ^¸p¶”mÉÿ)ׇ#× 5¥†2¬_œ0+Yó¶(–})5ŸF5Zûx&2Gt]ë“,Gވ̵L8hÁ+S:R@q›æ"4ŸtN ¤~ΕÖG+…nÁÝ gÛð± =ÍŒ^“ñD³9{]Ì•}B+°ÒÜ î8Gºá´Aâ<ë ´==H ëFÄ0ª—ã‘xXçF¼Uí(¥'xÚ²ÞãwPCØZwCºÈ”sÖ¡¸Î´xZâãT\y¬‡bk9„íBù\%)A$j¡`˜cÙßBºÒ9êG¯6*RÊÂþ$uô:ݼŽêmsCM:ÃuF÷j ’¶š/ ZŽ>bÏÿGyI³=ë'4 ÷e-.Ú…Y’vƒüò8C¬ß=mþ±É ¶¡¶ø>3i¡Ö%Ÿ_ñi‰W{ÜMènoƪJýpLð÷¥³4ôxh¿`A”S܃ÉÊ䆕6‹Ý—'bgð°šöIw¯N xÕ žÑȽ̎ÑㄪsGfý|¾ŸÀ /gsö_b"  ˆ¹}¶Pæà vJå Ïûji¹”ç Ÿ´3s­.M-EÖ äFK•éUY3£}‰Ô4ÙšaÅ,~‘°0çÊÓ-1Øx 6wæ\×Ëíòû%&÷ Y. tý†ûd ¢‚šþ¦ú‰šoEÕrLàœv`(2JÜ‘´¹ò>±¦¥oŸ±¢5éñ#¤ÈŸY!þM´ÉÒ˜ Þ é×&1ërÛt߬ƒ.Ê9jÛÑ–(é¡ùj˽³ chÃÐ|g|·ÖŸcp~HÙ ‘yº±…Eލ(²Ñýbþ¢ ³µ60Æéío‰]Ú{|?GVǯöýôÑ i{–w'ÓúFTæZå•ÕÌœS™í(„*mþP:Ft> fltÄg 0³ÛH`ÿÚcÖœ•ä@QɇØj”,¾·ÛkQäÎáxþšÆ˜AwÑ”½„ ›+7’íáµuÐ)§å–/Ä”¥Î9Y …(XJáåàQ멯¨¼UMþØi&z|Ïw9¤ÚÙS^î˸L–þÓŬaø¤jÒõ{pÉ¿·”x~º"Ûjc½´¹Z ìrè` 0"bAMŒ5y_|?Rˆ§ŽÅ²v´‹6%1ñ(j¼×Lï¡zî¿~«\þÍ}Ä㧦A¬ç°Ô0•R?Œ>.ß‚&HIÉe¤òå°¥¨Š¥|Ï4|ä<ö«FGÁ·¯è¹B}åèæú²µü¼M0q¦€–,ÛÞ…Ñ£)µYï&.¦ÉÍy š‰óá÷Õqµv8-U9~19 ÙV¾BwA÷á8ÛêÅxÞMWMßy Jô~u 4i<е¯fidnGG~+r5Ñû…š­MmàÒ ~ þç²;b~Yã˜Zd3ÈÚ$¾ud@Ÿz—•»öÙp[åY;l'ü5¥~×m”Rãr³(ge²;ëuÞœc‰® iá³ù°b‰‘ ”ˆÐv=ù¶-<ˆk¬6©’ã)±o8>Kìù›s<õ.™‰ÚfêQK\W¦­ f!Ö¢G:ü ¢S'E‘áñÉùS7Ê*ÈÔj+Ì;eìd« IÚÅM Ý}5u 4 )(ⓊA괱LÚ¢ÕÜ#†{´©\ˆ—¼ÓéŠXóeÁÏÛ\ÝÂÎx¼ê¬@¨{Ù|Ø¡רNñ†lx-§ÐÅê"Mµ–¬KwÀMLe#ä¿p5C®©$ÇêñÓÏÕ^®íÒ¼§&º>F.é`¾¿}ž~:rÜ¥“P{ƒ ¹Û ó‘=%T¯IçéÕw—8ß*ÁiÒO縤&Ð Eóü" ˆBŒu¨óîÞ‚¥9Àw¡<¯¢† +t¹µ0—Ü”%bê‰=ÔÃÌ™ŠÅs–=©Ì×£ÿš5ÄP“qæR€â³RmgÞÔ¸ÀõoëŠHêæÛø±O3­7*Î /“¾ruæóÜ—ýGŒÒ[ŽO:å•kôcÞÈ{ñjW$6è‘ú :wÛf)B/5:/j°AçŠ ê³§ç0ˆ¡—ø‘®!%'_ooužpbe›¬©Œûh+ñQ?*(øÅP2£Iuª³KñÆgÝÔCäõ» …aüÚzE¶ 7G¹S+'7üXr=`*;MX¬«JÅßǵބå!eF Ñï{cx4ÆÉ¯w¼ `mo6Y1 ÎûëÍiã„IM¿ƒézÞ‰Œ¢ö£añš37\KÒ¤ðp¶¦ ­sö‡c":(OÚê¹b#ÅV½{>€eUBSj€9žM¥L««üʆ2ÜÚ‰!Ø®$AŒr@§ûƒ­²TûÂLöAÏaÙæÌŸ3éÒn:B‚¿5€Tæo…è9ò¯Þ_ùˆ"—$ÓEYî¹^V/æa¬®éר2ž­ìÎÃ%2@'5f&ž£ÖƒK]é][`¦uu‘¿ÆP]“ë]~‡‘p h Y«€]PﻚœhöO]l¬ùÃ"å$S/p´ï¹˜ƒóN¯¾¸+‘ž|ƒ\ŸÝÃÛqáŠBü&èÐ@RáI-¹B…& VÏ¥Žá'Páºzãð¬uó$6~òÏ5B“ì^÷5V%8ÍU¶­%‚¥C¦§gdP\­ïf¨Ë­ªS„; `=Y¿©ë°rtÿT<;òïgg†@ ªN·Œ—Õx3 ¥- 2Å2PýäâÏ+fɵÁÈìL+y‹„WˆDÄàv"¼†Áµ§á¬8±ßÑí„ÊÁ£FÑvzv–œ´"kÎX£‹-$4ÇÍXá Dªo« ÏÒ:“éÜÐd‡MœÓ#G;xí¯òÖˆ±IÌ/t¨åüiôŒÐÄYS†å›…€¨¬ËL¯FôŒŽ1WP!µæ'™"æBüŸ`cfd›jŠª–Õwþ9²TÊ_¤OÙ%MU÷Y}»MÍ«bº=zͺ|w"º«« ÐÆt:{u-ùȧyS§32‹w’ޏ@\"¯)eDpÿzÁ€n!T,œËY1O(E±ö£ c«B¾(ú‡"ÊCÚ¼nÊYþÈ—÷C©˜z&¡Å‚zMϵ-žlÆ®_1•k™ ë°W“^³·¹ƒò/*ŠŒ»øùwš˜é‰Ñ³mk‘¬¶6„½£ŠÝ«hþ©UyÒ7WyÅr G£Žñ7˜¬ „f¶wWêf£ÈÌ:6^Þx‘¸üágã‹î#+šùþ4J—uœ­J¤: ©!P8šS‘-Žø`·­x7ƒb¦9¼3'‹k{d»v Û$}»-Üða`¹qívÂ]Ù‹;Aù0ˆTÀ¿e Ù_ ½²s…¹bÂ"/Sû½*õùÂÇÌk¼–P Y#èUʇϨ+ü ™àAþè­W6]Ÿ¡Ë²**nR¢©ß¶ØPcÖ~L‡i­¿¿j݈§f?²2àmø¸~i¯ ð  •QÞ0ÿêDƟ캥õC6¶„†N?˜\äõÒññ µ` ·úS¾-ç4Žg9”gOBb +šøÉ@"*Cró§ÀD•ÇÐs?У»Õ½ê‹3¥©·Û>?Ì×PðØÌk¯£‚K™¾ö¤ù+õÏ—µ&2 @çC®¤¾ ×!ßžê™Æm‘ƛH=éYß$?H?%ž&ÐÝ_wR$GGø0CMít'ZÍHfÕ)ìnìH}G9€êËëÁ—‘+ònË£rÌÀ²=ÒzÔmÎÔþHDt“…çß4Ø`03e8·dê™W˜ ‹éÎãÄ-¢wVî7BauøÚ¨y¿´¡Ûóycâ™3м=¢u­“@* F‡b¥lùA"Ö+Á9þͺhrV©]4qãß ù$™ãÍCÚÆ±òq%ÃÙ¹%ír{°Í‘ã,ñ‰1¶_åJ¿x+¬5bŠÒÓÑ£òUÐD´©Ö.ßãÕÖwc0u¦X¾ZÛ™ç.pB£j7 ØÄžYÙã]‰¶Lžß],À—ÕÞ¤’ÐRyD%ݺÕ.ñ^ÏÂŒÇ|œ-SŸ"‚Ù†4Tgq¸Bwýõg*ŠN$|1EzbĈóšXËK‹¨§Ì“¯m޶5OÞoK(ÃEá±3·ßΜÂ76ó™Å¾& (zÝü|´xóóÑäRý²ûŽNF^°ôî"uü‹¨àP¥½BÚö&ôèy~à|l ±ÙÉæ^×2Ì…RáqWû`…yÈN£í(ÕåTÄê¤bâ:#ÛÛÆyß0)–åM¡à‚ ¿‰HÓˆ*ÌO_|WF$(ÇÚkÍê“€m£¾½õÑcjC¤”Ü#gòO¿ü›Ðð=X€È¯±ZÒcʤOJrðRGœŠJU p@n×zV˜Ô(¹*d¬š–_õU-Å*£Ùû3ù : ¨ß•¯x†9Aâõzu”‡lŸ:ò|wÉŽ9cñgBPô¦©˜¾ºÎmcåéçš>›"ÖÛvxÑœ>_४øürbjöÖ¸\N.¿>“‘´}¢éÏ&sdñ±~²¸¡ð5ÏHϦ‹f§EïhdÛÀAÐDyRû™§C#aŽR(b~"R܃e¸³œÎ¦_v O†'„Ï|Ðú)ÄÑèÀ÷- ‹}>ãY/> ÙÃéÀÑ(•²e­©DÌrû»;‡šoÇO÷G˜D±ß+èqf¿ÙðˆÙ½ž¾~ŠÝ4NfÙ Àf°†Oç3pÛj<1åˆÂá‚bwS=XÖ'xaȤÌŠþü-ŒØAØžpS8`ˆÅĈ"zç}›ŒöVÂõÿã“ç¬^’Â&ëCÖ§ÿðôKn·œ-×âÎKuâlKϨ%ÃÊŒ-½FÐÑö +…À_MºBò9}/ÓÔET¨¯¥û€¤Î^tdá_‹mîÊÜ7¾•Þ·~S Kư„^®zèÝãƒZfH‹ÆE¤ãlw2‘"oŠ¡[7!Ò÷“`2(ñÜau•æ˜è?Øçì}Öoîè'¬Ôb«þƒeÕ®õ»ûKýŽ­ss Ú^ˆÃûôàAò:h ñg2þh«ÇxëßÓsK·…wm½‰üºâ+oêÂ]°²¶ëØÂ…;SÏ-›¹Sš¼NzšxøLUwžÎÆl\FÊfá’sù• eþ·¢‚ò¾d'1Õ’#eàSÉBAÆItªÙºåÅ)vCÖ7HS.¤¬ÄD½˜‡soÁæ¯åE)¾ï.'òeô8?ŠÊÈ9HZ‡™ÌÒZxëõA¿’ÈÜ Ö ¦ _>Ü1Íšçû–è ÑgTð;¿"ˆîü‹ˆÎ£Òwºo=k ©ñåùºOÁgî"?¨£ç6ûì´ÅÍÀûa?Á “‚œé"<Gòçá‚PÇE—;Z ¡~ÚÞ`_=<ñ¯Õ+=#Ûºw$TÚM÷zÝ”}·•Ð í¸W.ú½©ÖäV±˜Ws•ô½R:!ZÁ Å{F§~¦j°S+÷v™¯«›œS(#Äw¿—&-O¯;R©'ºÐÅÚVÙ2_tÒ>!%þÅ8óp›´«ûÞ}§ùd:¾b‡cpÙíð¥†xID ÅMÌç²t;ªîгó„€sã·ówO™Ú˜šNŸGô°”éÛytP‘2ØñØuG?¬1E »..V"l2¥íRüÓ–êìh¯]ãŽ_rây5—Ÿ[Û~Ög‚è?ÇA)Æ‚>wàÂ¥H“PáQºJß6û¼ÕªÏ$À³KØ ˆ#!‘R[>WÙ=õál¶¼%¤1Úª½|mOŠ:ß-{gI2úsщ6Ïá¯8ðh8 óJ¹ì‚B[í­¿’ç˜[-KV·ë“´%½Tõ\¹ /çvgweÜÙÇùäR_þ³·| ªo<ý¥ðTM¶K•ÃÓ‰c¡ømîWà[ÞíçæúÌ;1‘‡óÌNäáPÍ#§ýÍ ˆàFÀÇg,Jÿ'L*džgªËT«fT8@,ÇÒ $fÑîI±#2⬖pó#®Hm„q·ô‘ £¹¨™Ï‰l6¨ßÂ^^Rœ¸íì¬Úf´@×Yƒ8ËM“&„ÔæFÈ6¨dŽ;?ß Ò˼1ƒvNZ’¤Õ/†k½å30ÄÚ왈®†m´×’PlúÌc‘P¬œ€,ÜýiÖ3 Ð)„ó=sj'ÓýJUOŸØÈ'õHµñ™¹Âí¼Vó%Ú¯îi²‰„š;ºð¿£5Ú#þulêKåU$ ó ¬añ\ H:.å¤2x!ŽüsÐxê€Ðè@ÿ(èVóxwv•ä]3¸iCóvƒP*öÔ¨¡Ù¼nͼ;¯í'jÿIÆjJ½~-—T¯2;c^¾±åý27\­çGÝ dŸ ½F‹³ÿ®wAÎ(Ç Ñ{_‘…ÞÀfŸb®»Ç}.¹±äZA’R,µØX]âXb$âXô`ú-gVë×É¡; –Å(ÕÇ\|¥Å•~r€&ÖïæÙv~s$cGmÏyò©Xðž»B¾fnL€¦î¡$UÅ?Üòôm{ô0ÜØvßëUÊ t¡5ó‚¦Nº~ÇpÒ²CôNZùrzÅbX¾ H· ä°&šÍ¢j&' Q”Ô¢¤Lƒz[¢ ·¼8P@9”o¥`þ„1h÷ ð€•´Ò±(qB1F÷I£ ð]ä k^NËÁrÖEÿ±¯Û; ò~”Û¬1JKêX²÷¾è%ÞåÛñ€Öú«"`Ñ £:ـ͕p»¶2­Èf?Û-&Qýaœû¶¥î÷u§âð¬€# óDÖ[öû.B¡«¹a¶ÔèFœ‘ßÓéNÜéÝLšüöñæºQIýòšÔ1r¸¶p;-F ¹ðÂîã"Ö8†Q¶2j&¹‡Õ·NwÁ8ò,bή宣Ûi>Ñ_[Ž1JGÌöážLMŒø¹ØZòIJê2DZúó{çi¤ú€A«ºß L‹IÿÚ[ÇɃù&ÑY¡å+Óº RD¶Úç~‚ß¾&õ³þ¹þàÜyêyÍ4”âÐÓ®ú‹1Lºk.(½òµSECïR°o•å§`;ó›ÇýœUÜH‡\·zJìO–X'+›ûF-G˜þ>ô©M#ct¹ÛL:¬:ÝüÆ;ÊÉõ£ˆÝ°2»€¦­EP¾¦Üˆ ýbûéþåvAkw rCPM‡.Mq×Õùû±ªFà¼`yÍ»û®Qn'þ®JÉ„0øç-ÆUòè&·àüøI&¬dô˜ñ™¹ÉYÝ%Õ–8ípÚ‚æz‰©¯o‚b•]\ wDvÔ*aÕC´nï>’›‰ï Å5;ŒYš¨ØÄ:©!mv±WÎZºZŒœÍTæ¼Dc;¥Û¦æáÚÖ×…!zŽž×k‰fö+VVaj9ÆwŸ^<•[1ä£9cäü†ÿ£W$–ì·ØöIý­,݇ĿÏóˆvØ^³Õ?“@µNŽŒy»ý¼§f6R8ÏIó´³c»_ ðGÁ½Àb×$ñA„VnœJ8>3^(ú,ï²2/²ñárE­Xm?B]BsûŽU£}„¿9¢Ì + Ϋî5¥VñMû8ÁtNöØÖ½<ç‰(Ïé>ƒÃ9tâµH˜p$ËÆýxÙg¨"¹§”¿¥H>‚ó³O„‹Ÿñi/ÛÕ”ú<ô‚TëÓ5!æÆáJÏcûª‚”¡4@•˜Ã&¶<·õTÐQ‘p`?jzèà"2›s€5û•{¤¿²ô‚~  uº³®Lç ¼ÿxÚÒùemÞ'¹(æFTYÖ×cSëªãÇãÐJê¤Pg×ìCüz%‚àGTëÔâJ£[0ÍÜ!od,#0nº¬a?dÔðáEárTEÁpxUÈÑvG¤ûôqtña§»''‚Ìû=h5÷+ñK`ˆ¬òÄQt‡Ò¤ªÍ×öØÍ¢‚é*#jH¸zԡ݃²ZïX¬åt¤eõ3Ã…†-‡amúÖc3°–Þ«dS0’Íâ¯ñ“&>_þû7_.MÖ^Á"ÄÍÔwš§¶]9ö¡èY¸ð·ô·:ã5æSv¥Ù P¯÷<ÙÜ ’ç—â­}°X¡½#óÖ«¶[Ò<¾‚ —‚È"=[¾;Òañ†ÓA‹±huÉ]rVµ?tÈUqŸ„LÔ(MT¡;MnŠ…äí%×l´ÇOû,sâÜÿ*§$s®íAp¼ÎŠØ•ÌwK¬gÉÒþæ×cr¿ˆ$€~Ì›køJ‰îb]˜ÿ+ù¿p)ÈnÅ&K I‚~‘¶ZUÔ8CäÅ\²eŸD&sâ8Á6‹E{Ò ªëüõÞé&¨O dF­ ºð´Øzb>Øœwxµ€ê¬rDO“h W•7"à]œjê£yÿòI;N[eš`  JXVÓ›E ›~=KMì* #lûµNë*‡‡ºÈŒ lµ´¹A Ðiðºe¸Üéjá©&ío…ÁKv( \O1ÒRØ,ÖŠã‡B!ô§ýõæbuZ¦q>Μx¯ù'˜AÁOÒÙ–å6_  `çgMçÆ&qçrS’GŠ#<É.1 ÑøõLXfÆ-†ü§Yqe8ÌÖÐ`íøÃ»5•ÐXjô¨qrî9¿Ñzê ]“µy{±ˆè¬{“=—È[…³q`¥ JØD”Ú½j˜Îþ'Ò…’…Æ'ÐûLåÇ Uu‹‰7Sí"*Qä[Ø|É—W^k<±Âá¬Tzáºî3lJ­ß§“Hæ}~èªC bó 4ýó3¸þKöÝ9Õ‚ ZÈùuÒbDq Cgò¢ŠæB‹ «ŒÁÏ*EaøÄ&ûð"ýâÚ£GïÒÐ7Ò.XÅ)ÂMIjÏ’bÖñ‚ñÃKÊ®xT‡›óDÛá6 “žñçÛ›þ@¶—ð~Ärýñž“7Õíì—®ÎG´;ݯRs‘8–¨yë’ÿWm%’ª|cNÁ Q#ÇðäÈîÿT‡xÙa`«N^~É0ši¶œ½@&Ÿ¢¿þ'o›8LÁ„«td´Ù*Añ+ÙjŠ1µÝ›{É9ÒpüâgÚßê'2¤×H>÷F bœ¢±[—ëçcÿmž"ò U¬1¯­¹Û áBÑ¢Cþõ&}ó¹ ÿ*È£@Âß‚ &£ßŒÚ5'Pæ0Âã°¶ÏÍÓÉðY}Ø–´úƒ_݆mg¶±"ûÿàMH•!©Öú݆wT†kÚ½†‹±§b²?1ø5¯ß†æâ°%HD*D¸šT½8ÂâèvÄEÔéÿáÂ0ÊÍÂop®­:\{.„Kªý[Ô€¨oLý•—>Ê {þ’ÛjÕ2üá‘Þ;+g"|+}È¥¼µ9ýŒ6‚-ÿTÒ§(_ÑÎj£<¥ãt+ ŒÝ¬­ÖŒv`ÒÂÊú°0Þ ÆÀé¶Õ8'‡žì^ܶ䱑`4Ô–êTQÀöÛ2Ø€B–ðÞÏ1!‡È ´0SС€Y õXš0áÑ™àÚÏ//%ˆY„àävÌÆø¢(/v¥™\}z€‡Ï«ÂôŒL[ð:Œ º=þÈ)|bBÞ r2~ø¨#W€¥nqôþ<‘ܶQ:D¥óN)¡œ«é' tCסÏÊÕÈ[ÖÆ¨Õ™$ü¥ÈNôúF‡s#„8·†û nÎn—"¢˜Û8>õÿŒk]˜3˜Ž1P”†uîþ÷é}I ö©©uöI±º¨EåNÛïI¼nj¥ªÕIª•,UO´¥/[ÈÔêBÌ£J“!÷çÀЙ, ëoEPÓ·`ý‰‡°V¬ÖyY†Z'ô^˜‚— T Ï)xl†™& mpÕË„Cb[î°“V”ÀëïE¹ôÛ Ï×!)Š|gxÜ– ‹síST>*JQù{í8×½çŽÒÒ·ÀZ?œ +V=‡÷Eß¿nŽŒ-Ø+šÏ-©0.Ó=ñB·¶+°ïK§€,Ú}m+K¿ä¾2B~Àp!ePv, ¦ 鬶_m”¾ôÍcà€¥¯ZM–Qû‹¶dÀëf—)ѽ=¦mÊSLL™Cާöj­—Z|a&„ççtξŸê³IDÞx¤p¸Û#ô%vÇ‘ØÛ¿‹ËMéGTHÕÙR]BÑHЈFÓ% RG‘D˜¾_¡òºrçB†v8Šn$ížYtëH÷x!÷þ6É”}×µì8(»³ÃŽéT_ÁÿÄK$bGœLø>m‡³6æ­8?€½¾μx‰&€–¡ æ.'ë4«#íT&>Î|ªá ÆöäôùžCƒR¸e£›¼,šFÓOAÂ4ïKw5KX…z÷[d›Å!u CÞ¿OeC¢ÃMöêO;DSW*•ÀVæ’ÿym¤eg+‡¦¡u5ûx;;v,XR#†héRVS4S•?òO G|ßÄô«9ñ&4«ÕÚ'WÌO§ø•ëþÃ{1^Ð_g®<¾ÕŒVÑgŒÝuýhüfœØÎŸ³T‡•ÎY>È;WŽË€C•qÏšN~Áã–lwE>'ÛÊ1~ÀG–âÙI댥¦— ó‡gSNµ^#»‘úv¶Â!T&v²¥*…©‚M¥D æµ,îh[Q Fi‘"͆‚±c½eõXÂvJàvaÏÆ¤Ò-Þ´PÉêK0S2ò¨Ò¡a.–Ä |ÈC†¥KKJ(]w¼2Ås-M´ Ý`Ra-¦„ßá¡"ðDU鮩Ü/ œº³\5‰íÞŒ¢ Æ8è¦6ŠCþÈ Y…#ޤ=gb" 1f]«/y|Ó?M›HCéñ<*gD,š@ˆUÜ£‡vàÊÿŽºìG¸ý”òÆ!õm'&’;,Œ,\W!ªÖèÇ"•ÎèÎ+…:Ô~GûîJV¡tº==X²1*h—˜ “h#ª¢ˆýIîªxùÂI˜˜úÿ£·æ¢¼yH®ãà²á\–r˜@UBÄ!v’ºkãæŸÝšÑ1a( Õ2ÊE­Âʦ‡åw mðJ7‚m®N¹]¥H’ ¹Áù·1 ‰ÀO‘‹öÌbê9 u53hÇ­Þf«ë*9Ûú±Íöߎ2üW95•Ÿ¥â=êƒ/Q–Wd£óÛ'&¹”»ŽñÖãô ¥ev1ä¸ò¤äA¦åóœ¢LW( ^UUòKîãPªaE–u‰~öâÕúrùGJÖŒ™¬ÑìP2Δôù-(ß÷•'¸'HEd%#÷Õ:ÌÙ¾¬g^£±iz€å¿Ù½(W„?)Âêös·pªO$ò¶J¿á¢*Uù6„ƒƒÂ%ôW~SßóÜE• 7e<7>T 6ŠçÞUp“ª{üôFÎÆ Y*òFÌCÚFÛûÁë’žçKØ!KTå³,†sï õýŒrÃüÈìÐÚ,4:Î^©î@D«ŠŒÐßÙQq´u›ß[­:Ó=h&›§ØIÕÅ­ém÷ L|wñ8ø8X¢`/Á`a(ûÑñÿã#\J ,GíBÀÐ}ÖÔGØ#ÿ²Ê Òh`€»÷زTþ’®iä´Y“O0ÆÉGs¨•j“÷j÷íùÕ~¼“Àüœˆ³§-ˆ!H¢NL¨À“‘ÕÖGÊ×´¾ð áéµY ´i 3¿ÀËyñó¨û2¦ÆÌb²¥¹ïM”IÆès˜5WBåC‰Mæ¡útTéñ{\B5ÑÖhé=Dý’B¾à€u%rû±aÔÁøn—ª‘R”‰ôŽ/½ä‹ 5ò¿àÁZxÚצþô+žLÙ%}Uómª sv{pðØˆˆãTh[ÖLó s ÷ÓWåÄý±‘øqØ)|uIèj¦åû³ÎR ø&„ˆ€ò‡¼Þ<ù «?w UÊ UwaÄÃZ‘p®ˆ ò¥D!#˜ÄÞ*%=’4{èÙᡬli_5÷Ĩü6Õ?2…º†»Ù\&,/¨<’Hß+?òñ˜µ@ƒ?÷ÀÁ`Ì_Їb©ªµ5Šé©-ÒªÉÉæ§ê+oWžÉÜ­ÌA”áðT. "Ò$Fg°ë”suÐúÛ„$vh‘óó²VÈØQß4•|1àh ¯k¸úój]NV÷îs׿§ÛEÍf§ÛuÁø¹Vבîþòjâaw›“ŒŽ7á%«Þ Ðl¼®½ ]Iˆ4…E®Ø+AIJgi;ÁF5u„ÛÒö7­²‡Hž@;ôêg?4T”_V…‚O ÷óSéYS_r6R¡ôÞ¿˜˜üࢴ…ãÊXbTEA›7~A£àU f€)éô=!ƒ¿‘1]‚:að/Ýj}›@1[<³šââü£¸4ª®[ØæÄœýHàMŸˆ#x3ü*¼‘’#g=5³^ÕzÛ?ߥ/yðxl1Ô“úçCm xß}Ò=Ä(Ë|R4Rø*"7Lüã=šW”üÂr€ÀGí^D› jÞþ3à%@,».Õ–÷"ÙjC˜= n1Ã$ MÁœŸ-ϦU,¯'HÍù™„`'T-w]B»€œ€Hv7™n-éÆýÄ|±Ü»Erêí äø¨Å2¹y :àÏœý`ÉDºa #O‡Ðιå¶Î8jéþ—þ:p(S„üÿm@öH—Ì ñ5æÒÿ%4ö°‡~×ó üm’ØKó–+‘€Ip æaOoÅ­ŠVÒ„Šƒ­v°)×µ5Y2BÂkÛ×çÖ_.)kŠðq.f¹]yà<Á/ȉoõ§;ÕÛš_ÑR‰ž;‚}«$e¼²4 T­Ï¯C0\_é) qE÷ð3†;ö[ŠÇ¬-‹"w\üe¿±<3¢É=W½(18RÀ‰ŒèÜó#zJÁ?}·‰aŽ&$½L½ hÖ!݃ܓ\›@ ІcIHR*ô³f[Ýëƒä eŠ›ÿqÍpsÇÇO¹î2uÉ™áƒ"¼KÇc‰ñVª1‚РS¯ß6`n{Ší3H­#–“AïP mPŠÌö¢yøñœÙU»%o½‡ŸiÝýÓGíÒ#™ E©÷”QŸ‹žÂÈ2Ú‡2‰TYDCíðD¨L§Ÿ„'§Y?t$±ÌÃz“,dö6÷X½Æ.©Ë¾8Žøi€–ͽ?lžŽ/ ‘?(þÀð¶Î|o %P?›P OºV–aKB"ÙA” Õð3vm¶%2j‚=qœ6\•Ê @)?àŒº‹®8±‡ 8T[£P÷ߨuZÿ\X4›£BÁžZnÁÝ©‡t¾ðO0¬U Mµ"-¯uȉ*Gw‡8ÅAöŒ[;¶=.êÊ<ây$ßö öQýæ»Þ“Kð^ &Op„Y´€Ò\à"#`UûÄÆ» ^ûáõÝœY“¢‘máÂzæ“Ã(>ÙÀÔ~Úm–Éž5¨™½ÖκnVÂKæJê©ÿ‚®U¸.µTW%‰PmÏdVÁÈß×dÒŒW0*á-KŒ ïRTO¯’ ìýí¨z/]Y ¬ W°½tAíéËEXú†'3üvÆat}òÕ‚Š…q©Ÿ‰‘á¬yQÝËßJ×¢PYrÊnÓ‰7 ˆùèÛ(ëÕNÙ„Þ¡pÊXÕóOM‡Ó( ÖA%¾šSÄóÊï q€—*Pü¿áü-7(KA¸.¤füö´Ö›w²z&ÚºÒ°õœú8€øï(aÕº7™fµ)Æ5Ô| tꀅvÜz§1¹þºˆ7‘xtù —r¨UàòÎ&¥øâ—¹ÚÑï—8—I²ÇÀ_óÓ…²y„` š™Â€°­!ÅÆæòΔu#E¿ú3x¸Y[…UËq‘ݱíhZ-n¢r‹—bßê› ¬±eú­šŒUëD'zÆÝò3[_S¦kA.åÜÌ4È2ñÍL³‰L©”0̤M\¯®&#¶ Á½»zÓzª3Gn8"iÖ7“‹Âõ…öÏÍGÔ‚ÃBI([)·ú|]|ñXÖmU¢ÏðÓC©Sã8 y9”à¤îº)'L=ŠT½4.&èºJä§.Ýz®ÀÈýç[ºe‡sÉ$¥ˆÑ1úÛdwõŽ¡²îZíØ›Ð‹1éŠñ>1‘1i½“¹Ú<¾"Š•Q‰9ø"'hlÚŠ…}0‘”¥¼æë,_bF@ ÛÌk»Võô·ýž ´S^YGbŒã1` ]9:RÓå ùÝÁ{y»@ã´¢œß&¡hD’g]o(-€…yöt2Šÿ9¯A ·^SsÌtKf‡…ÅÎ7)'9 ÅðAà s–¥õÙè+¢€°?Vnž áƒ6êef†‡ò3vp4‡m&)Ö&ÂQ|€«kåK_Ï…ô•"íÞÈò{h¼ý Áå@@¢ŠaV¨À„#´wÎ~ñŒà5™Aí6¶Ku%«F!–6;ÙôYìµÛGÏ?‚§/áHü©{VcÖØ‡*[¯)Ðð…ª‹ÆðÓ ŸX"ðè*†/ ©‘#žü¼+-¯»Ä~•6iWº #è,$&Å`Ú\F1ïU‡7m;t÷¼¶¢—Õ¥ÇN—Ç =ÑðÓË,ïžÌ—Šk±¹ŒäCÈ?†-Æ~x©‘“ß®ªð‡+Œ_üN·7diâëpñ_äÅiEU‚Åymýx‹¥eÄVr&6ÔþGÔ—“/Æùª²È]¶`A[RéÜgæ1ršÝ½»tðt‹ªÆÕ·(ÇPz¼º»é›‰7Ÿ6ö&gÒi¡=—âpb긋¹Á–¹2šµX梽æÁ¯n׌üAW|PoÐU'k—F_¤û‡¤Ê ŠàÜ£4·<›}P]–z*ïK1ïZ×Û—³o—@¿ª©«ø26¼kýtr$6Á“:Í“ŠçóεG¶*’º4Ù3÷äéÌ÷¦±’ 9ûß©¨gÜðûW{üåÕ9Ť3Šlmx¾»KûGSã+ôËæ@süÉÔ|÷¨z‡ð·¿ò†@• ýmUÉ'ªÀ™¢—‚Œ, Jâ—ýáQ„E~h0"f«Úõß@t(ŠI`D³‚RøÞ¬—ãŠq×âwJÓÓ„¾°I©ÛMœköËQnUqëÓh*òÇ'Ò(¤¿G§w°ô#[ ìÊÖ‰}euxv›!X±ÒŽÓþç¾cÛV§YÔgb[hþ i›ë2NŒ‰èÛ9OÒ¥fÇ!®¨[vè[W7Válòø~M‚ü@œ‡‚¡¸*FjðcˆVìÇlG7躒mÓ•7UijŸÿG5´ ù&hM“Ò®´Râ.—O¨ÀEzdUŽñ"[óBjâg~V ÛæS)_\öŽiKZîoh(Å,{ÓþSñ^ºÎŽ4ó›ùÕË9—# ñþ”G4"RçQv™Û6"޵¥Àî¬ý0²à üãG:óà?œHoQµ'öl!gõ¯ð‹C*Ô¥xr µ¯¸j_wÏâLÙ>Z@iùµ˜’*sÉÍ.Öy_úƒFÂlÏ2i;õí9&­\rÖf.Ÿu Ï/4çúi]šª®çAF-bÄDo§Û"]Û4öv'”»]DLšÛl3tÍIÏtd–Y”Êçí[/u|ªùsÝ$3‹¥˜®û'k„èb0Å©r ,a¿(èZž-ŒjšÂ^‘6ÁÖ­²äò#x«´ž)øœ.Ú&»tÒŸëà Ô\Qc—+ÏõS:¼òVªÚ°½GÈn#s|£4˜•!›Cÿlnâl–>U«‰ª>+¶¡3bvy*kñ,7J‰¼æÕÞe¯òѽ©‹‰‹qÞbÑ!Ù-g"FÛoj¤1•Ž ;ɾýÇCø2µIÜVg»¢Âä$ µl8¾ÃfA;ݣȎn Þ®»¹À#}ÄŒ‚ÅL.ìê4Ûo·ía=Ë>S±&XmŠú¸1ö%>FH™^}Òúq@Ý$=˜ýÓT•Cž_SSþ[í´ªs€&½²‘®¾1?ÏøÂ³ …,$—'êr®z×T¦úXJ`²+¡,ÈïSÇé A™C+ø Á#‘öÌ9®áÚX¾ì~ü_çÖ§l+]Y.P:Ê''ÄÞÙl,ZÉ,OE¾ˆZ†1{4„zoux¡_¹Zç”|©´§:‡O¼ÓAl>vèØ3¿0Efp‰%‹meî§ÈŽŽê`¤X+Ÿ'Pqy@$<Þ«áeP¯!ã™ãþƒ¶J|Ysœ•öò‚ðÁe·™Vý×ç„èƒ.·“¡ÅÁ€Ï“á8ƒˆ÷_Åö¦-êÊPƈf W³–“p-‡&ÑVRÆÝïS:«ÿeÛÛîÍ!EÂ,ùM@+)·q@Á븥RÒBÅà™ºß~n:ÉT¡7q$i«€#¼ÿ›7ÎÄ•4 ûu^ìßoàpÔ›hª¢©ÙH“N3B߬õ] Í)ÇóÍia³¤äŸ-f¤Ÿå¿ªî˼|¥>¥ïÈŲ́jµ 4)‹8(qßè{ÜžŸÛo‚fÓ=á寰1}§B×òYÉ“µvXŠN–·2K³EÏ,¹ÆE1,ÝA!›üÀIá‹Ê NÑ?%ô°3pQa/|ЩnÊ"§Vïxº>×èË2Έ—»ß1ï–ep€eÁ&¿£8§=I«ršSÚYv·˜MÆ•ÝÁ»æF$KJ_y]WnÑb÷.i€‰–<µcJÇe¯Åm{Ò¾$øu¶ÂÿïžÙÚw6¦v ¹ûìĦ}a¡g¿°.­ß  ³PeE§l«º-0ˆª®Ïˆã[uèDio†'5C%²Àè«¡*xƒfïÆ Á›³T=@Ñ«›:‡ŠÖ´$µ—eÓ7¯¡!<2€Lñѵj—‚ûáˆV¥ÃAÕõsÁ¦»ìù|}ma;ÎF¿‡6Ÿeb³Ë¾èÝñŽDí­Îò¸÷mIPßÈ38Cåõ£'Ž‘«n̵“|G½/Ø€®µ³)ÊðÑ8ý§:PßùgR¸ÚÑóûÍOo p/zÃI`?ñd£‘s2•í(E¦Gûᢕ„‚wzï"‚ƒèpR\rFfÞ9´¡f²‰pgƂа„þÌ^…í…Øs/¬„ƒhņ̃¸6Öwð4gbS^Ø#ŠRP²ÿ¼„òîŽÏƒ W›‡xêWlaAã^”f)3ÆOVÍœ‰˜ó;L…Í¥xÔ2NlZ¿àu¸Î.E¯S+;U´U±šéÅþ劖-Fµ:”ðKôà«þ½»*×%s¯îY›A.<¨BúNXè%ª¯8™ø!ó)ÅÑI'ÒOäÃãgòç¾ÜúÅ@‘_ø?ÚŒæJI¢sjî=¾5¨çýÈ1‚Áz"ýPÞÏ£¥sÎîшÐe¬Ø+–;Ù-KÃäû|›ÂsŠC?ÛñØhÕÚå5S"5]¦­H€¤8à‡6´joD5xO·&‡]{䘡þ%Hâ¡WMdÊòûŠ£™Î¦—p Ì-ˆŒ ƒ'ÆS¯…³„Ö]oؽ³Ö/óéF5ÔÎÂÎ9;[k}ˆÌ 0köÛD-kî×FáÆU¬6ߑɥzì÷.w¨08X¯ÒU}%ìÃV3q¸n¨*T Ðѵé½' ±­·5¦ §kÉs÷@þrô¾ßºØî;ÝRÝ/3N† ÕI%Ží?¸x2qç6Õg^2³´G‹Ñ©L˜Ö˜tøxªûxpûE²èí’Ÿ¿ZY°?[I­¯/Õ0{‹v%Œeíf€e`Ó¸úpsò:ãÍýÿx]D40£ àjÐè¼MÞ¢¤Üë ¨2ÒuÙøªü¡¼}®˜ùÉÝ[Â[Ħ2f ~Ì­ü7ºWðáüdÐC`27Û]Oä¢õ"fÀËbç ~rW9H ¶y­PCq9&ÉNÐï÷êÝCžÐé²êµÛ¸ÿËy°Ý¸÷' iïØiTÑ ß*g]£#Fhl¬ø•*ä<—ŒdØXµUW<{CDë04àLÄÁ^ –Áí'm™;&Í™!}¦Q?y†¾úPRs¿ ÇMËV.ñ¡ÓžNC0à&s™+$»Ýk_ µ½Ék¼Å^¸¶n0uê+E‹b~RkUÆ2»›LghÉ*ïõ…ïa¸ñ*v:­geN€5ý àð‘F[r9AðárdªF¢04õqð ÎÙ±eÕzZ$> •3yL¬ûÿ%ðÂ,ãZ¡¡3h„*)ø3ÉŒoƒ1™+×Ыºä@! GVõüÊâ´{žªçÙBŽfþ&âM¬8¢9âh€|¥Æ?tÅŸ¶tä`S"«q÷+^&ÓhðÃ.–%yTìÏÔò|¬S¼§PÒUdr~¡›üô†Ähź¤Å ‰[RÌ6¡­®Bö{ÕÝCõ#ó&‚Ø{Ó>8 e­Å¤è3Æ õ˹}ÅY´¸ÖïcÝ”iЋ?o_ü& ÊE˜¸Ë°[OÎæ9âiƒ¡AELã`Êä}eÖ“a…ƒHò.iÆÙKþÞ²'¯m4<2IJS`°¬â)½Ùôª+eµ`ò5)QOŒûâë­”‡BFÌ{­„_€  G'M·¼¥qóq=`5=ú8Våö ÷A&å$v]&VÐ÷ò[®åé’OoüûÎCD™¼ñ'Ïâ–ô4œ&£ ^¼nü¢H=!Ÿ(¹Ýqü›ôNwt`tB…­[ «É“~­Zaum/€þ‡/³R»µR>÷u*í6XûK ÃÙK:7wÁ|DÕº¿£ù*àA_÷f„à{õlcøÔ_t0¾cXøkjE¥‚‰iõòÉ($¾‹Uñ)¾iq×—µÒ»‹ëÉyµN0•\¦1*nÉ£FÑÍ›&EÞcj/…|†8­ æJ«ªWSL_È™=à Aÿæu ÍyvûR âNøßa<q¸ \Pr%Ú Ó|ÖPUÜ¢ðì]þ§­´û±`íV±jkÄ=¢hëBeÅö^ø¾±·ÇCƒ¦ñUæE|:ˆn{”?J]’ã^gb–Mˆä—M3F<¥ö‰–‡m¢® ñ9zÒÂgiá¹°Ïî i”ôÿÔ=NÛ^÷î V>–D§šr¸ÿw4íå¸Ûˆ°N ó+«N&µ43 ‹‡u0[Ôb¯?‡ïô›ˆË˜šÊ@ýÉ£†i©C8ò•WP@ÎÌ-‡s ØmƒÿTäBfs¯Ìñ–yÎä®/׿æ5yZ.è–°e1ht-ƒaÕ_ÚÁu9J¿Þš-ÝhL³Âß+“™¶êýü5Yh–wM"ÊåjÙç2î0 Æ”kKŽ<‡aÄ–Z‚Ù¡1ºÄíÉá‰ì¢üÍy¤Íæ±D*æ_»«è[.^ƒ ¬b2P¹-Óª DɧìüàE?³nºDˆNÞ©Ï7hFADìÚoØ7_ÞKe,ŒòË쵓ô*"ï«©“졉ãx¾F3¿fNh]<Ž]7/\©¯>¦›€þûX×YOXÝž$Ód’ø‚¤ßòË®U:¨+NW‚ùÂWÈÑ/ø^&ÃGíCQð…TÜ…¹Ï ÁnÖyVª_ku¸Vå¡MЊœ‘êî¶ëGÄæ+U=ùñ{´ZdÐ…ƒ_æjù_ïÂmïš©áé¶ 6 ³Xì,.~œ¸3tI’PmâOBˆ† Ñ…Þ¯#‘úÑ 8Ùhº­œ5õ`§ õ`>Ì‹÷º`’Ë"b]äkìTÖ„65È4|øžÈ_^¦o:ô±× Ç›ßt#(hb“xëyš*m¼=îÙA¨wÑüœîr½W½i Žs—yDp˜_[cüF×èGÖ’7ªãи3î¯Y÷Cß])¦”Œ|É8®Ôh·;ϱ‹¾•q̦á×aVÞL©}”ûó» ”NmÌßíùcBÔ^ S9ͪšªYVÏüæ?±ö^ÿÄLùeå*â¿Âä^#„ÃàÚã@¬Q‚¶)?6]ÌX[%U­ðÂrôžZÞy–!ŠS‘Yíü±eZ¼éFßÁýG§L#5lðx£"LdG´±ÆÂŠ:„yÈL”£¾ÔäPf«s†ößÇUB±{:s0!å•álËšGT`’´ä%öéõ“UЦ›Æ~‰TÏÞ1"43éÕ±K`[âËàŠØÝ®?FÜ€í¯ \èïmAÁð ĶƒNX(ˆPöëÆè‚ƒ@ó‘é}æ`éy-Õ*éyïѾ?•—x¾A€),UMmƒ3Ë#s¯Or¥±Ûmöª û$J*€>a6ü‚šV{e ÷i5o΄ÑõLØ6õ»´þ¥rèpw –œ¥ƒDÄ}|‘ØOÃèts„IuÓÅ•ºØÆ=ÎO˜e3Kwy|XxÒyÖMy£VÃöFá†{Ô§˜êÑ×¢],‡— ƒk}ì”ì¨Í±aj(ÜY]‰ÊצJâÒÇ+ÈËî›±TÚò¯L˜âÐåìõ¶)Æ;äãl^; K+²Hx£ M_"ãFºí&ÖaûûÏváÎOzCõwÍ|ä)B6ëÛ:X¨e*Ó×çŒ+?ú"eÍc`fûÝ8ñïjaªÄ½FÆÉG7ùüÚ­âÉ@õC4áü™È¹=Eë4)½U&O£;râÐìÌÃÑåU•{úÖƒ©½îâWìó—·-NºÌÑŽˆ bo†‰É¯5ð 8 ›™ëshˆP„&§c<+õ_þ‚ÅýD \PžæA‡MžöÅãéK¯ Ê{× m—‹Ã² Æ'ow|Iþ$"å·*W TÜ0û!ˆ’Œ$ª &í¾}ÃZð Ùž”‚5É!¯lÙüš4ÄHAÄéKåQ¥N0ÈtwJy®óý~ÐuÉ'¸ß ›r¤æGPô[id!õüÊ.ŸSå9 UöÅCÊÎ;ïHBzUÈ÷-°‡mbÁfÅ'¶èH€Šeâ8˜È„WÔüˆ&ÆÔüv’þW"µYa%~VR« ¿}õQ° þ§Qä»7ÌØ–±lÎÁoîÞ†MŽ™n8?d¿œs«A}Yké?õÝShV@sN´wS?^ï2a<öJyzÄñ‰ª¬É,ÊõU{R±öL6îB)a­ÓþfnraÖ%îi¸ýýÃ3žnm]æÆÐ,²`Ç­Ü|ݬ‡s ò?¼9+ü’Ö¥:‘ÚGØ3ZÒfr…²Ùî>CÎ gu ª±¨st8­—W©ƒ¸ÚNªw±7‚©ZTM@Êõ*Ú|,½ˆg@S¨)fÍm©žá!­÷/êvRŽ;!ãé º_­ |ï¬ÓîOk«?Íþf1Îzu¡/¦é´±}MŒ·¬(~ŸrÍ”€sx ‰;¾Ô°ˆŸdÜ‹³Û—\Éq×uÔžD­Ë…SŠýWGšfGï{€ù·ƒ]8ÌÆ˜ü[‡Ö gg#źšˆùÉ^N¼½ÊØ¥Ç@ öÕ†cÕÛÚV%¶:³Fÿi‰­ˆåâŠï§«ÿ9àÛ4s£AK%“’ÞÃuãË­*.ï·l“Ë凓Œ£`J™Mt ÃA^°—¦* *»¦0UìIh­ÍÞiÎ_Xôr+‘šà>šæÈÆý;s¯R ¶ª#²ßÏÊ^råøÿÞæ§‘ìœeÃë:\÷ë‚;:.Àvyà·³…w~³Á#¤çx1³ÅéÂ~Û0?±kÀ»#:à_;Àô aµD"vm/Ö÷‰þ—|­ÞgøœSYSG²øHƒæÌ¦—랦ÑßèÐÒ”µ›øæ© U¬Ä£bÖ²¯oµ¸"w-‹€/ïQÇëL::4L)Áñ^8›ò¼ý£‚ù “ö¡»þíõŸ©gû5º¬(Àû“Mƒ¸wB²*‘·°”bUµA±àq7/]Äyñµ”&•+ˆs‘ÆÔc Zäõö›¾h2®ŠÐüƒeû“Z“VÎr¥õÖ ²+²H„³/ä„ËrEB뢯?×·]Áa‚¸3®…%;Ô5¥²•¸Lúïe¨¶'ŠêMAÈVØôÌ›§§´ DÛþo[a|v¯(?ï@}ëÒ¤ÑÚœÊxH÷˜Þ­¥#À(+·M ïŠç÷`¸ŽEÛiñLPÛDZc6êâÇ÷0@îÔæ*DgÁ ]V¬üŽÔ—Q7ˆË—W ÷ ž{­+<¹ oà=¶Á­7bÂä«uøÚ1\h¹Ý÷ýª×µ‡ùp$Ë¡ÿ½êÔ(˜ï®Œ×U]‡çEÍŽ—é–³³>vаX¨<É–l²»^r=æèÛy4 I$WÝKJ­›2®ðeËÆþnÂÁ¶d×áu>pq‰½ž„<³o"j(›¨'üQ—1*ä×JÙ`ÙÕt˜ìúÂ|fIU&™æ•hÇu20í.È_ƒ‚À§\ÂÀŸ,¸_ÃÄÂWJN×·:èàfF¢7! ¥ñ{¦uò—§;íÌy í`¼ªóÁF[1*cs°eèÒ=1ÃÐ7±µ¡OÃü>µþÜW &+zÔ”‹Þ9€‹[—¿¯Öb‹ÖW3ÔÑú¶~TÎ_Àšü«Õάí¼0 ×9æÎHý„qGÚX‰‰ÕòF»ºlúŸøÉ…‚8bþå™u¯Pë1µ_i…ºk·Ïú¤¥øršÁ?í(¬Ç7'߯ô”Á|¬R9‰„FÚ…©DZúìæ„.Ê&ý¼:bÔ6úejóñÑz8ûŠYMÀÇð¤Ä2MœÃe³O›¾Ñ‰¸Ê#zŠñë´Ê‚» SvLº?§Õ@A.pl`æ¬)h2©…u7òXZ)Ýf]óqê\‘hXˆÍ¯àChÂoËLˆÚ7‹Ldæ‡q wXlÏñmœ#KŽ)_…À6áÀ7ÏCEÛ:p¿ÂYá‡~@Õ‰­mõéÊý—/ÿ×*Æ’zÆäv±ÑæÃ{.¡ìTCéË=…!»®j½Ö=¥TÁ²b©Mp%PëT|¨¥õBº9hSøýHkÙMÔ}C×X¥þ‹‡%Ž~xñrO¶¥èœ€¤”PN­J”øÝ­ïÊxç>Tµòƒ.þØ/v}à³ëÈv!ͲÚšt"O)4œŸûš)Þ ê²¡‘`Âk—í½îvXªb ò üÑqp$ÑŽoHŸIªïÏÂFR³ #ʤC½•3íS¿ºÅe|Õ êzÛÃ]À9„Œ°PdÜð+‹÷þ«· æ‚ðk}ï/ÚÅCÚSg?lBtNûXO7’Ò¸-Î ¦B«@TïKᖦ∾s÷É2»\¾X€½9Ä©* [òWÐwM¶º˜µ‘!—{ZQ~ýx+ÙHR{Ìš¸z©&!¸8PŽRÿ¬‘~ÜïÛ`‡oQº´î?æØ}fi­—ŠºZnyT³¿ü[$X¼^ëå>ˆÖêª~ÇÄfƉ#ÃcBóuLsV—±èJcLSæíS çTáúÓ·óeÔæÞåcLápت£æߎ÷»_ëžÚ"[|GØI.v8€)¥·)1ô/›NÔ"«nÌ?½Ž²kíÜŽ«ö0—»ª½l#á³/Þ½5»@x ~r‘]dLìÈ×ZÐæWðòªCb¶%`­—ÿKuQ²8&]}[þA'ιUU•¶Æ†Ð ÛnÝñ+í¹¾Ì2ùœ}G;­.©'qîO„Ö¼RüxëÂbf’‡SIäS.×뀎ójäãPDZ3„ëãÓœ4-BcþÂFªäÿçW˜“ÀÉcÄÜüŸŒ&ªÈìv0MIN†E˜æÕ G”Âr“+Ùû]r&…/ÙK@ški·VÕæŽä÷¥èyWFÇM¡¼çàôïd9à›J†•Qt¾ÛHƒŠ@6?¥?q[x¤ÑÅ1tô_„ØX7ü>î1œûõ³OËÀ¡Ñ/ÎQïÕ’Zìa¥J)ì©FÀ›„Yÿl†Œ,[Ô+ï€/ÃS2K¡©´¬1ûkæ¹§“iRiÈØ€‡þÀñŠHÔ:ß2ð.UNDanÂYʼn×Ã/a•k¬À›8íPRUˆ,KÐÙ²1†.Ú®=œÊšU ÿ¶3c\WL²N“”× _"¾pÕÙÛ‘7>&´ÑªÓV'z:Á45§û*‡r¾Êxµîó{b†&9¬‡¡.Ë7Ïy¿ôƒomkWk8`šóâA•æÃ3‘Ÿ+K¡{A`kÝaî,ù\úìCÈ»Ø6Lv¨ßx· ÿ ÂEY*új%L…,‰ÑF›Lgiâõ¬t›ÞJtqçRó³E®õ Z1¨"<ÅBù; A0ÁŽõŸu“gxRüò šëŽb¹½†Èá×›© o™êõ¦Ê±µ¸N!êK]('ƒxüK_]€F0ÞÄìíÃÐn¬ùœPÝ(&G¤³žÏŒüqœªLÇP½#U‘. ò—ðÕ&Îz| ‡5h‚‡Cöù«-5â,éJDüÁ%Y'¯Ò¼yÄÄf6xl|³yçHÿlõ& Eyfq¹"§ì¾Ürµp”êØ™‘õµÅêtÄò|ÞÔØNÑUDéãìžg:³)Ljðvä‘f" ±äƒgž)Å>¯}ßxÔú溄ìr˜b¤‹?@¹*Uò¦žE=$ —‰õߨI`?¼ä¹êÜ*Ë—Ú¢î™5®iE¸"½½|zP —èSïDÉŽ±\ØŠ×4fªS‡?{+óæxËÛÓ {èee F¬…?J´ÛT€]Ö^.}Údîߢ‹ ÎÍó'ëWðƒkïQr,—ê‚´ BhìºÖ…ŸSÀUPC”›0iîw¨¢Lnµ÷ aµŸ$û/áM4+M`û7]ÿO×p+ N®)‘®‰I@¸¡$Jïj²o¨ªõ—ú,gr?C„‰,…I{?nÖŸéÊ+Å<™FõM)Rbßœ0Û©j@’ûÞNˆ-<:ôÛÍã ½þ¦iñ‚+ÍÉR­wm¸ß.Ç4Õâw~º2üj†qÃŽ½Ê½ÍæYL$6S¹¼)9otËS šÈ‰Ö ¢rA<—œSMÎBÇ«‚›Ûox a ¼ÂMÂ2g‹çþ;ØŸ"^/z|_4M¬Ôó‰Ð%VDËú&~_}—!ÄÞ|Rÿ¿ÅY†ø Œ«±Äv9–zæ:¦uC}\×îÿÁÕ0©&ë- u`x˜õÖŸ}°hIÉð+Þ«„gàѹaDKµsõ ÐîF;zþ»!dö¥Ô qq¿²|¯ª‚öPà$-†ÑÙ&©’U‹Ü¦„˜n)¶*¬ñEóotK>Ï:¡jCΚN–û9®êjÁv(ÓÛ±}ñB X§—ÔR‡Ïœ(BP3Ë'±è-Š©í² í„D×âø\ÄZáõ+Þ-näÅNnvYJF;m1E± ­C>½mÓ¯î+“W²ÿ/ª[¶þ’°3üNWNhe´¿†´rîÄ‹ºcÝt4È?öP~CeïµèòbùfÇ«Ï^íoˉK^³LŒÅy6¼å¤h‘f‡^­ ºèb•#¹¡mo¶gÏ×;×Àcˆ Î;ôš;µz ê³Q?­’ëœN›‡ „ õ˜úfá˜ub†?6£Ž37l,ü›ì7>¤e™îª™0ç?õ¼¥ƒ¬¥0>:Ç9§“¯x_iek}«ÿTTW7í4' ¬`W–:-‡"×ÜŽ7ôëtؘöDù|?šyuÜï¼(eP»ŠA/ €aŸYüP} }NG®ÊEx¤GÝJN0dºF÷P À!„›<ÛÐÑŠ¦0â³ íÉž¸mªû§¸N‹¤¹ÿ"Õ£ä\…>¨ ÷¸vyï :µ9À{)[\‡hˆ]p¸Ïàß™¿WGxÅýµ7ûú”r¼ÉW¢ØŠŸþ@ó°à¼Y—ÎæQËæIR´¥ûýE{l×Öˆ!B8Ìò˜Ž<že¸‰irf#&Sn[Ûf¾Ì—Üžó Àª†”çd’F‘yÛè‰ê·6ðd¿Ä,ƒ]T<««PŒCHïxLZûúgלRxÏþ¯dò0ô™¸SÄݲšìDê¤ÀØw3qx€ä¿^U€÷X5¼Ž›ð˜¹Å… ¹îUdz|Ï“¼˜¢ b4öi[J–'k/ü^9Öè2„D²cV!Cóg`-¸ãÐLJ—§­j+ɇbuø@~ã Ô!ùK§LׇY㫜/“¿œ"â0ýWߤ˜Ò¢²_Ñy©q@2Ï5ù9 ãû ©gšÎ#@¹e²Øb¶¡œPìYX°<Ôôƒ~õ¬QW ÓU®Š>y ïºaBó£—©v0m‚¦w°vù–÷ƒ-©°½h:óîÖ€`5. Ö­ -,'72þjrF :á*çîî/yöß²ð®Ã#C>˜R‘?òq <ÚæftöDq²¹‹`;îDnÚ•’è ºoÙ‚f ä(ã°Á¾Ò¼!Gâg“x/º°aRˆþwêOºÌ(˜^;òB}ÜÓ`Àø¶èVô‰ñ¡#Ëâ\lß«ˆÝ:%ºyļ‘*¡ôÙþ°óìqi±—ŸùEèØÁð=‚há¬Ö%¤òæ+AÅ®!ƒÞ-Å;ú×;ò/Ù™@eÕÖ×ÛþkÚ!è›ìŽýŖŸq;ÌŸ=“ÊFãiŠ»X Ý`Ê´#åhYnÐCtêשÿªÃnX±$;à­vãP{1(ñâc7Üm+BZÂ3*Ó¥y`’7WÞ=qŽÉÞ"†Ã€‡ i)/+»nlÄj çèÏcÝûtvæó¯Âøß‘E—¦º0Ó?Z…N–  nE¾V þç˜R>õeÀÏÉk$Êj„Z|ÙydZÒºNñ.[ýd…ÐN™Y@À¬LkÒâcâX+^Š~Ò¤]íµáeL7z"5‚É©ûhà‘Û¹à¡,äÜ0ªÁˆ†+vý—í2 Ñ5`KDtlwØ“·Å¼HÚ#s™kÀ@—¸¤ßTqa]Ë$¿Z™:a~0‚“ª ÙÊüd3ú%e Çi–×…g#Ð!¨°Ú¶ª–¦Ÿ)¯}hcÐ"Øh4¥;Þ \ø“bJÐ>JÐÿ2v _¶Ü ëáv4…„äz§úkäU0Uaúk 1_݃¹[õ¨"ç'½†2ºü5¥]ª:7ö½l|·6CÔGÈÁdZ‡ÖÑAöÞÈ+eõ¢N¾AÊø2¼i%Ò!gA¼®83EVâU§LÀ=G§í'µ®ížY‘æ†mØú\,^ÞÁ3êò0rúHAXè5*â"9Ù\Øo©XÂÓež£}a| ´=Ý‹òòWÍâñÉ€-!'.T‰ï7é7·Nn“½¶oʦ†¤Cëeœ0ÖÊMHz,‰h–­êi‚„C¿õ ÛÐã©ëLdiÚmºzénê…z_V#+ɳӽ¬ŒÏ­CáàîDx2@õá¸Ì½Âÿ±nºTaB.˜¯»FsT5F¡M›o”É­ß´T«’á@IŠ'¥Î4”ž^Ðö§¨s^_¬à!$%i&ÓjáÉ7æ¬-¦âã³sb9mõ¿ß)kl9I„­w(ˆ¼>Šö¢Œ)ÖYÛ{ ÙœÅSžš\eê[¼W <*ÇÅ°ïøØi8=·dmÎËø¶{ ‚Årw¥ëš¨eó^ºÚ–øßºô„çÊêð!MÌ0ЦIè „‡KŸ¸ÇŸ)£%Ñ0ÀC„W8‹—”Éǽ»ya¯˜N£.*ö±ºÏ©þF`‚ ]°G;Úä2’íkc¥­¦ôœIr%·CÇD}ðgÖÏÄI’=e; Ç14ç¹ÐëIÛ¥ÌËö«Lô´c`´r¾m«]ðlrB3[¯š/¨žÔuõù2œü<,ëœ{<Ï÷¯îç¾ Î¸Êò„ÑØJ¿é_ê͘dHPÑ©›2ÝïjœS€}¥¶›*â@4ÀiÍ«R÷á•î4fä(Ûž‹OQ {êèiX~±“Ý÷¦îþržPVá‚òê~¥ÕyCa¬#ÙlÆ&)C²Ÿ\| q¿œÄöcŒW¹1½;ë!­@½MúŸŠÀˆòdëj2‡m 9Ò(oÓ<QŒ­Ã+šÉÄ—¨´¯äU†Ën‡ © à(¸ι:¥»‘°é•¨½:œy׃ú…áA£,ÙwÿƒØ±%h­5)½²S3÷}sÿˆF|9è"éR¯“plØìØ©ðgù÷:¤?z í¶ä$…Ä„vö}Ðí¢Êê­µçð!×1­Ü+Åõ°‹<êú;Q.~Jþh„ˆ™îˆÄxL¡>¥¬3Ú*à:]³(Y( °]q”Œ½¤_]Iš}”7 :²*¨T`AfN°4f¸–‚©À픸`š^™qýýÏhKX©Ü{;XÜ…^9óhª•ȆF'9x&¯Â¿ü®ŸÇé¬ÉõÀ¿NÞæÌ@ØÛº&j3<“г¹QõLãM»&Uÿ9€ì¡„ Vèp*¹$DëÛéi˜ˆANq*ÏvëE]“Å´°hBàø¡§¹~ý ˜ä[ÌšãY¬4`ýfílŸØ‰ha:½Ñö§Až.Ñs~•š…ùÅ/ò8 š­âõ‡VMH ÅWêÕdwFPèƒl"z¹.¦óùò`œbž·ˆ‡ŽE¶ƒ)iáÄcSàêÛüAp-ì#R xµ•îgo¬xiòtÁ¤¯wUâñC@ë'ÝN—^…箯N†€íˆFC¥ì¥HÙGÐCƒÉ7$”ÎéÐpä:ÖQUÅ"¸çNÈ!ƒOœšLŸñJŠÒæü«J, ‚#x¡±B§ ‹&oó\•$„ÞhùÏ› ¡HÔ¨íÈb/@viÔ+3¨ÉÝÁ‘ˆ¦ÕÄ;1~ø_ŸÕþÉå̓ôpÀÿž¼bã§šD^ƒS)x(¦Ò©ÛD-z|ý®ü7#n ?IJôî­bðk}¯9SøFµ/Y LxÍt¥nê1wá‹éV®yøˆ±Ìl õÈ%,pž º"OºµÓ»<˜¶ 9óz£ÑI¾äÁÉ)Cë±3z)ho.Ä÷ 7p>sm‘Y³pÙX—ÁêÁE¸³¢Â~ðÕ·(¡‹ÇqmYˆ 0ì7CJ˜žw\»Ô³ß€{è0u­sëc5Ç.(‹_?‡YacG$E¸Ú<ïK«}kÎí€Aî9x>`R±ãMf|¼ÜÔ瘣N ·ÿ›ßGß`M@}g!Üd4¬Á-XNê=m,™maÁ4gï÷üȶ6yÿo>ÐZK‰ŒÙa(]¦p÷¹lgÄîÓj6¦LâFƒ¼¹"±5ÛŸè0 PO'ÌäŸï›º÷ ¹´û*n×Å¥f6ò…ט¤hF±F'ßòÕ ]6|',&{BFQÌò!Æc»Ê`R[[î`ì8ù'„:õo9<6sÈ:XÚˆ¸ &!;;HHðÉkϼ~£D©³û3bF”o²²H«4‘Q8›`ˆgàcZWËmN–ÆñœtSÌ’Ðsªuˆ°GÆ@&é±Ã¶X8 â}}̈¿? IÍýþ¤´ooŒ6súLT?ê²Ï±„ÇlÄGûVžxå¹l­ÀÿœhëcuÓÑe¹òfÀt[[1C¥‰¬ãOš=R:þ:¶»-cVu»Ñ ™2Uís 4HÝ„}Ö#ÎÖ%Gl›€WÇh|tjÑÈSVÿ”ïršìµ™ÇÖØl÷ÏÊP×H'ÔÄ#Â&È.Îý±l¢ïðx~ÉsUš€*Àü æÁ\Ë"¸/Z9~÷+V¡½£2(Âp[ÕÛj@¸µ|"ჃŸô álž¶s¸è°ÕTr‚S|Ú`ßÏK_I³ Áfm2â³_mY%.Ù§çÃXž‚íÖb¨– ë«ìeÉü=ÌŒ¸]‹O®KjBe=uslºáX¶¶3ÔMFtñGê²êC¸“Q9oñÏ#ÿju>³­”‹¢è.ÄuÓ‡ŽÑú• åbÈî{Lä“‘¬ìÈІK•ªuˬ€;"û™0xLÐÇ$ÇLGÿýúŽ” õ1yYá6ðñ}òÊuH€°¦Ÿä} 9.y£BÅô(qñ)’ñá1úG¸$»>þ˜è¡íæÆƒ¿6аÈO¹â<]Ѩ Õ$ë›×OÃéâŠ$f‡íøoN߬ï˜@ìe½üÁio>ÚÙKíÜ~=8ÈôE·ÈnøG/ @”´k¡fÏf WaîèÉ6Òµähn…fܬÑóí"IäþÝÌÅÔwŠð«ãÔm/…Ëèàƒ3Èf–Ä ’Ó-üÒLRÂNTÃDðÛ t€.ý×>Ë„¥¬ÞÕË~ϰ‘ÞÇV Ò •aµ'(kµ…˜tÕ¡!»]â“ÊÀP¶Óy«F¢#C·*Xdfp³SѸ EéÚDÅi¤–[O÷óúѫ̷V¿TtpW¹î—Í8!§ët^ñ·ŠYhúîVžÄ_ì–òsŸI­8b ¸ŒÇ-@§À"±té{·Þ%JŒ—yKƒºü_‹™Òƒ(W¥c9¸:_U˱~ÜZ`½EâD xÙñ \…Ô‚ñßDðŸ?[ƒ†;JÜéÿ£ëè„*tjHe>GÙÙ&âÖTÃkQ7±ØÂü³‡LÕ]²—X`™irM0}•ôžŽ¯1£4õ¿¥@þIþ ØÑÔ— ¨¨MDã¤6ÔìÁ45‚Ÿ ‹€Yä@mëæy‚úµxßI¬mÑd¼]ij¤\ U~z(_ éåÿR¦ƒˆRBD(÷òVI·E8Þ*•(†—]¸=ZoaÇõ íJ)žSd«ãáV"§&5ßë=ÌÉ<»}°ÛÈ‹{~÷Ä@ªÅ`Gm ŽGÅŽ`”ÀŠÒÄûWæå}û½šôàþt›¼Q …Å|®ÖÍ'f¬UÖdÑá/ú›® —Ì_¸àPç­*®$€ð³=úÛ2I’µ´ñmS¨«wN[Ìá_1é{e‘˜0=®±ê‡²–´3Oç~Æ£_BRž}Ú;Lm}nÏ–™>¹Ñ+³…: wQgU •4`Â-ïjëz`dF»mâ˜3¢×<Šiâ—­@ôˆ5Çehž_ž5öªêîQ!·‰^ò€\Ѹ¸ °¥QÞÏxßãDç-ŠæÿÑçl±‰¹@óÊf¤E€+ÞÉÍgÊ;ôÝdþÆßØÅ?nãc@õD,ÒOÙ?÷¯Ûõ—LD­bN€­ä$õëúC÷湯¥TX«zu+Bµjj]&Œ½'¥0CùFÑ/˜©³~¶_Êß/‚jÈØ›=f®­º;»o°)´:#%`SÀ†h•˱ÅݼE1å)õ/ÝEØí;ngqÑ„£Vxóø­+B¹Ð‚ËÇ _þqЕ)£|0Œøü£#‚ö¨mæ¼ýêÉ$*ì2X5)ø|q®©UÏÞš‰,`J ãÿ5{˜=éŠPa †.:u›[Šã‰P I‹¹-ƒàWÜV*‘kÆ£H“¢žë˜ËN„§.®ð¸*”ùª'ìÒ‹…ÇeLj”¬Ó»öj?{yF"…ôóºËÆ€ÝJ·¼a‚$ÇiU"ù«ë9T;«ÑƒãŠÌ2°åjĤ––ó¾Ë•3¤ú°yþ2µïý1KöPn™'Ð6‹Dri(+!O"Ýyec;ð±ÄÃBc/5|(9 òï×[A ‘Qü ìÉNÜ¡­„¾b•^H!K 6 .ƒÌ¦ƒfE¬sËŽKRá¨V À˜° é¼´aó4øJÑŒ¿²¤ç"¶÷.0ä&ÁåûÍ_d0sÁ뎄³©­í= %†ÉA‰>œX‹MÙ¯,#µ™‘ßi³p•€$•4‰{ݞВI©ñ“Utùvá!ø¡’â Œï§#J>8Ñ>¯ÿ+!I}‚F­;±7jü—xuˆ;*I‡×`þWwX*Ó*6P!Ù&…í48-p­±S;Û>G«ð?‹ c%•_ý5V‚fÄÃÇ$‘ØNgŽÀ žVôI£b²t¬h…ËPÖÓ¡dÐâò¨ý3FÔczä+÷½R%<~A18J:YäâŠ*2ÜÑÍAâÞ¯N{î ¾O«Qí’‹;Q¼›¿ºo·¨×°½EH€eZrØ&–õðú¾xˉ;GGëÛìe´J½”eÀ™¦œæ¸U7Üóm º_½Z|sîÇ*Ö@ÎÄ$ÓoPÔ’úA“%[ËF=<à¶>ŒxøbË0ÕA`çÐåhï%°6M“.ÍX¥×gÔMBÄ0¦WžŠn8Á¨}E ï1G43èi©}z­ïHäùÓñ[¶¦ËæZõ`Ò¾¶-^ã2˜Î«’ñ@y÷E¿zmÖÀjѦÿò$ª)±n•fÛ^Þ B)½,‡)q qLH¤ég¥9q‡­<À‘>Y†÷BR¸[¤ºhé…Zqüûx¯ëܤ…ÎK!iÏí³Lû±J%‘Aäúî}ÍfÝzrÉúè¯Òw#pC¸‡™6× .•³®•‘í’"Ü «!ÙAlg È'-¶°C *é‚YIü¨·FR"ܱÅRuÕ_ý¤çÛVªãI›ËêzÈÂL3 å9Ÿ ´xÜL«Q ­pÓ“-r‹/µÝ,H¼~‘Ë>Q“Ä£wÕÉÚ¼GF¶±I&vžnÑNd´'Õ^ñ‘ÂÊ{áßTZõ5Olÿ…·à¼&núвWKîqNÀ”I¸ÁúULvIu`ÄH•üJcFD+õ™ïQ¹¢™Iiô”¢¾H_¢v#nSC¨ø~èÙ¨JÊK2ÁÀy³ oÝì0 j"zŠRý;ö¡Ö; ·š•ýâl"Kb€k®¨Š1™”—ï±ÝÊ*r]w"LøößñPÏ"m{] @ ­Ä¹çƤ0®pÝõ³Ä;`­%uÜ@FÍNc > ‹}ùuÛ#È÷‡¨L‰¬Ò»Á¼ú¸” a1)§áGJ¥ì£HÅ™ULc ¤8 ž|Èèz+rm”„®^w™ÓÅYZƒ„F‘ðªî–ñªÕÓ¢?—$@nž4¦»HX´|*ƒ N¡œ`ÅžŽ ’fõú‰ïÈF%¼]Fv%@Q‹xˆÖÉÿÈý1™Ðµeîz‰h’‘ ?Ç׿Š!sjqu¤œ@»ûŒiB€˜Ñœé¸ ü{ëÒº·ŠÞO†ôËr-N¤ìÓÝî¹O©jÛ³UvR!#«è._c^…¤[µÂ«)}Š^DµÍ¹* 1lŽÛCÁ­JGÎÂ%&?.¢àƒ½JKoa;ʦ œaª¸xüdø§;Gõ-B†å@‡5š—ÈNáÜÒÊ+'áÛg³ JVs BþÓÓ;~rQØrwŽÞöEN ä¼ò¤U?…oå@´´÷£!cÎ"¡߆ޠoXB,hÁµ²p'Cb{ÉWa+ßK?àI™Þ)JúFõ&õÿÈa¸ ?¡ŒœÃ*Á©gˆn`d®Óˆ±›–ŽˆH|ïËúµoõcÙ@)ïË€l&4ŽáåêÅh$Į̈¢Ãõ_þ…N·™Û¯b…P%ú‡7Mé2‚WAhˆ{¿k››i¢Ì­JMpŽªdA)3AXéóÙÙÄ”¸ÿ"ƒ·¸ã³Pc¸$j>ŒR¢Äh‰ÛžIÒK'<Öÿ!¶[.EX´ö[VùcZèXŸç®m›˜dmD¶•4)ôlâ€îÞÞÄ‹—Ԯ󩯢xƒôù¶žçíþD$ú+LàÑFø9!õ½8™J,#7DŽhšhà>¶Aì:&YÐCWë ²¢"¨œ”öÒÝ3iArRÎï õý!n³"8¨D\Gþ^ßiN°Í*%f4ÕŒ7ÞhÓÓŸ.MÅßÍû>½¾Àd-~é étÙО‰UÍNw\1(" FV)=ùý½l¯ûôáƒ@ùÿK«¼8ážóð‚N.H‚¥ ËÈ ÞÞ-·Tmgl°t/$ n5†[$«Ž¬ÿØ<'$<¸¼Ü`;¥JÐë3îX½ -„•L5NŸI°B:õý[ÎÈ{5‹^Æ<;õq‡ß‘â®V‘Љ;hˆÎ#, o¥õ•p(`×Í›ûDö¥ ^£–;¥O íEöHF¦ò%x HóÅ ÷m*+5ô ÀÅO©›©/ØËã„°øbÒ1:á@¾,gÞ¤|uݨ½…£(%¬Š4¾±À§ ‘;NÈ'²'#s®Û5sºŒt‘ë8ÛžM]ÕÒ‡ÑÌ36Ù‰¸‹A77øOfZ÷CÎy†Ó.%`¨5í;ß¹1&F÷`€â~À³PâÞI½ï=7Â¥ÀÃÁ€nBéÚ®ÿ@¨Z„ñv9ñ®”==¨œ%Ý$ëøs‹&Ìßr©Ÿùè áZ‡õc8!Œ‘#Eëi˜RFžvÕÑKÓýSEn¸¡Ø1îC>vFzq.7ÊçÇ×wЧ)¡3xRg„iýQ\é¶\tçrû œÏÐ>“ˆÓQ#¯«¢±œ² ñl±B­ml{ÏfÁæØ}~Ö= iØ6m $emH—I ÿR3uÆ|y|yéQüh;·½‰¨ Í¡I¬?M|€ldù¦g~“Ñêš¿H)&AÆZŠÏS<1¢n"|QÌwò¡Æð±¥@«€Ás¥7¯#å%™ï€¼XN¡J„ʰ ²Lž:x ƒÙª ·¾Á}<8yúëF¥ß:&‡ME/ó<Ép·¨Ä zŸ:ùcFõ\°ýG[Âå‡XŸT‚?uÓ¢ò†'n¯£Ûà D{=Ú4^JÃÊÑȾîš$4þÈ3ÊàÝмå©Dl‰j’×Ï)ùÊMY£ËºWZ(¹.>¶™f+@i÷‡ì–ªú߸hPÇÉ£ 0AÙÍ&dP°i„¤t¨ª>Â’|ëÄøüÕÖp¢6 VfáµzÿÄÿѺ‘L»Êå—C|kJɤXl@²Œ÷-¡æÆØšŸII«)P#œU X]ê|–åPv˜ú:å{*.ö-Œ-¨ÌŒ2l•2©iÈ.írhv+/F ÏçÛ£SŒÁ1zWɆfKÅv xi¸ê´ ÔÙ ân ÝcpÔy)¾~„T’÷avAÀçíÚ„+$Í-ÑòÊm¢W7›ÿ)ù´+ĵÐH¡ò kú< ;g¼¬üËÄÔßí2­ ÷)–ýâð²€];øH>©x1c§}ŠTÃãŽ-L®ƒ*`­YA6¯‡~à$ W±iUÑZx!H¶Áã^­³+mp $¥‰7¾1Å+“±£…„_sÂBõ¢n‹LTþ4¶~ ¦Í]S‚ô¨†4$Í›Þí¸vÙ¥ï²1Ò}¯^‰$Nþ§Z•È‚æò*éúb·…0}\n…³-i}ª<’ƒ´òpëöý…KDí„Ì”Öå̧´Mʆ\}Ðò(A›Ïþä—>=ë‘Ê/fE%ÃjFDWîá MvïÕÃDÊ:Žc‹¢á¾ËÞèr0·m¦-ÆœXçš¾79'£Ârùb…Ѷ>^¿-3RÀ8§SG_ˆ+â­yë*Ê÷§–*ʼnȯò.jN+*~!… Àè'Ú>y»2.PóàþÓ$Ná;{©‘2ž\ip“›<)ta:/§Le¥ ”Øíø½¹©V±‘Ðu…ÜçÒ:~w""1Î`ãþPKà%Î%λ/@ˆÍí…KxiídБ0ú™†'¤Ú抰´¹"¨qëktÌ™HˆVØ~?ð©ÒÍSœËËLË"0ñd t”o7!¿H…ûb}%.Qø€~Ü0Ú¹3â%ØG_ hÉt÷¯%Ä*ék†gö•ɽ7oJ~‘Ž6·r(®F4ú–cŒB¨Š„?4óÊË´ß õ¯LE*ð¸9ZßEÓ¡·:´'†Þ-ÁǧÁkèÁN¾î@Q÷žYUG¸ ÅùL3CƒOicQ+ ‚ÅrjXt¸‚@Bñ÷ɇ²«ëWÿ:–CŠƒ:ZÖjÿ7¯5t³GÊTÍϪ°5†ÔÜRÒd*¯èâ¸Ý\?kppY Õz–€V 9Ô®pßyH8 Öy ²¿^[¸…L~#”Kcü×Ñ+SY1NÔ™úk–nßXáZOÇÎ&þCÍ;_ÐXîCUÀ¿N² úþf’ÍÅöì:•‘;ÀÇ^% 9qþFºh7¶uÏqÈÝÚ±´ö#ãÆ…©Gªe•â7h >Zd±Ì^CRm€ú$ÀôÂÄ0’%pžNÚ+Z¸Áw6Ï(¾[¯–ÖC­©©ò^Näݰk!?•ÉQ%S´ }míH¹7ð¼éxf¢×’¯zT7cX>I .éÝÛ1÷¸ÃðI‰¸;ÉÌI…Hw–¹fÓ!;“1þ­OÉ tùÿ'Gž'jB,r Q`wç{÷Ï>;é_h´bæîmkbà®´x9jøÓdÅ5ß|ƒ÷kÌBœ9íNú5C4si±ÆRU°Êu*Kú{½;|ÄFšUÁDæïO²&碒‚N&Ù غôŽÉÞ’Å>Æ;0«ƒËê±RD.Xo§ö¨$w Ýž^é.u§ò¢`el;k0-gþfAß÷ ÁšØŒ01|é 4‹ÓÛ;"ö2Ü>ß3¦=Üã¶²Ú.&ã‰d]i‘À\Js²„ò5\Q¤ñ‰Ã[‚R¬ì‡È±ßÚŸ[s§¼gû¶r:Ç2ÌñWÜód±Þ']•a9J“}6 ù°÷¬@«íË£ë0mÆŠI‚ïrHßäzܤ’Úh@Ýåñ¬ñ{9îòSzÜ> ËËþT%?Ÿ@´µÓ””Ã3&Ú ì+„¤a ¡!k£Åôøx×Üßï1= /‚©N%ë(ƒ]²Û»›Ôú¡W™ižbå'¼oÓÑÖWÙê ~þ¢³Kתdž3vcU&¿Î ’°(E|$õR`ÏMÉ(ø[r¹ØÇÂ&ÀÐG*ó H¿ßžØ»lÎð 7CøHƒBµÍÊ÷bØÁÉ¶ÙØ×¢±Y åZú-–À¿v2„…œQ²÷Üvõ°wrQAºLâ‚KSݯ+Û„ñ«uW”' (ŽÀCô™ÓõRA÷ö‚Ow.Æçºˆ– Ý;».q4+F^ äZÐÔ°3]¥ÆÑQ+ÍÐ$eÊÜ€"Þù¨Á¼•°fp¾bhV]Š…VÍN¿™rìê<¥Ì÷Ii,Ü bÚH¦?K•yû¸¥ÿáP·pœû˜é㑇7+}ûü.æR@È¥ðìp¶ÿòгXHè'çÔ¹±G Rìä§üY©‘Ï8?±¤c™=“!Ó„¥’}ªv`±×aùø­âÚ3²A’R1Zª, 7êÓ<©É汜mqD84.$÷߼̪À9‹Ÿ5sH”KF›ÐIhã1Š¸ÂŸoôaN"–ù*Ǻ›§gÜ#‘ì°EjžG bL,Š€²¹,È ¾ª‡j:¢NEvœ )Ȳ|iŸ+O2»û5oM"NÇð:Ô“Ø@ï²xj°åDéã;IŸÏÕß›À[¯C¬ÛìâÒ+ø·ßùä`ï||1J9”ÈÙ)|¹¹0]j1ó`§õ—ÆTè0b":gžáÓ‚L€y¡ûm¬Âð+þÔ.îh-¾€lãaƒ(^ä·¬›†­;}ÑŸÄóv²pvÄê¹i®þ¸œ# ~ÇÌbZÛ`Ï2É Å4PÚLIVXîß–}½{VÒ?.z°DÏæÐB^3 omÔ= ò↯P ¦^m]LÜkÊÙb"¿†Ô7¹$=P<§;G”T£(Ô¼«©ßM Ó…QðR1š°8^#wýñ1|Å̘U!ˆQÝ´0Ý'br+€†Í”úrLtИҽìˆ:°c/Oü£f¥ÇðÓlD‰ ¾½A¼—¼hßÿ7“S˜Â°Éf’Åd°½@”t ÌøïöUjéù‹“õ­ œà¾*¡œÏIPÜÄOê¬ÍIÔ{c S–ôoÿB ©PÅ)„ù!µ`•²iålÈ|·ç¾óˆ©Ä݄ڀÖï·¬nµ½ÂB½;`˹tâþeYÓ,-GÍz~­Ð›³…Ò…E4ƒ€ÑIÊñ`_¢öÇb3zúWé%–¤ï7"U¸Þj{’ÍÞí-E¿¢ò[vh¥¥£SDØd›è̵]úyÙÄK¤%I¾Á/¿™6zà3D«¯Û¿C%`y6ø¶zXù[Ÿ{<…¸(ÆfÌ\ëjœ½PÏßö‡UOâ "ýÓ f{ßgñ8™ô®ÒívµË#Ûn8£Aãù:¸¿¢9ÜXÝš.‰®M¸___a“ì ¼® å$rû¤ºÉž}–" Öqö[mVÍ帑T¹ os»œ‡ôt¥2=<‰•U°@ó:’œn»B\#ÎÌ¢]Íc c·kV.õBÑ4ÒF±&CЇÚ∉!xóë©ð¸ H‰ô1¬<Ƨ¬á70_ЉÆÌ.£ßXEpzòt·³éÎX³~ê¼ÿŠ)køgYØÐg4עΨÓ'gH @6ÁjÈ­¥ïö2ï8Õ<’áݨ åü*DÝÚÇ—tì ]õûš¤\6ù\fc0ë?¯pÖB‰!"ÆLx?Ò •£±oµ@í„æS¿RB”¼/:ñìJ‘ÜD k.f¨…Ðî}öüo?z·kÏž½(‹d)s“Ììð‰KEØs/·ŒGÖ†J}Þ+}”œänkpÉ U>.´Ýö-rÔ û Â\2ìs}d÷cï ª„îJÉy¼"lÜÌš^#ñX$GÆ‘w¼Ë…r©z~¨±Z<æ’)^ñj.Ã!nT¾&øðGå~‘r_Á˜ÿsä֔нzyA÷†îÁÅ<œá Í |»@=uïùü]”<²¦p‚ä=â†î';âïyé©z߯3ï O™¯*H¢ï©Ùî†kœ+ðcôN;ïVEÖðdðN )@Ø›áonÀˆ ê}Óiè.§½ÜüÅÕñàÖËW³× S¡l Tïv¤a,OÃ[2±¥«pÉR·²%Á9?e)ä ¤ÿ}¯SR,QMÔ°ï×®>³Ì4‘òˆd]:Ôöâ»33y »·ã^æ&W‘üìqçS¾;!Æ"C`’"©Ýy²ö=xùq²¶ñµX†€I{¹5ˆ$n+;)ˆ yx¥7ïÔº3lò)r Q“£Ïbuí‘á„™2¾»dkn °D…MË_¸†ú>Øk8ØÛ¢µÉWjff„sPbôÛçœÈ BL²è•mÉåÄ|<£0"ÇÔÃŽÅ 4uW Ë‘0ÞþÍde»Ðô9‰òð*¨¸ëÈw¨cÈi‡ÞòUX< ýiŠŒo_ëÌPʸðG2f Õ›lžŸ}¡õAEðk³·*Ø„]zAµ}æ®"?ë]r«~ý €^ñ`söÆ=ÒD'°pœÝ}ŒÍr¸Ó,É-×yži¬šr:ìu¶j¡Øž€–/¡ýx e®… ˜_ÄÜ9à¤^:ÌS ‡~ZÑœ"TÐSÊ$Óg͆“3öýï€ß[æäïý¿KD¡gé~jô½ïù¼79tLü´¾WJ+]ÃÃûWýïÀ¼>4.ws{DŒMM$mÌÈœìîCâ(üNcrx¬HWØ´5Y™Ò˜´AyäFÓkÊ]ðýøO#J`\¼¹5Fß]G°¶4Ñ{¬:UuÑ| \-zN¨ˆV{¼ïÏŒ~ hØ'l™Gî’p–œ(7ÊGòOßý÷’cÿg1ðkë)B"Iú{(•À‚©wi¬Ê>ˆ™%å||=H=³kí“XOúbltR±gLÛp¸æxà¸Hƒ,¯3·ï6U–¯½#H§‘5¾£É¥çÒ<°öÈRrÀ¸8×êRóòÕ]é)=t·Û(¿bÀ0G+Rñõ9›¬ŸÒÂ6ÙnSß Ó0¿ÒMêd0SwÆŽ)>6´ñ=Æ…ëϱUŽ€Ó9ôå]0Ö«Ü,ÝXÐf¡P,“4°ò‰³ÙëÚ&œN÷dM‹‰Xë'ò,£ C25u ’ŠŸ×ç0÷­Ïئ­.=•BïOpS÷G¶ìž0ÃÅ»Q T£Ϲ© ÉðäC8oqQ§Á Îb_ cÖáùÀÓw³ÝЇ åå»l¸árE\ùaØCÜ^ãvé­ïK>S(§3Ãä üà®R;‰¸ëW_ëÑ;N:eH÷¼£é4ÔgË­pf…Á†™ºÜˆð_Žd.”u@nY%æ•ûìl6 `‘#—Âdv\ß>U¥pvÍZ¨”^a’jû…$ÍMÙÓ“mìÑGŽeGÌ¿6°‡Œøè³÷5È2þöìj'Fð_€üöî#0MÓ …7­dÄ÷ôj 9ŽÛG¤ýîl¶ï8kG;Ëô+Ï[Ø~¡‰ oÔtáޤ¬¤¼xà%2´Îx;rðš1×ÔF@ÎSÀñu6P&•‹_rZµä©_½Ì|c+wIð rê5 'x’ýq×íwÅƧ¢ãY€Å©Ý£»ðg$àÁæüC÷A¹Þ(å7êÓú¯ûÐ l»Øq!å°ˆÁLj~î7.…Q#ìuƒWY»È©ÞzˆJ§Â5Z¯O;ÔÄSlÆ8]hÃGVê¹ë'B°9DíYöZo¨ÍÑÎ2úYû~q·9j¬ª‹=\¹Ç°3,VP—ÖúÜ,áᤚ¯¢j~ÇÌȶ˜:Ñd)ðÉ3kGð_ýÞUܸfjÛ—YÝQîæ'¤é,]^&•}bs³.ùWѬ0¸1ïãw|«ÿûSD Ñø“«í*EO@jÓn?­¬pâï“ý*ò¬ó/uŠ¥Þ[ït§… • ¼ðÈrmEšúççtŸHšaDÉù–zðÏ5/ñm“ËçyçÄ‹33冸x­ÝE—Ä3»³ZΠɨn6«ÄÄË›Cjvä}ƒÏ(œ}£ý".Àå-0à„¶N FšŠb@A~ðÃå"d"Ô¹®é¥‹ÔYî°ñÖ2ÒÙª·€ÄΕ99߇íŽf®íÒZÏ9{iÛ A8‡Ë¬¸#£²bì ,WÒ× « c«œ°ùøu¼†*ceÁBBP1óý¢­¼7KjYüþê5BD‰×ÓÆˆ B¸cǦf™æÆƒ½5¶eÌ4ÀC#[¨iEtsÈÌÞ[ÔPkÿØgßEäB&&Žªihêj2Ÿ:E#0 ¯èVó˜çCAŽ|/l.ú3ÓNéPl¬FlEoR•(À¼æU¤¸åyªÏµ•A^7îõÿýb\cØ™ÙÔ-Æó¿šW«lòq=k0g‡Aíab>e6Ìk^¿(½:{ÖPAÇDg”'w90À‡BÚ$Hó•%$3üì¶>WXÑÆï‹ÿΪTp1§.°;¡ ½fC|ò ^†ÿ«ÞT X]ͶŒm+˜åµËÍ;ºiEnKD£bŽC`ºrA: þ{¬—¸Ólh(Ìš»¿žnAH¯Æ%Ð=^-_ ×A2¡ÈËo}–";0 åÛºŠ)a¢¾À^Ù²,%ãñë]YK‚ê,;é¾áäár çƒò4ÙÅ\ÀÁ}…“99®ŸÛz×<·=yTèˆ[¥€Xô˜¶DÝ=¥%J‚‘tzðy)÷ûD² ž–FÇ'ð?º $Qׯ 4Þ·ßâ~^v#óÕcõ½+y>/U—QSÆ\Žœ ˆ,zz•n ¨ÃâÈ8€¸bcŸ!&ÌüÞ@jRKr' XCRÍ,hŽs¨†Ùijçu¸O´<7¿´¥°Õ[Bî™m"Ú*Â4\T¤ŽX´VäìHK´¸ž4?ìoªÔkÂnüÖéx!²½ü8KS—m¬¯ýë(+ ÿŽ2ù——ðņó1éâž½Ü<ÍG hÜ´Ný¢k{IQAx-uÊÒ½‰ÕÔùIV¸Fh“{!ŽUJvKjŽõ|À#ÿ lËWk_…d¿,ÇY¨ë‰Ù] ÞÒQÔÄ-Á!@æ>Åef²¯˜os@ýHµ•WL϶ñr3àÙÕˆ›wúU¶DàžÖ3šÈ”)ØÜ‚’òwËžø¶ÎHC;ºßH-¾/ø?{Ä»·Å Ž/¥IH‹.p!^[vzKT^ªFIæ}ãWo®µèÚ®Q¹›ÁOjúc\¶—Mm¥{‹ÁöÒ€&ý0#ÒiÉ´Õó؜Èa•ÔݤÙËgtA˜{t´øCÔq—QÎÚñÛ¡ë¾÷"/{3€Ì¯Iàj’iJ= W \q%Û  9•ÇlZúUãkH€ªͰ¡K,3à5>ór“,ç†Í„3éßn·ö¯ø‹GÕ¢kÚ’l\MB¢§Ìù cÀsC!ÞúYø$˜§yƒ„² TÜ›éŠQ†¤ññN$Ü\EpE]ë`9?8²’3áQÁCA„®Szœƒf‚Š<7z½§)û8©KHX ãhµqš¾jeÖdr=Lè.7{°t3~:—‡zZ¾¦m÷ÈUÖ’†-À¯Ó¯m{‡ÄÀ…»}k§ žÔxw >äT»ÀIxýœHh‹Î¤óÝÛvqSëj£tŠ9Kp{ÂNº.+\5Ô½¸ê‚ᢳ~Õl#6¡v²ÓH}ÒÑÿ\@OIÁÔ*":ŒN~€–I¨/¨]¶)漋êô›9ì§øøòý?‡°BEE}×86~íq;>³b;qt‘Z³ö]E†¾ý¡—eOkGYŸé<3æ·äj7mÊ4•¾\ÖÝ'1Ô²3Ã?0÷a!¿Ò#FþÄä&ï1ÄÑÙÐyìÁù€u\–T¬g#жiB c™yúˆ@é ©óSI0aîh[ËRxëÆÏŒAœr#Žd®‘:ÊoϤƒdšÊýÔyø‚Å jöñ”I•Åoz‡Oý'q‹¾kÁÄÞ-ÕPfCI˜‘º@Òª)ÏV±änåAþzyP¿6fø›ž|‰Ô´wóSö,êW5À9ÿOê⾪'’L76W 0£BÜ#$‚ùË?í½‰BŸ&gÄL÷¿«Õ›@ÛLR5©ÒÃËÁ[þ·‹uó“Ö;€Úæ†} ¦d(²y‰¶©Äæ²ú”òy~¿tV|–vÝt¦Ú¦|C]®!ROº¤: }j$¿Ñ/®½÷áýÔÀ-þÁ;e“ÔÄJ¢ð£ïIP†ßÍ<Óžy³D¹µõ •˜øõ-¨'x>æ{6ôKmÚçAóŒVý•.„ º¡=€iO¼žƒ‹oI¼a §à¶uœQg^áAiÝäF `Œ—°øTÏoòQ_»þz)•PîXÖP6ÃMððC—MVÈu?ßpKÞ…ì[x¿¥FØ.”Qé!ͦµêBâ­@›3z1 Yõ…ÿß!µ´>šRl-¿_[bÝŠ‚OÑkœ¡ÖCh!«S½øöI}ld˜ØÆ›-˜.Âè!¹DâÉíb`x•}E?05ð‡IaÜÊò«Â uä­Å„}†qøÉæ³±‚´§¢š%Òÿ§WeWX]@ý »ÓÀx°ÅŸz¶ä?ÒŒOºj¥ñÃèlIªZÌ”Ò̹ªi¯·‘1È‚y¢~W™+`. ÒþöžeX›qña§,wVƒ„Bž{*l¾„ V¿‘ÈáFZE]-Ñãòx÷χ{ÖÒ›eŒ4 ïª÷<ƒ ¾ÊÄŠ¦Vªìú•c#ˆŸÈ!É;~h\14’õH*ö-¾ ŸÅ'ûZ„˜ãZ9L0Xçß#™02ÁÎê;Ž£÷Qª†Ò'd«aYàÇp5SëKådFZ,¶=¾w?@†sA!ÞZÓ…µ¤Y!@€¹§¾× Ê'^¾¼€I@b;kÁƒZlUïÕK²|Ùš'4£ÚÒ¨]¡(SÅŒ"Ð㡟­Ü¨ E!ûYB¹®|ûÂjµ)”jl}+zj?#£ŠxÛ;ÎN¦¢µw€à>B£›ÍmVшçYmoô|¾ôT^!r¯M^€ü4>s&gþ >Ø2‚ÀüY øç%¨icΔ:„ÄÌ~Ž$\DHH©Xù“XÞ¢O[¼” t—^‰BÔ*Ô"+p’ëÊ•RûÄJh€,åY–Û N†£ÞŸë\q†JŸmhJôÕÎP6Ff2°18GéËœJÙˆËC&†§=Ø¿-S~b˜¡ÅµBò—“ˆø+UC8Î$]À/QêHçý û™yIÔeDv›¤…K*ÛŒú¡bËþ,êGÆM^®›ÏRŸN+›ã¾²ôØã($Îr·G '÷1î¿×=ŸÞBᜬLå1M'Y< ŽâmºŒ‡¯ýIgÑ©\¯äÌbêa¤  ÂϰJ;­±çäâÚM×úb>fPÀÙ— ðòS²­‹ ›$¥ÍdRK£ÝJÁ>-VÂv;º±Çüí¨ ê=ÁûºÙLç‡3;ŸÛ–Ä—Ð @r±_Ä=G¶Cj]|±«n?cAÇÒŸ_üRýP°Ò=°œ°“¦ ‹/.…ÿËÊð¸µ^UsÚºó¬;b˜<v§±:Yýoxï:}R« 2u:Çë´ÿ°IA€²p¢a´v@Ï‹bÚÿ¡GYt`˜kSvd»5é‹4÷¼¬³?qðœ«Äç}ð…®ü ×´ ÛV>QköÕU¤ž’,¸ÿ6^èÆ(Á$Mää­ª-øU>êÝ´áBÛá d3=áV‰ÏlV&†‚  ïhAü0BfßW¢;\«JëÛ÷Æv¹ÄÃq‰o(¯€=¢ ,Nv¶¦-¸’6ãŸÊ¥½ÄNi/™5úÏ?Ðß<àœhM'ûG+E¾øªKi~Ž¡ÑíFõü ÷¸;¦H1AÖø>UE#Û:°!ˆw wª\7“SvåûhœXf,7zL“šTaÊ•XÆèñè”®+OùJ£eÙEÎUz«çq$õz˜´<úa¶Ñì;Wú*gøAè^ÁÖ´…dâ_®´ú&¹È‘HºãÈ©\ëb¢"· žT•m¼g¾&N½±4^ÛÐÝKÛhï¿oS¬8©xur¥©à$>¾X\¢°p„$}¿§Ân¬;Ô–œÃ–Í ÷†ùS~c/‡ðŸxûãå9¡ŠïSsŠ’OP“8ÀѸ)ÚÀkD%‹å\øŽ ‘Cíý÷¹âøN‹ç©neKûlÓ4O£L8„Ê—×ÝÒ*³U…q*ÃØQãl^Ÿª¥€5¤¦ã· ?׫"3…+»ÏÚ?Æ¿à8ÓÙÆ&YVÆâž[ž1£ÛR¦õ^b   «Vï{öD‹à§eºnÌ÷Ó 6Hcf¯J‡-´ ‹È`wd畺ö-éð·,«°!¹¦”8ù5ª ‚ƒç‡nþáÕ@/’µupÓU¡ê ½É«gعô››áIúøÍ‚û.6F?ö÷rùF1p)À…O»@¹BÒÀ‹Á Å+É<’j'ûqŽ¢cûšk3W}¦­H"™|1ÙC‚Z%,ßPsZ—ºÜ/Ö"(†N»è!T•J=l1¯ól{êì·œ§í“Æ-šw²Uëµ%¥V…=À’¡ÖŽïõ6QÉLbÈ?f·´Šò¹ lô”"àeX—¡n´­Â”©~4 þ¸Æ_ÅõN.i&™Eq¹Û“tàÿs¾G?Rš¬+‚:Ukés~õ·þ*Úþ+aåxKÁ>~êý¼E°X¤c3¡¿€¼,T6¡tÜ 9¯ýûÞ”9múV°³ ýå[¿;¢÷É€È)*òîMÄå5|‰æ½Ë€¿‡¿í±¡×£±Û˜!Œ<óÚßç%ûkŸ%œÿ™·½lKGˆjÙU1X¡2ù)¨ÑY¤¾m^D‰ÛJ{}*˜È@Óºá>Y*‘Ô)_Âå& ¥Äç1n¸äÁGÅBàJ£’¢Àç:O£{0cóS ÜöµîõV¾Qî|'3~)<5ïläàcßÍÛæA–+Ê#›ìG»ì”öêR?7ÐWb¤ ñ&:]ÎM±Ócÿbã¯ÄNòqRû5r:žv´Vï‘ÌrL`®éIã~ÔŠ™…>«ŽKÔ×ï\Qù¢véøº°tº°]³Bz-¥¹Ï¿§ã¥>„˜V‡Q7ŽP6•å÷$QšlR­Ž{q9A4èl}@“Cø w|©ùf¢†Í’°áã¤íîþž(9¹¥BX¸À×°ï|U —&“ÇöX€sB¸¹¬èÁ2S=á '’-زܺ\±)´)ëóp‹31Äó$æld„yx¾–,*4c©ŸBk¿ ª/-·3®»”zefÆàúØÌÕlÂìk¢,Þè¨]}+¨ÙLxÍaA¹7AÈïøª!ûÿì§\t¬«a±ËÌS"n¿»\•¤k‡Å†¤ ªI6)!³霘™=ù‡Žöi€hó=Se ”KÓ´Ñ|‚ˆÊyä¬ÈßP±¹‡°·¹!N^ß|OSõÿ€ú»eVl•ëµL‚ ˆÀÜé¥4‡ÈÍÿÈm¢Ã‘K2Áãøð¯èXÑ’v!:Ï'¾± ¨ 'N¾úÐÉ\¸dê9±rq0]”ŠIO0nx)Ó¯_¡Ì8I13kZŠ _œ@Ò°­!âô~ú¯Äœ_“,ù§[mïÆÝή oƒceO_ƒgP´]¹û-=7—pu«H~ÞU—޶Eô¡{œ4‘'÷éoÏ-Íc÷RŽÕ®µZz˜Cæ| ôôÖÖŠm*Q„®¶imŒY0Ö!…ᬄÔ;'£÷_Ce%›ƒCñçÒ‚ÌŒ°gR%Z³¥L“­=ÙC¯ž ëY ކˆ\rŸ‰Ì6å…XxsRv|:€¤N¼ àÏ9M†ÑBÎLޏvä—Àn‘s3ÚJÄøy?I“üHåÜ)ðÖäP…˜GÈ«fTJ<뇿ƒÔh¢1ª›Ô¹“E™Tâè‹Õщݛ'^þ]¢ž×†hU¦®¬]ï¼Z7PÞ§xTØ| äc!ýMùDǾèôÜû?Äî1ñ—nçVú˜ÚA/‡ôe%í(Œj©Ò9«…¨´;ªí¢rOI#F®¸+ÑÞ_.¼šÃäIïÈÀÐ0÷.ùÕTçȧ÷P‘AÌî+g¯œÞÓ§XÀÛ#*©ºðn«ìùˆþ: YœO‡Ä[ã‚qÆt¼pÿòršá&}C®²îÔú-±=DB†æt°ÇÍó Çä†z\§õúëŸ& Hˆ7ù„I?[¬lN}µ±Hv¥ÂPÚiWzÒ¨tàý*1?à߯…8àÇQ¡Ët$/Ø`ˆ¯‚7'I_<õHÖ3Q(r¡xÖ°´CGR©_·¶@¿£:¬§f=ÜøÄWÑᆌc1• ïÝŒO©º°t¨eÿƒrV½‰€-;%ÉžU»Ï¶&'Ì> £J@k¨‰ ²= 6h”ƒ%Ö¤ˆa ð°G©‘anx^>4ÁÝË»aòIÞn_«¸hRä¸%í|FLËÚÌ’Yç…£Ðx¨ˆÇXULïd€êoA”è^@Ë™Ô a‰"ñø©nJóN/ëŠ.9u^lrlò•îüóø›u}£­þîÓQ¾÷h­Éác¼_ù z´NŽdÍÞÅV· -¬”˜eQt¾««ü~^Å‘ý†u¬Î©A^qZG¥ÚìOD{èq¿jü«:ý„MÕqðÏS5mÊ|ôQPóP™0cÅGĤ‚(›-Ÿ”ð2ß“mr1ŽaY4ņèì ÒKÛ :tâÕ$f½EÒ¾A1Õ<½+ž2/êÒ—ò ÉÊ" 8ŠŽø*Mù§Éã „€È8æ&›,bâ®Rj*ë"ÈCЭŒ5qŠ:, ³×£~§¿ùÄq#“%W¹$—dIÇ$kö”QPnáC)æ$l£XN äŒdå]ÿ‚T˜æ{#qéE`ÌÁE3óò[£ŒçÛ}Ÿ¶-C#¦´{/œ”mA5FYÙ$ Ç=—ßwZ :V+‚W)«ÛFüÓoCwèHè†øñC+~Óìú2CZ~P]½XºtùYíÝF5˜ÐNj¶›ˆƒA:•êö„§SyÜ•3›!ª½5a’¨@_ˆ^5Øâ6É Q{^)kœ…Rwú@Û‡¬nÿæ{âPB­æÃš²<+ñ¶ØyálžL31è=§1K!˜–e÷xv„«uö¿—³e¯î³‘GÅӿХs›½‰ÿ|’ªu¦– \˜šbvXÜŸa½öùß‚– ˜æm¡~}@:Tbév1V¡äÕ† U°÷À{OÌ/×ÞÖª.ïCz»º;k,vŠ&îéK|J1Žy˜–Y}²ã‘~½e´éI¦oc©ô®  _6¨ªæs]-¹¹pÚÍÐá‰X,öýDÃ^In7ÑPš³Z•mÙ¨ÛUcB}w÷“§*s'¨ë»Y‘âäTe±Áj ‹ÛɲF$NT¸¶úô¤õœr×a\“HlŸxK7Ô4 O¨ºÈaö‚¹lm«ýáû0346²dÄí¡œÀG±ïV´ É.OtÀáÀ¢í¨ ð­…Kõ¢ó{^ÿ¶Æ=!Œ_oá%ý§v¡ÎVµµnT­"7A]ÿ²?¼ïú¢ *§þL?bf’§›£Ò:üIoû´£ï'h‡­¨½Ö Ò,¤ºß ]<2„œ*ìô]<¾9×ïŸß¹ãïù0ó²^ e°FŒ—Çb\a&ÚÈÚ{¤¤÷ºžwØEÇ·wFd&| S¤Õ ý>äàS†ÚUê {¬ÝLjéÄ ®”%†ã²Õé„ F‹¿4JtTÉ:ûÔÚJ}òË{*à/äD¨?‰Ã¯+T•Ay½eº½tŸcX!C.ü ïþÝ[|un7 ÒŸÃfc ®n;…-Ɉì)¸HqgÈol’èJò§vâQuSªã˜© ´ËúRŒ?º4õ÷{oK™!X€Ñ¬n~ëMÊxCi:(»ARíÖì£ìok ã©àƒ%/å¾Ê÷¯xúÅõ­žÑe®ÒC1HîïöK·È¸ô|.ð*˜æÐÀJlèÏF«ÊtË¿_}mׯ7Æ´ô¹¨Š¨pËéÕ±·‹umðì]úy’”"˜¿-b–4Kþ„z,Eeßve<íùìŠØQ&C-”•À¢ªµë ”ó]f½%FExP‡ë7´?û¶(^DäÀoiÍfÓÌ1f³E< ûEÔÜ_0Yp(ãó(ÃÃÿa¶,Vsé²§±GiöQ»¨i9ÁãLe:_Š“qîyõšØç.RNÞT²Ïx¿Íæ|ÖeS¯V%ô7ÒÁ¶Šáó„ˆ}7@_vv“ímh‘|"§r᛺ræ|P#Šô;CÈBŸ¾¡¼qn$ÖD^YuÙçVgh‰ïÝüÇ’uÉYþÁÓ}yåÊnà¼×^¯b%™á l‚fQ”Õ·XDRõ•ïz 6óNxÛ£†eíåýÃòHãˆÖ˜kUøÌ\1+Éx:þΖüJ£€Ýƒ«²y­,B›[[v0#äÚ€9pµ”K•Cg©±3šÕd™ ‰@ñüñ[µÑ¦X{û “ަ‰.#°êÌóG¤¨À X3Ó#MMœþˆ*k£9Ü’ %¢â*Ø”a×µI8³òƶ'B§{‰jËö£¨‘3_¬\·ÎµI!ÿªŸI‡žùQÉOŸÚFo-µF5¿µ¡Ÿ^ÞV vÈ?3|)ë1™úq¹%ÿ*:&{…ï ƒÁà)–mÏ1Fånµ­á]lúr¼Œ1S¨ ûŸdN’yëó1î9ãßöC2µã%ç(î£ñf"å¹aR“fÀ»=œÇåõç|<^ÌéCAmL‚ÓÐ1”îô¥r®OŒá)o:踗 õ« 9/_ê~Jë¾_.&j(-ĨjvÏÌïªÃˆZ [~5‡×_¦Ä“.ÀTE,ï øãY¦ '6#žµ¿¿lÏÅÐå£k†Ì¨¥qK½òÞ&}ì§+Šb¢u-æX®%{ t¨N²ídƒÔüë¹ã¯ˆî ““‹WmpôЦ†!t§Â“c‹¥z]½¾kl«¶£iôïÄVz ±¼þÓkÄqÊ&P'›MgØ.ˆû]Ö6W…ñ_¯@¬`(ìâ³/UC™‘­ÞÖÅè¾ Í‰ÜA-}þµèÿ9bŸ¡@Ÿˆgk øŠó\‰) `¯CMCY`7ò.çp –u/È\˜ìqpI q¡Ö!À\qwxlÊh,—ãdSÓq„&Žq”h]GÇNaЈþÈ‹+.ôW=ÓÀrE¤5˜K™_‚tHo±„Väý=Fµó¼|¤dV‘­œÑØŽÃQ•PïîcÛ3µY¤£Ì>”©ñßxN iñ9vŸ”ÁÚºº—B!¶/ q…¦xÂÖãȥʞó´tW²×°åÛ’fÍ œ)>ïïÐ,wÄ%’Èz‚‚•6U©k¶‚kaù(JÿeÎ$N}`†ßãD+#g}ý84™y„ð#㲘oáP.¥¡r‘ìУ9ÙÆ¸X#CÌ.ø›žðy™L6jØ–ŒÅ}8gmŒZ‚XþYí^t/,ñþGl)5÷ÖC% «=r'܉hêºÆœ RÚÛ98Ïžlnõ,ËòY©äëeŠ:•:h•´¥I(œ)Ç3§í»J®£÷=ƒÈIáxæ·ÿïäÎûìÖR†¬ÖæñÞ¹±›¸IYÉyâš% X™kcƒ]#WáÛ„å(N²ýíƒ%}ö+÷—†{p¹°É¨`äRˆ¶*_s¤]¾ÎƒFWÞðŒ0²±¡ñ¤hš‡ná³J°`©·Ç……¼ ¢:w> Ç·L•ëׯ{Šª—V±¼•¨+B‰è!ƒÉÓÊL¶´É1GY¿é|@Õ lÇf;1pñá‰"TA1Þ;g{ñH–·®˜ÎuȪ+:fçT¦RÅ2Yk貞åv¾k•xjM*¬×qªÞÌVào8¾…§×uW6÷§¸¶\bß²¨=K ߣàAÐÛ>þ½Ì3"@Ó¿YêCáÈnqÁî¨{ƒÙ·È+-•ði,{¡Uk¥ ü-I¯(‚"h©®ã62ft9[’\gtÀÛñ=[b!ź˫|LñÖÚ ~Ÿ^vòNô5ñ´µêáóî„Á—ŸÿHfkxvMV#Ì’¼ÍöýËç>!N´A£P÷jH‘ñW¼6š93ÄÁí™ÏÒkÈÎÂäéŽì•AëJ²Çó‚8šRêV5jÁô“7Sáyâu+Ûœ’!6Ñ%„Fkšˆ°ŽðSÇtx£'Â?¬èB/d©W˜këÝrú}[C_»Ë‚“ˆ?Òÿ@ Ô;tW•¹—Ådÿ¸ž“†<× uJÖ Ö%‰´\êÔ/æõªì_ÆŠ@C‹c’ž–(èñ›Å/Á]@Ÿ©Z1”£øßÊdg¤‚Ã’Ê^ð`K'ëáHÿ;5î¦>ºaЮœ×{nÕæTáŸ7lÿ-Þÿ…vàõÄë¶Î9Ùò€!—Àç”ok¹t‚eÞµ¯š?%µ A;×ÈBkº'æ½ö94WàU‚Éš7Œ¡Ð… Þ©Tꕳ¢Ð=ñè„ÿóPànÿHÚ¬bï¢>¤¸œ*b”á: ¸w2(  ¢&ÒàoÛ<Ëè”;ù°þ§1vàŠ¹zÆ« tÒ©7èO}ù›ŠÔý«vÓ4h ‡«²9¥òDa”Jâ’oaˆl'«¦f²â¶Å²W<%V½ºrgmý|òŽæúnx båu5\I*ŠO½T)0ÁWjÒ"ÖèPðµ$`Î*T§š3Ú ÉñÁÃs=?-ù¡Þ±æ/ÊwÏ^.Dp£%—BN÷¦;9œ0ÇJ~mW.ƒœT#䎅;3–·ï×\¦t54;E{ˆø: ýí\eË‹»áq)V¥ å-ˆžd²àœÆáô hÜ'zã¹æl“Od˜%úcÒ.¨q–²û@÷É×M–Qƒµã—ÑåCOÞ ÍÔÝÙˆŒˆäí.í¢u mji¬•”à·=Þ¿P7b0DüQA%/‘ßÑì@5¡ÊòOÐf…àÿöäÁ¥fb«z/ÙEß<ìf{bHº£õ¯Ç¦(üÃ>Â|œY†`¬O•}îþcº³¹g\‡nôÎÆ‰…¥î뉟ádŒÍ”ƒà^òÔÊ8P£ºçA'Ã9>ÆC .IX§DêÈç#s@³F½÷§'fð%ݬǮ–Ûbí÷#yô,ÚrJlå€R €¹-Æ<üƧ7Ä qëËý«wï®1žà$˜ â]cw§“ÈŸ&jBÙÄè7Íòs=‡Ì3ŽVK|iuq½ó}{„M/XZáðLšBÃwq—…ð†–p¤y9ø§ ê KBt_ÍKñâSǼ”öžu`¶à8¦‚)‰ÊwZïYÐ÷ð`jN}Ž›ü\¸ºð˜Ë{gNLœÓ_¨éå\¹ÞÈt\Š˜Ì+›Ã8­RÕi7—–æ„—i¬Ö<ÝõJø«ª…é—ŽK}”û2iTÕ…ú–êL¨ØMÜ¡J½ õOìðYÆŽ!N ‹è1B©ƒ£°iÜdP;/}¡‰Ã¶[sCBï&Ó6 RûT¶$^NÀ¡›Êö‡`¤ã´–ÃG o%ÓÑŽÂ#¥Ekm¡0Z§W Añ&3OæLÎÉý"!ü£å¨ƒÂò:á’ÿÒ#ˆ1–¦Jf/ßk•{Ž*Ñ}µ•ð]X$³ÀÜ\|ÒòH•_Pg3‹«àðÿãB¡RºŽ Ü…n¹!ŽBÜ$+øÉOÂdž,†Õ¹¸¿L*‹ëª„…é’?*´Úl¨ýžÁŸø|ÿ¤6BÛÃ@·‰Ìݦ†˜Š¶ÍÐI%Hôn¥ÎäºIC4EÆ^é˜IO‘îÏÂìÑÔ&³rÝM3Ñs%‚€í΀lM{BnÓz}A«³r7E€e“¢»­×lòÍQ–&Xµ7“á€Aªîø ãhiþÐøM¡ÝžõÄs3­¨*Û©Xè5o 0I—E ÕÜ÷¼…p| é‚áÌ9óø»8Ão02ÀEΠ‘mDÔKpEÿ;()ï2bEªÍZûW‹0*·•#%R9ûÏ¡*…H¢â0s)Ê• ô«˜°ÅBÆRD_ùÒ‡4ËK"„ 2õ¼iôÀòz„‚”ÒŽŒë›ª\Fëùà&×/ʯùL4 ÿuû%Kú$ÕŽpæ&½¥n8á`–\xÛÔA…^ýc#—£V«#½cšÛÈ×/™w3äL^&â­Ab ##àcÇÖYTÑÑ›h6AC~‹`Á|Ë70Â_‰bT$áâ\…#–KxÙ›D™“qBïIzÌ<ÉþÃF®·VPì_¸ñ6;i&KO*»ãq±]P³‡Ø؈)‘Fåu_!SšdÍy|ã3i°`55!ÓV¤™º&&®ã«eÕêá†ZqÀæŠ1ÒŸ•cÕ ðI‰À¥",yÌe™c`cnôäkc/1˜ . =[Êär8;£¨Ê4 ÙJÊlÇPÍÆä¶ÌC£±NêJFØ,Ê2Ú®ø½ûe–5Š¡«´/9± |3ÝW.ÙK„bt¿šÅÆš¡Ú-¨!#7PȼJÁ·ðëµÖA¦}í®ÀÎþó ­ù(Ï΄î­\*3ÉgÈàã#úãø–¢B(ú¤šÜ踼ˆÄ„¨©°»-l–= + ¡: 5!H>þK{Ç8ä7¤P¯½ZEsØ€ZpËÍ›ÓMAž˾뉇WhÁ„’#LI·kö9Φƒ‡¾@š 5NÏ=iâlVÛìr(…þi *`¥Pó¾RyréÃìœaÒGØ¿« á¾ l×]üJÀÙôÚov¬ {ñ¾³6ñ*Q¸uV¼XRò6Xóî¢8 Ï¿#ß[ýÂ8ã3òp¬óì^½çѱi¢_h.}]^EÎ|“2fã›Hß2´!©OõÌ®éóf¸ÂWhΟuÑ@èmÜ%z  Êmj"º(T÷' ß7ÐïÚMTCïGɰò>Ò&í¤‚tMK Ùâ*÷FŸ‹ÆÊ²×kz|ZEb>³Ar*ÃÙ¢ EÁ…ýWkaøCnXlÀ„\`¶Ã$)ï/98Ž-~G3&%T„pW¹þA÷Öî<—i—亠¿tŠ€wqJ*f%˜ÒkS¯#$Pg›Ž=(!Däê.÷ÿ9ü@ªj¨oÇ,“„«»îZND2d«Qç£ÇK¿aoÛ¶¯zÜBmvkäôÏ|V4*’ŽÑ|hÔã×p¥<(Úqdp–¤”uMR£jè½–IÊî)ýÞxá5ù(é¾Nl;™ÂÛ€åU±LŠÇV€žó¯óò…ŲáÍ .4¿D68L¤&–ÉŸwe”ƒ’ÀAÂ:’Igúï1G9•0¾ÅaÇr¯R¸ýÑŠ•—»£1g¨—Ó²h`£Y[\j Z×£ÕÚó*ÃGKÅR±ÇeƒrHÜi~’BõÔ—’…øþÉ’âþ&´×mCk­ï­>Ýh°­üF,ÔüCWBðdµˆ8é§ð¯R­(#޽hŒÁ{”É"ÉJ¯7w»0³  r‹Hç»A“è»!¬J¦ZúD kãþWÞ%¨×B òòw>#Y© !-í Ì/˜„Á$¹…"êr?EÁÔXZ*\d“_Eònøîá$Dj*,rËcS최ë´g> a _4œ<b½qó!kŒÙÈÊ<.ß­0_ vz¦g£\áÚøŽ8¾3qæ<ƒ2ó¡ýÛ6¤ Ž»ÀŸÿ¸&[r¢‡¨çãW·<Ùz‚ˆÇ´¯Î¡`¡¶4 ¿Á{Ë!ïùÎ…tÚŸW_ÄtȽL\¹ç ]êu¡Ï°}(o€ÿLð¾&“½  íÖ΀vÚÐ#¹þÐ9ðaïë€wjmS &•–Ðy~04Èm'k&(©HyDOÕùNØ8²ÿT3 uƒðµ>O?Ò;YA…¸€†At"_£s‰ËZ¦B , šì¹ÂŒl7qUx?e +èš¡{þÚóü‰àLªÔ+Xßâ ÆâetqØ•S¢„L+Ù 1Û¢¯¹™Ú– hÚ‹©.”, ¾Ìð,%s‹:LàËwÚŽè 4q‹ì7¸oòÉÝ…s”‡ö8ÔñSg³~N Å1ÖçNó°ŠYóÓP[© >zJºà±%våÁ³6°%¤¿ì®Ö³€0dY·?ÁQÚá {­/)»ýM‰È"ñœÅö³söý#qÈxëŽ,C·âïF‡¾GW¨§>´i*Œs±e•Bz Ý=¼‚eÛ2bB9ý0/M€ršì]\mRR]/Ä0ìK½8H{˜ÓáïeðG:iêƒÔå´É@¸˜§Fc«Å0ΖnŠ U&†/²õÛ×”y "È”‘LjhüÆ8œKJà¥Îýý.8û='ddd@€É`sI/ØãwdmóE%÷ºàXŠNü§ Çx%¶·xRDe¡›o.çìMž‰ · »wq£ÙÐbÔ.ð¸^gïmºˆ+¢0VT.J Ióô=²LP£áß(±EQ'ÛÉ~ó8ÙZ0Q§ËÖ„V:Ô\u×/8@ÕÆ`Â6’"Ð1‰GÏýFÓ3A¶Õ±s'à$…Ó@2.´ «Êhru®¿è"‚þšÌƒ™ÜŽaæÍŠnÛ*}Ú’|àéˆTÇî ¬|"ú¹še3µÜÃëRæê,²µÁgA%×0x˜µÕ`²C:lÅÊ~õÌhó)(¶ÑãTU FÈ#ù6Ò°Èiª« ,0 ÔE¼ÄÁ±²o¬Þ=(ü™Ü[îoš¾rèu$Z½7²è’]ò€(ʛϾµÏeJu.R¸è×°°Õ¹.,šº¤aÒ“ÞÉ–—Õ&JT ¡_ˆ¾é=î¹ÃØäCúˆ•¸ƒ×ð^¤Õ0Ât@댵¦“ƒ"‘(’±Æ7ªŸ·/iãÆLªzã~c¼Þ%àýJtL–6¹ëM\úG¿m÷ïÅíÓ×jüÖ¸ïÄ ÀÓ/ ¯RôÎÐÓâdËG{’ŸÐ†ªLæ(Ùåe¢gl®¢"BÝû«K$ØÄÓÐv†Òê7;¥^ÛZÐCdª¬Öì%­vÕµ3LaÏÞÑÊÐÚÁGH`‹”ú¿¼gf ¡¡F½»°nÐÑáuë3ä—Âl°ÀocϵuŠ„ïR*g^³—œn:|A‰%¼g9YZ¾Ê’™gx¤e*aȨnˆâµ›Õo¸}Y9ÝLÊ  n§\R%d>¿_ÐÃÁd–:¤­Éëþ "< ý6àgØÆëg1L)<Ž÷׳–WGà‹K¸è•9H8Â+ʼ0KVbœÂŸë„‚-Îò*Ažú)Üp" CpjH€æ–Ô´“‰Ì‡ðYª¸ 8íT)}”¯J9³5ûäÒ¦ÀŽ-WÆXn‘'^Ëçr¶u³U$¡{{/}Õ 8œ/pý)¹9d<Êdæ-ÌíÓ¢LfÈw|ùOÊœ«Y6Kyg!OXERÎ9¼Ú©$¥1–dN+U36ë1TèíB׉ îyÉ4ðñ/GÏ¢°Ð…ÝÁݳ¼Þ‰ _¹Œ\o¥p*ØZJ»ˆX𵂻VºÀ´rä1¦€‡Ç£h¤ºbO^ìoé9í¥_ÚÆ1‰%R®0^•Öb‚[ܲ„1=0šHÛFìPÎÁ¬tEv”JgdñŒ<•}{Ô¨nßNþcBõö›¡¡Ï’HÜVAtWöœ"žïöé—ˆ–b …8^nÑÓ4ÐÖcRkd‹âàa‰Ásl‹¤-W.É2N©ç½Î•Ú.“´5÷ó«Ãtí~ÀˆyŽRÒçØkîºH†¼µz6Íf™éØõ ͶⶭËö€ÕÏ& ¸Ôhú—¾·ïÀˆAáô!sG¬¤¾s<кK\;Š Û.Kw øÒÓ £Ú€$D~¦ö™EŸ9Òy½(‡â,Âm²Wƒ^—L©¬¹ðîJYg÷ ¢=úA ©2œþ"˜9 ýÉØrêüz¯^3M;ƒ¾“Ã[ͦéð!ÁjqöýÍ’Î-ÃS!(PÚ&±ÙHŸ¬=ÏÛYÇ«i%0T= œ|çŽ5¸w¤×¤Å7ZîÚ7IÙ±/•E|–Y†dÉ€Oì§o8ç·¶{óy¿¹ÃWá@}4èGWÌ>įüOŠæØÁöOIʽV”èÕVÚ¡â9ká­ò\¨]ƒ,‰²æ=px •4ÊŸ§áù}¿ñÖlÉívŸWð l›±‰‰º°˜­\oý­dUÙeóÌŽrˆËÁi ,ø¹‰(#"…Á“ 0 «œzÑÂo™þ𘔴Ô{SAx6CæÐ&W²“*`+öWÓ¿L\,«‡1ôV±V•7—ÿÏÀ‹)ÜV~ÕX¶[ײ}k9!Nœ#bZl[cÑk ƾ¤c÷z£,íH‰3¦–àRÿÙ(¼­&‰@²‹ˆGR=G<€Df&Ê…ùÃâÖÆN$9\ŒDPj’Ú›t"ækw"8 5(ÙWÛ× ¯­‘çxïÕ9÷Áÿ˜~¯ â°Þ bf*äTrØe¸ë·gd+8ªO†Ì1nIß.ÝÝ%—r¹¥¿¤Ÿî1–ï¦ F6š ÜÕ y'‘¾ª¾¾bóÐéÅBgìÿÀ¨3Tu /Òˆ²ë9û[È*‡Ÿâšd¥˜Û.+†=!fNŸ@d¡;”ÓÕõm ùdÔLøœ¯EBÕÛ•¤ó­¦vpÇš;¤ð(ðSUßóÇLöS¸¿hDg¹bÔ/úµT‡_³eפBN-Ÿ4¸¥È Çe,\ár”Uœ&ú¥·u«ÄOzç+y)ï{"_οu¢7 Û¨oÌwN^¶1vpjåÖ›±ès¥-jýï&µ˜7íý!ÿ'>t %A#+Â’&ðôီ;• NP©Ñ'õWyz-%ü™ü0ü_’[¹Gf3aÔw77 ÕVÍê4; Òè$]J–/-‹[•ög«zõO?ia½€ÁmûæÂ%“:nÌs—ç·_Á¿þžÜì€iž|¸Ç;?kÉõ0äù)ææZ8n÷õWœÔ>‡sF –ælþÑ/ô¥]èóÑŽY]¼óC`Åy²¦}¡ÏsV‘ó«ÐSÏAíÁ{Zåï¹ydIš— U”—›½UŒ™œdY¦ÄëýÐþÁÿù÷î|GÊM¯F«àŸåjø ”-/DÏf~ü¨ üûĦ(VF”YøS~Z•ð˜‡òuÞ°'ºõ¼`.ÝŸ°ˆc¶’ôáC*¼|Ö¸HÚMb]""ŠáÏò@qþ–K„Êiòâ šâE¯?Ïj{¯”³gÓ%§ô«<ä æ“`È Ú›¡Ýã;Lõ™R´.^,޳ ”P¢>k=Ī^÷ )l€ßx(5Éÿ&mª̇ÉëàáèZbòmœqé|¿ ‚G‰‡Pñ ù¦oßX\¤ÀãH gÍK¦´s¡•ï&Åk š^<]îl€ù•ÈH¶•jLÑÊrsÐ^Í Û¹Ð4e€ ïË~?üeæ5ôÙD¯¤]¬äýCFš²´u\Ó/W âž??9ÛÐàbL@cÛO°5™êĬs<.@•¹…ÆZ…qPŸcÖš›–ß§Œ¨=oÚ¬J·ybDM+Ç7±KÏ5‚V÷†®1'†Œ ,ÐîåEÉ-ô*{å$±ºJ‹G êV(®’Xî¤Ì¹ hÙLŒK"¸m£~ˆcz,*ÌbOšv”ë,®Ím¾ l£Ñ[Ïg‡\fBѱ Õ¬.ÒëËë€ ™9b?wžÁÒ2ðn+×ëMãæ· óìED¸ ðÛËy±´-d¿ Õ›mؤjä^é›Ðo#3Ây 1Q”Z rÉ/Ïï;Y—¯¡šÞœ3DõZI÷bP¨”ït»ÅªI•ÆŸÍÒd¼„P­Lûþ² *c6ÐF¢÷ÑÁËtxª¾>ggY³n·‹ÿ¹®.â  L .«S^ÓeïœOw¯?š­ž—Ô!5y)7B šøgU¨]R˜5†à?áÕÓ&»¶÷²/߇9,É”ž `6jÐõ·ÎlæØA)Sš­Ê€zÛý#ügÿ‡wtŹìYaåzQË[Îöøõîaº‰þÕe˜á;ÇQ)psNFxWdzýÞ‡wãeÂF«0‡< Ô°aYrMS¾ÆÓ±wÌ zX÷0qÝx8ÊUÍ…Î4éµa8\:@™†é‹Œî³G”W‘˜£ýÉLÜYÞfÅ`¶ÎJ- š Æ«zõ/ç;ˆ—Ç»zƒÏ«¼“÷3ÿ“Îî¡¥'\Ì O¨šp +ó˜,œËZcW‹×:wV'ÔMâE¬2ÖŽ}fçÅ€ü9Uáéf÷Yµ霉,.ƒÝò )â£P€)  ÒR@{³›‰d}«°" ¤ã· Ÿ#ŒhÆÈ÷E9_+P´V‰‹`4e©èF+‡p”ƒÔ¸0û¾›~=£mÁyÌ›úW½Š$0hË‘%w¹?;/ä.NSÐÊ/°ò0Ž\qçâ|ÄöDC`TœîìÆP Éhìä[°íu=Îb`54¥š§‚Éxð•ÿè_†Èªe\Õ£‘Èר›O™­’kªê¸Ø~àIÐJõD͹FÀ}(õv¯_ÞñÒE•FÈãªX _­Sß5p.rA—n¶¼«õ¡Ð༳ÄRÄ¥@Õßû~wƒgL6×@e.tÀî3Op¼¯bü$Q,’,KjñøW)Н¾šðeIC|my’;§#!µ'® ¬àfÈj–·ö”p*ìc®,R‰ Y3ÝÒ"K^óŽÃÓ{àÙ¾ÒÔ`å¸x1ßL ’z†^˜þöï’GñYû XbÄØßZZïAT½l™”7¤Ù n¾VR'à uwnBº@O›*À›ó772„¦«Â¯>5‡,F…‹ò¥á:” 5Ïd˜öI¨09žÚ'L¡È,©-‹¹E-qñ¾ öùaäòÆl!bÛ“uA|cFÉ}‰"=Bá!¸ìg>ÙÙoh\Íõ¶­©m¡ äî{Ö°ã+êo‡OƬ·e|Èö, ;ì’€YFmÞ;™7UúÇ%t>¨3r´óÆO¯Qf±¶ÜqvÞ¬·€U©wD?⼞åį¼ƒöÄ­ y±0Azb“´xս詥aPe ìºâ/lBábþÜNq•ï±§Ðgµ¡>rà>”¹+}ÍûÇ’7 \éBGŸµn‹káU¿eîð©ø¥Šס»[„å`‘}ŽÛ™hÏsÜâQ6®È7 ñŽÐ#9V`X{…A$*À{é®Ä™f<–@T }Á°ðÚƒ¢1»!ðï$߃(O«ª],Ëh¦. ?$/¡` @q“…qDÕ;}óåk/9ÉÌWH¹í#˜Ù±^‰ýÅOÛÞ•Ý>ž*7<™ÆËúîMøúE]Ò³ÕÒ® Á#Õ–•¶ý¬Ç?gÀ­à 0‹kÄPf:4t§^>Ò±ÜÊ£ké²J¯‹`KøÃàˆ°o[&ÐLÊV«wì’ï·m â­,‘ )BÚz/— /p›\á¤3zƒ®çµ°‘e˜¿¦6özøÄlêeScíÒc:>xÓª#²X2ÿå îCž©hÊþ†©)ø2¦M´ŸøãÕHVéKÖéùNEøïpÞò!löH¼â"ò;eÚ; YÓˆë"N8´Ã¯1=¤×¢UŽÅ߸e•—gƅа§,M5”$vGÒw&‚ÓXû–ÔpfÛÇ´O Š `aÏ,û‚ÿ{o`[–5‹¾J%Æ÷òË“¾©âŸj⌜úV÷Zk¦µ#¥ý¿d<†ç&#îɼ®4‚¶:Ew¯’`Ì =A7èÒ‘DÍ®À­LNˆM¿.`°V{çËÀÓ55ÔßK¢/ʦÐJØw Ήóétó¡íf‰¿ök,R£ò±;Ö!Ó½ž1WÞzZᢅfåÝóH1ñÝòã¼çÜu¼(X•/Vp}#ðs} r&à‰£žGü$ÖóæÅþ´`ò³„ZûZ­zÉæÒÞÍ3!¾(‡d—h³ý9¨|šš4Š™fpß{Ýš ”—x%AÜÐÖ`Ydgbceø@çÞ»«ŸÃ_olÀß¼*ºEF¬7òGP†K¦¼éŠ JP~0&=S yØ üFç~}­yVGF~_%uŠ*,z¸áAEç ü×­%_±ÑÐUkíÁ¿F$óeEÖ7aìŽã¥Ô~¡'qÒ² ±ÇÃLü:\¤±,Ÿ˜â~_„é*ÂÇs»”H_÷ÿJŸtËñ”uëc?·1££@G×ìÍÞ.Bz¹(èYEªòc×Ý=â6¦p]p ¤ÃoΔS yø¥óÐBíלt*Bv)G‰–lkðW¾F"]Gáž'êÕâ‹=âBHóŒé›kæ%â¿>¹Œ6frŠxh_mLr¼<Ðê<!Ðs<\4-á- T³H8„ º½B;*àíÇ&i1âMîËyÊ@óÍZZú¹=ײÿØõêÞàY™{ã¹øÛ2 …>NŸ\Ìš>̹B8#X c>F¦­rOǸ-3¶Ê‰€ ̧aé,JæÍ öz‰éz 羬.˜ÆN±xôf“¿Oz£ˆÓxIž·™zTÔÒzem×òhA"¡šÅW2Š6.ôž@€KvD[U°ºë"h,û¹ÊŽŒ{Ö°jý¬òóÍ¢‹^¿øMÐøê¾Ýa¿YÖ43§ž»s´X`.¾ë86-®ÙžA*ËF©ù"ųv›¸q3†F޼áÉ‚vaÉ™Ýz¿^ iÄDVáf·ZÜBJçrJ‹ª˜¤[µ/4àcXštxxûWŸ@ÉÙÝü©V£ž>L¶H· —ó|u$¦:tÚ$YµM€uÜ9ø^Ú»Ø÷]D¸…²” ´a}ç÷ÿ]£ÄúTG”è*«³o!cD4–´ÈG:fìAŸåœãŒ7Ö,®B.. T«²|srB×Ïâa?{i‚X*3Jjn³¥"&,Â^#b5*Šæ%Íâ;ƒ®j³$9õ>:ßÁÂᑲjò7Š—˜!¹É¦ÊJŠDXÿÝäêT™ïæ|0¿zxNá!È™PZnIAfjµœÿ̃óë”·Yv­±Feõ¡Ž·ƒpà³ã2 ¼îÄh¶³[Ï·¾ 4Z«@œ©vÚ‡ó÷¸“£¶?$4ñb}9„å3â'i+ oWéH›ß‘‘ºAÍÔˆc7'‚ч?£ST5C²Oñ'Ñ)!Þ£9bÃÌyþ᫦t÷Á»MËᒠͪD!øì\@uKtÉõÓ;h1{E« 3BžÂμ8ánnŽº*>+%Þ;¶dQµ^B!Vðþå¥6BŒSô€¢ Øë íË„øP`¼´K=ή‚´ c!B¼ÄÊÕ:žþY> ` >b¢£íŸáœë‹i\Æü"I3!úÉ:Šæ¾Ä1Wìó•ai §Íõ¥’Tò*ðÏ0¨u^÷¤bQ¾A E Ñgkš—ñÄ{ðˆ 4ÝKzÿ£â»ÇÉò¤Ë*鎹§*Å Kð£|k`ÌÆet ý@9<Õ `,À³ø  ¶F8Ú«Ü_᪦ЩCíó#©j&¯¯põ6èBr¹ki ­˜[”Áfi;§§+îÕ§·“ɧò%&šÉØm<ƒ=q;+]Íù¿ ‹:iÅg–’éêÔëï0к©NC½z¹X„¢L#5¢GјG/¶„aí€üÁÚïÎ7¯kc·ïeQQ MÒÊöË6šÉ$Áq³ãi-¶,7?Žë¦÷šÚ°æWBAUqí?ó€¶<™ae8<ºsßPÿêå6<®$M]?ÌàO)Ê\Â•ÆÍæœ'Uÿ×péBæXÂsB7æëN <+šáãµ*ø¤) s`T|ó–.Óá &ãìÛB]dÞ‰ün&ñ®A›Ñ>–u.aCgVÆZ?*ï`{þJTÒ¿«8r;±µ2¼éDßd8¹‘x8Œ¥ðË#ª®­¢Î%>UŠ·5‹?Ó”T‘’–¹ùr+°f?~ï´jg—T6Ê’Ú€ƒg÷øÖAá.©9„ôïùvÚÝcJiÀPÇá'†r¯M,ÿZŠ×‘Ž ½Ÿ+Økàê Ö ¼‘©9ì#ÚYAUíØi_ÈB’¡EðÐ,¥g{åâÞ±ž+B¶>^ËØ¥­Q–r²ZjÑ?>Þ’rÄÄ_AkÖ…ª„:ëö # ÿ\6QoC„øî·LÑ oP4–è÷ƒ&ƒIØ©RŽUÔ¯4Þ0=ÓGëÖ´ÅQa-™£ð¸ \.ŽŠ]âuÞI³v‰m>ÙIlvAÝéx,\—Ùo’ߣgW¿èÑ.Ù0R*{©­£šˆXôd±¯ú¥êëÄq%úÄ ò0Áô¶Ar»[‹Õ½»MZ—O/~g&·µ((4ïÔ‹YÈÏSû@¸øAš:kœBO{\®ìû»¤çh‡žTÄå1Æ8€æ:´Ë·1{!_@& ª p š7›ÚÛÏiý¨ –Ìxˆ`ù;½½®¢q=âI0±,ºm2¤¿B¿òâ—+wIÀm‘ ¾H3QfKPÀœÇ *ªzš¥¿"°íî{'¥^ Rù„¾Ì$3mk}·ÛbsN6„4Œž{³w2&Ü™8Ú‘Jп š0ØAkµô –ÍMwÆÔ¦k^×ýªé z7™‹·Dž±ª6ÿÐ*]›hÙÆÛÔº‹‰ÝqÀ i±æËž8~bŠñלsšã—wKk¸DÕC±UëJÞ/&ü’«©|£ÀˆsÎD?*qÕÉøH ŽHïXëÊøpB9FΦ­3__°P¹^­ªÁÖ(’¬pŸ³<á… ñ±UvÙz®a´:ÙxY 0íš.Ë4v!®:ö/Ꞁãb•a±kH’MÆœt]‘ãÃúÀ‡­¸¯kWôÚ9\ýÈ(?”Ð' 7Ms\T›M„JÍÅ;XËT’ß> a>}GÑÿž.:øI‡™È¿5;SS‹5Þ:W±'¾ÝLßÔgWÓy„ŸE˜.%«_΃ÆìZ*ÈÌ‚ìÊ7SþÌ¢ø‚†1[x²4{ÞE™áæìÕ§èºbFjW{<«‚¯f]ƒÛ'ÂõZTµ[fbYÆÀ;?ÒHšü…$k@,°¯“âi†ÐgGrfdc“ÜÜB´÷ý…›¬¿±y­•¬`ÀýUœeCÙq>aIØÈ¯]é‹r BE¬>y5mƒ…ðÕ‰Õ$´à%îîÇX˜Õì‚‚w,c„Eœùb¤>õèÄ“!¸¾B/›l‡YwúÙ;åÔù¹n¯&Ÿ ¬²=Þ pllý“šê0™2©•ÁœœÖ±MDcÒ0REÜKý@J1 Zð®ûø…<¼à2T¦Ø.É):iÆ*É;Ëîk’HGå l!WåØBC¶Îék»Ò´€(’÷«PñȸË@Õ`éäÔþëmw¼Z1jΣ®-?Þº ðõw¦Û×Jsä H; _5*aKpm'„骺wn—w¶ùþƒ’ü› JRE˜)ÂíZ•ZýËâì+Æ3iCÚW`Ó€“!jä1XÄÝ’SÆÕtòuh7[·,»c š2‡¡æecÔg†HÞ4˜ºÖæ’ÄÃ85Ї&Åxá_Л‹u¬³´>KN|wÉ¡NCˆPQl@G×o6 ˆqtJÍì_83J¾3G}•|¾\ uõ…2ÇE0"ËX`夕^z'Z#»kEfÉÒ+ŒÛ%d—¶&Lj¦¯1(Еņn`.³ åö^SØYí¶ȬMf ‚X?Ê‹¦Eù(ûÁî3^“U P,¸Ê–s×QõC661×ʹg«Yã7ð8èþl®Ó}åÅ–Æ·¿cVð§‡)C}ëÏ𰓘nÇÛâ•€uƒ_õákÃd;kŽSî‹swé"Snõ'@Ò”0Æž~0°g¾ ù{[7H…”•2O5Î%ù&Š*ô"t²[•Eú³Iba \o¶ U¾Õ– £ïLðKĦ9‚`V—*Ž•èQÏÙìErõ@3>±úÄÛCчjüz¿!SÏP]Säð3u{vöàÉ?ë¼ueeê@… êhƒÄ½iŒ),û¾ë=+°y›l¤»ü6TPx=*QÒ!ˆ@ÄÛ)e˜3Žv–DÝ(ìÍtAð÷xÉŸ€†èNÁƲQâÔá,Ãù4ÈÏú¨ ¯>mlk¡á\¯:ñƒ—H> hÊ-¸H:©0ú¦ËD’öè‡ÿ[‚Í4ó~ŽDÇOJœ2ox*F$"YGAb[æÃÊZžå€JyÏÙ.¯‹qÊU“ñBO?Üôòç˜b •ðSB«Üã´£iGÍæ:žõSÕSMEó$Þa)b?¿Nð·˜;JŒKú’#³Ê]ýÕ‡S¨¿'CòÃb¹¿JZî[9òB×I$¶œÆ¢·÷—,¸ ? Ê`/Rƒæì—s¹l`8É©Áг'Ó²ÕÕº±a‚Ìú+(Uuâ˜T£7ØçÍxaö)bú¸yYž­“¦ð¢ÿ¨z 0¼²I‰ÝQEáÜôÏÚ&/Þ‡C~lô+v‘dŠû±ÿ䃵—¨ÁLŒ-öˆHÏxë¡N͵¼ŽVË Üøž†‚ÏW\mî˜òÞCOò 8Ý}XIbŽÀþd›û_rÓÿBhØäÆ¢CS+1mŸT„¿NòzëÀt­ö”ää†B&›®àŠÜÏ489¬Î°¥vø >µXØývû"$ ›µ«c$ÐÁîAš§ŸJ“LÑQ¶F¸}¿ýܧ5¢HÍⵇ~ƒ Q i¹#_Õç ‰Ð^QØW).OGºÒû®.n5Ôëž- @µV|J™qór‰LÈ!&ÚæúKÍxàkg½~ )xÌØA‰*ÀZâ)^MkwÀW«i2¥Ô%e²Ý³Ó~¢qúWK» 4[wÅCÌ⊮¹OîÎ1ùbšç cuBJ´“o{,%©°cûŒ+|Â<(»ªð¼}á@þUY‡(Ëj¹à9Ûö}¬æ£ý-`õ¨{@îéÈR8¨+CÓÀ$ †y Oû¶¸áöi"þøQ™a çfdú„ܨ@ëkúÎFáÎÞ ÿ‰åM/_Ÿ5+Ðëhårçd½A0X*÷ZÓ»†ç¹”M3Ÿ¤—OÌ/Ä~•o±4Y/{ýñPªéîÆ))Í<2fÓBƒO]²}Ì‘ÜX/A¦ÇôtëÙ›kÌBhâçÜêÖ x0µfR'EûÓʤ{f°VТ¸¶__âYí_‘ð°Pæ«líveÚÀyQÚ»=RÅdÊò_ˆiÖSÄD.½‹± Ä€ _Ú«>W4Ô ¤S%¬Ë ¾ œÍŒLÓ•¨«‡]d…ã^(éRO1° ‘ÆZ’¤þt˜Ã{ ¥@ y€X,ýØŠsPÁ%dM¹Šsz-!(€*%è5O3…}ÙÏ'™*߈¹¦+Ï )V´ÔB­O{*V; ô¹Ã¹k0Ÿ/³È ‰z‰ªZ{ÿÈTáØˆ<}øTÏÄÈS<¨b›æ^OŰ3¾×Ì|ðÊVÊÒóÅÙØÉŠi.j/×Sµ±êzžö÷ëòW¿þl¥„LµöB—[Få~$U‡Ù ?»f\ræ/J5º²å¢¶Ì¤ó2Ûm% v.Ãü5#…;„é[U¬ÓÂñù&v1ƒ„~Ÿ$RZ)xÉ>¼Va:˜_öë5Ó¡nŒgpÓ™#TÜØu @é ·j–¢kH‘Wéhâ:_C*Öêš¶ T°nJX+B¸ß<ÜÓð;2S}f†—;³ —†#6ÂMûVÂçKüe¦î*ÂÉ{«õ'Àóy{+Ä®“¸¯0Qræèßy ·zm…½z:\ÐÃmï·³"„µ7¡ü†ì½¨ÑD=“ËA¹ýµuXˆ©ÓL¦GKžëK•±y?ûCÕl•°ß„‡êYøO¤%ɘOS&ñôáw&¨<³ë—EJŠï)üµ‹­"biDš N†OSvÙ`qâÈ}3ã ý?Õ¨‰—s±OÛ>Ö/NÀIŠèŽþ ¯…T4:>Ôi¬Ã˜¤k¬‰4ƒ0’:£¸\YMÈÕ¦AºÑ–”¿¸Êó‹ü!:^ôg¶ùc8&¼ £ôV­M¾øÝ멼<ö½kÕƒ^-ÙuzÀ?!vÄ`ò±ÜLÿÚ?ùb•™Èj4]Ç(´ž¿á'º2Žss_Ò|©3?`íüÀ_.cñ`ÜàPœSRŠà8Ïl»“u³ÔOû…ÂŒÇ ¢x± ýÍ,¹/Û¸p“5²`y9¡3Ý91ϳI Lå48]Ýd—éb/ÐÊ IŽ[¡º3)´ &¶«Ë—R­‡®Z›úŠÒ ÙÒà¬d;Š:š®—äŠÔÄŽX‰våmÛP¬MeÜùò ¶.ÓG"ùë$m‰¬ó2rȰÀ•kÊèÁü¸›`KÖ””ˆ|jò 8Á±‰üLrµ)–3$µ%úH^¯ª¬#! NÛþF«bTs¼Ì"–0ÕçŸÁ=ƒ‘b‡X#r1{üY—™šʾZ[ÛšÔ'ÀMµmµ9PlŒwŽæòÏ<ùˆ‹¿úŠuÿW¢‡ª8¤{œÓµl/±±0‹òl'of;5¼ê/žž¯Áó!24Åë²uK »@ÆJ†q+F¢}fÜÓTTØæ¿ ¬:3‰”%õl7*ªs¿½&7UûðÖ«±±ÔëÎi©éŧsU ÝÔðx~©{}Eº;Â[«J‚8°‡kifÍ‚%K|,Œ.G¨ (æÇ½ ¯[éè×g6¹þU”v–kÁTscÛB£‰¨žÏœ…X­ °åí%HÀ¤c†™æ€®#êÁMeßȾ¾Ð¡weó*îÙŽˆžŸ”he±¢¦'?dr×ofÒoøßãyÚri˜§‰ëkõ·*ñqì)`Í»xô½ÑÀ×=ÔånÄeí¨Z9Ç~ÀY¹Ðµ°:™å1EÔfhع°ªgr(_ õݽÂê…20fýuÄW¤Åö¬Åë¯þSú¶Øjȸ=~½zIÍQy}`µZƒ^ðAƧfQëA(W© –Äùª[Ì 2†7¹M”@gÍ×RC†Né`Ûø¯¬ uPÎÀUM¾Bf¤Åù2Õ Užú2ó<©N±ÕP‡‹ñ•2lñ‘}Z‹DEsÛ¥ŽQL]!Yj[µµm>K{‰ *jQ÷§ÎqÓÌ~-k.õñtP9ëïÅìåϤôýèIºmÔjÑÇòA¹#Ó7µàߌ|n\z†!ù„üæ 9cî¼¹<³™KâOØÎœgƒ]Gñ0?ÏvC™¼Ÿk ˜ÉC¾ûظ2¡nм»Øh§W\ƒkÛ•W>Gx÷s0kW+ü¯nì¶~|H ¶å£ßNxwŠ­#âUÜ)àX…Lë÷±?ÕÓsÍ· 2h70…€Í—û&)ÏòfÍ:M˜)eƒéL•·ŸÍîKê¿ â˜ÃÇæúž¸“õX¿cÝ’–ãȯ‰Ã$×m"i×i•÷ã1.øÒƒågh¤Àa9ìi &‘/©ŒA÷Ï©öõ™Øoéq8àaÆœs·8o’Eþ© öéæP_¢¯%à닸dqÏȆM,ßM(1ý¿É$ÌèìñÉ Bègón62ô³–ëÞUÑúÖ§¦ýQ±ÈYšûį¶!x_j˨¿®I-‹¤¶(ħ¿ƒ%–ô¹l¥ØU9»ndLq¶A­°te<Ósvh‹eÇäaÃùUÙ[£~Cd>ZexÀÕ©Bó<® ïá'°ØÁ ÜOL~lOW?P©Ñ ÍölTÙ£#˜}¶6é@¼ü´øç áäS8D@(¥J¢pu*3ÈÄ£½ªK9óì›`Õ3È€8’›¦‡+rÛÍtå+àD{ "[—múŽ}B±f9íE>£¢[bS/r’œ…ì6ÎbSöF·Äú¹ýøî]çžBy)iÈqÇ'þÌE61(¹‡ºàz“t1FJ6^âÅ3¡RÅœ…Éc¯tN]ç׆}o{¦˜õ–}^4ÎP´ÁVhƒ ­‰MZŒ^ŒzyøÍ6œ $,O;éd#òµž^é÷ç|æ³ÊŠ‚~Âöý©Ç9è`T’"»×Âdé†Öuüo<¯ÀG‹8°ÓyšuS{;zÛVN’_xCf+£ÿ •]_XÉÖ?™{rE½€‰ÌŸÁZk§ÝcêžOþudP_ žŽŸl,g¾Šx¸ˆul÷©ó/Ö|¼%n& AQÙE¼€0¯¶¡{8½çpÞX“hÖLá×è/Bë²×foÕï¸Te+±Érzµ$›DP®£·Y*ñ)E×´lªH±ºPËÿGËc‹q“6Çíˆ%ѧzVù;<ï¾6¿Ûš‡ÅpöFµŽ×ÑbÿÒ(þq­3a·ŠÑã~– [-B¤Ñz%§7“R:˜{¹/ëŒSå$ “u#OIL‘`Òœ ¦É{Ê·‰(“UßÖdÝ.8H”µ$¤ÈTH(ê:ßtï?afÛ¤ þ©¯3;bQcFÆ/ˆŸÖ2Ãåä l Fö¢ØP)Ͻ>G¯Ÿå&h¹w¯[_ªó¹ÿIªŠ–cŒˆâS·j#ƒ"è†×GÊX·ß±6¥.&÷¬XÈD>a(/§+~}ÃETô—,Õùé­ÍCFy9ìúg z®hF'd +¯Ñ™Oâ8x÷Âë·5š9¾Ë’¹WÅ‘C6‡ì‹ý{º )ZÈoŒÈ×÷â{§Â"•£)vÛ¶´©Y®DÑÓ4 C?L4½Á"£UùìëuÜ}yèð‚¡Ï‹y© .ôôáâ¹Èæ É,”rÿ¬ï^çâçcW?òÉåÿW®lÇ=š€u—~„ó'œ“ÞæÄ?ƒZ"Á<|êtðlw?·@ÕËo‰®òBÄïÒÂ4‹Jz%ªLŸgzÎÓÌ^n €±Iª ¯Ò ’s7ó•60ôô? âZ ÞÂF‹,-ýØ/ü멉!ÿûýk‰íÿ ‘“3Ú‘Y6I…V@¡ŒæOÈɆÍq ~„Щ³»7¬3 EHžMd1Œåzz¨èŽïBÞXÕ¯Úø›ÖÄ€ëÕ“¶±ù­3öÎß× =µ6²«uû)|ˆÍ»€BAË낌݂Ө¼¢ë†-ê$„zÄkà™IBV$T+“+2o.s“\~Cpëý‡e óšf²KrLF†ê¿.à¹Ó×éüUptû†AØ#xøtê1É"ɺØ1cõUÐò윽¹PS^8~‹AÍùFîe÷Þ¦ µû f® ×=ãì×=0IKz†åùy]ÍÓŽà2A>RØÊd"f¼¤aG¦Ð=ç·‹‚‰A  Ø.½yMçäVt£‚q‚âí‘d¢>Ë»ûSŸ¯”Õó<óïi…¬YÏnaŸ‡ ÌS½þÛÞÓênë 1yËsBdcdŠƒ‰Ó)Ilf1ÀÏ¥d‹·¼•»Ô8ÿe¦HˆuçÉ)[Z•¥³=¬Cü?®Ó/ZGl¾à» á:CœƒQˆ4ß©)÷b³‘Fm+MÁdb7ƒ”PˆÖù…¬¤6’vYekÔÙRˆ–r`ƒ½.à\$ÂEhÕìf¯ýlÆÅu±”·˜÷Á°þ(áu3¢;5ûqù¡óíŠ8³L+ÜYZbkõ?³§kœçÒ3œ@Ê‚¦˜å1 ´¡ÄÄh**ÿÐVS’b>òávwZŠ_ç§vwÉC›…(ÀÜ¡›‘Ó;Q-GxòÏóy™N¬dvvÜ¢­ úyÌuYÈ礤=MþÏÃ3é9’‹½¨Ã}¥i¿Pî.#ÿ¸Hz¦&±+ÚÆI Í0"§ Ê<(äK’rÅ,C¶N¬¦Ä¾vT+OsÃ*¬é\&׿¿ ¤á¯ÔÅýaÚ—>¢õxZd;°dmÙ†XëÐÓrẩAkíʱz‡Þº+ãZæð<³¾šYô}ìä˜lÛÙç¬.˜¤X‹†7k\Ùhæ²)ÊR¤„M~í79/âÁsh‡ì` ]ì Œi]ÙÃ1û5G€ZM½(·ÒðÑì$%ÃJI”^i•îŒMVØ3`$ÑV)Gf»s­L‚E¦-9'1‹ØyÝ·µ‚_Ia¨ä÷#‰×¹q‹ ålS°FÌèÓœø4OBe]dŽl¬“¥°Ç€Õ?V^æ¬Ùe)¤6é¸<›ã¦=ù×ôê tF‚ëuµÇýJ`3ߤ „=éÊ{®ˆê{®2ÒîÑpÚ2GdH{,¹r!Ó2Îk¶º˜a8Ý'm©¬~…Ëä­oðõÖÎfÛEûg[oËr{ÊìÍdg-ŽzäE¨ƒ ¹Ñ™È•YX¦Þ l*Œš7£‚—Ÿß6 ¹ñ.diÿ4÷:’€=(n“ëœöeýÃŒ×ÈýÏú'ÜèR”’(•I%2Ú„êCÃØ”秸æjÅUœÄI”û>ˆUÖx¿¥ü–úe¶IÍ<²ÜÉ[Oú7I {Éy¦+.éÄÈVnÞ}.Zo`¡ê#5QÐ"ÝÇãö*-žÿ×ò?£;õN Ì&GÍJ†¬œaðÁødoµÿ?uúÂ)烾.gÿø}-™Y’l‰)šÇ#ª¨CHÿðݬý•´ {±iøuðàD—8‰6Yüý2P63_“;ŒAuÔ ‚hÃn“Ï©1áJn/m¾B_5…x]`omVõ¢í©¿6 2'ÚxþÀ0•ÒÑœÞ km 8^ãŸox´Cöð§Qµ’ ¤…¸»_S QMAj²üdº¸Ò?1ÄðƒMYkD(ÅHó;P¾Sém…6QÖh“§á¸ðÒ¸"u:0æ}¡&3I/*ÔëÒþï†KzeÝ*ûïþ¤&÷?S8I±zŸ¸–%`&\~¦+ØßÚ+æLôæ°&Øc©ýU7 Ý`ãY^]²+h›¤ìõJøŽ‚2GîÆíy9Ü×?[!Ùþhó˨C?ü*;ù!,HÆ÷þßÒOöƒ|ª¿zD2‘Ê •\êWOAI€ v §N” Ë«ä Då!3ARô6'/óéå Ïä$eGY8k‹þ¿²ïû3ņD\'ë\ÅW"&Ó£²þfÚ6j H±k #bÓßÀ–:ÚQ²DÖnGNl”Ú´ç“WÓ`ÕgÒ ó§ºÈ5¬Ážõ‚€óS¤„Ñ[§Ä (Ü4u“c(lÉB³É±AbÁ²:ìRmMdÀ %l2.+;}Þ2­å²7,HœÓ¥Û·6×s‘q!¹ÔˈWH{Ý>褧<-w$&îå£q'ÈéÍ~t(D%§&´·¼p°óu×­úTõ^*07'åRÖÝ÷K‹MÛÖX×ÿ<‹×Å¢3,cD"º–[gÖTÛ&2;ñשË@ÌÇÕhÎhNœ‘5.ôW€¢{‡2¸•gbüÝâK3Æ …^]ÛZiP1›y.F·ŒS_ȱ溠I eódiîÉ&¼îZ;Hßeka"ØQ_¦•g lµ×ÉÉcäBc1¹nÆ¡¾í¹9FJÔvˆ8ˆA&kÉêßX$ÎÎ cPAŽÌBJTÃ"OUµªÚs’ý/†PG]OT*E©N ü!Ї•ø¥Ï:ÍT±êwÄò N OAnéÂväw©¡­m´mæ#4LЈÁ\ˆ8 xžaàwPQÓhZSotj"‰ÕOS¬‚ еdŸ3¨XÕD=F¬á¬ZÉÅ Z9ãmœ¹9Û3²ô¹­Páˆ@t§V¨¨œ³4sç$ÈhÑÅ<ôUµÑ2,¹«vO¿ OOb3§C¤QÏÊ[¨ôdÇIJ§ïÅpZÏWÉðfØŸH„§ªr/k‹MÏF½–»dÆR™Môž*UäÕÇ$@ËEQ0+T—"—\XÈ õ£€ÕDØw$ë»üñ爄íKE-ÓåðUMQº ŲŸ™l¾o×Ûº} R%=ò›óNècÓœþÈNžÐ_–‹Îw e Ìe(8qƒzà}Êáé\¬ ñ\ñ9A+Ø¥Ïg£›OR‹²yŒMRMÙBíôr)F½—îûÚÆë£=¸cµ:0*‡]_hh¶Ô~‘ S#!Ù€×O_½U+=M~?÷‰wv¯§žø¨=ü˜[;û%¾ÊÚ‰|@¥íL5÷…Ú“š¦†zödpG¢‰ä_Œ¢§˜4~EyI2ˆLÐ ƒHÝ ~ì#;®@Øú8#ZÆÍ¿è>iôŠ»¡"”2P]§ØÐ~Í•\﫜œ÷º’oX4iOxå²ÛÄÆ Zmv³Y¥W鎥'6ýNœ‰=>Ÿ¢ô‡ST7€_"CÕô€µM8²Vô•iÈûó5ol<¶Væ_·ã· à¢4jâAòµ»PçF×$6aš“`*·‰ãŽ J¤ñÐImĽ“›qp5°½'•îáÛr<&¬hö÷èˆÇX«ØfÛÁâ3JÊ|!®ZFÑ‹ÁÁÝ·Úƒkï~¨Hl:ÿñó@¼89^¶>‡n:IWËæx+#ïÙ*`ˆÂE·;ƒ°ÂÜrØâH‹ p×]X©>¯ý;ly'íŸfäþîk<ͤµ9n°v‚ºk!\,çj…_Œ‡-ѹHk´¬¸“c~5J5»‚åÐg >sm rßȯª$ð5S¾MÂÒbTŽ9Îúâgâçf½¹¬An¿‘å »^³~€ÚXxøsyð ï?ù±üyÙ—$Ϭ<б98 u—}ïm܇“(T ûÉŒÕJÝ´ó¥­QW¥4ÃV*nà»|­à;= x%ïù5 tÂg*sÇö¬¤¬C·¾^ û‰\(ƒ—©Ò™ÿÜ…þp.§¶ “u_LYø_}œ•ƒúûÖMåq¢‚Á# Óˉ…˜]/?UÍiÑÔÁ÷­†PA1¥Ûm$…Öªâ=¨Ýs½ 4y„Ÿ‰[W>¼W岯?Ç_¨7“sMæ…®­bÛýÚY§^r–'—þ^9¨NƒQ©é4,¡Hº(ÝÉëQ_ ž¤ˆøÈ4轱ᢠ˜b(W¶RÐZ:ãiM¼ô ¿RÌT‘oÚÊG« ó–O}HZG£Ã,[µD¡{ [Td ˜ïùKP®F F€¡þíüo21£zí<ØNò3NqîÏ –<’\¬Em&‚³ ߢÍåªLRÛcM]ʯѻÖëHJm>'1î·§Ñ-u¸¨Å“eB1çnPòiRßÕG#~´»™„yÃá7;étv$÷¤Û'BÌÏ#TD&Í[KÜ^ÄdÞë4S¾ç°þ”<ß4¹‰ÖY^¿âг­2WO³öƒ/ƒ4üì<-¯H>][ðÖß^F˜Ìc1¸SþtC‹³>ùâìjÝyÂâå–‹ÛŒôp¸›Ñé4q¸M÷¹x¢øŽ$ޤþM›§Ëá6Š»J}­ÞØRðK~†Ž kRµl¯tÁàMð”É1ã<ÐHÛë'ø‚ä%Öê|,h^€u:õ«&ÓxTÏ{’ äPÓbÎü±VH~bÛ@[€:etЏ@ÀÆGremc݈ÔºÙ\]>èHÚp̶Œª\ª}5gÊoçßtjT )ñ>´€¿z9.ÔÛÌ˦;»~ã@óo¬b±@Úº÷¤úNî¨ß2§õ¾¼6ùD‰"|Ö8<±^™ÐæýÓ ~”§@Mnã-Ñ€\æSNã|4é‚Ý ÖÓ)HÓ6û¦Ù½Tþ´?« Á¼ÔÅ;û$_Ö Õ©¯4“yA„&¾‹˜+^ÔDBaê“„}8Ù|B.RÙBAøö.‘vü -&ô>¬©¥°fwá•@w 1%ÿXU »Uö^6yYú=&æÉ1Œš¤:РéúÊ%deÿ\ 8fÞÏ1†ý´9a÷döÕ ‘‘ÉÿÎøÏ£üºìYן™ÎÈO¸àÑ×MѪº.Q5a'“ï&‰$·…Õ¼`}è3ÍGRî#{y9”UžRˆÁÆ~o©‹Âìø0ìlK™mÚÆ{Ƨ —/Ò&“$­üªT%Úï?úÏ«HhêzKBIX;Rû¼(ßH!„s7Ô ×, t|:på•ÛµŽãƒÎÇj6‘/Çx#|f8Ó¢/¤¯ï<v7âÔc! RõPßMy[4JcX Ñ“ƒUÎÏR9'ñ+£ºSÉà_ '|pãV§µ˜€·Žs‚Ø6þb¡Òù‡X€—ötÄ‚¬ÂlÞ8Ì‚6A·aÌ5A¼¤7¯V3®šUâa~iyç'Èî<"À ÎäÈ¡å;qX×Þoú©Ç× œ¤Ñ»J<‡¨YüA »òjÎþÊÍ,b`ÑàCe•|Óö,¾‰èI`õà~mýÉù=é"…ÉUa”ýÆíŒÇ͘-MÆ—µ„Kf5¡Ãe¼‡¾Í98pU êrd…Ò8˜pdmŽ©äÁ‘ÍQ.³Ö>¥ nî †3Co9‰ª~Û@‹êDʸQ±52æÜŸ()ÑkX,ö[¹ÛšëP˜ßËBM qiëMƒhJ¶ÑÌ5niæ¼7¿ð®ÆØ$¬¾­õçÁµìì1T 0\ªÓ'L1tï½éð+nE'¶MÙ ¾Xï ®öê2{‹Á‡ÖBê-¥5æ½És¼„BF´â³Þ€o¥ð3ù–}tئœš×¡ëH$ehÿuoèáÒ´î–'¡ÀÿÛj‹Ì¡ˆÞO—¨…é&ª÷ôA¡pn€é6ˆ×ˆ“]ý(¾zä±{î¿?#Q$(r„^§C©òÏ+7”p¸´ÄŽF§íç;~”Nw dbø\\†}÷Ïpãಉÿä-B÷ia£ý­MîQ}ÕõÓ÷;BYíõïusÏß_‘–Ž’k ä%UbE˱S5£øbç/*M¿S+%y0s·†ÚÖÜlÔô•“„ ›RQÚ(¬÷õç.hÿTZ·Þq÷?Ü ]ÒÆ¡¿ÝÌæ²}Ž’_;ݳRö®f$ò/]hTo–\Úˆ¨g‘?dA²º4¥uÏ &¦-Ý•>WQò:8(Qío•ca„„Âõ2‡ø“O0DÚ©žÆAÐûV}ñ¤/…ãÓ–í«p³zÿËq´V‰LãÒ]d*]Õð­=ÖBxÃ-ÒI¤ðÌ¢/*ä·z%;®–åÆSî ¹D¶°2î2G‚B.Þ›P·ËbC§$ÍPÐw¿Ñ˜W¶º(¡°ª‚ÖÙ*²†'²æy«±¤ ³”üvå[h ­Oÿ™vÜGôÀFá8j¤Ø5g—7-g^+ä-Å&µ8 ø Ì•;ìmЏ9ýö®²Qõr_ò+ëþxX´G“{®i9çþ~Q&hN6Ñ"£¥´Ò.þµÆÝD:§e”˜1ú5 ý›>Ö1k£y?®l©´ì¿¼³^Ï"ÑŸ¦=ð“ca3ÒÎ)´e¶o絇ϯÊõ¶6!9˜5–µÓmOÈäs/÷=µå”SúïØ&ƒ‘ô¦a½(/ëÇ>ŽY½pë5¹Ú“pHiF·Ì$XtdÞ‰\«¥ìG¼Û‰FàtÑv¬¬vMå´5­ŒU@«§Ôt)]ª† Æ Ü„ÁqQH˜ ªLbHÅíâŒÆÕ$qD‚N¶ñÈùïÏt>–Ï ¸êÑT†a6 h¬¬²é̆Kªu>ó¦Þ9Sy"€…ÿø{ú <¨[T|f‡Ðª/•¤˜ÿÝ=6ý MÜ™~З Ѥ0T›!dÚÙ^ n1G3h–àûª˜‡APÚ—~D5Ysà_Œxúy#|´ýÚ¥¦±Üù ½Éf&cv²âºKFÏõâX]zNŸc®ßGd÷H7îĹ0ù™hÍý‹0¬´=RÜvKuµÜ[=5:2ÔÞµ+ôPj”ŽÞãÓÖNb9²LfbØÁêÞäCª‹[ÎŒÉ÷åvg!„ç•™Bù,Ö2ô5ëwR’9 Àà÷¼IëÏû½ mÎÿŸ—‘Uæ©Â&uÙÚÚ9aÇc-Úm^õ߇u:Ïf?lœÝ%læ„=?œ[§S/P„~Išc³ŒD1!_J½ù:‡º“†¡7éYŽöˆùÄ“m®àÁÕ´^?D4óZWñü¼ˆ’‡+Iq6D$ó‰ìûg¶°MD³v¶Å·„ð=°[QfCÑ4nÚ®\ôМ—.å cú4Y»½æzËÏÓi›—d1ëì5Ó±·™‘ñãô= 6rÀ+ãÂᑞaR  ?ã“næ‘…òÒ³]ÑÛV'…ÅùSžD€Šc±=]h“AɯXwˆ õËJm5 «¦]l©ZŠÍ7ñDÚ)è¶®¡þ?8ét‚éâ$ªNêˆ?]9mbq2Õ¦ïq±™üó2 ÊJÇ*`ƳD˜x S±‹†vŠÞ("|yàVEÌUùãùm%‚¨?ÝCOU£ù'é¦QU%ÔÜZDÇñ ËU‚ž\¯Ã¶´>ù±\¿Çƒwå׋Hb?>éAí÷³±áÐê]ìeŠ’öÌ^4~,Ù1;ë°n¬i†>æ™û)Óô% I/ªPø4Ñg뮃W]„®`T")(ÇÕ•._>±%ª-E,ŠYÎtwñØ“ÂÑ= ‡˜J ˜™¿3hK0kç;öÏݬ Ö¶!lÏÛ3=|*’²ÁÍÕþšOÖ|ÛþÆcÓ{(®yÂÿÈ™W€µÎeÀÿ@EiXY nåÂjòqøœs{qÞ{íÚøWW1™]c.€Öû»D“J· ]U„+v´çX½V“²ÃÍp@â°Õ ;#‘ËjèÀ?c&ãnº_.öÁ ›êþ@4 s™õä ˜Eî7_4>–ñ¨¨BLóŒaOrF½¿So“ðB|’1E—dórÕïf-ªàªŽB©àÉš„¤CI ž˜ø-ÆÀÐÌ&ji¹ÈI½žÓ%9DVŸæéòóÛ7~ã<;éÿn:™»{÷ìiÊCi>Ô¡†£‰ \ËÇ·:H÷.}$SúBy8ÌiiHä|x Ô ·„Œ|/ù\}r{„ÆHÛµc[=BÉn)å•lx—>*‚ú ±Õ#‹°¡VÁò}ßifðg¶´°¦Ú€{‘Ã=¬»Ì_¿°†þ»¬&«è[ž)’xë± En›ïf6bÆò¸&/ga)g+/äò7VÑ=;!œî“µ—Et¡â цà5ø…3ÅšÛß¶íÐ-C¹ƒ PÚ#RB¾Öw!á²Hz.òpwãj”2õò£ÁÔjì\ÃÚ×¾Ëø^ÇQQÉnŽôî&§3Ùª"ó‹íöâšF tþLÕ‡ @Û}èÛû"¸s…+F¢,¼qTަóQëW¦À ¡gÊ ÙŽ­¶ZãÖ’÷\­e·¤7ûÏtÖÀò™ºœäG‚ Üu OûšA£åd§˜c¡ˆ·Ó,è}Ô‚úÛ[{‡<ƒ5*¡ÌȬü€ä,çx¨d…JZ¯‰?Æú¬NÁÁ_ÿk“ªšn|Þgƒg" ¹–qøibÏkùAë©â(ÇqFÁ’~ѫídËÛ¬6¹åqœ¿Kµln"˨£fv¥ß,Õ™Ok”i3Ü©#›‘¬Ë&GÁe­O¹py‡'vÖ0ù‹ÇÃ÷xæéKªäÒ›Njß*žÀî85ÚMÛ«PÐx`füõ˜5ÇçWhˆáÖFCðç[”°„.Œ[äW7ê™HÏ“Ýo¹;ë(Å]šõ”u4Ä¥š èòCn@–ÉB%+t˜íê3H— lKÒ ¯úßµ”·ŸYÐ&È™àóB {Ƒ뙥c•úàŽ}Íè ]e©?¬rTþФÂÃd§¨—|~·bw” Àö8ùJ{Še>xEP-f·!±¾k+<þx®åO‡FŒå“P$4©ÑûÊù·F/û¿…LC¨éi2~ý# zOùb …e®)5³¥Ôª€wx{_€Ù†#‡¿_b'`£¨ÀƒK` 4ñ@ã>Yö‡èë냑‡Ø€‘Ì)ÝÌ*?Ù/YŒU¿ïJ¢÷Ÿ” H¡‡HA`Þ?ä êÂøÍ æ=µ?àÛJ`ˆ2ßâ±Ü¨pUK¬H¥)ËR€ª1÷è¡g G Ó ‚ÛËîqåˆt-½óÛK-ߦݼÕG¡ÌÐe%иFæÜvÚ°Ä¿ÇÂÙú‹Þ?—#Ƥ¨Eu) r½)9à;-H=îNÛl`{HÑIF$&T·¶)˯Tl-¿ÒßýÊ2ðy;ÙRÅ53‹éeœœú÷cN­Re§^²S‰†¥R±)‘˜®2:ö ÆÇ&·³¿g…W¶²I¾–Ôf²d„½ga ç'@M:Lð•>qÂ7§Ê©¢}ž™•ï{œ¡E¬÷1•k‡Ø&~½æî9±7Fp;§±ôÞÂÞ&ÛG üOÃÅÅ@GÒ(×÷¼‹ .…® Éæ*@l 1PV25+Ï bf@#V—9TÑMð9°Üu„Çf.H“£Êì× Cë¬ÊE¡Vm½ÝëM  Ü€ö¤„ÇÚJ è̱Ÿw˜èP”7ÍÃléºï´ŠÏímGwð¢Äô]’ÓBlÛLS®)þ ”ݯ®^ñ¯˜9háD“ª}}H¾FK؇ó³ƒ&,Ä0òäÁc{OiU§Ô‘*ý3Ø~™7 ¢ÛA´”w£Û>F^WÍÀr Zû½SÀÛ)rÑ›°v)TÆÌc…oê•'ÞÆºác[W‘àˆ¨ =IPœòÕ¤*4î7sY¡Iý?{]6V&‰¢nn™Æïx³³p&x³.T±Ü™ ºÐ2~u|C0X‹] ámû¼Â‹×3{ñ¶DÄÒZ†Ù¡.·òøYùç®q§Ñú±ZüùÚ»’|[pzé¢{†,`7HÛÖ]ñH<Š’Áމ[ñ˜ÜæNÛåYé z$L‹ÊW,Ê}”ùW+{òrØhãѱÒÎXxòÁ„®QÿŸ³]‹ër¾e)F™'âÉ×߀y /vl⸷‰Á·\ACB“^1gÿ0›zT®‚è'½±iNÀxM]ä%q•bÜ`ó¿%póÝ=÷ï ž FA¨ðþ.ü¢p"ýV€IŠâ%ÎJÀkû@KN‘ˆMŸ=£n{ê{ö ’Øü×&¯­.7½^¶%âåX*ªŒTþÛk|%»˜v ,ß ¹ÂP‘Cm›-ÿCçtÁ×*R tÞàŠÞÍwkŒ×i”Ü@=*©ÙaD7ïÌ`ÀÏÀbY¶òUbþÿŠ3VfﻣFÑð¢Í.f¬ÞLI{eô7S@&Ëån™ý³äâÕÜW@áY»Ý³F€0†m9à¹ÀÊ/–|æH %ÙÄzá†(ÍÌèw‰È&Ãq)8(`”ÛŠÓ\ƒÃC>N£ ¯ÚTôfó3Éh–ÜíÑ}ô%/}ê:I^º—Ëby¡øÀ@{·ø€® }‹>܇“ Žªè™?Žéè¿ä.Þ×?7ˆñÂ,–y–&ïTQL•H=ê©C3(qðÑØýßVý¹ zñÿFüæ òæ½/FÊɈíÁ¬÷ß``(…èx•¿ÇC9ªÃñ¶'šƒ<²c} ÄŒ@ÉãS¢C?õò©0[Hço·´ý´ƒjïü! ÆØŸßïã<á,^Gtl›s[*§·}Jæ€ Ï–þ™À0f‚ôÚ&M}ü%#ó.Û²«L«/°:&S{JÚVeÝ‹'›¹Žf6ÿœ2ìqï™4· l2UÑÕÁz†¢¦à¾ ¿–€` @Ùi÷VEú¤}àK.8ùù$ä%ý?‰û¯U»€äv:# Ò:´…ƒx_"0fnÀÛ>;ýtš¬°þ9K€)è ï¿_} ÄÌá:¿µñö ¤ ;‡bK3~ „$¿Ûs=P6¹Ãç'ÌRÐK†ÿDÿMQ2Ù”@aÅ s[áñ½!Qv·ák:_T“öémRM÷=ÅìsÌYßT‡) Ù6ã 9Ø”#ôûs‘û–Ç`b@ÿS‚,ïútïš°ô‘¨DåkW•’”9”Uœží¡Kw²š1r–H5O×Ç¡ïKY×£€üwᆓð<诌ùn0Lˆð?ÁàݲúÕrp±@§ÎZڇQf%Áó¸/ê±…*'ö\]kévmým‡‘mÏ–Öó°rú[w&;ª]·sfX:]l†ÇWÔE‹~–ÙnÍ4¡€Ô±œßyœzIÂÊ”£|ùQ¿Û·ß¦áž=4¡¦½æP¥::ýx ‚Ï8ŸsBL,­a`=‡Ðª¾D¤öã v\à!¥¡Â-Êhº4²{|±m€½9[EV׫yáÆA™˜½•Ño±ˆìX „‰-Ã=ÒQý—È|mé^ë%¼ˆ˜¶Ám{#"j_¤%ÒbvÉ0Èpô2˜ÇÏLhðQú…ˆ©êwTÁlb†pMŒ¹=ºÌæïïiસՊ|ÊæýHÏÃq;°³ò¨üì‰X`V¶8@Œ¾ó%ÄÜX˜ eð—™¾ˆ^TBÄî] sî*ø="²g³y«–¬êü×·€ÂºÛêsÔ¢c•TÍ“ƒïr¿Ÿ§Ã–,ê©á°Mö#Y-uscî¶ÂˆÛ *)# . (aŠÊ}VÆM•ª_”ÄûÇ­é–q'É'ìZwu7_l»ÞáOùÒ÷»è³ôÙš\%?~)ôÂPÎÁà{a¦`F'€B£Tƒšß%:-"UåœD*ð'åN¾…¢¯œ¥Aüð®ÛF-¯\Ûê9R/Ö[Qô¥=6.f‘]¬&jšUOźÞÛ^µë`M`Ñ Êú^qfÚŽ…`§*kð«àç€nŸ¹’?™9¦SÖÒòP #R¾ž 7ÌÞÍÔ ÿu G«CjÚ殺ï·ÿe½á0 ¹7¢ƒAȵ0^ÕæìEWá°Ï«ÈÕO°_FãmÄdtàO)LÃ.¼WO¥ð|/_,NïÛ„n4€w=ˆ†=åÂek€~a‘†=‹–ÖŠäE ËÀ”Ôî‹ñ`,ÿ×±Èɧº@¶”dlÑ6ØIpŠ¼Ñ±”HaA]é¥U¼Í.w.¾µ¿¿„p¯$ÙÊ=ÜÛ°¢æíó&OTŸ‰·ÀrŠŽMˆÅMБ'ßüÔÔ~6/Λ±#q…A9À÷:ØmQGqFá”ËæR¼Î³½z­î•þ ÛûšYÇ_'ð´Í›^b ƒàƒ?„£´3"RRõ|GFÄÕ ý¶ÊG¯hÜ›ÜãîTi»WÁ;õò[RøgõÔøïåË`sÖ óZ° r z :é_¢.olì–K)‰Œs•-T ;Å/9ð2¾æ ›ätÙ™l÷ûË–'‹;ÏfQÁ°åýZN÷ž)îGÝòU¹å¸ã ÉcåQF,õz]­P­‹?(%¯'‰ázŒòV‹êÑZf‡1*‘8éúHçŒ~;{Õ‚ÏX–_¶Ôcþ$±Šõl­YÝ–kr¼”QYýèÙŠ¥ Y5åS,>·]oq-™«ä{XNPxåòÂÊ…‡Þ 2vS€zLºÃñi×Â8*£äJ/=ÆÄ£4×On>sUsPŸ› Õ­X†ø%ù…¡ô)‡éd@Ci!Æy–ž‹UŸIè©a‰ó+kƈ…ÕÚKqíÉæ "WDüë±Ôô)À³î'ð¥)ÆÏý#¥Ÿœˆîs¯ =Ö E1¨jn²z¬ñ×Î@¿×\LAa#³yÃ0~7¬êž^üxH°)Þm0Ü¢!Š} "ØJf~Ê¡Ïú‘ÿ|JÄáw¥þ€ÿ"sú"U³3ðJêÄ /eUtñŽˆ¡Ñ+Íß%mù;é~ÁÓBì‡ÅëF ‰÷·WæE%„ʾóVñâ|í2€!4­l´ª­:%üRØ~÷YÃ-âgWE~M4M?›í´àHeKœîo™7ÄaYëà)&öPcÔ\E€ÐíÙ‰âêYcœy J?–ë?¸2P¡ÞaðjÚÑŒosAØŒ¼/ ø„õÂ~&3ehÖdÑ!Ù¸ƒÎ:gçñ¯»¾„ѶîKäò¢µW¢OXi«‹1+­¢*Îý)É¡]øð¸2Bò „IëåÛþ/nÓÿöE9µh¿åÊUì¶Û”ê‚΀8û]Ÿž3É¡8‰1èJ¡ÅÊ5)ÅÂ!¨³ÎS0 •ްy«ùFO×XÖvÜ]Â9î4# ?la<Œ†’D´ƒÅôÓ¾ÆÐ•º üãªA˜c‰Iÿ±¨â¾ÈÇÉlzqyAuÏBÒ–šP0¾Æ%<ºÞ™ƒ®ÍÐý ŽŒä öÌ’‘k¿Õ=ïp[BpçáNÆ .)dÈ—ä9×} ‡nq{×6æ8èŽöÃÛÉ\{Aëÿî/wœWüäÓ6ǽrÕι8åÀH‡9 +5N{TÓ÷÷Šy£—€&½©×bÜ*Piañ "킇ÇNï•l‘r~¤mF´a9€:ªÅÿîä¶þõê+9 ß=Â>êç§GzÜé¡ñQø$m¥°ËPÙÿPŠ;¦ÛV+P y"Œn[tM°¾Mj³qãë’3ܤ¿Û¤M‰ è¹:ç#ºÞ~À›JX‘i¤L²<‹vJdÇÿByÎf.ÐíSfôI5&2–5)Íf`gìÍÉñÏ`XСê1F³¶sìêm¥(ݼÀ¦]ŠÚ[悵T¤½ôãÌ0苾^§a¹³¼¿®û yâ??Ái­Èâ©MÞä­»ž*J?~Çä…dôð#+GÜøPÈ À‹û Œ%…_–ñÖ’aç5 é³çºÓžM»K.ï_‹³·$ÑœŸx7äÕ.â­¯âzþE†©Óa-0åëDûaôuéäÉáY½¬v9)IRÊÎ÷Â…Álpœ—ûfUœËû‰ZùÎvaÚ>c™7.Ö:ŽK£ æ%˜“ís†0ݪ©ì’޾úàuòe$C±<Ò·}|&TPõœê-‚lÁoyê7¤,“«÷±p¸,0JÜTXŠÃ“ÒÙr•-_Cö&Š·U<…Ñm° /uð"÷ñÿY…:šHDj¤Š¹ÊJ-ÝyÕUÆäÏ™Áû9‰‹PŠ {½…Ö_ÓkFö©°á;Źû1q?C²’½O±/q‰,nÉ–¤þCRÕ ÓNþ ·p$7íÎ6?;Ç ’¾ +&áÏ`­á-> ¨›Ÿ7)oèEBõ=Z ’}­‘ ò£fU¸‰‡;¬)5!8ˆc!Ñ€¸:e ΀µMªÚùã(¤–º#¹EXœû]½Ë=Š œ >k ¯É_ žü#iÈlê2çè›Ñy¯ŠL!Sa9âô–@>»ùzÊ„Cº°2-#:@òä÷Ɖy¤¥à‡äÞòX eñ(Šm9&éèÍ罹¥1(ÿÍ<ŠLßqM(»Ó õzædòYv[lgGä¦òàn‚ºÔ~®pÆ$KX}äP\÷ÝY­(?Û¤W:ë2žâ5’+xv†„Ô}Ö!ÅħSJ‰Éju—(“û±Æ­CPVYá›NXІ]d;¼ëYNvÚµß϶D8"­(ª+L^îÏ’®öQ¦ŒlóÄòÒµºõ¯^/{.!;ªäükÞ6ÝO:‰jaŽ Ð³ÄÒöëH{FŸSWÆ7P{?Ê©KÖüÕxdñ‘æ"o5YÂ:‹9ˆÃcTâ¶•!b[Uò<½ërßO8W%8ç?ÓÙ¥œòKøƒô+|ùÒ(a¡7µKŒ,?< |Õßlêzòg­¯o.ÁƒO ý&+<8üª^MY½Æè ¬£õ/¥’{>×{Ù¾é±ó ¦ê©°o>M6€—Ü,§ýrY›ÐB¥®¢ò¿ï´Úæg§.½Iÿ˜Lþ?î`ýª×gùª¨•ßÄõ4D©Ô껩 rHy|§ÀÐÿ§MZȈ[Tjçà‹ÄPSV¡VËå§„ú×Im•};R„ö“÷üá*’Ê®Òkn:-ù—ß7ÐænÀÙ‘—{Nkò1ê•VÍTý2ú’$3¤”‡v ØïÿnöúÞ[ñö2PâÙíUí­*9ÙÈr2û5Žõ°Rû¯N”i]6RÊÌa»k·P f.©ýPÑqÑQñõ†buqMÞªùâ‚]¨òÔ³–GXo¥æwÎRÝ„9Šîå'5«K8UÓPŒ'|5!w–Á¢œPÄpë„qPuœýXaÌl_ƒ(Qb³Ã$ÉóCIïŒ6·i¡ƒ,•‡$¶’Þ§,„Åps§Í5R¥ë•QÄVb&êI y‰ÁFà£À¶— dæé€xBÁçÀdѦ"+ƒ ®Õ«CñòiÖ`¯^§Ú 0ÃØsk*[@’KjôxŽ5Èsü’\Õ‹»Ñ1íÇ Þ“¼Ûc*$þyDü G–·+ÛÞá4äör§ºuÙ+/Ã3;ƒîFR2õéËm¬C³úkï¼þRÿC’Ö•×Ç/0º>œ“¥øì8å9âŠfÇÚ•ZΓóv‡òí78TÈWÓqùΣ_¥+§OOrÒXkͺyº+c@hŽÓTе^@HgDg{KŠí'ÚDºÀt?Qyœ¬ÚŠSÓøÓÊ:î•v`R8OÄàí„§÷lÅÜYˆ6ôGŒ£ù•D&bKü^Ú˜TÜ«}½e€"©éHO4™j±qI<].!¹Á!” Au¹-Ù«¬ùó/¤±TŠë10ãCž,¿ùÆ> ¾Oµl°€4£ ®É­pÍëì0ã? ‘¾õ¦Üf÷%ëæDöiáSm°/"0H~½œ â „ŠÝW<µWpYèÂqHU|m¨ÏZço~&W¶6º”§ucwá+΀Œó½Çµóˆ4îZâJ ™ÅØáŸÜ=`1.­¶R¨i7÷D†G¸TYvºÈ}‰gTáCÂ)îùý¹éEâ~÷Uå¥òÞQ;?H«Á%Sàê×W 颷Y0Žkwn‰ë*­?åŠ ‡ ûÑßÀžŽ–êúõÀ1F¸™¤sƺ¬ÌIØ™’:îcá²¾$jšö§¤›«öIø©òe3™*j—q"‡Æ óíçN`A^~qß:‚숳)¢ÙÐ¥ÙP1…Ÿ¹”V¹8ê·Îq”µ«»aêê§Jט±{J7—à|×3ÑmPlÞ¡ÿÆ,(š7ƒa«¡…I<®Aöà\…C¦Žr/,´Ÿôñ*†¯Þ°^2Ø¿åø1#H‰5ƒo-QÆûB­eë7cÚà|´âi}©|ÄUϦ‰,ð:¥=%©µwbIvÛ’¤áb-3å¬Ôƒ+ò(§d¾Áyy‡$e£}ª¯\¦)zÌcÒu²¼âgßÀ¶Ô+º~fè5âò…ܼ”ßÚós§y(Úùp2^—9„n][ ›FD²^QŒÍ,Oéã JÔSÓ-O¿X®Úy`€þYD$Ñ"YG?7;kòƒø L ˜‚£V:¥•'åqYô5Ö? ^»âÔåê(/sÙGÁZËa’§Ž¤Ñfñëõ–ÇF™oo¾ ÑnªgÁ©½Ÿ›CÑ©ŽÁ6 <é‡R%´¨(ª;’4øºÁ¥“™ö€ÃÓŒþQ…Dž‚Ö˱5¹ÄI¶2Èup¨?ª¬³®ŒîÅw0–ðïxc»T&v8瀢FMµòMtOyeª’ŒÂ?1øÁ©Eî­Ãbœvôz¸8CÙÖFëÜ€Á-ñ# ƱËó½ÈÞd]n•Z¸·½“~>epˆ&~nË­ª.{@“¯:5ÐaWM,}8g—ÓϦ§ElJv¦ÙgÕ÷Œö¾¨¾‘ þ¢¯q5ðö^]c¨TsŒo5‰(pë?¥ „š¦e—zÓÒÓl1÷ÅÊÍ  |·ÌŒÊ©LW Q>Õq!çGìì²P®  9KLÞåxˆÂÀÞ>Põ tÜGç˜V‹'gê}Ïä §_r„F³#œs|Ö"ÅZ‘-Â3²¦š)Es´Óæ´tš<Ãrdjkñsm&Ñ̾6ß²rÞvÂB¬Cƒ©õêè&V6S•,•Agçöüh!%– A©t\jj® =qCÄ^ ºsÀ™Ùƒ4I¶FðÔø%Ô _=,J`÷ç)ÐåÏbÏU…÷ÀìmGñíМñðïÁŒL»‰UÔ¼¹{[HûÁÀÑĘŒÍi— ÄÎÕ¯”ÏM9oÒ¿Ÿr!Þ"ÛúLEf<ÜwlZM`ü°àŒî£4#Ì ;›Ø©+ôá¨{µæzÕòß9Ú¶õ³7èä  ïñ·½md(鶘ð燈Ší}ý;ŒãÇ\@‰{Fk_ÒköÁœdÑÑpžË¦ ºiÉ(@(½ÜþìÀ}ÆíuÙQ§ÕëÌÔgƒƒ~à¾yú1E$¾k÷=Û\¨G‡¯^½žiuZ¸¬±ä2'^J°FÜlzŒ‡èõI|PŒñ: ª;Yi4.x ¨Ö4\¿ §¬ƒ¿yÑó.âBÕ>³{Õ™{®Ên•FÚU±›­PŒŒ9gÓXjø+èù (Þ¨UÝgß r·QöfΞ{‘­j‰r|Åá3â`áe;yÝʺ°hiA•– "ìÐä–Zã m¯cûÇ—gŸ´C`Rax5iº…¦k9‡Î_’ ´¸jí2øá31€ÂÏå’ºE2d*îìpÞî\óîyÛ¾!!iìèN+â"Õ¨ýIïý Aõ>¾×]›×˜r©;l Š€p¹"âÇ…õ¢Œ°Ý”ÆpНh”ÃÇÆÙbzâÖ£GÜÆYJ[bCGÊTg1¥i úY<¥ž<¯—Ý­²a>ÃÛZc/~g¼’åÕç]Qä™@¤°F¤2Ji çsQbQb8è6*(ÛØ»o†¬æ".ªËа¾ç\þݼÙ(‘Q”BÆñ¤ºÞ-ýëè < íPON :oz†n`Ðð¸_FÉÿ88¸î¼ÒAnVü>‰(A³y1}«”àÃ3é…2øª¨Ò+Ðþ »ÅÕ“äV¾k ¢vždžÑ“Û >¾°B»™Chš(3@gЄ;Í…_|Øx îzyÍkY¥ÐŽÃMATƒðíœ(ÍÊÞ¾ÃNd†R´~w‡…é¿b&7†õPV†«Ô˜È.AIÝQ¥zàvu²¢„º]¿DBÒpz±¬ó§ˆ(ñ3§&¯f‹ç’Òî›Kác-ÞN unú®ô’S{ß+yUåH4jj,*?p€ÑÁS ‡”Bµt[,b¶ºkœT!7fJS·9=æ¯h5Ñänsšn±$†Û´ö kK_+àU¬V‡ä×VívÉAÛú’PžïÜZÝ÷¾b+ty{NЍ–yûé Ô³†h }àoïyÖcb†¥®")ƒcbõG=ÝlY«¢h({ù|¶‹FÛ¼ý¶½sª¿°+yœ·diø’mRÀr·Îºµ2¬Dû4³GV"s³F“)¡ƒƒõd6·[°K+iß—OÐè&oæE£–â†VÁ-DªL½vlÇ naC¾BYž~¿;¹”Ÿç€, ïêÅ`ÔM3#W-6h˜šÉ®•¿ÃTèvûUì“#Ò±W2¼åž2¼™FLCþŒ½÷>ü¼•‡²½2†Âô¯sÏ%B¹AZ?¥<uŽxºm}Î…5Ö_g¨ô. ¨†ï5Ò–«ÒÈ›»íš×#Ü$ ›9ôö΋Áù@¶·°í¦ ©û§‘aí©¬ñê]ÙÎêË[Íû*aÎ ÙL·ÕÔ}ÃàÇœmz3ăc–ä&ŠlîŒcbæMG¶°—”-OK%I·ÇIàåö¦.L)ýEü|^ÜvÖIA¼5îº:ƒ§\>¯L§vžãm$ÒÁª§Àyª9il jì(L¿Ã3UeRj)¡dqZ7ÛmÓ††ºåŸúXêm¬UMLâ0‡Èû NYO+_†•–‹qÕÉd`™îQoÕü&͉`Ç"¸Â°ÖYÎd%¥Å`,j d5¡Yæê§˜¹õΩåïØº7,ô¤~r9‚Kì÷ ±÷K’¬­Õ`öþb¥Ò$&pkòÎåðÚ•¸‡Å ½3‹uFªÑ«l23êvUÔât«p4`@6ù‚§ç¡ïdø\&ë´Š°=Qà°Ô.º®ÂìW ZÌc„[¬=À†õ >ú ЉYöKÙëMÐþ“O¡%@õa×\qÔŽROêQ–“µÐ÷¡¶7Å#¶Øó(ðï8ðR[¥ì¥‰pä¤á\&¥½o¥Æ È9ì\l²Ã ìx”‹H¹BWè÷´\çÎ#ë NÓÖÚpËN–«(.¾7»™ò>#­øeÝgE/É_u ˜]£°Ð›n´R«}ÞK8ýàiF«!öhÅæN¤öI¡æ5Ö’4ƒõŽ^†A,¾¥ƒÝ_o¸ëo!8šf{Ä…vebnZYŒ] bω±Üs§ç>qÕ~¾&ÃÀ¥hÖò‚„ÛôÚ{Y „î&Ûo×Éä{Ö ü~³[ÐJûÀ–믵žŠM¯ã$ŸÁFý(x:-вñÚâÉë$ÁÈF3úàµó…j÷ðuÜ¡ÆN,Í Â0!ÆõæÍ“~1Šòn–é=ÛB%ãM¸DžÅGÝ^»lwdÀg¾¤ã¯s‹p—îÁelë²´Ø´X”EÁ°]ÀiEJ¥ÿ£Ñ ¡ eóÿ³ Ð §~½¥óSÈΫ…Î`ÑàsÇ0È!è2þÂ:‰°i²íûÝ\ô§‘ °%œZce\”KÒÿ0ŠQõ˘Nש5os’’èh¤¨¨@Z?ºF9±Ü Æ­ùe:ÏÂîJB1t@‘Þèâ+YÜßÊÕÜ­Oä¥E+ c½”Ñ”—R;¾Å ¶ž—nÿƒ[˜À…Š )¿G…Y7Þ\?¿ÀlŽ{lÑ‹?ß<Îç@àüŽ­¥Ý áP,vp¨£`#e2­þj¢JðÛyÝÈñH¥2²8C;ÜJd“7Á碑³LXþîlˆé9šlõÄjýîuG‹RÛSÒ)ÞŽh¼5&#ÂL{¯m;•±d¾³ôWL=[a€’¬ ”B¶@t!Ìò<9D×(Ð=eš‡ÊŸ'+šõÃ8EÅ5ênm÷œºêœÐñ%¡©L<‚ƒN¢SFêÌàÄ!Ÿæî…ûi?çRí‰tá1!³ŽS°U‚(àÝù44-]5¾#¤Mœ÷yÓŽï™Pyå¿ø#Nø‹½uØâwU©eÓÁÝ ¢9_îæ©bЊ¤ªJ™Ýn½OMÐ÷énS|^%\~ ƒö«q) ð uc׃û}s,[j+¥‚uÊ«ÝGäjߥ⯄ˆX†6'O ȬrÃër_Ž^÷bd/^1Š£ ööabA—Äê{ ³Ûx Ä°Rû}o-Ê:S‹DDÒªâ>^²Œ`»Žî̿ԂRzÒj½|7Á“½$ê"* @Ò¥t Än+5,^âsºâtÖë“@Ï­9~f*Y<›ø5bú•¦xB¶ „!RÝÔÐo³þZ«PýÖÉïäI‡2žA5¦øÙŽ­¯!ã OëD©ϵ/:eŽÄçÞT!Ó"0wGêO{L­éTayãßJÈ„†=ãW·RûïÂ>/»‚ÙòŒ¼Ç¼ý#q28¸ZR7e.‹eüª†ñÈ+c Þ°¥êÔ"‹ožñ¬ß^5 NT«ÆK0ñœ„¿Û ¨k}FÕÜêTdÓtH¼‹]^ZÀ¼^Söþ•ñéöŠ}-«"‘ãE^çÂ$¦¾ÿg{Üz;h#7µ%ÕÑsÒºj®Y>yŠõwQ¬¾>ykÖnžƒi ò-ÅPÒËT·úñþÂYÏ \#%¿Ó*¦ÞðVb!ÞîO§ „^£¥è¯ÊÖ0>€g ÊßcJÀ&¡òš5·ÊÙÚ…Û7»È‰“œ@"Üï;܆èCžVòvŒFÞjûî¬Å§ò QY¯–Uf£ç>íJ¸Õ²ë}©¹ÝÄ&Yn"`À#SênídÆ0:²Þ`£¬oH2}âøi"m;Ñ÷2iFé÷OÃTÑÔ}Óëê„$/;!G U ß Ù,]BÂ2ƒ˜™bW™#߆¬´˜±•Œy…Nb2Ä1… ?Š`:rÍÏãK´¢&¡¤¨ ë“çV¡Ã˜¤õüv£Û Sª–3b5" šD|ÈÄÑO:ü5ÎûÿX…>aÐe¬8ð £Û‘úÀZ=G3=âav2Íqî`ÿÌð‰¬J[|攃·ä^îpeÕÒÙ}ÙEõ-Z@‚’ž)’Ê™À²íyôqnÔõŒÝhÞ±ïF¢"Â:èJL»V? #¬¯²ó¶Cq ûýç·”"à X¿ÍÊA¸a¥ùD·Úºà…Èø©G‹ü>0 ‹YZgeosphere/data/wrld.RData0000644000176200001440000047236013472155746015063 0ustar liggesusersý7zXZi"Þ6!ÏXÌâ3ïþ])TW"änRÊŸãXVÀØø%>Áƒ§"UZ •ˆ¼€œJ3¬+s¡›µ;€–Û•Ê<™&ý|×DNúü¶Ùù–ŽüÎaNÏMJ%­ëÿqg$ù&ÌÙYô˜3åòÎ.:ÉKk8¯LµÌaáZÊБçþVv0ºnØ Ñ¡ä(–K¶åL °uŒ2ð Ȫ{‘"ášÎôö¤œÏl*-¶˜Kñx·ÖÉ›´h8$½ºÒfmsiœ ¾ÿϬ¢¸qu5—ܦ;|-³ ŸHVmêUм ’Ë’';„ZòO[³r ¢ÖX<€D¸¨"ù‚IñòrÝÝÖ7õÈæË] ZF_­ýØS(oID4…QÚˆúüjz€ñ-ãWÔXyå`— Ì9O6ë–éXAnÏw_Îi4z]Ë v2Lòt_ñaäà“ùÚ£·ÛÝ~'Þ6ÄxÄÛÓó“ ¹« %Ùš&k’‚Œ\Ö_؉¥ÐgŸjx¢˜‹™úÈÚšƒg‰ƒ%%aúN·y¼šI87I4Û´eaçoj¸Iäàš¦qkPžèÃeÍ B¼&¢‡í×ÖWî?HLàg{Ökaú ?Ïîˆ%&¬|½ÕêÞ[ €ù”û¶ù=ÖoBÅdË}pÀ—Ý ­ˆ„\jd!EfS4¼þq•Ú€v‘--OU]¥9Ò¾d8`Ô‰Ô mAÕO˜Xi€%Z@½BË‘] Ö.W3óϲ°‚Å´`\ºaÛþ©ì=®ByB’ Ð1Ò¿,fü—øê*C<@åèNŒ·'sÉ-¿HÜ)Ì•ÇÈ–²\õó$Æïn¦¸ˆxj—l1c$·$ví¸sµ[]#«\ðËð®9-OÓcG_øHˆ!8=½Ý5²¼.¦N?`Çù0à2«¸z²)´6(¨÷nªª)7*‘4æ«fz‘ú Ø'Æl#r»<(ýàˆIµ8³Ÿ0ëë€]Xîæ[µfÅPq)/s;ÿõ}W²dÜd (”§DåL ´²Ã~_£<‚˜±Iªƒºöâù8 À—¸jM»Píú`*ê…¤´›N—RJhÝã5ðÔÐ; $È!_Œìók΃BÊ: ú^Xja\+Fj/.Þ˜­x& Рä·“«Î•’èYi•ׂæ:ËÝ®öC|,Ëú@Z&_m-Rl¥®Q‰o¨q„ñéûUókmª1cýw¡8gšJ¹¸È§!z<}›Á\³ÇÉÅ»ˆ»{ªKé­úë(N™Ë®RkSÔd* ESR°Âl螉ÝT윈AÅRÄn¤hÓ#Yµ¿ˆõIÙ, ½Ó£© :Më*;Õõ¾3g:öœAü583¦O|åS5ßÖþ¼Ó@ƒ)þ>ÖsŠ©\V$‘¦T{5'Û*XÜî¥ó(8Ú5õ7ÂëšñUacØçƒH…åܳ+s4oÒ5F9žùÖ=°0Ox3¸Æ†Eöj•>®fÓ úö²òÊß!Ù Z:q8~ïÚÇÃqñòÿJ Nm‘ÿÅÁÃÖ|‰ÑÜì”{^+kð$¢e¸pçSpd; Æaôf”E‡«6i†ø÷+u4Õ {ôh ‰&‰Ãs ãØ¾Ì¿<íÞ»¾v±¹Ç¤P‘â§[H—ÃKù¬ø–50cŽKOÿéÏj…€ÙˆjîÐH"áïÍ@WýÀfõîqs¤4üÜ`xLíMpõb”•™öÂ~9eîÑ*y¼$È@¬mš…v0(U·ó©¥‘ñ£äˆ/1‚6ó¢ÿã% Dv"VÅ™÷eY#‡³ro>†Øê’ÞâºÜ£Þ§ÜŸ²ÄâÒ—9 zöá¡Úq#jÝ@ìLýµ£hà òŽÜ™qt´Ê][ÂßÅÌÂÀòÌKœHŽ Œ)À¾Š°U)í%JÍ'Üö™3ÈY˜-†BZ¶'mU¡kçnrJ×q0ƒ§\$hZKkÆbQK5Q S!WÛgôçÙÜ%ø^»œrÆ8wQì³{Í®â¨h]FœMèõ„-†€Eutᙾ†­Ÿ¨Ó4Ìp•Ì9äVaðP ×|v@ù™_ÁÊ#^» Ý­5uþ2ì´/GöXÐòX‡ïÐOOz$Û‡—‰H(kši@ï\ö‘˜¬ð¬ =¼¤QÇ ŠO`<ÃŒŒ¨£Á[RÓ­HÃiS*,ÝmºN™ë0azÅ5-©ù.i–ýv…aKààPð×XqA§Œ®9ÓЯWê™Þ¦¯„â|·pTÓ_MB†c8[›ßÑ28Âu+\òª…\¥%?§?¬”ë“++aš¨1Õ²TaíñÂq?8Ýï²Iµ¬:²œâø\+‹˜’Âr+ß5hö{ón °ÞHV7)Äl\ÅÝc¾ tr ¿ÓIîÈeuñDA%Nboç‹K©]NöThkž( Òö¨õb¦¿¿bî¼ /OŽ&n„Úh[«äî» ¦™aD㻇qÖ­"÷sô XnÒÅ'”ß!‘Ñ”ž Á}J ªV,¬±Ö®-àˆÀ âô‚) ²þÔâ^BÆ@]@¡W׈Œé*ðI¢ØX!+Ÿwé¹§õdâAïÏÕ»²¡z(“mÜX´ŒË¡Ô ¸›GÕËïñíeÜ)Ž•FY±ù÷c¤N•¤½éT‡DòÒ3Æ`B1x&­›ûnÚÄi Ñû{q‰‰pœ OwltmµŸˆÌ‚r¸¨ ‹Ð¯¼Â#¥qä¦pv×r¯»“u+BÎ5îÏ—×òÙ™·Ú(7€¿w¢½Æ¤óµ­h~˹["8BÕ°È[çíÖ†k©AòÌnõK^l#ËÖi8Ä•N)&“3Íök¡×B= ØXmyé°í3-+ž–c|,Ã$@b…²j° »PD~^ãé.ÙØäí±¡?í)~ù(ö”fÀëѵ$!ƒtíóA-^^$—Lq©ÍÀ®cX;ÔBÓò¸¤"Á /,‘Ä à þ–Ÿù¤?™t¡Í£3İÙë¢y”8›ÅxNz®ãOΈèîBóùæ+C&®Zþ÷þدB¶|ƒEMuTV~-˜·>ç‡ûèu©u²GˤtïÏÿ5HÒÒš¯|÷Â$j GòMy,úÓ¶™OI²;{¨(c¥l=n|(·»Ç̪AsÓû›JW#œfOcøp IÆÉT—‰³óò·µÖöoÿZx'»”Hþ¾ Âøä;Rlû©PЋv¨ªŠÂæ[ÜlúÆ?ÑV8¸bOžq‘öïéï©@~Bó ±ÝÙX8Å µ{ØC‘cFKi¾z¤⓱îÝüû®^Éæge8Äë ›œ±R.÷uö%iL»-q¯5‚‹ nÉ ÇmÍM5>{ ›4:£ñQ/æìŠÆ›zbPÅ Õpsš‰DœL—óMy$2$JAQSݱl£ð&W§&q± œ*£üÓè¹¥‹Í)¿7ïõÈxenÙ1 +bÎPÛ›¤íƒ±X;Cn¡¿ÔDÚGvR’N»»)t¦Bä/Hk†c:¶¡´—Æb÷¿ªäÑYTÂø9xKPÉ«œóÕÒß[Xïgw—ó󒱎ÀÞÓvP·Œñ´øY9S¯Ô m¯¤Ðò—…Ð)v©5¼»"œË áöâ)t牟¾åPFV… : âAu¥³Iµà–0rÀ–Â&)CÉÕðÊ|³`„–¦5–ëi!’ à Û5ÔZ‚Óixˆ>´6Ö|ݽ:ûšÝ»¤UÕê¼n{~oö‹Sk‘Ò½)þ}‰À#Ë0 Â’Š #ë™^îe_Ë„­4ƒDÓºô¹hpúdp¬ô{¦F"`%YÐÏ5‡‹;—áó<…!sm˜û|ÎS;Y‹-/˜ ˜¥hùËæR›ƒÒ*õ–H 1X@ÛÏÐw ó£:åû [ŒÜ3N¼“߉x)Ô/fh2Ř)ÿÓW­¡Mí‰x£7\Ò_ŠË€e®A.w7®8_ªç@àAmF`ô‘!úÑ‘$· ƒ@\þšñ)?ór+óåéŽ"·ñYÀ¡jN1Ùv2o8Sdé°; ç¶ÈÈK¸-4Ûº/‡“à{U;‘‡çÝäZX£ H­\ú`j‡E_W3Sy“àâ&#ž‘ë%\,•—ÿšùù™¡^½E[ñµ¢ã¢ñ_õ©RÐ2ìO¸N§.8›g†€s”•Ähcsض¢À~Hí.¦Ç^ë¾ s»Ü8(ÀÍ ÉÛ ×Ë ø“ÓnSáä ÏhÛÇu?ýN†'´&¯• Ño›°’úª ¾þër”ð7iÅʤ¹§ÔÈã¹ý‡RmÚ?œé8—±q˜†üw]-æ1L@:¿Ù®%y8qnù«x‚ í¡öæ)R¨™&ÔRú.˜®Äz÷í»Þxoç5tVÈTo:£^žé„•þl|ñ‡uÿm…%ƒ°”Cî–®_ŠÖ«È`aµqm¶ßìô·Oþ,ð:ÛÓ8Õ0LrS„&½+£|»Vatì{¸{+›’;ŽÆgR]ÀIpüÉÚß5×ȸüÉ\ûaßôp¥º5Ð#¥ gÛ8ñI½]åúáa"Ë¡Ì+2£‚.&îú§=úÁ–EòŽ!EŸbƒe–ÿŽ4Ÿ ×uà lëšç%|áëO­ÆãAÌMF!‰Ð ….6âªqÂÝ¡ç§ÙbÆ«Ÿ;~z6í§Ší“°c¾WÛ³vÍu¨€kŽpÊè~­6”0û™§Î[¬xÅ·’ß®ÃÆ šèÃ^a›|„qà£ßJêIˆ®Û„.àÖIë.õßrXNüpW¸lÃð<\ƒÛb] ˆ‘C«ûÎÌ>žÏ؇ù•TXÓ/ûéÑF#j?ÿX& L5Рå”ÔH¼x]Þ“Ü./R{`§¯™tK "¯Þ JÈB€Ð._?&Ž¥Á´À_ŽÒÃ蚌þÊõE$o’`Ocw V&Ó­ô°Â~`¿ RLtÛTÇÏx>ï@\ë¯õÙàÞ_Å®Yt+by÷NaZ¬+eïbb{ÿ (+O{ˆog©$iØðÑh0C û#Ú˜µSáÝÍàOt =äóa -ÎÝûn¤‹äÌ'•vÅ7nÉfûÿŸÍV‰_S˜¾4;”nRYÔƒçù1ßg¨²jÓ‹ ¢gU!Û%‰81kYÑÄÙgì¨*¢Zi] Ïäå¯0¸—'Ù ¼C0U…ß¼´ ¹ØCNèÒ6€טQÓÚ¦âc¶¶÷Ù× ãRA1ËòH= O5Áã§S4)[;(k³´¸áy­½bX҇˲+zð.ð¢Ë’üzé,=ñüÙ‹ÔµcÉpCbjäÙöv;=!¥°_¸×@ˆE+¼°n€ gôú.·pb¯ˆóÜXj’8áÇœÚeT™½Kjÿ.7&H‰ÒP6ÔÑ;¼˜]+˯ŽZBJž~Å›êü·e#Q%ÙJéQ¬…žNHO?ï´N%‚ù°‚fRßòõvcc°Ùµ˜;b±ýX«‡D,Ùñ/kþ ß½’\’¬î†~HýoäâZôºaŠÈâ=y÷Zþ…µÙ+d\N[fÿëøm ­êqÞä㸃ßËMdkRÅ̈6÷u¼…{3°´p…[–3«×e«ù» Rü"W9÷ăiÅ5yƒgëv¢yº®°ÔÒï^<‡RžŠÀIÁ¸›¹¹Ñ]ø1”^tcV´éP¸|“}tîw4®°ç? ÈïðÍÚòöÕ÷‡Á#úÏÛ`Œ×xÀMvR쉪)êlSŒW‹êyÔÛ.¨©< £‘ªP-Y• ÅJç.1f°gÒBqÜ)Æöe.ŽÔ J+÷-ÝØjÌ©XûÚkU‡‹øÆ<ì`bËÑA½JŸ†°½‚Å|o§&JIëðî©Ï>ãˆBæjÑ Ñsÿýpƒežá¦¡9–`ÔgU‹™ ݳˆXØKez5ýÙ¢lY–hݱS«„^kt«„œë‹)>Âé…*èæê0ÌV—¸¯ "IXt½ø$ΈW$ûWÐ-&e¦¦'ȇ—˜é³Ÿˆ^§²=3"<*§´¥Ýt0BŸeÍ2u‘<µ\ëâ»:DÏÑ*RÆyù A}BQ*1¡)âÔ?„0“oÏwon^Úl&“­1‰ãÏvh¼Ä¤ ?6@x#¨9lQŠ;Ç”IBJ#Цv*6ð¬Kd4{>4s‹¡•Ö¨‹*: ¼ºñs*å^ö˜å°#E¨Ün‰bìÎå-!mmºÓÒ(ÝþügÚB—^N·^4ñ‹ê­³|[õòè©‹ 1M¼Þ«Biʉ01sí@¤u¦Ê Ñ+ìpÀhûv· Œó ðXÑv£Ê¡B´œðo¬Œ]vÙûù&M ÓÞ±ÍN®–wØ‹0Â2?ý4•»m ×ÆÔžK=4,Õ×@U>Æš!r Û¢áÙ_™ËTâ×Õ~•ìâݹz‘+€ð´ÒÖ†Žë4l"`b.J¶„¾_- Qí¾³7¢¡ßAçüF2ÎñGÇ•ÑóL}lòj/HN4o·íÈàX_i(62"€%Œq½]:H#¥Å¼§È⛑ÞâÊfü—nv¤D»±õ±Oà&“5çÑ’˜s×vA3àMUëÔt‚Q^¼WÓw; )‰ÉB??cø—%t ¦•¤ÝÊo‚Þ½8Î}/ú)•1ó³›ç e£%\I¬ û›D(þ«Qa.×?E"W°eúý‚æ5ôA)F¹}ï,E'hXZÒcM*‹muKÑЧS°°õÏZJn„Â7øaŽ õ,£8®›TQÃÁÞTD â³Žîâ´äˆãàuÆV°ÅѼ©Júˆ™$f0w·€¹zme`¹Uc\¼ÝÐm³Nžö Yæôà»zÈÎD\:FÚ™$ùVr±_ѽ[_¯7D5ø„¥ `Δå FørÿD.‰·cöÔ‚ù7ø}é”Ù2F±Ö\®kõI <ófUàªû{>¡µŸ%åÜöÿ¼e¼³+Íé“rÿ­ f¿Ó°d ¾È ~ìÔ‹he‚¶,±UO*dtÏtØíý'Ï\vjµQE=jÑÓ¸Ît¨j’`§îb+¤4X˜¨†YÃn¯'/ÜÜH‹ø°zÀtý §ÑU‡|® R2õò@„Q·';Ÿ•àƒþiÒÿÓçX`?Þ?q `¢®‡ÎrŒš.xJ;ıðbîxDªo,!¡œ½ûd ⺔·Ø/¿ê²“QÞY߉Â`ˆ®Èhô%$µ&Þ{Ž}T÷5<1Ôî9÷¶I¤BƒZ$”Û ¦µ”*Û£ÚØÈ–2Iøú b¶fÌ í«l!“Ùß)—é¨Þ‰Ü­¼äØÆ—Çz²Z|=ZOlˆm¦Œ¹!¦´ØäC‡¤—çî×úK›Ž¼ ˆããöuý^ä&$’9& »çÿçkú=œ]ÁaBÛ}™9΢jI?°‰cHàH ¯bÒéo^Q /oǧjW†8|ˆ'±ÏnCè`¦1™ñ%F(!þêˆÝzÕºÕþE^âÁ»Ù/™|×k xl“ù"â^¤¼”¿ü¡A?T'+¦mßP1“Ï aºöªøûD L¥F?Ž%DV*£9xÛè¢ ç ì+öÊô¹PÞ¶VÆ®Š €e\7äÍ*¥Ò /¹ÈœeÓÕ•7ú}»ÍÑàÚ¹7sé¨ñr×WôÐQ°0 +6 ZëŒY•{î+µÞIv³Jƒ°}œÙ¿ð[ŒÑ;°V§Û÷Õ°7΃Í}èXƒzúm]ÎPùçÕfT?¼´žœÎ‹¯ˆŽÝ­Zm‘òJ· „‹e©)ƒ 0û©\êÂnHBb„.õe•›9¶¡G Ïzd4;f6àÊòñ𓨢äuÞî!óÁüpúy¨Nt´KL®‚Q±oÉ5EÔ\½ÈÄ•!M|GG f‹½ÖÃIK‹K 8ÐPùØ0™„§Ô[ÂRJ6 ’,ñN|§ãRJ¥ã`Ó¹;ˆ”ËgÝ=ì0ýƒªY,ø»± éÚŽ\ôÁ³íËWÛ(qm}TÂ%£`õße  "Gýƨ> ©ê}:‡áì5ý¿t]?á91IÇr¬jÑ4թͶŠÚ}&ƒöò “·Eá«£#0)n0'4äzþ&Òòó•Ч«EÍÀ{¬äPvðflË#jñbÉ`ô÷&É™åJx9²¦ïl¼aLÐñâ.}&‚¤‡Ë:×*Þë<϶ÿS #np\~ó;IFÞ¿å¼fÙ0ì­ÇòcÝÌ'€Ížywwƒ9KÓ²—Ampl)Kí°å4ʿݺ(÷µ—h¯¾.}.å~@ íü6µ¢(M±7õÒ»d.œ»EÎiX¡ ²pI»[ 5® «f½ºüÂÚøðØ·ÍÏðÞŽgF/m¢23i)̰ÂÃkG7Nœe‰ô–,6ðÚüÃE[Câ‰è©P¤ÐÛx󬿔V×ÝŠ ØÌ9¸¹ÿ€–b=.U#%`ŸŽâŸ÷GÆ)y&òWÑ:EaïXG.<àE"®ûêFM^y§dÜ¡\~qŸá9ì™ÿ)I¾¿ª©—¤ê(CòVùËI5|„GϤa?œ¨g!û›ÙTO•÷̼`”#ïò„îá2S“É™Â.£é¥òL´§wõÓSS<Ñ @d;wd«]¨0£Ñ¯jÅke ŒéS«Ke0q!¿Ü’ þpf•±G´,Œ+5-I•ø]5ðÄŽ·ö}Ž¿W*Ë~UÊE®2Áœ²ÍÅ\œç1Öu/&ÚÏAŒAŽÈ´çÔc«hÏ«ŒZ‰Âlæþ÷²¿þkº!yÕ>g4–=#ñùÕ 6†Ù¬)»£ºÖÉQ'Úˆ}?Ú|¤ààO*TM"ø±µ=C…>|tÇöî[õ%GíE ‡íEJ’¾É3HǼªRÚ~Ìýd‰„©×Ü@ì}Ñ&ê£÷0“q_K@£öÑAA¯ž™OR®‹ìì¹xŸd‹øÏ“$M9ü÷Í- H(S“†ý(°I«jâ2ÓßÖš‘Ç žÑލOž>~ª ¾ü;rË2_Z_ÝýÑ–ƒª§=1^ÙQÓÒ™}&‘J xøÅÐ>‘ë/…ÀVþî^ñ>qÿÌã·Ù»…eAÝÛb5 !˜º¤ÀJ$÷üïÒ ë?¹CSl˜ÄÅÔ<0‘û}®\ù¿w„à•/ôb—ñð•M7Ãô 0ùj}UEÅ¡AéæÂéŒ"è¡oK…¿q„FõæÝnõêÄaÈ8UÀen.f‰fT½õ¸äÚ yý”,úL|o%O;¶# p€Ý·yEßB¡ÈYerX¾08¤Ó¹ ʽ»A4¥Óúˆ„ ûÚL±FYBŠçünk 2»T ûcíœèLo®ìU 1¼€|&"ÃqLtCRç´ùôŠ#Úˆ€à ^:Þ £ïXÌÛN¿–°aƒ¡ ¬eµ4S«^±‚#áœê”Rgh¹òýðC ޝöOwÇÉöK\=“ÞºlI;g|)6|´ìûÑøo©•ò „ÛÁªÍÌgÅS|à2ºÑ`iŽ|EZ*‚(ÞæÆ|ÇÏg…Z§]½åç.3ƒ< «Mr“ýe°/é ;ÄŒ>ÌÏrFÒÖ";§"¤*v…Š3¾ãî_90hA¨‡ÊÅü!@Öï´Y3}Ô÷°€Þ•íG{Ötšu÷¡êANìQù=Ñ÷Í^ýcÍÛB¼å>áO¢2”úZ& +\ïݬÕx?~t³ŽŸZIÞ%OL‘óÿèdpA)'‡Tù3?üøàºÿÞsT ÷! ~Ww¥1šAØFæö<ƒå}¬#ÍûÐÕ•­R" }AþzW›År7Šusõ*ôµ^×ôi!ûÇß|^tÎùýuY9tóõÙÜ:&•ªÒÇU|ì2±Æ 3ÀÉXå§»úË€­@y'žî«kK*¶V;…uÏØwÀ·é6q¬vj39/W:=9—µ¯6Ρˆå}¤Ó&ÐýÐ#漢PlUŸ9ðJx¶ÜLGå2Ç«.E|@F»€CåJdúп¸Ï8t”vPªåí›biãÈÑ( ]¡~2Ò*œÄÇ&7Ðæô…Ñ´¾¨šl×vžds…]À_¶€Dr¤`!¾¾ÍUñnºI0ÐôÍ”œx)ÚÌyc—½R_îY•gmóúð”žÏ¼µn hqÈ„ZT|ý¼8e_ lY}ä6€=V9P[ñFúÅš¡)qÏœ$;¦ia±µ Žš'&Ù½†´:“qd\zóîËæ¤wÐ؆°ž$õ)ê…¾§&ûÞhÕz.—æ·°A©(¹gøÝ'¥8˜UÔï\…"VGû1ieý,º§‹<„’öo¸/‚µÖrŸÖ=Åy–6èᵇŸ``4ïxˆz}ÿûã˜Ü<ðñLÔ |ù¸$’-tÚ”â/yê\O0ïú=`È)³Á É €Ù° VØeŽáC~Æö‚èÓ'O¨ƒQºªÞK/ÛÅIO*ˆ¯ ó3< æR ªhäúC ¦L½áA°öÉÃãvý‹“ÝM’n)0*fF¹ƒ ܨ©l]SŒåü²ÒQ BOq@"¨§ ýÆàûs[ªl;b×͉8QdÚHùW$ë0j…ÑÍàN”ɬÒ%ú:—•7ýN  Úçt(j‰5•‡xìéžaØSàâÀªê1^WÁ]g4¢f”·åµ…ÞÁÍ-ñf…v­z%lA—Kä)™L‡rwÇ- ù/Äß}ðڷð¦ ãsíåeÜ Zýñ¹V\ͺSð81ÐXŠ…íÝýyxû°ê˜oœ©ÖvÅ#›ÿŒ¹Ä0§LT°ŒìÓaÿèü™½?’ þùÁˆ¶Lz!xqë²±Ëõ]Råt¾udÍ3‰”^ô¦°`tŠ;Ëà{±_¬Öʈ-è1æÐ[!;JA«½ÍR]®c7é¹²[. “Õ¾˜Áj”¹M=¾iv–01I ]Ó8&úÂÈ•“FRsÌÎQ>°WXÞé6©ºPˆ%"2j‰ºV+ÛI¡;˜ (ä­Æ‡Óô͵ÞwìõåS$ó³îDX•ãsŒÛ÷Sóá2¹­-ýtôh8ãE£1ÄʾLªÎzF‰ÓÊôÏ©éŽ/¡«-׫_%.ŒÙÊKÿ£Rv¡Å*ÃÒ¶!à¹?€%ªâ×IØJ§‹ä…1”µD(¬Í’ß»ÑÆ›hÓäh^Ê+“Q(ó…ð+>ãÜyùäÇav|Óá §›0“Zªá% Ê *¶Ücr,;CÐîHWë%®-L×l öùm» =Ñ%6;‡Î!pkhà2xeð±0 –ŸO&鯋m;%¥ŠzÜ*@Pöodšý‰) upN7ópŸ0?4  ¦¥|Œ ‘GF§ñüe#$2êGAšgEOÁã¹Hwþ1w—:¹R³ ²Ì:Ü”2Ó2[Ñø·iWŒÚxWpSƒ*¡dwÓJû¦›ÞOHÑã°9ÿA7ŒÙWëÊä§¿•’,çëœÏÃý,SUÇÓ§|9Š¡q¡ƒÐF­8‰¢G>¡ï0ÇW±•±øŽ׎ùsˆ@‘êH9, @ Ãq6¹ôš‡ß €Sdv¡e¶Êÿ []É_´uÈg¤îõб?ÁÕÀš[à8aH&ç/ÌéIƒêÖ¶ ýå0ÏHj¥Àýˆã$goÖÁ!4ù½ÙÇé†2±Û'ݨ%’wtÁ3÷¥íô=`\è22 =ÍP•Ò~1¯à6+ªX9¹.ßû´õ'%&¶õ,UG¨Ú6ì„3jDZÓô½K9r9òV^eÕ^Ë*BABʲ’åC h\ ì;N1Ç›måšk.;çC¸) ¼Qw3ŽZ‹õÝÓZôÚêªîiÁŸ+„؉·Ül5ƈÿ=9FôDP; cá'œV'»ïç&TÉr=ð%ll‡÷O¥Ú#¨nt±hñ`‡æ¿{¶4-i“ƒýUDô*’öuçmú¬uh{ÊWeï—UzzHyê5Rßh,΋±gsE=ÖÝ{BÑ_8ä5TïÀW'“õ­m@6îmëèaü,êšq†Ò‰èËÎÚ«³¼ð´ù9ÂÝ©ÁÅ|Ä‚ú#¸©2ÓiìpÇŽªV_Ç«®å;ÔÝÉo±øêÑÖ=::÷ï·Y³Qa‘°êWçZ‹”ú˜,J\F 4})Wbê[ÊÏ2r9€ÈÄœ0LÖWÐ]è_LúÒ' èþÊ|â\™°Ä­o¢¨”ÕyãŸåžaÀqá%þ£á=h1±dÝGßÉË'„ä»ç‘”ûy¨4hÞÿ M7 ¶8h¡cï}ÄR¤ÜušÞü' 3ž2ìö½9”½Tš%¼'ÜȹÊóz…Ù{QˆP³û]Žvo°/¼¹ÊK‡1OÊîÍÑÅ—.å‚ïcr»ÏPÆ^¥{ÞŒ¬©çÃ&’úÙq\ž|ˆ·Ó[ÈXÔ=ÙÛN=ƒšÂ¨~Ü’SçKY“·b×A†–x~ÚmºkÛÒ 1ˆ¸S•5CüýÄNÏýn³¢+a ”|ªÃîD=8|Æ&<Á íÏýptx¬¼Öæ Æ ÈC?¹ÞtkÀ4Lö#[3œª>­dbÒL¨¾åLËý¿ /À0ZŽ& x8¡µQ9M‘QgÑiò¡¨Álm®,e ZvÈcô eÍî^§\÷í­ãÄnÜ¢,”ûHeC/[õy§ü°çú°¡Ù„U™•D®Á—a¾ d·«{_>Bd¯Gw!’ Ž•—9U»+‡P·ŒE‡[³'2 Ø÷Y¼ae}íb)íœØaWÎtC8¶<Sê…vLx}²SÀ>ÒæØ÷§™ògg“ B‹–Z¿;”¢Ôïæÿj´î׌R¡2 ·k”ÿÁ(c Mùè3´/Xyc›_ºÌ€NJÊoΊZš9ýºJ«ÿVÑf=(h\[¬$ˆW‡É– ¦è¯Ÿ;ßÜì|Yq¦Fƪ߰‰q·µ 3çÕkÁ §eòÜ``÷»làí£<2š­¨þûZ{X løSæpî }žºHÓOtì]‡™w^âµâÆ|VÒ˜©p‹›_«øÜäK&£kÙ ºÃUZÙ4 v^ºžÓ׿‡ØåßÏYïe´Gsr9=i ah ü2M<;)Û{‡ºö*ݶ³XÚ…2s³/Ãü‰?nEJ÷žÉ°G”öwðÌ?é"fbyÒXéÃÇÍžÁé„ höøû¯[™kímø¶32Ûºãîú·®¡ 9ߺõ…X³,²R&eš·o¨»‰w6WÇO ¿+²¹iDæ…W?ç3²Ï)éÙuƒ†ê±?Î韫…¾l˜" }y®<’Ñ8µCGãªåRÍkTuõ' ÔŒ+f‹+Ñn…]ý¾Q*«À¨¾F2ó9¸{ó­h]óúx]ƒÔ\(0¶Îi³ËYÌûÕb¢¶r+ˆDÓu½ûœÿÝ@·>,þû†©KªÕŠÑQû‘jm¯è-ígsf2¬…ÿßınÌi²}ëØË;õ½¡qeäâ@_Μø*®*7Þcö[…X,1H9îÝZÒ;1ÄŠŠ‘– eñìÀåÙ{j®?˜iaBîq±½˜QmÐlø)£AŠÏ„¯æsø[8á\å)j¯y¨tIKP–bÛˆ}Ë|°ºzÞºÓFȡÌæ/` 3X«Ö˜äïrA8¹Obs°ÀwaÈuÀ`µ ‹Z[z¦AâªõàEW+¶ömž†³ð´éã·¦þ—BßQ˜pù=_{ŸwŒ½ $ ±9»ñV¼/ -.axÆÇÞ³ê2|¦·QœŽ‰Ñ´ £Ý:K¶|ìñœ·Å²ÀØ.. f†qx87‰5 x©}lè ¯Ú{ sGÁ¢þ¡­PLšD˜çê¶¹Ï;ÖL·<¨V„ó†õF?c ‰XÓ!%œ°ùA$Õh¯Làë õ•ÇàQ¢ ”ìi1K$Í@!„Kô0ŸæMO4ãå{€Ï… ?½nÏÈÜHb͓ͻƒûÌ‹ÆçÉ3Û@g„Óis §p[Ùã:‰Î7 ¥oä}©Q¢nˆ<òtgå;fŒlwà6óQ;ÇXfeÄHuCè.“¨¯\hl CXñ¢ù7Lwª9¹·ÐþÙË'LöûÃllûM›ŸÖ1¥¥Úz‚„Gç‡:“d7 \yá4²«?(©½ë þ<­€¼æGú¤à#¼)k_ï;£ÇFˆ2¸S/ “.X<ƒ¿æCB=ü¯W-ÀVËÏžÿ}`…ÚŽæ °…l+^lØ Yøå9«•N ®È¾)šúS«ø\W€8;6˜ÛžŒ_$}_­Ã˜ÛI­T¤©îñ.¹MÍM)Wöy†? û¿A1 9>œ[iÜôzpÅDš]*" v5µ†Á‡›œ•Ö@hBɬ÷ ézoá³i9„w/L°…¯ëhãµP ˆ0Ò$àæãeºá¦|,Wíø4EI~í]“r‰üùÞY¥;=ÚcäÚð‰½ƒ¨¥™Æ[öIì²âˆøW€DNÌi0&‡M^™‚úùªÏiëˆVJÖRU\Üa!‚Ïj:#²¥9Hç4z¸SR,óª1‹•‚5øàò^Ba7I†ï) ©Xæ÷é‚¢RbÅ7ëSØç¥Ü/ò90â‰7‡]Pk2–L‡Üì3=¿.cáÔD…§¢3Ä]ÛþA†† ×ö%ôr€d˜œM)º[$£:Uf:VD¦ÊÉ¢:¯(ÙM&°¼4k¯‡_M¥Å/¿.¬0íeö×¼¯Ý|6l“ŒÐùÞÑPioš£Z˜g_•mA¢?Ëÿûn„ãªÈ#½»³ÂSÔµ>ŒÊ/›aá]™ Œ‚œ+fÂ[°íÎ+ Ì{L¡3*¤Ùtâ£(£z絞eû­Ü~;ði±e_€p eµÞ¢44.ËáÎZ3'Ó0òÐá÷-bÞkó­!1ŒðYÁÀË™qÙÄT^ ÃPÊÇ=Gh"z¼7+ãC(¨ …5—õ[¼J¶—hl-[ºÔ¬6»@Ë;,6,©\¨kóÿ#1ør¡›%§Åî·žt€¶–yèiLq¢wªÎ¸vXëÍïi,Œ¥ßŠËª, |¹äñ›G(øÐ$εÖcš#â¤?µ҄s¶T—óŒ,¹ xÿF¶!V:pÅž¼uŠ©0"У¢£¹Á¶€øDe•éàz>à|ÿ€øxº|V[ÜÄîçY@ðynÛxm¿µ—(ì;9%ÔyÃí­Gv#SÆjpöÎŒÌ$HÞLþD±Í YƒÃO³Å¤h„fƒaÕo3ö® 3z‚ÎØ‰Ò×L®m׎†ÌŠÜø´¥bç%<"¼xºŒdøér·íŠ}¡ÛeaÈã C¦7q&çPж+ƒE5ûïü;=û%=.#¤L¶ÁÝSYüAVÎdNòϵÑw±šXÜšŽüw°}–ý i©}  ©Œ|ÔÑJ±Šó†FVK àXe?íêÕ:ˆqPûW²‡©)#ÞþëTíž;&ñüH\Å—!Y[¸}rÐz’ÂéÙbPÜ÷𙨛Ø_Ýé+ªÇ ´æÞ6ÃÆvéR…2Ü~U´ ~éê§‹@uÈ`ù´«MŒ¸5ìº;{‰_%Þ¿ã!†£¾G‡K,ö4~c·–ÏûÕäAh¢2.'ù l¯¤.ãBéŽ\u Ñ2nˆSÅ»‚{«Éô/¢ïG%3 îñT4>bÀ¶áÒ±Û›k=é”tß(ù³8 ÙÅäIô^Ï•?ãqå>þ›¶ÉJºÞ¤¹¤Æ y.¤¥íÙbÏ«dL½6®î¢Òò3,Ü0oôöCÓ0¤ M)ÊîµýºtéîB¨aÇI„š­A‚" àdz×Gï‹fÝõ Ü R¿ùѾÊ\€Ú/DÉfL]âÚ«ÃKNЫc¹¹Ç] í~él—/žÚ: _âi’fÞëïá–©xu#¡]Ž=”»Ë©¨R1YS,kk….?% dôUÿx§óeO5ÅŠë—Ö¹·‚×ÚÞ.~_3rïc „Âv¬¨ßN¬ðü&:ú—ÁKÛì7¦y B¹oã;F rsXNâ«¶¸ªm}Εêûž‘ÀiiÏu-<S^"ʒѶpt• ÏÂéÌJ+|àó[–Þè…\ãT=ï6þÉ©=íMÑÇÜÞh~EIÒ÷2Ø—¯mnA—àZµxÁ ÜÏ-#† 5Ò¾Õ&îá‚ÉÝïÄ.rZAçþaÁG'ÿ}±e\Ð/” ‰Ë{ž|ÍÀæ4l(áôËØŠ—&R+¼ÆPÓ{5ƒ}P ¥µø‚Š’¿«AªÔþCÛâÉ5að¦Šd:ÂÛ5ã-=è&ê¯nuÃ{ÉúùQAõ”pÊš "'îŸÅ[‚èãälú‰ë§ˆìáoþ@’Ö­ŠCˆ¾ú‡" ÓÅp˜®tÆ4 ëó/ñÈð:úöVA—œÒg~õÃ¥C·†’>wFËPsÖk¢àº¸¬ Ãn¢¼ @h1ÍÉX†êjz½Øì÷µòî(('/&Uà‹mgÄCÊÏíø—N<mn{ª:<µú–šåK§-hú´÷‰°´GáâÉC´ñ¬ù¯”»š¹+\ðôŒÝTg!2€ˆ*‡#þ_2ïêÀˆèá‡Iùë-¦–˜òUj`Åó ðž_ÖT]ÈtL0m ¯V:­Ó£ç½Çv9/ü7¼³0.t‹{_DQ&15Ëëý^dõ aŒo­y| WXŒ6­U†"çïH{*ùû‚®0§ßMµ mS™aÆ*Cf2/zF sŒø,ÂòŽ Pÿ0û£ª” ˆ'WõôïÕÉÒ9«þîÊ3¶ô½ŽúÓ8™/2ñGö¯ƒ8jœ#Æ»5ÿàËuYKu$F×[sÜžoâVLqªäqµgÒ9É|éû‚„,`:ˆUOÚôòÄ2fÚÙüÝ}¯úӭ½‰(~¤jÕ¤– Yš$Õ­è»­!ƒVÛ Êƒƒëa}|Á3RAŒüEçŸ7‚í{‰×§¨·Ù õ’–f“»½ÇíþNZ+´g¢7ô ÈP±ÆÊ™™=8~=æpð¬¥V æÍ{¶9›gzÅú>Îl‚>¬±H)²šàˆ/RÐI-jl=¦¾÷%ô'½!‰¼OÓÔ“¥ÕècU»îÆpúW@ü,˜&ÃÚ—*8´–@²g\A{@ ­LX=Mùn篆¾nHÉ…ÂÌ xˆ+óîJQGwJ8X¦)ßTÊXÇX^$½¼ßµöäg¯NÎjiDÝ:’xèÇYÍl§ö„OV@Ð3JeÆ\,„Ê;–ú±hgbh“l& —!Ú®œé©ãæ1d°Í‹›}–ap£»J²ppÿ'Bó”Êÿxä̪Tëh¡Õé‚åŒÞèù#±¾‘ä"”6÷¸%áÉà%ó—Ô‘b¯ü1S ßãþÀØðÑèø¸x¾‚µ—j•³ßZ/I—ãE ¸…õÍÌÀÇA‹‰êÚЈ?ÁZ·1½VÔ-V”´…â‚âl&I„LBêÙÞÒ ZÕÑé¾2TÛ¸.SÒý‚ÚEÇy8 Œ·BÎâ+ªleþ ÞÚ"CEôݨxsœ®4$[‡îäñôëÃ&“knf".§L”DëÝŒŒ89Œ‘±’À­ ]ŠÖ¶ž—¬Ç4Ó~6âlB4/Ùíe2æë‡Ȧ¡è¢ZØ+ ‚Yy©üÓí‚ÄÖyˆ§®;ÃQyÛQ³.‰ÇVÌu9‰+}ƒkšºº8ÿBÇ+™Íó·†=XW:±…¢í.ê)ï>Vi*½´uJ_ïå²'àÉaä4hû.|ÚòH?ZPYñщ$?|N7uΟÿœÃ´R³^~®ùåô‰&FÑ5¢Æä.g¨Iª=7/ÑÄ­K7^o/7sƒC #ãlÂ:¶è6àÔå!ñ«qÌùZ\–™·Â0Бžß”ªêm-ûâzi‘ã+m2ÓÖùR YÇÁ•6–}ÿ|üø#¯ú¢þ‹‰bH^•A튟H[,Oç©à\;cÜnv¹Ýq¦L?ùƒ:ºÁÅœ5s„P¶ƒO’óåc> ÐõH*4…‡Åêʯ¡#1ÉŠëö¥!1€Zöîƒ~Ù­¼p“µÝ¿7·0'ÏB œ.8 âQ¾]ÞÖ®d…™¨1ë9¨WãHµ-ô‰ž¬Û HàÚÂÓÌk…¸Rjª¤öޏÓy~>$ÎÔZؽ/ ¹ÁÀ´Êù±æ ½×쩽_`rVµ±–dó;Ç)çä‘÷åïYnòz8(Ú²r]r:¾š´êQܹ•Tx 7¦[z KÙX§÷®ßJ`÷‹þžÓ'Q\Lù~roîý“È”pà¢wS‡¬ýÛhQQ²/:ÕEsÝ õ ÌÂϸÑ[ï­ ¼bô¹óä¬V´wùÒÑñy0ШÝs2wW÷Ç`>"šáÅ–Ï2 ­ˆëJ¡Õ¢²S—+ˆü,ð=ïg Y=Ü]ݤUÚ yqûü¨}6ÂtZBh*ÒȧaB–qx‰óuÜi%_òó[4$mõ,‹Þ‰*…^ˆƒpoDIY=íR’ö?QîZíéH)ýCåÎXƒ~à{øþ¬uGñ˜Âè‡KY»ß NsnÜö–Ù¿uuJÞ_X‰un"•Êô2,WÜÕòNbè`Àëu:“Ô l÷³›áWð€0¨Vߣ̹«–GÞaøì:KONóÅ⇎ Þìás˜¤M·b~^ÁKøgªQ¶„ ‡ˆ ¹Ï|—WAÝGñeØoY@ߊGˆIS¶|"ˆ£öF_ûusHŠô•rL×ð…¾whòeKjUŠÏµM3Êÿtö±Pú·F¨áû$äÒgOsÖ#‡ºÄä©9€SR<ãö9þf‹ëÌäNÏñ“;U üÜ9ño0¾c¸{ÒŸËïf„(2˜ ü~YîD±í#Í™wùÔA BÏ>9dÿ a=P0uÖ]wqª>ü>Ç2þ r‘*¢•_^ƒÍMSý¶õV·Öª Wg~xàË=ñ9ËYQäú€"á·;+¦ìN‚Ü.zÙ­ÝÞTÕ°¹¦èçÿÈ¡ÜWÅ 5!.‹TnƒAš)ìrú—zÙN³J4 Ö¶e˜FCS,Wÿøký ˜>uïh”pÖŽc\xE\£˜ 2 —ž}lŽæ%š‘ŒñHH´uê 74Žý½Haœ|TÐ'—PÀ€-ÊjnâméÈã¸}FBüW ƒ??Ö‚ÀþšŸíü3T  ¹°ø›»ðèù|—Р1öª|â)Á¢ÙÃ&ã´Ø§1ÇÙv½d&mÍøÔpÇ0ÖÍÀ ÷Ÿ(ÜÈGt68µßIE­»îºÿOßÅ 0™V@ÉÌ,ðÿ)$ïwæ¬)à@þïÚ*«oë·™ÝepÔKuÒGëÛõ¬ ” ‰J²me³«ºsA6=Ë ;ó·Ú¹üôq8X&¸æ,†m¬§£Í"C–RG8¤šüwÄ­¿©Z9ÙY¦JÈ S”)¾3:FÚÐV˜2|éœíQçì”ùƒ|’ÊÏŒ^]Pà„ í ¿á kùŸÉñ®©©oTá`áVšïYfSJΙIÀ¼;@ÌÙ©>”×ÓÔT<.±(6lìaüNnò—e˜F6º°ÌÎyS&ce€'Æóòk†øízSšºø®º%$Öß7²–»V·®å„ö–4áý˜@MñO¿ðà{¦ ë{MóåÔˆWÞ¥GD¶ãK›}¸ .¢<Ïx¬Ë72„ûȳ٠ŽçHNà§_lT!íó-"Ômh€'^±XÌ – ª_áBª*ïá8=6f”'ö8.uç¾Bá›ì'™~a ´hÍãNîk{¬Œ3<äÖÈåemš) CøÕzGV¬FTİë@RÓHƒiA-:”½¤ÿTFeÛmÈ^ñ$æÁj®»EÔ·ï\„·¶&ù†¿…1¡Ê~•Yx#­÷ù\£rzaâûFÄÁ&cƒ·µ•ÖŽ¹dI윣üœ™¾ÝY 0´Zžt.Ó WG»!™þÚíòö 5¡PÁ´§¥iŠÜÜñÅ×CPÙ¼tU }æ–ïÉíÖ _"»ô'ûí^KuTÍ6,* }€l¯mÁ R ª_«%R3$4¥×yäØÉH²NG{0>ònk¿4EϵЕ9¦40âbèˆû—~½)øV­à«^‰ç¥K(Y¨Ìê$(5¦å_å®ßñ,”¯•—ÒÖ¿KOkë 7αCØü%,­lîPÀ®‡TÇTv§?d’+¦^ru÷íëU·4^úÇ/ÀØõBçd¹šƒUñ&»Oï@£ëÅ_þçH¥¿–×¹}™Ìn‚Õõ3…&,©]VO5ß/@êûk¹Ès|¯¶‚nÿ&<õŠÄ³ÝEʬֻ) 4°Ÿ:˜G |&Ñskó<ô²–õ {ͧw ÊÌË¥{‚ÓÜKˆ¨¨™]ÍxRô[?BÀ<7ÜþŠèèHNØü¾»ßÀOFÇy6å¾ø¸C[ºtа¬äð¢š=Už@à2ªˆ Œ”ÖÚDøÑд81BÐû¯"ÀñâÜM†šÚjXžuÐʳáñÞ"£æQ{Òá®o™d7½çT¢®æ›¦òNi6ƒþñçP¥’kAÙeÎÍóÿk ¸5nÓ¹MÃ÷”a¡§:»› ÕÌ:<ÛÝ‹fëó;×½ò´Undj%>:Óá÷ P»rŒ!µžúß4ˆÇ9öd¨ÏB½wè¦`[å#ó¥³Möž¯Ýv(îì×Þ ª”Hç4p,$aXÓ¤ýY¬Å?Kf44ßyŒ$°-ðµæRE0Ã ŠŽûq6ü{w5:§‚*… ‡Ö_¡¡oÏÖH‡™H$döBWkf¥²)Ø÷ºR¿œï2ç ŠÍbÔæ›¯_Wk1ÄåQ?¸h=pOÛª3CUÿ|#Å׃Ü]ûˆŽ*Ìm(Ù_9|}šéÆÑ J>J:lNæ6’-‹‹P¯Æ)!ìéÏ$íp€¸²e àÜÝþ¨žS}ûûé[ }UîMÒÄŽIÛ„Î>èDtÀŠqÆ™{:rVêÚO8¤ ˜‰ðÐŒ‹Üš»0ƒ«G }ŸÓ®p;¹=mLkÄëK~WΚÍÿ‰ˆ}®£TïÒÎØZ ãUãp­u„(ý~ÍýqÉZpMÜ(ézBöªÁú&½C’ZWû ây†ÿrq,‡s4·(kÅîœÆïH‚öxWvZ†»" M{÷å¨+€™àcý¨£°ì€¢î'†’iŠ_M®@ZÙ¬Z²c³V† vH‹ÞÑv%Œà£ ïë=cÎé ãb>t<~6gÏ©ù#ƒ ÿ&ܶ«»FŠŠ+Ú, kë̵þº;ƒ:F˱¬QÆìó{ÍH5üWªPHJÿrã.e”ˆÏ)©ìæs¼×·‚åæÉŠÙ4r“’ÑÊ› »Sز _þ_ô%Sì<ù¾`Í[Ö1wkºÌv¬ýìËjãÆ^Ûð !s¤‰å´AY‡@QJêk»ÝÏä"uyxlKÆU˜Rܬ òË”1èS6t0㿤\n1«ÖMñœ7ùÎFÕ¬!^(HÏæ«W?+µªàÏ´Ké"Ùkß½v“uš¾o³ùß²ÕÛî¹4(‹g[í°"i¥Ü¤4<øÝ (£²Ò_@ä§]ÅvDÒNŽ~Ì7%¯AG‹#OÝô<Ú¤øE^`Þ7Êuò~…¯c"O¼§‡´šÚ^Ó߇oXd³¦Ž‹AYr¾°„‘FÌ-†cøö–£Í„)2…9îNªÿ1ÎNÆ.ô,uu{°7Š­ƒ±Þèþ2c~’ rÔIBopN@5ì²ðf ÅÕ¸ÿø~Ó»3«Fi/#˜Öþd«œïØj4Í„ƒïîh¶YpŠ3ó]ï¦é»Í/º¥ë7Ìä&Õ· ô-­€ÔËÆ1ºà­éÐuîÀ½sÉÈa’væSõ£+¾4A$zšuŒ96Û*­'[M€b.¾Kei†ßAOÜbÛ>oFªTðóaœ¹€b%¿ÑfÆpYÑe År(Ô:žˆÉìÔ†þw¡£&±cÙ6ܽ„T­ÄÉto¡ÌòÐü‘¯¬P0|8é &¿Ø€/HŽó•LœÁ,'Fä!Œ­-QOESqÿUOBWÙ[0iàæÂÞ³ËÜ÷ Á¶XäÛÈ´‰û±ô à2Z¸ÕW‘=Î6gÊó_Ã&´ù䤂ðϼruýDrb û ý+lÑó<+•c+9d®“ç䧉ãŠZåf)Kña£a¬\ÀÿÆwT@1´lUß™Öé£)0K˜;ÆÊÊœWõîˆmJy®™G‰¨§~BwÇ‚ŽØÐyø÷öáG‰:ëäWöÛ¾*¦B|¢k}‡~Q¼=îÓ=aÙø`*<Î[ž;&/Y>édòÿ…)œ”FÖ–þøÑëÐL¶•8Ÿ@¹b¥7‰ØÍ¦Ÿ\áˆCXøÕd-:ÆÜHXéblë+ ñklVG§éƘIŒ9PøRfEøö=UÂÁß/t\e;«Ð˜¤ ”p¼© ˆz­ÿ=$ØWJRB옂¨`ÀrïTª¹ìRg?ò®næj_lÝòX·õW¦½Ñ5™døÔCÿiºF‹ÅO,¤(ÚÍÿyY3½¬èÔÈñ¥ùoßÿ‡ëžÌ¥½1<6£^†se‰ó²Œ_d¨Ã1ÚÑÞ܈ÕÝ$‘2•Ì?SKí…Y6‰“)àÃÕ«ëMNÔK¡ »ptq"nŸ†2>ušU†µSýæ°ðÁÙ×Mí+O8•öÍñ±ËÄŠÇw®Xغ±æÅ ·u 7‡ßæÞ»Ó/_o7#¦Û¯"‚éövÞÖAÚ•.A7´éÍyF%”ç74+E6-è†/õ¨fúÏî0OHØÜà"¼ ó€èYbjÞê‚S¦Ïƒä²ï[ æ`_*{¿®³oÃ-|k8—ãög ±’ã Í ¶ýË VÝâäñ¬¿,^UÕ0äµZ°Žö™‰–òÁ ø;¸»Ú¥1–ðÒ%"ò´w‡¿MÛ›õÉ'<ò tíM.¯ÊËä1«„P»;}©wºËHIž=¢ŽuERÞ`èa7rÕ&¿3¾é$KüY¤‰ÈQ0ʱlf@ÄcNÍ’¿9 F™Æýft_Fu…,”òΣE-p(œ4½ÂŒÒÄBn È P¡,iT+Éõ9@ô@©uÖ;÷b4º*;ФÝyH]}0aøãbn¯Rºõ2/¼=ý‘x~‹?P6»0jÕԛݡ¢ü§zGºh!í¥¡7“'|R¾ÐÄÚ?Ã7Ê£×bÉ«’õ”ŽþÅ”2hïîÕxËéï¬ù6R5mÕ@öëQpY:ÔlYÕ›(a“Xƒ@DªT6bAtÔR„+E°}s°ãØXøÉ=Ê™ððø)õèS‹,¸ž@Qè|PýñL¯w!\öY®žÞÍnIJ ÚÅœTˆÓ[ÔjˆáEÖ¡ðôªµ1N7êå…š° © D¿#öÙ«¿jÁø©RóÙñÙŽ¿y ÷ͱê!ûéõ XÅW=Ë& lÙ„‰¥Õ{a ‰ÀMǰÍÓƒrÑç”á ´‚)£¦²}•<¥ÎCu“;ò×¹,^¢Ç¥VàŒ;YR­"5¾ÓC)LÞX¬¦–@üØ—Æ<ÙÍýÚ%0M›ÒgO–rkQ =ý{„<îòßø¢}®ôŠ¿L÷HívªG'‚Nu›žqä½Lkˆ`’r8­»@¾C/ ½Í—E2!Sã™DL6ç¿w’m#ÃQYÆÆVëZ±Í3@›õ¦‚ö/Í™ió¢Áx·ì•ufåú¹Œ„õÂV Ic{öAŸóôQú&!º™kë—xhùBc5ëò¼!eé¤??è¿û´ÊVÀMP>Ê^~žÔL¡\SzžoÛbÎRæy4o²`Í4!ÖKl8Ñ»×\Yþh¿äM\ãÛP<ýäïЂ snUàË×á¢ÂW@ÜB8÷sUvõ@­6þhn|Í1,V“æ Š´åò„\ŠÃpì¡•´PŽiX|;“ Г_“®§àǼÇGŽ8°ÿð¾@ÏG“…€RÎî·¶UŽL`«‚“yé^}±}‰&ØbìdõëPÓ(Ò†Q‘wäÅŠ·uþ«hÐi"›UÝH‚5=—A“j,Ìðô&«9Î.¶î=nüi¿­ ¡hldR@ÚŽ3ôT ÀàF2äRÎû¾’ýÿö×hR§]SJ³Ùn])Sf^b¶ãU^D‘Ž*p¹.''áìíc¡dܼ §”Od¤t» ­y/ȵüÚÍ%¬»7‚ «‚lÝ@»9jíà–z„wW[5\M{ 5¿ŸHzkä^Â6¤ÚrÜf×cý×ã@Ç`<Ê–ÍÛÁAÖÜש«öÆœ$137S)ô=äh_EgX>(Gàsꬃޭ¼IÑÆ4wÞ©.u³2²ÆÅXØIb׌¥ ¹óÞ#ž€—nìZd Þç!¾ ‘жÏ;xæ¡7’óè««/ßi$X+åJ$ ž;t-‹°T0þeOî^Â.–á<4*¥cZƒÆî^oK¼H\ µkjb«.ÛN–Iýe­ÉY çćúÙGæè[u¤¬×üõ _Ɇ_ºïçá ÐE&üW9, Y…#”U`Il¾%¹ˆ‹†ytð³)±RÇ QC!`¿>'òìÛ$ý0€w™îæ˜m ;i|ÅÚÁ¢“Á‰ˆçqM±»!üž¹[-àùET‹TmŒë#ÆÿüV;à±Äá#þr­RÞ…u4=° ºnêj‘X6Àêh،ؖ+1ÇK¡JªlüUÞ¹mzÅË„!ëL’.C€×…S|GŒ+y, >Rl˜¬xªS"I beÇN𖣇¦?"\«zïfÃö³zvÇ"ÀˆG·Äº›K÷þ¢µ‹ÞŠ¡ñrãr`ö8‘lË;CS‘åÖ=`Á:x0&˜!Px ’¥#¢Ã¶RÆÅÞû~5ìCr.~ó6hÊ¡@O(VUh‘²>&K}”¨dÞÔø³%“gJ¯tTmÓœžû»œ=O¨SLå–º87›v…WŠˆBÇV4&€§²ÑÉ¥u;/¼Åù’c:ŽÿçÎ)J” ôg‹×ꢳ»ÎÙ³ð%àI#Ù"$+á*uí&Â¥Ë>nqÿ¡ŠÖ%3¥eGøëý§'ãÑIœ^zÓAìrv¯r>‹¶ Ž2Õ ±˜&C„À¦‰IJ © ßÕDH2 |.M?, ¾%ý¢RÈr —l Lx>ki :þQ«Ìd@åAú?İv¬×ÇõË u)3q»wMøl«Ä {¢¡K·Bó;G¶¼=VaÖWtŒ<rDJlƒÞnu_8”ÊI .šŒ”í¹X2rä×%Xà ô›t„3]…S3PžW*4m˜bvÃ{M'¤†åéû¡’³¤·¬˜k¶¡ÂMéVªØ¯c‡Š &&ò«•–Q­ó•šœ‘û×0¯ßÙF]sHÆ’cޤÌ<»”8뤞rïpë<¤Æ¬ BŽy®›Þ0"ŒŸ€–øöƒQCà¬ÚçÚâPr®ÇÉK»m*ù»Œ-ÅÙ½¾õ[=rvR­©à~‚a7Lž04\$ôæ#'§Åq¬ççu ëBëÁLýKÎþ†·ö“³d'Ϥšì˜Õò¸5jÕS¬ßÑÏ÷‰€«zc`éÀâ€Õpgψʓqyãð¸ V·eÝä"pd~ã³H•ÙÆõ‚2îƒüyU­Yîï^[NÐ*Óˆå0.'Ÿ¢Jýžõ/Ü= aXk~Ó)â!!{‡Ç0tªÇDg0LÁØN–‰Ùg¦»0\ý¿¯% n½Ê.ÍEš•JHñ0úb}û`86[‹Å(£bTa?ÜZ2 ¨cu»áÕ<¢!™ü¢©°|‡þêf7ˆÉU²Êó…6}½?nâ®u*ÂÌ\8 Õ•úîHG’×â)$Ó6 èÎ}¼Ë_*Æõ!éS…,Ù‘zçnê\]F)“•^Ìæ»x?gŸø^YÍשO@š°˜î›V(YfƒõV¶)ÞW¤ùöIû¿( «õòÓÐûéœÂ~%‰ÑÙÐ6h­@m(­MK N¶D©…®!² :rÇ´jßçë-Ö;Ñb«òžáŸ|ÇSA›%Ðü]y0~5ªÇ®÷×Ad³R¼Ç·k²‡â‡Ãá÷°‘O…¢’´ütQ(Š›E+{Lø'nÎh Ëô ›çy‘z"F›Œ¡8q¥î Ü~ŒÂ>ÂÚ¦7G8%:-¸0×—ó8AŒË?®¼"ïe£‡­iÉsË`WqwAé*¶]?êy#àÐD9ç•ù®®-Uý¤,7»å +¢®€´æôO”á–%O·í;@nðe hð×ÜáÞ?çläªØ.Ù Zç66@ß@7e±»ò(Û³çfljó9І֗“%‘@½‚bbßÊ?2˜ŸíKDR2{&þºµíŸþÅ(‡‚GU k’7ùÇ*Ä«æp‡v»ü´^kG 6ÔݱÏúà˜ŽeÜËÕÜ'³-k—„gùGª¹+¥@7†uȦž/÷a§`vŠÎ‹q¸>ÅÛ›j`ˆïì׬{]4œWd©£|2Jz G›fRçi`mDZuƒ½AÀ ‰°Sa±[»š$éÒá-í—Í ½,åfž±ì»Éb¯cìÏf D~°keŽ©6þÖ0n®\X[Yó]Δ¢ŽDéºÀí ®a܃œ_º~««Û7®ä§7Æí~ߤvøÒÇIô†'”syÕCêP õØ^d3›Y\š ‰ç ü˜@;‚F4\ïöhTµW5ïØkÙA„Ô{âÉŒ1 ˜Ð,Ôë UŽ—!C9íæÀ/üÙâÁgYÎLaòâ"Jðû|¼tŸ_¾š—N‚¦t8ëÇ‚Yù!÷-9öFZ»X*ƒë,~]ïb+) ¿Œu’¢ø“dk¼Â9Ðv¶§f³.ñ áRžàñ1h‡)˜æ×„ÙË:¾¥LÈÞjú¤L­Ç3Z$Hy¬x§¬äU6áÉ+¹J_µë}äN„#l–Q&ŽÊŸøÒ@»ÛMcÈvo›4—:÷JƒT…GŤ:Lê|žvlL^bzÒ„|ÙŒ»¢§¦ÙoæòÒ 3‰ òó/O—/dXAxèl#“ÂᥠrÎËöùlµ¾‰·ÙÔžðtHPøz‡ß¥ŒPÖu9e…þ{µš=öMú††Ñ™ÞìN' ?cûýï“^Gûü)¨§ÁÍÍ\JU¸ð¸_†ÈÍ»;„ñÏ-fˆ`>i] 2&ÐëvËáæt›Cb,L¨Z‚:nî·aQhâÅNñjTšª™–y* ¨íþê—Ž-ãÉ3ŠßÿHâ¸ØF'Rñ `AØÉù^g_’c±¦XÚcŦ%ØÞ!2ih`‡°¥–È N.†œ°¬[×G#ÄxÕOgyàÏ)žc¡ŒG‚âZ06†p}:ªbp)µSm&:xC³E=í~l54Щ%2®47EAØ)†+cÕ•ŠˆŸsȣưˆ¯óYä:1ÒûäÓ½ÂJq¡‘m/ϱ.±¥À¾|·5œÕRììÁΪx,’åºÎr;CÏŸr€3kæ·CùîÄ”ãý1T‮/^DÙ饀ۈ0ûùåTúY¶(Økžë?T<™OøZLùÒC|bÄ¿ÿ dx’rHëçƒOðÓ=–Îä½ ÀÓ@+K øVZÕw6• ¬RòÀž§®NžüVEÝñdª ú?Q?}Ó…ª úK}Œ!-²êÍ/Ų^-‚Ud:ö†*CÆÉ«.ñn]ú3G{Ç;þËÓ3ꨊÒn‡tÂ}n"¦ƒŠÌÃ7˜2È C×ýßÏ< €cˆM9}nð—ñpCI½W}@Ùè*+5‘‚ÙMJVM€œékßÉbõAòÒ*Ðÿ/}r 9t{͆6¸-À$_K›³óÙxÅ®[Eú •YjLjÀ•ÖQ0ëªXç£U臦ÿ„­ÿþ’šô§vót3*UI.@7À«ÜÒ äw‚˜“I“ ¿×y8‹¥l¤–8N„„ e‘ƆMqtä$5ÚßéÝß[0ÇŠ±~¦¨!_Ãh£4o¢°©dZïæÀa½ëBøó¶6lì5=xŸºJ—UPweY³&Óà+õ´î½fÖ²¬¯³¹ûpöp§E\FÈ”pýž—ú9OÊýdðج<™Ù¢klø^Xfp¸òæ.vèÀ’p+ =ÊÑ']¤œvË•ÅVéï¡(›X GÙŽZø¾mÓß]¯fý8Ö0²qêwô}£¿Ââu¨7Öq¿lÇ×¥¸bŒ–Gµ}NP3ÇÝ?7ŸÆ[£ÖÎÄÉ©Õ~´´·}Ä8í¤FuÑ…-‚Æ6¥×\ß SݶzýP€[qÉvôOÞ)·Ú¥,Y%p€{âUä®Õ¥‹6ûRã–äæƒØŠœ{–/û>¨Ö³dz‘ÍF´ékGtíE&Ÿ›#„CBBHbDï_…‚C–š°-êeWý›“&)玬êÌDz¼/“.˜ÏO¢é ÑC¿!ÚT G­P Í쵎ÞÊêÿ×Å#’K“Žƒ€A:óW‹À˜!q¡°ñÅ>¼  IÏaÐ.k êçÛûö?ïÁU9ûŠ/ã…zIUU^áWóiÃîëÊSsÛåÌOENWGkç±¹Ão¹-ÎHNìÍ›’è­p ÚÉk|3€ÁvrN ”VŒ ÛÉ&”¤…I›2ËRÊ÷£î9ØrFlç7W&¾Ìs ÆÆ^%A„B»çg górì©ö©<€"M›½7)yëñ—Šé…;ÕNò1Ó±ÝÕjØ ¸ÿtØ„}gòìU¢J™'¼ŒÐh:µ9§<\VŠ#!ðrüËÇL{>~‡Ãx“âf䃕Ã>ÖPÓŒÈÔ  ßè—ÉaÈxŽ¢ª°1ÓZ.x@Nçòpüi2­š„[9zx®Å`Ê «u'>HÒÑ ²ÊÇEìIe³HG‘Ctg·)|žrK¿tå…€çÝpKzP§À¢»`Þw€liFøÿñŸ{ÑŠÒG𩃼†Þ[*·-¦Žl!<7ƒ«+^‰Lâ)N¬’!¥¥ÿ A¢;¤½ºÒiß})ZœÔ ßFá-nÞ5Å‹^¯5xßYž”ñéÔÌóþ³V¨BDî©…Ç¿’2§I¢îFåö,›x \UWÎà2DÖv/Ø|˜YYçkRt¡æj”k¢œÊRÑò™ #œH¯ÔÁ÷µèuв”:‰LÑN’ èXÑK7wÿ¸vU±¹2a30)e›…¹ÕðVgsC7L¸^yº°R‘,7?ÙnI&á^X u±_¤DvÌrÏ/šýŒþaY.Š9À†Ž,ïœY`¥º·†Ì’ªðkvÑØ+¯ÐÅw¯‚ñH%¥5@[£Ük)޵rbÇ·l÷2×ÿ)¢æˆ¨$Øl.˜@ãpö³¢• ž­¬‘úZ‘½AÇ3YàÝÏaÅ(}²JÙ ¾&\ZÛ©:•ãÕÛ¨Ýê‚̯°Ç/ù¬àò8W¿Hê›”ÀZ–½Ùºp9äá;á´ÙكɸqÇÊßzýE•®¶·WóÎ÷S%_*í†ÉÏØOe-ªmæå éßKíYa[K»k Ö>'/˧ɅvW–½í8Ù¬pòpR°£Á¸ó¼VY)×aÚj/Õn×'mó~Âz˜ƒ5‰rù®ƒ°H¦áò¨Dª‚ÎA{yÑšaëõæ07- ?ãóüÄéßöæÊ3q§·#÷ÔߪxNÃŒ–b#çöӉƦ'ÁT^´óBð Ghpa¡ßøø™aL0;»yæaã½eCNÓ>¸T™Ïn;ž~«gMùVm¢+4MQ =åìuÛ4{¸\ìþ“É䮊ˆÌ©@Ïê—Ïer±kÏý§Ý /(ùc5 ì/8•€Ynãx7à-'ó3Ÿ¶ðä!¯¸ÂÓô1ú‰tˆm0²pHÑz-Xˆ@ò¸QzôB§ºùüBBÑÌs‰•bÆÚ€¬Ý£" 0¡ƒÇ±&¬ø´"aÏㄹnHe÷æM¯Ú¾¢ÁápV"bWsEcQMjñW”ã :œ9­®‹U»l‘4–6+Îñì^ÖÈM…oãþâ˜ñh7"ÐØÝÙ(¤½g”Üzbèr:µƒÇsb×d9æ]m‹v4©VþÄÌD¦‘¿m²’Ü#Šh.[Å<+´Ò´åÝïÆ¹ðÀo2à‰-[ôù|#¤Â¨£YOøÊÖÐIGóËgG=€ºšJQv]yÇ€½ã`. :³þâE8®²Ï¡ÛèA¨™Á"A“€6ßC Œ'ˆü O˜>{Žgœ/¦ã&~çXg e‰r‰ãw×åcúÉ™!;*÷ßOï›ÜW^ýò#—²—̘B8M¾,œªÆjêR­}íÃç²K2·áá<Š2q^ Â.^~P¥}SØž¹ ïÓä)Ke]Ú!ÿ”Éz~7ê‹£×5Mÿä¾ûç0Ÿ¨Ó­ºÌé‡5­õ±ŽOUK¨ŸZª€lÎÄ„jL LŽí|ÙŽzÞ{­¾](ù§Ôñ+õ6P@>ÑOëtR6‚Ár9é»ÓØ}"I´š¬· ‹8[“bÉÃÍeÄTáÃòShesSÿֳѭ"—«RÍ9(Y`fB×ß»*‹šT›«5MŽçÄ:•íwíu"hâÀ µÞGçOèAA¿g‡(©*M§›êi¶–⿃ð“ºçÕ˜ô½x¤ön›ú¤ÑP/Îñ;11ÆNǦy\ rÜ =² ŽôÒ/`4çÃÖ ¡(‚€ gYRTâä»ú ý IbEµ¯âï½™™ý~vxŒ³æŸŸ·ó”LQwèùQiÛ=óAw=FíSÕgã¹È—KÒÄÛ£Kÿ@‰×I—¼¹Uä tiXâëÇ­W°aHø†Ú r¢¿Â“Wî-õC ›fL°>ìSîU:°©ÒŒUfVOí?ŒÆÕ–å„€—rPp^ýP›…}ã ¡ŸàeòÞ—N\ +ɸú$øÚüj†iûCÝú%¤ò̤Ø{ÿ‡˜‡Ð¼n·æG8É:‚\çq.7s—R®%qš²Üûì‰Wµƒ!®™›b·f—§ƒµÛåÊxâ\¦Jô ,]éb}J ýbN¹Ô“æeËR* 3së9ÐÌÛ²­¦«šUÿÞëˆõv—,®ò ¾c„7¹ZSdY´‹KßçAGά›å2]'ïØSNÓfd\©”CY€€Näbê$¹kÝÊ@!~ô± UµªÚŒß tý®ùòÓ—Xô ø÷ßÞ'wTÖ_S"êÎ\2S,ÿôÑ›B5ÒT#ËÑrZdݽi|÷\ÿúɨñ:V¶;mŠ Ïv=0Ø¥„"»rCÉB¬R6âs %¾µCÝTÉæ¨,bG˜Íû\ÍfïäS]¤·O˜>"–àÅ]‹ß—…ÂֺȹQŽ:FÃÀÓl»3L÷ëöl€í]^Aˆ¤y²R*Åÿ#Q(¬;åêÂ|ƒ®©9¬î¡£o—–Æ^Õcño™šà±à” €“ýç ñ&¤ó´‘ÊÎÊùÒ4d#µ¢ƒ}Þjôí4-7V”Uü3¨Ý€ ý»Ït·Ç'lôÚîï`B3¨Pz ~ÑÒ¢þx`8ÕyÉÆk¢² š½Ãê F^'r¥nD1ß¶Õ^¢˜¬\{a“äÀŒ›õ™½Õ‹`z˜¨~îû ^‹a=IWiÐk8sVõÃ*³¹ˆr>Ÿ`ÄÑ *fÔée¹ºS¬DAÚ°I‰Zâm8HN(w·Fš‘R`B:ÅsU;ØaǾÃYÛ-òs)#7˜£ºèÄ¿Öæ“š.éÞç ù¥tzÎ}¬#¶eÔÈeUî.+¥ZTqΩ²8 “bb»tƒ/í-ˆÔF9»NåÙØï꫌? š°÷KøïCoõó]ëu¯£è{²°òM2”¶ I$†júçþZkÍ©¥Ò¹ZDÈè¦:øÊJªEDešÃšESpª;ÅɱÏYœê7œ&˜ÐÀ”vKQ˦UËÒ¢Ïõ¶]ú6¥D>k‚Þs·'5yF'áäbÔ3¾Råõ ’ÑGµ‹S摱NWíšxÞØ­­Ÿ¨Ú~ÐaVƒ‰ ›šø¼÷m.Ù$è T€Íy^Máð„ž“fzƒŒaq5AÎå'+Á«ô RFè7Ú±UÅkób¿LÒW8ÿı ÅÄ:R¼ëBvU«wºJI&Z†µÝs"Zéñ4ñ|+ñ|R¿;M*`w¥í³ŽlIÐXÈÏ ÐU¬|‘´¬4½¹œT×#‚÷MÛÀÌÝ-Q[7©|ë<<¯sµXúýgyçä³’ŒåoÚ•Îd«VŽ'GujÐä½@ÉMà)ÊS¨/ztGðTY+½Ù„׈ϪM²Â‡èvm*Ñ£C"“²º¸SU‡pŸÕH“%Û¥ï­mŠö hŠ£ò-2ñé¥ûIœ9oÃåsô2“²yH¤ÑÍ´|P«¨¡èWÈïö7ôõ- ÄöWN›·›{àް`¼*Ží¢ß2tšÏ‹T⥙f_œ‚Ô©”ëž7éˆSf9®ÅäÝ‹ÐDh <ë%lqä¤;æ&˜‡¢uàp>àísd8ÂIV¨UÐ9v†6—±áäçž×Û ©Ìƒ"5íP2&§_wæjIé£ðÚ`S`þo#2I&³4¸¼N8í™[?ëÌ^êÖ¡¡¡·Ew|­¼ô“ppÊ ‡²ZøÄW*Ãi³Ìø-ࣿB~n‹¾t"W7\9\B F¶'DÙö×"å"}ˆqáJ©í+úÕ„¯÷gÕ…ÈûÇùx‰NO €+dòl*ðÍJRéÎ=3òШ’p¡)‘h¸ÔòòR¯,‘qT³ÒâÄ5WSÈÎ.¿™n³@_Aÿ$µ ŒòÔL­ö¿ËGôÀ'‚ûŽÇ½töéåû´ûç%!‹IÿGýZûÓ,ÑìÓq=,Ì‚óS½ ·WK,÷tì ¶Å8?vФ-Äîð‹–I.詆ɟﲥ ¢éfT¦Äv&:È¥Cø° ¥Ÿú¶*hŠzÍ :ŠªtÌj»næXâQ° ç`ÏÆuÍLô=DŽ<7UªNÜBá÷ý( \‡ñ¬aޱƒn|—ÿæÂ‹)(ðÔÝn¥HíkJµ?m –'UXût$ Úϼ‰“KÖuh6|ƒlÕi§mꄲʒíôÞ#•n/{ÅšËø÷Ti£øÉ „ cúŽZ*Ìò&i#V”>–hzåìD[P²ê§N ðT‘6óó6Ó¥/Ý7Ù@£[òJõ4©ýãÑçh6Ã"η°˜ëÙI¶ÕS%5ýªzyñYÀó*À«¬ PI,¤,q±5ÏšýÓ\ÇȈ_{sý|a>L6¯6í•÷¤<°–éã³Ô?1ÛýH‹”+*ƒÎúŠËᆫH!ålêàâïãeýÓS3¦‡®m¡&לn¤›ËŽZÏ$öÅßuXøè£ÛšrOÿ?Œ¸yÃD÷ËËY4wß.R°)3+ZÂìåköÅÑ=Å+/¾JeBb«ö›Ñ_—F!~Ö½Ÿ7®º^tbj·u q˜.I[K½3"íèPÜ’ßWã´iK[ª³G”??ú×),!ò‡† âHú)hjz±Ñ8Õ¥mw`ÝAw¹`¨3¸„ÐW©£8`© N‚DmMîGvbLªTÙFoåBÕIu¶2p¥”؇ݞ/8Ô/Œæ;€Ô”¦æ%÷º5=«7íY2nıJõRîåþƒŸ&+h@‹Á)/öÌ,•‘9ˆ}°JÐUñ–ð6«7®8Gê~ é„*•ôu(⬆9hžwƒÌ]»é C·HjcwoüÔUOÍiõú’ˆ”§_éx¤ã‡óŸ6{"Bb>cÅ6|€FÛÆÛÊU‡ b(äNòT@@ýÞg¾mø!@6Ú2 8Ä„åù†tV,+8uh,õë‘òø|4ë¢s`gz—’³¡S”ß%†ˆ Íê]ÈUðý‘\ âä†\“7ò##ü¥€ÇâT _>ˆ{Æ lóÔ¦ÕžzŒ ®v”¡]P'tÃ’ÏdöÏóÞØþøÉqÏéEI¾û¡@œâÝOµ¸´A²!Hgº ÌŒ]é…é-Gz*4šþŽþ0NkÜ–› žA ò5lß¾û*PøHˆ/¼œ¡±®\-ø:8†õ Û_‚PõÛ&ˆ‡pŸøÊͽ`vkDHð¶mÒi]v!ßYÍ@©=ê¾AáÛè¸9Ÿ\D°9RÈ×:òQˆíÿ6Vù"&ºg'ýÀïeyN+åN ±(MIìa­¶k [#Ìâ®1W“2§k™ÞÏ'%Ô{yOa™oGþ9ލh˜G÷‘FŒHãĉëØ\½Ô¼!p»…Z@™«(¥ÁWel±‚2”Œô“("™Œ`&ʧÇ,Á"†pNv*ELOû¢´_Â×°]¤¯î•ñ%@ð`Ä \âOlúàäoBadÞ½¬Q`n0výÃCŠ9/òâ '+€~Oúäûm‹ _"Êwým4o¸‹52Ô·mǺÔ‹qŸ¶ÈàUآᴸº6èÆg=GÉ€Ûßj«Lul¤4²ä÷[cƒhk8/zRmÎ@æÏq¶-ÏMtGã6‹ÆõäLéØxÔQnÒ—Ö]Õs”…Ð⤧)\}Q„9ˆ?á$,Z.™¿0J‚ê²_êïîÐrS9—Ë„è•K =.¡ëcÛ÷xAþ{N$"üËB%Á`A…sÿè«t'Pš¦…(²™ä½— å.r½1·ü"ëR¿fµÈéU¹¼lWÆ™¡õ0,¸€ºkľ6Ôê¬ö†1›nÿHûbêI?".Ÿ¤ÿå+«!Sl8gë«kù΋ÀH'7e¾\œVJÚIëÄØÓ?šÎ"Œ9ÎÙc0ãŠôؾuþ‚âú,føÄcÃLKÁ÷CçYÓ*LKŒœgB¤eêÿ%¦µ£¢8Ž6íUS¥»äÂàëœNª)ð¢ÞM7úÙ4¤ð€&ažéKšÔÑ×WuÈVÞ)ƒŸ€ «ˆÖr÷¾jí­¸EåqªF:.Gü¸Æ€E~8œ17Ãg.GwG——Ô´Ìv«¡„0w 7'ÝÒ›P>".š‰æt°ëN"úÛì­ÈØéÂW*¿$a:kÖKø¹6¿‡äuyìôn²U8<ÿåƒ ~Ÿ8tF@ªN†õìæQèCþ˜~2E˜Õ/0ð>Ó ±i5LÞ{Xâ²ðò÷Rãê{î±lPÀN Ý,r}á$­WW?óþ×$´‹FÝœÇa·B«_w¸«aÕgˆÑŒcZŽ·é‹{ça¯ÑÆS ­˜›11–\ìŠÉ~ÓJÁ?‡ß–íÂ^=·ÈL³Ó0ÖAœ¼Î;øhÀ®ÝÖPN›9vªÊ?°x7‰ß}žF ‰ñ@aÇ… ¦²F>1.ß.hÃ7N»,ŒîIEó¯ÆÄ~T¡Ñ­LndÎoô!1}Ð2!;ôE'.ÏïùiZ5¦¯òòþäUöb3³êVvç€A@¿ÝöÜtaAKPÄMò„ÂyI¹üj!™2?çá¾ôõa°f[þs8ñS±…`Jµš–þHkœæÇRœb¶¼ˆ§æœÙŸfë›n¢ByÃã^@^ÖƒÚ°ßXgU°£¨Ù6ÃÈO à+17uÄœ‘¬f—Ű×õ_鑺(àöwÝö]("|B­µMÇ„¤à³#ò òWbf4uþü|<…Ëw# $Ðlõ R&Æ yPa…¯È]áâé"-®'òô̽…(Øýª7Ê}t'ÚWÒ‚Öñ05³¦¿F6º76IxºËm+\긱ÌH¼ëv¡Ô= l;¿óâx£BJùÃ7Ô4Zäg¯A¬†³èÄ%önRJ— îª wBHV•–Bë[ñŠF–°Æ‚¿¡N¡Šo·È€à ÙC(OÕ¯ÁìÒ±éË2C‡apKÉAõ曼ƒßúüÄÊuþ8q›Î$ü3ÿ3,ëïWÆñ ˆ_ùGDVÂb®¼Š§'‹+xÌ”I$µÃð+•ZÛ”þê-t‹(`YxÊ‚Ã->% ûm®hfmAËEY4Á;òk&ä¨1M1Pn"¼›Ì’ PX!Rþg9Ìo"¯€¦˜?Ã;Kéâ–^Þ× ëô޲Ôú³·Jµui#fréïÀëæÛѯ{øüÎ'¦;¦Ìä<Ÿ/µ‹;?}kñÿåD—ûâhõ«ºá[Œë^¶õ­–ðDãñjZwз­„滊ŒÔïÚ%ÁY4I°Œâ:›ì¡ 7W dY@)Iyk¹‡µî@óüP1Ûß*qVIãq mbþ‰V@¼ÏZ,È<“*$·t#üÎUV|êK¢&IJ]•º¯»™œý‘õ‚i‘ rñÏ ìsYWÆÚhSÃÔS&n×§å$¬ÿ;jM$ÌÒN7'ûhPÿ”¥”¨:VìBD¨z GÉòñà—®Äù‚…0•c ú±áqñQƒÄät… +iD¨K« 9Ã=]kòr/Ü}2‡ bËt‡rŒïÇsàû…ÌÝÈ>"úKÞ’„×2Lrƒ<,'éÛ¶Õƒ^ÉÙ<õèßH%Sy—ºê¦¶½ËL‘ß0q{eЏ„'Ÿ%)11Qk ŒvqÁgd $3¤r’ `qFFµ¿Ìs2eËv Œ†e©h;]…ÄtMʈ¸zù0BW©Êr êË÷ý E€+ÿÉMÂŒ ¶R§Q™†4|ës5‚©‹½”†œŸ1òT°Í¤ª5|ú¤~e"|¶ƒåVÕ‚š±l‚Y&ÿ›Ýóit‰ºí޶w»;Óa|:@éù0ýP@ŽÏ ÿ|„VY^ý&(Ùö ö›IÜ}å§9Ø™xEú¹»„£'n³O ¯’ž×ïuE?fuì7I¯5¾jÎOtÓB‡Z77ï4`^]€‡©9s [ã1lfv‡Úb:yÛ_ké訂*JMN!~%x¨¿78Cõ5À•ç1 „¯ü 5º€€‚²9› 0Íàìãý „×Êg/ÕBAÏIzëHÕøÃÉÑu"¬:¯ÒRHÓH¤Ê¶ Õ²q`…ª¹Ž. ~~.£ûRþQbýó/ÁÖû$Z,­1_Áà ,:À¤`nY'7BÄ\XÉ?׬ ŒñLó¾R{X“NÅÊwü=!»í”{=&[r b±nôêcþ<ÒÉ͸ƒ¼P¢ Ï÷” ·§õÖ—ìüé.)‘1¶´ꯡÊ3ïP——Ò䣩jéåÙ;[J¬ÛAÀâ99m„(ÝNaâQu 1*ú¹M1Kȹ5QP΋[DXŽÍ4å<’€¤ê=œ¬6p‡ãðìNRGÍ­ƒz¹æT37š$.ä“'æó ™++’,`éb¼м1dÞó%%k ydèöÚ¬ìÈ-È­£oT*FÇ«ÈW%?¨¥èÌ6C²=¸Wq‡®¦Ø‹ï‚´>öQe'ª+:³Ý³yÓ†!‚}f¿¥üžúçSú®jš*q]2šô/;¬å¯Rú”èiYò>„ÅÍ/+›¯šÄ\¸—q< _’ÌMU­Ïù¸ºÔÀ?‚šŽ ¾”©$6méóæQD¦»«Ç‘gÆDÝ»â°kTxþÛòÇ3$\¹©èÐì¯VW½©8Å?Ȇ~õ˘"ÍO AÆe° ×iÛ*>@†ÅÄž”Š 3~æÈêÅc8BC^ì]²ÿdŒø#†¯ú¸>RŸöóJ|óª6›ëÅ9ŸqˆVdŒ}Ü(nüX<Ò†pk0cþåþ=üMæ ¡;¡þ;W¶jm]G{Váš@nÈæè¦Š+Å $õe mõÅŽâhÑcÖø|ŠÄÿ3 ¥œ’ 3ÌŠÇ?2Êìr݈í—ëª) ¼Õè:¾Òß6¨§›U:AAÚ÷/ø‘+à~°Rö]¨úh%ìàr.HVd{!m®C:ô*œ}2#4䵄ùy öxÑãÆt‘*]â >¼.÷bͧ†J÷Þ™LJŒtuÂϼ8†ê9,Ì*ôŸ—­›ŒÇn†£y\S$ÁçišðõWît°=DÜ„‚⽕Èé/€7;µó’ª(XÝm÷lº.Ë–v_Kÿƒ{fÊØoç`{¥d×)¯¨YHäÙÏAjÖôvM>EÊóñ~«h¾íõJN” >MÃþ„ƽFÜ ?þpúI½µÐb£1¥HaåÌ2u¯–))Ø9HûoÓéÄß­i N ™gýá}5zw`ÅøátÊð¦Pí~q~i }»'”è-îû• ŠR°JoÚž²¥Ëu'œHãsfbëñßÜgWWøº÷ø¡bu¢Ák&lYì~YC‚ª7… kú¤â/ŸU5«±ì]¨GöÊ” ~¬Ð^ˆ7±“«ßò`(½€OàÌÊ…gŽOÀÌù`ŽUYu(i6͙ӸÑÛý.^½I»[‡&(^ÓH Œ¼àh>Þ«?ÂO,õ–w‰ÐVJÄA‚Ç.š–Ýoà›„pqž³j×õž)aJWÔÞ’Uå¼™CÏ UÒõ±ËpreÖƒA°½:÷¤ñï¡ ¬¬"ö®™äÚwixK=ÁÑÝ”¤…d³ÿ+\¯Ç“$íÊÎéåëèGÏW©>[rîÔv¼.˜|²á¨áw"GµÜù€áRØ@õ”Gª„]Ý=ouøÜ&`úÑkš›A{f]gíûëv,T#Q§çøëŒt†v­Œ­m7?eÕ·Öí1¥t"bpÁü¬u¯§ÙÉåBÆýú¡×¡V¯0´âQå¶RucŸpe®|b–Ìήr¬bÕ««¬/¯7ÄX²ÎÅb€[4¶1ƒ· vQÖÌŒTé·AÖOd¶#.1÷—FY%Ý×R5Œ‰¶Ú~ÛE=dâK…§ƒÀY ¸ Wàu^eEd”P®²1xÙ×¼ˆµÚ’”×è¬ë°“VÁš?‹<^ ƒ×"•¿êf9Ü×ô¬ÿ˜:ö0w>µLýòuZãÈ+£óò®ÝaZ’Úà;»c×ÙË6•*ºÙúzÕ¿8‚žŸõê²Ì.€øj¡ÿ?’J£ÉLšß–ÖðSÚ[»Ï¹4‚¿íkùsR HÛ`,lœ&ÐdSAìÆÿ¥“u;Ý·d˜1²k¦…u…Iƒíóaá­(-Äô:ŠŒ°Ž2SêÉÑÓ}i¤)×­täíMæ|ÿÄP\än½)\#cté&öbpý‰%Ju•ޱ ÜŒy¯¼bvl'x@ß>·ðÞ…U¾¢HP£øËà盄w^§û2¨Û*“EO„gÒ R}"ÑK‘sZf‘ê¤ûTØÂ‡&óDâñÛaÂUíç=–—¸†¯xE­úp–$×qŽõâjF,‡¤*²¤ReÁeO9²Ší½wZTÙäÈšW' s dŠ2ðH²u·¤¬õGŸ6(æe«ÖбöÂ"08Û8VIÉ£[:<Œá[—°3zMÌ\âÙ˜}™šË‰™í[­²_ê¹ïh[ºÉÉ Ui¯¯2ˆÑÿjž2ª7ñ,C=^(%ÛÈêáÞö±›:îÜ:À“ƒ’ÀE'˜“èÅe»›} nȼ¶ÿ¸!ÝïH.¦ …¹Ç‹–žr·t[ÃGÇwR>3/[Ö\ñadØœOÝIEmR1ßÞe}¬¼âW—¤‡Ú1à5$£”qÚ9EÏíÝù™ð.J>Çï++„ú°ÏË|V…ó„2r-PBœx¦QÌÈÂúQÒû@,(e–¨PñÙÝë9âG[²˜é6„~öŸÌŠ nXd8«£ÑGƒû°”W¶Ã]¥_ÂW×h…—¤P)A‰ÂÁ1‡=T‹ÛÆH(á)·´ûTQ_Z´oJ48¡åÓÄl¡CeŠ(– RV÷x ù?¿·Yä—Âø½rë:1ê8[Z•›ãÍMêÑG'ò¿\&pOmºØjª³ÐÇ 2sÞÇ_d–bydFs}¶X¤c ›‹3±°ÉL‚#1¯O¹-v¢õGYîM\lÊž a&{OUc¬¾ å+Gl£P!_¨›Ž*ÏߢX רýFñ:naÊ™!.?"…û€5[ý¡÷ÿ¶ÿ*»EJjâ—GyÏ¹ÑÆÆúT0e`µ9&âÖ/þBšº¡c¥]`秘ºØ<:|9?«(éÝϕ݌/ÒuÉz5È8lp äÍpàd²ÒN¾à¡ä.q¼Fáø'ªÍS“»)¿ò²< ÿ‹Îu³¥iâaáÏÖžì{ä±-Ù•¿ˆÓì\x,£ÛßôÏ‚}kèØÒã…/À@·&³Ð‡u¯š×”ªdÜèƒÆ;E+½ýܼ½§D¯òœo ÔžùóÌT8Äà!Æ ž öþ1ð\´=Îw(F­ô®ø‰¥:¼OŽ µÌ@ñÓ¦;±ZIaU•k/Ø\³sPœ7¼œýˆô²!ŒLÖOmY黨^àqӤް¦ v&ð=' ˜\M8ä^ÁÂŒ/_Äñ:êˆÈ¬Ü’ãyG“;c:¼‹ÿ1lz[tpÿcü§Rác™[ŽÆL”Øp(úb™Še³aî4»Ýl¬]ËUÊÌJ ¢5Ž~¹ÉË_«ò•XˆÈ£Q¥ÖUö¬Ô¾ 0iLröØKàÔŽjQhÛ8•½ã×-(Æè:1S]ܽŒñÅp¼w2_JV¡«M÷ý]Ùå©O/Ω˜ŸaM°>ÓG½M_Å› å¶â8.CÜ‹$:ƒ¶ñ€ÚMÝ¥Ã|£ßá¾;Šn„•r*¡øêEê÷fG+^B~ذ¯aÿãÒg PãÊüšÕ±ëËúö<>¯T,º­[¡òFË©xNÕ·½ˆ`‰·Žåfîs¯´7Tá¿\äŒ*»2<±»ÏÑfhn–=ÚŸàx‚š½LÖšH~Ò¡Ëd€¦”x_ê@mȉnÍáU¶[²NÓ¾ã*ûS£c4zy¢'ôˆ Ó.v³Ï߃¦áÀôEøºV~?ÚQÄ¥ JÈž—OÕL#±È[›‰s%’¬±,„1aËqŽDD¥°$w#­ê_ÇH ’h:B(òÏ68­¡÷æ»°YùƸ…dW*Ìè>á^¹ˆ†û­dn=ôäãî§…Ú}ß’<õ?Ö¼5tsG€a5PÄÓ*­#Aûœ|ßÅf‹fßZšHŸ™ -Ë_[ÔÚEðXPÆ`_JV©_ L6ùà,öTLÇöãÖúÎ.0Ctƒ½<ÿ¿ö)½ÎYùBªš£»£V¶/äx2^²Ø½új£'cð®ðvÝXÖrç\,﬉‘¬ÌT„QE÷øG;šYÜ ÝÌ£#¿ìÌ8£‰ÛF Â2ɈÁήbu áBM9óÉü/ÀÄ<õÁv=ÑÀTR8<ÁYï寭‘ÛvP28ª#ÚöU¸]–à]Dªû[]6¶½É–«o1´Múz'Šô¨'5_ìÎ]"Y9ðµLÓ-és4¾E÷Y’+Lžf´Ø3qDë(Ø#=O6š×o¾Éöù½ìmÀTóL‰õª…Y`æîÌ:O¢ å%¤z;D8§§ªíéWoÎk±§o,Íáµ¶ÄÂà(¿A¿c?]#šÞ+\aPcðJ†n9¶2š6çÞ†5Oר–¹þn©mŽ÷Þ£sÌU9Ùï|CH«|/ –AHk•¹$Îh^ý'˜wbR+úô¶ ÚÌè å’±ýDû:§.8vÒRÛd…@îC®}M*ËÈ5TÏÛÖy(nÆ7$¸°žÛ476ýVæ±v-=8a–‰üż–2»À&Ô£à(7ÃüÚR»ô¨6©Qùƒ¹8ú–vK‡V’1D5Æ÷ðÿÒܵ’ÉMÍ+YíE ÍùzrnÕ€-xúæéÄaxà\TÜð¾y1m¦’x{:åÙCÌfqë!κ.šâÌ‚áÒYîÖ>ðÃöI ÆÀTûp³+x〧}EË•rŸÀ‚xØä‘À4å¾I†¤ÜB@©ÊÂÚâÌSb½æ(w6Œª(§ç’‡Q'u¯¼ÞF¾æ#s=ÚDÒ(¼iÚ‰Ùƒ¼*Ù,øþ~\—GÿV›šÝÇDÉÿ™Ù»ˆþ6—»7"ž©wIʳÙý¦ç~ÿæŽ)Ýs³èòõ{®¦ °ªz!ý:ü Ï7ÇzƒØÓÂTù~¸©öÛ‹N5/n'ÕmĵúãJ$= ú.w*hÕüñÓo·*§Ëäå ×1Ìÿß>k_Íb³G½kú¶X†™¤«[tí6†*Ø© ]܈²úí$ ¥þ2Ü $Kf[ðëf¾År”F²tF´àVÉ€?CÂê”p¿wh$)‰åÎ%¾1xó¶@E¼mÝ ì×]]îmÆ€é¼Mþ6kÁU€ŽåœôlzËü î«]V¬9Ÿ{B9¿£çCn&c5e©0Ä|OáK¯è@bÓdV•d^ÕðäÝOmÁIß“ül æÂÑ-ET’àôç§ î¸Å€™©¦•)"6tëÕ”¾ì—-Ü{ü´^¿.¿¡KÉàÁCéF-ÂQ›>Í»pVf(ÑX¹þWtù‡vÅÀÄJ„€ªðƒ ]²צ:ûÉ‘n0¹VáﬧÄýºI{ÅANðÊð¥úн§ˆ…Ý0gõA´\‚Û†’†¦°ö‘Š|cõÃ{¥Ü0|*)'Ü Þi^ºÁïNž„£@‹7=㵪7ÅXØCöZ¡+[Cahä)2ÙÎèãJ_f[ c«’m”ár囑-òp¬”üãlYíImý ²iòΗe=a= åÈä^Âxýsî2‹dm3屿¯FkÈE¢|]oÊ ÃèëvÚ›ÓêpÁ¢úƒ6îШvˤ’à0Xæß¾Ýá¨çêocã…ª¥ Vìýg+ÛìcytÓ`Ò·} Ÿ¨UhNbÊ+%ÛTÉÚ¯gÉG†Ç™ÙܺCÏ1þ°­’ys½Iù–#ÎGÒ †Ë|Ádc=óC¼AñŠoï}Æhnüž¡'ŘP8‚UÑ•9‰ózLÉ Ýu@½&l½2„©…<ãz²Ê®ÄuŒÆìNÄ¾Íø\¨úÆž)µžMNtvbEû½ÍA0]à$I…™¯Ig¸¡1¯#yægSMá¤AûŒÁŠU™íÖ9ÒIå Ú´Õ†6Û¼r<”¹Ûìæ—o¤m`eÑ9?G4É$|õÖÝûµpR‚ lè%÷}ÙB/`šYU°ž¶ô|¯I"ÜÝç5÷í»ŒÞÑ"=`Ù`àÜÖ·6m |tøýå9>k3,òLYù†‡¯6"Q€ Æ€Ìuâ@#lÑ"f—‚ õN¨Ü$ØÏ|´jÀgrDZa…æÉûµ½˶€?b}H$ª¢ñÁh¹ÎGôêY·ž=ã0Õyº)G¹¦’7VYéOMî¿–K ½°î°—+)£—VKô׸e-£—‡ˆµ¸fI2šr5 ‡+€£é´Ù•–ªéÍ=Èqy„@¦ò?ˆÍ÷^ýÈ aÉ®ªÁ*”­£,=ÎË<²î`ˆhmhºŠ„cº£@Àýê×;€—bÍfj'@þNÚóØ%Q؈æ$JXøÁ06u|IC”H{±­ªÖYùGL iN%ÑJ-~­½'ztÝ9j%>mš}¿]1ç¼ ¡ÑyEP.–·Ü^ù´WN{Ò³½ºFHÝLØÄz x²ñµC?v¢â觇)MÐÇÑhÜ:YD6Ÿ»–}Ã[ùb¢?›÷ã*ÑÙº¹VÎCÜ7)á=¾uþ8|ý´­éx†k³Ùe£CЮÙ¶\0å¼Ä ýö"ò:|–á9:*§D"Ž…š—àjÌ Û‹Ü€•KU­@Ÿ°=Â[=igh>ƒŠ‚d!è˜÷ii›.2ThÇGT@Ì °}®÷\j›¸<°-†~€Ÿ¢¢¶ gŸâ qAÚ«1 ³ÛDø%4él¸?ÆØÀg’ëëÇA m¥¢ò&‡Puöá/ÿ€cWlÍ+HXSÌì' pkÝw~âѸÛÅòé âÊY;Ø–CùZ7 RšÏK¢«EK°wJãKþºeò߯ÆbÉšœ “yN†6X½<~É2ˆ“|Ë ™þç‡X+(ð¾¬Q \wáué…CßÜ0(×39ìvÛ…ÄâS>ýgêÍ}‡bEB„Bäã_™i©-Ë<ÝPoBöúÅo‘Ñ{Cc¼³33 ¡Îbxª·“MƒƒyG¡¾ÖM2ž„Íxá¸âéRuj*‡¶¾Fïzû$Ü•->•¥':95»”A»H@ØôFáC}°àD©ŒSÚç¬Ñu&GútØ –"uÄ;`ÏÁ[$©"3Þó×]ë¸5e`ZL“.};e4Í#™Ñcç±ÂS=’~ùk¾Æc`œÍà\q+j§ «^ê@P y„$sªÁ`èê›qÉȸ”Çì°°“ÏÞ_[†˜<Žq$Ôþí1_²§qIï$cÏ{]’âN:ßÚ_ùö©¿dT!¤”;a ¸rߣ°kß3ÞÌ’fŧ’ä[GªÅ9 ý¼Ã¾iÆàúÑfz+¾.X;[ÒHÇÙSŽXî¹Xú’VÍžŠêæá㙩”ýµZ¤†ˆ6e'êÇ= Ü/Z'¬U~_ý'\ˆÁ©Ûè0PþŠûÆNõ1®w7‰ƒ€í×t2XíEüÍ/Ék28<óX®ÎÙ`m˜*2üƒ±@çœÞæ±ÙÌ+Ç×Gé¸È»€š0k1ãÿ,­¦û¥i·`‰«hDÊ®†Í¨T4‹:]e+'cÜÊèéñ±¢ä):RÔ|­ê¼ð ‘r¹ÅSä͇®$ÛÝrÃðÔ®»U0wjzŽÛúJ]›p7‹Â.ôÍ„Edhì€ÀÂüËL4iD^¦NzùiôþÔ8Öh¾c¬d0ÉBN¨€ò˜ˆ­þ +ùZúì¸wîÁÈ…]Þ/êc°,Næ>Y‰ä’}Šdާ¶¦}>p[]´‹f+WÅÍuå§iöOÿA5e":é5nͽ^ê8[mWH}ÉÄŽ|'¦­‰ÂàÞ6±ˆð¸´{íH_À>†ÁæÓ2–; FŸŒðG0éìi ^pµ4–æm²iGܤ=ÒvÃÔdd9œÚ×vUaÄ{U‰e;®;í¨²- õ÷#K5€Ò%ÕH–n5àõ6ŽXã wåÍ/G²Ÿ[õ' ÊѸf:M•¼·‡õÕx8%®$˹*!*Y“Ù>t3òßçÄúUc>wLô;Ñéܬ½”*Eó„¬CÂÔÃuDº71’ŠRð|§Q§„=ñÕ0âørIÆ,@Öl{[¯sÈš^McGo²;=–û`°"/®;“ҦϠP|¸ƒ6ÉB©½ÞcÛ¶W>ÈšaîVñÝÖeÅÛºÆO‚_a\òKèl ÉÑzǨž;˜‹ãþÎ_¦ã®ÂàPÙø–Ó´u¤´,“·ëM ŒkLqzï© ƒ{Ë/ÛòÑ[Ü3†ùû”1º7"ÊÀ+¿ÜT²xÜ:#×@î#äXËQNØa2hÿ7ÿ²€ˆPs_MÕ8Píiç?Ô Ì‹¢ëg:RßX¸OMêôtkR|ÔRðñ3";˜cŸEÓ†ö‹ÍUcJ2G“L[h "šÁ6ħctȆüoe;RNê>LZÞ@:oØ86†nÓqJogTÆ)‹†aƪP!fRüë+F0âRžcÁœ¡Œ/9ìXhÓÉí˜ÌþµÔ´³.¹ ¿ØOoRNÎd¯ú!•?¼GLiöAeFaÔZZçâ„éø HäJFÌc;ksޣݭé@CiÃîŠÖ†Š¬uxíoj›ä¾»#«ÌÅ(Z‹"êßÃí‹rÛÞøÚÏP¦÷ 96¹Žƒ&0 Be­Ly9®¦¢¼"2½_C¦0hUl¡&Pž€©/˜Ð$¼þPOuDf[E0|9g$\ã¦Õ‡æV^˜§_JßèEåï‡þ>ñ+…ÈYä3Á…µ¨1ŠwÕ'¬˜§Ö@&È›NŒ©þ&´#Çç€ I–.vøCÕ/NðA(%v®m¦’Õ™ìf+Ê.ûVu±/¯Òp¾ Ûã,÷ë'®à b?eMþ„tß«…ؤEÓŽ•TJo»ÖõTrO F´§¶ÉÓ@nÞ¥Qó/Ì6h:S^W”Ã$I´;Øvc–X¶Š®¨C¦A¨LѨ”Œ5}˜¿ÕYj–à,MinLk}LpûWܤI®Œrk›¥6²ÌM+"AÌÉ`oqÔ÷g2$`ªIëoKœîО×J4YN´Øž”ÏôÄC_u£qí!SÈ–À4ˆèàå¼6 ÷±‡úÖÓZïÍMïÕ»vÙ¤»:¿gÃ&. IX쪀@²>)\«µÑ;XðÑ®<=h«5†Zí|¡(CÚãhr%@‹Á\õÜis´P‹>Èi€c*ß&Çfæ`v¨w}ž–Ìq×?ÔúÇ_©€ªwcÃÉ(á ¨§ÓDí#޾‹¶˜Ç¯Bê²W¤4Ô›T{ú`cNµÜ;€­¨¯.|NUÒ;Eo©r‰˜Š¿ë:YrŠ™~ \'2)oãõÃâ®z5Â<Ü‘7CÂ8ünU~ ¥mV9gŸh{#$D!Æpã‘—³{ºÜǰCþÜz6;¹YÃô±#¼{Úmhï¶ã†-xˆ÷ÜÏ".-cÍ«ÛvŒžD¸O¹cÏßô"´±ÇПÔ#´YBPÞu‚þc2z‹ D1*SàPu-Ä©Ñì«úïÀy·*e7ÃwFÿLÙÜ€¬ñ×èd@¾ÙΓ §œ•Cu3âó´E܇—°:FΈ^µÇDÜC Ž<¬xäŒÃJ÷É·|zî"%ÿ+…ë‚´ƒ“Fûyê Üoê“ÈçûÓ“{naÆäºßW”ºÙ2çhÉñé*W’¹Ó7Psœ¦y½§Œ 2Ó(Ulƒ {yZ ¶8¯w@;_l]•cÌxÛ`õ 1ù˜ç\M8ï ¸Ç]GB¸É伪úmg¬û[ÇKL~¬q·ñþ¥<ýÉØYä ”ó«Ur!̱ÉqGÙÍ9Ío%Ó‡ÎP¨žW]:ª¢‘—†4N¬‹hú`²‘s[Ö!§™åˆi?yçBЍ¹>ê¢þˆ¥Ñj´ 2Ù½ì‰ÝÑ]'›ýð½+¨Ó„lÀð`‹dÑÇÜeö-ÝlÖÈ%nÌ–™XWµkÕ™îõj¤Ò|ì”8Å ´Új¸i7Æ}QÆëü“$¤ ÅÚõjÿͺ›‡/&^Ç:Âu‘gMNº›WŠtì@»åè•ìoÛŠ'Â\ G‡?mùç"+ËQÆûY;?jHçRmuµ´º2h¬’ôE‘`ܶüAsZ‹y`"œ¼Nþž+.µ‹Ï"ãÑœ¾)ºEî3‹îBšÆÆ?³ê…ãôj÷%é<ÐFª’9—¤x*ŒŸ4[¦Ôž—µy+R}\1‘s«ñòçCpg¹Úr‹Ø­®cÿM ^s0’ ,›¹ÜÜ2aëâL…5Ú‘T½­NÜšYI >d &Ìfz»éw8Äu¡0ƒ©úV€as½Ù[6WF¨ÊsœÆßöê Ø Uª/øäÎcSKÜV® Ñ%f+y/(K*+Å G‚z3Ω}…gß4Ü”aÑp1n×BÄ1mN<ó!éȱ‘Ä ]ù ‚>ÍQ•k7{Cf´¥Ù´c x*çªB;TùW–}[ë1ïçà˜XjJe $vðy1ëúPY¤3b…;iH¤î¶ÝTMVdúØöŸ9vÞõ ê·™¤|òºëùõ¸ØfD(§Bº©Jcà [õ <¡|À4£Jû›9pª±§‡êe=çѯ@}JË1É•f‡²Œ|ô™|$†/fŸ±RCPéÉï1)ãvñÂ[©þÿØ%El‹[ Aå-À1íÝ'r›.f¼v(CË®=|´©?_«.–­ü:é:Ÿxjÿ8ÕIäÐGt|cÔòY¶¦Ò’ù™N†R—zI¾Š¿zJÄ¥Ï0lÒÊ*à‰ZÕJ›m6³0ÞìÉÈ S{™–E3Â’Ð=~pÆ9¯3?ŽœH‡w7ˆÕ±ÜëaÙø8‰—ø…UCšR[a ÅŸi¯jù5[/PÞÏ‚ÜÅÏÌß›™_2Ãþ!„ÙUn‹G%êØžôBé]ôt‹ A-ôÑ5mÆ­â®ú 'åZáf…±J+‚’`Ÿ|ÄÃKl±qX·Úê3©«XM¹³ã@/¾K¹C•ô99`áZ~æ¤Ð²Ø™+\°„A[œÄ­•ص@®Œ(v9”âtq¾¾ oɾž=1Ug×û‚©"ÒƒÎj£2¬.<­eÒ³ä†ÿ!$¨^~iP"HK ‰£‚ÆlÏaÝýZy¬ ÍÒe6%¾ÖÒá¶]¶ îH6ùƒ có/¨µ82žÙU(ùGzxO»b­®ya,âúD7pªZ° é¯[HKörà«®<(5 ŒG˜Æº¼Ó!S¼FüÖš^ ø¤ï?g15Ÿ b`I³ªÖµU¿PH²ì&+éã<ŸY:(”¸+ ªÕ„Us†ç e9““7–âp%—]JØÊô*?Œë¹^Ì_Ä ¨ÒƒuϺ&oÀ=-÷!ý:jàž"'uþ¯¼Z†n~’•=¤¤ÿa+âØÎ;õˆûU÷J>eô ²ÙU’‹¨éëK­Ì1àÍÒ–ñ›o9hŽΜº`Q„¥1]øôðx¤vEý¨2.ö’˜ÎÓÒâÃÛt‰ÅÓ¢^s¢"¸´=lû¿óÃÅ­ìˆ!޹ØÊ¯©u§×CQ8„†ZAPTukÝ'/äf<"õÐˈ~Þ“¦s„߆÷ßYA¹!†/·ÜGW³Ð¨—2¤IkWDɨ´/ê8Û›# #jc `¿«¯;"Éh?/Êë@­?ƒ÷ÄÍÒ^1ØS~'È“ARþ4E…è?-8ú*—ÿM‡ h ïà$ŒæìžX?ˈþ²øˆ“&Ѥh6¹Šh¸tÞW¯o©Èjв ì’^n‹óÈx*H`×ß7éŸuË9öˆC‹á6ÖX`èò© [{˜Ÿˆ™g@bñ™í«P ·Œ0î–¨‘¨•Ì Ëà0¡Æ¢áZsN@´ú0¸hCö™³…Ó,2ž=9Ì[„€Qv?@ÒÓTìÔŠ[GìÝÿqêÌ J£Ë¹HÍ`ÆhD”I9öß²äœÉð…3%­ØÛ3œ§„,âùfï›…txSºç('7Ýë¶@…¾W·¸ô½Ü¿’°>nÔûõ}ÎÖõUÄ,S‰f¸¤k<šëõ|’ÙäÃPø 3ƒñàõ.»øUp]…è» 0½-è÷;zK‹)ÅÔÀÉ  žSª‹û|Ê`È™QA›´=9F¥ô>8|˜8prôá=ûÒ=Þee6‹ªq„çûšËDAW+?·—ÕÂax©ðà&lÀN@™ §æò鮿ðÑk'VÅ@@“îÚZâ'ö°Òo+®èº1Q$¦g‘] ^…jdMÕtëoYsÂÒîvyÏ 8d+ÄgN¬t-½„ŠæQˆ0§^Æ`*sÀsC|Jm¼¾‰˜—¢ï §ö± hÛœ&Fùç ðìÄ0âx˾úÝâpå3À5ÙÄH9µ[p¨H»jüÍó~Õv¡HÞ?Qçás\ jkÄ w?ës$Õ‡„å쇄ûç´WIGó@n¢ò¿¢ íS׺l§B*Ö´ŠÜo:›^–<•±ëc©É73›Qwª´KÃ$3'ºZ*êJðCAJ#þôæÄTKÏš=P™•2ð§Þ÷Uî[©ÜÈ,¹>ܨ˟ôÎGŽ•Æ•ìó¼Í½A#Ÿ‹Ëy5j¼©Ob¿XÏé–óåã~èR8¹k¥¶° [qyÇ®¤ë5þLå*£Ñe/QìÉš F0}Ì¥šØGÊÄ&Vž`>qô äúêPÿÝùI›]êIu4LŽªåÜqoä¼ÍÕ©UGz¸€@Ö õQÁBê&zœ^ÁÈù0›ÄDã{P4Ó(Ó+añx6Ýk7i§E¥Z.yULNͱÞP̪\üÓAÅ窙s],ÐÍù Oµ p)ü° gÿÖ3ñ\D8)ZnF©ÈêÜ+k´ë¥gqÑ.u¯Læèjbz‡†ëäC0>ÌBæàÝVvêzw”êþXµïÃ@=¬ø9Ývæ7^¼†gàÃ~y̾˱Öq9{Ol˜.û%•ÈV E,=eaŠ[Ëoß!ؽ¸QUýµ‹P+й£’ö:š8L§Ñ»èLÖKh·À+¦…*±È ¢-þ´Ö ëeXC,.LŸë0¯úò˜LbŃä"€¥fêä±iµ¹µ6±½y¬ådòŸô“ÌT y)žŸšðbò‡Æžh‘6˜YYIÕí%—úžË¥…iå×蘶jü÷F'¦´.?~ÿl9½pî(¨o¥GFÓK˜ã÷Šx)õ9M òÏC#QqÿîkQÉvYd¨ŒÁŽªÏ‘UyÆùb$LozL0Á—"S£ß2ÀA‡ý²$‡!nNN¸n‹J÷R§Q®³SɃ#Qa5ߨgA6¡³€·g7#¬ÃQ&zõQD•£ }%°"•¶ &Ýàì¹šŠ¶7·A³ú³Pï)n5¾|+Þ9À nêöºVðZ¡}½#â·»¾BøÑ±™”µ™/'ÒÝ DýL¬’¯h&‘þÛ0j¥aåxÁîqö»*‹ã!¯Ý®ÓW”#²Ög‰(ÎyU¢D<ùd4p»y3)L»ÚÜEï´¯üC$†FùÁµ¨êReBîíБØ[i¸ÎˆÃ†dCt ?½pþš3jÓÉèÚS¯‹”{؃àö­–Àˬ`&3–L)UôaøÞK˜=Ô}ŸhI}I y•¬ ‰t€x (÷=í)íK$ßâzrpÀú,Á“]_oP0nYƒ‹GIèÊ6F5ŠŠ`jÀß !c) æóÌË?ò0y[QJ­­O¡ÅÐIƒæ­ü#bsع%ë =[Öæ^§/gÐ#œÌÇûWð0q¿SÓ”sZ &‚̓#ŸA¶Œôv¥³Æ¼àÅ–0ªÀÂá?¹¡qêWÇZkôS¦ž ¼@(LÇ rÀ#½µS¹!Wlþwñ³_б0¯Ì$Âë—9çm禈¤|Iö0ãÕKò•™˜fBpjÇí_Rm#]Ð+4CæM“ ¬HîF½êhÞ5Ì’Ðʈþ½±7l@ßU›m¶<8Sm/Æ»“Ú)‘ÕhJR È´nÃaµÀ9°MzÚ™X9õBÑ5ó£¹ Ïý±!ùˆþO^IÎF#ë$z =X ìðj'lÅgXLÁ¢ÍÏKíߪLø=W}Õã­-\éêY”/ yoiý˜o¬aªóúd&Š&«,jæMzohôE!•Ë䵨)ýsƒÈKLßÃ3`XShxç{ÿ˜Çš·cvq4èuûÙÏäÚ¼̨õÂ6ÐhÕÜ“ŽoMë`M°|ç^ÝMýØ‚sŸß@jEC×T*†Eÿ¶•)›n©ì¢4߇±+’CÄ|H ¾]ñBÝø[δM*wWáy?‡&Â4vXéß©Àw‡Êm`&œÞ_°Èõ«ÔÐMδÃûn”vÄBÁF—Âìì LñãTžýÌ—%¨½w×ɇý댾ln¨¸¹™ÅüB¶ôæ†ÒâÕoÁ¼XÏ€¯kM÷*XïŸÁ›å?›„ \itUM2ý³jŒTwÌíŽKå¸:ä.š°Ÿá8':^¬ [²þÒä’ #6vöù¼Æg¸&¡"tÆ—O¢ Üfâ²Á•cšÑ_´ñÛV[÷Ù†òú½ŽfŠ#ÙWÂNßÅ÷ÅyW›ofÉ5œãF¾pp÷Cæ'õJ’!§ÂTE.q¨-&Q c/0êåêåæÜÔf4ÖAl*1z°h¯¥ ÑÞú+›ÇÔkØßš‹‘9u}* x!À•‹ è«­‹Çáøaå$VIªrój&½Ý ê] ÍV…Yj…ýŸÖ.‘‹§f…Õ4‰Í,1©ñâµÚbÆ5< éM(QºkoJq׿\nÿí¿ñOî¶vë·â “´,ÇhUq²Víg xSötŠ,•M«iqƒ®ãÎO“´úÆå ZuðLP…ºiŸ›ŶD=¹O¬p,“†E* ]ÎùHû}¤E.®_sê÷—wz¼é s/ßìÌ ÀPeiòá¶Â$`—€ÝÄ~Õr˜ØPŒð=¦ýµhþâµ![¬ü/qã3lùàróœjG žPYÞ6~i¢­š`H 4þˆš«—òÿ›¥£Ñd}gΊt­ù¼["eúñ†'ÇjM¬l?„Üü…Œ^ëc‡šö2Ÿßº"RÉ7¤7 ‡Û›Æ”m‚DÄTi2n°’þ¦/ìΨêC¯UÄh_îÙȾFçÅØÀoÄ—Oºï92Òû™T9:ç¼8Ý´\À ²{¦j‹­º™Dò½1xþ#+ý[ß'p¹8tŽ˜Ïšfc?„p`´Ý\bòÅásAË45ÔÙ¥ÝÕ™9 ™ø¢µsúoà2†æwùÒÍß1ïöNÛAó{é½%OV¿Þ¡ú…ÕýÑOÇŠÚæõK!ë)Õ{óôòn‡_™KtPáʶ¾Â•Kv üË;”kä¶òÏ´©D0 :/\;M¦z·ŒÞ—-Ú ,ö“Ø^Ý×h×øj×}‰–íº”–b5*eÏÝ—Õ:ñ¸0IQOR£ä¦Ã]L5apÔü«äš«ÊXÊkk³ù¸ÆßŽÅZ‡G ø¡ª™;س¦¥Ý…œ{Y*Ì$@ñ¨•ë™§œÑx‹=V¨U=û+³FÞuªµ­oˆZ¼Ÿþ®-K®”ù«Gæ‡ ‚)0sMZëÅÌ6 Ììþç0ô }Û¾ß|‚ÖÇt;Wï&BnÛþ[ÜRt ´žgN¤µù¾¢ÝÌef»µ:¶Å·Ø+òhÙ×.#ሠY³WR_†ó±:UHVí0ëî7¢O/OKsâËÑW`ŸæÀ±^C9”S 4"oÆÃ2ð7§avp[ý*G[у®ê Pa­fàL¶Êw|oÓʦôÙ}¶N”|dW´*'u0V¹¨B” äÿÈ‚ÜJ}U–Õfž2ûoxWþÜýµøO›¨!ÐvHŸÇRdÖž<*´x§™‚4¦‰'GPLþ6sìSÔóñr½é­‚DïÐðjÏwp-ªeMø –Ö߉+q¼h¾+!­pPãR¬Œ;¿Û¬Û¾.żŽìÈ3H.>&—‰a5ñA©±”./ªvå)Cw÷öþ«d›#@Tã6-kD"ó!íA1 Á°ï)¡×dL ô…wx>b /ªö´1U*)IXA˜˜À2&|Û#[*Š;-#LòØ#Êgr?9è›´¼…l¡²Ñ[s׌vùy¡äŠÕèÕGé=3ñÑŠ;å<–aRÑL¬~;‹¥yOŒm1¡E•ÝMaŠÞŠÀ$\Îhmûê¥ã«Írš#nè"BYN™,Ðaï$R»|A‹YD_ÃßêíñÚÊmÿ'ȱhZ41™ÇEWåvÜ|Pñs´Â†·”ÝÄÌüw¶n[B×ö,Ê4h² -S’øÀ"ŠqÑŠ<~ðIíì—Ôàæ_¢ªKšçp¸î‰Ž—X>p„˜X„ ˶ÁR±ª€$.C 6ùu5äTgú0Y´ ©=ÔfÀÑd™Éàz¥-ÄC*„Ô-鉣£ƒ *ó}[š¼6T‹fÊkzb*|4ò<0H|fü_ßpÄÑî„j¿=› <Ý­dˤbGôðˆHÎлŽãÔXeFH™Ó®´8’Ø¡w„ö$4ö1¿ò26‡²’Ým‘»àªI¿tVóëG®è¦Xíì‡qm¯ âqéfMnDjtÒq£ ­KË]Ò×ÃѲTëW ªB© "½(ú Y^ÅŠÏÒ"æÝnCѬfV‰qz )_eÖïle´8QE„ Å[a6ƾ)ŠX,bÚ}+È"ý?Xò$Uù¹s¾ÔŒ !ø¢Jl+WÔ¸ºîQ¸žW]1ŒªPñ38 ̱³¨šst‚Úmmãňÿ›@Ós*Ùªöΰ<ïà y ò|ßã·™V Ç8ÏÅ‘`tŒ‰°ýì•êºTåxËZWOꙋ%y&þBìÓJ`±Ót‡! qȯ<=4;ÊoÖT»½º*Ì ÿl]bßMËúÀ¶g7Ö¾ NŽí3„ùî´XžA½:ª9ë~åç&WßMýÁáXA9l?¹ƈð^ß·yíFòô?òÁýG1P[HDÇ}÷ bx˜GcMq×€ƒj¾·¯ˆÁ8ç»JNÄ`4µ‘Í»e»úÒ•†q6˜ÞeO&GYc2­¯Ä÷uœB3‚ê8í5õëp~P^vrùžPÀ†"íï‚0 Ћ] SZšçª]f*?,r'áBJ À†´•ûÓjtˆÇTOœ]ðó¸¹Å´IM+:ép¾ø°Y»V v)3xƒ+ëÙû°EtÄû)½»á|²íÂŽ>¹…Î~ç•zÏû"b }ŽÝä—#p‹J¢›xUô)‡M ëò‰¾ðöîA·!A µOI?÷JRÂÓ‘ÇdrþPG޵ˆmËA9@;-Új#3ØW¨QÈv”zlýá犜_¾Êƒ¦ÝšË¦¾Ho¬_Ù½DÀ‰:æÍ:MÜÚ:ŸïëW‰- #eêèäSôL&@×WÂ7²>â@@@¡>{Öӽ찌NB 8 ßU+‚\SÜ–ã<¿Vø¦kX×ÛÏsÁKÈ»ô¤Õ$s—z`¸š š’¹Ù¸ë[Ý_ÿ;› LŸNïá^Q0 î"0[à9W­jx¯Š_ËnF·¯êÜïÆj{ìW:$6b¤diȲ¢¿| ýHÇùÚæÃ¯ï ´þ7K‹w²F«|¸ Ð\6w2…Z®6ª¾Âç›N …ŸÏJ[@¼¿©í[-šÁ;AUü,äÙZô@½ÆgMØÂz¨2×陜·›qu—äd2ã¹ÚOäìr"œNùËu7ͮΫ'SuÞV»ï–Í(¼{ö0L†Åä»BåÈä,j>Á`(0ñí´ƒ¤0Â¼ÕÆï I¯€©£VGî1eµ)ÚY“»õO%»ƒ9oÞÄ8¼nM§W™ñóÜQ»¬Šº¼ê¦N’n?ÐÎ6vL›T=03Å#U= #í]b^ƒï z 1G ï¸§ã?ˆIµFí{:™´í§}PÛ'§t…[ú¿ˆ.$ÝóÇ]hk}yÒRøšQ dp˜ùsž ¹´d:³å?PwÓ`!€G’|ݷ懋 ÓUœ}­,¦´ªME´ËÜ?g!"ùõ¤ñÛ(D@j°#ÁÌÍéŠZn×íÓ­ç¥:^¯!ûmï"ÞÚÀÐ]êøTb8Êjš¡Ù)N…$j8ÑpdäjÊÆGòpn«Í@WAœm w¨ðB¿nk8zí2Ž#ù9tSÏng Þ$`RzÝãÓôÒÿ½Lé9£-"*k¶‡×ór‰éóïP­¥‹ÛÄõo3ˆŸS€ôãT§Š³<}1¦#ˆê§Z*:I0—WœVîï6G¶±[/lYÛ$³a°½¤ƒhATjJûå9G~ÿ¤ßiU Ü7B¨žüHè-š÷KâVÓy²xè „Q mM¼˜å Ñ0è$·|•„±øÄšÀ3ûO¨,íG¯ë1r².Ê:H±ˆG¹$+œ/Ù÷®².KÛn™³2ˆs ç7Úô>ÕÛÔ±Ñâ@÷ÊX›ÌL^E¤„Wf¨èŠá!/!.,®Ú\óu³„Eƒ™þâ¢i%îb¶êåP„)H;¼zM{ÓJ“0nÖ‚y‚½bXÀ憤ƒf(O ]¾€3 ZspþV×LjnÌô&!ë¤ÈXÙ\à‰ô•Ä«C‡°e¾ÎF¬èsÛ,¡ÍÛ Í‚ÊcÉ•¸Ô@)Ÿ•–j]ª6ÂÓg ‹OZò=‡lÖḬ̂1 †ÁËS ¢Ô†6µÑ’TÃ1ëó$«›™¯z€‘M.þ†üŽ)×E”2è„R_´ ¶ÞݨȘ$¡Muu›––ÔÀÈ~òÖù# 6n'Ø4Ò››MO|°Fµ×Æý›0Š##VuÑTßRº6 <áK«—œ×°ptÌtˉf[gäõKÖÎËè4Rá`õÀBs4Ü`©6mZay K›)mÈýô笸½Ì!uÛêY\øÿ\>òNLlpWAd©ÎÏíÙãjv®ÈU>F bÞ¦I}AÆÒþOm@Y­0v›v=ºÑbÈw`ºÏ4Ëòlþh… ¼Ê–õÐgCd±à½^a”µÉBg˜ ÃûkMTŭEÖòƒ½E`ÏvŒ¾–žÑƒº û’(w¹gwõ›¤Fʰwfž-$Á…¥OÈêâÜfÓi1*ì âÜ©\Ñuó4CÔ‚xï‘™ú¼tÊ"ZÖ’:,£Äôݶ²í?í âà“ü+Gá?ÇWaXŸ"–ý– ùúRý@¹;.—@¿¼}aËMk-nË×héââËyýŒ0&—´(TžV>Ö¥’2 dŸd£×0´&—BTø½ŠèX˜äV¸VcS2È{r„ÁÑqùMˆcÐC2àbÞ×+hB¸Ç²¤¼Æ‘U‰ÁÔñ ÇÐrµÔÌ·'Q»ŒKf– w£]uvi“~‚ÇÌeS *kÙÄŽýâðWHÆl›¦d¶wVRÈ~'™cZÑ@¤ÌÆr§bû6¡;tÙ@³Ñ3FyQkt*$œëµ zuø …â2qÞ¬K©‘e]F¾鑽ŒšðtðuvœÆ7Íl_ö(!&ôøYÇEé…H渱*E— m¾®ræqjŠãê†t¸„Çi0>âš}ösi5bk“ª+P&qÔ.E¾1!¶LéŸ^Py»dâ¢KV6M= +Ûösð>´ˆ°TØEö‰Á‹m$EoŒñ± »âÔ‚¾Yù&‘ÇR9‹t¿âí—ÔAO›I½ºÉüIÅpâjÖ¨S{^ìqšÄFGZkŠ ^Ú£-›>O5}›¢Ÿæ - ø.„“=b$ÓRé{Ý·'ÞQL°ÆèçÒ è`{áù[ü‡és~SûÝØ¿/K;únÉF‰se&sÅì„DúnªV!ü‚lƒÀˆåÚAwúÌ\¿eûOÿ“ÆÓ3þÕÙ€òpˆaòy–#V Á¦Ç±PÓÖnÚI“Zû«1ôd(%f…ÞƒÂì£ ÅI%¬õ‚ĸj†¢RÓ²ëw‚2‰h†h²M…©S6ö‘O—ñªJ_nË?]á Â;[BéêÆwže+šÍ:‘& â·çUëÔD&œ^›Føú0E_´6 %üo¸òLåó{yj'c\ãŸÿòÌa Ë`~­./‹(Îèg¿Æl\€Z%©5]ˆvBú¡£©¡ˆ½ˆ9ŒÚ‡¸’O#ÐÊ©¿ññ Ù€6¶1÷fPóÜ…»èÏü@6.æâ¦nD.>„5Ï/×Ü>N{aëN8ÁêÑDÛ)%¯"÷æ|Û’kêMË‚Y øvì¨÷WÃH«Sª]#®—W÷M I«|º†Q7êóßý‡EòÙ8ª*P–qzB³ni©kê0Åý-¬,ÿd5¡h|†nêx¥ÎF„0\SVz:/;¶%ÁɦbšeØUGÆuEJl~\U¢%¦ù6³fx=—D%ÝÚ`¦åøuøUŠ¢¨ù>€Œ/¡–H+‘š¼B„W•Èã»m¨ÙHuHÕn_»UÁ A®>æ¬FÀž nâÿcE²:fM¸ê——uêD» ƒîÒB=cì?ë¿°À:}Žïðð™M7¿1%‘žgmn²;!ðŽc.ãBF —p¬µÀòp#¬šy$×ZÀ±. ¯?ú,g ÀAì¶€µF{öqà>;>H“Á*öbl3×T>IWh6ÖFúûc¨=?Ÿm;ž ;¨ž,t¤:WˆžÌ2¡in þÙµò{f(I&’[¥|.Nþð‚áõïÿÅÎ&¡‡ëU™@¦ˆF¨Õž¡¨ƒÒ®$ëfX~¡Êù¤ ¶ÓµKÝ5ÞŽºÀÏVÓÌŠ¤µFçÖx@X*ôZÝ—–ÙZ|ä³™ ²·ç w8«\6<åŒ&€¾yñdÒùÍ/ 0Áyœ»@¾æ…>ls%ñTUÀ¶(š=B¾µ™kVÇàÞEÇ™òé !k>T>2PqÎ|ñÎ5€µ›\eç[J=]ÝÖräï^©ì2! b×*7S!™h+lÚkÅŵkßâö@«*E&<ÓQÆ7+¼²An'áÆjÚÂî6 …‘IubÅõ@5ëN~2 Kï—Ÿ¯›8 ’Mi^õüdu¦*õS‘-ÇHYá´Ò°p|O!6*LßÈa¿åtèN”òLwúúì"=4p_$½÷G/ZònQJ¢Ð.þ?LB„¡ \:Å?ßDh+Æk‘mk½Û&šòŽÒ‰‘Z¦{ÝivX; r#pIZ6¥Ý•m¡ÓžÚåI‚Z§r†쑨œ ¸ääC´Œ Š2 YîÞ‘D1 ýhÊ‘æmJS͇jqƒ{wcÇÈñÙ¸Õ˜æâ±­,¯yÇ2´Ã]ïš*ÄV yÑpCÕè!Íæ ÚÖpÑÑHK$ËNæ°²•iÖ,¨÷{o2eîÎy#:¨”{Îq®¶2tÉ&7”™òTŸ¥kªÝáXêí$ÉïÑò~$ëåmð²&nQÙ÷[zY8ÚYŽÝêèáy‡ðÀÙ‘«Û”xuÞ™][Xv`‚x“h|Ñᶸ~äUëIãdírÊó9$Ƕ](¾SÛÏ9 ݽ£ˆ§Ã F5.Œ"BE˜˜;¹5~:qó>îÉk‚}b¯àù_p˜˜W㟠¤æò+Psª›'õÌõGÍõÔh’c\­©Ì6ô`8 7:áZ1£x˜oY^!çnOôcòJƌݼ½‚‚É0VES ›û·ï‡{¸ÔEBÝzJ«'½Ò /¿ßÛ4ê†gϯÜsslõlv¸°Ÿ–¯ÔH’‡?Å19P‚JTŠÐ݈š"ç­óõó¹nû²‹½Æ8’¤*¸ðR)Ád 5Ç «ÉÖ£ß] Âp-.'\–¯áþBã<6‘úñsà‹  O ‚˜(>)éêåÏŠEp JÎXW¾îiv*Ùcÿáwgå¯ ¥(Šóò}­ªÂ ¨Ñ— P| ¬/Îû¼¾ Ó<Ê È±âȨyT‡«N)Fæ‘ýx§€Ciì„8èròx| ¸èa£¡)ôb]ŽÀ}ÀO=Ñ Íô'{0G&"}™¸Á î¨ú3Œ·wxžÛš…¡µrô¸™ƒ[âÌŒ²éãÝveôAbœÛÝÿAªùO³NáþÖ÷•à)pʱ•CËu0Q±ù{vù}KÊúzb«®GF•JZù¶ÚµEÇ;òæ¦Á9¬Ë $Ï2Þ“ áxȇAKÌäZ–U.®{såMÇ!Sç»Á+Ã(Ý ˜>«Žu,¼NÖäÖDÓ¶Âÿ$´ •S—ãËáË%¼wΆ^^²(®ðýâx+µ•m¹*K²éI3‰¤x=ÂÓøM½™å±]ü˜¢ ‡gÕBSº3½ÉQ¥âþÎÄJ5ôB¢Î®ã!¿pÝcýph˜ÅkûU#Â÷Ë>œðYiU> Ȭ̵»Ú90Ñy½…̰Žx›æ8óuå°ÓèËñh<3j–q³šgEö¡sÁÁ"™/G’;•™gnwW5Ôχ3¨á÷¨=n0œ`ú³§4è©×ÄÈÍU¶çmQ’} ŒAC*&&‰´”ŽáÑž˜n8¥ãŽÐH)T8Hÿ‘D—bE»†œ´e½Ììsp½´•ѽ¾–žâlsU¯ý)]ZJƒ‰¯ºh ¾É*R<ƒ‚d"À—€Nƒ\?¥”1éalïP±æ‘-ú h6”’iIØhÿîâiÆ.~ÔÙe»F¦*ê.£Cé©( ¸}Y5c8}8Ö>P}¨OSV/Z‰?Ç]U¥rQ¡á ¨üjÐ×­¦vQㇿ?&±QR±@gÓœçyøG—£^ÏÝ©“‰•7/ÂYO› X=CÕ[α>-”Ú¯¤%¨Ýå£Ô–jÏX²Âä®Bƒ{8ƒ³yäwò=gBô7\Âï·©}\ý“G—"F”{9Qw¯p!q/L-AX°±‡í¿ þÿò_Ñ—Ì·þ^g¹ùŽ9£Y~icµÉ¤ ŒWÁŸ:“ü°Õú'ßœa)Ú@ÎpB`7‚¼ ’óLì­•2ºDL÷—¹“pÏ .}Óèq ˜»~P(Œ39惙q݃’>©D£€hWbˆKçÛŠSÚ¢ív¼h †X®S®æ_¡ý’¯ŽÖ³ŽÛE-WÂ7.öºÇÔå¹ggçç}—G¢uê•„C”Ï9‘›‚ËÐ%4hך›g·dR©:Ì%œ¡lM É ÝÁß„ Jªu¦öéÏtЖB×g*úÊy§©CÿApÝòéðSÆjO¿ñ!…ÛªK½µÀeUžïÎ+\Ñ|Hr 9áþ¤§‡­Ã-YœÄ8'ÒÕS["?j+1C¤”$”Æñs7%ùz­5 h<=åáç%8Êz8`*g…ø9ª‡²©4äam>–ˆ±QÖþ‡Ì€žW®‘bI»Ë”émÈÊÉ\ýqÌ`›œ®%ÏVC¬ær¾Qã²Ùû˜oú!“ ®Apdœ\;.Kœoã ËaR†Ôèù\|<_x2À.8Úx7WÓ9*S/HQ­ ¶ÎP¸H2s戸å€}Q8ÞÍl{ða›4Ç”ƒ¶ð¤®wiídà/ÌwäÇA±F[w¡‡ }·käå0ùމHi ˹Oee´ÿfHŽ,;?«jµ×2v%4Ký(õG)¢ ¥ú%ýæPópàÔ³_7- ÞlxK!Ë Á^ª!,6 PYLׄ®¿#'rèÊ?Ñ÷±Ç¤ýÛ³Å!}Õ Þ®~$'Zõ̵d4ŠÓ¸Cÿn­pÿ܃´OGl laõºËð9±Çœ;3ŠQ å!îï=½ðuÇ#¡Tÿ‹Ö²xd˜{ìu^—®?ý‰Ô£(ðùI Í3â£ù¦/Sÿýc‘j3÷ §Œ&MRØ7Ķ(Î,üÛO/A‡¦^µÜ™gqÂ'ú'0À0™ÑÏDd„´ZÁŸZnz2§µ/¹>Ø÷³+y¿8š!ˆÌwþn§º\×ÉeÇrÖFŠ¥¥H9%k%õ5ÁvõCûp~á¡ümÊÙ‘‚™o‚VˆÃžuL Ò%5ô*bJ}„¿W.«k&éÛkSI·i7ªòJ›~HèÊ$WŒÆã?V~Š™{¸Ömªþ{|þÅ”qÿÌ^DÇá~ê/ƒ9Ј%c=ØW¾ê|Ûd$4!´Ï`Æ€¸c{wØÅŠ«Fñ-5³5 Fq3µ5W)>ñM jÞùG,ãÀΗ?3‘Ês-MåXbýš±8¬¶AñõJcôÊL° ÌÓ&O! ±O\‰©Üzö”+ ¯köK/™¾dyºb¡KQÏ«GÞ0 n(Î~ÊâHÌ0KÞ,3š‹É«'2{«Š‚¡s8E”Äl$w“Ž0‘Ð;"ÒåÃ;ñ`°}í?D|KXŽ£¾BÜb4˜šèýÏËÑZ±LÐpc0 99YDNú1ý=ĈÜ`At…iÇGg…‹ðKm,ËîÚ8;n[B›Ïœ'Þ]½IŽ ­iCüÅž#æì…Ô–]}ñìßÖÒ_G<ê““ÝW¯uLД[¾Q{i6 ÞO íéâÄ/[WO)D*ÑÖæpÖ Õ¼t€ ÀU¢w:{-•â¹äêXUÕ„¦¤'¢œç5„#@Ã̆Œ€xq ±þ%Ìÿçƒ;ÞhH.À!jq£œezK3D¶Q¾ì¦—¤~ ñ/Þµ¿ÀC5“D”üsX@}®©@›]“+oL؉&T×YŠyV«ý˜8]@ Uê­ÈlàV[ªY·üÀßáàÙè²1·ïŒ¨Ò_7YãÍT:ÐeœNþ…4BÎüz‚` &Mï0¦4´?™Ê"³þÈ:4»–*× À@@ð¾AuVüº F1qÔ“ŸS³.œÎà^=²Ø÷XðôÀ±óЩ!)†ßÜ"ˆ-{F÷‘èþ¹"8‡ÎR"¾ cêÀ„<èHÿí˜Ä⨧ÊÎÍr_ÊdqÉ®Z¦.s"MYi€c^ôJg늚ÜîC°túY~Êõm´|÷·¨ö©g+ä«úІ.m2M™'®æl`ݦM8z-„W¦0PoDò8#®ž’Œl50‚d4ù70æ-0ôçõ¯ü«ˆ ÜQÐm mÌM/|zûuxÈ€Ÿù;¤Ð5´,jþ„jT×Xå—Ø¼?_³iæÜšlþXB„ñ€6¸ðû"‹«ÞÛK\•H“pöžŽÕ/Ö$¢X4|Ô–Yl­ÖònÀóÂZbButCš‘_k×7²Ñ©óhô>æÖ½¦ç¤ê,zni v¹VêÓsvímÂÀEó‚%H”òûý' ´¼#ö"æ—Ïclt¯¨{ó®µ@Ædòdu0à€hiIžëc)ôö»K~¬îq1ÞÙ\7«ÏЍŽÎÆå£˜X>ÎWZÃJ2à††Y9él’¬Ç,_nÒøâÞ ÝiB%‹¡­é±Zçû?rÎÖDò» fÿúxNõº[³Ò1ª½¼ÃÙÜöLwŜРû˜mTÙlœAÇxsðqÇ'ßÕàùÑERˆ*Dµšô±/õ”v‚‚6òpleëq^윭~`î]lñŒÉ’Nú+ ¾0ëOàöEÖö}iŒ„]m»›(²L'Ëùi¹üØìâCÉš'.§øßM( ë×þ9 ´úá—×ý~/Ïçà •߆S% ^Á{Á •¤^®éŸ“T6†…M¼¹8ÊÍŒê^_BFçmˆ~‹¾ "‡9Íó{úÐçëòÙ¿O^*Ép–¢ÄÀªTZ0†êo½¼û¨sðËâ|•xõÈ‘{m¼²ÜšÎdtïµ]ÓËp†úˆÑA±œ“ ´¼ÑpÕVH&›G:¥uÑ@o¤=gÿüy·PS3þãÅZWeâ¯÷¼zp§QO4ãmˆ-v†Y(v ¬Ð VT3%ƒØßì­IÓ"oÀ»;VÌÜø2p–l.Ncc!¤‹¥QɰóYtæĉDa˜{Xyk¡¿þ!ö÷*¬áŒ=‘Ýì¶V¦û ÎB zó£ÏòLt» ;î4Ùoãc\õR9\C`»vb§÷廉cž)œ0 —Û§ËØŽ!o™Õüæúç†|Ù샌ì_s§ ^ÉæíÃF÷äN5¥·ìBî$WÎ~Jè ÙK4¶mNy<Ã]È™êy¹I ˜8³åÕÛî&äGÕÙ-,vge›8†4“.🦋£‹U'J¸ËÙ!˜Þ¯©«¡µÞ¯‚he÷?,j•—~äîiË]å\u:®õaÃûÉ Eê×=x&ÜŸº«ˆ5Û-…$’»ú¹Š —¨+#¿Ó ‚·+ufßž6í{GhÎa„Í‚¡ŸÓw,¤Þe 3S/‹0t}9£¡¸² -Œ4…35)%ÈLO(fÊK7ÈD‘|ÎÜ(T °¶A¥L¤åРׄUç[EnSˆ£œ™ƒä¿ØóSQ˜€¶Hu‰ká…R„V»2Maù¢èÅ{Fcüz`ލV}S9x†Öý ñgvÅ‹9HÁº…ñ‘ç°L‚YÎ'Q­|Z4ö¨ƒS+„U Zd¦ öÀ2r{Q4„(æ8H(p´qŽËµ ßì~6y·,$uä5îØ×(XË|ü#7úRÇ¹ÖÆ1ó©qÄœ¹½“À\ý_á{aGÎ!‚|!\¸lhLn’XòÞBr~ƒdæÎr“7­¼fô¡coHÇi6Põ¨©¦‹Å45ÿNßS/Øj:­|² ¬`þÑHpÑ×{Büëÿýä˪E;CIjíÕôŒ\'éÅx‹»3xÛNT²ÿg½Öȃ”Ó FkRÇZ &„Ž„×2*y§“Ü ø¡†XA…ÂjþµlX”ZtùV†R-„†ßGÙ Ó¶7#Fµœ’óµJ¢5kÐæ¢S3¼¯²âoÍfÞ—Sy³ °é”4»7V±™ÀoéåaÂð)½kïÅÛ$þi± ŒNÉþδPêuq…AUXÛÊùÁù¦ ×˜HÞñ-$©°áùßÔØCˆa0TJ|ð¯q$ž&©1Å„ô¨NSÐT L3ïÍ9Xe,HGË.þÕe"þ,“yk üNRÂO1ëRœmhM‘Ö7_\üìƒ#Ïʆ=näµ(°]ÓY¬ŠŒ­„ø2*nÄÞ­KÄ̤“Qòu²æ2ª¯¶Àw²¶¾q!”nM cÒuMBÇË”´B67Ž<uS/ßûÂÿr‚Qšܹvùà ha Šß{R;i›ûLôù¼ÑŸƒ}uóÖddÐw"†³$4»$zÐD$[à¿~ëXV\ÁÄO ‡µQà’áU 8;Ÿ\¡ˆ'£¬ ôv7ŽnÍä})*w½°¤Šc}-áôÜÐBiæ€.”"ݦx†x­Zs¢Š³K%w¦v€o®Ú §—öͥؓ—ã£æÑ^¥q ~–‡]Qc|!°9|YíäŠ<0œú`»[7ßÝùâõ†^׊ÕöS"W9¸ýÚ"Ÿ¼âQÿZ†dŒG°”S'ßFȇMð\–¦×©Aì¸+ȱ[-×RÄ•04“DsiAÄà´ ïƒ „%kàX»Tiw 1øÃ2\pdÛY&…wiw·ÇBJˆÙé'Êw‡§mÙÎRyBv)ŠÆÐº,'*’÷{¬¿kÏXN߇ÉY«÷’l” "÷¯´Ø!€ž%öñb¿‘‹B jí™oWëC ^L¸'=ê'`=“ÑwN(Ñ_áù LÀ·„.à²<¥>Ýøñ“>¨Ïz—,SÅ€ÍOQÈÉàˆ˜¼‰1.X¹e2¹À\„aœÇ÷å˜DoØñC˜Ê•8—fù±îjMX –d^~¸A+–èÕ|UºŸàgõ ”­±Î¡ÀJ…пéé¢<Š’Ø@àMp^—h·Õ :E!îHDKºs2NØ'A¡N€ ‹-ó(y:ž¤€~Ìg“Žû`Þ¹°ž‹Nh¯õ~½CsŸœöÇàN]¥]U$([T‡ó\oµŽpÚðµ¼»ÔâóÑLÉ›Ü °>¿:G+ÒŽ9[seÁsz<%jYòàðk‹Œà>tŠúÇD(CægÉ>®ÀЊ)-%; ØùWdg|c˜žÚAYpÊsa÷m—NëwyÝWáÎñ´Gôþ–zñk-íÞé'Vlt¼iž^?ÒOâe•âÒC~­[Du]«³PG¨×“ZEp‰¥Û”–áÁì—ÿ²$JÕˆŸ=°îâ6‚ý +$šºl¢‰£Ô½ÒžüË@£w0ÁÔ8šîÓ€æí‚àÃÅcgcë…%¹çR¿=¸hµÙõ0K6nÖC‚ÊåªP£Í!´ #Ê2 ªhŽxe ªD†w!í]ó·7ýƒ8`:À+ÄŒdÙpHð„3øÖÓ3¾@±nMÌuôÊQ?r'3á…iL'„,úNøÀIÿ¿VÇ{'¬ص“‚ëy*@>I rœfSí+ÝÔ¾‘A}ÐÄÜðÖÍÕºvHæÊö´ïÑ![>LTÖóä-,í‘s5ø8-P?ãŠÓ iˆî÷ ‡zÎ>út9‡ß¤ûLJ àÌ&”ÅBˆp`6mM5‚d­?c>áN€Ã„Þ²-»@¢Úš<íKÞL=(“ ð¾ùäyO~ -K«Xø§ãüA@fdÁçåÝ~}CV”SªMš¨|^„8LÞœ,Ž óŽã¤êkÜG;4P’R·Lqåø×(£Ä.;—@›ËI_/Û㪑UD÷µÎœÅŸ¹dN5O±FI#–Ð ›H€ÛtÌ ™ùa,l YËå‘þŽÒ÷³ˆ”~¤ig£ |ñ¥‹ANírÅ!¨Kã,O —ÏÓ¤8þyÃ]¤è@ªú\ýåò„×ñV6àùTE¡ï'çÿûx5É}J…Rà5[}€2^x-ºéSƒ“uƒ Ðåþ¬ §®I‡þàY½¶m2V±¯n§¼Äí¾:,\œ½¨¸IøæX{SyÁ&ï6A¯…Þ˧;ç£&¹¯#­»‘6„‡èÕ': ¨ÛÝ,?.C±ìÆ9‡‰ñiªðÀ»6@5`.KÂY¹‡ÜW©²dÕ©+Ê4r—Ï;»ÊÛÞQü²kŒ:KyÄéÂNïK¥g ÇúWÖmHÞËGSYÛYj°r»ýk=ó-´S (uhòºeŽºÃTìüSßYö¶W¼nÙ²hËM˜fá­hÅ.öß|©™ ûj)HÿˆøRÃAcRX‚µå¥}Ï‚¶q¾5ê7t{:Ú@MD_“ˆ¶‹Ý^GöÃì«ò4뮪*¨AqU¾ÇoùÒò·é6ËRÑ^q¦Z•5ÆH˜€Úßêä6#%êÒQéõf®•¦¬ÝÇu¿qì ës=OðFA’¹O!\ö‰¿ð¹ÈíYžË²_êúÙ7_8P’ª^oý[?¶¾Z8Ýð‡ >TÀ "Ïêû,‰à_¡^¡ëUàGK‚\3ñFÓ×Jް¹jñ=7@,Lò†¤äCékÓeØÈaßšT'0×7àÚ#%þ~†î 5X-6‰ÞbÓ”.»œW*ÖÊ=Q­ÌÒõ‚glÿ»#ÍÝ¿–¬:”–t§g5qI“&ŽÛ׎©/J8—÷l©´îbî-ö2Úñ‹…¤äžXhÛâeñ9ßnmÕŸrYä²pøàø,Çx(51_ósT¡®{ÏC· çt*µdUUš÷õŽM-ÁfÁ8h“…òEІIÎ(‰>vk4š~ûC’ö;BÞ†U §«](ýŽërÓÀ‰•ý”Û‹ˆ“ãÊ­WÒš]Í·‰‹YZÛ3‡uâYv¿ƒ/cTïyйNð<„;L}²ÏÇÜÖúRá¡üʆ1jŽÜû\*- V½÷ïB|Ìÿ¾Pvû=RBÊ$M2=Åð"VÙ·êøÀêÿ¾!Êy˜TðœÂL]ÌyF÷Á€Ué(Ý,‡¥égÍ–¶$Øø^ªŠLyäí×â”Î{^Ó,Ÿƒ"×9ÿà§.ñeòæ KÂa៊£¸4$xfØ#3FN:0ÕœþÂÍJ/Ýߢ¼e«¨0Ñ+Z gƳXrcÿ»€ñ¨)¡¤“Ú¨UÄ-á ²1/rX)ò¬¤ŠJ"™²Gçþ¦`+½§ñ}­P\ý¡fSQÐÒ¢àä”Á-0•ÁÜŠECJ ² ¦íè)J®ªåÊ!vgæá  Ë[—£ð¾7µuŽÐ¼R’ÇñæÝʺ¸ØAœ€˜¯áÁj/fuF2Æ´ú«QÑ#©ñ%`Z;à[;Ëþ̆M°zm­ŸÀiçüäÕæÞaé³eóô?yî …[QÈRR>=déÉÜÔ<'ÇuOÉ)­Á;¦ù(EMµC ¨˜(c¥3?³Í8á¥\hÍ]/`d¢ˆrü§ƒo#pó.Ç+”ý²T)³’•ï3 W“A¡#A " 8žß(0Êûr>Ьä~šäÁfk¤Ø4LKLqš¹Sd³[ðÚ¹æ›ÀŠWÑüS;TÌe~‹o+&hŽwyR³g Ž0ɬþ þ”1W»°9/}ËôªmrÛª+;“`ùŸ{'¢uÊ)_›Ñ{}rUùO*Ëí¾A•LÛržwÔÛ³„‰¯/lšMÕm5Ã|౉i|Æú‚ô’=‘MmÎ5kžO ‘͸éà¦À¾æ3SůÓöÑr¼¤qç´H™?w³Ð÷5¦s¿ Eú±úWXZ¢kœÊ ]õxyüX9Kpߌˆ+„Ó£_¼ÑUžP´«Ozuà)HÏÇÒ0òX—[c™c9¸$Ç®³ŒScl{…EBo(­[«èFŽ-„Á³›R +šñâ=d†®ÐÌûFAcj_(ûàÕ™MúŽd"j/5:—‡@A Ȉ0aó/å¤Kž-æHcÌøD¼[êy@=ùIyåu6½Ið")Z–ÙBc –;sV›°n™-Ìë:´’Zr®¿¥V{;ZdEqx{×I⪤ÇsÚ1n…~nU¯;àùa€t>Ã\Oä¹Ël¢ÄZSaM!Ô”›·<4· v¶˜d²õ$=×O ¡mÏÏ\æ{ X¯ÿœë=õcæ2œÇ³åÖ u –â{í´)Áæ’šžÒåÂé—‡ûKг`1<>˨ø3ÏlHÛV_û4Á¬ˆ'ðà-”Æø:ŒôÝ æ­ß£suóžÀdì´»–8fï äÐð¦ZI“R ½=A¥æ¹O‘ß©˜°’L÷o"u)—H¢¶§"W¬œ²¦ÒAÜ0_gàa&¡0ÃV*(qÊ¢Û{tñ¥r™ô—÷tGÌ"#§4ÚÌÒ ñá;‹=ª\ÐÆìÚššœÿÊ­Ÿ÷h•XH&ön‹y‘¥G¢Ù¾,íGCèY¿¶éýÿ†–÷дhW–#ŒÒ`î B«¡>^þEך ZZÆß²FÐb®á)ê»’1!!ñ>+M2;ù1SÓI‰E°i@5Èù€~^qÃ~œ¿ÚÓ“z\gì;¸l:@Š76³>Œô» âUj åî³P²sð¬E>´&jzí Æä±ËÞ{E௚A‹Ÿïž2…±yfrCKoîž…56Y#“–jŒ1‘©O¹˜·t£{&{e%¢*#ÂÜ[±Ò¿ÄÈ;.WÈ…J.¯Ï*|I ý¨þ'õžc—SÈÄ~vn”ȹÔ/a—RФ¨ :Dßš² €nÌ^ÑK’ÆfIâlF Š L*sòëï¶WÝù¸l²Pï–ICs\Y ¥»}yÿŒÓåÑys]bä ’‹iL—N)7‡°S4y*]å™Ò£ßzådHÊýÿÐ"ˆÜ±“ iÔ+o~þìŽgøµúX3]£¾ûÛ?ÛåßͰ¢5‰éMýèO4 Œ¡»Ü5Áî1‘£ÚÄ “@—±j˜ÃmEÃ]qtg§GåuV¸Ÿ( œ¶ß Ÿ‘ ÚR ´)P± N@”8ü¨Ì}"¿&_21hwbš¯¬”Ë´ñ¹ç·“¶Ž§ýÆÒÔ¦¨Ö|íÿ§sÂWBZ>#)ok¾w [¤qEá?Ûù>( {·ౄÆ“>à;Ÿb½¦2£®/X]v0}†ƒÐ£Ò³AÛéûÉ%ó1ã,fÁíÊæ`w|¼¢ýÀî9½°ú@ø¥"k¢ƒ-ïxVÔø‡ìˆB¿üAkæÞ†‰?ö "6~¨Ý«R­-\æ¾ g”íÇ20øžK&—úJTÀî“wµŠläzf{ÉVب˜y§B™;”šš¬ìåà>W !o[Ú©Z ¬Oõ-ßf”*yÎÞ§«öFŠšòÍI1tøH}mubíã80ûˆc¿›f bÖhßµ·Éü5÷‚¼¹ˆÿYüà``ò=`c 6Õæé\ëûqî0¾Ó©ÓàÏËÙàŒ¯‚–Ãcf¿±ÂJàÀë´]ÄYlÜ@]÷à™+†ð†€ªŠ.ígJ¿ó ^оrG­›òrZòOÛw‡=vÅŸ^Öÿ ¥J:|©s%z]P€´©×«êý;îÒ(¦E2ÇÁô——/4"»¥ 5‰€4Cèa!OH¸>Xz澆’ro0¦8O#‚®wlÆ-ZC¨jkjiÒQŸ¦9„drú” ¤EÁkÓ)Ï"O^€ÍNñK¨ôuéŽXŸÐè¤Ä|P¬B©Wx¥ôÕókóRºœ¹†9öKi_u‘ÚŸ\m‡?Ã÷¿u¬ŸcæúÙÄ,ÞŸ7Ø+›-$zX+ü¼)¯alï©wYu-ÑâÆ=˜]<ÃŒÆók5MWФHVOXɬLs”òMyÄM‡üÓIž¤ò†p²ð4i?¸wÔôy"UuŒ´lxßn£hd"¬äMßmÁ¡à )LJrÈz|î ~>Ì9Vp{‡š"jù_xýnô”f³µ [ðƒ¦æ<"ýÄ+}3j:Rà"Û…ã=·Ž [%¿f *½N&6å{ /¹ªö ï€ôÑZZñHÔ±;zëw­LYtô}• Rp‘'`úŒÔ+X”gèN ;|ô†.Wú?ØÝ£hÄìÁo…$Ôá¸)-ÈhOg{ΕC“Åc¢ãΘþ·!Åã®pµéü_X¯–ƒ»k÷Ó«¢ÌT»f•(gï]ûSžrX= VÒ“„*(y©¬ͤ„«ÈÈ‚5­Û¦"tÙbáo;ïø\dW§­¤“2õPs»!Ø…AVGÌ` hžŠs¯fY°ôà3œôâ;@ƒ>¦“S!›ìd»|0= Jsl&#·ýݽ«uKvO! nüwo¶a+Ï—mq8)‚)à>@oc›5@6î®Ðà‹ÑîÖ…[ ¿‰ÅœyzÞ¡^‡=¢f÷÷²C‡ôz²#Ë%_‚V:ºÔcšXÏ '‡‘l†iÇêÕG©;ƒ+­žFÛiòþÊæ8’H¿–±›Ä}yÍ—1ÑÌps0ÂÁzà¤ÃÁâŒìq—5&aݽWËð>‹±©å 3ëÝÞ´w/6GÈð¥9;'0ç·×P)@ï•sÊšo³ê)¦ä¡ôÑG|€E³–uɹöÒíHŰ}Ë'â0{u ÖVE[Ø™ v벊º‡3q¿`o.餷YËóÅÔç;^­Î> j‚]É„ôÖîD“)ͼÝO¤Pȹß÷W_þ«èÆÐ tŒÇíˆ&î‡é+t½1Ûú4WO,Ò]â||'5“tB.å$9æ¦'ZÀ”%éiÇNÚz—h9ŽÔM©ž®hl:^íY¿â/±O!ë©oý¼®@äc™Yâ»T¾LLh\›Æp@Š¢D&4¬Ô榑]̤kP'Â>bk¤Ln#’> .ýõ˜Ó„fª$¨”T\PeŸ'°èÍLH^jX4@Ì.Z¤óøÍ?¾•Z: ¬ÁW€• X_¬Z 4åÄdûS÷[#׿3ÐJxûÙ'ãé¿ûkѤÊæW`_F¤ÅkéÖò¿YИƌҬC³§km;®HlÒ¿H‰ØÌ„$²J^WQ³ëpc,Ç77 ÁÔ 4N몰ÍÉ;äeš3nÖæ`̲š\ª3`RDm›¦Ñ™¬Ô¯XÉ‚äŒÙ>3#WQpõdÂÔíWE­½[0“†cÌ"ó«!îÖÞôÏs5w0¼3;»,ñm†ý¨/ËÏíÌžjd6ùLJ\üÉXí×±ÚÝÝ·s.³ ‚ræ¿>4ïü*Дo0¿ïÿùCÁûÀTw›Ycà#i­«4¼«dX_ҒχpÁ ƒ•Wú“mùȱ& ˜¯Cm2ˆ×^ê%b&/½äPC×òHË”±%/Ú2ø-.^R bœçsY9²`Û하¤Äb›DÅ—˜ÑàÄ|‡„ŒÄÌŠ` 8¯Ãßž’íæA€;éØK–Æ¥ü\§Æµ_r*ªû`O1Œ‡<ÊKëqwÛg°J$ JòlLåó°c'НÐ=ç)nãwCYj6ÌéGETnXH‡HöÈ&C¢`Õ(ž£¡‡ÉÆÚNާGœ@ >òLþÄ0nHÒö³ªÀOX/¼¿ÈïîHÙí»ûäÇ‘©åñ¦œ&ÞX œÕç=m¬:$ÊÆ'~o3ö.?}â©ÿßÜ”“ ÁõQªKd(†hÆ‘QP¦’ípܦIŸR±_$ =öÉXæ cKïC¿-G*0,Sˆm‡1c´w' ií‚ÄvG\¯tTÄßõ Ó¦FDÖ”¤F11mðv,éLhcG6W>Q°—›å;îçÇ9<®óàsžsX 'ñÞD² ºÐFZiù«?=!M^(ö_¸cŒ•7‰ãÔ~á©óÀQ`Ë´Iê,aQ9cNÍöÉøy¯a%hÕÄ!Ïpì|íEŸ øçnꊵc·Çˆ–{w”Xc­\·èz¦ˆgyå•5‰ˆÎ_r‹yçÐLǸ¥âù;S¶~yEº yîþX÷8ñp‡öŠqóG–h\ËÖ•²AT,Àã§„3á°sZþí]Pnì*šJö€™\ÿ j¹&ªØsßËÎŰ¾CÉ™NdÜP&ÆN#ƒ†IrŠ£³¯ý 8ò!|6ò^µñ¬Æ¬–À ðy ;œû§‘V‹e«±È?”ddR¹šˆ—í»€"‚¾|ò<9UP0ÅX8§ÑEéÝqÐÿ­u;$v¬»0/šSdñâ }áï6JŽK¥0C‹A>ªAº:Ü02 Iù­ œä“p ‚ “Keˆˆz¸1±pÈÿãĆ“zXL»zeÿÁv¶ÝdÞyô*_ñôw_ëý`©LýóôªŽ{¸u~5ÖG/¿éA±Þ@‰šÕEs«kOx<‚½·–2‰‘¾®‹½¶à¶Ã~°M×D3 Ž!ïÖY¾ácrø“ C÷›5à²˰±o1Œ#¿¶n ާüNºF”¼ÚÙi›‰jò¸›OT~ =¨#¿Ý8tÇMÒÛ™¢¡|Gü‘Y“RC¨"ˆÞÖ­ûŽqMn)Ó>gmº‡–|ÞB …ê™}=SüØøÜʉ Y)ö¨.*‘ç3‚ïŒý­—´—+ÛŽ×XÍ‚G‘ã2{þÜHz¢Ä-ÀfGîQኀâ)v.Ô'WàXdo3‘våÄTÑQ=–:ÆÎ3¦ÙàÖÍ ó ºW[®-?ÌÂziYc"žÅ:øÄIxS‰%íq»gS<3ºŠ©ƒµjM¡>™h#âŒÑÙ¦,TdI×ñ„Þí6‚^.˜à„ý⦨؄O•ñhp6W-ñªÊ×V×ÄÕq¯ír¨¬^¶ªIë+þÝnýw PÄUžŽ§Ná£ýLûÚ!ôLë¨lÔ¼9_×DÑË„tÉßÙ©EqšôƒMñß“«ôˆdé ‰Ñ9 ±zçÚ©Î Ex~Š#•:‚q£=ís¿U†êÙ/!ö’®\àžêà9"¥ F¨rÝE?îJÜ@˜ ntCÕÈÈ*©¡¤‡Vè]æôdeæÉ4‘®S@eXÂ3öT:™mŠ K¿ÉèmZD9÷éc·ˆuÜìj¥’ÜŠö̰ïÔwÃd²SwD_îxՖѦù+‡ý[%‹AV( È€2¯ÅHCðHÇ$X»2IZ"ùêr;T¨WÁ•sü¡AM›ÊKAFdÀ†1~™,>°”uÿª2ÐBâ}ë‰÷J_%£…7“|ÙŽ­ê°§ï¨Èßd‘#r×úQY'‡s"ÂU%ô‚fÊÈh.ú‡ØN‹ÒRÍ6Ìô%¡•½sè»w*Ð@ ò÷"‘+9ÊÂT¨²;I€¿:®Ñ•ºkòÒLÉ ¡­)Ì´ÛÚ3Ÿ×b%¢y1¿UÍMÙ èïU·×¶„Á* 1ºÜp„?%ÀKU «®éæ 9àxy0…ß–tõÔDÍ Ü!€v–Œ 7…îÌÒŽ9!Å9ZzDøÕXÔSXP}‰Ž•´½Vu€ñè)D ³B,H?ù8jþdW ˜Øë#†™62tÀ‚ÍpÔp£Nó]þÃ'ð"Zf*ôÎúüžTy>Óç9íªÒ<Ê¢nñ­©ãelUè¾SúÌ$@²0Tµ S›^@ߪ&•$*å÷›‰¼7µÝàRÈZØÍôÖ¡Tœ ‚ÍìRAÇÜèÜI¿º¥öVÐLhØ9ŸB²·(­j¤m‡;_=ÊnØOÍ!”³”ªæk‚ªæFÏTÀCKñtÄâþßû;¼H™É?ìåØÿè(=€Ñ>ÒâÁ •iPtTžQîª?tt" éµU¹ gÕ4ÔMýøR­â€g‘eFáö,"ÎH÷lZ[Ÿ$“ ŸJÞJ+<ððæÞQÑ-°ß5ãù*0Ë:À©ÖK{úé<ÄîüÂ9Ãý„Zá ˆïms0È_>Ŷ€{'ðÌBRš D¼˜0¶ƒzyBC¹yZXµ+©/ëL04 ùý‹UQR@os ¶Æ"KUù™{|7ú2§Lž $4ywcW‡OÏZ{) DsD.ÅœT³PºÂâ«so^ ›ïÖóo%—zJ¯Y‡µ-ûµtBÌ8¶Åk´éLÌ6ÊoËH9k(Åòy¹0$G6Ã(¢ÎVªãþ!жrûÛg—0ßHR黋pI°"e4J%þÑ0f«0m¼¿¬ÜGè¢9&0œ´‚ϰÏú¦T‰XÜ š‡Œ–™SÑVļb³n¾ŸY^/›ªœÞDNÔT0¯à¦*É_ ·ça)âq©IaŸËĹB‚QweŸ¼©…«úx ñ‰ü®˜bô~üñ&O§”£áÌšRn_‹4­qßœxƒë}z7X]RÎ&콄ÌÂ\¡±=ZˆŽ;€ÈRCq³ŠÞ]uìÝ ¼VûiŒ'Ôñ}l1ýzŽÄÊIlà R Á=ÜæMLk¡$µV|´z}}ÁAiŠ>ª¥´ó ù¤T`Ä‘4v&£CIøûþ˜Ù·Ù«ç+¤­îbÛÅ……ü …N :/èïÏ=©(»á>pj·ZQ6@ÖO"½b_g:~pµvMѬßÿÈæµC'9P¡b }żð[è1uI— .Lw< ¤fµR#‘ª¯ÞÚ;4÷΋Š2Å#ëEèrû`ƒž–j~X@!Ð/Kš¢²þzðr›ô7ëemÝ߈©~4ðÛpÐ+Raz¹? Æ%:Î6IªsÍY~mf+Ö éÞæ¦½€Ndo\²eg $Þ Óg˜š²»Å蘆f‚&îžtÙÏÍ+ã¹\ì—M<¼2±_Qä'çÃêõ£Õ5ÙÀÄY7&°NO@Ö,/O|A¹ñà9›sÖ|W•ó‚\…ÒàhÁ´<Ç^:ªzǾîcˆöܳ@ÁXˆ™0ôt“g"©6ͽfu"âÒæ@Ó,î¢ïÒ vÃÓÀ†²gÛ»uWâcõ½Êwúdšÿ~óÌ÷÷Sö*€T÷Jk o¼‘—+Š‚Þ&6á(q+‡ËN†ÆÞ4O¢T)·Ò–‚0ûÄ!²‡;MÚ,";„Hà¹|&…=Å«ÄÇÕ¹+ÿw~ZÜ/2aÚ*@£(™–}ï~l »™ÃÌ",ÔY!kЫ©nû” {°JÚi«¿>ó†DðoDm2ݬ,ÿ”4þpÑPš&òT£òšÅ _¡gòªE‡f[B‹±_¥ãá Ó0‘‚ƒîÙjá3æ1ök¦æÝA‚²™Z8“g&ø© %æw×ë3°'¼×ÐÜ¢K=Àñ„P‹²ÏáÁõWÃ_—’ã­D"þ˜[8Ÿ:‘óÀc’  ¦¶pµmS©pŒ]·û€…lÙ\ª.xmŒ/©Æ¡˜M¾ùÁY†@×`™Ì쿬÷k>/W×'õêhk‹>ÙgRkØåõît"×ÿMàµ6nj5±÷}@Iއ’@µ/©ùää³<‡†¼Î$éØÛáIÕ×aº¦El/ðÉüÇQge¹ä/ÛfÐÑz¹ûÞ 7]ɯÝ|ô}º§Õ$(8… ã£($cE–ßá´ºý­2Žö‡s'ì Æ¥;HÞ- l”ÛPtØ Û™î\ŽB0›çr ÷›î>X¡J&ÍGXªß‘£ôxuE±¾§áhGаEGe4‡V(v7çŒHAlz_sÌåë£õDI¡›4Gq£'œ8º\ o>²K.uz"rÆm>ýò:~0«ïc ·m[ئÙ'º<—[kW×<!ó $£"x¿pIœ™‹¥>zÄ׫EiÂbÆZ@íÉG]¯„µ¸6£¸Ù¬mǃìÍ:Ä”zL)Õ^$ãm˜æVŒW¶…n6@M@‹Í¤¥¢!ŠAA¾œçôVÿé†Õä°ÿXûI‡†"B$ö]ðêÇo¶Åö ËykM²(Åè¬ÒÐ/FÒî:ûp‰CM \v–†7•–a+õ#’Ç/~—öíØg)ƒ“«s0G‰±¥/ÖF@ÊXÞ¶b¹ŠG7a™ÙÌé~)OÞÁZy•¤¦Z ˜2È>Ø"»>žÎf±a˜§&|ùí,Œ§7h{çõÓèœ2Tføz[à’ZS’„dßäx»E³ à”™ý6ö{f–n¨Ôtj:é}ICE}Wû±y4¶d/ñDiÚàs¬^€3%Ïê:ux^\ KŒ1`|ŒŽ+‰ î| Àë_Óî³³_òˆŒóõÈ%_ñ°?C>¾.Ç1³Áxá3žÅŬo»”"xù¾1¼ppB!]:: ”[7ìq’ÑEÙx–œ}ÜæÆÂ“~U!HLYÓñŒ!y¥âw'[‡bÕì—Ù›Ã~0*«f@Bjè†NÐ{ø9ïd*8Ø?OÛA¿E¥<Ú“T/`È£qåZAUn3QK÷ûI6úå/ç8±ÄÔõ>£¸>¸™jF0tk1䜮HTîÍÈŠ‰šÛ`]¦wÈèÅÅ›ª’ê8ÚŽ©ßf¼)ÓZ¿ FD+ºùòÏK —ˆ@vb¨£x'/â{ãqZô™¨¼ýëntZ'ƒÆÞPŽvXüB^%¾ù!œ_Ê\(éôqÿôvP ÃýN‡ÏTÛiX+msçu&Éž™.7)ÛIÂÈ™4÷:Ïc> •˜Úh©Ïh¶mA¹oLbŽ¢dZ*’Ŷ³Ç`—!©P‹RçÁlŸqPQbãP°`â%lÍyÔ?÷úTÉÿñJZö8P\ÎH Óìfr¹YkÍñóOÜ LR(ä}TB.øj2ä8rÛ#—±=æ›(HE—.¾Ó¥ûÎ?}O fT´vsˆ^§2 qà†¢ökÒuÑ[̱hýîí–ƒ×jtÔ†ã·öqXôµ¹Íþ¢Ú€w‘âOÎpDðR_Þ^‡9ÉÅ_þ2’V¢&ĬÐiÜQâÖ4I«á÷ÏèNêªÇY@J˜Q]ߥ›£ðw'ŒQ“ñ€Ê€V÷$½Tø^T 9ÏÄÅЀÛ),MÞZzÒ£ñ½Æ CSg£Ç TÈÞ*¯t¶I$zíoôÊÈBæî´õìüJ»/”¯ùèEPr/a‰ÝÁTŽÌ8Œó(w‘_~N“OßÿßÄÿ—] ÌÃ}5¤$šç ”Õ¾ÀWèðR‘Êqän°^c~h£g‰O!â ó*ÈdM†SÈ› …¨óĘ…N½ 3cÎ û$zèó]õ4—¸ëD-íÖ,߯6ó‰9Õ  (j}/7­ÝÙ7·’šeÀ‚Ò¹€EÓ¼{µá=cÖ…Ú¡7på/¸ÔÈ¡-M å³åí®4Mï÷sJvZ×õ’?S­0"yšãep†÷Ęߔ…‚–Tr­ŠìÁañ -­½³è³D0±²Tð÷¹äçéJ ï äle6^ÔS¸PšáŸÈ¹„憌ëšG€Àغõ9N[œqqi½PŸ7Gæ?TßÖP± yÇuV³§ ÚEAäIÖ¦r¯‹BùløŒ97wkç¬Éý{J}ä—«ç4älS5þîÍŸWCDÙŽÁNeõS™’¡fv”(0. h.mfåþhr‰ÏB ÞØë½"sKPWƒþ¨¡;Oñ YpÍÔÌÙt€y«mÐ÷.ïlÈ+ËÉ[§í-n¸V­ŸVØ‚ïI«¤Ñ~z@޾xmäAJ¬µâݵVónˆ.7•|Z]Ïl8&è©•¾ÎÌ+±X&ÝœþÊBNtLV»h¿MhüÈÔ­«æ"¥©¦í ¢MÇÆfGYBã„t x¡Í–ó†’öz9vbX2¿˜:ÙÍÜ~±l|lMvÕNF NÓm§¬!¡b 2jßèbJÎÙ.*xŠÐÿ·²29Wî!ŒÍ»D|ýsÓtƒ+A3¹S\?CÙ˼§.[Cû³áVí@ÌÍ=’³#;=äPÞw-Úu‰‰‚pZŽN½7ŽÊ„p“]5QƒHÈ/TfÖv‘Ü»ÆíßÅü``þi÷ªƒM×ÂõŽ‹²¶…A¾ô¼3ÈcæM†"htHZËNÕU}q€³WaÒäÞ;¢ÞsÛvK¢*zòJú­•Vn® a¢eD놛–t;d!Øïì$ó£Ž&"( l w°å…w«¹ÎTèÛœ@ª½V²PùnæMu¿‰è–ÄžHÐüµè‰¿X{öéÅ{lÛBŽ8ꇨ…1Þ91·@.nrÅZfµWæ1‘ ƒYçÑ]€ ZÇß•…Œ:ì8aߥ´äGLf9wŸà$q3¥ËÖ\jûÑA9Ö Ô½ø±›=ZÉs3K™ívË}fs÷há*ÖÝÝ›,õ± _@ ÿ½[€öÂ);šG4qHÝ­æœËw•ƒh“ËQAX:[õÐ`hyÅ1¸ZN¿:-§oôâ{lÓÙÇíEŒtÇÐ×Ù|ã™û™çÊ„i¡ó2ÜQ/.Üów_K›Ãiíþé¨"õñ1bV_Àø«ZÆêLU ReH¦Q­¨F`´níºv}Ûkˆ Ìð 0# ‚¡V.aR”Î ·Tœ±!*öÚza†kySñl-UdŸž€" {5õQ¼íóùEvA(”ÞPï ³Ê>ŠÇ¥¹µÉZ‡@€A¨kÐkíè!qΟ¯©éqÙ¦¤^ˆ{UXÎ”Š—IžžµTñEæP9±¸$ bHD)ïÕ ]È…ñÍÁ&§3@yÅ´û]Ûb™ŸW‚-ÿáX3”¹] 3t«Ç–V`½m×,L:áßÔ};7'°´D»¨‡ ó¶-nN„@÷ŒH€ñÒFbTi|ŘìÔçD×3¿½\ ä x¬c⯟HŒžhê[Ÿz|48g[¡ÿ…Ç@/œOXµè[Œ-ë÷"ìÎ8ìøOÙg9s¶¾ú3‚“œ¥¾–º‘*à0ðœÄ±:làÐ!a6ž<®|q ÔÞׇ'ãß@J¼1³%Gor8’Þ’šÏU0Sì„mêÕº˜¶R]‡š£µZÀa¯‡AÛÛ¨Uø˜ |¿f?…—7èX›]Cß]piGjlp Ýâ¹GʱîÃï¶|»û~°?k? çU›CÊö[Ò'ÚÞÕ ÿKç7ù¬Êå˜Z}h›’„©¿Qï¹õ¹PABEòÃv¡ /?Æ[=¤m`ã‡ú$€`] ª†¶PiÓ2[XÄØ7öå\¾ÃiKO‰ Ò4&òTçÏ÷_äŠ{¶O ›û&‘¶æã¬¤ÃaÇ8ìAå³ëuG®²f‘jŽÓ—Ìì£Ý·››Ì œ£äø*Ý…Q ´Ò¸La±“øÒœ…òòà\ãD}’6KB¯«z@}‰üäÔÏÍAtd™“*Ö<ù­‰ù}‰1ùP…¢á­å£0Ï.ÜŠ’çŠÛÝØÝ¸¾øøÃ–bWýR¹?Å}´ÿîк#=¥6‹Š3 ²g+ódÇEs˜ç¨e“ DàÉ»Š2„ýNLÉYµ.Ê%d“JÅÚæœì»¾®óߦqß:íu¹zHÊí*1+Å|8‘<¿]ªÍ|ÚS“‡ÃªjqŽïR% ßpì#ð€· ¼U¹$3Á»ëœ>´‡N•‡¿"Ál°³X¨Ë: ÊóFÄãâÛi äjêÇã7ÏèˆÎ…mR5k>ɲ7ÄÉwã«´šÐ»`æ½m¢³ÞLY ÇߺQý×wHÄ]|¾[ÓI+ ˜LÐ/½êÞ¶ç˜2uŒ¨ß¶š¨·Z#ôïUë~çe_V&­‹~‘f)v2Ã4ª¡Õ6ÎÍè÷”ÃÂ.By âY™æ¼ÒäZ¦>gdv¢ñZÌŠŽ/ïtšÈµ»Œ0˾Ç~Šn `Œéã¨Bå°ò9c¿¹?Ãò¿È,ã9;ÜT¿Kñ¤º•ZÓM1³2€x€¬… ÝX»zTàZ@\ð5¸J\J‡ áˆÈ!Õþøk$¯+¨÷Ë[žy¹hZêƒÂ‘×̇;Œ?æ‘€œŽÊ@Œ¸¸2„s*îvV¨ï’ËÙ¡íÑ îÅvÓf¶5·°ºl/á6ôuÝ|œ´Zö?€‘±:Æã ÷¢’zh^{Y-)ȸ‘§<àb&²Ä˜Âx43óP&GÅß™êM?;œ5£€úµC3ì¾`îj½ØÁš3¶*£Xß‚ïd-Õ~V´)»Š€<–š²<l2óiQý;·‹‚]›i•i[´òdmô;™Äë2ó÷|µüeD•Ì)1È5±’à Š3Ã?A>ÃÉFÉzÄdCtÏ¡y+U®~®F„Wç«íŽšŒú`lÙ4Ô5ÌÿU°z= Âöîq|Ðy†,ÆQﯲ³D ÃÂŒ6|¶8kâ o܇Béì ið{L -˜’•ˆš…ÓñrtPÞçÕ©;kÐ?‰ÇÙö!ªr {E»ÖPX"A¸”$¾µ8 /<âëÅØ•^ÊA®²‡tFa;!•®wžZ…øI="ãí‰ënò/$Üìré“EæØÕ<'{%ÖäÁbïÆ¹5\õ°™˜•³b‰K4¡h`£ªFû¹ YÙpîRáj:¨³ÊGs¬Õ vEWbÉ~‰ÿWwóP~ù°½³&íWZ˽}ǃ:ÃÐFw†á€î_V”~»Ñ¥T‚ýp•%¿!©}Ù¤:>3M^Puv§EÆŠÞ²rü(VŽó!B;|' ëÖY#U}ýlCº hDxõÙ  Ø0׺ºê¨n[¼â!“–¦mM/ô"mKIVéZ:WÛ˜W‹ ºÇÊþ@¬]c„áÍ5•Êð=%ù*õdÍç|pmñ¦Š“6R<ÿ-zUx4 T7ò]°êpÐÅ7©%"5W Ck€è‰]‰Î·6Úrq> ‚ún)jòuX9|Ÿ)eõ>W.~Ý·à|þœ´'ßÆÑ‘ð¯n™¯ßût‘¥²~ŸÄºàß©²ìE3A·mPÄm9‰äC "3GqèÿÍ(Þûº1.!c9û$w‡@ðÎ&С›¼' ³ÖÜÔ¼kõ>\¡ÊŽa8×v^­ƒ+ç±€ú€°™ÄQꨶ%hÊg~J>…O\ äS]æŽT ù`'jÈ?MWbymøÒrLæÒ24¢ö"c̱ :ëBíûC9ѳ /G«ÎÜ/ªœùKAʔ۟<¸«Ñ@ŠôhCËåÄ”_z+—~ó~Ψ²agç×0<-ËÖ{ÃÖb;èº!?1‹¥ÕœB±®®$þîŸá¥"÷zË8 }¸ö•ŸÈZ åY«(‚ô˜J°Ø6ttº31öS؆:&çXYŽq[ý)OОÇyU¥Y42˜‹(pã´sÙFÕ¿ütNevìVòéöóœæzBTHs`ùî7S3 ‹'ýŸ8ÛöoÏ~iÔ¿ëè±åé¿°ÄðÙ­VÙ¨±E ƒã‚‘¡4F½L…ÛȺ×Õ¨nÀÕUÛ]h÷9 }7ŠÂ%Zã Õ²‚(®ÿ–«Á-ñѸûá1“’¶8•¬µÕ^¾Ã4€ K÷B"“oÄVr,Çwê–@åšT/ýœOµaeÝpþ§tÎ_Ýn’}úY¸<;cì,ÂsK¿mê‡Ø©»Œ¹0×'ìIாÑWa·”,GSDS©Ë°T‚ÝÁ•ëþ‹Ì#ˆOiVÞq#DÕä~WXüÜ`ò„\!%t.b Ä‹€áÉ·Ùb,™³¢Ýn°Wbš"*í#ÐE¥¸_ô:BÖþÅ8]Þµ.ÛìiÑÁ[šÒIígªÜ¿äúj…BÈ€K æþ?ìKÆ»ì-oÕRI«€ßºñc¼C` 'ʲâ!éÜÖ+TtbH–|€…è Pe7 øUòcPi§ûÈnëÿHµN7«î2ïïóR½3ž¥d÷–ìïÒ‡" ç»4ìÒ‰O2 µóF±ÌòÈ”§]~è`ÜJÏ]°w±b§ÊJ°5RAºÿ¥¹­¨¢e 2wæ!X\²»ëº\ž#ëwóÝ¡ÕpSðÒ¾dœ ¨i%ë#pcdÒ—LË*Çl§³³\Xáæ¤ =WècFUq=ð7C(ÖOæøÿ)&y5Ň,sûÝZ¹%UvoŸñq4Â-¥êñÎxuÉSÒ)˜ rg¸4-ùêÖDÙŠ¸P­ Åu²À_ƒlä¥í<¡ËI?&waŽíú¦ 7LÚ&H9h#ûÖãŒåˆçÍ(×6Äs-Oí9¾³‚<²Ÿú bvyqF'ƒïE't‚´·D¥‘ÃúB„˜hâþ‡´7ØÔ¦²VPq¢ïßÊ7ûu£]3yˆïzóË?°¸Ù£$Ý3Ö&ø–]¢Á”´VÞNh <õ¹³Hð·,Z଴]̨û5Kµä¨¿rtswÒ±x¦˜•|ÜŒ?…HF¦Y‚ß²C-`..É1rx'ßßXJB<à·ŠÊíöÕ]ó û&{C¤y@¹-jöq£ãì·q¿˜Å,d£RW¯^¯žXÀ ÔGZí;¶†58Ÿàj»H :fŒèk¼l âk:·¦ÁóHëºÎD$”+ŽŠîØ< h•ßBõ,ähÔûÙÕ4åq9°Ç;Q÷œ¬×¾iÄJÃö|‡šÝt¢Z÷Ÿ;”Õk5œ£7yKËì­¼[´V’[ø§iûÒÂX3@º…|z*ÙÒ‡^¢ Æj´•q:w¹ê èHwwß/M :ÐÎR¨`Ó•Púd<fýuóZlï:ÛÑ\½Ü8-ÎÜ<úÜ¿ e+Þ’,캾½ÅXe#AC7F‹ú…"P£ËÏŽ9Á‡º7®Ê@$¢Åø8oãFªvšåÑ"¼ …¢5è O±b®)¥ÿÂvéÁ!Ž =öÿ=Uô»Úá`½™l—ìÊt æòe‘F´ˆ‚ù \ÙÔc‚%8"kóÉmì©V„Rô½ñpd»ôÔhªÚD"aoцmj¢˜ûXE½˜:H*ƦˆÈÛ¯%tE$šëíFß8‚¼!S7öòÑ]kàÜUÕÞåÖ|ð ñôká`*«q:ò,}•šÞ°Ò Å_;À¢úqzò`‘âYÇGo¦ÍäþþaÔÒœÿ7D¼5hÑ­ÃâÆ\$«S É¥îC'K—I_ðÕ¼çåq$yú÷D„‰a ÂÐS¼£•šÁ-ð×å÷ûì®ý¾Üø”?ÔÊÄÄJ@y!x‰óìŒ.9‰‡Ñ®fá4•Úî/`›§©}ºh«‰1Voy“©* bûûgä]b,¬lQ‚”{ËmŠê³B¾Áö ¦+Ü]¹/íLðAUҿ Ðí{ŠÝø6 ,_@'­Þ…·!2¡ÙrM[Õñ?(´½³oû;î+`ÑGD±ùX²Hµ0 ª±´ïÑrItòU¿f0^V¹Ž#²h‘vÛå£T§\²ï?BÛ*)¡?V³c3!:E´D䃌ñ¶¥ÅEÝ[:pd¾.<"±žMp0Qpí µ¼ú¯l@]Å.Ù¦/ŽWÞßL(„Uï -³)êkFÑMÖ†ûÎKÑÇꈒ”;.>ü`.Q5³ËOÜ–Þ´\ƒÖ÷«]rîrøVºÕÆ]•͸ï´)¤ªb¶“n@Ÿ—t´§äXЧÄ2ú24äïSté 'Sad)ŽŒ/Z=`ÞˆdŽy)W&#‹äÄ 2ç¥â\p >㎤—Eo°ãüûº* —‡‰ùÜÊ‘DmòF·|·~§Ê!è]ö9@n)Ž×—œˆ0W·Ü´¡½ƒ@ZHÍt½o@ƒƒWuØ>›0Í)"_zÿ_…€dÅl¨XmsY™±ã—biÄŸuÞ½Ã4]ˆïØÖôåŒ^¢ÿ˜Rð8ŸÕÔ÷xœ[Ñg L6͘z¸s=‚'izQ,#Ž[ò®i óî  ì¦®+!õ)ÅAvÂ×zôÜïkWºñâœ"ƒë(*$Ì”„iøHI7….ÛÜrnÑYb,þ{¶X:ÍÓrdÿg'{¿‚dcÛú&‘Û}˜ cTX‡OU‘›?Yô•Žé’Sµ³Ê‚Ì+€´ÞæAc³)0~€¡ÎsN$œ«¤ùé¿»Šs.W§+y=å—ï¬ApzV®àë÷‹Í%.÷³Ã÷…R¦Éš"?™†TÃH£ÆçÄ×Ñe¦»dürŸ—[ V¬n~ó4š"d-ӣȨûwh½W±Û’žk,qGEaÿcb9ÜU­†š[%EþÌ$bu/l×KÑŽdÆ»¢$g“sÄžÍuïwY.·öéýdVØ~·l½_ÑòlÕ„&;b¾A!^¹1GçëÑ,„K¸††§-äÌÏJ¾~{ßÝÁX{‘›gÜQßÔEÐÑsDKZ‘?Žé¥Z¼#æ3¤ên¥1l§3¶®&f/Eö-} k®¨¼H±îÉý½&:‰!£Ø¦ï ÿmÂtªW]9‹su£žææ$œæ13s“«ÎE%¤@ CæäŸc¬-¥˜Â‹¿|;¢¯¬¨+æBÇTâç.ÈÝ3EÐÇN4¤†ÏÉ[D9 ^ÄÒâðw€\í +1ø±àÈÇEJúÒÃY¶S›U–6²Œ`TôÑeXœ©(¿øHzþú9m8ä½PåI¤{µ=9ñâ„g~‚5 Ÿ+¯Ä®ð€…³" 5¡iÀ®«]`aEOJ9”puÖW70¼=ž+R@`~˸AWé/çç…W¡øê˜vÅ”M¦§‚F2$ªmêÌ •WÁBFŒ/cmZÁÿEQØM @Çd‘ôÔäl±~™ Kq¦<êI±džÕÐþª¿8'?Ó‡š >bm=ü³m!1¯¡apexq:Xš÷V5z!Éylø >\Ü¥½"œ%í8†Ñš{ò Ñïteulõ[~ï¢NüxM¨ÃóñéC_G$v¡™Þ“ÆbóÄ%£–,¦èê±DGø¦öš{ ?©;÷Å•¶sS„Ü„Á,ÙëSØ™‘M¶³´q¢·(Êx%/Ïæ5ÓÐ÷¥Ñ1tßüÎÏbÙ‹¢Rø³‡€Î`z·ü$ -F<ÒÈgöáwaŠèt†‰åÏh/ø)Và”h&ÝIzaˆêYüR^-áSe¡r×í È»óú4ê¯wÀôÁµðÌ¥5©žye¥ç1 ý¸Ç*zyJùVÌdЍÒ‰ó¡‚íÃfÚË…©‘ó‚p}Oáu t“S¼C£h¶xò-´¬\´áçòBWkQ°¨B1eœb™„53Š}k3F/_6K‘0PXåpi5Ê<3Å{|¡Ç¨Ì«­$Jz×+wXhhDëÆF„Öëšà•f©@ 6x;_iSÆÐi¸ÿ¹ÛÛ×(z·`™[ÅsËuqSðcÚ“tZz ”e¯\”ÁëE•Sö‹J7B¥ŽÑ,ÞÉcþÖôk"LÛþûîjÃÈf0˜ÅY<’Ú;±ýneÐPŽÁ(>gg#K ¸G’ԥ™°€0²*]óÓ· Ÿ)©â¿#©S†}WÀ˜¨Jœ´Òí´œ6·zG~%k^„m’iëq)æw]j› ·Ó3“ •D«»aÏ|b¬‘ç!B'ÞÖ¢¹¤íüª W ‹îÖe£Z•Ö`SùÌk´½[£Ý£‰ô’'˜‚2h}Kÿæ †$ãJÙÇvÅ mE"ƒ‡ šw¦~õô&µQÉ]1¯löv‰y–Ç9|aÆyyÑx®|ÖP§ñkÜNÈõ3Hùn`‹Œ<“ ë°¾ó‹’è)þ©ª|í¿¥„ªk?p)FS2F„×@AÍ€'Îo.‘ñLç-¼wŒõÓ1×wϾœx‚0£É¬°â¨Þ4Ë”ÐU¼ˆæíÖôù]­>ðç€‚Ž‰(‘tóÍ»h^&Ň£`‰Á^nL§‰ELGU­¥Z“¼Ïfê&U&ëÀr ¿6*ŠP¥Þ9Rxj´‹H«û¿ÓzÅøêèRXÈrC·ïnÜWn*%Ò£¹˜|ÖD©TØJ ©µŒŠP'ëSÿ¦&ÿÚn\ÌÙøËø© ¾]ÚJ%è‡mZ ÕESò*†„’÷×Éú2g§mT3¾)㘧¥5©ÖYZšçÕplp4?‚®æg/úÍîDx‚O@Ä€¯Þï“hÕ³‘7ÚÇãÒêû²Ê#aÃOÊ-ÚPq 3„eúzߌ´­þÿ×ß–ÔI("¦l!Yï5Hv!!ĵі[þÉ{‚EiDÕ$ 2­cšAÏÆ»!ž¯Àº­4+ºÀ»X]u3¹¢6]ù —êæ[OûiÕg}±)XW ‰ƒYp#aodw*¨£Úá^[ .A]F¢ýVSô` Sw2h- +bá§Ê!¿.Þ#“$U=Sö¥ =nKn/˜Ï„Š­ŠÁv0–+¾â«‹… ž ÿSÏã ÅÛȳ6F ¨g‘nÍ~€w| `u˸^núÅî*‰õ“¥r¶j¼ÄÞq ûDþ𣑈0à…ñ·H6£CÒˆØîg``ÑJëQ ±ô’ëäŒòˆàõÉ¡ìák'«”ÇéÍ‹øoò÷6zŒÙŸåB”Í-!M ‡F^Viÿº@UI$;"†e|ÙÔ¨æ¨Ód©$[GÔMt8:¬hßÂ’ª±EŠ› Ëø>AÈôxEìùo»Éý°¸ÿÊ`¨áhÑví«Ú@™BÇËdã.Äýî’½0üÒ†¦Žæ‹—òTó ŽeÑóÊœ‡Û7Å¡«F¶á“ Ki.G ©lgC <ËÉs/N£[v¥‚qÁº®5“A)¯}hUU ñkÂÓU{Ò’4™†&æ®ö"o”‘ Âsºðïu;™Ú3DÿßÔĺ¿BýT.çÏ6’þê=x¶‰m±*ø³FÏZoX9P’ezWõ²Êi”jû §dB¾\b½ ¡ÕoÈi¶¶,U²`loŒà1Œ¯YE¡—@‚|/zæ0¡“Ó `:+tÕLCVlì;¸,\d{VvV>r¢q£E·Y^NÊÜu‘|d&tÛÏØìs+}eâägSšÊeü) ))|lÑ=Tõé·Ö`ï¾>èm~…;¹¾Šz‚]ŸÓ©N²_Ä6à>=8¦žAöù8Q•WH}gàÀ»ÝÞãP”E?ä+B;ÇÊü¾ü£ª‚R&Ùµ"oZ°ëjÛ 3×dþ5“`7œ‚‡"HœûØÆ«½ÿ³pîÎ㵘®œÅ¼ÑV£4!M˜HØÚÚl ¸ê?]àrVæÁªÜà´eÏCÜÎÂ÷„ì é°Î ãl&¤_#ÿ›Êß9´œ97#„2W]ú¯7Ê Jv`z¥Äû"öf‘¢ç…y·¿zïõ‰¨DЋ …ààÞ ^ Üã¹/l×¹cöEXñDÓJmï[é]ÇÂIº~ ê¨m`¦žÇ´½àiìÍ”¡cëp‰ˆã3‹ÉÏâ“Ê´#:ýá¡Yz2˜(xþ÷ç8ŸvB(L-Ïר4¾9eã¦Ü}M¨hÔµ×'q¶ªY®}¶”¸Ï#7EKV Æóª£¨Šà8¿¯'½†‘ÙòwC¾á&a#…˜º[ßcì±6é#‘Ç“¬h“6t5ÇDQuO’]Åè ³ø.š “KÁG•ã‰9 L<ÿÁ“û)žXP_É„Ïä«d }„ô¥Ix 8]ˆ8êåÃÕáZÐ!èô´›"=èéÛÛ =ŸâtC}Ößô¸7Mâ*Y·2<ÒD;.üOEk7Z¦ä£Í/WW;ë•Ûw[bÓLÞ˜50‚Ò£ îåýÅ6—5ñ u«èò»GÿÐYö¿4Æcõj’ÖϹÂ<¦¥È›’BGËÞ˜ot¤b6m øÚºƒöÔ%_ÏκµÎ¤ Euµ¥W÷H™\ª–ev—M'k¸Ì¼Ü¹äíóÖ*'¿—ßSx_ÌPõÞxÆ.®¥8wcW˜–sˆƒ0é³£†¹×Ý.žªô‹íªéºù'ÌÏŽË÷¯|ü†Ì!aÓÕÆó&lSB›¹³"„3ª¨Ð !;¸AVôcCBˆÀh9&1ó[+º”„m*¤Ç„@-}vùåê ôL,ðœ…x'´|M5x^Væ¾Y§AùØÒù”6Èmp½$SG[Uº#õîzΚ+äËmÁÞ¶µ×;3înáäY­w†ÙÏ ã³P‘ý:´Ý¹0?³ãø£*È#§ŠŠÇ£`È'ªcÂ- 0°>Çg°œ&Ô%!—W` /'þÏûž† X´¼y÷‰Jã”"<œzP…`gé 3–jgŸ:ò)(–Í»¦ëíðP¤c} Úæ"¼I„81Ykà„6Tã2QÀ ¹>prÆó37Kp€+}q¨ÁÖý²!u ¶ ð÷ æ¥X½\µ#0ó»ÐÅ*µ£ÐÏ#É-þø©H½‡rw :¨ÔÙQ+ŠR ËP=ùKøé?«]ÍÂý&,¤PAhÓgšBe£­©Z ‹rSk®~ï2|JÆbhÓØ  !DdBBʦ[@£ÒOyÆy%ZÒ±ë±{­^3¤ÜÅ"½JCŒ©ÀoÕûôë™–ƒU>Ús×DTøJŒŽ…^Hâºg<ê»þÕîx¦Qš\ÿbã XôÆàõ2–0]aÄîtøvÏoîÛrîHU gQlŠ‘U,û"eânŸ@¨XXU³8ãü醆M© ×½éÌ6´¼Iâo\p‡X˜ Hö·¢U ¥;S×ê}Fô8Ú#IQ³‰¬Ù+Gy•öøŠ-(äuï.ʾ*XŠx4»uR𠤿œè*°œ§0²¾öb€ÉÞrMRûWÔ¸Sé,yÀ^™+:È=öhøiG €÷k‰òϳò&ìµX¨ (æS¡)J±ùË­»]V@ö‘Èþꦥ‰‚4v^mã‰F“ßêOð²·\ÎÑ].²’#'OÔ-Ï@²ú#ªöÑz„ðþ± Šnˆ¸œ/ÍÝ Ò¾]«Ä£Y>M¿ž2í”oÇäò‹ùйm¸ƒ$Ñv‚êÞ1D‚-ü¡>‘%k§ÎöÓCÝg¤»è¤9ùǦº½õ]ÿ·‹ÀU¢?>-Pù\Ê8›› B\pëj™“vµWóXY±ûˆc´LÆe~b¬¬§p,ghºàáƒ6N`»,œ³lOȨ7 Z¢œº”âl3M×µórÊ©A–îŽòÒí€jõ‡Å´>ÕÍ Pò¢ø@ì^ÎaÔ;ûáÒzÑÁïåšÔÐMx*"À¢ Š®3‹Hà8±9¸*ù‚m’¬Ò'˜£:–p l2@·ÌS|û·ÂÉóƒ©C<[­AiÃÖVж¾ù\%>ÌÓ)©ÂÂeÀ ¼Á9ºÎN§i«X˜œc=ù‚$_Ï hA-¯ K1C4êvû|Æ‚QÄœ–uÔ¡ïÒÃMŸÕ»º,ŽhŽí± ¶7Þ$“ÊyeUI-fÅÖ5,;˜^Â4vr,Ïññ<âç‘ñÚà NчÃ1˜=„7½.,Լñ¹©M¬¬ˆ Ð7‘A3œÔÜñhJåT‹Oi7ÛEhø±j!‰Q6^ëò/p†VEí*Â,ŒÍ™3/çZW>sIòþT8ç,cÛIø¶jÝ)êàÔ¸“³2‹çjð<’µ'´šßHØœ†éûgü`9#>%3ˆÍçr ’ÀØŠ ¨Ié®ñØü ãs|hôÈéK¸hjÙQŠn]£<Æa=¶båöôUH|º‚Q^Õl\2jh!ÌÒ1~f„‰Ol]š¤ë´™íØfØ €Eà€=s¹“†P–€^wÚà™83éd™ogv²çœ±Žp{N FTuÕŠB䊽lÔ}_Äxµz{¥¢í4ñ½„ᘌ(˜]ÌÂç ܶoXæ`è× ´ŒOTù€øÕp}ŒÍ~‘bnDß Ý¦%û¥¤ëq'0Ùë‚!€·‚p0Y Qi@93épåq_@qÆ¥Õ[`píµ×mGú ïÑðÛBv–|«¦Tµj±øGðˆ%HZ7⯵,:\§tèä©(G©µ"ñ.ædÀ£ë8÷\ÕÌ“C19³ÿ±ûºs„ 64x§´ë¾x q¯x+ôXÖ·ÿùQ¬#Zµá' í]Ól´YƒÁ=ñìfˆÁdD‚¶×*îPô eÖ º’E³ž½þ°íXÿÉigAžñ“-2Šºâti ½÷‘© ÔP æ{î|yÊâ Ê[ÀwL5ÍýûôœÏã]ºe.%(&[rÝufÃS=æÁ:LŸÎY‰-" Aºã×yÞ…PG¾ÌnyS ªçNO'ˆåë‚k{K—÷Úà{ò§^ø,?6I×áŽUA@]§3®ð)'†UFò”ÈÅy¡_°¹+ µ3ø§æñscüØ<[Ox¼-=y]^ k(.(¼k¯±š)Ñ¡Çfä áÒÒSÝ#váPÒº8“ÂÄ$ ­hHN‚¼0©†±£ “ qýλ¢’³§á7£± õïæó8†ô!·^ʨ´þ‘ÇíB¶¸n£…¢¢\ŒãüC¿£Eý"?×ʎΔ­@„!®ÒJLtèû,³a…(ÙÚªqd Ü‹p’’tí˜bG[Ñõ—:5#±`ž(QìIÎdSÉâ]çƒj_éì™ÐÔr‚äg³%£×è“™‚¥5 –¤Ø®±aa,Ì ¥_wÔéCS*¹ä;äÔ`ÌòÊö»ääA‰:™¿“Å 6t1¯FÔUñq”<*详›ÁòÇH=ò¶s=7…êLà-XÏ•W^WÍ:BS` §®N¼ŽáÑ©$’ñÿÔ|úiõ¼ë™ö‚_Z¤%'xõoþ£zÐ4V¸ï3ãfZ"²À^ò­.ÑtüáF½H¼wë6©¯vN# ښ Iå…4¿«ñ?í¤ˆò¡±i®4’J99†/»BA²í†FÙ;P8ÿÈ-Åt¬>·Ú¼&>Ÿò{¬Zw¸<!Æ«H°H½¡ÎUüIû%n—díœyöoúEÌSÓ×òTBD1?ªÏÉS‹5”Œ:6ãœäSçï#&J{×ÊL5çæµ×Ž8®Dl”?Ýš…nê}XÏS`ý¸ïxKâÈ/6_;M˜y²ðAâ¾”»W—ºï0ÄÔ^„³–bþÛªÝØîL±yÎɆâwÔ:°C Ó3ŽÇÆÅ ¬§^Ó”d‹„П‹¢¯H¦å’.Æëì ÜÉ™þ`aÔýµvsA1>Øt;Y 9÷äv9 Ç›í¡-œÖu£ô¸ø‹3ÑÝ×bLÈBTÙÇ´V&·5•ŸïuÙµzaƒ¿s½c»+Bα¹_#¥ŠI"k*âút)ÚH)où¹f®]˪CNІÓÔù &ãò,³ ²~Xthýµÿ&1¶—\Ê̲ë6´G/:nÚó"åÿ }¶1|ŠûÄ·>%Æì6>€9Íó¹>Œ²à –ðÈ•ž¹ÈsO7»4N]ÙážÝþÂ3ðÏ|`¢˜0NV¸ªÍÚ{JÑه㔡k™¡m½µ¾Œ5É@€tÌ_lGÀßV™8ÜüqZŒ_÷ÆMcJ:l"…W‘&5f¸ ÔÄ®4M–|õêÎ%îzŽWö§"Ÿ5ÑÞÀ*j(~×ã· Ìf˜i,Kã¬Ù°iàa^Õð™‚8ÿd<‘=ÆÕ*¶ÿI µnÆ8EQÁ°¨ù¡s[ЫtAG„e›)þ¸Õó %³ü'•è67IØG"ìîYX"»óÔób;ÁøTkk#k«Ò m"}L¼g×Õb™'Ž;¯€Ç§f?oî©tXÇ9ö‹Ûf1•gŸ¾Çëæ¢âo›Vö |óô_ÎÓ«å°¾Bµ¬âÞ%¾k¾TJ¤Åwkry|\''J~ïZæ2=ôûå/rÌô’uª€5téMU±À¡|¥wÖÍÍ·$Î1ûâ¹±?]VéÎ\íʧÝð¶„´jsòbKÈõx¦•ž²¬“–ÝëõÕLT¿Æ{=–Pÿ…¼ y0æ­¤OÙ t›“E»sùÁ«×Df¼ùzŽuVÖƒØÎÏÓKí˜Xnt0×äðv‡ó›Yê@ºíB_Öq¦3õ't >1¡6ñŽr®”éµM«?‰UJ€ð<‡trún??ÎWp¾þÖPKlÚ­re±úf¸—›ù 4ñµ9ÊBÚÿŽC§PTô‘Êøß¶Õâ:u;@ÀldÝá³"§Ò4dUYÜ¢úÓ~bàL]O!ÜõSY[ØØÂÓJOŸS\oªmõ³¯ü·ei2jùAù«ö€ŸŠÇÕX#\ëêéPÏ,Äðh–zÓþ]àgüC‹ðÅcÅbPlø-ÿ“ÐyÕ`k§Ä¶Vææ•´[4‘×¹Ã@;>/ç÷9›ú-xWÂÞ4ïsãëŸ=Ge ¶þ­=RQ¢zb9Ñäüxx›–â%1_wвTíÈÇ;¼u –ˆ–ÛYeÏŸIXeÓF5®K90Gìί՞Þ.¬±ÞéA2¢ Sm1Qõ•˜£¸^Ð0G/dý£,Ü—kóÇ»·C[Œ bþû5l?ø.wÍ¢ÿ Bð d'C—Ûgh+á¬ôOÅw ‡å»XåšàV¶D>÷f´;}2¾Ïj妙Ö,Ç€°¨íêl%®ÂmrÝÄíé“‚nmäÏõâQó1—Ö1å5@MZ?BUƒÚ3æO“ ỡà [¼j>:cÑu§„†µ@ÃÆÉ,^½µ éf{ “Œz'‹?W–‰øÁcÏCçDËå¥áSí¬ï–Ÿ5HÉh}˜:-Ô䳪;º nw˜œÂ¶âžiõwE^]!š[Ê,1ˬHUÅ»ÇH| }Ô‘Xì´ÐÉ-lŽˆß|$FÖ수ºÊ RÒ€ÄÄBmLÑ>šf+âM ­æÍ‰Á§˜mÙé^íDZ½T—ŽÖ’Ãj:«•Ç&]9›Kôå.&yžx`¨˜a7Ú,­8m¬>dÇQ÷¬? ¥§¶TìñÞŒÌñðYÐáÓÒÖà"nUÑΓ¿ú˜FRqToä-»þñt¢•ÜÏ1 ®Ú|mG!kL’Þ~€Œ³ãÓî˜K˜,÷E_¿‹d”Aʸì 7Ëh§i¤`_â}M0k©…[¤·õ7D|å0+øÚ“˜ƒ€$ºÒ/¦.̾IœÑ÷ŸáõºƒWà_€¸Wñ9·ê˜€q”tÌ>gv(spcœDpð-e–qñ˜ÌCBâUÏTä-üÁàÎmœæ,Ã9‘È{‘®ƒE7ìé¼U)¥2)=€`C6ÁOÜŽdZ×Ìh/Â?)Òˆ°œ-Íuýžp.çI‘ⱆ UB.*aä{Pæ·ž3|÷Ã,a#Ï‹u²tE'Ë›YdôŒ×Prp%o¸‘"8I \XK‚Ú–›‹Ô(²'g¶bÂ_[’ hò\^]j‰rwœlN]<øe™Î È$ë& ì‚‘!ÜŘÁ°Ä# o SÇfÐA[¦DÐ?Ïx w<ŸA³……Z,iåé “p;%v+©ÏIôá)ÿ¤)«Ù:à–<¯å½¹7²^I€”M˜Ò H•,Ë¥q#:QNµã B5æ·ä†Oë•«¹&^&ªÈÃ"Ú ökCèÚ‡¼uÎû6^V挸"­1®ºýp·9Ȫ&êãÁ#cOè¶ÖGNó— JöhˆÖ183sÑÓ$”æáð 9Ò«*=ÅõPqýC/…%ÕvØßX½Ìt%‹“Àa>f¹YÉ/S&ÀÍ´*´Wĉ¤8¯ô¸gÏq¶Í–Gš‹ˆàª “¯—jzgTçÙ·}ï*“…É„¿ðö£vüq˜M ¦Kƒh#iÆYH3)ùMJôM`Ü$/*Öé¦ ¼‚Å®ÄO×1¸U `4Œ‹¯™û=[3† ìÁ//ÃÞQÝ=²)…1IvvéÛþ#™%£¢¯,†ØnO€K=ö÷—`Å '“Þb}Aµ´¿Å{ vGJzÛ{Ôÿ‹ÝÎóG¢ÿë ãѲýg V[Š|¤,ñ1–c[’4%A)[EÖ”Î&=s'§mï ›LcòâØ x÷Æ‘Ãéw½Éú"%GLóc¾M d&#;0ÅB~^~Oþ"‰€¢Çñ9‡¬V¿¡n(sÁQþ³šïoÕÎö›sw?“#óÕf¸¦”n¨ÑÉÃàÃ)ªÑ`èU1 F¥t—Ì©-œÑª)ÈdÀ1¬ðªÃ£Zó'/h•éI¯ªSÁýùGŽ÷³$‘< ‹uç+2ˆÀ°„¶õ3]¼s¥"ªã…ëN(4ÍmEºm¶qVók#)B~:d+ _a˜à*j=JhÔÿJ*j}м‚5!GØ‚eøe\mHŸ7¯¡ðÎ+HzDºä1r;š_Þ°‚Áe&©ù ñŸø¬~Ò¾°}Ö7G¿ öɬùÚÞŸ«÷¢Æä³¦@éÛ]̧² ( L¡.Iå!îik'qºC¬A©«·l¬˜•¼ÔÚnváwÎ^jk·…[U¹¨öÊQ<ÃqHÂÍzáS¢¸Øuh®ªç¥WлaýIù”ô¨tmøÿ`n‹7¯ž³ Ù t! ûÖÎ4HãTëèÀÎv,€ !)#»„2P{òÅ>b¿zn®þ ɶE<Í 2ÂÕ¤_,Ÿ²…7ÈË¢„ ÁÊ{‰]ñC‰sgâÿï•êøkí kd‡@cùÅ],ÓÖ\ &RÞ–•«Ä ÝÍ|áÎ gçUˆ1·Æ ,9Yß¹Õä½cÿ+8 6C¥öfä|Œòª…D ‚¤[ •ÒéÞ¶fþ0()‚¶…°ïK:êfgÑi`í]Ì*õnº™Am‹X/­š»ú°Ø™ ´ÛgWðµC"¬i[™GbZg0åÓ ÏWyu€¼%~ÙÉ6~wßܶ®ÛË ±´a¬*ˆ®âs‚#Ƶ˜ÆÐâØ‚£<ض¦«UÕ§Mö˜ìÄ›»ä •#˜mT&\¡—QT¾³ºWò>Ô ;}…5ŠuÂ:Fe>üË:œ(ÃÕÀƒ—,þ(u™}{Ýý»‡§ð!v0wµßWü  Vﮆöwr‡‡‘1œãálk’‘œdÚšæá¯¬èâF‰ËÂa ©Ë/‡nîM©$ÖÆÏYø2æl@Úέµ‹¶Uà¨+¤ù™j&<7ÓO‘9]N°éღþígØ—§ )”ðãÈÉÎ-*î^¨ª”ÿ%!å) á ­Ðü`ø·±bÏâOÛÓ÷ |»ðÝ »òæÊ˜ó«þÔpWRÿT©u‘+ô C’k–=ú<ÌWŒê˜Ô%º²Ÿå$…6²¼<¢š0Wpy‰–¬Ä‹ÅÍÁ^ʒІ$W»`5ç„fÊÙû›#®Ø;무U(¼ÃPy'y87tl‘9þšô!êƒ aöÓ ó½Cœ ³2óæoÒþOèGd…ð§WÎÜós´;0U?@«±¡n¥zŒLëoôÏ‹Éyì—0q>vï‰JwÃËÑÑ.áhMœ%Ò3¨’ÐåZÍ¥˜á§<ê2’¹'Î0[å…¥ç5‘ë;É×;Ó°/S²0Lƒd +!éçî)í­¼ ù[: C&iýkoõë.Wä u²onõÖõø(8ï¤E€}„›WP"Ò³oÙ­"6󟃵Ý| §›:èèæÊúf"o9¾Þ~ SøÙÆó×y˜~á¼±Õ½÷#®«¿\bÏ”Q`?¾}FQÉø¤árëRgàóÑ%ôPö’ź§ñaO‹l½Äõç¦ÄMªƒé?—P ß^‚á]'‚²ƒˆ‡!£F#÷ ½£Í‡“¦ã%ŽÅ|k$‰—Øúè†Yò]ì4KÈ Šœì“.¥>ÁC×"¬…˜q‹”:œ¬'.Þ 9Èdgï¹v°ñrTÁµªïyìDçWň}Ú¿±È¨5¿øí;?Óvv>kˆj ¬Ç0l‘¸TÙg~°É£ËjÞÂöŸ~@Š[‚¬WQ==…Çúþ'ó'üYÆ2§ë³ƒã¡YÚ^ƒ%ù&D >ü¡á.?’ÀB\/j»ÕDX5W”HêΤöcì7ªœ¢L4€Œ"ÛJRZ¶ÝÛÀ«3E‘ÀD]Þ}‘•Žomä”öÁ7WyÃöàu|ª›E"*ñ‘.µ¢îÈÁ×ZbhDÞò˜#¼iF; ÅÛßm^GIO¹z¥/#“]šrã,àÞô³gñ`>ÿÅB¨üpPrIê0p¿?8yù,Âa~&l•ØèMùÂüâVŸ¤ÿïŒç®'Ô4AÚ$/~V%éâ¼p]/ \aýˆ&úç­Mh+‹'²ð-¨Ü:uT‰kR¹áä¹­©‰€Þë€"Žê ]Êçw@–7)ƒ>sÔ{í;¦pcöEM‹!}Æœ+Ãx‰IÎÜæ|°ñÉó!<v`Ü2‹iç=᯦+sMÜ8­¯˜%+êZ•û,q‚ËÆ*õX°>¿oí=Yª¹íVGX{ ¹¶~–í%7XÃÏ—+ƒ|²WÅhÀÎ[î²S ÆTtT ˜ +"QK_3]“”Ü«Ž4ñ6 083p´‘‰gý›~¶öŠJL[ ÐQUW ˆÁ“A_ñ÷¼”ÛÃÓ²ÒÝGrd©jã´a~/gjn™Ñ„fró‹6‡¢VÅ51Äá¾(›ûS–¶÷E96]AݯÄÏZÒ2‹«o§‰Õ˜ø-ÿ|E*ÐR¨*Àãi›6Dš˜VîZ¨x”y{r}ÅZŠ ƒ=Ù¬f¼Á)Ú ~ûÆ\É!«B¸ÏíÓ(Ò"íïnèí kIWüT¡ -¸ÏlžÍúE?j,±¿JÚÛÙ‚\ùúÈ.V‘Í™©v»ìóžAœykŒ%ØÎ D;§CÏìO6£âd~äýe• úV(öÕ(Ž·GãX|QÞgPìP0ÿ¤±oz ÐÊÆžúœÿ¸íÞec¿…¡ÖÛvtïÒÔï‰)¹Î(þI „7»Rx¹´ Z™Yê”¶‰£ú@u9Ǭœ,ügñO5%PÊš˜_‘(¶ ¿ ÃÑ{nzÌâoÎ÷¶cÐQíz‡Ev#fý(ÊoÞ2)# ŸÇthhþ2÷³ß p™HâçnÎ0–*d,îÛœ¤z¾w']%Ÿž]ð-ñ-66 #4 o^ê….bëMÃm”x ÖzðJ¥»=nÄ„P.ÌÃÊ™¹!R…Ü^»¼” …â¨ü†*Äœã@,Ç9 õ5:D„¾p %Z`Âoʼû¡tÔ^³ZGН®cv4 ßXG¸–Ä<APSoä;Ö‹ß‘E¥]7Roæ©pxP§âÍ‹ò—¨3lòc(:kJú«<ª‡ØûÅEØÏŒ *ÿhÍÖª0èÆµjíDƒ1/É–Šh/Ò½@t¹±à>TÏbC8¬—güU¿ßج õH¾†¤™I„¾mDàTÃv²¿ÙÌ*ƒ”94ʨ5¥@ªÎádu m°Ø¯¨u𢠚Ô/%”nvڪţÊ8RW_eß=¹ü›PÊÜFSÝ-cåÁÛ°6­?h`õUWbi»_–ŧú‘‰I‰@´"—ujf‚ÐÕÎÅø&'.ÎûÞߺ&ðM|O"LÇ]*_-….›]5K’ÝaYŸ8‚ óó¤ÙM¯'3„RH p®ÿ,5¨pGVÃÿ»p[ — ¾€cÌSõ¶ºÆß2Ó,…/nÉqM+¡Ày•ŸyM" ÕÎ#î6³d·²+ŽÕ.òt–4· W斮r:+n ­/¹CšÐíÓy` @:çµÜÉ;òæ…kÚ÷³yü3+_.ª«?í!2@Ø1ÿZ-óÊù:;V¬¬„ cÿÕNÚmˆÅcÔ‘À0–yÛ6…L–(ÿu¿å÷;"5vÞ~"M„ä’ªÊ'MqÙÈÕÂ05B0üù·¨#‚=Ø„j%´ Ñ6ya‹;$IKõ’–²ê¶UG¼³P|HÈɬÐÿqeðb\¿õ+È>=i}MacºÃ»V¤,~QôÌø]z{,®ÝغÌn„v}¡Ìõ$¨-9Á©$‘UNFiQÛ“µxDÁ#çYJØ´ñA¾´ž ‚ºíZ³#;ÉXNgdݽTD,[g§­R±êÙMCVBÞ‰TVÏ7g%Ý*æ˜*]CÕßqH„~ÅÊ÷ùõV¼Ë/'P™o,K¯œ;öÉ•´‰D0t틌¸øýµ“”ù`¼N/€è€.þ}1æ¨Ê£u…l­|6R$­ºÙüýØ_`ªãmÖYíÄØ„+3Ë?auÌMgV`ö;@W‹x->çšwNÝÞƒ@OñäwËEOM¥¦þsŸãuʯ"øÄ¼v¸o‹µPa¨ÿ±Üɵ¹È0)1>ü‘ÆÞ(=X‹‘lþ÷6ÀØ7CááImJi’û€p1þˆa .#ýhžfD§tOûñ±šxÝeWM%îSæ(åÏL°ÅÄεeÓ§òÓ´ª¿å1èžC¾ã»· í‰.ìú'8áŽi²Á™ÚH(GÙ)rÅ1½ÄoÁCr€—>…0¼¯)10Üô¸6SÇùdUàs˜‡µU· žYbœÃ}7]ÃŒw¼Ë#Ý62ºýö®zY?BT¿>cö)ä—ù<Îþ#í³<ükÃÅ1±Íßš ª ÝÔ˜&1=fºùH!ˆ9Ô>ŒòÕ+t+â5,oGãmH^} ˜ä7oèÅû¨ßN‚† ˜.ìj~¯™Ú3e2ÎuµGÁ¥ ¾ä;¿^›Qœ˜cÕ=Íš) 'ïzßù­­R€Wê8e`ª{ I‚ë´œüµbt”¶5`vê|Åu½*FN?`šìB¬ëÕGåþ¸•fé2íìÛ·µ+H‚Fhi‚»L›ajÀٸɖ0þi8ônA\ÊÃF2¡—H–&zB鼦w–’h&šø2^`5þÉX¹ u§ì jßjÆ ´HMN|«EÊlÁ?d¯WNÃ*5‘úä#œb-’Ë ‡³O¼3t®t ^\=¸ZͦMz1§çF½%\œÈNô+ð¨)KÝæ&¬¦ç)ИY§†fÀ•z‹(@oÀô¹M7 Í|#ˆûí³RV¯dà¯iu_£ž¤ñFS4â-d>ü9KÒˆòµ¼{´8¢*WîåçÄ9–Ì‚xs+Tß\ú4j‹’}T?¬{N ¼‰ŠÛ‰‹Q¯Rô|llŽ—½òO¸žÁi-"zƒŠ‚1Eo„ÜË,­þ¶Ý—ןö<¤K²»=„x‚¬±-)oÖêa®êêät‹sß¡…ÜGµËüB&к~Ø…HWsê*2_à &<Ãf€}Ä:žh "2Æ%B;"¯f×þK»ú½˜…èz«>çêC®Çþ’G~ÑAá¿ÚֵЖHâ2ß1±AšÃò< ¨ úlÜǦU"ÏU=pŪ°'&Tz÷Ítô\54Öèz뎮Œ†—¼iq쌉ʲ)Äæõ‘ýwÐÙˆãJ^—yµy®\»)[ ftƒ[Ú´Úå8h¦ŠäÞh‡Á}ó¾ú@‰G”ZœV2†Ò¹jÓiÇj;ž¢9øe•ŸÃ°¼Y9h@lI€ _ˆ‰´§y±ofû×̨*»x¤×¹9ù`R ¥›‹ÄK-žoŒ .üx.õæ0²W”-O5ø¶ CJ¿lð=§ ¥C³L\º÷;/•c•3¢<Î%yÓxܹ…TÓk0ݸuÛF1Î.ÆGÜ3¬^ÂY&¡yb±9NŠÂé|Íoò6Ú¤€öÏA7K#¯Œ" Ì·$y¿©ˆ¡Jº`^°xß¿}²w9Ų5­ò*R:é]!¾ž÷Í!>¸WÞ'¼^!$ƒ¥è™,Q(ž"úƒÍxÌžØ6¨Iìû¥&© ùÚ$°:Q˜çzbÚx¾sуÓuß8‹å:ÀÉ©\§qN ÍrJ Šú«¥R}R|GðYœ1ËÒXÐlhöÄÚ4C¼<ò¡ý|¸L£óãã®a°Gº9ÒuЍ s ±äRŽÂkàÒ²Á3iUšÄ«b.ÃPtå•ÏÙØqú¬p?Ùû´†Ðìá<Ââ™Is¦V¯h êFÞ1ßwºYDßȵ [ùfǤk¼¿Yés‘ãÁO=ëî¯bƒŒ hÕ‘²ã£"²¨^!ìmÒü-ÜÄUI5çÎ`H[PD[ ^‰–$n£wF}‚"ˆ©…Í–œ/áõ.¸Tºø1ñØPžÄDûè¡+æ¬ëëÛÈÄÑOÊý€z;9ïë¨j ê$–ƒ9ZH7ÿý.WÏ}“0‚]Vµ…ò·Â²Ä*>ÄZ¯CP£N ®gLh=7¢SßgW×Nýy'‡ð¸8›PHˆîžµTyâM"±OK¨SÏ™»™¹ïNÏý':ƒ2§ªô6…4d÷¼ h1…šø÷_MÆ)§òñÃ;×èä÷ÇÀ鯄œìÈ›2,€ª*ë¹pÏ›ñwmBñW›=›TÅ8#xì­‡N²GÛ‡o ¤ö&H£wPÉ|³5ÔÖˆ ëÇ•d* þ€³wr”®„q3rȺ½½ƒ™}Í¿Á‘É‹úøÍå,«ƒÎHÜõ“wìó ˜°yá…X`÷¼.¾Eô÷ì~rùEe… Ì~´hN'»¢Fa!‚pö´õçèl»‡¿Ý7o”–ór+1ï·ù:äþÎý;ö[?@‘;ûšúÌTB~÷ö³]ÊI葳–Ç' EhC)ˆµ"ÆžWL¶~eJ]n,½ƒÌ· î?×á+Ú&ƒ ë; ÙV™Æ't1#0•±´Žm˜€kª[FÈËÌÕ˪>%þ'—‘-Ÿk¬Ó# þ¿ÅakyAöÂ#£âR"*Ô‘þJîV7'þ÷ ¦ fÞb‚ "”ͽä*D.‰™6«ÊÿË>0Õ*ûOËWÙ7<´ï+ÁpµŠ¢7|*fñ*ÿV­â¬ÎîG§Ö>ÎÔëÅjÔ/óËÄ<ÛÅùŒ|Ak4‡ÁmŠ~h«a[MòŸ2ûnUãBùHì ²/ÄÉHP‡ûÂÂö˜Ò:FÖú6¥¨âƒ:êBŹ…OQ³ t}¹ÁMjE`¨ž_%©P°ìQˆ}›g؉©+]J¹}ιÐ=YyÑõQ‹wˆÄq~½i èåÿ4Dza!ªþz%±°¯Èb/„©iQ#©Ò¤¯z±.þCf}ˆ—sRjº–/éOãTE5U® )Úó§°h'ü;M·vJ=ý¥Ñ7uOb*›3۟Шù½YJ ­GKý\QÙdÒšY©‘K•’ˆÊìÓ9»A°`é°”_!%‚ë»æ3-6—#0™Ý¬æÌgSÛ£:{ÛM½&@Cž“»þ³W䇨qª‰—]äïž–ðMº ¨³Xï}k/Ùÿ„}”Ì–h/éÇI‘SñâûJ³PÄinú€ÑßaƒüKµ¬õå­ò®eE”!tTm™é)-õ=Çs;ŒÑtõ%U…t¼ŸU6­A¯8>tXQ»¡¸Ù &ñÞxym Ÿu&“jöQÃ¦í§®;øp.£ ²É‹ýËÊNW$2š]ØzÊty8è«syd†¦ûlòÑ™ÄÊ€‹w}Ò%\h7íÞÑODÍÖ!TY¯Xˆ¸¬Ú n8 3¥Ã]@7Ž)Ôd2ŽRæ­#3²%óöÍ'ȇ·Àµ˜‘¶?A¿íé£HΛ¯ hÀ·Ž‡UŸÍì‹Kp¤«ÁÏæâƒw„ ‰É Œ -î)׬¡†ýaì£Æ&¯Ç®¿¾é´"—A3ÌAyÛ–=38éÙÆo8ànä €†-w®¹Ú{¶„êsÈÞ;Dî>æÀ_ÈÂÚ ÐÝ«øÜ%xú±Cš8âHáá­Þi×ïRÑk‘Ù£rkビße|e|LJÆÄQ̇¤4¡²®? ¨¥¢é´:`¦þséN™psì;„Ï‹?¹ð@‚pÞ"­]sm%`À$Äë}ÊÊQõ±Æ]£QD÷¾TKT1âdFr½£4°<õè¡bÈ]Tð ÍEŸ¶îߪ–aQfo§ZwWÉ7ߺ1z~Зêe(–¼¸š€¿¬ð­_l ÙmµŸ®Ó¸O:ÃC=è¸Ëºoö5„¡†z)¨ûLà}Áúå’öT“hw{áÁ`è_¥1unó¬Ž,gØÓÓ_Qâ÷‘5„¼¯ž6ƒLêŠ~Ö}’㾓xF`b ãD¹šžðžs\¡Çöé|·²+ÎË/ÍGø:ìÃÓ©]s¬Â)Ö…}Ôq¾µ¡0°hC…fÖ™¢µ”F°£ä\1&~Àþ€™8ÿË›®_UÁ^0fëW=zº™µ°‰Ž< °*ðÆ™Oi–V6ñ~ ãë~Ôbü($rµ¹œÇñÂÌÈê×Ïw¦ÃB•u'À©b©²êÖà­O\,ÎÉ„<Œë¡¾2Œ'Ì3.š Oº‰V-^þ|Âʬ”QœßÕ—~kAÖC*GR* ¬â»A€p‚Ä9®µ {ùʈv_«§í €JJ›EÂã‹1‘1 V"‚]ïI¡ûfÃ~ïßS‹±è1ó5âÔHGOê’ðR¤=°©¹B–O¦Ó•Ì Ó±ßc2: YÛ1èÍM\®ã1°à6‰ÔÔ¿€L'¶A %føë·Õݰ`€–ô}ŸgqŸœ€.>‹:dŠMýÁCçË’MÚQnªZtluBYè:ÔÙppe4ußÔûì\skÑ#ß„ÔÉ£ä0Yƒ”c•ÎA×>êL™µ[²µAëwÑ€,ÙÖÃb=…ËAá}e-ÞT">ëŒÆzCùa ¶Ô]œ­N/žvÑÿ[pü*Q/ÈÅýLj6ŠŽä ¨žã¼³î|ç÷C4%V€–ô‡±¤A6,Ç QXL:ÈB´_‰+Væ³2” [Õ{vKÀ0>³Ð.ë¨~Aë®$p¾â#毲ö•=9Ø"´¹6îå=T5Ú)ãsÑK* OÉÏO²SþK ÷ò'µk—ÝãÉjË‘ðq_NËMìyI“¼#;šÀ/^ÆFxœ€m ʟ‚•^FMïLÁ0ã´s 4: hù•^ÐáÔƒ’âb¨qNó/Í…y|»Ç…í÷Q§ ˜€¯Ù9rÆÈÓ4Äpö:ôÁ"^¹"ýè’®}[ßî$K{—óë" Ǒ‘ñ8;üw.[¬a øèš¶Ô‘ŠmAÚ5¤Q3Æ\:4þ‘Sãf°»«êd×,«N°@üÜrŠ{øÂ Ý֘ݩ×þGSØxÈžùÌ]Ýò™“ Ç…#Ùß‘uÖò ÞŸkÂCÏÚ)Ü5±È£›db6HþÃ5„\ò arèãÕ´gùß,ÜŽöùJ6pi·D9³°FÑž‘aÂfž„ô,ò)²ˆõ>§7¤}ƒÕ©3·~†Ó”úbgKè„e9zÚ‘x‡Z·ÞÅÛ›a,ïˆ'=]T_*vйIBþà cG•CRStt]‹áç[Û…Šú5Jr e{uâ…ÿÁÛ ²{ÍH—åÔ' >O‚P½F P D‰*Þ3Jèƒ•šæŸæ´„â?ôG|™+‡‹¡yè÷Ì–Â=,ߤQ}áD*´4[›7äö…1ÇQù®¿Hà9Ûž %–@4®;çÐ˜Ü /`‡4$F8=nvæÖwð åm) ÃDS¹Žæ9¨`½wY:Yñ.àîê…¼ááxF3€t3 ãé‚Q'¨ðü¦ŠûÒŠi Žþ>^qrK .¯¥vÐèÒO÷[ ²+ð¡˜yµ×ù£+ ö]N¸ŽÜDzèâœTxºƒÈ(¹Õ‰*òGEÄ9v9¯Èò•«¯qa7Ô3KÞÖEe顜ï6$µ­kJV°œQ&v”ñ¶@¬åg•ýy¨`7àDÒ³Wøð9š0Ò‘ã ´ÁÑ­>…¯7EBáî΢Õ5r àìnfÅã¾ß¨U¶»˜L¼%VòÅ÷0_ê[ õ ©ƒB¶R hÝ«G’TFüƒî’¢é‚BL#ÚD-F­k¹Äü-Òe²tEâѧaúY‰>ê:‹¿&ö ɳ Tƒ,sÿŒÆIàhñ׿jY™ ŠÁ[Í&¥dÍL¼°yÊî´æ] _2%€“ÈcdzvÙï“ˆ|;€qBf$¸¦—Ncß} ‰!m—ƒÏ l‹Ô(ß<¸†4c'ÝW»åÙQ#~c“ˆx"ñäú4Qh†l¬¹#ï!⺑\›gÙ]^ÖnSº ¢fÐòÂ+S`°Q»›‰•ÿ\ëá5:Ñ$£þMõ $ßv³‡–´$ˆðbºðj#ÞGœ³ž6ÎR úÓßTõ±¨`ö„•á‹ô+%;2âUQŠ»$ƒ`û9]™\YNÙp}‘íವz”¡ZqêÝØê¤sE[Õ®x<@‘½S•.°¯ã˜óôKTà&·W+ˆÈÇ›ÈΛk¤8°’oÉÅøe6:Ø–äu1Jo¨õãKõªBÝç±±E^úº÷Að<“moÊ1}CŽ!±q:x3åâ5ïá­-oH¾Û [D¼xé°Í·f+=¿zˆ\–ÎLâ@Ì‹ÕüZ&308%H'qT©øÜx•Ó“"´üòâ¼>’(™òµ—ãb»s–h ‚œPsLæ»LÓxL€&¯€Ël&´6-âqÎÞf” F€VJÓwÔ:w,Åí™ADÏ•=288Z0ÿÊ7&*é¬Ì:{Ë»ZFPÇ訮âAšnìû÷:õˆµëgÛ‚ŒAGµ,gEE-jPYc½î[ ¼Td6Û Z }øõŠ1îÒ™Å=ówŸ[xñPÁ§³òZkó ärÄi3§{þ®}1ßÊHÐ;{—èåjc­ŠA‘»»u}i^þ´ù6©ŒbKõתP L7ó 6ÃZýÊ}ÖSáÝ[ñsT²)uàTÖ—ªÞ¨ Ô<‡}®Ì„ãqÖΆwÅ·„QL’f•y¶,J°¼à¡SÊv$ÖA &¾ÀÔ;¸ úæù­Uoò,0 Øé÷2'q€pS4A¾¾F8`8À„ñ±ñÇÏm@x#®abŽ }¸ó븊ŽìDÔk8 Aéͦ¯Ý¨'fÔ¡b¦‘#ÑKÒ Ù{ DCŽ  jè”)'}šÍò¾ÍÈê o вT¼ë›˜úòÍzA`êþ/ A„L£+B§# óޛθœ SYaþö>ÍŠV~kXôꔃQ9§ÊýE³îe®,ÄœÜvÞ|³Fi¾~ræ~Òô¯àÖŽ—#D`â^[-DLhÌ?fn­]ˆß~ÅkÂÔá@™[õnÕ¥úc ®b b—Á í;üÁOM“ÞS¦ígºÐˆÜªùjª Wi:qWþû¨<)ÇbIVmïùMø(˜6ÜGmÕQÏ%³U#ª§®ëDfÓ÷TXA’±€ì•ÏÖ^›f€{Ǽߥ¿:•1P•f¶\üPØr¹ú¥¯bp] <ƒÉûê. ™ê[æ ë3¨A~¬+CRКŠ/:áOןÁä‡Þ%™°©ãv£ 1Ðmð‹W‘|2º”{ ••f+ ‘54›RÙB$qÜaU?VÊ +öåŠÛOD  ÕÃ1dx“lºm¤˜ý‘ýÖû¹XúA ÁîhKû’ž,'(Áê].Î'Ú+Ü2y”\0§J¤‘g)lbKÉZ¡AW ;£ç`œ¯foÊ|u…eö xîØÑ·¦,[© vá ¦H“îbE»éÕ=Y®±ŒŽŸ½µŸV '®V‚_jµ­þHTå}ò³Á‡¶hm˜uY™Œª÷AS‰‡#Í€&Š}ch­»Dé¤:Õ•f71Ú Éjû>¦?ŽëŒxVLiòGl„Œ7n65Ÿ»­Ó+9Y¸§#®Ù›¾t `D˜T .-â@Ø-7ÞP¾1}ãß­2j-Ú/¯z”Š!‹Ú\Gè‚¡çe–BÄ¢¡£#ó!s)³ñW>¼Ã8­ùÏHA9y÷Â6_$‡ÁÚñË%&¶¡H—Þåd©U²²–!z*¬ås¼CÃl(VQ–)¨ #*ÇKÉZ~Ad¼?Â4*ÀAÎl¤€,Žh]j8ŸïF©^EÇ ©FØEÈí»>”öåó¥NnçøÆ¨2ù}¶ w`sòÍÕ~Dòt•_«LJxÜ»¥·1·À?uÏzήA?°+p5 lü§kçy"Oú“¿ÜqÓ&S2T]þ`YÁFŒî&xÒž‹ÈÉA›Š¨Ä!„UÁ§y¯ˆAõ…Vm™ã8™Ÿ‚¸‡x`@øãŒšÚ8{–„– QŸÒÒÌá@¢“N° îî¬>Z•»4§ó^/’O˜ª»âì¸i¨Lý«²)‡º37¼Òƒ¬V:¼€¾ø†ØÃb…ý3ÈÎ4)˜¥êX/Áû˹­a‰nESƒGiÊ ”ZÖÔ Ü•‹ªÃ‘mŸÀÁ»©¬'An®Ô=>bz0sÚÝtl)ÔÞ{ý$di*kEÁ¼9Qe~OÉ¡Gz.ƒ@ø•Á+øÛ£<Ê%FkZ+J=§dy!Ü .|ÿ mÎd.U• ß6ø«O.õÑÛ¹úòuèæm:Âà!{‰¢é™®€â§&ž¦€¹ÆÏ c-¦jJSšR¥»}Õp¢‹F^IïûOîi|íï>™VÓ©¾µQ/u”LM ~îåQ_Lü—ÜE®åÍœã¥ìˆ;Gàl€öó^/2ï{EÙ tÏKëWœï(Ï7 4é\Óªûœ«¥o ©)ÈJ¤ Y/ýýŸ3T¬LíF$ Òñã¯ñ‹„ðGÕÕ«˜Ý4¾\¨J±Ð$Rxv;-hüi—œøgê$·4<Ä\I ¹~–>ãƒ,Ⱥ«êšQ¬žÖ{'žk™VH}\fdÛS½g;ê³È¬ãTlLù˜ÐI–ì„ öÓã=ÿ,$UßT᫜‰r5BÉï»pkö µv«™2_g0Ñ`þBëúî™Ù踲݉M¶O扚 õ©|¹¼eõæs|¨v* œ¸~ŠŒÊjßN<ÛJÑA]ä½´ ýwâÄÛ¼¬*xÚØÙwÝÔXÃõÆ4£E Ë{âaµEÒm7O“áÔ¾y®§ºhO3ï Ìয½v2ÑfÄ•èQòpÈÂgX•Z©Þ,…—ü¼øgtrWA]>L¦3´{ tÑÈKÖËN×\×qʳìg*ø"½­¿« ÁMsI‰—qÍzPQ^a1uCcõµ}+£‘­ø<€fï–ØÀЍ[cèmðɇüÜzã}"€öàɲ 85»i­YÕ‘Eƒ;èG™‰B>ÒM~óº>iÄ&ó©ï{¸¹¯§Àw׆Œ×5 Ù«?Ÿ¦Uô+ÿƒöî´|ÑÁ8Siœlƒ10Ïÿøè}ÂW*Ѭã;Ëÿ¨‚q½nªø#RƼàL9!ºþ7V4^ìJ$ΔNU|[xpýCvüƒà;‡(ið}…͈-ÏÆk´£%<\Ö¢fMÒùn´}ßR׌.  œHóéÝÞËAš8âùž\]1TTÂÒ2ÆI!o›‹§ ÷ؽÐÁµƒž_ðûÌý.¸,ÀeÈÁ™ zÕ€Tm‚íû,`±C†ìË.DÐŽsÓsØÕ)`D%×ÎÑ´î3Uó‚'èÓð+^¹£Õ™IÃr¾!GV‰=rkêHsÙd‹€1°LCY»¡y*ùCL2[Xñ¦Oî f$ÊÛŸMÅ ?ËZ­ò)á/ÈgNÄ8í]=Щ@K$L/®9·˜™½]£âvD8Ê"Ï”=é<”V€4rDú­hÿ%÷ê~ܹ§b5}R!&ˆŠ¢ ć ?õœ©²_Ãú3†7$ÆšÔ³®ŒnŽPz–?./ûei3¹q{ ÔâqAó›=9ÜÕCE}KâõŒ–cy‹U PJÏ’WhVšÞ"þæ@W‘x2:%ç,@„Çg~™Ïç5߆ȘˆÍX©UbªL¯AÌøïö˜R0Pn3 ­Í–ÞS'Og×bÛ‘[`‘¿Ž¸(Lã-6Ý' {O%<É)†µöLZòrÄ…YÊ* Éϯ3Õzç÷–xp)$ÈSÜôK)F²µ™†ûbZ9FÉ´Dð™˜JAȰ Xl™z1 ´(¨ñl¡ºïíŠÈþæXÎÒîTN\ Ô±ðHŠH’˜½MÍ`Ò\,Ï¥Y85Y Od½òÎ[|_¼ !㔵8Àõt{‘’òñú ÍÊÞÑð:…ùÓbßð?‰èruw8Œ‹ªÕ˜r#ù¤œcoi|¼xêãÙ‘šâþ1kî7+øks›‹Ë‡p]w¯õhsBdâp”0îBcÃh^§ìäÑ×NÿÃAâÍ-`?畱»p÷(ÉÑm3%7áRD|K0%a<ÛpzUÑB* “ÔŸ  *HžÝz²6Ñÿ†Ï0óH â±€u]N¤Ë^˶Ö%Ñ(h@e'ã+Ip3BÁÚCáàxŒÌE­uQ&^y.mÿÖ̆º$t}”E±à ᬛ,gÊ®áÒÅ p*³34tšýYYSw/0E”Âèr±†ãä&a@/ÏÜýÀšg©õY¢Uê·EtGÎPÿš ä]¢"x²µ «V÷Ÿ XKÁYæóþÚ)ýš&¤CHNâìDóV6ݸ²á}gF3بÒ2ÞJõáÒÛƒ]kÈ•pa8GÂè‘òBR€n`êÃJJÖ*5žåüZó]ŒÜ\ЬW<»$4Ì¿4z›6d×÷ È¥ñç œïÞðÔR Wz$F‘<6#•\*Ø › XJCøñ `i¿]“í}ÕC·ÀßôÊ…bX(ïfª8 ÝÌÍðÉ4”£RÊ••†ôB›ÊË’ W'tØ~“ÿ 0/¨oÈ/ÑCÔ3–·:ã«A˜C[2šÚÉ *c\'ª¸P¼¾sÙrE¾¡¹<Ä¥¾ªäHá嚦[¨c@ewH‚£½h5ŠcžlùAú <{˜Ta„Ìí1h¹Î€·1¬2·c|ö‡º•!ª K¨›Ûh•ï=‚~ïцYï—2\…¾nHBn`å§ûŒ?iŽ hQŽ&´¡ôiŸ·-£dáà^ ’1ŠOŽÃùZ5ºˆü8”ØçÊ"³Ó®°“ì;í° yÁFeîS X¬Y•äËÀžûªÂ:í¼qæ?˜ ³®¹À8k#•_ÌDîðZÅý˜ç:‹ÒÝ)}ff4Aîlþ*h)«n·ždÝä˜£Ž¬ÞgЍüÂתÞRsíÿdg‹#=xžÍß÷Ì“ÝÌÁ'ßÂÁF)‹¿É7ƒNö+é~öÐÅË>ûyZ‹ gÐΨ¿kóì¥z«’ìyý²|æPöTôm®ê3/傟íJ;h¯·jØ1¢@[•rð¥„;j¨mäµ³xÆJ=Þ#K¥º >´Ðÿ†i¿¦¡.æÐ´Þ‡—£ã—[ŒÄý2HŸðJ·'áª^g¾¬ãR˜%¹ØÜl ®§Ý°)­ë³_¤æº éÜââß ±¡Œ')0+þ1‘’Ù ¯GÌÕÞP‰U-–@?ãäéßó"¾[2îò†P×ТÑóH1”M+© Mæ±K›>;^6|z²@ˆµ¯ÔkÖÂçóÞÁ9 ôcŠU…KþFúûÈX}ï:Ò3–(5šã d Ç”@¡:ea»ÑÌ—ö#’¬ûüÑûïõÔÝ‹ZºÌ΃þ8wæËׄ JƒLJvê7£”ýŠ•½ßÿ…¾Ù­0ˆP•°Ÿ·9ŠgªÄŽ‘É4¢m[ËBOMGÒ]¿ܲNõ<3™†ž17ÓР—Ú´mTX®Ì„=UîÛMIÏ'ßO¹ž:ƱM³ÄøSjthlà!TŒ@ð²&L É]ÀEWõ9ÈWIÌ¥këKRØíÚº¬L uAG¸ƒÞ¦Aù-²iÀ*I§œ@ÿÚÍ"1ù€~äÀCTD?ÄÜã›\F†8¯,5øGÿº] ×)„ˆS•±«†Ê?FÄDö!fvn9²ËÿÃÉiü{yY¡·ÃöO}†e¦\$fF/(õ§x’±&ÇÝ‘§‹eç­…Ý£7[f¬g_ΨpõUµ¸9-µê~;¨ ógQâ]³}~®4"Sì*ç£Kàð›Ý—yaF!z¤6wµ®L‘ä÷˜^í¿Ë9ówQÚq} U'ßî¢Pp2‚ã!~nû˜ïJîÿ$Œó“®×ÿ,O¾Õz/km©³$xÄ(Ù,b‹ ¦Æœ›Ce.šKŒÐÂNs7º »\ á¢;…ËÀfÇ0°Ýo/#l6ÐN€ >ëa#ø‡<ïªÅSœ¤r úu Æû¢€b¼ÖQŠf‘«Åçž"”ƒ¢ Ï…q©«Ql¥à€ˆZ€·|h¬~á àÖêH§ûŽ^¯°}’ ®Çx×Rol,ZÇ¡ƒ1ã­'‡"Q Œ1¤¹„‹ y¾ò¢‘JœmƒeÉ[‚û¾]Šž-mU7«õí#æ2óz â,ÈUàÈ$HõY|a±$ž$xUé’1¦Æ8¢{¬Mñ9œüØN‹Bãý‘F¯šyë(`ÅXϹ”]Žðõ£ 0J¢ñžOÂnIÌ–œ@½}¬ªBc‹ðBˆŸÎÕL¼K$ægí5Ì9!”®Žû„аv"U°¿;Î^(«u‰? –³2­Eë ”ðƒÄµ ‡òZ†`†-CàÊůÁ¼p‰ºÄŒ¬­ÆëBÝçûJ¿!ž£PÀŸ=ŒÜ²ŒøP¨°ÓÚ­}ɱuÅö”]:xÊÿó5-l¸Ùo§nõ§…IñâËÝðÈ+ò_êc©Û H¿Æì}î5V?šaêÓøïô¯Þ1”û©°Ú=gï²dû¶ØŒ €Í>ú«8µšE%V^=]%̱Å3-º§ŽÚLÅ^É\lhú馬íŽæ–w»pä€T5Ž&ꤢv?i.~ü× šh¢"¥FœŠNæ¸Ú7# ’¤–;宎—‰Ûé®~”ˆ„@C؉¤DpäÿqÝM\!q!Å€wB9!?‹’»PdïlÀ~ˆ¼pòÓvsöŠâF‚0Ó¡@ÉF;cÂTú<`68¥Õ£0¡tíb~*¶ÛdáØ«)Ek¿¬+nJmýÔ‹FX¼*ßìv<ö¡ˆ¬Lgœ(P0‚2ÂŒ]Û!Ñ€}{uj1 š4„ÀZAp[©ÿA>½ürO…aXWÓ4Èõ=€.?Ú@‚óQŠ$ß 2åÁíÎÿ"ÍI‘mÀÜÅð?8ÀX·¼žó±“üš{†âR¨4 ãØøz3ëz›Í9^<]‘ªr€÷D€2d …§ŸEW£÷ŸQBŽ|[û-kRî±Ý+×wº1Èáz£þx´ ï7«†@ÁÉê:” æ×7ŸÖ( ¨—ñ}"'CI×u¦+ìß³´À´h0O„¼˜]AÝÏ;wÑ:ÂG7UWzؼõ(­Kw¾„úŠ’ïüC&E%Ý|\¯c«ùd$÷kéF”ì2E`ËÜšÕ¦"ß gÒy#ìÅ®”Ž<2d±^nWéç#¡²YGov¥]V(·ÝKñ€)øEdßuþéóç O_>Ä5z/ÚbmïÀ2]ÈÛ.’.ÇóÂvyíQÙyú7à››†Âoa$„$¨ZÝdÃÂHÏ[k4¤ÿÏdÔÚ ìƒ,¦Û>Û¬½‚ëˆÇÓ‘êagcÝOWC“mÞ^ÑÛ&?jàãll%~ šÖЈŒ÷G— H™ ¢vp€£ÑµÏ}ïdnJ¥‰ÁèUyÛ'ÈÕ…æxM Hä÷ທæ>Ëé´†‚$?­TºýØEãaÂ` [öÙððAsÀðÍ¢'ç'ÅO_¬¦q ÄÒÑ×»~8JÒ+wÁÒYÄ„Èù{>^G8É>ÍŸñò]¶©W./©Z€?.=%C5I5lžTx*Îuø€ÍЊ¶Ãnܳ߸ü9™nCÿ]¢"šAn¨:}Ä?˜nÏ9Å¡ÿZA3æýÉ„EùÍÕwYŒvS(jÐpȯ~ã6Îày³9yª3Ð`¦²Û•¢œi§¶\çŸTìÕ±X´Ñ‡Ò6XF†€ŽÈŽÛ6IŠÂ£³¢©ô8>¯‚©½#F¹ !"LRíRkË^Ò;zu8¸Žªg¢ž¦áˆ&¢ ¡ª‡õÀþvÊ{óP$ ˜»«¬Môöç~8÷nQÍT(§¶—º³ZºÜ·Až.*ÜpÓGI“E. K:Y gÌÕ€tkË»Ý1󢘆×ì_g8.¡ e™õ˜õGU΀ö„}Z†-(D“*‰ @à¾Ud3BÄhE÷I°¸[‰H¾2l‘+ ]ȉoJ+ðuSÈÒ-%dØüaµjcyŽI¹‚?᜚ˬ´ßð!ï—!÷>¾¿áÌ÷ ýå_97*Mç!QeXg¦ñmseË}îýʲµhá×dp^ç©ó2Ïç'XÔ$­ð¹Ûõèö0—;MϽç‘~ðr¢m§ ¦y«Óä㣹„GœoÝañ˜O\ ˜­²táø†¹# @¾œ¤ø_è#±‘¯ÐŒ…ŒsýÒ¡iŒ÷(AVÃi0²Î&Ã6Q+; ¹rìr™ßªÇ®Ã–¡F>¦#J¸lÆ7Ԝ⛴ûÁØÖD-|5ÊzùͼCà°ðßÁÜî³/eêÍâª2–”%]kào¦~ãUa¦bõ‰oOI4ÿjï}¶Ã”ü’ˆÜW*÷¸øŸM{UºD¨Ë­¥w÷Ë’±eS„=Ý×kh4@‡f¾ù3³iùK«]λ„H}¡¢Qðû³uVÃáÑ,|q¥Þ¹[TTfåÔêÆ[šfޝL!Ã0&gŒxNßklfÉÒO /j[€þÛ*ÙŒs{ÖŠSëž]›¼}|i8Ф}‘£ ëm\H—ʃWð8–ãÉ€Qe}]òZð\wj¦éwDÞœù+bÇå Üœ!˜„À.@æúxÈÙò9åMá£èG–¿fOP{Ÿ”A&– ×ÔU¶µ=Îì—¥„…)=céŸwÙ1üÚ8îØÛºðZþŽýyŒ3;DkŠÐK$ðü]ÛuöRE(€/!¦áIo ­?†ëJ]ŠL³\âôt¬A…|HLõÄÿ>šåa*Š|T–?ÖÒ ”‰=@ÿ-±Ú/ÒÃâÕfžKŒV[¼\2J¡QT'ODï!CÒëd@cÂ¹É ÿèiS5ø§Æø‹ë¹f„oäð°âNŠùÛkf؃v“ž|Ìõ(‘ÔêŸRxÅk¼²Y~íø¬¤0wº@»uD ù¤€9}kl´p|ÂÈR9ª91úæw†&áQêãÌ\õŠTçQ :‘!À~$¡¦òˆåX|ð ɼYe´Wµ!áv¥òµt !÷›e4_ý—T/¸n†=486Ï’¶%gŽG€­³Ð1d¡z|”+0²óä{[¡¢t•EôÖìé†DËS¥'£Oð‰ªÏúê‘pî ª½Xü€ fÙòÔûâ0ŒW‘¤”ª¥)*3„‡|—ùNߢœgê- Öh7R ¬c%ÇvæxJ^û¯ÕcJUÒ[5ŒôFNRT`|^|y/|ÞùôÁ% 3u×ÈÿW=ƒgøÂ.σ-[´Õ;° ‚*[‘6è4÷ë¤I„“šuŒcל*rlÛÓðik^žêùÚÀE·m6UÅvLd˜Ey"À‰WåAüe8‹ëÔ÷Ÿ‘0KÍ\qƒS‡Ÿ¸ö–tÖ¾™ùíXäõ0ÁŒ‹Ód=•…<át]…düßòì”,¾ÙC½!2Þs—©È&$£3ðú¬|ºé¶xªúÿ?Ò–ciÃfÊùìí A„Nÿ᯸,RYµ²Qä‘r'°äÕÐy$úhzë~H#ù4Ýè))zðÓ”˜“Œ¥(U* üHY÷*††Éw9±ÂÚ-d®{ÏQL¶4ÈÕBñ¯JÌõþmä¦V11 ž—˜ÁbÕo¢1ÁÙÃùû"€ÜAè€EmJ\ðy$5¿ÉT™& ;&BBRKåu ÔƒžÉä®Ó¢%±œˆ/í5ËÁÜì)%á4?ŒxtE½–[_~ñÇÀå¯c ÏÈ`L1ᤆAÑH·"Ó_‚vÖy¸Þð}®uäÿ™š—<î€1}•¾,‹÷©^â2™] m(c…~êBîXŸkÅïRWí/‚wçH*¼W@Ñ£^¿%Ý&Më¼’Âî‚Zöôý‹¥ž‰Mú·Œa«rÙd²¡¹>Êì'HÊÀ1‰hÀå»4¬w†€ÁìÁþqÿ}9:ÁZìgï¥EÿÈaÍ ç<Úìn$_·8u³_0µ. 6%;B± v¹ R ÉOuã¶ ÏÉ#¡´Rͯ;çK‘4=JsCjcŠ-mÕŒÿ÷­Š0Ját.¤‚ŽÊ,Zé=ªf¼X™Þ=;ý¬{AXSÒ’«$R Òa4^&Þw­ËaþÞi†(‘I-j+ÿ:ókÏ2¹üÊ?Ç5 a4:[¢,ø„Ñ£DW„FéøðÑ´ªÑñÃica%§¼Ì\°czü5y©êº‡þ3ÃCwzÝ0Ê,Ì`¾zò<_>™^:…Ò´öÜ‹«1Z²9þ$1Wjž¯Ìãº9|·©Û¹}­J†½êðMS+ÅoÒ .]c€ü—Oô±W–;•¡¥^v, ¤’¨Ã|Ö€+Œ!Í;é ê´Ö’^öì°lý0•ÊídkÞþ*´ª¼ù‰™a§U /b?ÜþP”ÕSñ>XI'ÈIÉËmháOeæ~õBŠÜ×,#¼ª£ÜÿZ\xÀX€”ŽÆ{äS¥}vŸ¾¼´Mû- ñ5KÈ£ÖE\€ž_dF:!È¡ü¸Ó䌙Z˜R¾AøÏ±ØØ7„ cƒÉgÃÂ{±N¶oÉb–ÝÐ(1Õ æ{`n·dÏÀ)³ýÑ}ÒÄnÚå2\žç07[üDmèéS7Âß PRí7laÐtaÑ7z+õÞCaUÚ@±ªÍQ¦5Ǥ¦U§=WÆÉÙÛýÀm¾Ï ô§ Eè#^¦–È^‚–z€ÇO«œižØÙFØ©pˆ±rgW ü°€ÈTc †ÓìIiJúéúØíüì{>0MzgÞ½ƒŸGìmÞƒû•è‹eˆÌv‚…¨Ä» ¶È«ùøG_‡„³]Å2ÊRNÖÞ ô;ò²+k6@*S`=Yìà%°K!ÿæXWs5üyÕ,ª›mcU þÝÍ­S´$œÏ_"1—ö0yñ‰ø`"1›ícæÂ½aož9#8~Z"FOeÜ÷.Ÿ5¦û†&\˜l¹2V÷krw{\ô>¿ç½64äT9hÇWY—É]û©¿g¿i¯7O݉³ÑñÃÖSšhËüÊߤ]»ª›X®!s‘86„¬„aŽõ}PóRÂÚiÏ+Ÿ.4Ü*Р29ÉH:€‰ËQ°M§Akè· .r)%p…eAgboZ²í„ãšs“ .æÊ¬Î÷èâ‡J¸ ÞàNàGú[ÁƒO˜$ æ‡`Â/²E»Y0`‰ôïvèLgm1Ž8gç ¢«6DRK† |ð!p)NÞ;¹‰êm[¤ÅóS6ªz' óÄ Ã ‚µMü×®JyMŒˆ"ë ø;`úütA§>ÐO–vÜÆÎàPq[,ò¯òÀèâ)•ºÔƒ¢øHµaVJTVOï§Ù’ýåƒ0It2«Eßݳ‰ KJP‹‹¡ÔÙQCX(Òù]œ7¾“­tºŽ¼‚GM•»J½Æ¼Pdk&c›K4â”j%qf°iýñaв8hµ©:»8K_¦W^•°¬‚»9å/ï ߤ õø\h9j¯BxBT2²™&;ÕL㬔IFŽÀ‰Œ¥Ì§Ý˜0åJ.ïÛ¤ôª/ˆ#2)¶7Kä{(Ò8Ü¿¬™’-9;#T²'7Ä} 3ݲseèULA_ý/¦÷QIzN#îœÖ–Tõñµ/³×ÒP½/¾6Œò´²f:N7ë—nŒÓ ÿj‚–D>â ‹5—‘Ö={,rà·æ¦*é\Þ•z¼ŒG™DnŒ¢ÞÉ]“δùëW“)míûqƒõ• GÉâ2ImùJ,ÂTÊ;+<ÒÃçÖÍý„‚æËS;Ο»:HÚ(_]aú^výËù´ü«¨âËCa‰È(p¬ ý7ÌMX8¯Vèåó>êüe¦âµ¶ âÞ¶*Œªr Ç«@;4Êâ—L}ôس½+Y€ÿ서¨k2Ã_üàƒ=Åךž™àºàgPâP(šYºü–,TK/ò84{«Å~¡cµ¡_…=B&[%´/µZþÿû @¨"¬ÆÀübó}٘ă°5Ù‡‰‹…PGX…&7¾f³?¡ógd‡g”`þ=²ˆzt=9Ö«!Þ®dô\z>ò=u(,;Póí•×òÚzlSßîÔì¶nÙùZn¥š&”%®d¯9#ë^Ô¨þ?Adž Ä…>9öñ»¤‡ÜVy•°Ï‹Ò¨%¹ª*ò‰œL' j;a“1™¿&$˜W8¿oR4E¤bmæÛ îý€Z®âq/.8SÈ Û ‰é/¦“›Z/!È5‡{ôç}å²’j’bˆô⨘žÉ£N‚á7ý—è¶ íg+Tÿ¾(Í|*!Õ–¥ŽF[>F¸dñœùoM zV@E[TÐÚ›þæMQÓã>³Ô¦}[ñÍÒ_BÇÕÅR©1YœCêo—Ù*ÙvçH“_€¦l&“®` 3ÏXªÊó^Éë.üÓ¡ÚŠ×#¶“/D 1‡dËBî9;)ž"Tï€EPÂG@M\Ÿ&êéÎH¡À=³!’¬œ¥ÚRM¨€.Ôê#éÉš°Cý»I/´(é:TvÆ|YÈC¥BÆÁ½hå0ÏÅÈl†ºÕ¯ïñ†Ìš²˜CÞ-Vûe…)¼öO,c—Uîkæ]xlma“7l@{Vý¯‡"Úú~‚}ÜnW˺ï½­à!r¦ û"û8,Q&§öäÞz}&EQÎà·(=’ànÞw‘ðÌ”ëy|Òþ4ÜY¯,E²\s¨©%ï”` s¼†Û~*YˆÏÌ®@8yp³ˆ¬%QX\[­×—ÆÍêuAE£:—MÜ<ZOH)ú¿î´«U³³Kô]¶À”‡±yÎÔiU»^Ú™ˆâ÷6¾1@õÛãsäØåZb&0â¢ûí‘í×ÕöÊG{I®XFLÆ!ÈtÔ3̪-Ö4S'€ðIНÑaíµí¸cÀ¥íéjuº`c‘µþ;˜Ö,´ß?ˆ˜·+º†í¤R6´kÉ1¸FülÚQÆj úU‹òœ+ÒÐÔ~£Z÷=Zí~þB»yœ=®½0H…’Æ«¨óÒÖ¢œ¶NÞæÁ²ägžÿ}ƒu Nþhds ®cIÂ$Âxƒ)[PA“JÉ8d0m§&úÁÔ«¸ù8~¤®©‰ÒßkÅeÒjê|åóI—‚ÐFÊÿDò¨â1 ½…¤š6íÚR©úðò"šZ8XSÃýßêzCvìêþ™ýkô4îL¾=¡f·K÷Ð|Ï¢+^1Ë™™-_š{qÆ$÷Žüÿ7®Pj*9LrÁ9hC3ºl a…àåÓŽp®ÇìÏßyÁÛª:5šÎ±ˆ’àðbXCŽâvT–>,G |ݸÐíé‹‹¿'>3*ñt|~w"ÑÓ¥%of|tÓ‡©áVÖh:0'Æ•^l?¼–ö3 §Ó!G“¼]\¹&â’“.™¢rdô˜xKUá:Mì^a¹‡œ3€Ð¾rH÷PªÿS]™Ë.ÍjB²a ¤7Á.$çåZ;%_@5ö¥U°¥.ýˆ,©ÊBËÊÚ""lb)'M“vlÇçoâ£Ê!^´tÉ6†UîDÇ罉Ǿ ¯~PäiŽ4|Ò‘* ç‘2|)UG"&Œ;Û‹zz‹%Š–Z=yï?ìœÊ{ËÆy´^ádçößæþt/XÓ!ÿ™ì@¨¬ÍÃ÷ƒ[»®ªp^Ô¥61ä÷ˆ<2lu¾¨;œIFÈixeðè«äDuŸÓðaHéͤ¡©Õ…Zó¸™ ÆM»3V\ÂõefEˆž ÑYì°÷ ’½-QìTzë}§­†Ft+“ìNùÍâï*ªyIC­· ¯N9ìØZFÁ@˜~Ö¨vì&mª– $82Q  ]+ño¢Ãl§ÿ´—øO6Â5]—Îf+G*ØòeÛ¹ Ú9'š€ˆ…' 6wyßWD¿gKrV§Y¦T°:´¢™ð±»ÓÏfÛ$*ËÅ5dÁÿ—;µeü³¿$Á"ÀÖ9iÙze6èÍ”³ê2 ×*û¯Þîe' b¹ÍèÂûP¡>KK-V'›€rž¦5|4%D9|Û¬G½}tÏ>¼Ø—gHr¢„‰gëþNJØG¾¼¾¥ðãSç å&is"Ђ¤1~¨biì¬Eû·pÕ¶sÓä@7 ¬¦§%im¸]½¨•QÔÜÛH@4Oå\#YñÒ"Ó3zio™à¡flÛ˜ç±çˆÉm…ïó²i+›õP‰}½ïï¼Ä‹X´NpœÄzz‰:ÝúɲXNÖRÖA6ŠL8×™è¿ ”}ŠZ¸O~¦ël ˜ôáDÉ|’´Ò.AEMwäÕ‡Ù*ÖÆ¾/½tüêÿ> rRŠxR*æÁ£¡æ:ÐW±"J><m5g¢Á]'3>gu6¤ƒHúÒ|¤£ñ›wª {“t2gn2¾E_4¾6 ''ùî^­pæçjõª.¯nZv1nزÔO~Q¢k8P™Ú¢sRiãʵ‘Žc”öSÀ\ŠOþÿ7ð¶7J²¸Âz2­« Mâ÷®'é“Ïû®ÔÍP ½€B±…ÄóôÄw˳Ó{”àÝÓ„ÂÆyüéás³ØÝæO‚CG]Ö¨15q´AkK·–(løÉBð„q©L&VU”F&¨ßOË¥[×P… §¯››zŒÄÌ/´ÔsŠmoTãX½›¸ß™”ÜÓêÎz o×]èsuNœ<æ~«¤.ÀŽÝF%ÿk-……â4ü xϽ !‰’b%¯|b‘êÓfK ÎS+× ¬ ÆfK^j“º‹›šŠâ\Øù3ÓCIŠ/Ôìñšy·Tã2Pâ£6çõïT}lþ«¸/ßÕ ödæQKçKHg«ˆ¢i»õ(ŠÿâŒN—彺„@¢ô…5ë¶£#8 ªçœÑ®G’xÜ{f™šÉˆT­”¿§OÈ#(O{ÇpJWuâÝþ®®‚ï»SíŠÎW Ñ 9àB¬š ±4Þ?@z½:Ò³(oE­¥$ztHj T" !k9ÅÃ’ô4ˆ.`‰E7Ó¸ÝÊm(^ßΣn¸d.ûd‡« AkyY²º’’Çס›Ëÿ|ѦÕOy˜¬Ëž3pÝÉÏȥų¤ÌçKá¸Þ…Ô‚tÖo«üú©lÕ¥QovXX 7'PÏUò`*!ž€R€Ne‰ðZÏò‚Ý·ðÚ1»·ÂA¬™(GïÇÒuÛn¢hEÚÃû)@¸¥Œò’ žOT¡åÄŒžåQsu&¼;“å•á"®7ˆì$ã°;^ò¨Y”Lþ…H8ä¡OQò|67®êv4ÉXj(4ã2NÙõ{mýöß[ÛÓ¥ÙÈëÿsÎ#5þ³`fú²6à›'°ë!÷"`É„x¿hrдÆiÎ!s5f^Í\ˆ½Ôºì@’‹üBÀÜ¡n)<(ÃÞªy2g J|‹±ˆ)Õ£,.µ„œÓ'5mìCí©4¢‘ *ß!ôycb{íp| ©_Þ‡¨Ô-™)þg@¸ã,᳂°I9:‡Ë†3~«¢äܺ±ÃO8BË1å1]•ñúlŽû&ÓBêC§È¨C™Ø#aìÑm;½ùªË}t¢Ïž.gÐwÑsäý7ýQjù9Id倶m9?Öq r€S6wP˜œƒ4Ü퉕´Š•Šp—%¦8ï3³EÆî }NçâÊø²x)̨qöó÷ÿ¬Ü¯L/‘O`²ëÄÁ kÅ«×îÞK™KÈ9î7>©æÄ|én>{­ý]¦³Ð“Àè‹C3Ëh½oT¥ÍØÆ÷Ü­±ˆÚô¡)‰D±§ìõo+ÿáe#d“íô:rÊP£yÀM˜È1v&§*È»8_ë…bûÑ›­Oõ,Áû’G°ÀµÛ¿TÉÍËwþŸ0«ÒŠ›ÈÍÉ¿ðذK 6èê#D©19µHn2bÚ1´>¾—Ì ÖÎ7ÞŽ'£«Ñ=_«3ZÀ˜JnðâÝQzöH†ã+¡/ÏÆá‹ìòr7ùعº¼¼Ü}*4PVºÉà>ÔÖgàwu{¢?*ßþ,òÜQK8s]úy‡[•#•cIoÝn/@B}$ÊœÙJ;!p>öš›"I)¼nè#eDH,ö¾J]P†®ŒñVõâ<æ¥v€|ç Ùè9ލ¹”‚$+ž1óŒ)àêöÝÓ.¿¾·_Ƥ‘Hºô]ºBè ï]~¸+J-9öÆ5ÒŠ á| ?‹Foª¡ìR†ôl®Ý~*¶˜‰jrˆŒ¥t¶³pÓŠÿYÝKó·ï_ý4ÆÃÞ¸¾ªcB² ®»|)Yàܳ£*e«ÐÎ- T6Fr} ¨"EqIæ3±”/ZUh[«b€¥Š+µqh³“YsM2ÔPb>€þ „2©ÙñÆg¬¼’‹™“ –?i€O©·Q¦¦$PÁæíW[|ØÑcç‘Îõá#ž€=Å’ kí „²¯b¤n!0"RK )úAB—ֹ,0–ž™«6žd·Šj÷<«&ÎóLV¦@4«ÊˆÉ7œ½d­*|¦¦>Í!K}\ðFí©›ð*X9¯žÛtÞ½ ¥rúÏ£¿åû¯º&ÿZ¡Püõ.ï…¥$dmÉ|ßI¥D3ÀàAã`¢v H7cô?‚¬”X”ÃTóa³yχà‚˜‡ Ocì6½Žê>wo"x²«Š8¥¢‹ùPÍb?¿1µÕX"LuDÃ$™2‡ªA®¥ŸLuæ£áé‚‚ öeÔâ¿‹™øÃi­Ä£§3E+ÀZ¢ec„M IN ~½=@fÌÊÏ|)L®éHX‘ÈÕç0nܓ̄Jß_Ș`ºŒÏü  à‹bÇüäÌÉƒÊÆ¸ÎË4RË©/{"ÀrôÄηÔç!6¶äpe \ÎÖ\Ý*uÆ€¶ø7gÆ„ æ(½} T¬ò°-›<íw«& ÿé„}Ú*5àY“ª›é»IcÓ Ó¦¸ª‡×Uýîa¶‚Ìhþ¯Îƒìø)v¢Zdk ú€JPæE‘'bÿpyv¿3±/së@A`;Ý5øì( ŒtŽ¿âs³üþ"‡nw}¿Ð³Ì“ÁòUjꥱ-íSê€÷­éM%‹“²Õ*‚_æ?¼Iø «¨lËÿ4ýöyYÖÖÒRŽúЮü¶ÙTM Êò*¶¶,‡êVÑ‚Wd©ÓÇnÓ‡—±#‘±Í™ÀÒ3¸õŠDEÃ4Ìç—pÏJoå‚Ñ;|ÆÜ9ÅéÂã^d(óVŽÙ¸æah”àž•¹ïåu$Ûæ_úúîØ3®úùMÉUßÕ°ˆ§þónÑ”ˆ–ž¿Mît¦5"å:…§u» þ£2@—Çh6/«"E#Q¿%ßû¸ÜÇÆË?¹â¾Yv!5àbBV9ûk`Mz\Ämˆ¯ŸŒ‚ž|ü‹«J ··äb"âaO7&bÍÆŸVRÙgTƒ´®:LöJ­É»ÅÓ½¤Pù¡^OuÛÒ½<û;§¸>6Ô1ôóó;{¾àìWxÚ²õÕþ~ÇÒ Æv¡·€¾¶±ý¤˜ËCZÅŒ€XµgÖa¥è‰ð¢0ƒçšâÀ¯þwár½#í|P0¹Þ¨ÎÂÃL[×ê‰U\’ë„–Ÿê•î\ž|m^ !•jHIìV3Š×†É Ñ;±™q!c3噥ÒW8ÑÇ Ê†AJ†*Èä§ÍµSKÏ­nèiw’ŽÏ„ %†nO‰ïöâ´Sèë&ƒèbÍ@àÖN #<Íù{Öá¤ò.G˜ª¸¶}ª©>Nà˜©KX(~mk˜§¬mtÌù\Ì^c\a¨µ§UPÇ[#‰ÍÐOÙì¯ÆL‹¦$U,ãÉ iÅ¡6üœlmeç ßË„¦>%ÿ²{C2„A^IU&ª¦EžÜl!Öÿ1 ÆÐ%û‚qeýÛ»§¹fœB¾ùG-øˆT2ÙHÉDÜÍ—ßYíÙ’AnÅlf'ÅÌCƒØB©§æìÕÐá@Ó5¨Kì¤_Z{5Q·2Ы§ÉNþæ"%ÑÕØf»M–ßKrú•@tsªÕdgM4*¦ÕWh0zCŸ\³͹¿1ƒ­Dº£_(ú’˜±‰ÐÒZp =zþºÔ³AˆŒ‘»ôõñ¤LÍ´R»jòdÈ¿Š§a¾©³ébBÓÀšcgìT çÿ5½ªD¿6Ö€ž·…˜ãM:g8®% æü­LT8&Žæò–.ݧ²YùYs³r˜ýjóVô½·ë~O$â¡WÑöiwöÖÕö©½“¿õ2×µ–·ù)ª))ôƒ£ gžˆ‚bÍÌA”"F6kuUzÊ6%|—˜q³(rß]PÕ…{ÌÚR.²ƒÓ‚¾»Óß{Õg-¾U¹µÛ ~ìR¼›ž£™o§r]î´úDÍœx>×/Tv€ž8Kª[R}ÉË î<òg%S¾¹ë„^wáU,¹wWçpµ~”ïP٧ꈊÒ{»ðśФÍtЫ¥“zòN ;£¬º>΃ÈxV$­jCåª[XÆûñÖq+LÔ*—¬åq€×µ4B©0‚JcøZœ¿6>gFÈC¦ao~DÄè¿^’ƒ`hàˆ»Níhž7œDµGeƒhœ5¸Mípî·§Ú(c[€¤­TcÙæÉŽçb •±U0ÐÝ‹iÉ[Áé'³UÀ»œÀï·¬ÂST6ê÷Cñ9 È`V]‘Ì൭pýÉ&•ýŽ‘…oóuª,± À}ƒEù/LåYRèšsnLüRg ûF£³?K  »}åÕ¾œ«úô;Û(9pN Q—=^päŠàÇ”q¸dp€¯„«2ÍÐ}EК†hÿZOlT«›kì÷¨‹Ú{áþ¡OBÄ-`ì!j@ÀmP…›Æß4i¢õ w>›sk©_•Šœ¢|·EÄu5X–ö¯b¡g¦Jäð½Á›A…}çøµqÅáF "ÊïdY.é:‚ëåð€øªY}¨pŽæl¹p¤ßpŒ+ôºuƒ¼ôCç¹Uî¡’Qd÷¦Zˆ µÄm§… ˜)ÿ éˆ9¸ºùiRãøÀ£˜ˆ?jAˆ>U>ô±ÏÄäã Óë(o\uK—öÊOiÍž±1§Î\E‹èôÖ¡N4¢ä|­]$Ct9 ÿ¶ ¡ÍtÖuÅo€=yb\¬Rغ˜ªÅË’ä¯*¤íÖ^u `¡×ÆÔSS*Ï­]Ê}>{ƒµV¹0¥Q³Çiwh ùA_4Á³^JP5^´(åÌ{ÿê°®4o¢Å´öjf½ÛQÃ|6û·™H!غL…í¼5g©B‚©ÂÚ‚bvtÔÍÌ•†™Åë4c Ç*ôÄ‹Ü%Ù lÀŒy®¬aÃn˜–À¼„ÿü¦*¹ˆlƒ1[ 3iŸÂ覥2 øQ…´3¸“Î0Ki”¹ÂË2%O²•°îb õt¢DÃãóÒÃÄVÉxM…ƒâh£WýãYðÓœßn¬ÛÓ·Û¦<òE‘u]z‘•‡²/Ç cL”Š2`.xD£ïjöKIð)Ç“>Bå÷ì,ô;wpƒ]sv$˜ó?Sê:î\Q›Xž¯ù G¼Î…ßÇèSäèc£cÕïϹñeâd|·™Á–íAÝTö¦jþßÛk^Á¯©ª “[Tû78ñ¢wCC=×í@Þ`$ÕÛw “f}Ë´CñA? 1„ ÃsîRË—²=w5Î×±"”Ç£?85 ¨lyI ]áñË8ákñ‘ôÚÝæH¸ÌÀÂWé”üöOý±q<ð«}wLSq²©šíÿ²ô/¹õ•ô €6g2ïªã“žLOýŽÆa^t—çÒ— éû²ï”º52ÑGàwáïdO[ª“Ê̬”XÖºÎAåñ?ôöæœwãv4ª7ªˆ:ûÏE9|«/7wá|a#‡Aùš×{û“üsy.E Ï ,¬¥…À|uvQõ×Ïr ÏŠ§ OÙ ´:dÜÊC”5#è²Ab—áF9þÍ )SO;è[ÍQwGî:s)¹öþnàÉ…4ºFe-_Œ®/È|Áþ˜FŠH@ïÿ¤ás` Z™‘xËÈ'ŒupMé‘.>Œ¶ÛE-ó,CPפæ×rØ9ŽMùæ6Ƚ2ZJ¥H·@Ó ¬ÏI[)†5¿;‚²/네!2°eBm¨êaú‹‹ØârÌM7¯~9@JȲU¶ø’Œw‚‚JŠß„™sH72Ý\0ÍÿD[… ½´!t§³Vdò²×à'pÇ´$E‡Ì¾•þ`šÏÿ¿ ±ÁDã%UM켞MOqÁб6ôN/¥à}fyQö«?^<@KÂ%Z°ª’Ý_¢Æ µÀµ˜ nÀÔÁ0‡ˆ]ˆ´¾¼d¶D{r1Y»'E>²Q·ñXxñt‰7Í!¨C6ë0¿þöv–…vjÎU>ö T*±ç=n¶ƒM4Þ„ ^áø¨&XãÉ;ÅÛÜáÀ 3‘ ‹Òl 0¿… œÚuòõ¯þQŸÔuh¯;Ø lŠˆ Ë—CPß½ìµu€|ÑÇÂø[ãò=.øí4 DÆ9dî¯VŸw6Ï Œ±V<åRUwtilÖ>ÏÁØßKƒÒ#kåS1: ÑUO: ßiÖ7™§Ö­!éòÁ¶ôMªT'»/‘ÃõEœ~ŸºA«Rîáb¦IïÎpr)XxÙ䥗(þ) V÷°Yv_Ù½@¥o¤¤¶†ËPssþû½†6ÆS©#ÐùkÊ‹×Øo…R 7ê¼÷|‘Ó㥧ôË–|ä‰ßD7xÉÑô”‘+ˆª†€Ñ×]³~fOùðË´UÆUðÌkQj ˆGâô7ïkrF“ëR¥Z* ^Ö–P2H³ä·I8y¿“í&:ÝUœ‡9 2»ö»B÷-$QV\o³õGêº1BïØe3OÏùÕO!Ã20•Qvîc¬Íh‡ïñK3$&‚w™Í̃/zžI  W/Aœžè»Sž(Faè’µÞC,'f€È›18H[{¸¦ùðm7šÌìÂ:ã9âŠ>Ýùî‹Êì&ð¡ÙW‚šî¼ä)e¼Ü¥tZ´ã>èî-c3Øò5íS}˜Œ#ƒá1}¯j®À#¯»§Í‹ƒ¶ë*n5½¹Åcm!PôÖ—ê?¥]$©ÀKýg¬I©lîb©˜ˆ¢ç;¦0I÷AãGÓY22ͰP¹x<­áñƒhæ}`'k<âNŠðÐW9KÔYG£[‹)MèUq/P?—§õgh´þ„Pƒó5®õ옕­>ñut.»ìø8Fr(óÎÒ:ª%)ÿtR¼‹ ‚ŠÚOVÙ›ù@\,oªjh¬VËË;“I`› ;”¹A¢¡8ª“êy}s8¿ŸÂÅ••€Õ“gžªäAž\€™(×6~¥½nEêåe '@‹W÷“¼©¤è÷ŸðÈr1]ö Ó¥?Àpfªg*+Ía!øÐ‘=Â¥äû¿šiˆ¾5ha' `uö_Õ@È­ ÈGn=OÚ)—û¨PîÆ%'É«²;Þq³e _`Mk6öw;ùؘº©[·” ë\_€”!®u²[ò•ÐJãQÖÉšVZÚè$~—ÚâBÁf ¾ˆ·é^¨?&je£ð»[»)ÖõSñAëæŠ3L†­s¶·1üR#ä¼Ý?¦¢pEy©b‰»U}²q“XíUÉEš~{0¸³¤ÐH{¾·¿Â†¦=ã‘ÄE»/DYÜnêy «Ë¼d¸8ÛÌd†;X´7K—D’a4 µ"[KˆkwîÝM…“D ±húyðÞ-£§)Ū#ÏùݾfM¡=0!¢V3Ku}=½q ñŸÏLþ• H®Ì}—!3D’qG£G±Quäs[Û æOn²=Åì›§Û'Øe½#ñQ‹¢Ã7 ={€%ðsb½:›Cï,rL‚wh,UÄ*Ã3Ç& Ú#Ø?è22PŸÑ-W¡ Å-ƒ½A•µªki¤óZúû¼ß$/åÜ^¯eD÷Át9þ@"ŸŠÆ<+¯§qÕÝiL´ÿUÄ¿Ë[ˆŽÁzZò5)©Ë?’.jdièàtVµ½^ßùJ7x7~7\'Û×ÃËô‹Úâþš¨9qaûÍ–Œƒè‹ƒHYEu¯Ågœ|aö\¤IÖÂáTàÏf+ÕD_5뛂à”%(; ÁWt(•äÌóAA¤/0H–íQŽr'§–J)€~ÛÙq¢®‚3‰?<õ‚À@W¼j©*íð¼2³Îi¡‚籂Hq¯Ð²DÜ Mç:‚LÚõšd!Lnºˆ£Aúi 6"K¹pC76³Üγ‡œ½bÙNçÜ/¿³Õ2bX9&%òÂ)à…ñ ­¦aÓ2u4 7ŸèŠÜñµYx!hkºp7¼UO×óf‰òr< ’XöŸÝj!°cz‹Zô ´Ž­ÐUÊO´ôœõŽö!ÀlIk8{г¼(M#±G¯14¤Ø ´µ;@КÍ—UaéæûV5r²˜4'"(ŸW>Ôc‚ô­’~jC²j}Aâ–G^yU¶²ãÝ+ä”üÄq°^ïR$ýކ_TžLd…c‘o•p”2ØÊ6Ÿ^=hD>S6Ñ_#¶Û;OªPuß²sÓ¦‰7X#õ·ebS³¿{´9"ÕCÈÖÁ±2à O(aÞð à9?ÍâzwÓ­-l¶ O2/fá ´Þ,Š8OHt2ïÅéØû­QÎpw?Nda2'a,­ïy™o¨÷ûì­àç‘ß Ÿ|aTSe¥ãžs‚~Àao¹uå©aú¼rL»fY×ÔwmŸù UHË瀩=“ì5ÿ†oliHBo£èÒ6Zk‹gLüZIБŠ<«ÅŸŒ`k(Û©æ–¤Eãtœ”…¯NÖÑ[ãâ¯KzSmþÐ3­½ÆŠèeQÞ©îD Íy¼6À®”,;?ò”ädv#H^€)“ûˆ?ƒ®%¶wB›,m»ØRß7’m~£1ž²%¹”Xx¢ñpKˆÆÒnk›[7R.8Çò¤fÖ”Fõ*×q3è.:t÷±_F ÿfõ#¶Rº¦„|ëETAbmeë9s.8rÜœoÜŠ-Ûü=p#Ænø@ÖE 7AóåÔ¥Õk¤ç m›<7g®Ñrõà —(.!ªaÌœlxóg=%[þྑ…ýûqp¬‘3I¹¥—"TÔ:u)*º‘‰÷ŒQƒwy Õ}´ÿ§/…†¬Øîéš_@'´v±V¬²×Ârä¯?ëÐÆÙF-hªˆTÉÓ€fíà?Q´'À‡Ù†ÄþÀ»wáG¢iŽLа,3‡J 8LÞ-þ‹°aÛ…ᯮ¦q`¬:K6N(™.£4—Á´ÖØäžÆÎÛx5 üKÓ^ñÀ6,sV X1$‘ûÐxfÑUö&n„÷)Ž_eðdiN<žê—˜ŸOð7® ;x ãQ vÇF¿Û^°Í§k|+Æcf¦r8‰=”§[hp{ÉMåü\$Õk’ª"Ì™±”!‡¾LgB¼Bžm7þ OT,Ä %aÞ øKöÄŠ|¢žñéüòVE“Ú ,®î“pƼY-ó¼ý_fŠ|ª¿÷.xÁF@ÆK„uZýåÈy$+Wðfˆùn½Ø/¬­+TŒ:ª7a­2N"±n$Aipäf:¼¤p“1¼s'ŠñM_$'éûAGH¨’©|—Ëû¡Fì“q4´¾R,ò*]]æ´EÏm­ô(MqåKÛÛ7áô.Xèª55kñsçn ¢4õ3èòZ3í úhoè (}pbVGwùÉx/é£"ýAå¶¼9ävÂÕ½Aæa…éž3vÀO¸ÍÀ¾A¿y½M ˜<ûÀy1 ¤Å·™ð›Ž¢d—Ñ¢$ÍâÖD6i¬.¡-¶Í‹;ì}»§Egø•/Œâ°I€¦azã¿E5?°O1ýså}!‘W0íH#ükB·ÛÎ&ÆÚ㜩¡Lh!õ7m¥jŸßt®½wÈÊŽ©·Û³ ¦€@%u[.’:´Ä”JÇ»H|–±4c¡s<¸0¾ÊÅL€ªNEF}“ÖV’â„”A‰Ç-|Æ ±ú…-²]×)MýïüÈÏ2rˆTiçáöÄWú÷­™t» ‚[­Ðîá—ï˜6wˆÂÍÍ^Çÿ“\…WÅSð§Œ6øÀmH°º`Ð¥5¥= )Ѷ«¶—ýZÑÉgGË›¾æŠÂ¢J*’Qÿ²›U·þŽ·šœð­Ûñ¥ªE* ,Oé(ª}·P>—˜øßrñå†kµÓ€Ðj8spé¥e–åÓ„jªêH¢‡4HaòŒ½mqÍ˜Ó dÙ=úH%,Ó7Śѣ4‘S’“&L 7¾ÜÝNNk‹¸p&Ö<@ÛdWuf^ÑÖ‘A$¼gM¢[ ¢·Y½I3ì=vئ£lŽÝŠÙ¢†[nG'È9#ü µxÛÍRÞÊO꿜˜òŸ±ëjcC8 -mhÀ:Ä]5Ç)Q÷4-÷Œ‰lHÔ«óN–ùÉT“BLƒl#ÖºùWTöå]Ííiþ¡}‹u1F<á=žO„ýü¡qŸó?'“ÛÕ¯…ëÙNÔ8ZÐ=b9€a´ßµlŽ,2þ£pám©ª§hF *pÙ%Åê“ GL(a:t²ðNhm¬ÐŽŸàI=-ÚY×ELÝ$©ëo´CE|÷h‘Zp?|WÕÇ/$¾¦/N)¢ 8fí`<5 †OƒÂ¶,[¸ñ…á%›×eDÜŽ\„nŠ]nºMŸ`ðÔÐï,jaƒø`v®‘åôL™µçÁ¬/ûzRßPætmó`[©Z&M‹ÅvÝÒxÞBvÀN.Ô_áU/ Ep—Ümé¬Ñ’)Û¤•íCh#ýCžzÊÄ”—g±®²< ÃÏÚ^ Ê%Í“è½èÀ×#ùÎ #`:kCÒ“—‹#0—GÉ¡}Pÿ0‚¸pb€}jÉàS=äZ¸£D,"u•o‰J7;}<€Š“YõN€íJµ‰\zöN)aÀ%ß©Ëï‚’$VÃϸ´œ‰ºZ à¼æ¢"Ÿ¼_P67µ{6Y*YŠš«ÑÁ÷’zâ »áö_ý1î æi~(FÈmBÙÀ§qÞå;x~R,ùJrz¹¨ ‘í€â>:oyþÁïEx‚YúÚ•§#ç¹»N/óÇ์ho‹¾<(æšš«2Xõ%Úœ;|9¶0ýž‰±ª)þ•wUXÎh桬µ K}¦ÝíÙÑA!(Ü¡Lp=n'Oð'/Ìûb©q}o¤ámñŒ.U ±Û××#‡+äK­|Ô½~Ô8i}u }m…I„²-}Ym¦å8¢C63 5Æšº\ð*¿9!àFl°~œrŒËØ,G²¸k|’Ö*)ÎhkoÄ 3´ƒâ[ÌâåIr5*N>ªGø~0^ª×33+´€‹ib"´Vȕʾ™Úºo¹â³‰$`ÄàX+ ñFU$(×~v²Ï{¢@§ƒaO…wS2RnJ$-¨N ‹û§ e–ÐÌÑ÷£ìZ@£6 ¾©7ýn‰Yì'À2È, á©Å®3 Ú#xãG´'¼0.Ö9‡E‚ÆrJËùíI q[1hŠfê©’ÐÇAìïgz˜Kw{œ —AÕú‹ýj ]»ø#“ƒ xðy?§œ¤9Ë ó¢ÐW W\‡M×Tåî”Ç=L4ã–rnÑŽñ{_–Û۵£Z§ë8÷+»]ÆVàXôÌñÛ½¹hŒÿb²¬/{XD‰§¸´î]º§°ö%#e,²MØ[6!_¥5ÿ¦o«NÁ±ð\¯iÏ¥” <쉜ø„oVúÍÓ §É‚ò$lm|˜lôÕSœÓˆNe΋% 6Ò]å––É·ÿ¢'ÁnH¯/îaÝ7®Ÿ«ëÉi˜ûWMAW]Ù• ëië’Ü’0fž@§Tâ±ñŠºUX ‰•í~q9AMÔOâÊ5«úã}—DϽíhÖ÷Bå[0WMöáëk‘7N'Õ·Øôó}îb"äo݇ª>܇z6czU*¾ÞØuÛ}G](=º¢ ±oè„xhOï‚âµôÂ02t¶´ƒ°œ4ëíDD Oš v¿ä.‘xKþ|þ¦ÿ\DÓ×/ N|á®à¾NÏ•LM•;'KÃLV…œdÆÎÇ(³ªçþ8<˜z`Qñ×W\ã˜ñaÏ_â:Ÿ–ùÚdE“mý‰–A«ãRpïöµ‡¼º(˜y‘«#°s4 r‘ß0û_‹€µR–Ó¥ßåy¯?Ù ¦}>";Éc ÜN«íYA ŸP+mù ,æƒãt²W®~Î:ÛŒ0ÿ`~­|V«å@Ÿ€ÈÆnåàh¼”Wù„zý*ÒT²¿Ési³÷DŒË»^·ˆš ‹ ©öó›•q•˜ŒWƒü ÏD©y@ãÃ4iá6eÝ{Q¹ÇŸ…å¹õpxå×#åËžHþÿ•ì.Fä¸ìåX—IÄMzÔÈÐJ—àç–ÅMþÚœ¤m×—üÈ™Žó«´x…Q3äAEŒß‹¨úN+ò,ª>`¯óÀŽz‚ºûÅŽã†%N:®ÿtÎ4-´"… —ªÆ~˜ÙR$Œw¸µ…ÞSw¨) ñ˜_;Œå‡/a>™ç(¦±ÔãÍÓ®Û"uÐ 4=ñXþF¯nuGšì¤hyêq7ÜmØ»žeÉ(Dpy™fÒxoÊJIµsžft+”ÄΨx<ä.OiL=ëS»T¤÷ ÚÍ$ [ F»sk-*T×ø¢bmãÕpxJ:’Ò\ pôcd8¬uÖ>ø¹ÍZZÒøèxŸ]> ëp1V(ò)PA[a—ÐÓ°¦Kd"4™­F¦H¶Ë[÷eWÐGëŠ7‚`*¹OúÞjhâQôj®9ŠÞŤòEàË¥{îï×v`«­rèî£ÚgS°Ðˆgà/}ô=¶Ú¤¸ÔÏ;ü[ª`>åx¡ÑE(îú€Þ J‹‚a«mþ  vÖÍcìçx‘Wò'¯þû)À„Ë-;]Wb§KÚ¹GCÏ”öÀÀ \­‚<­Í5ék'“ÚPŽZ–æõÞ2`I<ØÝ6|˜¢hYŠæè+ïfý«] ùö¬·÷Iojnß;’pÃØQé™L[7³ÖÏ+À~oÃ^ Tª{zöˆëª̇Ô×ákH°¹›õ^+“ Gxn $¯b:¡D³F3_Ì/ùÜÔ¿¢Ý½ç•Õ¼B}lz¦à1¿;Ëȹ ¦¤–}"4ûJÔôÎ¥3ÿálþ—ÛßÉ»eÕ„(ðŸtín~€H– °eqÎÍaHâ¶"¡6 < \ß.*ÆÅ²8 ¢8´ ˜71lÈ r™ Zc‰d…‰dxö^Ê®RÄ$Dñ3rÂx@’•Ú¬Åã1¤.×N#3 ë(Ýø4˜v ÿÜ]©åî=Ö˜Kö’à°´àˆ@g‚塚_ã.„ ‚lKc_²BŸ/Þ¯wmÆ|þ:T0|)&-g º¿}©?È£Ðb×\‚O¢êŒÜå_Xúw þP«×2¬E£A©3¿ÖÞÒÙ±ÕYw2ôÅ%oii诠®ë޲ÓÏ÷¡ö¤ÃÐîâ’Ð`½Ò€p!q¥"JºqQy½ iLpíÕ=ì”ʵ­[N^ \Ê7.Unè¤ òS¯éŸ£‰Â6…4D®™¶â-ç™øtŠ´•äšÆýzç"3¤ùA‚TÉÇÏO’Ëε!Ãg\Á¹Xïƒ\ÛŒ“U×þJ¦IsRÖXü3@?iOèU•„ÖƒTfüGzª¿ÖÍÓ%_­ä{©R{î‡òµyÃ~}­6¿“/¶P `²²GlTËD?5úÑÂØ•ã û²ˆØÁrÄ‚5$KPž Áâè#ÃúӋ잘J&$’¸h×*½QñÁ²²N3äÅ•‰+ÎÊþ¡Àq–Xiž‹nEcŸK,©”“ÊÞ¶&ÚU£ô ·.àãù!²£ÿ»áÆ‹òÌ õÕÚQ¶¼RàÝ ·ç»µy[]›2ìtVƒÞ´ŒŒÌWõ³Ï}%ˆo÷UÄhš"`!g—`³ÌÎ>ìÕÚ‘c2šÉÕ$—i\:c³õ[ûbæÙÒ>ºhLhýz$ ƒ¨·›Ì`ÙÀq+Æâ¯ß*gο+w-YµX4K~œ(ÿýÒ¡ƒ¤ÝªÌ}ÁcãdzC<¤‹}z;Qn[Oë>k‹µª¡iéV‡RUçîHæøóªñvÃ`ÌXÒU¼›ö ŽäõÁ7ÉÛnDánjÊQÔ q ¨u/˜>"iuYd‡ãÌÚ˜û:ÏÅø£:Àra¿¦˜ëιY ET8[˜`kÎuèlîÀj@cmbŸ:ÃV `© eŒö WyÁÔ#q¶¬ÞÌ&¯v7‡¶= Ö-üíÇ V•û¼‹#•%/¢p)¦§&è~úŸ6Œ÷/ß\[bWüh[ ut޶*ÕÀ­Ínæ£]”-AÜZ „ÝxÞ ôf’-’[¥E ½ÿ½nÃ_·p ŒeJÊCu»U€'Ò®òç!Zýåó^VÉk¹$Ýi”ƪ&jþI¤@T>Û08Êý."Þ"ß´òiûÀ¯ÂüÑë®.ÏÝ=–ÖÍmH13‚ÅËC-ûÚ ZSÛþ0k´gR l>WÖ. ±='˜#MëëÙ1cBí=•q¼[çB“xºO\tåàZUÄbUÖ\†§|JUö!Mæ‚›Á‹.$%6h”*Ž7Dô¶w;ß1ûæ—6áw"ûLLîÖÊ´¯'ö™GM nK…°-N–“qñ’[·!2rJ,ŸBÁEÜÿÄÕÒ?XâéEp“;‚SœíþYÌ5T€OºjɶÓúËÊF§v2LxhÄ:0÷vàÌꆭ£`Ú3Žõ9ºâ&9[o¥¡æ$© \Y½55¹§¢ ~K…õFª;ùšê]¶†Šg•¤Èg™þ¥ýzñ÷ÁaŸÑ†ùU’¦mkD#¦iÏ;þ¿p䕜lûQi¤p[jÊUùX<¤òÄ¢³›®™|‘>røƒ7@gö¼²Ÿpb&Qø J#â õû¥È¢û2«—'â<Ú×îº6½î·ý°+ª±E©u‘ó³f[6”'&+þV«fmš-– €q¦»\ÌC ¨zk½Ž½]8§F%$´vš ©?2¯5}<­?²T¼?ëÓ”Ùk”¡.ò—mô~ÂUQ]>ö´,l49_.®ü2>ÅU}Ðëk,¢zç'ÄC¬fÄëäîÔtèÁ´}[­DæZèj]&-¥ Ž‘‚™z²+@GfX¦‡Z|æÝÇå¾@kŒâÐï±È®ªâÀ ¡íÂWž,ô"ûYDéîdŸÎbþ ÉoÔ‹ËÂè6¯ ÉŽ¡Ó&ï—¢ºqóùÀÔkè¦<•ô{:´AÁÛŠ¿í+Ûêó>îà#ëÒwãšÐÑz,*ä‘7¾ÈûŸaÂTÀ¾EÅçKP·’ØVJ¯7Šy1û¸•ÓÛÃÓÈÞVMF:¾Å_Ô¨n¥cáê,¡œ‡R=¶Ð€o^›$ÜQ€C=mÒíü’™÷ˆaƒïÐ,RuSÓ®ä^>ߘ$Ìз]|_¦º³l@£)–0m¢úî?‰\C{)I<2¾¶ 5¥‘R¨ì=ìYGŒ7 ±TRWÓc(jSÂÖ70½·¿ ¨×Ú‹¿1ûÅ­IôQíÕá7lÌðJÜE-tuSöåt%ÿ_#M¸:ù(§fÚ ÚŒRn3É|ʧ+ÛŸ›¥¢ˆfÊmš’·'—}í »  Uu…$G!ÜÐKàf9é1 ‹ÖBn¸Jš9u´¨‚Q·Ê‘'©­Û~w"¦@=÷¥¬» ïš”þÛoΊ’ËFaé§®¾Ko¼(eê&pÖð-Jò<¡‚ k\éÇ,ª5iXq¸ é9º†ã/±zËæµs,'{9ótÉûŠé3 ŒìÆÿþ——ü@¾Šµ‰_RÜe! ŽýKAìÓ ;2£rŒŠïÛL@†YëU½IG.B]úçxFÃ}&cOâCèØËwfopÚbM¥ñp •ÅñØ&A”A[yªP)Y¿¨àårœÞ¬e²ßþVçOš0ëy´ †cÆ¥`#°0î·h€Œáôò0kÐm„±î!ÝP nûœR–•Q L¼®Yµ²Ûô›xm$çDÒÄqÓÙÛŸíÔw›Žy·1¨õ€©M™aÅS†1Š}„k5“nΫHŒúð =üÕ¼›äÁw]AüN¿Ð=ɺüÕýCeïã¼yÝ– ð ËžUp9õm‡íªß‘#ñTŒì©úÅ[šæ’…â+•ý…#ª–,Ñ]@šma-ñVçÁò¨&+H\Û¯Dõ“¯&˜œf«…_õ`AâR%Îé º„_ÁÂz¦Ðx]³  ôã^ï Ôó¬V©-¯ªÈõݶvÄD¤ú5Ó|CŒç‘;;B#¦Û¶t®ç»¤üÿޏlÕ”ÁúB-@PA+Æð±¯çÌimNj ¶€EºîF€‘š¤§Ã½Kÿ“ÔŽ]2UÀ¡Í{_Í?þSPø—íPE{Ã0áo`~÷¢òºÕ¶«&¡Ò¾¯‰?¡Š,‘¯ç£EáJY¬!X5à·1nqmÚ~ñ,yuõÐ6†M·¥¿æëAj¬›‰Ñ»®¸·. WýPAW¤Î ¿÷cÍþœ”{à(1Rªæ¨~Ìî<²"Õd„‡ XÔÏ=0”zÕ}ãž1Ç«ÓÒ—êZpÜÇ!m=|Þ#õ?h~ÉPÕÄz”zž˜±õçŤ8ÜOOOÛ÷Ÿ$^³qy´¼4¢²¤4P鱯$ôñ¾rŽ@l_ØCÛ¢ƒë°„{72m½S .ú%)}~àÊ[€`×¢¾/·A¨@Øôû2AÓÖÔˆø ºmA÷¨ƒj:†9p5ébØ»±s‹2ÚÈB¼T+WÒô¬¶rÔ<7Ô‰ †k°é›Ü¥ß2?Sû>ø¼•ÊLiâý/ ÆF’Œm;O|@¸Õyfaô´¬ãìñëðÚ­Ü ¨†›SLè´PæÌ¨Ôæ{oÚÚôT.ÊH'!1>¸)5\ðšÅ¡¤\ßRZœsÇýãülËáKœRèì`tµz”i—˜ñ?5 !‚dç|€£­C‡óô¨%rõ>õºls}¶kžˆ_Óyʨ‚Ó&2Z¬Œ÷iÀ˜ŽV‰ßÍùoƒÿ##}ñ¯‡'¿p{g°¬`t9†”ÓGŽŽáf©JRQÄ@ 0²˜®„ôrõÏÕà- QrŒé…BѾμGPa…»+ÖKV¯Óáji~h£>Œdë3¼^„XÏvÚmÿ<”ÛØCaäVO5’39Ub—&í È‚Ê ô·dƒë·NÖ8Øb9&æáz¹?ôêµ:Ñ7YP@ÆV뽤=ÁRsþpˆÕúf‚Zs,h°âý\~0žE„ëX;HÐè¦>Qî7¬”±o£pWä`ÂÁõ´I½Ñô30ëmÍCÁÚþ¹$%PàQgæNA%ù4V¹û~r¦lU`¢¯ý*Cw8‡æäB[¹B=Ì;¼g|åçˆ\EËøÝ’ãD7²o7%šOýŒÐƒA3`:I ’\J ¹Sœ•[‹~¶|Æ”°)©òÁ\ðŽ~K“¨æaóYšŸ”4îRáy7±„ `çlAš¬Þ·Â×#8ÈÝ«õ)³hSɬ4Pÿ Í§Q“þ‡óØŽdêÐ*® ªüö²{–;ÆI[ÙRZ;vªŽ)e ÕK¹Ý¿…¥&)ù¤òÐæ¶ûD³×x :¥Î²=ÿftå_­úwy¥äãuóÀ‚°&fSwU¹àÍÖâ’›LZåqKdzn“I}8,6”ªËÛð!¾'Õ7  töl¬ ‚»Tz’#F{s/XíH)Ø Bе­æÙ—5ó]ÀTyB±qÁJÆQ#üV9 [«( \ˆ4`¤ï3͆æÎ¹G¸ð‡ù-å©·EÅ È:¤¿È¢1Múh Ï ‚åEÛsŽEFVN¢½\ë&ŠæÌOãÒ¸W:­à%-,¸ŸöN ¹ñª˜›Ñæ'„l½¥˜MRyY|$I8 Ñrï’QÚj/7ÜEz—^‡ÎKh=FCž~ŽÏné®ÕBžöZ5˜§ÞˆwBelZ§=±œËè1öñÜy¬î)*°Q< _Vúã¦ÊJ“hÇ\Yä8I½è¬ã–«àTñ‚Èe¢°þÈ+”«îyÿxÖ’UÕ®Óå¨åxõïÒcøê|xjCñÐáÄ–Ø&t ÂäQ„ß>KŠ2¼SÐÇtÌ3ÖÛ&À&Ú×'‚ åøqÅê(\CR’ÁÜ \\%Y2=à;ðð¸ ô.`Bô¤‘eÂàö~`JY‰>{|§üª£Y^*P§FŃ×A«œ·ÝD³¼õ Á¬^³@Ü 6ƒ)4©tZz yƒäôüw—±mó—×ajÞÎk32«¤ïT¤É ýìõƒÕ4dh¼ÿGâ_ú¬ËéRŒ  #ì5ɪøY0G!¢Œ†ŒCæ Ÿ.ýœž¼:\ m¿Ñ@¸b`ÿX>žsòtB°ÑpÑîçЧ¨áGžI*|ôp’{E›¾œ .F«àœ?êš”¬™é˜ˆëâ`ixἨ3_\†J?Œ¸·¼ñbÚ>’ ùQÉéÁ—¼8¬–˜ÖÈé+(Q  u“îšqÿ6׋+i‚×>– èœÚ$èO±ÂÞ¼6'Rãzs/ô]­Ü°*Ý$oÿf þê6pÊ 9µ æiC¼;®ApÕ— ŒµÅ%øìùºMù¥ŽT¹\ÿ;¶ §ë’‚ ~œX IóØÏr—‡±ÚƒHFy*¾z¼æT;bГ ?Á¹‚£uñv´Šë›gŒn›ë+scGQâØï†èC[1%”¥öèöx®ý½ß'|t€ú.áí{¬¸=šÐÙ‹b˜z”¨’…ßÇù•›’×!öguúm;Z~eH6·’þí› ¬ŽI„j™•½fÞ¸†´zijΜ0v–oš’^ôÍU}Qôi®Õ6M¢úÃ^†ÿ–Ň¥Ä.Š3`î˔Îå vs¨CUXÙš%<NG)dAÚGÜ2ļÍþçÉ2Ë8ùÂ*'§[ó%œ®£€¥IŽcrÊ•[ö«Ž©Ø¢ž}(Ýdgwy‘ùb{$v’¥ò'RÚÖ˜­ÇCƒˆÈºr˜þÌÛ|Dí*7F×–á™®@NŸíÁ!I0iάøT1*Æ×6ÞÇqü¿Pþ„q××Wgj®jE‘÷MùT,„G×d$ÆètËÍ9µ¶ORürkØ(œûLý¡»;M‘xôî3‚Ÿdý.CÙ$,J«øë?É:÷­ß¶@*mº¢ðô©¿9d~Êõ´oû¹‚<¸ð]y¶—¹lG0½3‡Wåê–Nm†£u" O …c@1 È”r…R‡må:gfŒ¶Ó#i^{ƒìH³Œ žÆÉ~éª5ãy yÏX»|"€É ªC‹Ñãs‚G˜ÓmW1[˜ öѶ¤žUœ^.ü(bÞdjÖr& ñã£U+~ÎüqbÑãè™Ï>¸$ÛfKן`š%ýMÆÓÝ[ØÇË>&ˆœ=‘ <­M@*!v0ä|@B¤},©ª?§»ˆè¹Òó DPIï;Ó‰\Äp;¾c ¢Ñf%f§v Ž¢7ç&¶6ÊÑõÕ‡ZîõÞ;OÁ¬Ü.·fèÕOkdi«[÷ytÔœZ«ß )Ý.d@ΨƒP6EßuK_>|Ÿ–D<—¬Uõk5")Ð'°Ðé%\´U#TÄ–{QùRwPOã(ô,2æßH«õQ¦šm7 B©¤Æíë‘èZ51η˜¨0¼3µÉ¸½õ†}Éc¸Cîôöëîz}·ËÿvÌ! ‡ox²+þì¥8R•f“r¸ ¸&@’ܵ,ϼª¡, èåasWE7 þrЀ[Tƒ5‰)›‹a6.‘Êv„¢ç!°óL‡5†SÐÜ]¹Q_*bš[´ùiä l7ÓÁŠ%îŸwbQÞ-4FÜxuoÐÍÓÄššñ»äÙF$Íë –þþ[:´¢¹XŸ:!H‡¼«´þDÎίô~QšN,Òãwâ®â1)Úø”„2YÝWrœ¶ÎT.ª‡âl§ºÄqܾœÈôqvÝò¡=(h¯­-s–WýOöù¹„Ô ½¯Ü{lóÏÿ&D•Ø¡íêÑJÜ,¯å6à‹iꌭ,Ú¼{™îÖ.B‚ý!—ÿ%IxE,òà,x¬`YZv™Í snÔáÛ¨óË|ÊÅn"Ö&=°Vw/ÖlÎOp'#˜<‰F ¬&shž}…¥,JL?Ó žŒfU†ýJ¯¦{ã=UL^ 8\ÛiÑSÛ»»5ZïA\¢—}‡t¥?ƒí9ÏŠt GQâmD¬ûétÊw€âû’Vœ'Ýò0åWð•ò€öÿL aþ-‹gT[9ØH¦áÿœCúÚ¥ {ÈÑuŽw ‡ÆKÔ^Jé>í"¬T<ý¥d† •ÿyç"!°mBF‹³)˜¤ŽU?)/ÑR[ btá*)õ’R¯)=Ü^Ý–6~ÊOµçà —ÑÔõr꯵­™»¬¦ÀQêö ':Ãû˸TÇ·)ä-Õ¹!R¤çŠ±Çž$-1­ µÖýà˜ ñÙÒý{ÊY:©Á¿`äÍŒCgê‘qH®[sç‚€ gNqÉñjÃׄòŸ½[’J"d›{W=W™ùe†…Ù,–ؤkUÀáäï+[6úa¯ô™?h¡“­xŽò²ãoÏóÆ=”pUÑÁsq åWï¨7uiVQ…:ß®veqåܯ„úéì²0,Bãàñ¬P—/¹?  ü-j5J5ý*š`<%9t^9‹½ RÞ2“z V=nœlò¾ýÇ]ûÐiÅ´ì"W¦¦aÕðk¼¼<`Ca¬AÁ€õÚÖínÜzíÃBfî[rC}%BÈVÐŒ?ðhz«çž  2ÚßìâÛ/Y*©ãÔÅ×±°MX¶® RÐ ó-„zß¹`w2‹ŸÉÝ œð_4¶ŠÓ¯ÒÀfÅøéÃêÌbß%&š™Ó¹´®FÜGÞ®ËCôÛ!¹pˆ%Ó¯Ò_÷ŒUiqüzáª|©Q¼@Z[Î~…þ™°¡<臑1–0s؉nH÷¢m̼kÕgF_u½¦ugÞq¡L=.™ÚòaÉà *ÀTÆ¿r1A3ôk¹R±Ç)Eõšš“š—A>Î`SDC‚óŠÂï^fèk ú$½D>âü Ã=ب$ëÛÁɧˆÔÛvgúŸ28Œìµ †ûMõ×TÉÆ²âAûXrS…Þ%C€ò\Ü{ZµÃÔÅ \bˆâôô‚@É¢ð7Gºy™é· „N›¿‰c±J/œÉŠ¥WST,CaXì­ ï2ƪjUÁ_§SõÂ(1ëI>ñ…ñd:ÿìhÃ̬u 8sMµˆÖ5ÞE©ëNQÝÞ­žˆ÷™ F[<c!½ ‚MXºµÎÄ~|(GŠôª†^/,(ñéÄE›c!?Ž:ãPê[¶²bY¸vöÑ—’êÁ¢šRüå<(ZÆšiqŒÌ…Æ ïàÕÏfãøõ å³6PʖИ“RŒX‰Øi.}àöYvÅÁðì×xLÅ®‰Â,Äœ—™]Îb¸?{d1.äYú5V;G>K]m’ÝJ)…I (éÐý/QqÜ…?£$ júÕî:Ï:´FR”Çâu(ˆ 0ã°òµP =:pb¬MåS m˜¢ZQ&N:ĺÄñ^q¥Ïµm÷ÁVº?6ïS^\÷gÉÁœ„ÉawàHø¦ª´ƒo;sؽ³íFxJ–¾úpˆÉ´¢ÿmÜ"âÓÁ}—½^ö Ëƒ(8‰˜r¬,ÌX´e’€Üãí{a¢QÙj.ãµ9Á?ënS ëå A0Ž#^®Q>©EÓ.AÙ¾¢ÿ øœ[Àÿ˜k¥=U ‚t@sV\ëw›¶’…¸í»ùу¤Š:¾Øåíº"JuTÞÏþzVZìA>ZEVÁ_ns)’å4G§ °­{ªpNˆ—=×'Úãƒ2MxñÒñɳ,ɺ˜ËÒý«ìíô†ßEàquŒBEÁôæ‰ ‰×² ù^lÞ*C9o$Ý^B8ð±\•¥¸kA%vÖÏ+oqð¶(æ}E¥D« ͆uǘ×ÊÆuг¢‡ãK^kÜé-.¸]kƒ‚²Í¾S;&1à@0üÜÌØ|J½/¤8¹Gôâ+»/°2>ðÓ´‰¸¶Ðšic«Üƒ›ñºöêZŽ·ÿi÷ïò}ëþÍjèsQ©HñW«rjNÿÁ³DˆÉ9Õ<ȧï’Ïü ëâ¡9=ûnË㟖"‰¬Øü³@zðÄ…‹;‰¿- Ô ƒ‰Úó;é9ÝøË£ÐîJ\wV4AáCûFµkº/sW롘ã ÀðE46¤kŽz¡Å`†Ý–³áJ}ÖûÚý/Hô]:8aé\)ø4B”í‡N{· ËcÐÄbmúpKvó·ù¼žD0¸²lj®V~aÚ_6\Ç"ÒОß`&¯¿K"Õg€3[À~nm”^Ð!°r$deˆ/kªéŒ›<‰dùêÏ„è ™²´ÃùæeÅ1ž1për'ùÛkëÛü‘áA€ì[„÷¨äyÿçgû ÂÒgX KUàƒeG9ÞZKðÌ ¦u7<øýÛm!Ù ¼×pýR‰9Ôs¯s¤H±¸.Œt*žj2;™]û›R‚ý¾Á“Áðˆöÿa÷†Wbæ«›,&ºûÏe¥)¸´†$ˆ¹=ÉÃ0«|ªˆñáÞz²¬(¡#,`>¬)XV]0/ ×kU$•ÉŽ€ŽHfàIcMŽ{ÐsÎKÊ{ú‚‚ý›>Ø:0®ªy+W&˜Ó÷ÆÆ¥ˆ±¶ÖQ¹˜t©¯HÖóæƒ‘ùC}ÿ^ÞÆ7›â¹KƒØª­X:¤)ó¸ù`D*MFŒrïv^«[3Ñ“ôÔa?éÆõ`zd‚¶lUÇof<ùPTY³E¾l‹¬KàšŒ±2Ä ãX¯'¬+ZɮВ6‰êL—Ó 7] ñËeàcµvéûUÓ)(lí×ÎÐG©|ducywí¬&¬ÕNh‹–ƒÕJ"QÚ‚‰G’ª¦"Õœ(ê~Whw’es@‹Ñû½ç0Z:Iç”Z6Õ¨Ÿá¾ˆ©\ÜC5Ø—Dhâ;Ïÿh ÿGš®Û§š³­ë?^÷Ò¹0„h-«¸ ¼ÝáÖ¹¶íæµ6f‚Ià\4™Sñߤê±hgÚ¡¯¿å§õK<è½ßÉ{®üS´ªÆ¦~cyÙg"È¢Zçz–âR×în&=¢ž¤œyIa«žËO³Ï™Ì·Yž7êS“0VV1=JwÒZK¿½½EÝ=ù¢ ìx}: b­è2vœÌƒÚÐQ7ø6*W ‘Á{A…:齇ΑÚmº ¼ã¶B¹„þAvè× ® û°ßÖðÃÜôŒéÚ¦šˆu±¸ »ø@‹<×½Î|ïI:Ó8Ur©’i‰ÉWq.~Mý†¾7¦ø@‡ìV²­ œ—¯ßñï‰õZÛ“Œf£ÿÐ0ðY\%»éw’Z‡£¾TÌpÀ+Gm8/jöµÿxä­—:ÑàgAø$©';`,èn‰¥i>çIEŽÂÞ"t ø’³ÛÁ²“÷¶¨œßdZw²§Ué²>ô÷Q¨e‘Ýh|ELm×P£„ÍÝ€OYås«ƒP}[0]ˆª µóU  JÛO2þV¬Ó†`®=È™m·Èµf¹“º"ÿE„*âc8gÛÿ*€L£)à@È¯é¡ 7Téç_P[},4r™ªYu ˆ&úšÝþ`¸ Ë}³(ã@¡÷Ü–û«‚Ëšìy–|ä  œ“$hòø¹vN€DÒ¥™\°ÜN­¾›|KtK“4«có2÷Ý’¼wØo '¿I24!|SÔ,Ÿ¤ªëó_Ö9¡# )Ù.“ÑÐßÚyoßHI=’^¸4D=½5@lÝZdî ªªÐ&øu›ìdÒË‘&0HomÑ>ÿgÐ!UcÒLø7Î0'ì-kºj¾Ñ*XɈT o*- ¯Y(äF~J˜±òí`Þ:%?…øå îÎ9©¨<›ZžvSžJ‡Y[ÏØ,Þunæ*BṅùôóÿÅmß_5g³X8Ý~ŒK%J'Èð»ùèE̵S ¶t»´®F]`y¸Ë ã4I—y—I,ÏCÂÈà}ïW²i•×WŠñR™L6P<¥òL¶°ÄŽä`0ÇŒCÇH!ÁFÿ”§ô¬Ç  ážç-»Û,ÏËþ4b´…¯üÊk»z%óc³F'Žn!"FÝýì—œBºHýß{Q›y8Ø­Æ\¬â‘˜ý—HA¸…o'¢—\¥høo¯K¹Øv!fñõÕh"æi Øpt]‹eÍPµîeB`ë}åö«‡Ö˜aa/œRá÷kïB€è–F–WÚy‡s"Š Ñ^’(üåHëjŠÉÚ̦KUôžx(ŸYQ¼M d‚éãîK~jßO¾"lmvÌŠý¯ƒ‚àŽ~¹nû¼›™€©= ëÕ^«{næ]oy¯ÒÎz3/j¾ÎÖ…)n @:Õq«ž”%&~#b4…q´)[u¶òóTG«ÌŸ=íÊ”%vÚW á™ N-3ˆYŠp|»/æ±Â· ƒYwL’E·!OVo;³'|k~eCì«{æ’@`ùd|›Ö=9ggs(„ü° _Ï:‹ÿi¥ÕD|™!à32dø|šCÄxÔØAš]_Çç^ùh^.hxvT›è˜ýæ ~ž=»7§)-ï 2àfZýk%óE‘TƒºùU6Tw_™†Ÿa=YéÜŠO¾»ªµ*õXuÊ”– ï|÷á׌½\ÖBí“øs—"‚\Œó‘`"¯K­†þáC»A?Þz*~nÓÂb–®ì\Úc§e“?Íb4øý{â¶•Š =ÎSSF™˜ Ñìè$¿R¨¾f8vér–Ç+Òq¡h/‡½¤%(L±OFåd6°¨€Êˆ[SÝ[&}p&ZsúŽýGê¹óŸ_c~²³¦®ß%e¼IFXÙ¢ÿYùŽš CõaÏD L›i"L·I SÒSLŒ@ø5·÷½Ž%FD+™´úbìÅX„Œ´úæ¤8ôÕº=í;dófŽÅ–6ìýN9Æüß"&•yÂýg8Ë?²lÓÎð•BÛ§YShyK/^îîôIHö§Ò„š£÷…Æd¼‹]"û'YöÙ¦S‘‚ [ôÉeêÍ'¼izÒ}{)L¦‚Äl^ÊœºçjµÂBãúú6 F-°–Ôo,äÙ#Vç$ù;žAvÔGÁî§Y&O¢ÑÅBÍÞ§îý³âßð÷gó‡¾Þ“‹œu“°/EýÝö4'"V»+L–É"µƒû\™­—ø öùѱ*›€P ª* çVy×€$M¢uŽÁö­7o&p2ï„jÇJ™x¶çç3¯ŒnQÆ>AÏ E¨å ?Ób²…ò/‘ð¶÷ƒÞeÒƒLæVÙÌÓˆB€8¸9ª½pøáñ*‡:ͶQ¡ŒvÖU+H–Háo羊Koßó»I§ÊºS¨Ì%LYÒ© "ïiêoéÞUƒ-V—&‰xuÖF¿˜Qév+ß¹¡vº7½Ä=³æJpÛŒ¨[½²qoÙìr)ÿy3uYõò²$Š™1ÑÊü Qà#Ùö>’DkAF¦­Yþv1!ÕCbæAÊ Åè2Ⱥníæå¶fN«=^‹YÇò§0«Fȳœ}#,vˆ'ÃëÙ{ ’° Æôê ×6Úá`þdÕ"8:ÚãêÔKý Ø$æsõ¥_pVPS¥ˆóz‰½@Õ ©2›Î&W%|δåk^x°¡RÝÀTNÂÝ­†NQ—ra$nl6ø¥NTßÓö#~ª ²r•*ü¶3Ǩìü|ÞÁj¶B9î«D+yÖíjvЈ ¬l¶F—f3ò?ÃÓÈÀu”ÓÕ; ·Yñ§¼›>ž|пŽðº^­Åðâ|‚±ç¸ U ˆ™‡‹ôò=ø2‚ÅaTçt„äÆ7!è¦øÙª¾XÌâËŸC„a°{ö ÊórP\ç¯rÖÙˆ\ú׉ÿ„p"\¦Óh…h¹ ½ág(2û‹m6x3#Ȉt¸sAgÔ3\ßð‰%<£^ÙÚad>!¨L@ÝoódW<ÃöážÁr~™ûrô3œàq €)îÙÔŽ½# ¸¯äaXé\õ}ܽ lxCó[]¢#¹7§A,nðGç¹ ¥‚œpÌ—ñѲp|a×þ>Š,û‚°vþ¦Q$PÀòÿBž»(†g|Ö„më‰ÝHGq/ƒwéoñÄZ(d,@˜ã.üF¦Ç›f˜O{¤­ÅÍü„²÷ƒÅžUp“ä\‚ziBÑ.C„œÓc“ðô­Ès)oÙ^Õ8Q¢òºü\Ú]¹±[m Z¨+a‹³vzø@Œ«Ru¬šìêPo|ãž9„ž³ÏÔ® gµ´fR3ò¯‡`MòÔUc@#›xxËŒ Ò/`f€W¿â¨öäºyØ RÏ3£)4ñøÁøK,Ù¯˜Û~¸”w}íòµý8œJÍšªzÚ~·œøøÐ5‰ sÆÉXÒcÌõÞ¬¡ «>% ©M Æè²y¥x µtIèåÒ‘W vVEŽ’•¦²—ŽØ;ÒG±®›`¿<õ‘=sK£øÄÍçnÜ6áK%æ¨ žŒÄ‹¡î{ ÂÀØsíÃÀ˜ÚJ×1†[æD`ÎQ‚IòÓ©’ ®’a?;”ðs ΞéöÍ÷O£0ºÜÊ9“Ân$®½Ãã×´m{‡ÿ¡8™øžÃdÆ5òc‘†J€šÖèîjÕÔ8TS¶-&¼â~z—Þ…¼ Ëã"SV1¢ýQ9E LUËŒð ï’ÅÁn*+ÇøÂ¸3ìǹoXþ¹ˆã'›‡]°l_¸eo%øYí…˜Ðýþ0¦$á,¼;]kÝEj˜1ÑÞ,Îf$úHÖª[¸cM\*H<–úý‰(¼FsGV©?ã*©D¿hÿÜrÅyr7è”F2“®§‚r¾šèWRå1ˆËÁÞkDh BË•¤DF©Ã• o¢O]FZ¥TˆXÊ‘zŽÛ€È +ö£Q8ɯàÏk 1ù€Ù6±‘4Kì×_ôÍ#©ê׆Ò8M´¾¤@8…?¾Ù8÷’lÒëbšUjîX€©‰E¢‡Ÿ³;JkQj"¬’‚ÂÜ–]¬% f#T¾=ÓÚÇu©`¶½@ÆèŸÿ;»µêw äÊ’ Fº¯l{ìî¡3¿þðr:!ì¬åªë>–_O¥ÃW:ßH¯é çZŸA‘¥+ƒïÒ`%ëðVoþûr7Þ ¦÷ÉòÊgÝTͧfg;l-·©<Š®??‚ƒi8¬P'«±4ð?dĆÎÔt›Ûér)"7ã~Áš Ì5= «¶Ô}äçç÷¢äæäÒe‹œHåß7‹‚£*l¤\õ¼]¯b-¥C5È&,Áœ^Ö±h”$ƒ·al(ŒIÒ©Æ!KüZ—‰y¿Ô¥ý9¶ëU²Q›8D‰ÿ)šÕ¦7a rã÷Ep]Ä&Áò E¤µí`uq[WíßH#ñÄŠŽÎv˜69¶ó_ÅJ¬Ðø¶W89Ÿ˜ËèÍ ~.Å-"x¥ )7€î‡~Z&é'ú×@óñÿ\ñ&8_p=QÝÓµuÝÝîY¥æ6Kc™˜)ÅìîG4#«/ÑV•Ì6ÎB¥–ôKJ¶.Ú™Vóû¾ÑѨôj°ÇH?ÌoÝ#^ˆe'/x‚>ê‰Û\™¯!acÖ+ÉÞK4Ú'Ïï©‹ƒ$qƒ?5£áŽ~.dÀÌÊfª†KÚvÌbùìBèhÉû°b*_It *‡m£¶°Âóßò‘a“¬Xª-æYóšhp¥µ·˜ÛDpÜ•›4ëæUu³{¢g·>M <Ñ:–~2q=×۱öÑîÓ˽Ùk÷ e"¿#3ì…ç'Ü8_€O:´?'F”'q9µ”QÁÿ´þ&@­ÝîIàŸ{_L>BiäÓ0RúMSÎmû~ çHx æÔnºiúÚÒådÏÒþgeù‡ºÀ[<>ÁÓ£§yÌ´’ªD¯ô¾M8z¥Ï%¿¶*èû ¥žf¯*ŸAûÁœõ‚¼zÊKÇÉ<ì¼ö³]DkRò¢”_Ž“N¨1xàþý¾iOG Ä~«ÜtN–ªùNÓ8,Be=µe]c4á4ÇmàÍšRÓY#èļo¼ù~–„ЗE¿x÷ù 'qÅ äg"veºæË©>h›ŠõHj.ˆÛèäáÖºEÖê Úƒª4âkçµF\ušã½|W&ý¼°ˆxÕPFŠiàgKý3›*Pøƒ0áå5N§`!Ó.„»Eþµ%‹~ ;Ô±dD†Wèõ9ƒ30Ñw”,E¸ú""¡yF§ OÞ±%'†BxXì{º’º¥äáéÓÏ>@„›õ·ÄÙnúëÖ&ÄŽI•ÿ üëQÆFJShïò,[{ ÆŽÇyEGÂ%Û#{÷ý\¨Q†º%®—›îŠ'ïÜ'Û±›€´‰Ä´bÒEˆ ¸aÜPl`ƒäŒûIƒ¼?Ïçß6N«öN¡LŽÔðkÌg2G-Ï0Dé?)3=SR8ïA¹¿ç _2ó}O]ù:žO¤S3¸‰ Ù¢Œ?àQ×ÒD~“a‰/&$sáer»’¹=iE¦¬TLè~;Áa|„æxݳ±E‹Ê„aŒ¡-–”?x}I¬GifæîmVì[lͬŠnÔ¯[2Ø~÷ŽlÊÝ¿­Rž™(¾*zÓÖo’ñeF<÷ðEVc×ÊÆñXEÞÆçœOì›4€qÒD·.–Ž_ÐÉÅ!¹QïÏæv ¼sªOÓ œFR5…ŽRËŸZtûçæû?OR1‹i±KÓÍgŸ®ÀCÒÒiI el§%ÈVWt׫·³“¿$Ê0²ÊCajõ!•é uÝåî8?)-OÅ+‹ˆªó–l8‹ É´ˆc(®¶öþ™@ëg&dÆ,èv,ø°ƒÉ£ÐQ}.Í:^‰I¥KÝÝTÏG#ÕŽO^Ê–Éu¹ˆ‚ìêïPdS%¬ >Ïr‰k&I«‚+5€š!WÜ¢%A€*Î½Ø N•†ÛÒšbíµæî•Õ_Ÿ­gÀ?¡ Š;¸ëh18ê–Þ°ØàfsnðèüŠÖ2Š\HÉŠüÌ^©Þ—/i†Ôêç2žìíî—6á‚{yFuÓëk»åª¯è8IÜþdi?é]ÆiÞÇ7Ä3 g=ÿ0~Ks@(LÞý¹Ÿ2~~BÛ ÜËAã÷ÄM$ëÌ&†Qd¸ó¾Š³ÈS?ðÉ‘)özÜÃ%|·î^UËj¼}1ÿÍW(¤R|(¸/›RÂu’-à…1Ÿ››¡ôQÛ™J z+¸ ·ØD²\|žo…\]¬ ¥ðƒ ï9 Uß®¯ç ùþé”Þ~¯7Áx3•ñkѰ3YØï¼`ó£& ÊJ 69½žfâ½KѺâS~E"y}…˜)e,O? âQÖN™,ÿec0Ó Oo¤´{ЩàM?ÎãdöÀi0Þ®Ú(e`ýWŽö¶r’ +k4€µoÏt6ý(û÷šñEŽ¿i“Ø4 Wèljuo1Þè(&üáwí™D3,DTMaz_%ÿ·š=[‘)–opQÉîDZ†ÎS‹úòÐg³.œ¾ÎA™ÁQ…s²`Í’6@í¦uó­?Xé MãÇM=t[xºž ìĆéõœ¯-\v¥-†¼ C1ánŸð&Æž‡k¦=û†ÒdãèO™y±V¢¬ öVRjó›—‚À|«ïjÓ G–àkÅá™·\w”yö‚L‹4qJ½Ì-ÖØ+Awüåþ¾ï £°¨(ïìÎ0'ªÈ¸uù§ ;Ъëîð\Ç5еïø4yû! Zð‚ž¹Ë;égLHÐæ/þË$ñ}mƜ̬K{ñŸ1+N¦™ º‰h«)ŽŒÌôîÖV6­#Ù0ç¦k€{»¦÷~««Ú* ^B’DMýGKõpv€ÚïÍ<\žŠÇ]U3tìø”}L+­÷(!¨¤µ‘×Np€m}Rò’ rZ±ðåúòGÅ-˜ƒCsÒÓ³(2”£l’Ä-oÕ”˜˜ÑŸªá[ 6ùÚD?ªêx«»Ç ª¾‰zD…vÚ›ãŽÇ+eR{¿Ñ_+º'ÖðR±OiÖdã6¦ÿ=»±s׆†Úu?? ‰g-ˆì<ú!Ì@ûñ‡×¢ûÚûHo{]KKmšÄ&*ž—.ÿz}Ú1‹.·*êÎor7g<Øe6žÿjÕgMWÓ2Üa! Bt÷6q=ÝÛ^‹]Ó3êòOofÏ+ ÓBÉ­çÐãa~0BÓ`¿ïôO“Wص#\ûÄð9ã*þ wŸ»Ü÷r‹}eÍi´Ý½»)ˆ¬×!É¿~DëÊ‘TeP„↛cóå÷y»`ß×Y7“Ã0êÅ‹÷Oê}>ŸnéÍZ¥SBg&¿*¡ƒÆ7ÕüàèÕ‡ìb¨¶W¢¾ëþJ›è ¯ô©ï0CÌߣþLÂËà‡€7P@©BØDÌ Ö¿&ž ~Okão v•›q_z:ŽW4‰ù±áùàÀÓšØ~ð± õñ]dÉ«II€+—åêÀûËòä¦a0ÈC)ûäÚþ§'¶Ù÷¥Ä´*S;>]”"ÿ®õaAi %,i¨ö&"O‚äm“þ¤ÑàÌü$lË"Žd>\“G‚VØB‹í€qÝ7œYZ8èUߺ …ˆ¡ ñçšao—õ“V†¶)n¦RÁŸëë°³"šØ|äfÖgÈ¿ÁEiÎ a{ÃóÕb÷•âzÅ…›âGÔ©Îí Gö·-j<¿ŠÑãF†!óÀAîsƒr~)ÓÍM8Ž+…IÒr31}* êáŽJÖ$¬¹™%Ìå Ê]S÷Â5L>çoå8†[éŽb¥[Ø M/ö› ØxBkduffv+4ɦ—Å@gbB–…2MÕæØ‚¦ô:Iêƒ ŒKÅ5ÐH| ©¿×M­s ó/ÝâÞí%ƒ¹>ÙÂÈb4œ®©¸ž¡ Sf‚A¶Ö ~ì1#–‚Ù!qeQ_—x&„'aؽ´Z‰@~+äÌÕxƠáÄiúe·â•œÍ„¬×ʤ麗Nø­3±OÛ’Ç 4Vä i _‡f¾ÃJÑÐLQœZÅq§\Y‹¡“ N^4Ä'çWz ×RßD>œxÿÀ¨ð²Œ Y.¯5_"ôÚ8¼Ë¢U›¶ÀE¥b ПãÃËC.¬ûlI·‘â›fX Ÿ†ž8&¯Q‚¸g°Já°?]OL°¶Y^s?S0G!"ÙÊë_íU‡‹dzìj‹øÑãç9_7tçÆþº)ñ¡¹¬ÐÜ:‹âÐØo3ˆup® ×_K8‚ |è¶§oérѤû‘!JÞ½J,{}µ [sî—¯™hÇ4CZ¥Óƒ/üš»9©ÄîÑFkàœ@¢n;ƒ® ìÎJÈ}hìmìdp¿ŸP¬°ÚLJ™äº__™ÍªÌp¡½†0D±Î>gV¯Ãmûö;éº)Rl×3ôÔz’oq®TÏ e½pk7}¼ßÒ赇P‰£¹Wq×¥©kŽ&my·ÇÅóD.‰ÄŠ™œ‚×ò¬„Ì]¬ói¾«Þ‘ Ov\úÆMôKå Õè¨pfÅ7>_bj&”cÇ n*˃‡+ÉîXwüƒÝâe HSz/L¼¥Ó®ÏÀœáÇÏž Dñ T‘‚»×¨Íïß‹—sýÑ]ìiD:dõç’ýÙ ŠåeÓ‡ ŸR(†6Ž‚–ãjäð6.vã†uì÷¹¾x»¥7Ó ãŠoªßèÚ£K¡Y… «|7áŇ]ßÚùCî§«¡fß{P»~wTÞÞº)¼Z³— "ÍóD{7ºÅ¹º‚6§⃿™Žÿ€Þ.È0p›}úJáOäD›ð¾ŒQ]{,˜Œ¸÷^%Ýí"ÕœÉðÈï¤ä#üâVuÑ»µ8Ñsçô=U÷ÌŸón’tÚ0‘Ûñ¹»R½3¾säÃ`η$àGF9j‰!!’xç-Õ¦Ž@< ¶Ä4¾gŠfÌ™Dù$ íù¼¼¢Žå&p—ÜxX|—½L ÊG§,ѹq>´›|í GhQHAõj*q7 o±;ñØcu\ 8ÙVÁÛ$ƕڮø¦Ùìwî좻է(ÜŠ‚³ì•†'#ÎÞùÚ9tèst£ûe‡—Ì+´à c„ÎHÕbƒÈŽc%2Ø(tñ¿^'¢üdlÒÊãÂ)ÓÏ&³cL[IuÔ›ê)-`ÍõÈ.ó¦4…ALGÏ¢ûñv/­Ÿ¥)\5«aºœë#ã÷A•3ÿ6àôáNg‚¤nçÿçó*høÂtÊí–yÒø)˜6ÞÞ(h ããOÉgßšCã1û'’HPã¤'šCwZóddä©#o|¬𙩎zƒC‘ZÎs••K×&u-&p/Öúv~§ºÄœ‡\ ]¯‡:6 »ÂˆºS@(|RãQSž×–us ^à¥Õ­Ysw‰³-¸\¨"ACwšñ7ÆžãÀý¨w Úû'Ä?ÖÏ·¹1Q'Çâ\…¶‚j‡Q˜líNƘ¹u/•÷ù™}Z#W?kŠªJ#h»•øÙT™Ö?8ü€Òâ0ö¡ÔWÆN%j׈¹oé ܤOñ Ð!cé`JÅPÉ5}}DÊ™-ËNžªÑ—µma.5#¢ú«n—4~±òÌ!üd)!ÁäšÚ4ÛüœþÚ8Ïaꚥ•ÓØe4ÐpXˆîºLŽLûšbJ½ç¡%Dãçþ,óæ ßó¾yFa'X"îJ#ÔÐ>½Y; Çû[Š@RíÆ]¢«×çQÔ³ˆéË{õ{îíaØõÎ\¤‰—ü½¡ÐžEt'a#+„kµ£[ö ÌWâ<ë;`&ÔŸ,K«ä;ö ©&ÔdÎ6ƒ0‹¿›‡ 9çdVXƒÄþ~Õ @KãÍÿ’4ÎáeC¨™·ï¶ˆIãÑpeëwùÒÁt)ŽëÃ?Qã¾°ôüÐÒoši,*¡ÆXü0v½ª§!k"x*+÷+œ{tZË™îÏŸk;®ôãU›Ï^¶&º»¬o®¶pœ¯3’˜µ³©Á=¾=„…/‡Îð¯M ûÊÀÔÜ"–Ú?ã=ˆa‘+Æ:J÷+ìCë#çtkwƒ‚«¥‡À§gð÷Ã’‰Š±Ç<òZÙÄ^9@eot%xÌêX@ÙÜ¥E¡÷½ŒÛÿ-ã»Ë ,)ëbëÕQ}{Aöåuš¸Å RVWEêë"wàʆӱ:¶•8¸Gqö›Àã Í*fž!ðI^1•ƒ5‚ì˧¼ÔxEsMŠyë¿™DJ•DZétÍP´(Û·¤c‘Ñ]پ̨]zuA¢ÃÍL"ž…é ê©Ç,¹çÁŒÖí´™á„É|UmQ—×~ À ž7ýoF<¥@Z*ü%(¦kA” ÔUoá‡ô /»ìÎsä}Äl›Xê•öHSägb+[Q÷¹…ý}%ŠbdÙšüwU]þ|sx™¢<®Mvè÷´6T¯ZN»:ú­Qt/{­‡|Ý}³£ê›¿ ä|qRÀ×cÒ ×÷R›ù=ÈÁ³Å¦S¥âÒwq%øyh¯;~Ñ=aŸöØÌ{¿*Mk×ÖŠ Ëþ`QŠ"µ8¦R|Êšs ÔH7íÃß3zÐ$%Ò”ÏðÑu¡ò+’=Ã#ú#¶jµÀ?[V†”Lß÷Lñ…#29{áì~ @ „F_ÔΆð¨8ð,ü%ë.½ËÕÕp,ßDÉÄNE:Þæ>R~2[²Šj£JˆÍìý³Mšy¢àÉTÙÞC«ÛšðP…U°tdÞðž^ƒøÁtbÃÚÌQعÃ/y™ÆšÚ§¡øòŸwV’uŸlÒyÇaT½õ‚5q:t« g9“ê3=‚Ci>»­ôéçÉK-¨‚ ¨RŒAæ\Îl«§ Ù#É*MŽ=*‘c£Óæñç#ÉÝÙe7-ªû.¶ØsÞg.rØŽê]b²‚9Vï¡“·‡Ñ0[3á âùŠN½UYР„ÉVñ­*åoŠ 4Õžýƒ“’q^ý•ÐÔûõ­•¼ Í2©ÄiÒGäô8Ñ–Lõ“*ÈÜ$kls¹[!6²ÜDI©;†é æC¯7v¾«ï4 ~2Aè Ef)¿bkÝòŒûwZÌ!Ç R ì7¾Õ<^Ý'Žï1}ot+·f ••vgÙ—Sí.t»Ø]ß½oôˆ-£®àCúA@ùxˆà넪lÁÈo03Ö"ô8LxÒW¢cb¶Šª3 ©Ùg¢mRçA°4ÎØ®°~ãõKA~êlâmËŽ*¸  £8¨¿‡š?U¹ :ÚnâÚÝØÂÎ ƒ”éóƒ+›ÕrKÇÊjÕ¢àH·ŒètζɢOd§3?)ξ §d«m„ŵ.>AtKâU{4# n˜…!ÒŒ:4ð t•(ÂY<±Hòæm– Ë9æâºÅf¯v„ų‰oÐËõ<˜ˆºú¸NFèC:dçeÇÇ-^*¦ãjG> ~ò ÿ{—7­b‰þ/ƒŠºÛ±¤ €n1_v©héX៘Zí†ôï x'¬nvíáuè“ÅpÅù-`÷ƒ{3Fiµ­Úbѧ8„5ëÇÎ.ÔÉ.ðµ­cÀÜ—a Q?Þô‚^ŽŸëý£Óö4e¯Ú…ƒr¦€ÜäTÛÄïeÜ·ÿtH{€˜–AmbuÇÉmÂ`Ô$KõôWèü^ÑpJêIb;xÅãõ}ެ7׺ÕÜ šå¢—*.€ #›NÇÐGYˆeuIÁv§Eç~ÕinŸI8gY碈Îs~þQƒ\\攥ïÇ <µƒ7ÞŽD5Dœ†‚’s™1ÒOÄ­JÎÞYy² ª}K"ø Ø0T¿ßµ„¾ %†D+Gf‚¹Ùâ2`¸< ­{'ýbêèIF R$ªæ-± r[Ú§¯ûõñ0üóÔ¨²ZQ Iôš¼€îZIÐÁ‘pãhΖT•.å‘ô å=‰6}:…Ì86ªÝlçã8bTàÏ¥g(¼ì›¹DŽÕØäýTI©à‹®*m…¾µ¶ë°(¬¢´›ÒÓå†8)j2=ã¢uGÎaÜ<ðRå¿Ø,ùöBØ<”`¾4‰˜ÔTÉ4„&²ò8ÒDë)˜´?7*l— ‚ž©ÕG.«ßv­‹?øœ_tïŒòLäKYéŸÛIšZá••k\//žt`¢¡AJõ´3[_sþж)ý>ˆ®Q/L5ÄŽÏ’uWÆ+¬(Þlòb”â3_õââ ÃË« ¸¡6íu}£ÙìÃ^$ŠéNg²5ñA\\%Kð1ß+JF»úwÞño¢ß/R,^ý׈ÞÏ|PBq.ÐZHí¯l±û™N"ÇF Õs^K<š¶m<cô·>Y‚ù] ‹|&9zS–R PL;iÛŸôÊñ¤_ÔG„º\e„<‡¤˜iÀy{ù€“Ð’ÓóFQy)©Qè'_Bäi2ÔïÍÙ¿Ž×°;õG7^<c¥r͵Ù(éüÕ-:{ÿyn5'ƒ£’ÊÆ¨L8'„Ñ™fÛôîèê/©nMguÑ*qú²“rmèÙ[NðU+Ã÷õþ]/·/~@C.ÇSLB¼¹Éﮟu‡[VQ®íDÐÀ½±ù QÃq8rÆîÑßP’Œá=ý‚áúdæÙúdîfÙÓí% &kµ/ŠX’4LJåƒJÎhesÌgÜ—¿î)×}êTŸÞÚ„ôÙ.tx%?-aWé ZÔ„DŽØ%(?C”D›ªeìÝ' ] ¼2ÅùGcCŸ)¼%ÐY¢êèˆæâk¸ùƒôz_Ÿ£š%£´¼‹;•ruLÍ3ÿâêü‚ÁÌZm‚ÌLäØÜeQŒÿÅCö_³´Žf¿~o)‹,˜˜ZoyÇ'7ºh†Š;kÛ¥ÌFšrýcàYÛÌ'±´lñ» šÞ4œ>2HZç>­’m ŸTt25É­ÅÃÅ5ÉÔí^q† ÊcP3Å«\çÐd‘ šÁ¦C=ÙŸ;¿°ô`ß\šWá["ñoÓ….ðPIšÛÊXÅ9[H?¦Õ”ŒÜYO“?£iÃ˾¸¡.sŒV|Ç“—²P­a °êþ³_5ޙ̿ŒfÌh{h/¹/R6v:„SLÔxM½q¢sôQ~€Í'í,´ ˜n‹Ü” <·BZrq:AFÃÊ „q’úŽ©pÔåÕ“yÚš U'<¸ ŽDý¥B>៥øÇ _ïÅÌaà½ñCßx«³Ü©×‡£Ù©^Ûa¡p÷Õßð „„Bqÿ9dØÏópÆ­úçÙƒÑÉÜ•½%×ñ|Q0†ÆÙ~']Š,àœÜÕM+÷Ÿƒrz#„R¶ˆØµ,ksÓô÷™WÓXB_MšFsV€qÆ-É=»U·—FÎy‹m’Ò ³$§¥2Áw~ aÆ7—°ÞTÂÈc¤M =b'ÿhCjØùæYcÏÂørËÜyTQf’¯Ïp@¸°ýät‚šÙ]ÄÈ•æ=£?=kʱæòerÁ¤hê¸H²¿×³f;íä¼ä2ÁzcCŽ$?¸zKKZ‰F ‡E ô;†çíJ¹Æž³i#D¼\-Å~»\¤ÞŽ"’AX¨“½êCAQøØczq;H…ˆ!ž`"ú°ºèÄùÌÒ‚‘DºÍ·ºšï‹â'äÔ‹/Á©nosÞ•ü©a`öÌhî•A©úüFÖ`}Ü¿¯ õõÿá£a¨£Áó‰ú'*ØLiy÷ž¹’ŠÝ9>)O´¯QîÌ”‚÷²qæüîa+ÐG»Êà›ÄŒÒøú<|ì†EÆ"Q â¹’:pîGð„í»H‹s®¶Ä^µiñå0ýEŸ{É6» b;Ot©ÚÃ`:yß&ÔÉågT¾À~#ß÷À¡ŒÍt=(aäb|{í®4®J{ÿÉ`Θžîú`ÎcgÎ-†$ýÉ«kt±(Q‡$ ÖÆZ ¦ß)—ðùà¤èz¡¸§¼D~#ð²¾”þÃË õ0X4¬$Âüºâ@0†A ‡b#*rP–œ†9kýºcJŠÙ—Þ7¡0JÙ`BE*MÆÏë<ÂOùàÛpTq]Êaöö%…2§d#ÿ®1qBZB×oƪ{àoKŒ]Z¨9\`s³J÷­ý™^ îy«û+œ¯àL¤]ùAdË@ó3^C¾Ìá¾&ÛêNA,k» +ÜriâEá°àîœv"ô{ü,`SȺôê_Qe{N’ž1ÂÙÇ)NKëø§R¥Í¢ Ù)0‹ó…ÏŒâ/¨\I§X‰€Û zh/ø@0´š¡P1o„þ+´Î3’âo IëœnÑÎ7„5ÿCš‰ 8¿”³ºÀÓÁœ/½‘eènÎÒbT¶…Óïìe¼k¦:Dyâ‡:×ÉÅÂïßë}ö‘i¿n¼È·í/ˆ޾/”ÎR¬ ›[›¾ìÖ2€m4 É ¶Šêø÷ z%`+=JG: ë&™·§MoØGd¹¬/ˆÖíŠrŽŠ›2¼ùÜ{â£} ’‰û?·ËãÙ!«òežƒtØìàµÑ%ŒµD[åBÑöH‹ ¶ L™Ž·´ÅeYgWþ¬r¦ÚKãr² Çœ…ûá3[v—ªžÂY¤ÂµEæÝ`ü‚ajØÈ ÒÚq‘L¦Þ„ÂN«Ê˜Mòkpúײ±«ñe]ÌÒY× ¹¨)%çtS\cô§›’ÏÇ/h÷=}˜}MkIÄM&£Î¾QŠ,³‡Ï¬†Ë—kgÈ»Ê8ùÒv);ÜùçÈgÃEê>:f”5Z/ÑxÖ4Utó/jaªšÕ4¼ŽnæQû’o>º(…ÙXVÎi*n:9h 5¨茣Ø!úKÇ-w­m>È›ñÁ`Áµ å“êÑžW›³à‰ž4…tpj„-¢®¶p~k«ˆÀ•\}mçº5³|ýB•ð~–0E8ÛoŠjÂW}Š$NÿÒbý†KÞo =B–&ÃI’dÈn3¿ìPmÙ Y¦µëÈëîTø0LFU¸¹‚ÅŽbþ%së»s°‡Mk+Vv«GwZÏãäeDOáíbÊĈ-}€ÝL3/Ç¿AÏ.â* x;í‹)E`Up0KøW-ÁÉÁ+®zÕƒ‘h”Sw·¼+˜-}ûCRy.CS¹Á+lBòœÄ2øx޽èPO¨Néɉ(“ÁB[¿ºuíÍE uŸ‘gŽ2wNÏàT,h*4:ü¼á\0ÅãÁCÊ}ø5~«±Xqÿ'à©rò÷¢™ 9¡;êëÁÇ"‹#|®7š“8¢;чnÊÜÏ0{ú#KÂ)ù4˜O 'èUÆIŒþvÚ½1|»µs§sÄ,²5óàe²?¤m36èëps,]X‰â+¬QçôÎ<§“bQ&Î` ­‡•[®B ðÜ®Þݨç@öË­9û‘ïÒÏ7öH€XMô•ê¿J;¥Uû‘€SüÁF13“â´œÀM)½b]Œˆ‘ÈžÕàyÚ-,»¼B‘ͦå)|²Æ¢*¼]¦²êö^šôýHª·”Ў߇?¼õ¤¬‘¨xÐC;’6ƒ]åõ,ºö¶aM>ïLMÜ´V l_ãû>Ö~Âã¼ál>ÃÇÎoôèºLZyù’yQd‚&ûs»Œ¡%j‘È!yZðÉ%µ›ø.Ÿ’Ì€‡®Šÿ•Êô¦³ï¤½–‡‡Æ¨ÌnqwÞæwý^ MÜñR8Þl;¬ ô¿kJ;sÜ¢²¡/N² ¶öe‡‚¸[é¼'¼Ÿ¨VwÀ­Gøü˜÷¤XÈîmò_&ZÓ»qŒ5¶Gnæ˜uÊ£PZfՙɪ }”¬ 5šE9Ü 6ÏçÝa î©£óH#- MÝð[ìô ã”Ê\kî›Và¦A(˜«] ûuÍ GO|ý̲µVB˜ƒEk„3a)T©Ni³§Ëj¸lO+²ÃYu¤¨ýªÁX%·šá.w•3ök±QU €÷\ŨèωôªÊ<_«ã„!jOJœ¼èC2!u_Þhs¸¥°X9þ‚O!˜ãÊæÎÁ´ ‘Åsà3|¹Fu†SÃÁë|Z5øÎà›DŠÊîÐTZ‚²ñÌ)<ƒü  ZŠb3ê¬RßTñ•Kè¯ÃP/a)ºÜ€™J‹ ÔA’3ZsÒ@´€·øÄý^T…Œî0`  ­©dôNÝŠvõ摜å«@<j<ÿ ŒSÀ<‹xÚÐ0š1À‘¥ýI?°zRÕlkyËŠÞa)?Çñë…ì‘•Rúè3xÍ(t†¡±×ˆÌÅ[Q BX&%T‚U.öÒ£=ûÕÓóöä€`›T"ÃØ¹=¢>Æ›¿³Ó³Ë}œßå%–òùåí¤xEµWÀá2.Ð+ÆûÎÀÔHL$ßh–eò$g%¤¿&<îtêåm××ôûêç;2˜¶Uó÷iÍðJ.ZëVS+娧ù(€‚Ââ8Sbñ0`îiC¬l¿Ÿ,=¼ÈÇö™$܆lƒ²«Lãrûéç͉¿I)Z"ec|ñůYÚnÙ¤7ùH‚“NÀ´Ñ7‡\d­1UÒíw[³¬œW# å·¸Ö«ß³­KƒâúÄ âów“ æ#Fý—=47zùl8% µÆ| aš<š¾èø*½yW×'Ñ:Å;žY›kÙÞ|ž°#’Ü t1Û[“îU®ãñ¡Î@•߀šMÏxÃ繈¨o«vjm7¼ÿÁ&‹hïØ.¯ðÜsj²eØ®6¯ÕÍ%Viï]>åS`muvO«ÍƒÇ¾:Y¬¾® øÙ¼E¨°µnƒ*Ÿ+ÁWŠUt¥„`±}M ƒ¡A§!oÔæ:î³èÁ=‡3[é‰Tˆ\oxî$"µñ¢|Ç®·øËº0J¬E´ uDÙRMÉ6²Èr^ÿhqˆ†¦œ­‡…Ùè…jôû](?òXØE[KH<¨N£;O ædž6¨Šªëb‰‰Ó\ aÈM×|5é°øjn…Föœ_Všx÷¥-r“ý¹´‘D¸®§¬Úr®'È,°=1W½¬ô!"HÐp < QLÙ[<óÍ3Ä…ŒÿÍx_FjÑöm# 1“ǧúûvuAM¯žGý ã¦(u‰sü4âE[¨ë‘ÿûeÀYÕ’r¹ÁŽúnÖ3”÷×ò¥=ÚÄñ ^?(T¶j=Vmb‰y`_¯:K”Qf¸ÿîÁð!YKž$PÄ}ƒ¯ÞAÙ úï¨ÉýcÒßüæÂœá$qêBb1tÑË•.£4ñµówÓqB¡UÛÈ™÷;ò«²FÇ Áü6A/±€/ìîÿæsºnö@Ä0ŽmÊÌGœ>!Zì?E«h1T~ûãÕ‘n#Bâ—·¬ãÊ 0Ä«@™4è7˜ž“W\m¤”×À7ùtŠ”+,_³Öë ²[9i2t¦û'ˆJžoRóÈ=x<ó[UP=jÆ}Ú"õC­œ¬Ï0ñÛ¿u³î‹#“xëK#Èå]×ÉŠ51'£Ë¬Ì2DÖòмdÛsN,AÒÝ•ÑÁcevt“þ›Š¯_Té*|æ ·¸ÅÝà~6š–Û<ž›Õ+ÇJ.§÷´´xOÒã§PJ§ßm_ó¿F=-W*Wöó<†±É¬‰ÖASÓMõ+JÚ µ[a‰ëL±ù’-¤4Ñ¿¨¾[™÷œí¢XîEW+n’˜Bþ§ÿ$‹|R ÅÿÏš æËT‰ "Ëfôú¯–ï˜ÔñÓwÕþL¶pê‹c¼à?!;DtÃIŸž×î(HaAÍmט°­ Ž::rÃDpÍ÷³¨Qe'ß›@¡îÎ÷ ÷èZ%>Gà?&4p  «É±Â5}„S4oû7Œ{´·© °FÃ¥bÀeå  }Ìö–s- Aû8*ß*:?„Ä©XîÛA°½%8Rz¸‚5¾vЛÿܨ4Û¨7Âr8ZÝ\´e"¤ªX6Y‰p C7Éâ—x/lƃ×È6 Üìíê`â7¯0"}S§u‰ '.Œ,lç. »¥.u?o^=ÐS¢è‚Œœ5sé{OhfÎ\Ê®çÂ4‰íðp1gå!€<«'x—_‡0ŽP\Ÿ¨£‰TZ˺±y¯0eáÚ ¯¢„Þ­¸—uì¤æ¨30>ŒÐ#,µáJžÅ–/³ú#jÀúX·?4tVÈ€BhåĘV×+Òî/×ïÒg@¤ÑkªÖZkÔ=´>\²ÿºÐuŠ|2†Dþd5…/#ÐQ¾vÖBoéóY¿àM˜ªG[· !UÔn¢«0 µò{/¼Iž0€+ìü—— ÁÓÑí(éò=d6QIÀ)´VØÕÐú“ªLÑ޽{,:”Kvø—‹sžÙú£mJÝ9°$›‡ÿíCØ- O¿}¾/vžéµ{œbÓpçúå¶¹­VF(È<žÓŽi‘#-K¬7ÕðãW¤—Øû]ºÖÕ“­¿Ìÿ“ ÃHwÞÿ3l‘Ь=¤ò½mjà­`7µ8c4͈1Ë÷QÖ:A#½'8ôRp÷I?U¬jºk™µí¤î8•ž™IM¯Qf†ÉÍ^±l³ª´QÔ’à¬#ezÞªÜtO“™eÆqhLüsëTIYOÿ—eÈsÀE»š°Ý…ý+¤\¿¾Öb¯¾òŸáìàè ª[_3w…ƒu J¢&Á5׺va@[;¯iÁ†SÆùÐ×F:eócÝ °'´º‘ÑŒ°I¼£MË6IÍúl¦H[†z\FÖ0HÃh½at­ÄÜêÇÖJf|MYKíò jÄQ]$øÄl­èñÆ`Ëñ!ið[žÙÏÃÄÄKzæꦀ ‰»êØâz=™: 7Òá}$½¤>éywˆrlú\ÓD j¡´,î½ú×pŒkÄd°ú"á|[2Ge‡‹ÌÑ‹Rš2ùH¼ /Ï|†V&©kzPû™Ayò[ ÌHäÕÜÍ!lDlaµP,®{9KØ{NÈìB‹;J8:»T@=¼ïC` ô¡¦ÓéŽ>ÌúðMüLþŸ»”á¹£<Ç2!bέˆÛÝæÌ‹ €P;½pïE1h]‘pâgxµT£Tt…Õ:òeÔ,âÖqŒ÷{[ÓNüåõJØì]_6Ýli„Ç „´Û³yDö.eº‰ CwA5Ú̲5RÛ‹’þE§H¢ÊDÿÄד3g‹"9‰ÄàOѳOì;3<'V¾òþófbF ³=WºµÚ‚.pgJìè†Ðæ‰K)3TŒè¤—R\"JB©Û›I±.¿À“$,墸žºê„0•ªRQ*[~H–·Ç ÅO¾q¦ \jR—Pr”¶¥F죞4µ|¢3¤)l¸ù“é›.Ñ>»+s{•M¬\}€Ý`n¡%œ:‡ÓÃŒ6ðG"½¹qÆRM‚2•Ž|ájÓµéÊ@áÔÕ5YçˆÌÊûdz`Mxâ£ÔDIŸ€zÒƒ·™ý¯vcƒª]Þ¾Äpꃬ–™É\®«/¶Ì=¶ú Œ$!ÔkTÿ¯@šÿ6´Äµ‡¹¦Î$…§OÒ?Zm2o±ÅÕH8âœwd Í´¹ÚSlЧ±#"Ήfâ%[kã¾`½Ïö€†iß3s³û&ˆÀ–vãc–p èó\¢¢¸8µAyŽU-Ü<ºØWŸ(— —‘ÝŒë;g| ”¤X¢H%OebvõŽ9¡ÕâUÿf}½Z»¿ÇX%¢5—ˆ¥rK¬–(ŽS8ØœLU ý0EVëÀ«ào;$w T×t!‹¿ <þþ@r*!Ë*Ô´bI„ × $m.ùJîÞ¥ËüÊ<:Åþ* ©Ž?,ã F}2ÿóZ„uÁF½AÉnP=bGãÚ~$”ä2LÙ ¦Þf s%%­M5YÂFºMaÕj¿*Q?çpOO ‹Ñ5'ðËkþ ÒE—„ØÇiä…!ÌÅ|ñ‡”B®¢©Èˆ‰OnäÐç¸þ;¨sí·q`ª}´ú–Ñ ¡ÛYvÐY Œë•U³û U%W¬Å¨Ë•ã€âç–ðQ<Ë4ZsÖoÁɱܞuê¬Q"á–2QÞ‹ÙÄvY„´2vWNª6>."Û¾ñ”XM*ø,Q±jW˜ò€˜“½rÐÍïo}Ì}©•\TO]# µŠFô¿˜(ˆ6'œ(¶#!œ·¹À2þáüùRXÕ‘jÕc²é™ÉéÉtMÚµÐÑP…ÔÛ²mÀŸ{­¿Ë‚ïþx±Ç„%´Zc›rÙFÃÊ-hà$³ryb/÷¢&ËbW$rýÛÖ¨ Ùðþê¡éçQÚHêšb^æÿœ?`²›œ©îé] É<î g ‹ÝGþ›jû,òr“ÇV¾p/D?¶™hœs©ƒ;‰Èh.?‰¼ùÔ„ECô“—“ i,ƒ/7ÕÒì³7‰àãþy·Ucüè™nóT¸ÊñødRo[\—Q]¢&{ÄvÞÃ!»î2GMx òø¬»Åg–T~‘™ ç–ò6¯Ö,¹º³ícb FˆF¯<=¸F‹˜¨-áá9ÍÐPÚFo3‡â©“©¬Õ7©×*×OÖáõ6Uoȧõ‘ä‚5Øéïûö´VYV«tO6Tp>ŽRv!´Š'Žö¨ÒÊ“iÊÒŽ*¶-;³5©Ëþ§ÄïrÅçÑKÀ­Õ#OÛ1®>§r¿YÓ$ÙÁJóX áÚYëZ~›]©‰Oع!Õ˜]Ƴ;hk<·‘Üa¿qKHþµ´ÁRÊL{¿€ðï¥ê­2Ãô¾Çô ÛÔ aƒ×vívƒëÉù"Nœ÷œ@Ì¥ë3 u<@˜8xÕûž¡€u\Ûv—ÖÀþ§¦¡ î—ˆôÅÅ‹rÍÏø…¡Oúo…½i èx…ë˜Ìû3cL)}Ôb­O„'“£w¹qe130«Ûv=y6§nòEÈ¢ì äKÍC’ŠÔdFž4"Ê`›ÔË…}Ðß"÷ùšå\º¯*ˆGŸ±ob¾ém‰SjÁŽjÊ#¾…Þé„íz‰ƒÅ†,ó€‘? 3xý••ßo¶fÎÑ©ª³¡É;€¾m†v=X ‰˜ôÄDÕ+Òil†RU«Œ5‚Xß«ånzt»H¶âÆ% qûë~u-œ°Ä¬å^Ü–AFÂ\u+Ú÷¿êÆaŠQÏŸýܜūm#})Z¹ýÝúÐÌm·ÐíR@Q¡4膫ÙðEGèøÀ‘³¬á[[ÙŽ] 'u¯aˆªÍ$œ.ìGʲªžI¥~Ò.îñ§ÀÙŽWg=¦Œ PÙöqßÑhu»o»7ÂyýVôô\ê<âóäÖöêDNA >8À±s3ïoãgFâSoo+’üë‡+´òtü ‹QCã:é,xùg/ ÁþÛJOC¦h×÷7âXIòÝ*hÿnH­wǺ8gólÕ®:,ü²"KõóDÏ~ éÅÃîÂ`£uϯ4·›kzt ¸ÞõäȘ¼cÌé §«(¢q>0 ‹YZgeosphere/src/0000755000176200001440000000000014677403144013034 5ustar liggesusersgeosphere/src/MagneticModel.cpp0000644000176200001440000002432714323400470016243 0ustar liggesusers/** * \file MagneticModel.cpp * \brief Implementation for GeographicLib::MagneticModel class * * Copyright (c) Charles Karney (2011-2021) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #include "MagneticModel.h" #include #include "SphericalEngine.h" #include "MagneticCircle.h" #include "Utility.h" #if !defined(GEOGRAPHICLIB_DATA) # if defined(_WIN32) # define GEOGRAPHICLIB_DATA "C:/ProgramData/GeographicLib" # else # define GEOGRAPHICLIB_DATA "/usr/local/share/GeographicLib" # endif #endif #if !defined(GEOGRAPHICLIB_MAGNETIC_DEFAULT_NAME) # define GEOGRAPHICLIB_MAGNETIC_DEFAULT_NAME "wmm2020" #endif #if defined(_MSC_VER) // Squelch warnings about unsafe use of getenv # pragma warning (disable: 4996) #endif namespace GeographicLib { using namespace std; MagneticModel::MagneticModel(const std::string& name, const std::string& path, const Geocentric& earth, int Nmax, int Mmax) : _name(name) , _dir(path) , _description("NONE") , _date("UNKNOWN") , _t0(Math::NaN()) , _dt0(1) , _tmin(Math::NaN()) , _tmax(Math::NaN()) , _a(Math::NaN()) , _hmin(Math::NaN()) , _hmax(Math::NaN()) , _nNmodels(1) , _nNconstants(0) , _nmx(-1) , _mmx(-1) , _norm(SphericalHarmonic::SCHMIDT) , _earth(earth) { if (_dir.empty()) _dir = DefaultMagneticPath(); bool truncate = Nmax >= 0 || Mmax >= 0; if (truncate) { if (Nmax >= 0 && Mmax < 0) Mmax = Nmax; if (Nmax < 0) Nmax = numeric_limits::max(); if (Mmax < 0) Mmax = numeric_limits::max(); } ReadMetadata(_name); _gG.resize(_nNmodels + 1 + _nNconstants); _hH.resize(_nNmodels + 1 + _nNconstants); { string coeff = _filename + ".cof"; ifstream coeffstr(coeff.c_str(), ios::binary); if (!coeffstr.good()) throw GeographicErr("Error opening " + coeff); char id[idlength_ + 1]; coeffstr.read(id, idlength_); if (!coeffstr.good()) throw GeographicErr("No header in " + coeff); id[idlength_] = '\0'; if (_id != string(id)) throw GeographicErr("ID mismatch: " + _id + " vs " + id); for (int i = 0; i < _nNmodels + 1 + _nNconstants; ++i) { int N, M; if (truncate) { N = Nmax; M = Mmax; } SphericalEngine::coeff::readcoeffs(coeffstr, N, M, _gG[i], _hH[i], truncate); if (!(M < 0 || _gG[i][0] == 0)) throw GeographicErr("A degree 0 term is not permitted"); _harm.push_back(SphericalHarmonic(_gG[i], _hH[i], N, N, M, _a, _norm)); _nmx = max(_nmx, _harm.back().Coefficients().nmx()); _mmx = max(_mmx, _harm.back().Coefficients().mmx()); } int pos = int(coeffstr.tellg()); coeffstr.seekg(0, ios::end); if (pos != coeffstr.tellg()) throw GeographicErr("Extra data in " + coeff); } } void MagneticModel::ReadMetadata(const string& name) { const char* spaces = " \t\n\v\f\r"; _filename = _dir + "/" + name + ".wmm"; ifstream metastr(_filename.c_str()); if (!metastr.good()) throw GeographicErr("Cannot open " + _filename); string line; getline(metastr, line); if (!(line.size() >= 6 && line.substr(0,5) == "WMMF-")) throw GeographicErr(_filename + " does not contain WMMF-n signature"); string::size_type n = line.find_first_of(spaces, 5); if (n != string::npos) n -= 5; string version(line, 5, n); if (!(version == "1" || version == "2")) throw GeographicErr("Unknown version in " + _filename + ": " + version); string key, val; while (getline(metastr, line)) { if (!Utility::ParseLine(line, key, val)) continue; // Process key words if (key == "Name") _name = val; else if (key == "Description") _description = val; else if (key == "ReleaseDate") _date = val; else if (key == "Radius") _a = Utility::val(val); else if (key == "Type") { if (!(val == "Linear" || val == "linear")) throw GeographicErr("Only linear models are supported"); } else if (key == "Epoch") _t0 = Utility::val(val); else if (key == "DeltaEpoch") _dt0 = Utility::val(val); else if (key == "NumModels") _nNmodels = Utility::val(val); else if (key == "NumConstants") _nNconstants = Utility::val(val); else if (key == "MinTime") _tmin = Utility::val(val); else if (key == "MaxTime") _tmax = Utility::val(val); else if (key == "MinHeight") _hmin = Utility::val(val); else if (key == "MaxHeight") _hmax = Utility::val(val); else if (key == "Normalization") { if (val == "FULL" || val == "Full" || val == "full") _norm = SphericalHarmonic::FULL; else if (val == "SCHMIDT" || val == "Schmidt" || val == "schmidt") _norm = SphericalHarmonic::SCHMIDT; else throw GeographicErr("Unknown normalization " + val); } else if (key == "ByteOrder") { if (val == "Big" || val == "big") throw GeographicErr("Only little-endian ordering is supported"); else if (!(val == "Little" || val == "little")) throw GeographicErr("Unknown byte ordering " + val); } else if (key == "ID") _id = val; // else unrecognized keywords are skipped } // Check values if (!(isfinite(_a) && _a > 0)) throw GeographicErr("Reference radius must be positive"); if (!(_t0 > 0)) throw GeographicErr("Epoch time not defined"); if (_tmin >= _tmax) throw GeographicErr("Min time exceeds max time"); if (_hmin >= _hmax) throw GeographicErr("Min height exceeds max height"); if (int(_id.size()) != idlength_) throw GeographicErr("Invalid ID"); if (_nNmodels < 1) throw GeographicErr("NumModels must be positive"); if (!(_nNconstants == 0 || _nNconstants == 1)) throw GeographicErr("NumConstants must be 0 or 1"); if (!(_dt0 > 0)) { if (_nNmodels > 1) throw GeographicErr("DeltaEpoch must be positive"); else _dt0 = 1; } } void MagneticModel::FieldGeocentric(real t, real X, real Y, real Z, real& BX, real& BY, real& BZ, real& BXt, real& BYt, real& BZt) const { t -= _t0; int n = max(min(int(floor(t / _dt0)), _nNmodels - 1), 0); bool interpolate = n + 1 < _nNmodels; t -= n * _dt0; // Components in geocentric basis // initial values to suppress warning real BXc = 0, BYc = 0, BZc = 0; _harm[n](X, Y, Z, BX, BY, BZ); _harm[n + 1](X, Y, Z, BXt, BYt, BZt); if (_nNconstants) _harm[_nNmodels + 1](X, Y, Z, BXc, BYc, BZc); if (interpolate) { // Convert to a time derivative BXt = (BXt - BX) / _dt0; BYt = (BYt - BY) / _dt0; BZt = (BZt - BZ) / _dt0; } BX += t * BXt + BXc; BY += t * BYt + BYc; BZ += t * BZt + BZc; BXt = BXt * - _a; BYt = BYt * - _a; BZt = BZt * - _a; BX *= - _a; BY *= - _a; BZ *= - _a; } void MagneticModel::Field(real t, real lat, real lon, real h, bool diffp, real& Bx, real& By, real& Bz, real& Bxt, real& Byt, real& Bzt) const { real X, Y, Z; real M[Geocentric::dim2_]; _earth.IntForward(lat, lon, h, X, Y, Z, M); // Components in geocentric basis // initial values to suppress warning real BX = 0, BY = 0, BZ = 0, BXt = 0, BYt = 0, BZt = 0; FieldGeocentric(t, X, Y, Z, BX, BY, BZ, BXt, BYt, BZt); if (diffp) Geocentric::Unrotate(M, BXt, BYt, BZt, Bxt, Byt, Bzt); Geocentric::Unrotate(M, BX, BY, BZ, Bx, By, Bz); } MagneticCircle MagneticModel::Circle(real t, real lat, real h) const { real t1 = t - _t0; int n = max(min(int(floor(t1 / _dt0)), _nNmodels - 1), 0); bool interpolate = n + 1 < _nNmodels; t1 -= n * _dt0; real X, Y, Z, M[Geocentric::dim2_]; _earth.IntForward(lat, 0, h, X, Y, Z, M); // Y = 0, cphi = M[7], sphi = M[8]; return (_nNconstants == 0 ? MagneticCircle(_a, _earth._f, lat, h, t, M[7], M[8], t1, _dt0, interpolate, _harm[n].Circle(X, Z, true), _harm[n + 1].Circle(X, Z, true)) : MagneticCircle(_a, _earth._f, lat, h, t, M[7], M[8], t1, _dt0, interpolate, _harm[n].Circle(X, Z, true), _harm[n + 1].Circle(X, Z, true), _harm[_nNmodels + 1].Circle(X, Z, true))); } void MagneticModel::FieldComponents(real Bx, real By, real Bz, real Bxt, real Byt, real Bzt, real& H, real& F, real& D, real& I, real& Ht, real& Ft, real& Dt, real& It) { H = hypot(Bx, By); Ht = H != 0 ? (Bx * Bxt + By * Byt) / H : hypot(Bxt, Byt); D = H != 0 ? Math::atan2d(Bx, By) : Math::atan2d(Bxt, Byt); Dt = (H != 0 ? (By * Bxt - Bx * Byt) / Math::sq(H) : 0) / Math::degree(); F = hypot(H, Bz); Ft = F != 0 ? (H * Ht + Bz * Bzt) / F : hypot(Ht, Bzt); I = F != 0 ? Math::atan2d(-Bz, H) : Math::atan2d(-Bzt, Ht); It = (F != 0 ? (Bz * Ht - H * Bzt) / Math::sq(F) : 0) / Math::degree(); } string MagneticModel::DefaultMagneticPath() { string path; char* magneticpath = getenv("GEOGRAPHICLIB_MAGNETIC_PATH"); if (magneticpath) path = string(magneticpath); if (!path.empty()) return path; char* datapath = getenv("GEOGRAPHICLIB_DATA"); if (datapath) path = string(datapath); return (!path.empty() ? path : string(GEOGRAPHICLIB_DATA)) + "/magnetic"; } string MagneticModel::DefaultMagneticName() { string name; char* magneticname = getenv("GEOGRAPHICLIB_MAGNETIC_NAME"); if (magneticname) name = string(magneticname); return !name.empty() ? name : string(GEOGRAPHICLIB_MAGNETIC_DEFAULT_NAME); } } // namespace GeographicLib geosphere/src/AlbersEqualArea.h0000644000176200001440000003347314323377037016207 0ustar liggesusers/** * \file AlbersEqualArea.hpp * \brief Header for GeographicLib::AlbersEqualArea class * * Copyright (c) Charles Karney (2010-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #if !defined(GEOGRAPHICLIB_ALBERSEQUALAREA_HPP) #define GEOGRAPHICLIB_ALBERSEQUALAREA_HPP 1 #include "Constants.h" namespace GeographicLib { /** * \brief Albers equal area conic projection * * Implementation taken from the report, * - J. P. Snyder, * Map Projections: A * Working Manual, USGS Professional Paper 1395 (1987), * pp. 101--102. * * This is a implementation of the equations in Snyder except that divided * differences will be [have been] used to transform the expressions into * ones which may be evaluated accurately. [In this implementation, the * projection correctly becomes the cylindrical equal area or the azimuthal * equal area projection when the standard latitude is the equator or a * pole.] * * The ellipsoid parameters, the standard parallels, and the scale on the * standard parallels are set in the constructor. Internally, the case with * two standard parallels is converted into a single standard parallel, the * latitude of minimum azimuthal scale, with an azimuthal scale specified on * this parallel. This latitude is also used as the latitude of origin which * is returned by AlbersEqualArea::OriginLatitude. The azimuthal scale on * the latitude of origin is given by AlbersEqualArea::CentralScale. The * case with two standard parallels at opposite poles is singular and is * disallowed. The central meridian (which is a trivial shift of the * longitude) is specified as the \e lon0 argument of the * AlbersEqualArea::Forward and AlbersEqualArea::Reverse functions. * AlbersEqualArea::Forward and AlbersEqualArea::Reverse also return the * meridian convergence, γ, and azimuthal scale, \e k. A small square * aligned with the cardinal directions is projected to a rectangle with * dimensions \e k (in the E-W direction) and 1/\e k (in the N-S direction). * The E-W sides of the rectangle are oriented γ degrees * counter-clockwise from the \e x axis. There is no provision in this class * for specifying a false easting or false northing or a different latitude * of origin. * * Example of use: * \include example-AlbersEqualArea.cpp * * ConicProj is a command-line utility * providing access to the functionality of LambertConformalConic and * AlbersEqualArea. **********************************************************************/ class GEOGRAPHICLIB_EXPORT AlbersEqualArea { private: typedef Math::real real; real eps_, epsx_, epsx2_, tol_, tol0_; real _a, _f, _fm, _e2, _e, _e2m, _qZ, _qx; real _sign, _lat0, _k0; real _n0, _m02, _nrho0, _k2, _txi0, _scxi0, _sxi0; static const int numit_ = 5; // Newton iterations in Reverse static const int numit0_ = 20; // Newton iterations in Init static real hyp(real x) { using std::hypot; return hypot(real(1), x); } // atanh( e * x)/ e if f > 0 // atan (sqrt(-e2) * x)/sqrt(-e2) if f < 0 // x if f = 0 real atanhee(real x) const { using std::atan; using std::atanh; return _f > 0 ? atanh(_e * x)/_e : (_f < 0 ? (atan(_e * x)/_e) : x); } // return atanh(sqrt(x))/sqrt(x) - 1, accurate for small x static real atanhxm1(real x); // Divided differences // Definition: Df(x,y) = (f(x)-f(y))/(x-y) // See: // W. M. Kahan and R. J. Fateman, // Symbolic computation of divided differences, // SIGSAM Bull. 33(2), 7-28 (1999) // https://doi.org/10.1145/334714.334716 // http://www.cs.berkeley.edu/~fateman/papers/divdiff.pdf // // General rules // h(x) = f(g(x)): Dh(x,y) = Df(g(x),g(y))*Dg(x,y) // h(x) = f(x)*g(x): // Dh(x,y) = Df(x,y)*g(x) + Dg(x,y)*f(y) // = Df(x,y)*g(y) + Dg(x,y)*f(x) // = Df(x,y)*(g(x)+g(y))/2 + Dg(x,y)*(f(x)+f(y))/2 // // sn(x) = x/sqrt(1+x^2): Dsn(x,y) = (x+y)/((sn(x)+sn(y))*(1+x^2)*(1+y^2)) static real Dsn(real x, real y, real sx, real sy) { // sx = x/hyp(x) real t = x * y; return t > 0 ? (x + y) * Math::sq( (sx * sy)/t ) / (sx + sy) : (x - y != 0 ? (sx - sy) / (x - y) : 1); } // Datanhee(x,y) = (atanee(x)-atanee(y))/(x-y) // = atanhee((x-y)/(1-e^2*x*y))/(x-y) real Datanhee(real x, real y) const { real t = x - y, d = 1 - _e2 * x * y; return t == 0 ? 1 / d : (x*y < 0 ? atanhee(x) - atanhee(y) : atanhee(t / d)) / t; } // DDatanhee(x,y) = (Datanhee(1,y) - Datanhee(1,x))/(y-x) real DDatanhee(real x, real y) const; real DDatanhee0(real x, real y) const; real DDatanhee1(real x, real y) const; real DDatanhee2(real x, real y) const; void Init(real sphi1, real cphi1, real sphi2, real cphi2, real k1); real txif(real tphi) const; real tphif(real txi) const; friend class Ellipsoid; // For access to txif, tphif, etc. public: /** * Constructor with a single standard parallel. * * @param[in] a equatorial radius of ellipsoid (meters). * @param[in] f flattening of ellipsoid. Setting \e f = 0 gives a sphere. * Negative \e f gives a prolate ellipsoid. * @param[in] stdlat standard parallel (degrees), the circle of tangency. * @param[in] k0 azimuthal scale on the standard parallel. * @exception GeographicErr if \e a, (1 − \e f) \e a, or \e k0 is * not positive. * @exception GeographicErr if \e stdlat is not in [−90°, * 90°]. **********************************************************************/ AlbersEqualArea(real a, real f, real stdlat, real k0); /** * Constructor with two standard parallels. * * @param[in] a equatorial radius of ellipsoid (meters). * @param[in] f flattening of ellipsoid. Setting \e f = 0 gives a sphere. * Negative \e f gives a prolate ellipsoid. * @param[in] stdlat1 first standard parallel (degrees). * @param[in] stdlat2 second standard parallel (degrees). * @param[in] k1 azimuthal scale on the standard parallels. * @exception GeographicErr if \e a, (1 − \e f) \e a, or \e k1 is * not positive. * @exception GeographicErr if \e stdlat1 or \e stdlat2 is not in * [−90°, 90°], or if \e stdlat1 and \e stdlat2 are * opposite poles. **********************************************************************/ AlbersEqualArea(real a, real f, real stdlat1, real stdlat2, real k1); /** * Constructor with two standard parallels specified by sines and cosines. * * @param[in] a equatorial radius of ellipsoid (meters). * @param[in] f flattening of ellipsoid. Setting \e f = 0 gives a sphere. * Negative \e f gives a prolate ellipsoid. * @param[in] sinlat1 sine of first standard parallel. * @param[in] coslat1 cosine of first standard parallel. * @param[in] sinlat2 sine of second standard parallel. * @param[in] coslat2 cosine of second standard parallel. * @param[in] k1 azimuthal scale on the standard parallels. * @exception GeographicErr if \e a, (1 − \e f) \e a, or \e k1 is * not positive. * @exception GeographicErr if \e stdlat1 or \e stdlat2 is not in * [−90°, 90°], or if \e stdlat1 and \e stdlat2 are * opposite poles. * * This allows parallels close to the poles to be specified accurately. * This routine computes the latitude of origin and the azimuthal scale at * this latitude. If \e dlat = abs(\e lat2 − \e lat1) ≤ 160°, * then the error in the latitude of origin is less than 4.5 × * 10−14d;. **********************************************************************/ AlbersEqualArea(real a, real f, real sinlat1, real coslat1, real sinlat2, real coslat2, real k1); /** * Set the azimuthal scale for the projection. * * @param[in] lat (degrees). * @param[in] k azimuthal scale at latitude \e lat (default 1). * @exception GeographicErr \e k is not positive. * @exception GeographicErr if \e lat is not in (−90°, * 90°). * * This allows a "latitude of conformality" to be specified. **********************************************************************/ void SetScale(real lat, real k = real(1)); /** * Forward projection, from geographic to Lambert conformal conic. * * @param[in] lon0 central meridian longitude (degrees). * @param[in] lat latitude of point (degrees). * @param[in] lon longitude of point (degrees). * @param[out] x easting of point (meters). * @param[out] y northing of point (meters). * @param[out] gamma meridian convergence at point (degrees). * @param[out] k azimuthal scale of projection at point; the radial * scale is the 1/\e k. * * The latitude origin is given by AlbersEqualArea::LatitudeOrigin(). No * false easting or northing is added and \e lat should be in the range * [−90°, 90°]. The values of \e x and \e y returned for * points which project to infinity (i.e., one or both of the poles) will * be large but finite. **********************************************************************/ void Forward(real lon0, real lat, real lon, real& x, real& y, real& gamma, real& k) const; /** * Reverse projection, from Lambert conformal conic to geographic. * * @param[in] lon0 central meridian longitude (degrees). * @param[in] x easting of point (meters). * @param[in] y northing of point (meters). * @param[out] lat latitude of point (degrees). * @param[out] lon longitude of point (degrees). * @param[out] gamma meridian convergence at point (degrees). * @param[out] k azimuthal scale of projection at point; the radial * scale is the 1/\e k. * * The latitude origin is given by AlbersEqualArea::LatitudeOrigin(). No * false easting or northing is added. The value of \e lon returned is in * the range [−180°, 180°]. The value of \e lat returned is * in the range [−90°, 90°]. If the input point is outside * the legal projected space the nearest pole is returned. **********************************************************************/ void Reverse(real lon0, real x, real y, real& lat, real& lon, real& gamma, real& k) const; /** * AlbersEqualArea::Forward without returning the convergence and * scale. **********************************************************************/ void Forward(real lon0, real lat, real lon, real& x, real& y) const { real gamma, k; Forward(lon0, lat, lon, x, y, gamma, k); } /** * AlbersEqualArea::Reverse without returning the convergence and * scale. **********************************************************************/ void Reverse(real lon0, real x, real y, real& lat, real& lon) const { real gamma, k; Reverse(lon0, x, y, lat, lon, gamma, k); } /** \name Inspector functions **********************************************************************/ ///@{ /** * @return \e a the equatorial radius of the ellipsoid (meters). This is * the value used in the constructor. **********************************************************************/ Math::real EquatorialRadius() const { return _a; } /** * @return \e f the flattening of the ellipsoid. This is the value used in * the constructor. **********************************************************************/ Math::real Flattening() const { return _f; } /** * @return latitude of the origin for the projection (degrees). * * This is the latitude of minimum azimuthal scale and equals the \e stdlat * in the 1-parallel constructor and lies between \e stdlat1 and \e stdlat2 * in the 2-parallel constructors. **********************************************************************/ Math::real OriginLatitude() const { return _lat0; } /** * @return central scale for the projection. This is the azimuthal scale * on the latitude of origin. **********************************************************************/ Math::real CentralScale() const { return _k0; } ///@} /** * A global instantiation of AlbersEqualArea with the WGS84 ellipsoid, \e * stdlat = 0, and \e k0 = 1. This degenerates to the cylindrical equal * area projection. **********************************************************************/ static const AlbersEqualArea& CylindricalEqualArea(); /** * A global instantiation of AlbersEqualArea with the WGS84 ellipsoid, \e * stdlat = 90°, and \e k0 = 1. This degenerates to the * Lambert azimuthal equal area projection. **********************************************************************/ static const AlbersEqualArea& AzimuthalEqualAreaNorth(); /** * A global instantiation of AlbersEqualArea with the WGS84 ellipsoid, \e * stdlat = −90°, and \e k0 = 1. This degenerates to the * Lambert azimuthal equal area projection. **********************************************************************/ static const AlbersEqualArea& AzimuthalEqualAreaSouth(); }; } // namespace GeographicLib #endif // GEOGRAPHICLIB_ALBERSEQUALAREA_HPP geosphere/src/NormalGravity.cpp0000644000176200001440000002551414323376012016334 0ustar liggesusers/** * \file NormalGravity.cpp * \brief Implementation for GeographicLib::NormalGravity class * * Copyright (c) Charles Karney (2011-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #include "NormalGravity.h" #if defined(_MSC_VER) // Squelch warnings about constant conditional expressions # pragma warning (disable: 4127) #endif namespace GeographicLib { using namespace std; void NormalGravity::Initialize(real a, real GM, real omega, real f_J2, bool geometricp) { _a = a; if (!(isfinite(_a) && _a > 0)) throw GeographicErr("Equatorial radius is not positive"); _gGM = GM; if (!isfinite(_gGM)) throw GeographicErr("Gravitational constant is not finite"); _omega = omega; _omega2 = Math::sq(_omega); _aomega2 = Math::sq(_omega * _a); if (!(isfinite(_omega2) && isfinite(_aomega2))) throw GeographicErr("Rotation velocity is not finite"); _f = geometricp ? f_J2 : J2ToFlattening(_a, _gGM, _omega, f_J2); _b = _a * (1 - _f); if (!(isfinite(_b) && _b > 0)) throw GeographicErr("Polar semi-axis is not positive"); _jJ2 = geometricp ? FlatteningToJ2(_a, _gGM, _omega, f_J2) : f_J2; _e2 = _f * (2 - _f); _ep2 = _e2 / (1 - _e2); real ex2 = _f < 0 ? -_e2 : _ep2; _qQ0 = Qf(ex2, _f < 0); _earth = Geocentric(_a, _f); _eE = _a * sqrt(fabs(_e2)); // H+M, Eq 2-54 // H+M, Eq 2-61 _uU0 = _gGM * atanzz(ex2, _f < 0) / _b + _aomega2 / 3; real P = Hf(ex2, _f < 0) / (6 * _qQ0); // H+M, Eq 2-73 _gammae = _gGM / (_a * _b) - (1 + P) * _a * _omega2; // H+M, Eq 2-74 _gammap = _gGM / (_a * _a) + 2 * P * _b * _omega2; // k = gammae * (b * gammap / (a * gammae) - 1) // = (b * gammap - a * gammae) / a _k = -_e2 * _gGM / (_a * _b) + _omega2 * (P * (_a + 2 * _b * (1 - _f)) + _a); // f* = (gammap - gammae) / gammae _fstar = (-_f * _gGM / (_a * _b) + _omega2 * (P * (_a + 2 * _b) + _a)) / _gammae; } NormalGravity::NormalGravity(real a, real GM, real omega, real f_J2, bool geometricp) { Initialize(a, GM, omega, f_J2, geometricp); } const NormalGravity& NormalGravity::WGS84() { static const NormalGravity wgs84(Constants::WGS84_a(), Constants::WGS84_GM(), Constants::WGS84_omega(), Constants::WGS84_f(), true); return wgs84; } const NormalGravity& NormalGravity::GRS80() { static const NormalGravity grs80(Constants::GRS80_a(), Constants::GRS80_GM(), Constants::GRS80_omega(), Constants::GRS80_J2(), false); return grs80; } Math::real NormalGravity::atan7series(real x) { // compute -sum( (-x)^n/(2*n+7), n, 0, inf) // = -1/7 + x/9 - x^2/11 + x^3/13 ... // = (atan(sqrt(x))/sqrt(x)-(1-x/3+x^2/5)) / x^3 (x > 0) // = (atanh(sqrt(-x))/sqrt(-x)-(1-x/3+x^2/5)) / x^3 (x < 0) // require abs(x) < 1/2, but better to restrict calls to abs(x) < 1/4 static const real lg2eps_ = -log2(numeric_limits::epsilon() / 2); int e; frexp(x, &e); e = max(-e, 1); // Here's where abs(x) < 1/2 is assumed // x = [0.5,1) * 2^(-e) // estimate n s.t. x^n/n < 1/7 * epsilon/2 // a stronger condition is x^n < epsilon/2 // taking log2 of both sides, a stronger condition is n*(-e) < -lg2eps; // or n*e > lg2eps or n > ceiling(lg2eps/e) int n = x == 0 ? 1 : int(ceil(lg2eps_ / e)); Math::real v = 0; while (n--) // iterating from n-1 down to 0 v = - x * v - 1/Math::real(2*n + 7); return v; } Math::real NormalGravity::atan5series(real x) { // Compute Taylor series approximations to // (atan(z)-(z-z^3/3))/z^5, // z = sqrt(x) // require abs(x) < 1/2, but better to restrict calls to abs(x) < 1/4 return 1/real(5) + x * atan7series(x); } Math::real NormalGravity::Qf(real x, bool alt) { // Compute // Q(z) = (((1 + 3/z^2) * atan(z) - 3/z)/2) / z^3 // = q(z)/z^3 with q(z) defined by H+M, Eq 2-57 with z = E/u // z = sqrt(x) real y = alt ? -x / (1 + x) : x; return !(4 * fabs(y) < 1) ? // Backwards test to allow NaNs through ((1 + 3/y) * atanzz(x, alt) - 3/y) / (2 * y) : (3 * (3 + y) * atan5series(y) - 1) / 6; } Math::real NormalGravity::Hf(real x, bool alt) { // z = sqrt(x) // Compute // H(z) = (3*Q(z)+z*diff(Q(z),z))*(1+z^2) // = (3 * (1 + 1/z^2) * (1 - atan(z)/z) - 1) / z^2 // = q'(z)/z^2, with q'(z) defined by H+M, Eq 2-67, with z = E/u real y = alt ? -x / (1 + x) : x; return !(4 * fabs(y) < 1) ? // Backwards test to allow NaNs through (3 * (1 + 1/y) * (1 - atanzz(x, alt)) - 1) / y : 1 - 3 * (1 + y) * atan5series(y); } Math::real NormalGravity::QH3f(real x, bool alt) { // z = sqrt(x) // (Q(z) - H(z)/3) / z^2 // = - (1+z^2)/(3*z) * d(Q(z))/dz - Q(z) // = ((15+9*z^2)*atan(z)-4*z^3-15*z)/(6*z^7) // = ((25+15*z^2)*atan7+3)/10 real y = alt ? -x / (1 + x) : x; return !(4 * fabs(y) < 1) ? // Backwards test to allow NaNs through ((9 + 15/y) * atanzz(x, alt) - 4 - 15/y) / (6 * Math::sq(y)) : ((25 + 15*y) * atan7series(y) + 3)/10; } Math::real NormalGravity::Jn(int n) const { // Note Jn(0) = -1; Jn(2) = _jJ2; Jn(odd) = 0 if (n & 1 || n < 0) return 0; n /= 2; real e2n = 1; // Perhaps this should just be e2n = pow(-_e2, n); for (int j = n; j--;) e2n *= -_e2; return // H+M, Eq 2-92 -3 * e2n * ((1 - n) + 5 * n * _jJ2 / _e2) / ((2 * n + 1) * (2 * n + 3)); } Math::real NormalGravity::SurfaceGravity(real lat) const { real sphi = Math::sind(Math::LatFix(lat)); // H+M, Eq 2-78 return (_gammae + _k * Math::sq(sphi)) / sqrt(1 - _e2 * Math::sq(sphi)); } Math::real NormalGravity::V0(real X, real Y, real Z, real& GammaX, real& GammaY, real& GammaZ) const { // See H+M, Sec 6-2 real p = hypot(X, Y), clam = p != 0 ? X/p : 1, slam = p != 0 ? Y/p : 0, r = hypot(p, Z); if (_f < 0) swap(p, Z); real Q = Math::sq(r) - Math::sq(_eE), t2 = Math::sq(2 * _eE * Z), disc = sqrt(Math::sq(Q) + t2), // This is H+M, Eq 6-8a, but generalized to deal with Q negative // accurately. u = sqrt((Q >= 0 ? (Q + disc) : t2 / (disc - Q)) / 2), uE = hypot(u, _eE), // H+M, Eq 6-8b sbet = u != 0 ? Z * uE : copysign(sqrt(-Q), Z), cbet = u != 0 ? p * u : p, s = hypot(cbet, sbet); sbet = s != 0 ? sbet/s : 1; cbet = s != 0 ? cbet/s : 0; real z = _eE/u, z2 = Math::sq(z), den = hypot(u, _eE * sbet); if (_f < 0) { swap(sbet, cbet); swap(u, uE); } real invw = uE / den, // H+M, Eq 2-63 bu = _b / (u != 0 || _f < 0 ? u : _eE), // Qf(z2->inf, false) = pi/(4*z^3) q = ((u != 0 || _f < 0 ? Qf(z2, _f < 0) : Math::pi() / 4) / _qQ0) * bu * Math::sq(bu), qp = _b * Math::sq(bu) * (u != 0 || _f < 0 ? Hf(z2, _f < 0) : 2) / _qQ0, ang = (Math::sq(sbet) - 1/real(3)) / 2, // H+M, Eqs 2-62 + 6-9, but omitting last (rotational) term. Vres = _gGM * (u != 0 || _f < 0 ? atanzz(z2, _f < 0) / u : Math::pi() / (2 * _eE)) + _aomega2 * q * ang, // H+M, Eq 6-10 gamu = - (_gGM + (_aomega2 * qp * ang)) * invw / Math::sq(uE), gamb = _aomega2 * q * sbet * cbet * invw / uE, t = u * invw / uE, gamp = t * cbet * gamu - invw * sbet * gamb; // H+M, Eq 6-12 GammaX = gamp * clam; GammaY = gamp * slam; GammaZ = invw * sbet * gamu + t * cbet * gamb; return Vres; } Math::real NormalGravity::Phi(real X, real Y, real& fX, real& fY) const { fX = _omega2 * X; fY = _omega2 * Y; // N.B. fZ = 0; return _omega2 * (Math::sq(X) + Math::sq(Y)) / 2; } Math::real NormalGravity::U(real X, real Y, real Z, real& gammaX, real& gammaY, real& gammaZ) const { real fX, fY; real Ures = V0(X, Y, Z, gammaX, gammaY, gammaZ) + Phi(X, Y, fX, fY); gammaX += fX; gammaY += fY; return Ures; } Math::real NormalGravity::Gravity(real lat, real h, real& gammay, real& gammaz) const { real X, Y, Z; real M[Geocentric::dim2_]; _earth.IntForward(lat, 0, h, X, Y, Z, M); real gammaX, gammaY, gammaZ, Ures = U(X, Y, Z, gammaX, gammaY, gammaZ); // gammax = M[0] * gammaX + M[3] * gammaY + M[6] * gammaZ; gammay = M[1] * gammaX + M[4] * gammaY + M[7] * gammaZ; gammaz = M[2] * gammaX + M[5] * gammaY + M[8] * gammaZ; return Ures; } Math::real NormalGravity::J2ToFlattening(real a, real GM, real omega, real J2) { // Solve // f = e^2 * (1 - K * e/q0) - 3 * J2 = 0 // for e^2 using Newton's method static const real maxe_ = 1 - numeric_limits::epsilon(); static const real eps2_ = sqrt(numeric_limits::epsilon()) / 100; real K = 2 * Math::sq(a * omega) * a / (15 * GM), J0 = (1 - 4 * K / Math::pi()) / 3; if (!(GM > 0 && isfinite(K) && K >= 0)) return Math::NaN(); if (!(isfinite(J2) && J2 <= J0)) return Math::NaN(); if (J2 == J0) return 1; // Solve e2 - f1 * f2 * K / Q0 - 3 * J2 = 0 for J2 close to J0; // subst e2 = ep2/(1+ep2), f2 = 1/(1+ep2), f1 = 1/sqrt(1+ep2), J2 = J0-dJ2, // Q0 = pi/(4*z^3) - 2/z^4 + (3*pi)/(4*z^5), z = sqrt(ep2), and balance two // leading terms to give real ep2 = fmax(Math::sq(32 * K / (3 * Math::sq(Math::pi()) * (J0 - J2))), -maxe_), e2 = fmin(ep2 / (1 + ep2), maxe_); for (int j = 0; j < maxit_ || GEOGRAPHICLIB_PANIC; ++j) { real e2a = e2, ep2a = ep2, f2 = 1 - e2, // (1 - f)^2 f1 = sqrt(f2), // (1 - f) Q0 = Qf(e2 < 0 ? -e2 : ep2, e2 < 0), h = e2 - f1 * f2 * K / Q0 - 3 * J2, dh = 1 - 3 * f1 * K * QH3f(e2 < 0 ? -e2 : ep2, e2 < 0) / (2 * Math::sq(Q0)); e2 = fmin(e2a - h / dh, maxe_); ep2 = fmax(e2 / (1 - e2), -maxe_); if (fabs(h) < eps2_ || e2 == e2a || ep2 == ep2a) break; } return e2 / (1 + sqrt(1 - e2)); } Math::real NormalGravity::FlatteningToJ2(real a, real GM, real omega, real f) { real K = 2 * Math::sq(a * omega) * a / (15 * GM), f1 = 1 - f, f2 = Math::sq(f1), e2 = f * (2 - f); // H+M, Eq 2-90 + 2-92' return (e2 - K * f1 * f2 / Qf(f < 0 ? -e2 : e2 / f2, f < 0)) / 3; } } // namespace GeographicLib geosphere/src/GeodesicLineExact.h0000644000176200001440000007277314323377037016543 0ustar liggesusers/** * \file GeodesicLineExact.hpp * \brief Header for GeographicLib::GeodesicLineExact class * * Copyright (c) Charles Karney (2012-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #if !defined(GEOGRAPHICLIB_GEODESICLINEEXACT_HPP) #define GEOGRAPHICLIB_GEODESICLINEEXACT_HPP 1 #include "Constants.h" #include "GeodesicExact.h" #include "EllipticFunction.h" #include namespace GeographicLib { /** * \brief An exact geodesic line * * GeodesicLineExact facilitates the determination of a series of points on a * single geodesic. This is a companion to the GeodesicExact class. For * additional information on this class see the documentation on the * GeodesicLine class. * * Example of use: * \include example-GeodesicLineExact.cpp * * GeodSolve is a command-line utility * providing access to the functionality of GeodesicExact and * GeodesicLineExact (via the -E option). **********************************************************************/ class GeodesicLineExact { private: typedef Math::real real; friend class GeodesicExact; int _nC4; real tiny_; real _lat1, _lon1, _azi1; real _a, _f, _b, _c2, _f1, _e2, _salp0, _calp0, _k2, _salp1, _calp1, _ssig1, _csig1, _dn1, _stau1, _ctau1, _somg1, _comg1, _cchi1, _aA4, _eE0, _dD0, _hH0, _eE1, _dD1, _hH1; real _a13, _s13; real _bB41; std::vector _cC4a; EllipticFunction _eE; unsigned _caps; void LineInit(const GeodesicExact& g, real lat1, real lon1, real azi1, real salp1, real calp1, unsigned caps); GeodesicLineExact(const GeodesicExact& g, real lat1, real lon1, real azi1, real salp1, real calp1, unsigned caps, bool arcmode, real s13_a13); enum captype { CAP_NONE = GeodesicExact::CAP_NONE, CAP_E = GeodesicExact::CAP_E, CAP_D = GeodesicExact::CAP_D, CAP_H = GeodesicExact::CAP_H, CAP_C4 = GeodesicExact::CAP_C4, CAP_ALL = GeodesicExact::CAP_ALL, CAP_MASK = GeodesicExact::CAP_MASK, OUT_ALL = GeodesicExact::OUT_ALL, OUT_MASK = GeodesicExact::OUT_MASK, }; public: /** * Bit masks for what calculations to do. They signify to the * GeodesicLineExact::GeodesicLineExact constructor and to * GeodesicExact::Line what capabilities should be included in the * GeodesicLineExact object. This is merely a duplication of * GeodesicExact::mask. **********************************************************************/ enum mask { /** * No capabilities, no output. * @hideinitializer **********************************************************************/ NONE = GeodesicExact::NONE, /** * Calculate latitude \e lat2. (It's not necessary to include this as a * capability to GeodesicLineExact because this is included by default.) * @hideinitializer **********************************************************************/ LATITUDE = GeodesicExact::LATITUDE, /** * Calculate longitude \e lon2. * @hideinitializer **********************************************************************/ LONGITUDE = GeodesicExact::LONGITUDE, /** * Calculate azimuths \e azi1 and \e azi2. (It's not necessary to * include this as a capability to GeodesicLineExact because this is * included by default.) * @hideinitializer **********************************************************************/ AZIMUTH = GeodesicExact::AZIMUTH, /** * Calculate distance \e s12. * @hideinitializer **********************************************************************/ DISTANCE = GeodesicExact::DISTANCE, /** * A combination of the common capabilities: GeodesicLineExact::LATITUDE, * GeodesicLineExact::LONGITUDE, GeodesicLineExact::AZIMUTH, * GeodesicLineExact::DISTANCE. * @hideinitializer **********************************************************************/ STANDARD = GeodesicExact::STANDARD, /** * Allow distance \e s12 to be used as input in the direct geodesic * problem. * @hideinitializer **********************************************************************/ DISTANCE_IN = GeodesicExact::DISTANCE_IN, /** * Calculate reduced length \e m12. * @hideinitializer **********************************************************************/ REDUCEDLENGTH = GeodesicExact::REDUCEDLENGTH, /** * Calculate geodesic scales \e M12 and \e M21. * @hideinitializer **********************************************************************/ GEODESICSCALE = GeodesicExact::GEODESICSCALE, /** * Calculate area \e S12. * @hideinitializer **********************************************************************/ AREA = GeodesicExact::AREA, /** * Unroll \e lon2 in the direct calculation. * @hideinitializer **********************************************************************/ LONG_UNROLL = GeodesicExact::LONG_UNROLL, /** * All capabilities, calculate everything. (LONG_UNROLL is not * included in this mask.) * @hideinitializer **********************************************************************/ ALL = GeodesicExact::ALL, }; /** \name Constructors **********************************************************************/ ///@{ /** * Constructor for a geodesic line staring at latitude \e lat1, longitude * \e lon1, and azimuth \e azi1 (all in degrees). * * @param[in] g A GeodesicExact object used to compute the necessary * information about the GeodesicLineExact. * @param[in] lat1 latitude of point 1 (degrees). * @param[in] lon1 longitude of point 1 (degrees). * @param[in] azi1 azimuth at point 1 (degrees). * @param[in] caps bitor'ed combination of GeodesicLineExact::mask values * specifying the capabilities the GeodesicLineExact object should * possess, i.e., which quantities can be returned in calls to * GeodesicLine::Position. * * \e lat1 should be in the range [−90°, 90°]. * * The GeodesicLineExact::mask values are * - \e caps |= GeodesicLineExact::LATITUDE for the latitude \e lat2; this * is added automatically; * - \e caps |= GeodesicLineExact::LONGITUDE for the latitude \e lon2; * - \e caps |= GeodesicLineExact::AZIMUTH for the latitude \e azi2; this * is added automatically; * - \e caps |= GeodesicLineExact::DISTANCE for the distance \e s12; * - \e caps |= GeodesicLineExact::REDUCEDLENGTH for the reduced length \e * m12; * - \e caps |= GeodesicLineExact::GEODESICSCALE for the geodesic scales \e * M12 and \e M21; * - \e caps |= GeodesicLineExact::AREA for the area \e S12; * - \e caps |= GeodesicLineExact::DISTANCE_IN permits the length of the * geodesic to be given in terms of \e s12; without this capability the * length can only be specified in terms of arc length; * - \e caps |= GeodesicLineExact::ALL for all of the above. * . * The default value of \e caps is GeodesicLineExact::ALL. * * If the point is at a pole, the azimuth is defined by keeping \e lon1 * fixed, writing \e lat1 = ±(90° − ε), and taking * the limit ε → 0+. **********************************************************************/ GEOGRAPHICLIB_EXPORT GeodesicLineExact(const GeodesicExact& g, real lat1, real lon1, real azi1, unsigned caps = ALL); /** * A default constructor. If GeodesicLineExact::Position is called on the * resulting object, it returns immediately (without doing any * calculations). The object can be set with a call to * GeodesicExact::Line. Use Init() to test whether object is still in this * uninitialized state. **********************************************************************/ GEOGRAPHICLIB_EXPORT GeodesicLineExact() : _caps(0U) {} ///@} /** \name Position in terms of distance **********************************************************************/ ///@{ /** * Compute the position of point 2 which is a distance \e s12 (meters) * from point 1. * * @param[in] s12 distance from point 1 to point 2 (meters); it can be * signed. * @param[out] lat2 latitude of point 2 (degrees). * @param[out] lon2 longitude of point 2 (degrees); requires that the * GeodesicLineExact object was constructed with \e caps |= * GeodesicLineExact::LONGITUDE. * @param[out] azi2 (forward) azimuth at point 2 (degrees). * @param[out] m12 reduced length of geodesic (meters); requires that the * GeodesicLineExact object was constructed with \e caps |= * GeodesicLineExact::REDUCEDLENGTH. * @param[out] M12 geodesic scale of point 2 relative to point 1 * (dimensionless); requires that the GeodesicLineExact object was * constructed with \e caps |= GeodesicLineExact::GEODESICSCALE. * @param[out] M21 geodesic scale of point 1 relative to point 2 * (dimensionless); requires that the GeodesicLineExact object was * constructed with \e caps |= GeodesicLineExact::GEODESICSCALE. * @param[out] S12 area under the geodesic (meters2); requires * that the GeodesicLineExact object was constructed with \e caps |= * GeodesicLineExact::AREA. * @return \e a12 arc length from point 1 to point 2 (degrees). * * The values of \e lon2 and \e azi2 returned are in the range * [−180°, 180°]. * * The GeodesicLineExact object \e must have been constructed with \e caps * |= GeodesicLineExact::DISTANCE_IN; otherwise Math::NaN() is returned and * no parameters are set. Requesting a value which the GeodesicLineExact * object is not capable of computing is not an error; the corresponding * argument will not be altered. * * The following functions are overloaded versions of * GeodesicLineExact::Position which omit some of the output parameters. * Note, however, that the arc length is always computed and returned as * the function value. **********************************************************************/ Math::real GEOGRAPHICLIB_EXPORT Position(real s12, real& lat2, real& lon2, real& azi2, real& m12, real& M12, real& M21, real& S12) const { real t; return GenPosition(false, s12, LATITUDE | LONGITUDE | AZIMUTH | REDUCEDLENGTH | GEODESICSCALE | AREA, lat2, lon2, azi2, t, m12, M12, M21, S12); } /** * See the documentation for GeodesicLineExact::Position. **********************************************************************/ Math::real GEOGRAPHICLIB_EXPORT Position(real s12, real& lat2, real& lon2) const { real t; return GenPosition(false, s12, LATITUDE | LONGITUDE, lat2, lon2, t, t, t, t, t, t); } /** * See the documentation for GeodesicLineExact::Position. **********************************************************************/ Math::real GEOGRAPHICLIB_EXPORT Position(real s12, real& lat2, real& lon2, real& azi2) const { real t; return GenPosition(false, s12, LATITUDE | LONGITUDE | AZIMUTH, lat2, lon2, azi2, t, t, t, t, t); } /** * See the documentation for GeodesicLineExact::Position. **********************************************************************/ Math::real GEOGRAPHICLIB_EXPORT Position(real s12, real& lat2, real& lon2, real& azi2, real& m12) const { real t; return GenPosition(false, s12, LATITUDE | LONGITUDE | AZIMUTH | REDUCEDLENGTH, lat2, lon2, azi2, t, m12, t, t, t); } /** * See the documentation for GeodesicLineExact::Position. **********************************************************************/ Math::real GEOGRAPHICLIB_EXPORT Position(real s12, real& lat2, real& lon2, real& azi2, real& M12, real& M21) const { real t; return GenPosition(false, s12, LATITUDE | LONGITUDE | AZIMUTH | GEODESICSCALE, lat2, lon2, azi2, t, t, M12, M21, t); } /** * See the documentation for GeodesicLineExact::Position. **********************************************************************/ Math::real GEOGRAPHICLIB_EXPORT Position(real s12, real& lat2, real& lon2, real& azi2, real& m12, real& M12, real& M21) const { real t; return GenPosition(false, s12, LATITUDE | LONGITUDE | AZIMUTH | REDUCEDLENGTH | GEODESICSCALE, lat2, lon2, azi2, t, m12, M12, M21, t); } ///@} /** \name Position in terms of arc length **********************************************************************/ ///@{ /** * Compute the position of point 2 which is an arc length \e a12 (degrees) * from point 1. * * @param[in] a12 arc length from point 1 to point 2 (degrees); it can * be signed. * @param[out] lat2 latitude of point 2 (degrees). * @param[out] lon2 longitude of point 2 (degrees); requires that the * GeodesicLineExact object was constructed with \e caps |= * GeodesicLineExact::LONGITUDE. * @param[out] azi2 (forward) azimuth at point 2 (degrees). * @param[out] s12 distance from point 1 to point 2 (meters); requires * that the GeodesicLineExact object was constructed with \e caps |= * GeodesicLineExact::DISTANCE. * @param[out] m12 reduced length of geodesic (meters); requires that the * GeodesicLineExact object was constructed with \e caps |= * GeodesicLineExact::REDUCEDLENGTH. * @param[out] M12 geodesic scale of point 2 relative to point 1 * (dimensionless); requires that the GeodesicLineExact object was * constructed with \e caps |= GeodesicLineExact::GEODESICSCALE. * @param[out] M21 geodesic scale of point 1 relative to point 2 * (dimensionless); requires that the GeodesicLineExact object was * constructed with \e caps |= GeodesicLineExact::GEODESICSCALE. * @param[out] S12 area under the geodesic (meters2); requires * that the GeodesicLineExact object was constructed with \e caps |= * GeodesicLineExact::AREA. * * The values of \e lon2 and \e azi2 returned are in the range * [−180°, 180°]. * * Requesting a value which the GeodesicLineExact object is not capable of * computing is not an error; the corresponding argument will not be * altered. * * The following functions are overloaded versions of * GeodesicLineExact::ArcPosition which omit some of the output parameters. **********************************************************************/ void GEOGRAPHICLIB_EXPORT ArcPosition(real a12, real& lat2, real& lon2, real& azi2, real& s12, real& m12, real& M12, real& M21, real& S12) const { GenPosition(true, a12, LATITUDE | LONGITUDE | AZIMUTH | DISTANCE | REDUCEDLENGTH | GEODESICSCALE | AREA, lat2, lon2, azi2, s12, m12, M12, M21, S12); } /** * See the documentation for GeodesicLineExact::ArcPosition. **********************************************************************/ void GEOGRAPHICLIB_EXPORT ArcPosition(real a12, real& lat2, real& lon2) const { real t; GenPosition(true, a12, LATITUDE | LONGITUDE, lat2, lon2, t, t, t, t, t, t); } /** * See the documentation for GeodesicLineExact::ArcPosition. **********************************************************************/ void GEOGRAPHICLIB_EXPORT ArcPosition(real a12, real& lat2, real& lon2, real& azi2) const { real t; GenPosition(true, a12, LATITUDE | LONGITUDE | AZIMUTH, lat2, lon2, azi2, t, t, t, t, t); } /** * See the documentation for GeodesicLineExact::ArcPosition. **********************************************************************/ void GEOGRAPHICLIB_EXPORT ArcPosition(real a12, real& lat2, real& lon2, real& azi2, real& s12) const { real t; GenPosition(true, a12, LATITUDE | LONGITUDE | AZIMUTH | DISTANCE, lat2, lon2, azi2, s12, t, t, t, t); } /** * See the documentation for GeodesicLineExact::ArcPosition. **********************************************************************/ void GEOGRAPHICLIB_EXPORT ArcPosition(real a12, real& lat2, real& lon2, real& azi2, real& s12, real& m12) const { real t; GenPosition(true, a12, LATITUDE | LONGITUDE | AZIMUTH | DISTANCE | REDUCEDLENGTH, lat2, lon2, azi2, s12, m12, t, t, t); } /** * See the documentation for GeodesicLineExact::ArcPosition. **********************************************************************/ void GEOGRAPHICLIB_EXPORT ArcPosition(real a12, real& lat2, real& lon2, real& azi2, real& s12, real& M12, real& M21) const { real t; GenPosition(true, a12, LATITUDE | LONGITUDE | AZIMUTH | DISTANCE | GEODESICSCALE, lat2, lon2, azi2, s12, t, M12, M21, t); } /** * See the documentation for GeodesicLineExact::ArcPosition. **********************************************************************/ void GEOGRAPHICLIB_EXPORT ArcPosition(real a12, real& lat2, real& lon2, real& azi2, real& s12, real& m12, real& M12, real& M21) const { real t; GenPosition(true, a12, LATITUDE | LONGITUDE | AZIMUTH | DISTANCE | REDUCEDLENGTH | GEODESICSCALE, lat2, lon2, azi2, s12, m12, M12, M21, t); } ///@} /** \name The general position function. **********************************************************************/ ///@{ /** * The general position function. GeodesicLineExact::Position and * GeodesicLineExact::ArcPosition are defined in terms of this function. * * @param[in] arcmode boolean flag determining the meaning of the second * parameter; if \e arcmode is false, then the GeodesicLineExact object * must have been constructed with \e caps |= * GeodesicLineExact::DISTANCE_IN. * @param[in] s12_a12 if \e arcmode is false, this is the distance between * point 1 and point 2 (meters); otherwise it is the arc length between * point 1 and point 2 (degrees); it can be signed. * @param[in] outmask a bitor'ed combination of GeodesicLineExact::mask * values specifying which of the following parameters should be set. * @param[out] lat2 latitude of point 2 (degrees). * @param[out] lon2 longitude of point 2 (degrees); requires that the * GeodesicLineExact object was constructed with \e caps |= * GeodesicLineExact::LONGITUDE. * @param[out] azi2 (forward) azimuth at point 2 (degrees). * @param[out] s12 distance from point 1 to point 2 (meters); requires * that the GeodesicLineExact object was constructed with \e caps |= * GeodesicLineExact::DISTANCE. * @param[out] m12 reduced length of geodesic (meters); requires that the * GeodesicLineExact object was constructed with \e caps |= * GeodesicLineExact::REDUCEDLENGTH. * @param[out] M12 geodesic scale of point 2 relative to point 1 * (dimensionless); requires that the GeodesicLineExact object was * constructed with \e caps |= GeodesicLineExact::GEODESICSCALE. * @param[out] M21 geodesic scale of point 1 relative to point 2 * (dimensionless); requires that the GeodesicLineExact object was * constructed with \e caps |= GeodesicLineExact::GEODESICSCALE. * @param[out] S12 area under the geodesic (meters2); requires * that the GeodesicLineExact object was constructed with \e caps |= * GeodesicLineExact::AREA. * @return \e a12 arc length from point 1 to point 2 (degrees). * * The GeodesicLineExact::mask values possible for \e outmask are * - \e outmask |= GeodesicLineExact::LATITUDE for the latitude \e lat2; * - \e outmask |= GeodesicLineExact::LONGITUDE for the latitude \e lon2; * - \e outmask |= GeodesicLineExact::AZIMUTH for the latitude \e azi2; * - \e outmask |= GeodesicLineExact::DISTANCE for the distance \e s12; * - \e outmask |= GeodesicLineExact::REDUCEDLENGTH for the reduced length * \e m12; * - \e outmask |= GeodesicLineExact::GEODESICSCALE for the geodesic scales * \e M12 and \e M21; * - \e outmask |= GeodesicLineExact::AREA for the area \e S12; * - \e outmask |= GeodesicLineExact::ALL for all of the above; * - \e outmask |= GeodesicLineExact::LONG_UNROLL to unroll \e lon2 instead * of wrapping it into the range [−180°, 180°]. * . * Requesting a value which the GeodesicLineExact object is not capable of * computing is not an error; the corresponding argument will not be * altered. Note, however, that the arc length is always computed and * returned as the function value. * * With the GeodesicLineExact::LONG_UNROLL bit set, the quantity \e lon2 * − \e lon1 indicates how many times and in what sense the geodesic * encircles the ellipsoid. **********************************************************************/ Math::real GEOGRAPHICLIB_EXPORT GenPosition(bool arcmode, real s12_a12, unsigned outmask, real& lat2, real& lon2, real& azi2, real& s12, real& m12, real& M12, real& M21, real& S12) const; ///@} /** \name Setting point 3 **********************************************************************/ ///@{ /** * Specify position of point 3 in terms of distance. * * @param[in] s13 the distance from point 1 to point 3 (meters); it * can be negative. * * This is only useful if the GeodesicLineExact object has been constructed * with \e caps |= GeodesicLineExact::DISTANCE_IN. **********************************************************************/ void GEOGRAPHICLIB_EXPORT SetDistance(real s13); /** * Specify position of point 3 in terms of arc length. * * @param[in] a13 the arc length from point 1 to point 3 (degrees); it * can be negative. * * The distance \e s13 is only set if the GeodesicLineExact object has been * constructed with \e caps |= GeodesicLineExact::DISTANCE. **********************************************************************/ void GEOGRAPHICLIB_EXPORT SetArc(real a13); /** * Specify position of point 3 in terms of either distance or arc length. * * @param[in] arcmode boolean flag determining the meaning of the second * parameter; if \e arcmode is false, then the GeodesicLineExact object * must have been constructed with \e caps |= * GeodesicLineExact::DISTANCE_IN. * @param[in] s13_a13 if \e arcmode is false, this is the distance from * point 1 to point 3 (meters); otherwise it is the arc length from * point 1 to point 3 (degrees); it can be negative. **********************************************************************/ void GEOGRAPHICLIB_EXPORT GenSetDistance(bool arcmode, real s13_a13); /** \name Inspector functions **********************************************************************/ ///@{ /** * @return true if the object has been initialized. **********************************************************************/ bool GEOGRAPHICLIB_EXPORT Init() const { return _caps != 0U; } /** * @return \e lat1 the latitude of point 1 (degrees). **********************************************************************/ Math::real GEOGRAPHICLIB_EXPORT Latitude() const { return Init() ? _lat1 : Math::NaN(); } /** * @return \e lon1 the longitude of point 1 (degrees). **********************************************************************/ Math::real GEOGRAPHICLIB_EXPORT Longitude() const { return Init() ? _lon1 : Math::NaN(); } /** * @return \e azi1 the azimuth (degrees) of the geodesic line at point 1. **********************************************************************/ Math::real GEOGRAPHICLIB_EXPORT Azimuth() const { return Init() ? _azi1 : Math::NaN(); } /** * The sine and cosine of \e azi1. * * @param[out] sazi1 the sine of \e azi1. * @param[out] cazi1 the cosine of \e azi1. **********************************************************************/ void GEOGRAPHICLIB_EXPORT Azimuth(real& sazi1, real& cazi1) const { if (Init()) { sazi1 = _salp1; cazi1 = _calp1; } } /** * @return \e azi0 the azimuth (degrees) of the geodesic line as it crosses * the equator in a northward direction. * * The result lies in [−90°, 90°]. **********************************************************************/ Math::real GEOGRAPHICLIB_EXPORT EquatorialAzimuth() const { return Init() ? Math::atan2d(_salp0, _calp0) : Math::NaN(); } /** * The sine and cosine of \e azi0. * * @param[out] sazi0 the sine of \e azi0. * @param[out] cazi0 the cosine of \e azi0. **********************************************************************/ void GEOGRAPHICLIB_EXPORT EquatorialAzimuth(real& sazi0, real& cazi0) const { if (Init()) { sazi0 = _salp0; cazi0 = _calp0; } } /** * @return \e a1 the arc length (degrees) between the northward equatorial * crossing and point 1. * * The result lies in [−180°, 180°]. **********************************************************************/ Math::real GEOGRAPHICLIB_EXPORT EquatorialArc() const { using std::atan2; return Init() ? atan2(_ssig1, _csig1) / Math::degree() : Math::NaN(); } /** * @return \e a the equatorial radius of the ellipsoid (meters). This is * the value inherited from the GeodesicExact object used in the * constructor. **********************************************************************/ Math::real GEOGRAPHICLIB_EXPORT EquatorialRadius() const { return Init() ? _a : Math::NaN(); } /** * @return \e f the flattening of the ellipsoid. This is the value * inherited from the GeodesicExact object used in the constructor. **********************************************************************/ Math::real GEOGRAPHICLIB_EXPORT Flattening() const { return Init() ? _f : Math::NaN(); } /** * @return \e caps the computational capabilities that this object was * constructed with. LATITUDE and AZIMUTH are always included. **********************************************************************/ unsigned GEOGRAPHICLIB_EXPORT Capabilities() const { return _caps; } /** * Test what capabilities are available. * * @param[in] testcaps a set of bitor'ed GeodesicLineExact::mask values. * @return true if the GeodesicLineExact object has all these capabilities. **********************************************************************/ bool GEOGRAPHICLIB_EXPORT Capabilities(unsigned testcaps) const { testcaps &= OUT_ALL; return (_caps & testcaps) == testcaps; } /** * The distance or arc length to point 3. * * @param[in] arcmode boolean flag determining the meaning of returned * value. * @return \e s13 if \e arcmode is false; \e a13 if \e arcmode is true. **********************************************************************/ Math::real GEOGRAPHICLIB_EXPORT GenDistance(bool arcmode) const { return Init() ? (arcmode ? _a13 : _s13) : Math::NaN(); } /** * @return \e s13, the distance to point 3 (meters). **********************************************************************/ Math::real GEOGRAPHICLIB_EXPORT Distance() const { return GenDistance(false); } /** * @return \e a13, the arc length to point 3 (degrees). **********************************************************************/ Math::real GEOGRAPHICLIB_EXPORT Arc() const { return GenDistance(true); } ///@} }; } // namespace GeographicLib #endif // GEOGRAPHICLIB_GEODESICLINEEXACT_HPP geosphere/src/RcppExports.cpp0000644000176200001440000001334614430062652016030 0ustar liggesusers// Generated by using Rcpp::compileAttributes() -> do not edit by hand // Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 #include using namespace Rcpp; #ifdef RCPP_USE_GLOBAL_ROSTREAM Rcpp::Rostream& Rcpp::Rcout = Rcpp::Rcpp_cout_get(); Rcpp::Rostream& Rcpp::Rcerr = Rcpp::Rcpp_cerr_get(); #endif // geodesic std::vector geodesic(std::vector lon1, std::vector lat1, std::vector azi1, std::vector s12, double a, double f); RcppExport SEXP _geosphere_geodesic(SEXP lon1SEXP, SEXP lat1SEXP, SEXP azi1SEXP, SEXP s12SEXP, SEXP aSEXP, SEXP fSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< std::vector >::type lon1(lon1SEXP); Rcpp::traits::input_parameter< std::vector >::type lat1(lat1SEXP); Rcpp::traits::input_parameter< std::vector >::type azi1(azi1SEXP); Rcpp::traits::input_parameter< std::vector >::type s12(s12SEXP); Rcpp::traits::input_parameter< double >::type a(aSEXP); Rcpp::traits::input_parameter< double >::type f(fSEXP); rcpp_result_gen = Rcpp::wrap(geodesic(lon1, lat1, azi1, s12, a, f)); return rcpp_result_gen; END_RCPP } // inversegeodesic std::vector inversegeodesic(std::vector lon1, std::vector lat1, std::vector lon2, std::vector lat2, double a, double f); RcppExport SEXP _geosphere_inversegeodesic(SEXP lon1SEXP, SEXP lat1SEXP, SEXP lon2SEXP, SEXP lat2SEXP, SEXP aSEXP, SEXP fSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< std::vector >::type lon1(lon1SEXP); Rcpp::traits::input_parameter< std::vector >::type lat1(lat1SEXP); Rcpp::traits::input_parameter< std::vector >::type lon2(lon2SEXP); Rcpp::traits::input_parameter< std::vector >::type lat2(lat2SEXP); Rcpp::traits::input_parameter< double >::type a(aSEXP); Rcpp::traits::input_parameter< double >::type f(fSEXP); rcpp_result_gen = Rcpp::wrap(inversegeodesic(lon1, lat1, lon2, lat2, a, f)); return rcpp_result_gen; END_RCPP } // polygonarea std::vector polygonarea(std::vector lon, std::vector lat, double a, double f); RcppExport SEXP _geosphere_polygonarea(SEXP lonSEXP, SEXP latSEXP, SEXP aSEXP, SEXP fSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< std::vector >::type lon(lonSEXP); Rcpp::traits::input_parameter< std::vector >::type lat(latSEXP); Rcpp::traits::input_parameter< double >::type a(aSEXP); Rcpp::traits::input_parameter< double >::type f(fSEXP); rcpp_result_gen = Rcpp::wrap(polygonarea(lon, lat, a, f)); return rcpp_result_gen; END_RCPP } // geodesic_nodes std::vector> geodesic_nodes(double lon1, double lat1, double lon2, double lat2, size_t n, double distance, bool arc, double a, double f); RcppExport SEXP _geosphere_geodesic_nodes(SEXP lon1SEXP, SEXP lat1SEXP, SEXP lon2SEXP, SEXP lat2SEXP, SEXP nSEXP, SEXP distanceSEXP, SEXP arcSEXP, SEXP aSEXP, SEXP fSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< double >::type lon1(lon1SEXP); Rcpp::traits::input_parameter< double >::type lat1(lat1SEXP); Rcpp::traits::input_parameter< double >::type lon2(lon2SEXP); Rcpp::traits::input_parameter< double >::type lat2(lat2SEXP); Rcpp::traits::input_parameter< size_t >::type n(nSEXP); Rcpp::traits::input_parameter< double >::type distance(distanceSEXP); Rcpp::traits::input_parameter< bool >::type arc(arcSEXP); Rcpp::traits::input_parameter< double >::type a(aSEXP); Rcpp::traits::input_parameter< double >::type f(fSEXP); rcpp_result_gen = Rcpp::wrap(geodesic_nodes(lon1, lat1, lon2, lat2, n, distance, arc, a, f)); return rcpp_result_gen; END_RCPP } // osgb std::vector osgb(std::vector x, std::vector y, std::string p, bool geo); RcppExport SEXP _geosphere_osgb(SEXP xSEXP, SEXP ySEXP, SEXP pSEXP, SEXP geoSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< std::vector >::type x(xSEXP); Rcpp::traits::input_parameter< std::vector >::type y(ySEXP); Rcpp::traits::input_parameter< std::string >::type p(pSEXP); Rcpp::traits::input_parameter< bool >::type geo(geoSEXP); rcpp_result_gen = Rcpp::wrap(osgb(x, y, p, geo)); return rcpp_result_gen; END_RCPP } // osgb_rev std::vector osgb_rev(std::vector g, int prec, bool centerp); RcppExport SEXP _geosphere_osgb_rev(SEXP gSEXP, SEXP precSEXP, SEXP centerpSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< std::vector >::type g(gSEXP); Rcpp::traits::input_parameter< int >::type prec(precSEXP); Rcpp::traits::input_parameter< bool >::type centerp(centerpSEXP); rcpp_result_gen = Rcpp::wrap(osgb_rev(g, prec, centerp)); return rcpp_result_gen; END_RCPP } static const R_CallMethodDef CallEntries[] = { {"_geosphere_geodesic", (DL_FUNC) &_geosphere_geodesic, 6}, {"_geosphere_inversegeodesic", (DL_FUNC) &_geosphere_inversegeodesic, 6}, {"_geosphere_polygonarea", (DL_FUNC) &_geosphere_polygonarea, 4}, {"_geosphere_geodesic_nodes", (DL_FUNC) &_geosphere_geodesic_nodes, 9}, {"_geosphere_osgb", (DL_FUNC) &_geosphere_osgb, 4}, {"_geosphere_osgb_rev", (DL_FUNC) &_geosphere_osgb_rev, 3}, {NULL, NULL, 0} }; RcppExport void R_init_geosphere(DllInfo *dll) { R_registerRoutines(dll, NULL, CallEntries, NULL, NULL); R_useDynamicSymbols(dll, FALSE); } geosphere/src/EllipticFunction.h0000644000176200001440000006570614323377037016475 0ustar liggesusers/** * \file EllipticFunction.hpp * \brief Header for GeographicLib::EllipticFunction class * * Copyright (c) Charles Karney (2008-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #if !defined(GEOGRAPHICLIB_ELLIPTICFUNCTION_HPP) #define GEOGRAPHICLIB_ELLIPTICFUNCTION_HPP 1 #include "Constants.h" namespace GeographicLib { /** * \brief Elliptic integrals and functions * * This provides the elliptic functions and integrals needed for Ellipsoid, * GeodesicExact, and TransverseMercatorExact. Two categories of function * are provided: * - \e static functions to compute symmetric elliptic integrals * (https://dlmf.nist.gov/19.16.i) * - \e member functions to compute Legrendre's elliptic * integrals (https://dlmf.nist.gov/19.2.ii) and the * Jacobi elliptic functions (https://dlmf.nist.gov/22.2). * . * In the latter case, an object is constructed giving the modulus \e k (and * optionally the parameter α2). The modulus is always * passed as its square k2 which allows \e k to be pure * imaginary (k2 < 0). (Confusingly, Abramowitz and * Stegun call \e m = k2 the "parameter" and \e n = * α2 the "characteristic".) * * In geodesic applications, it is convenient to separate the incomplete * integrals into secular and periodic components, e.g., * \f[ * E(\phi, k) = (2 E(k) / \pi) [ \phi + \delta E(\phi, k) ] * \f] * where δ\e E(φ, \e k) is an odd periodic function with period * π. * * The computation of the elliptic integrals uses the algorithms given in * - B. C. Carlson, * Computation of real or * complex elliptic integrals, Numerical Algorithms 10, 13--26 (1995); * preprint. * . * with the additional optimizations given in https://dlmf.nist.gov/19.36.i. * The computation of the Jacobi elliptic functions uses the algorithm given * in * - R. Bulirsch, * Numerical Calculation of * Elliptic Integrals and Elliptic Functions, Numericshe Mathematik 7, * 78--90 (1965). * . * The notation follows https://dlmf.nist.gov/19 and https://dlmf.nist.gov/22 * * Example of use: * \include example-EllipticFunction.cpp **********************************************************************/ class GEOGRAPHICLIB_EXPORT EllipticFunction { private: typedef Math::real real; enum { num_ = 13 }; // Max depth required for sncndn; probably 5 is enough. real _k2, _kp2, _alpha2, _alphap2, _eps; real _kKc, _eEc, _dDc, _pPic, _gGc, _hHc; public: /** \name Constructor **********************************************************************/ ///@{ /** * Constructor specifying the modulus and parameter. * * @param[in] k2 the square of the modulus k2. * k2 must lie in (−∞, 1]. * @param[in] alpha2 the parameter α2. * α2 must lie in (−∞, 1]. * @exception GeographicErr if \e k2 or \e alpha2 is out of its legal * range. * * If only elliptic integrals of the first and second kinds are needed, * then set α2 = 0 (the default value); in this case, we * have Π(φ, 0, \e k) = \e F(φ, \e k), \e G(φ, 0, \e k) = \e * E(φ, \e k), and \e H(φ, 0, \e k) = \e F(φ, \e k) - \e * D(φ, \e k). **********************************************************************/ EllipticFunction(real k2 = 0, real alpha2 = 0) { Reset(k2, alpha2); } /** * Constructor specifying the modulus and parameter and their complements. * * @param[in] k2 the square of the modulus k2. * k2 must lie in (−∞, 1]. * @param[in] alpha2 the parameter α2. * α2 must lie in (−∞, 1]. * @param[in] kp2 the complementary modulus squared k'2 = * 1 − k2. This must lie in [0, ∞). * @param[in] alphap2 the complementary parameter α'2 = 1 * − α2. This must lie in [0, ∞). * @exception GeographicErr if \e k2, \e alpha2, \e kp2, or \e alphap2 is * out of its legal range. * * The arguments must satisfy \e k2 + \e kp2 = 1 and \e alpha2 + \e alphap2 * = 1. (No checking is done that these conditions are met.) This * constructor is provided to enable accuracy to be maintained, e.g., when * \e k is very close to unity. **********************************************************************/ EllipticFunction(real k2, real alpha2, real kp2, real alphap2) { Reset(k2, alpha2, kp2, alphap2); } /** * Reset the modulus and parameter. * * @param[in] k2 the new value of square of the modulus * k2 which must lie in (−∞, ]. * done.) * @param[in] alpha2 the new value of parameter α2. * α2 must lie in (−∞, 1]. * @exception GeographicErr if \e k2 or \e alpha2 is out of its legal * range. **********************************************************************/ void Reset(real k2 = 0, real alpha2 = 0) { Reset(k2, alpha2, 1 - k2, 1 - alpha2); } /** * Reset the modulus and parameter supplying also their complements. * * @param[in] k2 the square of the modulus k2. * k2 must lie in (−∞, 1]. * @param[in] alpha2 the parameter α2. * α2 must lie in (−∞, 1]. * @param[in] kp2 the complementary modulus squared k'2 = * 1 − k2. This must lie in [0, ∞). * @param[in] alphap2 the complementary parameter α'2 = 1 * − α2. This must lie in [0, ∞). * @exception GeographicErr if \e k2, \e alpha2, \e kp2, or \e alphap2 is * out of its legal range. * * The arguments must satisfy \e k2 + \e kp2 = 1 and \e alpha2 + \e alphap2 * = 1. (No checking is done that these conditions are met.) This * constructor is provided to enable accuracy to be maintained, e.g., when * is very small. **********************************************************************/ void Reset(real k2, real alpha2, real kp2, real alphap2); ///@} /** \name Inspector functions. **********************************************************************/ ///@{ /** * @return the square of the modulus k2. **********************************************************************/ Math::real k2() const { return _k2; } /** * @return the square of the complementary modulus k'2 = * 1 − k2. **********************************************************************/ Math::real kp2() const { return _kp2; } /** * @return the parameter α2. **********************************************************************/ Math::real alpha2() const { return _alpha2; } /** * @return the complementary parameter α'2 = 1 − * α2. **********************************************************************/ Math::real alphap2() const { return _alphap2; } ///@} /** \name Complete elliptic integrals. **********************************************************************/ ///@{ /** * The complete integral of the first kind. * * @return \e K(\e k). * * \e K(\e k) is defined in https://dlmf.nist.gov/19.2.E4 * \f[ * K(k) = \int_0^{\pi/2} \frac1{\sqrt{1-k^2\sin^2\phi}}\,d\phi. * \f] **********************************************************************/ Math::real K() const { return _kKc; } /** * The complete integral of the second kind. * * @return \e E(\e k). * * \e E(\e k) is defined in https://dlmf.nist.gov/19.2.E5 * \f[ * E(k) = \int_0^{\pi/2} \sqrt{1-k^2\sin^2\phi}\,d\phi. * \f] **********************************************************************/ Math::real E() const { return _eEc; } /** * Jahnke's complete integral. * * @return \e D(\e k). * * \e D(\e k) is defined in https://dlmf.nist.gov/19.2.E6 * \f[ * D(k) = * \int_0^{\pi/2} \frac{\sin^2\phi}{\sqrt{1-k^2\sin^2\phi}}\,d\phi. * \f] **********************************************************************/ Math::real D() const { return _dDc; } /** * The difference between the complete integrals of the first and second * kinds. * * @return \e K(\e k) − \e E(\e k). **********************************************************************/ Math::real KE() const { return _k2 * _dDc; } /** * The complete integral of the third kind. * * @return Π(α2, \e k). * * Π(α2, \e k) is defined in * https://dlmf.nist.gov/19.2.E7 * \f[ * \Pi(\alpha^2, k) = \int_0^{\pi/2} * \frac1{\sqrt{1-k^2\sin^2\phi}(1 - \alpha^2\sin^2\phi)}\,d\phi. * \f] **********************************************************************/ Math::real Pi() const { return _pPic; } /** * Legendre's complete geodesic longitude integral. * * @return \e G(α2, \e k). * * \e G(α2, \e k) is given by * \f[ * G(\alpha^2, k) = \int_0^{\pi/2} * \frac{\sqrt{1-k^2\sin^2\phi}}{1 - \alpha^2\sin^2\phi}\,d\phi. * \f] **********************************************************************/ Math::real G() const { return _gGc; } /** * Cayley's complete geodesic longitude difference integral. * * @return \e H(α2, \e k). * * \e H(α2, \e k) is given by * \f[ * H(\alpha^2, k) = \int_0^{\pi/2} * \frac{\cos^2\phi}{(1-\alpha^2\sin^2\phi)\sqrt{1-k^2\sin^2\phi}} * \,d\phi. * \f] **********************************************************************/ Math::real H() const { return _hHc; } ///@} /** \name Incomplete elliptic integrals. **********************************************************************/ ///@{ /** * The incomplete integral of the first kind. * * @param[in] phi * @return \e F(φ, \e k). * * \e F(φ, \e k) is defined in https://dlmf.nist.gov/19.2.E4 * \f[ * F(\phi, k) = \int_0^\phi \frac1{\sqrt{1-k^2\sin^2\theta}}\,d\theta. * \f] **********************************************************************/ Math::real F(real phi) const; /** * The incomplete integral of the second kind. * * @param[in] phi * @return \e E(φ, \e k). * * \e E(φ, \e k) is defined in https://dlmf.nist.gov/19.2.E5 * \f[ * E(\phi, k) = \int_0^\phi \sqrt{1-k^2\sin^2\theta}\,d\theta. * \f] **********************************************************************/ Math::real E(real phi) const; /** * The incomplete integral of the second kind with the argument given in * degrees. * * @param[in] ang in degrees. * @return \e E(π ang/180, \e k). **********************************************************************/ Math::real Ed(real ang) const; /** * The inverse of the incomplete integral of the second kind. * * @param[in] x * @return φ = E−1(\e x, \e k); i.e., the * solution of such that \e E(φ, \e k) = \e x. **********************************************************************/ Math::real Einv(real x) const; /** * The incomplete integral of the third kind. * * @param[in] phi * @return Π(φ, α2, \e k). * * Π(φ, α2, \e k) is defined in * https://dlmf.nist.gov/19.2.E7 * \f[ * \Pi(\phi, \alpha^2, k) = \int_0^\phi * \frac1{\sqrt{1-k^2\sin^2\theta}(1 - \alpha^2\sin^2\theta)}\,d\theta. * \f] **********************************************************************/ Math::real Pi(real phi) const; /** * Jahnke's incomplete elliptic integral. * * @param[in] phi * @return \e D(φ, \e k). * * \e D(φ, \e k) is defined in https://dlmf.nist.gov/19.2.E4 * \f[ * D(\phi, k) = \int_0^\phi * \frac{\sin^2\theta}{\sqrt{1-k^2\sin^2\theta}}\,d\theta. * \f] **********************************************************************/ Math::real D(real phi) const; /** * Legendre's geodesic longitude integral. * * @param[in] phi * @return \e G(φ, α2, \e k). * * \e G(φ, α2, \e k) is defined by * \f[ * \begin{align} * G(\phi, \alpha^2, k) &= * \frac{k^2}{\alpha^2} F(\phi, k) + * \biggl(1 - \frac{k^2}{\alpha^2}\biggr) \Pi(\phi, \alpha^2, k) \\ * &= \int_0^\phi * \frac{\sqrt{1-k^2\sin^2\theta}}{1 - \alpha^2\sin^2\theta}\,d\theta. * \end{align} * \f] * * Legendre expresses the longitude of a point on the geodesic in terms of * this combination of elliptic integrals in Exercices de Calcul * Intégral, Vol. 1 (1811), p. 181, * https://books.google.com/books?id=riIOAAAAQAAJ&pg=PA181. * * See \ref geodellip for the expression for the longitude in terms of this * function. **********************************************************************/ Math::real G(real phi) const; /** * Cayley's geodesic longitude difference integral. * * @param[in] phi * @return \e H(φ, α2, \e k). * * \e H(φ, α2, \e k) is defined by * \f[ * \begin{align} * H(\phi, \alpha^2, k) &= * \frac1{\alpha^2} F(\phi, k) + * \biggl(1 - \frac1{\alpha^2}\biggr) \Pi(\phi, \alpha^2, k) \\ * &= \int_0^\phi * \frac{\cos^2\theta} * {(1-\alpha^2\sin^2\theta)\sqrt{1-k^2\sin^2\theta}} * \,d\theta. * \end{align} * \f] * * Cayley expresses the longitude difference of a point on the geodesic in * terms of this combination of elliptic integrals in Phil. Mag. 40 * (1870), p. 333, https://books.google.com/books?id=Zk0wAAAAIAAJ&pg=PA333. * * See \ref geodellip for the expression for the longitude in terms of this * function. **********************************************************************/ Math::real H(real phi) const; ///@} /** \name Incomplete integrals in terms of Jacobi elliptic functions. **********************************************************************/ ///@{ /** * The incomplete integral of the first kind in terms of Jacobi elliptic * functions. * * @param[in] sn = sinφ. * @param[in] cn = cosφ. * @param[in] dn = sqrt(1 − k2 * sin2φ). * @return \e F(φ, \e k) as though φ ∈ (−π, π]. **********************************************************************/ Math::real F(real sn, real cn, real dn) const; /** * The incomplete integral of the second kind in terms of Jacobi elliptic * functions. * * @param[in] sn = sinφ. * @param[in] cn = cosφ. * @param[in] dn = sqrt(1 − k2 * sin2φ). * @return \e E(φ, \e k) as though φ ∈ (−π, π]. **********************************************************************/ Math::real E(real sn, real cn, real dn) const; /** * The incomplete integral of the third kind in terms of Jacobi elliptic * functions. * * @param[in] sn = sinφ. * @param[in] cn = cosφ. * @param[in] dn = sqrt(1 − k2 * sin2φ). * @return Π(φ, α2, \e k) as though φ ∈ * (−π, π]. **********************************************************************/ Math::real Pi(real sn, real cn, real dn) const; /** * Jahnke's incomplete elliptic integral in terms of Jacobi elliptic * functions. * * @param[in] sn = sinφ. * @param[in] cn = cosφ. * @param[in] dn = sqrt(1 − k2 * sin2φ). * @return \e D(φ, \e k) as though φ ∈ (−π, π]. **********************************************************************/ Math::real D(real sn, real cn, real dn) const; /** * Legendre's geodesic longitude integral in terms of Jacobi elliptic * functions. * * @param[in] sn = sinφ. * @param[in] cn = cosφ. * @param[in] dn = sqrt(1 − k2 * sin2φ). * @return \e G(φ, α2, \e k) as though φ ∈ * (−π, π]. **********************************************************************/ Math::real G(real sn, real cn, real dn) const; /** * Cayley's geodesic longitude difference integral in terms of Jacobi * elliptic functions. * * @param[in] sn = sinφ. * @param[in] cn = cosφ. * @param[in] dn = sqrt(1 − k2 * sin2φ). * @return \e H(φ, α2, \e k) as though φ ∈ * (−π, π]. **********************************************************************/ Math::real H(real sn, real cn, real dn) const; ///@} /** \name Periodic versions of incomplete elliptic integrals. **********************************************************************/ ///@{ /** * The periodic incomplete integral of the first kind. * * @param[in] sn = sinφ. * @param[in] cn = cosφ. * @param[in] dn = sqrt(1 − k2 * sin2φ). * @return the periodic function π \e F(φ, \e k) / (2 \e K(\e k)) - * φ. **********************************************************************/ Math::real deltaF(real sn, real cn, real dn) const; /** * The periodic incomplete integral of the second kind. * * @param[in] sn = sinφ. * @param[in] cn = cosφ. * @param[in] dn = sqrt(1 − k2 * sin2φ). * @return the periodic function π \e E(φ, \e k) / (2 \e E(\e k)) - * φ. **********************************************************************/ Math::real deltaE(real sn, real cn, real dn) const; /** * The periodic inverse of the incomplete integral of the second kind. * * @param[in] stau = sinτ. * @param[in] ctau = sinτ. * @return the periodic function E−1(τ (2 \e * E(\e k)/π), \e k) - τ. **********************************************************************/ Math::real deltaEinv(real stau, real ctau) const; /** * The periodic incomplete integral of the third kind. * * @param[in] sn = sinφ. * @param[in] cn = cosφ. * @param[in] dn = sqrt(1 − k2 * sin2φ). * @return the periodic function π Π(φ, α2, * \e k) / (2 Π(α2, \e k)) - φ. **********************************************************************/ Math::real deltaPi(real sn, real cn, real dn) const; /** * The periodic Jahnke's incomplete elliptic integral. * * @param[in] sn = sinφ. * @param[in] cn = cosφ. * @param[in] dn = sqrt(1 − k2 * sin2φ). * @return the periodic function π \e D(φ, \e k) / (2 \e D(\e k)) - * φ. **********************************************************************/ Math::real deltaD(real sn, real cn, real dn) const; /** * Legendre's periodic geodesic longitude integral. * * @param[in] sn = sinφ. * @param[in] cn = cosφ. * @param[in] dn = sqrt(1 − k2 * sin2φ). * @return the periodic function π \e G(φ, \e k) / (2 \e G(\e k)) - * φ. **********************************************************************/ Math::real deltaG(real sn, real cn, real dn) const; /** * Cayley's periodic geodesic longitude difference integral. * * @param[in] sn = sinφ. * @param[in] cn = cosφ. * @param[in] dn = sqrt(1 − k2 * sin2φ). * @return the periodic function π \e H(φ, \e k) / (2 \e H(\e k)) - * φ. **********************************************************************/ Math::real deltaH(real sn, real cn, real dn) const; ///@} /** \name Elliptic functions. **********************************************************************/ ///@{ /** * The Jacobi elliptic functions. * * @param[in] x the argument. * @param[out] sn sn(\e x, \e k). * @param[out] cn cn(\e x, \e k). * @param[out] dn dn(\e x, \e k). **********************************************************************/ void sncndn(real x, real& sn, real& cn, real& dn) const; /** * The Δ amplitude function. * * @param[in] sn sinφ. * @param[in] cn cosφ. * @return Δ = sqrt(1 − k2 * sin2φ). **********************************************************************/ Math::real Delta(real sn, real cn) const { using std::sqrt; return sqrt(_k2 < 0 ? 1 - _k2 * sn*sn : _kp2 + _k2 * cn*cn); } ///@} /** \name Symmetric elliptic integrals. **********************************************************************/ ///@{ /** * Symmetric integral of the first kind RF. * * @param[in] x * @param[in] y * @param[in] z * @return RF(\e x, \e y, \e z). * * RF is defined in https://dlmf.nist.gov/19.16.E1 * \f[ R_F(x, y, z) = \frac12 * \int_0^\infty\frac1{\sqrt{(t + x) (t + y) (t + z)}}\, dt, \f] * where at most one of arguments, \e x, \e y, \e z, can be zero and those * arguments that are nonzero must be positive. If one of the arguments is * zero, it is more efficient to call the two-argument version of this * function with the non-zero arguments. **********************************************************************/ static real RF(real x, real y, real z); /** * Complete symmetric integral of the first kind, * RF with one argument zero. * * @param[in] x * @param[in] y * @return RF(\e x, \e y, 0). * * The arguments \e x and \e y must be positive. **********************************************************************/ static real RF(real x, real y); /** * Degenerate symmetric integral of the first kind * RC. * * @param[in] x * @param[in] y * @return RC(\e x, \e y) = * RF(\e x, \e y, \e y). * * RC is defined in https://dlmf.nist.gov/19.2.E17 * \f[ R_C(x, y) = \frac12 * \int_0^\infty\frac1{\sqrt{t + x}(t + y)}\,dt, \f] * where \e x ≥ 0 and \e y > 0. **********************************************************************/ static real RC(real x, real y); /** * Symmetric integral of the second kind RG. * * @param[in] x * @param[in] y * @param[in] z * @return RG(\e x, \e y, \e z). * * RG is defined in Carlson, eq 1.5 * \f[ R_G(x, y, z) = \frac14 * \int_0^\infty[(t + x) (t + y) (t + z)]^{-1/2} * \biggl( * \frac x{t + x} + \frac y{t + y} + \frac z{t + z} * \biggr)t\,dt, \f] * where at most one of arguments, \e x, \e y, \e z, can be zero and those * arguments that are nonzero must be positive. See also * https://dlmf.nist.gov/19.23.E6_5. If one of the arguments is zero, it * is more efficient to call the two-argument version of this function with * the non-zero arguments. **********************************************************************/ static real RG(real x, real y, real z); /** * Complete symmetric integral of the second kind, * RG with one argument zero. * * @param[in] x * @param[in] y * @return RG(\e x, \e y, 0). * * The arguments \e x and \e y must be positive. **********************************************************************/ static real RG(real x, real y); /** * Symmetric integral of the third kind RJ. * * @param[in] x * @param[in] y * @param[in] z * @param[in] p * @return RJ(\e x, \e y, \e z, \e p). * * RJ is defined in https://dlmf.nist.gov/19.16.E2 * \f[ R_J(x, y, z, p) = \frac32 * \int_0^\infty * [(t + x) (t + y) (t + z)]^{-1/2} (t + p)^{-1}\, dt, \f] * where \e p > 0, and \e x, \e y, \e z are nonnegative with at most one of * them being 0. **********************************************************************/ static real RJ(real x, real y, real z, real p); /** * Degenerate symmetric integral of the third kind * RD. * * @param[in] x * @param[in] y * @param[in] z * @return RD(\e x, \e y, \e z) = * RJ(\e x, \e y, \e z, \e z). * * RD is defined in https://dlmf.nist.gov/19.16.E5 * \f[ R_D(x, y, z) = \frac32 * \int_0^\infty[(t + x) (t + y)]^{-1/2} (t + z)^{-3/2}\, dt, \f] * where \e x, \e y, \e z are positive except that at most one of \e x and * \e y can be 0. **********************************************************************/ static real RD(real x, real y, real z); ///@} }; } // namespace GeographicLib #endif // GEOGRAPHICLIB_ELLIPTICFUNCTION_HPP geosphere/src/Geohash.cpp0000644000176200001440000000715014323376011015107 0ustar liggesusers/** * \file Geohash.cpp * \brief Implementation for GeographicLib::Geohash class * * Copyright (c) Charles Karney (2012-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #include "Geohash.h" #include "Utility.h" #if defined(_MSC_VER) // Squelch warnings about enum-float expressions # pragma warning (disable: 5055) #endif namespace GeographicLib { using namespace std; const char* const Geohash::lcdigits_ = "0123456789bcdefghjkmnpqrstuvwxyz"; const char* const Geohash::ucdigits_ = "0123456789BCDEFGHJKMNPQRSTUVWXYZ"; void Geohash::Forward(real lat, real lon, int len, string& geohash) { using std::isnan; // Needed for Centos 7, ubuntu 14 static const real shift = ldexp(real(1), 45); static const real loneps = Math::hd / shift; static const real lateps = Math::qd / shift; if (fabs(lat) > Math::qd) throw GeographicErr("Latitude " + Utility::str(lat) + "d not in [-" + to_string(Math::qd) + "d, " + to_string(Math::qd) + "d]"); if (isnan(lat) || isnan(lon)) { geohash = "invalid"; return; } if (lat == Math::qd) lat -= lateps / 2; lon = Math::AngNormalize(lon); if (lon == Math::hd) lon = -Math::hd; // lon now in [-180,180) // lon/loneps in [-2^45,2^45); lon/loneps + shift in [0,2^46) // similarly for lat len = max(0, min(int(maxlen_), len)); unsigned long long ulon = (unsigned long long)(floor(lon/loneps) + shift), ulat = (unsigned long long)(floor(lat/lateps) + shift); char geohash1[maxlen_]; unsigned byte = 0; for (unsigned i = 0; i < 5 * unsigned(len);) { if ((i & 1) == 0) { byte = (byte << 1) + unsigned((ulon & mask_) != 0); ulon <<= 1; } else { byte = (byte << 1) + unsigned((ulat & mask_) != 0); ulat <<= 1; } ++i; if (i % 5 == 0) { geohash1[(i/5)-1] = lcdigits_[byte]; byte = 0; } } geohash.resize(len); copy(geohash1, geohash1 + len, geohash.begin()); } void Geohash::Reverse(const string& geohash, real& lat, real& lon, int& len, bool centerp) { static const real shift = ldexp(real(1), 45); static const real loneps = Math::hd / shift; static const real lateps = Math::qd / shift; int len1 = min(int(maxlen_), int(geohash.length())); if (len1 >= 3 && ((toupper(geohash[0]) == 'I' && toupper(geohash[1]) == 'N' && toupper(geohash[2]) == 'V') || // Check A first because it is not in a standard geohash (toupper(geohash[1]) == 'A' && toupper(geohash[0]) == 'N' && toupper(geohash[2]) == 'N'))) { lat = lon = Math::NaN(); return; } unsigned long long ulon = 0, ulat = 0; for (unsigned k = 0, j = 0; k < unsigned(len1); ++k) { int byte = Utility::lookup(ucdigits_, geohash[k]); if (byte < 0) throw GeographicErr("Illegal character in geohash " + geohash); for (unsigned m = 16; m; m >>= 1) { if (j == 0) ulon = (ulon << 1) + unsigned((byte & m) != 0); else ulat = (ulat << 1) + unsigned((byte & m) != 0); j ^= 1; } } ulon <<= 1; ulat <<= 1; if (centerp) { ulon += 1; ulat += 1; } int s = 5 * (maxlen_ - len1); ulon <<= (s / 2); ulat <<= s - (s / 2); lon = ulon * loneps - Math::hd; lat = ulat * lateps - Math::qd; len = len1; } } // namespace GeographicLib geosphere/src/intersect.cpp0000644000176200001440000001037214677360355015551 0ustar liggesusers/* // https://sourceforge.net/p/geographiclib/discussion/1026621/thread/21aaff9f/?page=1#51e7 // Find intersection of two geodesics #include #include #include #include class vector3 { public: double _x, _y, _z; vector3(double x, double y, double z = 1) throw() : _x(x) , _y(y) , _z(z) {} vector3 cross(const vector3& b) const throw() { return vector3(_y * b._z - _z * b._y, _z * b._x - _x * b._z, _x * b._y - _y * b._x); } void norm() throw() { _x /= _z; _y /= _z; _z = 1; } }; int intersect(double lata1, double lona1, double lata2, double lona2, double latb1, double lonb1, double latb2, double lonb2) { const GeographicLib::Geodesic& geod = GeographicLib::Geodesic::WGS84(); const GeographicLib::Gnomonic gn(geod); double lat0 = (lata1 + lata2 + latb1 + latb2)/4, // Possibly need to deal with longitudes wrapping around lon0 = (lona1 + lona2 + lonb1 + lonb2)/4; std::cout << std::setprecision(16); std::cout << "Initial guess " << lat0 << " " << lon0 << "\n"; for (int i = 0; i < 10; ++i) { double xa1, ya1, xa2, ya2; double xb1, yb1, xb2, yb2; gn.Forward(lat0, lon0, lata1, lona1, xa1, ya1); gn.Forward(lat0, lon0, lata2, lona2, xa2, ya2); gn.Forward(lat0, lon0, latb1, lonb1, xb1, yb1); gn.Forward(lat0, lon0, latb2, lonb2, xb2, yb2); // See Hartley and Zisserman, Multiple View Geometry, Sec. 2.2.1 vector3 va1(xa1, ya1); vector3 va2(xa2, ya2); vector3 vb1(xb1, yb1); vector3 vb2(xb2, yb2); // la is homogeneous representation of line A1,A2 // lb is homogeneous representation of line B1,B2 vector3 la = va1.cross(va2); vector3 lb = vb1.cross(vb2); // p0 is homogeneous representation of intersection of la and lb vector3 p0 = la.cross(lb); p0.norm(); double lat1, lon1; gn.Reverse(lat0, lon0, p0._x, p0._y, lat1, lon1); std::cout << "Increment " << lat1-lat0 << " " << lon1-lon0 << "\n"; lat0 = lat1; lon0 = lon1; } std::cout << "Final result " << lat0 << " " << lon0 << "\n"; double azi1, azi2; geod.Inverse(lata1, lona1, lat0, lon0, azi1, azi2); std::cout << "Azimuths on line A " << azi2 << " "; geod.Inverse(lat0, lon0, lata2, lona2, azi1, azi2); std::cout << azi1 << "\n"; geod.Inverse(latb1, lonb1, lat0, lon0, azi1, azi2); std::cout << "Azimuths on line B " << azi2 << " "; geod.Inverse(lat0, lon0, latb2, lonb2, azi1, azi2); std::cout << azi1 << "\n"; } // Find interception of a geodesic from a point int intercept(double lata1, lona1, lata2, lona2, double latb1, lonb1) { const GeographicLib::Geodesic& geod = GeographicLib::Geodesic::WGS84(); const GeographicLib::Gnomonic gn(geod); double lat0 = (lata1 + lata2)/2, // Possibly need to deal with longitudes wrapping around lon0 = (lona1 + lona2)/2; std::cout << std::setprecision(16); std::cout << "Initial guess " << lat0 << " " << lon0 << "\n"; for (int i = 0; i < 10; ++i) { double xa1, ya1, xa2, ya2; double xb1, yb1; gn.Forward(lat0, lon0, lata1, lona1, xa1, ya1); gn.Forward(lat0, lon0, lata2, lona2, xa2, ya2); gn.Forward(lat0, lon0, latb1, lonb1, xb1, yb1); // See Hartley and Zisserman, Multiple View Geometry, Sec. 2.2.1 vector3 va1(xa1, ya1); vector3 va2(xa2, ya2); // la is homogeneous representation of line A1,A2 vector3 la = va1.cross(va2); vector3 vb1(xb1, yb1); // lb is homogeneous representation of line thru B1 perpendicular to la vector3 lb(la._y, -la._x, la._x * yb1 - la._y * xb1); // p0 is homogeneous representation of intersection of la and lb vector3 p0 = la.cross(lb); p0.norm(); double lat1, lon1; gn.Reverse(lat0, lon0, p0._x, p0._y, lat1, lon1); std::cout << "Increment " << lat1-lat0 << " " << lon1-lon0 << "\n"; lat0 = lat1; lon0 = lon1; } std::cout << "Final result " << lat0 << " " << lon0 << "\n"; double azi1, azi2; geod.Inverse(lat0, lon0, lata1, lona1, azi1, azi2); std::cout << "Azimuth to A1 " << azi1 << "\n"; geod.Inverse(lat0, lon0, lata2, lona2, azi1, azi2); std::cout << "Azimuth to A2 " << azi1 << "\n"; geod.Inverse(lat0, lon0, latb1, lonb1, azi1, azi2); std::cout << "Azimuth to B1 " << azi1 << "\n"; } */ geosphere/src/Ellipsoid.h0000644000176200001440000005653214323377037015143 0ustar liggesusers/** * \file Ellipsoid.hpp * \brief Header for GeographicLib::Ellipsoid class * * Copyright (c) Charles Karney (2012-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #if !defined(GEOGRAPHICLIB_ELLIPSOID_HPP) #define GEOGRAPHICLIB_ELLIPSOID_HPP 1 #include "Constants.h" #include "TransverseMercator.h" #include "EllipticFunction.h" #include "AlbersEqualArea.h" namespace GeographicLib { /** * \brief Properties of an ellipsoid * * This class returns various properties of the ellipsoid and converts * between various types of latitudes. The latitude conversions are also * possible using the various projections supported by %GeographicLib; but * Ellipsoid provides more direct access (sometimes using private functions * of the projection classes). Ellipsoid::RectifyingLatitude, * Ellipsoid::InverseRectifyingLatitude, and Ellipsoid::MeridianDistance * provide functionality which can be provided by the Geodesic class. * However Geodesic uses a series approximation (valid for abs \e f < 1/150), * whereas Ellipsoid computes these quantities using EllipticFunction which * provides accurate results even when \e f is large. Use of this class * should be limited to −3 < \e f < 3/4 (i.e., 1/4 < b/a < 4). * * Example of use: * \include example-Ellipsoid.cpp **********************************************************************/ class GEOGRAPHICLIB_EXPORT Ellipsoid { private: typedef Math::real real; static const int numit_ = 10; real stol_; real _a, _f, _f1, _f12, _e2, _es, _e12, _n, _b; TransverseMercator _tm; EllipticFunction _ell; AlbersEqualArea _au; // These are the alpha and beta coefficients in the Krueger series from // TransverseMercator. Thy are used by RhumbSolve to compute // (psi2-psi1)/(mu2-mu1). const Math::real* ConformalToRectifyingCoeffs() const { return _tm._alp; } const Math::real* RectifyingToConformalCoeffs() const { return _tm._bet; } friend class Rhumb; friend class RhumbLine; public: /** \name Constructor **********************************************************************/ ///@{ /** * Constructor for an ellipsoid with * * @param[in] a equatorial radius (meters). * @param[in] f flattening of ellipsoid. Setting \e f = 0 gives a sphere. * Negative \e f gives a prolate ellipsoid. * @exception GeographicErr if \e a or (1 − \e f) \e a is not * positive. **********************************************************************/ Ellipsoid(real a, real f); ///@} /** \name %Ellipsoid dimensions. **********************************************************************/ ///@{ /** * @return \e a the equatorial radius of the ellipsoid (meters). This is * the value used in the constructor. **********************************************************************/ Math::real EquatorialRadius() const { return _a; } /** * @return \e b the polar semi-axis (meters). **********************************************************************/ Math::real PolarRadius() const { return _b; } /** * @return \e L the distance between the equator and a pole along a * meridian (meters). For a sphere \e L = (π/2) \e a. The radius * of a sphere with the same meridian length is \e L / (π/2). **********************************************************************/ Math::real QuarterMeridian() const; /** * @return \e A the total area of the ellipsoid (meters2). For * a sphere \e A = 4π a2. The radius of a sphere * with the same area is sqrt(\e A / (4π)). **********************************************************************/ Math::real Area() const; /** * @return \e V the total volume of the ellipsoid (meters3). * For a sphere \e V = (4π / 3) a3. The radius of * a sphere with the same volume is cbrt(\e V / (4π/3)). **********************************************************************/ Math::real Volume() const { return (4 * Math::pi()) * Math::sq(_a) * _b / 3; } ///@} /** \name %Ellipsoid shape **********************************************************************/ ///@{ /** * @return \e f = (\e a − \e b) / \e a, the flattening of the * ellipsoid. This is the value used in the constructor. This is zero, * positive, or negative for a sphere, oblate ellipsoid, or prolate * ellipsoid. **********************************************************************/ Math::real Flattening() const { return _f; } /** * @return \e f ' = (\e a − \e b) / \e b, the second flattening of * the ellipsoid. This is zero, positive, or negative for a sphere, * oblate ellipsoid, or prolate ellipsoid. **********************************************************************/ Math::real SecondFlattening() const { return _f / (1 - _f); } /** * @return \e n = (\e a − \e b) / (\e a + \e b), the third flattening * of the ellipsoid. This is zero, positive, or negative for a sphere, * oblate ellipsoid, or prolate ellipsoid. **********************************************************************/ Math::real ThirdFlattening() const { return _n; } /** * @return e2 = (a2 − * b2) / a2, the eccentricity squared * of the ellipsoid. This is zero, positive, or negative for a sphere, * oblate ellipsoid, or prolate ellipsoid. **********************************************************************/ Math::real EccentricitySq() const { return _e2; } /** * @return e' 2 = (a2 − * b2) / b2, the second eccentricity * squared of the ellipsoid. This is zero, positive, or negative for a * sphere, oblate ellipsoid, or prolate ellipsoid. **********************************************************************/ Math::real SecondEccentricitySq() const { return _e12; } /** * @return e'' 2 = (a2 − * b2) / (a2 + b2), * the third eccentricity squared of the ellipsoid. This is zero, * positive, or negative for a sphere, oblate ellipsoid, or prolate * ellipsoid. **********************************************************************/ Math::real ThirdEccentricitySq() const { return _e2 / (2 - _e2); } ///@} /** \name Latitude conversion. **********************************************************************/ ///@{ /** * @param[in] phi the geographic latitude (degrees). * @return β the parametric latitude (degrees). * * The geographic latitude, φ, is the angle between the equatorial * plane and a vector normal to the surface of the ellipsoid. * * The parametric latitude (also called the reduced latitude), β, * allows the cartesian coordinated of a meridian to be expressed * conveniently in parametric form as * - \e R = \e a cos β * - \e Z = \e b sin β * . * where \e a and \e b are the equatorial radius and the polar semi-axis. * For a sphere β = φ. * * φ must lie in the range [−90°, 90°]; the * result is undefined if this condition does not hold. The returned value * β lies in [−90°, 90°]. **********************************************************************/ Math::real ParametricLatitude(real phi) const; /** * @param[in] beta the parametric latitude (degrees). * @return φ the geographic latitude (degrees). * * β must lie in the range [−90°, 90°]; the * result is undefined if this condition does not hold. The returned value * φ lies in [−90°, 90°]. **********************************************************************/ Math::real InverseParametricLatitude(real beta) const; /** * @param[in] phi the geographic latitude (degrees). * @return θ the geocentric latitude (degrees). * * The geocentric latitude, θ, is the angle between the equatorial * plane and a line between the center of the ellipsoid and a point on the * ellipsoid. For a sphere θ = φ. * * φ must lie in the range [−90°, 90°]; the * result is undefined if this condition does not hold. The returned value * θ lies in [−90°, 90°]. **********************************************************************/ Math::real GeocentricLatitude(real phi) const; /** * @param[in] theta the geocentric latitude (degrees). * @return φ the geographic latitude (degrees). * * θ must lie in the range [−90°, 90°]; the * result is undefined if this condition does not hold. The returned value * φ lies in [−90°, 90°]. **********************************************************************/ Math::real InverseGeocentricLatitude(real theta) const; /** * @param[in] phi the geographic latitude (degrees). * @return μ the rectifying latitude (degrees). * * The rectifying latitude, μ, has the property that the distance along * a meridian of the ellipsoid between two points with rectifying latitudes * μ1 and μ2 is equal to * (μ2 - μ1) \e L / 90°, * where \e L = QuarterMeridian(). For a sphere μ = φ. * * φ must lie in the range [−90°, 90°]; the * result is undefined if this condition does not hold. The returned value * μ lies in [−90°, 90°]. **********************************************************************/ Math::real RectifyingLatitude(real phi) const; /** * @param[in] mu the rectifying latitude (degrees). * @return φ the geographic latitude (degrees). * * μ must lie in the range [−90°, 90°]; the * result is undefined if this condition does not hold. The returned value * φ lies in [−90°, 90°]. **********************************************************************/ Math::real InverseRectifyingLatitude(real mu) const; /** * @param[in] phi the geographic latitude (degrees). * @return ξ the authalic latitude (degrees). * * The authalic latitude, ξ, has the property that the area of the * ellipsoid between two circles with authalic latitudes * ξ1 and ξ2 is equal to (sin * ξ2 - sin ξ1) \e A / 2, where \e A * = Area(). For a sphere ξ = φ. * * φ must lie in the range [−90°, 90°]; the * result is undefined if this condition does not hold. The returned value * ξ lies in [−90°, 90°]. **********************************************************************/ Math::real AuthalicLatitude(real phi) const; /** * @param[in] xi the authalic latitude (degrees). * @return φ the geographic latitude (degrees). * * ξ must lie in the range [−90°, 90°]; the * result is undefined if this condition does not hold. The returned value * φ lies in [−90°, 90°]. **********************************************************************/ Math::real InverseAuthalicLatitude(real xi) const; /** * @param[in] phi the geographic latitude (degrees). * @return χ the conformal latitude (degrees). * * The conformal latitude, χ, gives the mapping of the ellipsoid to a * sphere which which is conformal (angles are preserved) and in which the * equator of the ellipsoid maps to the equator of the sphere. For a * sphere χ = φ. * * φ must lie in the range [−90°, 90°]; the * result is undefined if this condition does not hold. The returned value * χ lies in [−90°, 90°]. **********************************************************************/ Math::real ConformalLatitude(real phi) const; /** * @param[in] chi the conformal latitude (degrees). * @return φ the geographic latitude (degrees). * * χ must lie in the range [−90°, 90°]; the * result is undefined if this condition does not hold. The returned value * φ lies in [−90°, 90°]. **********************************************************************/ Math::real InverseConformalLatitude(real chi) const; /** * @param[in] phi the geographic latitude (degrees). * @return ψ the isometric latitude (degrees). * * The isometric latitude gives the mapping of the ellipsoid to a plane * which which is conformal (angles are preserved) and in which the equator * of the ellipsoid maps to a straight line of constant scale; this mapping * defines the Mercator projection. For a sphere ψ = * sinh−1 tan φ. * * φ must lie in the range [−90°, 90°]; the result is * undefined if this condition does not hold. The value returned for φ * = ±90° is some (positive or negative) large but finite value, * such that InverseIsometricLatitude returns the original value of φ. **********************************************************************/ Math::real IsometricLatitude(real phi) const; /** * @param[in] psi the isometric latitude (degrees). * @return φ the geographic latitude (degrees). * * The returned value φ lies in [−90°, 90°]. For a * sphere φ = tan−1 sinh ψ. **********************************************************************/ Math::real InverseIsometricLatitude(real psi) const; ///@} /** \name Other quantities. **********************************************************************/ ///@{ /** * @param[in] phi the geographic latitude (degrees). * @return \e R = \e a cos β the radius of a circle of latitude * φ (meters). \e R (π/180°) gives meters per degree * longitude measured along a circle of latitude. * * φ must lie in the range [−90°, 90°]; the * result is undefined if this condition does not hold. **********************************************************************/ Math::real CircleRadius(real phi) const; /** * @param[in] phi the geographic latitude (degrees). * @return \e Z = \e b sin β the distance of a circle of latitude * φ from the equator measured parallel to the ellipsoid axis * (meters). * * φ must lie in the range [−90°, 90°]; the * result is undefined if this condition does not hold. **********************************************************************/ Math::real CircleHeight(real phi) const; /** * @param[in] phi the geographic latitude (degrees). * @return \e s the distance along a meridian * between the equator and a point of latitude φ (meters). \e s is * given by \e s = μ \e L / 90°, where \e L = * QuarterMeridian()). * * φ must lie in the range [−90°, 90°]; the * result is undefined if this condition does not hold. **********************************************************************/ Math::real MeridianDistance(real phi) const; /** * @param[in] phi the geographic latitude (degrees). * @return ρ the meridional radius of curvature of the ellipsoid at * latitude φ (meters); this is the curvature of the meridian. \e * rho is given by ρ = (180°/π) d\e s / dφ, * where \e s = MeridianDistance(); thus ρ (π/180°) * gives meters per degree latitude measured along a meridian. * * φ must lie in the range [−90°, 90°]; the * result is undefined if this condition does not hold. **********************************************************************/ Math::real MeridionalCurvatureRadius(real phi) const; /** * @param[in] phi the geographic latitude (degrees). * @return ν the transverse radius of curvature of the ellipsoid at * latitude φ (meters); this is the curvature of a curve on the * ellipsoid which also lies in a plane perpendicular to the ellipsoid * and to the meridian. ν is related to \e R = CircleRadius() by \e * R = ν cos φ. * * φ must lie in the range [−90°, 90°]; the * result is undefined if this condition does not hold. **********************************************************************/ Math::real TransverseCurvatureRadius(real phi) const; /** * @param[in] phi the geographic latitude (degrees). * @param[in] azi the angle between the meridian and the normal section * (degrees). * @return the radius of curvature of the ellipsoid in the normal * section at latitude φ inclined at an angle \e azi to the * meridian (meters). * * φ must lie in the range [−90°, 90°]; the result is * undefined this condition does not hold. **********************************************************************/ Math::real NormalCurvatureRadius(real phi, real azi) const; ///@} /** \name Eccentricity conversions. **********************************************************************/ ///@{ /** * @param[in] fp = \e f ' = (\e a − \e b) / \e b, the second * flattening. * @return \e f = (\e a − \e b) / \e a, the flattening. * * \e f ' should lie in (−1, ∞). * The returned value \e f lies in (−∞, 1). **********************************************************************/ static Math::real SecondFlatteningToFlattening(real fp) { return fp / (1 + fp); } /** * @param[in] f = (\e a − \e b) / \e a, the flattening. * @return \e f ' = (\e a − \e b) / \e b, the second flattening. * * \e f should lie in (−∞, 1). * The returned value \e f ' lies in (−1, ∞). **********************************************************************/ static Math::real FlatteningToSecondFlattening(real f) { return f / (1 - f); } /** * @param[in] n = (\e a − \e b) / (\e a + \e b), the third * flattening. * @return \e f = (\e a − \e b) / \e a, the flattening. * * \e n should lie in (−1, 1). * The returned value \e f lies in (−∞, 1). **********************************************************************/ static Math::real ThirdFlatteningToFlattening(real n) { return 2 * n / (1 + n); } /** * @param[in] f = (\e a − \e b) / \e a, the flattening. * @return \e n = (\e a − \e b) / (\e a + \e b), the third * flattening. * * \e f should lie in (−∞, 1). * The returned value \e n lies in (−1, 1). **********************************************************************/ static Math::real FlatteningToThirdFlattening(real f) { return f / (2 - f); } /** * @param[in] e2 = e2 = (a2 − * b2) / a2, the eccentricity * squared. * @return \e f = (\e a − \e b) / \e a, the flattening. * * e2 should lie in (−∞, 1). * The returned value \e f lies in (−∞, 1). **********************************************************************/ static Math::real EccentricitySqToFlattening(real e2) { using std::sqrt; return e2 / (sqrt(1 - e2) + 1); } /** * @param[in] f = (\e a − \e b) / \e a, the flattening. * @return e2 = (a2 − * b2) / a2, the eccentricity * squared. * * \e f should lie in (−∞, 1). * The returned value e2 lies in (−∞, 1). **********************************************************************/ static Math::real FlatteningToEccentricitySq(real f) { return f * (2 - f); } /** * @param[in] ep2 = e' 2 = (a2 − * b2) / b2, the second eccentricity * squared. * @return \e f = (\e a − \e b) / \e a, the flattening. * * e' 2 should lie in (−1, ∞). * The returned value \e f lies in (−∞, 1). **********************************************************************/ static Math::real SecondEccentricitySqToFlattening(real ep2) { using std::sqrt; return ep2 / (sqrt(1 + ep2) + 1 + ep2); } /** * @param[in] f = (\e a − \e b) / \e a, the flattening. * @return e' 2 = (a2 − * b2) / b2, the second eccentricity * squared. * * \e f should lie in (−∞, 1). * The returned value e' 2 lies in (−1, ∞). **********************************************************************/ static Math::real FlatteningToSecondEccentricitySq(real f) { return f * (2 - f) / Math::sq(1 - f); } /** * @param[in] epp2 = e'' 2 = (a2 * − b2) / (a2 + * b2), the third eccentricity squared. * @return \e f = (\e a − \e b) / \e a, the flattening. * * e'' 2 should lie in (−1, 1). * The returned value \e f lies in (−∞, 1). **********************************************************************/ static Math::real ThirdEccentricitySqToFlattening(real epp2) { using std::sqrt; return 2 * epp2 / (sqrt((1 - epp2) * (1 + epp2)) + 1 + epp2); } /** * @param[in] f = (\e a − \e b) / \e a, the flattening. * @return e'' 2 = (a2 − * b2) / (a2 + b2), * the third eccentricity squared. * * \e f should lie in (−∞, 1). * The returned value e'' 2 lies in (−1, 1). **********************************************************************/ static Math::real FlatteningToThirdEccentricitySq(real f) { return f * (2 - f) / (1 + Math::sq(1 - f)); } ///@} /** * A global instantiation of Ellipsoid with the parameters for the WGS84 * ellipsoid. **********************************************************************/ static const Ellipsoid& WGS84(); }; } // namespace GeographicLib #endif // GEOGRAPHICLIB_ELLIPSOID_HPP geosphere/src/Rhumb.cpp0000644000176200001440000003505014323401025014600 0ustar liggesusers/** * \file Rhumb.cpp * \brief Implementation for GeographicLib::Rhumb and GeographicLib::RhumbLine * classes * * Copyright (c) Charles Karney (2014-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #include #include "Rhumb.h" #if defined(_MSC_VER) // Squelch warnings about enum-float expressions # pragma warning (disable: 5055) #endif namespace GeographicLib { using namespace std; Rhumb::Rhumb(real a, real f, bool exact) : _ell(a, f) , _exact(exact) , _c2(_ell.Area() / (2 * Math::td)) { // Generated by Maxima on 2015-05-15 08:24:04-04:00 #if GEOGRAPHICLIB_RHUMBAREA_ORDER == 4 static const real coeff[] = { // R[0]/n^0, polynomial in n of order 4 691, 7860, -20160, 18900, 0, 56700, // R[1]/n^1, polynomial in n of order 3 1772, -5340, 6930, -4725, 14175, // R[2]/n^2, polynomial in n of order 2 -1747, 1590, -630, 4725, // R[3]/n^3, polynomial in n of order 1 104, -31, 315, // R[4]/n^4, polynomial in n of order 0 -41, 420, }; // count = 20 #elif GEOGRAPHICLIB_RHUMBAREA_ORDER == 5 static const real coeff[] = { // R[0]/n^0, polynomial in n of order 5 -79036, 22803, 259380, -665280, 623700, 0, 1871100, // R[1]/n^1, polynomial in n of order 4 41662, 58476, -176220, 228690, -155925, 467775, // R[2]/n^2, polynomial in n of order 3 18118, -57651, 52470, -20790, 155925, // R[3]/n^3, polynomial in n of order 2 -23011, 17160, -5115, 51975, // R[4]/n^4, polynomial in n of order 1 5480, -1353, 13860, // R[5]/n^5, polynomial in n of order 0 -668, 5775, }; // count = 27 #elif GEOGRAPHICLIB_RHUMBAREA_ORDER == 6 static const real coeff[] = { // R[0]/n^0, polynomial in n of order 6 128346268, -107884140, 31126095, 354053700, -908107200, 851350500, 0, 2554051500LL, // R[1]/n^1, polynomial in n of order 5 -114456994, 56868630, 79819740, -240540300, 312161850, -212837625, 638512875, // R[2]/n^2, polynomial in n of order 4 51304574, 24731070, -78693615, 71621550, -28378350, 212837625, // R[3]/n^3, polynomial in n of order 3 1554472, -6282003, 4684680, -1396395, 14189175, // R[4]/n^4, polynomial in n of order 2 -4913956, 3205800, -791505, 8108100, // R[5]/n^5, polynomial in n of order 1 1092376, -234468, 2027025, // R[6]/n^6, polynomial in n of order 0 -313076, 2027025, }; // count = 35 #elif GEOGRAPHICLIB_RHUMBAREA_ORDER == 7 static const real coeff[] = { // R[0]/n^0, polynomial in n of order 7 -317195588, 385038804, -323652420, 93378285, 1062161100, -2724321600LL, 2554051500LL, 0, 7662154500LL, // R[1]/n^1, polynomial in n of order 6 258618446, -343370982, 170605890, 239459220, -721620900, 936485550, -638512875, 1915538625, // R[2]/n^2, polynomial in n of order 5 -248174686, 153913722, 74193210, -236080845, 214864650, -85135050, 638512875, // R[3]/n^3, polynomial in n of order 4 114450437, 23317080, -94230045, 70270200, -20945925, 212837625, // R[4]/n^4, polynomial in n of order 3 15445736, -103193076, 67321800, -16621605, 170270100, // R[5]/n^5, polynomial in n of order 2 -27766753, 16385640, -3517020, 30405375, // R[6]/n^6, polynomial in n of order 1 4892722, -939228, 6081075, // R[7]/n^7, polynomial in n of order 0 -3189007, 14189175, }; // count = 44 #elif GEOGRAPHICLIB_RHUMBAREA_ORDER == 8 static const real coeff[] = { // R[0]/n^0, polynomial in n of order 8 71374704821LL, -161769749880LL, 196369790040LL, -165062734200LL, 47622925350LL, 541702161000LL, -1389404016000LL, 1302566265000LL, 0, 3907698795000LL, // R[1]/n^1, polynomial in n of order 7 -13691187484LL, 65947703730LL, -87559600410LL, 43504501950LL, 61062101100LL, -184013329500LL, 238803815250LL, -162820783125LL, 488462349375LL, // R[2]/n^2, polynomial in n of order 6 30802104839LL, -63284544930LL, 39247999110LL, 18919268550LL, -60200615475LL, 54790485750LL, -21709437750LL, 162820783125LL, // R[3]/n^3, polynomial in n of order 5 -8934064508LL, 5836972287LL, 1189171080, -4805732295LL, 3583780200LL, -1068242175, 10854718875LL, // R[4]/n^4, polynomial in n of order 4 50072287748LL, 3938662680LL, -26314234380LL, 17167059000LL, -4238509275LL, 43418875500LL, // R[5]/n^5, polynomial in n of order 3 359094172, -9912730821LL, 5849673480LL, -1255576140, 10854718875LL, // R[6]/n^6, polynomial in n of order 2 -16053944387LL, 8733508770LL, -1676521980, 10854718875LL, // R[7]/n^7, polynomial in n of order 1 930092876, -162639357, 723647925, // R[8]/n^8, polynomial in n of order 0 -673429061, 1929727800, }; // count = 54 #else #error "Bad value for GEOGRAPHICLIB_RHUMBAREA_ORDER" #endif static_assert(sizeof(coeff) / sizeof(real) == ((maxpow_ + 1) * (maxpow_ + 4))/2, "Coefficient array size mismatch for Rhumb"); real d = 1; int o = 0; for (int l = 0; l <= maxpow_; ++l) { int m = maxpow_ - l; // R[0] is just an integration constant so it cancels when evaluating a // definite integral. So don't bother computing it. It won't be used // when invoking SinCosSeries. if (l) _rR[l] = d * Math::polyval(m, coeff + o, _ell._n) / coeff[o + m + 1]; o += m + 2; d *= _ell._n; } // Post condition: o == sizeof(alpcoeff) / sizeof(real) } const Rhumb& Rhumb::WGS84() { static const Rhumb wgs84(Constants::WGS84_a(), Constants::WGS84_f(), false); return wgs84; } void Rhumb::GenInverse(real lat1, real lon1, real lat2, real lon2, unsigned outmask, real& s12, real& azi12, real& S12) const { real lon12 = Math::AngDiff(lon1, lon2), psi1 = _ell.IsometricLatitude(lat1), psi2 = _ell.IsometricLatitude(lat2), psi12 = psi2 - psi1, h = hypot(lon12, psi12); if (outmask & AZIMUTH) azi12 = Math::atan2d(lon12, psi12); if (outmask & DISTANCE) { real dmudpsi = DIsometricToRectifying(psi2, psi1); s12 = h * dmudpsi * _ell.QuarterMeridian() / Math::qd; } if (outmask & AREA) S12 = _c2 * lon12 * MeanSinXi(psi2 * Math::degree(), psi1 * Math::degree()); } RhumbLine Rhumb::Line(real lat1, real lon1, real azi12) const { return RhumbLine(*this, lat1, lon1, azi12); } void Rhumb::GenDirect(real lat1, real lon1, real azi12, real s12, unsigned outmask, real& lat2, real& lon2, real& S12) const { Line(lat1, lon1, azi12).GenPosition(s12, outmask, lat2, lon2, S12); } Math::real Rhumb::DE(real x, real y) const { const EllipticFunction& ei = _ell._ell; real d = x - y; if (x * y <= 0) return d != 0 ? (ei.E(x) - ei.E(y)) / d : 1; // See DLMF: Eqs (19.11.2) and (19.11.4) letting // theta -> x, phi -> -y, psi -> z // // (E(x) - E(y)) / d = E(z)/d - k2 * sin(x) * sin(y) * sin(z)/d // // tan(z/2) = (sin(x)*Delta(y) - sin(y)*Delta(x)) / (cos(x) + cos(y)) // = d * Dsin(x,y) * (sin(x) + sin(y))/(cos(x) + cos(y)) / // (sin(x)*Delta(y) + sin(y)*Delta(x)) // = t = d * Dt // sin(z) = 2*t/(1+t^2); cos(z) = (1-t^2)/(1+t^2) // Alt (this only works for |z| <= pi/2 -- however, this conditions holds // if x*y > 0): // sin(z) = d * Dsin(x,y) * (sin(x) + sin(y))/ // (sin(x)*cos(y)*Delta(y) + sin(y)*cos(x)*Delta(x)) // cos(z) = sqrt((1-sin(z))*(1+sin(z))) real sx = sin(x), sy = sin(y), cx = cos(x), cy = cos(y); real Dt = Dsin(x, y) * (sx + sy) / ((cx + cy) * (sx * ei.Delta(sy, cy) + sy * ei.Delta(sx, cx))), t = d * Dt, Dsz = 2 * Dt / (1 + t*t), sz = d * Dsz, cz = (1 - t) * (1 + t) / (1 + t*t); return ((sz != 0 ? ei.E(sz, cz, ei.Delta(sz, cz)) / sz : 1) - ei.k2() * sx * sy) * Dsz; } Math::real Rhumb::DRectifying(real latx, real laty) const { real tbetx = _ell._f1 * Math::tand(latx), tbety = _ell._f1 * Math::tand(laty); return (Math::pi()/2) * _ell._b * _ell._f1 * DE(atan(tbetx), atan(tbety)) * Dtan(latx, laty) * Datan(tbetx, tbety) / _ell.QuarterMeridian(); } Math::real Rhumb::DIsometric(real latx, real laty) const { real phix = latx * Math::degree(), tx = Math::tand(latx), phiy = laty * Math::degree(), ty = Math::tand(laty); return Dasinh(tx, ty) * Dtan(latx, laty) - Deatanhe(sin(phix), sin(phiy)) * Dsin(phix, phiy); } Math::real Rhumb::SinCosSeries(bool sinp, real x, real y, const real c[], int n) { // N.B. n >= 0 and c[] has n+1 elements 0..n, of which c[0] is ignored. // // Use Clenshaw summation to evaluate // m = (g(x) + g(y)) / 2 -- mean value // s = (g(x) - g(y)) / (x - y) -- average slope // where // g(x) = sum(c[j]*SC(2*j*x), j = 1..n) // SC = sinp ? sin : cos // CS = sinp ? cos : sin // // This function returns only s; m is discarded. // // Write // t = [m; s] // t = sum(c[j] * f[j](x,y), j = 1..n) // where // f[j](x,y) = [ (SC(2*j*x)+SC(2*j*y))/2 ] // [ (SC(2*j*x)-SC(2*j*y))/d ] // // = [ cos(j*d)*SC(j*p) ] // [ +/-(2/d)*sin(j*d)*CS(j*p) ] // (+/- = sinp ? + : -) and // p = x+y, d = x-y // // f[j+1](x,y) = A * f[j](x,y) - f[j-1](x,y) // // A = [ 2*cos(p)*cos(d) -sin(p)*sin(d)*d] // [ -4*sin(p)*sin(d)/d 2*cos(p)*cos(d) ] // // Let b[n+1] = b[n+2] = [0 0; 0 0] // b[j] = A * b[j+1] - b[j+2] + c[j] * I for j = n..1 // t = (c[0] * I - b[2]) * f[0](x,y) + b[1] * f[1](x,y) // c[0] is not accessed for s = t[2] real p = x + y, d = x - y, cp = cos(p), cd = cos(d), sp = sin(p), sd = d != 0 ? sin(d)/d : 1, m = 2 * cp * cd, s = sp * sd; // 2x2 matrices stored in row-major order const real a[4] = {m, -s * d * d, -4 * s, m}; real ba[4] = {0, 0, 0, 0}; real bb[4] = {0, 0, 0, 0}; real* b1 = ba; real* b2 = bb; if (n > 0) b1[0] = b1[3] = c[n]; for (int j = n - 1; j > 0; --j) { // j = n-1 .. 1 swap(b1, b2); // b1 = A * b2 - b1 + c[j] * I b1[0] = a[0] * b2[0] + a[1] * b2[2] - b1[0] + c[j]; b1[1] = a[0] * b2[1] + a[1] * b2[3] - b1[1]; b1[2] = a[2] * b2[0] + a[3] * b2[2] - b1[2]; b1[3] = a[2] * b2[1] + a[3] * b2[3] - b1[3] + c[j]; } // Here are the full expressions for m and s // m = (c[0] - b2[0]) * f01 - b2[1] * f02 + b1[0] * f11 + b1[1] * f12; // s = - b2[2] * f01 + (c[0] - b2[3]) * f02 + b1[2] * f11 + b1[3] * f12; if (sinp) { // real f01 = 0, f02 = 0; real f11 = cd * sp, f12 = 2 * sd * cp; // m = b1[0] * f11 + b1[1] * f12; s = b1[2] * f11 + b1[3] * f12; } else { // real f01 = 1, f02 = 0; real f11 = cd * cp, f12 = - 2 * sd * sp; // m = c[0] - b2[0] + b1[0] * f11 + b1[1] * f12; s = - b2[2] + b1[2] * f11 + b1[3] * f12; } return s; } Math::real Rhumb::DConformalToRectifying(real chix, real chiy) const { return 1 + SinCosSeries(true, chix, chiy, _ell.ConformalToRectifyingCoeffs(), tm_maxord); } Math::real Rhumb::DRectifyingToConformal(real mux, real muy) const { return 1 - SinCosSeries(true, mux, muy, _ell.RectifyingToConformalCoeffs(), tm_maxord); } Math::real Rhumb::DIsometricToRectifying(real psix, real psiy) const { if (_exact) { real latx = _ell.InverseIsometricLatitude(psix), laty = _ell.InverseIsometricLatitude(psiy); return DRectifying(latx, laty) / DIsometric(latx, laty); } else { psix *= Math::degree(); psiy *= Math::degree(); return DConformalToRectifying(gd(psix), gd(psiy)) * Dgd(psix, psiy); } } Math::real Rhumb::DRectifyingToIsometric(real mux, real muy) const { real latx = _ell.InverseRectifyingLatitude(mux/Math::degree()), laty = _ell.InverseRectifyingLatitude(muy/Math::degree()); return _exact ? DIsometric(latx, laty) / DRectifying(latx, laty) : Dgdinv(Math::taupf(Math::tand(latx), _ell._es), Math::taupf(Math::tand(laty), _ell._es)) * DRectifyingToConformal(mux, muy); } Math::real Rhumb::MeanSinXi(real psix, real psiy) const { return Dlog(cosh(psix), cosh(psiy)) * Dcosh(psix, psiy) + SinCosSeries(false, gd(psix), gd(psiy), _rR, maxpow_) * Dgd(psix, psiy); } RhumbLine::RhumbLine(const Rhumb& rh, real lat1, real lon1, real azi12) : _rh(rh) , _lat1(Math::LatFix(lat1)) , _lon1(lon1) , _azi12(Math::AngNormalize(azi12)) { real alp12 = _azi12 * Math::degree(); _salp = _azi12 == -Math::hd ? 0 : sin(alp12); _calp = fabs(_azi12) == Math::qd ? 0 : cos(alp12); _mu1 = _rh._ell.RectifyingLatitude(lat1); _psi1 = _rh._ell.IsometricLatitude(lat1); _r1 = _rh._ell.CircleRadius(lat1); } void RhumbLine::GenPosition(real s12, unsigned outmask, real& lat2, real& lon2, real& S12) const { real mu12 = s12 * _calp * Math::qd / _rh._ell.QuarterMeridian(), mu2 = _mu1 + mu12; real psi2, lat2x, lon2x; if (fabs(mu2) <= Math::qd) { if (_calp != 0) { lat2x = _rh._ell.InverseRectifyingLatitude(mu2); real psi12 = _rh.DRectifyingToIsometric( mu2 * Math::degree(), _mu1 * Math::degree()) * mu12; lon2x = _salp * psi12 / _calp; psi2 = _psi1 + psi12; } else { lat2x = _lat1; lon2x = _salp * s12 / (_r1 * Math::degree()); psi2 = _psi1; } if (outmask & AREA) S12 = _rh._c2 * lon2x * _rh.MeanSinXi(_psi1 * Math::degree(), psi2 * Math::degree()); lon2x = outmask & LONG_UNROLL ? _lon1 + lon2x : Math::AngNormalize(Math::AngNormalize(_lon1) + lon2x); } else { // Reduce to the interval [-180, 180) mu2 = Math::AngNormalize(mu2); // Deal with points on the anti-meridian if (fabs(mu2) > Math::qd) mu2 = Math::AngNormalize(Math::hd - mu2); lat2x = _rh._ell.InverseRectifyingLatitude(mu2); lon2x = Math::NaN(); if (outmask & AREA) S12 = Math::NaN(); } if (outmask & LATITUDE) lat2 = lat2x; if (outmask & LONGITUDE) lon2 = lon2x; } } // namespace GeographicLib geosphere/src/Utility.h0000644000176200001440000006043514323377037014657 0ustar liggesusers/** * \file Utility.hpp * \brief Header for GeographicLib::Utility class * * Copyright (c) Charles Karney (2011-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #if !defined(GEOGRAPHICLIB_UTILITY_HPP) #define GEOGRAPHICLIB_UTILITY_HPP 1 #include "Constants.h" #include #include #include #include #include #include #if defined(_MSC_VER) // Squelch warnings about constant conditional expressions and unsafe gmtime # pragma warning (push) # pragma warning (disable: 4127 4996) #endif namespace GeographicLib { /** * \brief Some utility routines for %GeographicLib * * Example of use: * \include example-Utility.cpp **********************************************************************/ class GEOGRAPHICLIB_EXPORT Utility { private: static bool gregorian(int y, int m, int d) { // The original cut over to the Gregorian calendar in Pope Gregory XIII's // time had 1582-10-04 followed by 1582-10-15. Here we implement the // switch over used by the English-speaking world where 1752-09-02 was // followed by 1752-09-14. We also assume that the year always begins // with January 1, whereas in reality it often was reckoned to begin in // March. return 100 * (100 * y + m) + d >= 17520914; // or 15821015 } static bool gregorian(int s) { return s >= 639799; // 1752-09-14 } public: /** * Convert a date to the day numbering sequentially starting with * 0001-01-01 as day 1. * * @param[in] y the year (must be positive). * @param[in] m the month, Jan = 1, etc. (must be positive). Default = 1. * @param[in] d the day of the month (must be positive). Default = 1. * @return the sequential day number. **********************************************************************/ static int day(int y, int m = 1, int d = 1); /** * Convert a date to the day numbering sequentially starting with * 0001-01-01 as day 1. * * @param[in] y the year (must be positive). * @param[in] m the month, Jan = 1, etc. (must be positive). Default = 1. * @param[in] d the day of the month (must be positive). Default = 1. * @param[in] check whether to check the date. * @exception GeographicErr if the date is invalid and \e check is true. * @return the sequential day number. **********************************************************************/ static int day(int y, int m, int d, bool check); /** * Given a day (counting from 0001-01-01 as day 1), return the date. * * @param[in] s the sequential day number (must be positive) * @param[out] y the year. * @param[out] m the month, Jan = 1, etc. * @param[out] d the day of the month. **********************************************************************/ static void date(int s, int& y, int& m, int& d); /** * Given a date as a string in the format yyyy, yyyy-mm, or yyyy-mm-dd, * return the numeric values for the year, month, and day. No checking is * done on these values. The string "now" is interpreted as the present * date (in UTC). * * @param[in] s the date in string format. * @param[out] y the year. * @param[out] m the month, Jan = 1, etc. * @param[out] d the day of the month. * @exception GeographicErr is \e s is malformed. **********************************************************************/ static void date(const std::string& s, int& y, int& m, int& d); /** * Given the date, return the day of the week. * * @param[in] y the year (must be positive). * @param[in] m the month, Jan = 1, etc. (must be positive). * @param[in] d the day of the month (must be positive). * @return the day of the week with Sunday, Monday--Saturday = 0, * 1--6. **********************************************************************/ static int dow(int y, int m, int d) { return dow(day(y, m, d)); } /** * Given the sequential day, return the day of the week. * * @param[in] s the sequential day (must be positive). * @return the day of the week with Sunday, Monday--Saturday = 0, * 1--6. **********************************************************************/ static int dow(int s) { return (s + 5) % 7; // The 5 offset makes day 1 (0001-01-01) a Saturday. } /** * Convert a string representing a date to a fractional year. * * @tparam T the type of the argument. * @param[in] s the string to be converted. * @exception GeographicErr if \e s can't be interpreted as a date. * @return the fractional year. * * The string is first read as an ordinary number (e.g., 2010 or 2012.5); * if this is successful, the value is returned. Otherwise the string * should be of the form yyyy-mm or yyyy-mm-dd and this is converted to a * number with 2010-01-01 giving 2010.0 and 2012-07-03 giving 2012.5. The * string "now" is interpreted as the present date. **********************************************************************/ template static T fractionalyear(const std::string& s) { try { return val(s); } catch (const std::exception&) {} int y, m, d; date(s, y, m, d); int t = day(y, m, d, true); return T(y) + T(t - day(y)) / T(day(y + 1) - day(y)); } /** * Convert a object of type T to a string. * * @tparam T the type of the argument. * @param[in] x the value to be converted. * @param[in] p the precision used (default −1). * @exception std::bad_alloc if memory for the string can't be allocated. * @return the string representation. * * If \e p ≥ 0, then the number fixed format is used with \e p bits of * precision. With \e p < 0, there is no manipulation of the format, * except that boolalpha is used to represent bools as "true" * and "false". There is an overload of this function if T is Math::real; * this deals with inf and nan. **********************************************************************/ template static std::string str(T x, int p = -1) { std::ostringstream s; if (p >= 0) s << std::fixed << std::setprecision(p); s << std::boolalpha << x; return s.str(); } /** * Trim the white space from the beginning and end of a string. * * @param[in] s the string to be trimmed * @return the trimmed string **********************************************************************/ static std::string trim(const std::string& s); /** * Lookup up a character in a string. * * @param[in] s the string to be searched. * @param[in] c the character to look for. * @return the index of the first occurrence character in the string or * −1 is the character is not present. * * \e c is converted to upper case before search \e s. Therefore, it is * intended that \e s should not contain any lower case letters. **********************************************************************/ static int lookup(const std::string& s, char c); /** * Lookup up a character in a char*. * * @param[in] s the char* string to be searched. * @param[in] c the character to look for. * @return the index of the first occurrence character in the string or * −1 is the character is not present. * * \e c is converted to upper case before search \e s. Therefore, it is * intended that \e s should not contain any lower case letters. **********************************************************************/ static int lookup(const char* s, char c); /** * Convert a string to type T. * * @tparam T the type of the return value. * @param[in] s the string to be converted. * @exception GeographicErr is \e s is not readable as a T. * @return object of type T. * * White space at the beginning and end of \e s is ignored. * * Special handling is provided for some types. * * If T is a floating point type, then inf and nan are recognized. * * If T is bool, then \e s should either be string a representing 0 (false) * or 1 (true) or one of the strings * - "false", "f", "nil", "no", "n", "off", or "" meaning false, * - "true", "t", "yes", "y", or "on" meaning true; * . * case is ignored. * * If T is std::string, then \e s is returned (with the white space at the * beginning and end removed). **********************************************************************/ template static T val(const std::string& s) { // If T is bool, then the specialization val() defined below is // used. T x; std::string errmsg, t(trim(s)); do { // Executed once (provides the ability to break) std::istringstream is(t); if (!(is >> x)) { errmsg = "Cannot decode " + t; break; } int pos = int(is.tellg()); // Returns -1 at end of string? if (!(pos < 0 || pos == int(t.size()))) { errmsg = "Extra text " + t.substr(pos) + " at end of " + t; break; } return x; } while (false); x = std::numeric_limits::is_integer ? 0 : nummatch(t); if (x == 0) throw GeographicErr(errmsg); return x; } /** * Match "nan" and "inf" (and variants thereof) in a string. * * @tparam T the type of the return value (this should be a floating point * type). * @param[in] s the string to be matched. * @return appropriate special value (±∞, nan) or 0 if none is * found. * * White space is not allowed at the beginning or end of \e s. **********************************************************************/ template static T nummatch(const std::string& s) { if (s.length() < 3) return 0; std::string t(s); for (std::string::iterator p = t.begin(); p != t.end(); ++p) *p = char(std::toupper(*p)); for (size_t i = s.length(); i--;) t[i] = char(std::toupper(s[i])); int sign = t[0] == '-' ? -1 : 1; std::string::size_type p0 = t[0] == '-' || t[0] == '+' ? 1 : 0; std::string::size_type p1 = t.find_last_not_of('0'); if (p1 == std::string::npos || p1 + 1 < p0 + 3) return 0; // Strip off sign and trailing 0s t = t.substr(p0, p1 + 1 - p0); // Length at least 3 if (t == "NAN" || t == "1.#QNAN" || t == "1.#SNAN" || t == "1.#IND" || t == "1.#R") return Math::NaN(); else if (t == "INF" || t == "1.#INF" || t == "INFINITY") return sign * Math::infinity(); return 0; } /** * Read a simple fraction, e.g., 3/4, from a string to an object of type T. * * @tparam T the type of the return value. * @param[in] s the string to be converted. * @exception GeographicErr is \e s is not readable as a fraction of type * T. * @return object of type T * * \note The msys shell under Windows converts arguments which look like * pathnames into their Windows equivalents. As a result the argument * "-1/300" gets mangled into something unrecognizable. A workaround is to * use a floating point number in the numerator, i.e., "-1.0/300". (Recent * versions of the msys shell appear \e not to have this problem.) **********************************************************************/ template static T fract(const std::string& s) { std::string::size_type delim = s.find('/'); return !(delim != std::string::npos && delim >= 1 && delim + 2 <= s.size()) ? val(s) : // delim in [1, size() - 2] val(s.substr(0, delim)) / val(s.substr(delim + 1)); } /** * Read data of type ExtT from a binary stream to an array of type IntT. * The data in the file is in (bigendp ? big : little)-endian format. * * @tparam ExtT the type of the objects in the binary stream (external). * @tparam IntT the type of the objects in the array (internal). * @tparam bigendp true if the external storage format is big-endian. * @param[in] str the input stream containing the data of type ExtT * (external). * @param[out] array the output array of type IntT (internal). * @param[in] num the size of the array. * @exception GeographicErr if the data cannot be read. **********************************************************************/ template static void readarray(std::istream& str, IntT array[], size_t num) { #if GEOGRAPHICLIB_PRECISION < 4 if (sizeof(IntT) == sizeof(ExtT) && std::numeric_limits::is_integer == std::numeric_limits::is_integer) { // Data is compatible (aside from the issue of endian-ness). str.read(reinterpret_cast(array), num * sizeof(ExtT)); if (!str.good()) throw GeographicErr("Failure reading data"); if (bigendp != Math::bigendian) { // endian mismatch -> swap bytes for (size_t i = num; i--;) array[i] = Math::swab(array[i]); } } else #endif { const int bufsize = 1024; // read this many values at a time ExtT buffer[bufsize]; // temporary buffer int k = int(num); // data values left to read int i = 0; // index into output array while (k) { int n = (std::min)(k, bufsize); str.read(reinterpret_cast(buffer), n * sizeof(ExtT)); if (!str.good()) throw GeographicErr("Failure reading data"); for (int j = 0; j < n; ++j) // fix endian-ness and cast to IntT array[i++] = IntT(bigendp == Math::bigendian ? buffer[j] : Math::swab(buffer[j])); k -= n; } } return; } /** * Read data of type ExtT from a binary stream to a vector array of type * IntT. The data in the file is in (bigendp ? big : little)-endian * format. * * @tparam ExtT the type of the objects in the binary stream (external). * @tparam IntT the type of the objects in the array (internal). * @tparam bigendp true if the external storage format is big-endian. * @param[in] str the input stream containing the data of type ExtT * (external). * @param[out] array the output vector of type IntT (internal). * @exception GeographicErr if the data cannot be read. **********************************************************************/ template static void readarray(std::istream& str, std::vector& array) { if (array.size() > 0) readarray(str, &array[0], array.size()); } /** * Write data in an array of type IntT as type ExtT to a binary stream. * The data in the file is in (bigendp ? big : little)-endian format. * * @tparam ExtT the type of the objects in the binary stream (external). * @tparam IntT the type of the objects in the array (internal). * @tparam bigendp true if the external storage format is big-endian. * @param[out] str the output stream for the data of type ExtT (external). * @param[in] array the input array of type IntT (internal). * @param[in] num the size of the array. * @exception GeographicErr if the data cannot be written. **********************************************************************/ template static void writearray(std::ostream& str, const IntT array[], size_t num) { #if GEOGRAPHICLIB_PRECISION < 4 if (sizeof(IntT) == sizeof(ExtT) && std::numeric_limits::is_integer == std::numeric_limits::is_integer && bigendp == Math::bigendian) { // Data is compatible (including endian-ness). str.write(reinterpret_cast(array), num * sizeof(ExtT)); if (!str.good()) throw GeographicErr("Failure writing data"); } else #endif { const int bufsize = 1024; // write this many values at a time ExtT buffer[bufsize]; // temporary buffer int k = int(num); // data values left to write int i = 0; // index into output array while (k) { int n = (std::min)(k, bufsize); for (int j = 0; j < n; ++j) // cast to ExtT and fix endian-ness buffer[j] = bigendp == Math::bigendian ? ExtT(array[i++]) : Math::swab(ExtT(array[i++])); str.write(reinterpret_cast(buffer), n * sizeof(ExtT)); if (!str.good()) throw GeographicErr("Failure writing data"); k -= n; } } return; } /** * Write data in an array of type IntT as type ExtT to a binary stream. * The data in the file is in (bigendp ? big : little)-endian format. * * @tparam ExtT the type of the objects in the binary stream (external). * @tparam IntT the type of the objects in the array (internal). * @tparam bigendp true if the external storage format is big-endian. * @param[out] str the output stream for the data of type ExtT (external). * @param[in] array the input vector of type IntT (internal). * @exception GeographicErr if the data cannot be written. **********************************************************************/ template static void writearray(std::ostream& str, std::vector& array) { if (array.size() > 0) writearray(str, &array[0], array.size()); } /** * Parse a KEY [=] VALUE line. * * @param[in] line the input line. * @param[out] key the KEY. * @param[out] value the VALUE. * @param[in] equals character representing "equals" to separate KEY and * VALUE, if NULL (the default) use first space character. * @param[in] comment character to use as the comment character; if * non-NULL everything after this character is discarded; default is '#'. * @exception std::bad_alloc if memory for the internal strings can't be * allocated. * @return whether a key was found. * * The \e comment character (default is '#') and everything after it are * discarded and the result trimmed of leading and trailing white space. * Use the \e equals delimiter character (or, if it is NULL -- the default, * the first white space) to separate \e key and \e value. \e key and \e * value are trimmed of leading and trailing white space. If \e key is * empty, then \e value is set to "" and false is returned. **********************************************************************/ static bool ParseLine(const std::string& line, std::string& key, std::string& value, char equals = '\0', char comment = '#'); /** * Set the binary precision of a real number. * * @param[in] ndigits the number of bits of precision. If ndigits is 0 * (the default), then determine the precision from the environment * variable GEOGRAPHICLIB_DIGITS. If this is undefined, use ndigits = * 256 (i.e., about 77 decimal digits). * @return the resulting number of bits of precision. * * This only has an effect when GEOGRAPHICLIB_PRECISION = 5. The * precision should only be set once and before calls to any other * GeographicLib functions. (Several functions, for example Math::pi(), * cache the return value in a static local variable. The precision needs * to be set before a call to any such functions.) In multi-threaded * applications, it is necessary also to set the precision in each thread * (see the example GeoidToGTX.cpp). * * \note Use Math::digits() to return the current precision in bits. **********************************************************************/ static int set_digits(int ndigits = 0); }; /** * The specialization of Utility::val() for strings. * * @param[in] s the string to be converted. * @exception GeographicErr is \e s is not readable as a T. * @return the string trimmed of its whitespace. **********************************************************************/ template<> inline std::string Utility::val(const std::string& s) { return trim(s); } /** * The specialization of Utility::val() for bools. * * @param[in] s the string to be converted. * @exception GeographicErr is \e s is not readable as a T. * @return boolean value. * * \e s should either be string a representing 0 (false) * or 1 (true) or one of the strings * - "false", "f", "nil", "no", "n", "off", or "" meaning false, * - "true", "t", "yes", "y", or "on" meaning true; * . * case is ignored. **********************************************************************/ template<> inline bool Utility::val(const std::string& s) { std::string t(trim(s)); if (t.empty()) return false; bool x; { std::istringstream is(t); if (is >> x) { int pos = int(is.tellg()); // Returns -1 at end of string? if (!(pos < 0 || pos == int(t.size()))) throw GeographicErr("Extra text " + t.substr(pos) + " at end of " + t); return x; } } for (std::string::iterator p = t.begin(); p != t.end(); ++p) *p = char(std::tolower(*p)); switch (t[0]) { // already checked that t isn't empty case 'f': if (t == "f" || t == "false") return false; break; case 'n': if (t == "n" || t == "nil" || t == "no") return false; break; case 'o': if (t == "off") return false; else if (t == "on") return true; break; case 't': if (t == "t" || t == "true") return true; break; case 'y': if (t == "y" || t == "yes") return true; break; default: break; } throw GeographicErr("Cannot decode " + t + " as a bool"); } /** * Convert a Math::real object to a string. * * @param[in] x the value to be converted. * @param[in] p the precision used (default −1). * @exception std::bad_alloc if memory for the string can't be allocated. * @return the string representation. * * If \e p ≥ 0, then the number fixed format is used with p bits of * precision. With p < 0, there is no manipulation of the format. This is * an overload of str which deals with inf and nan. **********************************************************************/ template<> inline std::string Utility::str(Math::real x, int p) { using std::isfinite; if (!isfinite(x)) return x < 0 ? std::string("-inf") : (x > 0 ? std::string("inf") : std::string("nan")); std::ostringstream s; #if GEOGRAPHICLIB_PRECISION == 4 // boost-quadmath treats precision == 0 as "use as many digits as // necessary" (see https://svn.boost.org/trac/boost/ticket/10103 and // https://github.com/boostorg/multiprecision/issues/416) // Fixed by https://github.com/boostorg/multiprecision/pull/389 if (p == 0) { using std::signbit; using std::fabs; using std::round; using std::fmod; int n = signbit(x) ? -1 : 1; x = fabs(x); Math::real ix = round(x); // Rounds ties away from zero (up for positive) // Implement the "round ties to even" rule if (2 * (ix - x) == 1 && fmod(ix, Math::real(2)) == 1) --ix; s << std::fixed << std::setprecision(1) << n*ix; std::string r(s.str()); // strip off trailing ".0" return r.substr(0, (std::max)(int(r.size()) - 2, 0)); } #endif if (p >= 0) s << std::fixed << std::setprecision(p); s << x; return s.str(); } } // namespace GeographicLib #if defined(_MSC_VER) # pragma warning (pop) #endif #endif // GEOGRAPHICLIB_UTILITY_HPP geosphere/src/MagneticCircle.h0000644000176200001440000001634714323400205016050 0ustar liggesusers/** * \file MagneticCircle.hpp * \brief Header for GeographicLib::MagneticCircle class * * Copyright (c) Charles Karney (2011-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #if !defined(GEOGRAPHICLIB_MAGNETICCIRCLE_HPP) #define GEOGRAPHICLIB_MAGNETICCIRCLE_HPP 1 #include #include "Constants.h" #include "CircularEngine.h" namespace GeographicLib { /** * \brief Geomagnetic field on a circle of latitude * * Evaluate the earth's magnetic field on a circle of constant height and * latitude. This uses a CircularEngine to pre-evaluate the inner sum of the * spherical harmonic sum, allowing the values of the field at several * different longitudes to be evaluated rapidly. * * Use MagneticModel::Circle to create a MagneticCircle object. (The * constructor for this class is private.) * * Example of use: * \include example-MagneticCircle.cpp * * MagneticField is a command-line utility * providing access to the functionality of MagneticModel and MagneticCircle. **********************************************************************/ class GEOGRAPHICLIB_EXPORT MagneticCircle { private: typedef Math::real real; real _a, _f, _lat, _h, _t, _cphi, _sphi, _t1, _dt0; bool _interpolate, _constterm; CircularEngine _circ0, _circ1, _circ2; MagneticCircle(real a, real f, real lat, real h, real t, real cphi, real sphi, real t1, real dt0, bool interpolate, const CircularEngine& circ0, const CircularEngine& circ1) : _a(a) , _f(f) , _lat(Math::LatFix(lat)) , _h(h) , _t(t) , _cphi(cphi) , _sphi(sphi) , _t1(t1) , _dt0(dt0) , _interpolate(interpolate) , _constterm(false) , _circ0(circ0) , _circ1(circ1) {} MagneticCircle(real a, real f, real lat, real h, real t, real cphi, real sphi, real t1, real dt0, bool interpolate, const CircularEngine& circ0, const CircularEngine& circ1, const CircularEngine& circ2) : _a(a) , _f(f) , _lat(lat) , _h(h) , _t(t) , _cphi(cphi) , _sphi(sphi) , _t1(t1) , _dt0(dt0) , _interpolate(interpolate) , _constterm(true) , _circ0(circ0) , _circ1(circ1) , _circ2(circ2) {} void Field(real lon, bool diffp, real& Bx, real& By, real& Bz, real& Bxt, real& Byt, real& Bzt) const; void FieldGeocentric(real slam, real clam, real& BX, real& BY, real& BZ, real& BXt, real& BYt, real& BZt) const; friend class MagneticModel; // MagneticModel calls the private constructor public: /** * A default constructor for the normal gravity. This sets up an * uninitialized object which can be later replaced by the * MagneticModel::Circle. **********************************************************************/ MagneticCircle() : _a(-1) {} /** \name Compute the magnetic field **********************************************************************/ ///@{ /** * Evaluate the components of the geomagnetic field at a particular * longitude. * * @param[in] lon longitude of the point (degrees). * @param[out] Bx the easterly component of the magnetic field (nanotesla). * @param[out] By the northerly component of the magnetic field * (nanotesla). * @param[out] Bz the vertical (up) component of the magnetic field * (nanotesla). **********************************************************************/ void operator()(real lon, real& Bx, real& By, real& Bz) const { real dummy; Field(lon, false, Bx, By, Bz, dummy, dummy, dummy); } /** * Evaluate the components of the geomagnetic field and their time * derivatives at a particular longitude. * * @param[in] lon longitude of the point (degrees). * @param[out] Bx the easterly component of the magnetic field (nanotesla). * @param[out] By the northerly component of the magnetic field * (nanotesla). * @param[out] Bz the vertical (up) component of the magnetic field * (nanotesla). * @param[out] Bxt the rate of change of \e Bx (nT/yr). * @param[out] Byt the rate of change of \e By (nT/yr). * @param[out] Bzt the rate of change of \e Bz (nT/yr). **********************************************************************/ void operator()(real lon, real& Bx, real& By, real& Bz, real& Bxt, real& Byt, real& Bzt) const { Field(lon, true, Bx, By, Bz, Bxt, Byt, Bzt); } /** * Evaluate the components of the geomagnetic field and their time * derivatives at a particular longitude. * * @param[in] lon longitude of the point (degrees). * @param[out] BX the \e X component of the magnetic field (nT). * @param[out] BY the \e Y component of the magnetic field (nT). * @param[out] BZ the \e Z component of the magnetic field (nT). * @param[out] BXt the rate of change of \e BX (nT/yr). * @param[out] BYt the rate of change of \e BY (nT/yr). * @param[out] BZt the rate of change of \e BZ (nT/yr). **********************************************************************/ void FieldGeocentric(real lon, real& BX, real& BY, real& BZ, real& BXt, real& BYt, real& BZt) const; ///@} /** \name Inspector functions **********************************************************************/ ///@{ /** * @return true if the object has been initialized. **********************************************************************/ bool Init() const { return _a > 0; } /** * @return \e a the equatorial radius of the ellipsoid (meters). This is * the value inherited from the MagneticModel object used in the * constructor. **********************************************************************/ Math::real EquatorialRadius() const { return Init() ? _a : Math::NaN(); } /** * @return \e f the flattening of the ellipsoid. This is the value * inherited from the MagneticModel object used in the constructor. **********************************************************************/ Math::real Flattening() const { return Init() ? _f : Math::NaN(); } /** * @return the latitude of the circle (degrees). **********************************************************************/ Math::real Latitude() const { return Init() ? _lat : Math::NaN(); } /** * @return the height of the circle (meters). **********************************************************************/ Math::real Height() const { return Init() ? _h : Math::NaN(); } /** * @return the time (fractional years). **********************************************************************/ Math::real Time() const { return Init() ? _t : Math::NaN(); } ///@} }; } // namespace GeographicLib #endif // GEOGRAPHICLIB_MAGNETICCIRCLE_HPP geosphere/src/MGRS.cpp0000644000176200001440000004572714323376012014316 0ustar liggesusers/** * \file MGRS.cpp * \brief Implementation for GeographicLib::MGRS class * * Copyright (c) Charles Karney (2008-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #include "MGRS.h" #include "Utility.h" #if defined(_MSC_VER) // Squelch warnings about enum-float expressions and mixing enums # pragma warning (disable: 5055 5054) #endif namespace GeographicLib { using namespace std; const char* const MGRS::hemispheres_ = "SN"; const char* const MGRS::utmcols_[] = { "ABCDEFGH", "JKLMNPQR", "STUVWXYZ" }; const char* const MGRS::utmrow_ = "ABCDEFGHJKLMNPQRSTUV"; const char* const MGRS::upscols_[] = { "JKLPQRSTUXYZ", "ABCFGHJKLPQR", "RSTUXYZ", "ABCFGHJ" }; const char* const MGRS::upsrows_[] = { "ABCDEFGHJKLMNPQRSTUVWXYZ", "ABCDEFGHJKLMNP" }; const char* const MGRS::latband_ = "CDEFGHJKLMNPQRSTUVWX"; const char* const MGRS::upsband_ = "ABYZ"; const char* const MGRS::digits_ = "0123456789"; const int MGRS::mineasting_[] = { minupsSind_, minupsNind_, minutmcol_, minutmcol_ }; const int MGRS::maxeasting_[] = { maxupsSind_, maxupsNind_, maxutmcol_, maxutmcol_ }; const int MGRS::minnorthing_[] = { minupsSind_, minupsNind_, minutmSrow_, minutmSrow_ - (maxutmSrow_ - minutmNrow_) }; const int MGRS::maxnorthing_[] = { maxupsSind_, maxupsNind_, maxutmNrow_ + (maxutmSrow_ - minutmNrow_), maxutmNrow_ }; void MGRS::Forward(int zone, bool northp, real x, real y, real lat, int prec, std::string& mgrs) { using std::isnan; // Needed for Centos 7, ubuntu 14 // The smallest angle s.t., 90 - angeps() < 90 (approx 50e-12 arcsec) // 7 = ceil(log_2(90)) static const real angeps = ldexp(real(1), -(Math::digits() - 7)); if (zone == UTMUPS::INVALID || isnan(x) || isnan(y) || isnan(lat)) { mgrs = "INVALID"; return; } bool utmp = zone != 0; CheckCoords(utmp, northp, x, y); if (!(zone >= UTMUPS::MINZONE && zone <= UTMUPS::MAXZONE)) throw GeographicErr("Zone " + Utility::str(zone) + " not in [0,60]"); if (!(prec >= -1 && prec <= maxprec_)) throw GeographicErr("MGRS precision " + Utility::str(prec) + " not in [-1, " + Utility::str(int(maxprec_)) + "]"); // Fixed char array for accumulating string. Allow space for zone, 3 block // letters, easting + northing. Don't need to allow for terminating null. char mgrs1[2 + 3 + 2 * maxprec_]; int zone1 = zone - 1, z = utmp ? 2 : 0, mlen = z + 3 + 2 * prec; if (utmp) { mgrs1[0] = digits_[ zone / base_ ]; mgrs1[1] = digits_[ zone % base_ ]; // This isn't necessary...! Keep y non-neg // if (!northp) y -= maxutmSrow_ * tile_; } // The C++ standard mandates 64 bits for long long. But // check, to make sure. static_assert(numeric_limits::digits >= 44, "long long not wide enough to store 10e12"); // Guard against floor(x * mult_) being computed incorrectly on some // platforms. The problem occurs when x * mult_ is held in extended // precision and floor is inlined. This causes tests GeoConvert1[678] to // fail. Problem reported and diagnosed by Thorkil Naur with g++ 10.2.0 // under Cygwin. GEOGRAPHICLIB_VOLATILE real xx = x * mult_; GEOGRAPHICLIB_VOLATILE real yy = y * mult_; long long ix = (long long)(floor(xx)), iy = (long long)(floor(yy)), m = (long long)(mult_) * (long long)(tile_); int xh = int(ix / m), yh = int(iy / m); if (utmp) { int // Correct fuzziness in latitude near equator iband = fabs(lat) < angeps ? (northp ? 0 : -1) : LatitudeBand(lat), icol = xh - minutmcol_, irow = UTMRow(iband, icol, yh % utmrowperiod_); if (irow != yh - (northp ? minutmNrow_ : maxutmSrow_)) throw GeographicErr("Latitude " + Utility::str(lat) + " is inconsistent with UTM coordinates"); mgrs1[z++] = latband_[10 + iband]; mgrs1[z++] = utmcols_[zone1 % 3][icol]; mgrs1[z++] = utmrow_[(yh + (zone1 & 1 ? utmevenrowshift_ : 0)) % utmrowperiod_]; } else { bool eastp = xh >= upseasting_; int iband = (northp ? 2 : 0) + (eastp ? 1 : 0); mgrs1[z++] = upsband_[iband]; mgrs1[z++] = upscols_[iband][xh - (eastp ? upseasting_ : (northp ? minupsNind_ : minupsSind_))]; mgrs1[z++] = upsrows_[northp][yh - (northp ? minupsNind_ : minupsSind_)]; } if (prec > 0) { ix -= m * xh; iy -= m * yh; long long d = (long long)(pow(real(base_), maxprec_ - prec)); ix /= d; iy /= d; for (int c = prec; c--;) { mgrs1[z + c ] = digits_[ix % base_]; ix /= base_; mgrs1[z + c + prec] = digits_[iy % base_]; iy /= base_; } } mgrs.resize(mlen); copy(mgrs1, mgrs1 + mlen, mgrs.begin()); } void MGRS::Forward(int zone, bool northp, real x, real y, int prec, std::string& mgrs) { real lat, lon; if (zone > 0) { // Does a rough estimate for latitude determine the latitude band? real ys = northp ? y : y - utmNshift_; // A cheap calculation of the latitude which results in an "allowed" // latitude band would be // lat = ApproxLatitudeBand(ys) * 8 + 4; // // Here we do a more careful job using the band letter corresponding to // the actual latitude. ys /= tile_; if (fabs(ys) < 1) lat = real(0.9) * ys; // accurate enough estimate near equator else { real // The poleward bound is a fit from above of lat(x,y) // for x = 500km and y = [0km, 950km] latp = real(0.901) * ys + (ys > 0 ? 1 : -1) * real(0.135), // The equatorward bound is a fit from below of lat(x,y) // for x = 900km and y = [0km, 950km] late = real(0.902) * ys * (1 - real(1.85e-6) * ys * ys); if (LatitudeBand(latp) == LatitudeBand(late)) lat = latp; else // bounds straddle a band boundary so need to compute lat accurately UTMUPS::Reverse(zone, northp, x, y, lat, lon); } } else // Latitude isn't needed for UPS specs or for INVALID lat = 0; Forward(zone, northp, x, y, lat, prec, mgrs); } void MGRS::Reverse(const string& mgrs, int& zone, bool& northp, real& x, real& y, int& prec, bool centerp) { int p = 0, len = int(mgrs.length()); if (len >= 3 && toupper(mgrs[0]) == 'I' && toupper(mgrs[1]) == 'N' && toupper(mgrs[2]) == 'V') { zone = UTMUPS::INVALID; northp = false; x = y = Math::NaN(); prec = -2; return; } int zone1 = 0; while (p < len) { int i = Utility::lookup(digits_, mgrs[p]); if (i < 0) break; zone1 = 10 * zone1 + i; ++p; } if (p > 0 && !(zone1 >= UTMUPS::MINUTMZONE && zone1 <= UTMUPS::MAXUTMZONE)) throw GeographicErr("Zone " + Utility::str(zone1) + " not in [1,60]"); if (p > 2) throw GeographicErr("More than 2 digits at start of MGRS " + mgrs.substr(0, p)); if (len - p < 1) throw GeographicErr("MGRS string too short " + mgrs); bool utmp = zone1 != UTMUPS::UPS; int zonem1 = zone1 - 1; const char* band = utmp ? latband_ : upsband_; int iband = Utility::lookup(band, mgrs[p++]); if (iband < 0) throw GeographicErr("Band letter " + Utility::str(mgrs[p-1]) + " not in " + (utmp ? "UTM" : "UPS") + " set " + band); bool northp1 = iband >= (utmp ? 10 : 2); if (p == len) { // Grid zone only (ignore centerp) // Approx length of a degree of meridian arc in units of tile. real deg = real(utmNshift_) / (Math::qd * tile_); zone = zone1; northp = northp1; if (utmp) { // Pick central meridian except for 31V x = ((zone == 31 && iband == 17) ? 4 : 5) * tile_; // Pick center of 8deg latitude bands y = floor(8 * (iband - real(9.5)) * deg + real(0.5)) * tile_ + (northp ? 0 : utmNshift_); } else { // Pick point at lat 86N or 86S x = ((iband & 1 ? 1 : -1) * floor(4 * deg + real(0.5)) + upseasting_) * tile_; // Pick point at lon 90E or 90W. y = upseasting_ * tile_; } prec = -1; return; } else if (len - p < 2) throw GeographicErr("Missing row letter in " + mgrs); const char* col = utmp ? utmcols_[zonem1 % 3] : upscols_[iband]; const char* row = utmp ? utmrow_ : upsrows_[northp1]; int icol = Utility::lookup(col, mgrs[p++]); if (icol < 0) throw GeographicErr("Column letter " + Utility::str(mgrs[p-1]) + " not in " + (utmp ? "zone " + mgrs.substr(0, p-2) : "UPS band " + Utility::str(mgrs[p-2])) + " set " + col ); int irow = Utility::lookup(row, mgrs[p++]); if (irow < 0) throw GeographicErr("Row letter " + Utility::str(mgrs[p-1]) + " not in " + (utmp ? "UTM" : "UPS " + Utility::str(hemispheres_[northp1])) + " set " + row); if (utmp) { if (zonem1 & 1) irow = (irow + utmrowperiod_ - utmevenrowshift_) % utmrowperiod_; iband -= 10; irow = UTMRow(iband, icol, irow); if (irow == maxutmSrow_) throw GeographicErr("Block " + mgrs.substr(p-2, 2) + " not in zone/band " + mgrs.substr(0, p-2)); irow = northp1 ? irow : irow + 100; icol = icol + minutmcol_; } else { bool eastp = iband & 1; icol += eastp ? upseasting_ : (northp1 ? minupsNind_ : minupsSind_); irow += northp1 ? minupsNind_ : minupsSind_; } int prec1 = (len - p)/2; real unit = 1, x1 = icol, y1 = irow; for (int i = 0; i < prec1; ++i) { unit *= base_; int ix = Utility::lookup(digits_, mgrs[p + i]), iy = Utility::lookup(digits_, mgrs[p + i + prec1]); if (ix < 0 || iy < 0) throw GeographicErr("Encountered a non-digit in " + mgrs.substr(p)); x1 = base_ * x1 + ix; y1 = base_ * y1 + iy; } if ((len - p) % 2) { if (Utility::lookup(digits_, mgrs[len - 1]) < 0) throw GeographicErr("Encountered a non-digit in " + mgrs.substr(p)); else throw GeographicErr("Not an even number of digits in " + mgrs.substr(p)); } if (prec1 > maxprec_) throw GeographicErr("More than " + Utility::str(2*maxprec_) + " digits in " + mgrs.substr(p)); if (centerp) { unit *= 2; x1 = 2 * x1 + 1; y1 = 2 * y1 + 1; } zone = zone1; northp = northp1; x = (tile_ * x1) / unit; y = (tile_ * y1) / unit; prec = prec1; } void MGRS::CheckCoords(bool utmp, bool& northp, real& x, real& y) { // Limits are all multiples of 100km and are all closed on the lower end // and open on the upper end -- and this is reflected in the error // messages. However if a coordinate lies on the excluded upper end (e.g., // after rounding), it is shifted down by eps. This also folds UTM // northings to the correct N/S hemisphere. // The smallest length s.t., 1.0e7 - eps() < 1.0e7 (approx 1.9 nm) // 25 = ceil(log_2(2e7)) -- use half circumference here because // northing 195e5 is a legal in the "southern" hemisphere. static const real eps = ldexp(real(1), -(Math::digits() - 25)); int ix = int(floor(x / tile_)), iy = int(floor(y / tile_)), ind = (utmp ? 2 : 0) + (northp ? 1 : 0); if (! (ix >= mineasting_[ind] && ix < maxeasting_[ind]) ) { if (ix == maxeasting_[ind] && x == maxeasting_[ind] * tile_) x -= eps; else throw GeographicErr("Easting " + Utility::str(int(floor(x/1000))) + "km not in MGRS/" + (utmp ? "UTM" : "UPS") + " range for " + (northp ? "N" : "S" ) + " hemisphere [" + Utility::str(mineasting_[ind]*tile_/1000) + "km, " + Utility::str(maxeasting_[ind]*tile_/1000) + "km)"); } if (! (iy >= minnorthing_[ind] && iy < maxnorthing_[ind]) ) { if (iy == maxnorthing_[ind] && y == maxnorthing_[ind] * tile_) y -= eps; else throw GeographicErr("Northing " + Utility::str(int(floor(y/1000))) + "km not in MGRS/" + (utmp ? "UTM" : "UPS") + " range for " + (northp ? "N" : "S" ) + " hemisphere [" + Utility::str(minnorthing_[ind]*tile_/1000) + "km, " + Utility::str(maxnorthing_[ind]*tile_/1000) + "km)"); } // Correct the UTM northing and hemisphere if necessary if (utmp) { if (northp && iy < minutmNrow_) { northp = false; y += utmNshift_; } else if (!northp && iy >= maxutmSrow_) { if (y == maxutmSrow_ * tile_) // If on equator retain S hemisphere y -= eps; else { northp = true; y -= utmNshift_; } } } } int MGRS::UTMRow(int iband, int icol, int irow) { // Input is iband = band index in [-10, 10) (as returned by LatitudeBand), // icol = column index in [0,8) with origin of easting = 100km, and irow = // periodic row index in [0,20) with origin = equator. Output is true row // index in [-90, 95). Returns maxutmSrow_ = 100, if irow and iband are // incompatible. // Estimate center row number for latitude band // 90 deg = 100 tiles; 1 band = 8 deg = 100*8/90 tiles real c = 100 * (8 * iband + 4) / real(Math::qd); bool northp = iband >= 0; // These are safe bounds on the rows // iband minrow maxrow // -10 -90 -81 // -9 -80 -72 // -8 -71 -63 // -7 -63 -54 // -6 -54 -45 // -5 -45 -36 // -4 -36 -27 // -3 -27 -18 // -2 -18 -9 // -1 -9 -1 // 0 0 8 // 1 8 17 // 2 17 26 // 3 26 35 // 4 35 44 // 5 44 53 // 6 53 62 // 7 62 70 // 8 71 79 // 9 80 94 int minrow = iband > -10 ? int(floor(c - real(4.3) - real(0.1) * northp)) : -90, maxrow = iband < 9 ? int(floor(c + real(4.4) - real(0.1) * northp)) : 94, baserow = (minrow + maxrow) / 2 - utmrowperiod_ / 2; // Offset irow by the multiple of utmrowperiod_ which brings it as close as // possible to the center of the latitude band, (minrow + maxrow) / 2. // (Add maxutmSrow_ = 5 * utmrowperiod_ to ensure operand is positive.) irow = (irow - baserow + maxutmSrow_) % utmrowperiod_ + baserow; if (!( irow >= minrow && irow <= maxrow )) { // Outside the safe bounds, so need to check... // Northing = 71e5 and 80e5 intersect band boundaries // y = 71e5 in scol = 2 (x = [3e5,4e5] and x = [6e5,7e5]) // y = 80e5 in scol = 1 (x = [2e5,3e5] and x = [7e5,8e5]) // This holds for all the ellipsoids given in NGA.SIG.0012_2.0.0_UTMUPS. // The following deals with these special cases. int // Fold [-10,-1] -> [9,0] sband = iband >= 0 ? iband : -iband - 1, // Fold [-90,-1] -> [89,0] srow = irow >= 0 ? irow : -irow - 1, // Fold [4,7] -> [3,0] scol = icol < 4 ? icol : -icol + 7; // For example, the safe rows for band 8 are 71 - 79. However row 70 is // allowed if scol = [2,3] and row 80 is allowed if scol = [0,1]. if ( ! ( (srow == 70 && sband == 8 && scol >= 2) || (srow == 71 && sband == 7 && scol <= 2) || (srow == 79 && sband == 9 && scol >= 1) || (srow == 80 && sband == 8 && scol <= 1) ) ) irow = maxutmSrow_; } return irow; } void MGRS::Check() { real lat, lon, x, y, t = tile_; int zone; bool northp; UTMUPS::Reverse(31, true , 1*t, 0*t, lat, lon); if (!( lon < 0 )) throw GeographicErr("MGRS::Check: equator coverage failure"); UTMUPS::Reverse(31, true , 1*t, 95*t, lat, lon); if (!( lat > 84 )) throw GeographicErr("MGRS::Check: UTM doesn't reach latitude = 84"); UTMUPS::Reverse(31, false, 1*t, 10*t, lat, lon); if (!( lat < -80 )) throw GeographicErr("MGRS::Check: UTM doesn't reach latitude = -80"); UTMUPS::Forward(56, 3, zone, northp, x, y, 32); if (!( x > 1*t )) throw GeographicErr("MGRS::Check: Norway exception creates a gap"); UTMUPS::Forward(72, 21, zone, northp, x, y, 35); if (!( x > 1*t )) throw GeographicErr("MGRS::Check: Svalbard exception creates a gap"); UTMUPS::Reverse(0, true , 20*t, 13*t, lat, lon); if (!( lat < 84 )) throw GeographicErr("MGRS::Check: North UPS doesn't reach latitude = 84"); UTMUPS::Reverse(0, false, 20*t, 8*t, lat, lon); if (!( lat > -80 )) throw GeographicErr("MGRS::Check: South UPS doesn't reach latitude = -80"); // Entries are [band, x, y] either side of the band boundaries. Units for // x, y are t = 100km. const short tab[] = { 0, 5, 0, 0, 9, 0, // south edge of band 0 0, 5, 8, 0, 9, 8, // north edge of band 0 1, 5, 9, 1, 9, 9, // south edge of band 1 1, 5, 17, 1, 9, 17, // north edge of band 1 2, 5, 18, 2, 9, 18, // etc. 2, 5, 26, 2, 9, 26, 3, 5, 27, 3, 9, 27, 3, 5, 35, 3, 9, 35, 4, 5, 36, 4, 9, 36, 4, 5, 44, 4, 9, 44, 5, 5, 45, 5, 9, 45, 5, 5, 53, 5, 9, 53, 6, 5, 54, 6, 9, 54, 6, 5, 62, 6, 9, 62, 7, 5, 63, 7, 9, 63, 7, 5, 70, 7, 7, 70, 7, 7, 71, 7, 9, 71, // y = 71t crosses boundary 8, 5, 71, 8, 6, 71, 8, 6, 72, 8, 9, 72, // between bands 7 and 8. 8, 5, 79, 8, 8, 79, 8, 8, 80, 8, 9, 80, // y = 80t crosses boundary 9, 5, 80, 9, 7, 80, 9, 7, 81, 9, 9, 81, // between bands 8 and 9. 9, 5, 95, 9, 9, 95, // north edge of band 9 }; const int bandchecks = sizeof(tab) / (3 * sizeof(short)); for (int i = 0; i < bandchecks; ++i) { UTMUPS::Reverse(38, true, tab[3*i+1]*t, tab[3*i+2]*t, lat, lon); if (!( LatitudeBand(lat) == tab[3*i+0] )) throw GeographicErr("MGRS::Check: Band error, b = " + Utility::str(tab[3*i+0]) + ", x = " + Utility::str(tab[3*i+1]) + "00km, y = " + Utility::str(tab[3*i+2]) + "00km"); } } } // namespace GeographicLib geosphere/src/SphericalEngine.h0000644000176200001440000004050514323377037016250 0ustar liggesusers/** * \file SphericalEngine.hpp * \brief Header for GeographicLib::SphericalEngine class * * Copyright (c) Charles Karney (2011-2019) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #if !defined(GEOGRAPHICLIB_SPHERICALENGINE_HPP) #define GEOGRAPHICLIB_SPHERICALENGINE_HPP 1 #include #include #include "Constants.h" #if defined(_MSC_VER) // Squelch warnings about dll vs vector # pragma warning (push) # pragma warning (disable: 4251) #endif namespace GeographicLib { class CircularEngine; /** * \brief The evaluation engine for SphericalHarmonic * * This serves as the backend to SphericalHarmonic, SphericalHarmonic1, and * SphericalHarmonic2. Typically end-users will not have to access this * class directly. * * See SphericalEngine.cpp for more information on the implementation. * * Example of use: * \include example-SphericalEngine.cpp **********************************************************************/ class GEOGRAPHICLIB_EXPORT SphericalEngine { private: typedef Math::real real; // CircularEngine needs access to sqrttable, scale friend class CircularEngine; // Return the table of the square roots of integers static std::vector& sqrttable(); // An internal scaling of the coefficients to avoid overflow in // intermediate calculations. static real scale() { using std::pow; static const real // Need extra real because, since C++11, pow(float, int) returns double s = real(pow(real(std::numeric_limits::radix), -3 * (std::numeric_limits::max_exponent < (1<<14) ? std::numeric_limits::max_exponent : (1<<14)) / 5)); return s; } // Move latitudes near the pole off the axis by this amount. static real eps() { using std::sqrt; return std::numeric_limits::epsilon() * sqrt(std::numeric_limits::epsilon()); } SphericalEngine(); // Disable constructor public: /** * Supported normalizations for associated Legendre polynomials. **********************************************************************/ enum normalization { /** * Fully normalized associated Legendre polynomials. See * SphericalHarmonic::FULL for documentation. * * @hideinitializer **********************************************************************/ FULL = 0, /** * Schmidt semi-normalized associated Legendre polynomials. See * SphericalHarmonic::SCHMIDT for documentation. * * @hideinitializer **********************************************************************/ SCHMIDT = 1, }; /** * \brief Package up coefficients for SphericalEngine * * This packages up the \e C, \e S coefficients and information about how * the coefficients are stored into a single structure. This allows a * vector of type SphericalEngine::coeff to be passed to * SphericalEngine::Value. This class also includes functions to aid * indexing into \e C and \e S. * * The storage layout of the coefficients is documented in * SphericalHarmonic and SphericalHarmonic::SphericalHarmonic. **********************************************************************/ class GEOGRAPHICLIB_EXPORT coeff { private: int _nNx, _nmx, _mmx; std::vector::const_iterator _cCnm; std::vector::const_iterator _sSnm; public: /** * A default constructor **********************************************************************/ coeff() : _nNx(-1) , _nmx(-1) , _mmx(-1) {} /** * The general constructor. * * @param[in] C a vector of coefficients for the cosine terms. * @param[in] S a vector of coefficients for the sine terms. * @param[in] N the degree giving storage layout for \e C and \e S. * @param[in] nmx the maximum degree to be used. * @param[in] mmx the maximum order to be used. * @exception GeographicErr if \e N, \e nmx, and \e mmx do not satisfy * \e N ≥ \e nmx ≥ \e mmx ≥ −1. * @exception GeographicErr if \e C or \e S is not big enough to hold the * coefficients. * @exception std::bad_alloc if the memory for the square root table * can't be allocated. **********************************************************************/ coeff(const std::vector& C, const std::vector& S, int N, int nmx, int mmx) : _nNx(N) , _nmx(nmx) , _mmx(mmx) , _cCnm(C.begin()) , _sSnm(S.begin()) { if (!((_nNx >= _nmx && _nmx >= _mmx && _mmx >= 0) || // If mmx = -1 then the sums are empty so require nmx = -1 also. (_nmx == -1 && _mmx == -1))) throw GeographicErr("Bad indices for coeff"); if (!(index(_nmx, _mmx) < int(C.size()) && index(_nmx, _mmx) < int(S.size()) + (_nNx + 1))) throw GeographicErr("Arrays too small in coeff"); SphericalEngine::RootTable(_nmx); } /** * The constructor for full coefficient vectors. * * @param[in] C a vector of coefficients for the cosine terms. * @param[in] S a vector of coefficients for the sine terms. * @param[in] N the maximum degree and order. * @exception GeographicErr if \e N does not satisfy \e N ≥ −1. * @exception GeographicErr if \e C or \e S is not big enough to hold the * coefficients. * @exception std::bad_alloc if the memory for the square root table * can't be allocated. **********************************************************************/ coeff(const std::vector& C, const std::vector& S, int N) : _nNx(N) , _nmx(N) , _mmx(N) , _cCnm(C.begin()) , _sSnm(S.begin()) { if (!(_nNx >= -1)) throw GeographicErr("Bad indices for coeff"); if (!(index(_nmx, _mmx) < int(C.size()) && index(_nmx, _mmx) < int(S.size()) + (_nNx + 1))) throw GeographicErr("Arrays too small in coeff"); SphericalEngine::RootTable(_nmx); } /** * @return \e N the degree giving storage layout for \e C and \e S. **********************************************************************/ int N() const { return _nNx; } /** * @return \e nmx the maximum degree to be used. **********************************************************************/ int nmx() const { return _nmx; } /** * @return \e mmx the maximum order to be used. **********************************************************************/ int mmx() const { return _mmx; } /** * The one-dimensional index into \e C and \e S. * * @param[in] n the degree. * @param[in] m the order. * @return the one-dimensional index. **********************************************************************/ int index(int n, int m) const { return m * _nNx - m * (m - 1) / 2 + n; } /** * An element of \e C. * * @param[in] k the one-dimensional index. * @return the value of the \e C coefficient. **********************************************************************/ Math::real Cv(int k) const { return *(_cCnm + k); } /** * An element of \e S. * * @param[in] k the one-dimensional index. * @return the value of the \e S coefficient. **********************************************************************/ Math::real Sv(int k) const { return *(_sSnm + (k - (_nNx + 1))); } /** * An element of \e C with checking. * * @param[in] k the one-dimensional index. * @param[in] n the requested degree. * @param[in] m the requested order. * @param[in] f a multiplier. * @return the value of the \e C coefficient multiplied by \e f in \e n * and \e m are in range else 0. **********************************************************************/ Math::real Cv(int k, int n, int m, real f) const { return m > _mmx || n > _nmx ? 0 : *(_cCnm + k) * f; } /** * An element of \e S with checking. * * @param[in] k the one-dimensional index. * @param[in] n the requested degree. * @param[in] m the requested order. * @param[in] f a multiplier. * @return the value of the \e S coefficient multiplied by \e f in \e n * and \e m are in range else 0. **********************************************************************/ Math::real Sv(int k, int n, int m, real f) const { return m > _mmx || n > _nmx ? 0 : *(_sSnm + (k - (_nNx + 1))) * f; } /** * The size of the coefficient vector for the cosine terms. * * @param[in] N the maximum degree. * @param[in] M the maximum order. * @return the size of the vector of cosine terms as stored in column * major order. **********************************************************************/ static int Csize(int N, int M) { return (M + 1) * (2 * N - M + 2) / 2; } /** * The size of the coefficient vector for the sine terms. * * @param[in] N the maximum degree. * @param[in] M the maximum order. * @return the size of the vector of cosine terms as stored in column * major order. **********************************************************************/ static int Ssize(int N, int M) { return Csize(N, M) - (N + 1); } /** * Load coefficients from a binary stream. * * @param[in] stream the input stream. * @param[in,out] N The maximum degree of the coefficients. * @param[in,out] M The maximum order of the coefficients. * @param[out] C The vector of cosine coefficients. * @param[out] S The vector of sine coefficients. * @param[in] truncate if false (the default) then \e N and \e M are * determined by the values in the binary stream; otherwise, the input * values of \e N and \e M are used to truncate the coefficients read * from the stream at the given degree and order. * @exception GeographicErr if \e N and \e M do not satisfy \e N ≥ * \e M ≥ −1. * @exception GeographicErr if there's an error reading the data. * @exception std::bad_alloc if the memory for \e C or \e S can't be * allocated. * * \e N and \e M are read as 4-byte ints. \e C and \e S are resized to * accommodate all the coefficients (with the \e m = 0 coefficients for * \e S excluded) and the data for these coefficients read as 8-byte * doubles. The coefficients are stored in column major order. The * bytes in the stream should use little-endian ordering. IEEE floating * point is assumed for the coefficients. **********************************************************************/ static void readcoeffs(std::istream& stream, int& N, int& M, std::vector& C, std::vector& S, bool truncate = false); }; /** * Evaluate a spherical harmonic sum and its gradient. * * @tparam gradp should the gradient be calculated. * @tparam norm the normalization for the associated Legendre polynomials. * @tparam L the number of terms in the coefficients. * @param[in] c an array of coeff objects. * @param[in] f array of coefficient multipliers. f[0] should be 1. * @param[in] x the \e x component of the cartesian position. * @param[in] y the \e y component of the cartesian position. * @param[in] z the \e z component of the cartesian position. * @param[in] a the normalizing radius. * @param[out] gradx the \e x component of the gradient. * @param[out] grady the \e y component of the gradient. * @param[out] gradz the \e z component of the gradient. * @result the spherical harmonic sum. * * See the SphericalHarmonic class for the definition of the sum. The * coefficients used by this function are, for example, c[0].Cv + f[1] * * c[1].Cv + ... + f[L−1] * c[L−1].Cv. (Note that f[0] is \e * not used.) The upper limits on the sum are determined by c[0].nmx() and * c[0].mmx(); these limits apply to \e all the components of the * coefficients. The parameters \e gradp, \e norm, and \e L are template * parameters, to allow more optimization to be done at compile time. * * Clenshaw summation is used which permits the evaluation of the sum * without the need to allocate temporary arrays. Thus this function never * throws an exception. **********************************************************************/ template static Math::real Value(const coeff c[], const real f[], real x, real y, real z, real a, real& gradx, real& grady, real& gradz); /** * Create a CircularEngine object * * @tparam gradp should the gradient be calculated. * @tparam norm the normalization for the associated Legendre polynomials. * @tparam L the number of terms in the coefficients. * @param[in] c an array of coeff objects. * @param[in] f array of coefficient multipliers. f[0] should be 1. * @param[in] p the radius of the circle = sqrt(x2 + * y2). * @param[in] z the height of the circle. * @param[in] a the normalizing radius. * @exception std::bad_alloc if the memory for the CircularEngine can't be * allocated. * @result the CircularEngine object. * * If you need to evaluate the spherical harmonic sum for several points * with constant \e f, \e p = sqrt(x2 + * y2), \e z, and \e a, it is more efficient to construct * call SphericalEngine::Circle to give a CircularEngine object and then * call CircularEngine::operator()() with arguments x/\e p and * y/\e p. **********************************************************************/ template static CircularEngine Circle(const coeff c[], const real f[], real p, real z, real a); /** * Check that the static table of square roots is big enough and enlarge it * if necessary. * * @param[in] N the maximum degree to be used in SphericalEngine. * @exception std::bad_alloc if the memory for the square root table can't * be allocated. * * Typically, there's no need for an end-user to call this routine, because * the constructors for SphericalEngine::coeff do so. However, since this * updates a static table, there's a possible race condition in a * multi-threaded environment. Because this routine does nothing if the * table is already large enough, one way to avoid race conditions is to * call this routine at program start up (when it's still single threaded), * supplying the largest degree that your program will use. E.g., \code GeographicLib::SphericalEngine::RootTable(2190); \endcode * suffices to accommodate extant magnetic and gravity models. **********************************************************************/ static void RootTable(int N); /** * Clear the static table of square roots and release the memory. Call * this only when you are sure you no longer will be using SphericalEngine. * Your program will crash if you call SphericalEngine after calling this * routine. * * \warning It's safest not to call this routine at all. (The space used * by the table is modest.) **********************************************************************/ static void ClearRootTable() { std::vector temp(0); sqrttable().swap(temp); } }; } // namespace GeographicLib #if defined(_MSC_VER) # pragma warning (pop) #endif #endif // GEOGRAPHICLIB_SPHERICALENGINE_HPP geosphere/src/UTMUPS.cpp0000644000176200001440000002672514323376012014600 0ustar liggesusers/** * \file UTMUPS.cpp * \brief Implementation for GeographicLib::UTMUPS class * * Copyright (c) Charles Karney (2008-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #include "UTMUPS.h" #include "MGRS.h" #include "PolarStereographic.h" #include "TransverseMercator.h" #include "Utility.h" #if defined(_MSC_VER) // Squelch warnings about enum-float expressions # pragma warning (disable: 5055) #endif namespace GeographicLib { using namespace std; const int UTMUPS::falseeasting_[] = { MGRS::upseasting_ * MGRS::tile_, MGRS::upseasting_ * MGRS::tile_, MGRS::utmeasting_ * MGRS::tile_, MGRS::utmeasting_ * MGRS::tile_ }; const int UTMUPS::falsenorthing_[] = { MGRS::upseasting_ * MGRS::tile_, MGRS::upseasting_ * MGRS::tile_, MGRS::maxutmSrow_ * MGRS::tile_, MGRS::minutmNrow_ * MGRS::tile_ }; const int UTMUPS::mineasting_[] = { MGRS::minupsSind_ * MGRS::tile_, MGRS::minupsNind_ * MGRS::tile_, MGRS::minutmcol_ * MGRS::tile_, MGRS::minutmcol_ * MGRS::tile_ }; const int UTMUPS::maxeasting_[] = { MGRS::maxupsSind_ * MGRS::tile_, MGRS::maxupsNind_ * MGRS::tile_, MGRS::maxutmcol_ * MGRS::tile_, MGRS::maxutmcol_ * MGRS::tile_ }; const int UTMUPS::minnorthing_[] = { MGRS::minupsSind_ * MGRS::tile_, MGRS::minupsNind_ * MGRS::tile_, MGRS::minutmSrow_ * MGRS::tile_, (MGRS::minutmNrow_ + MGRS::minutmSrow_ - MGRS::maxutmSrow_) * MGRS::tile_ }; const int UTMUPS::maxnorthing_[] = { MGRS::maxupsSind_ * MGRS::tile_, MGRS::maxupsNind_ * MGRS::tile_, (MGRS::maxutmSrow_ + MGRS::maxutmNrow_ - MGRS::minutmNrow_) * MGRS::tile_, MGRS::maxutmNrow_ * MGRS::tile_ }; int UTMUPS::StandardZone(real lat, real lon, int setzone) { using std::isnan; // Needed for Centos 7, ubuntu 14 if (!(setzone >= MINPSEUDOZONE && setzone <= MAXZONE)) throw GeographicErr("Illegal zone requested " + Utility::str(setzone)); if (setzone >= MINZONE || setzone == INVALID) return setzone; if (isnan(lat) || isnan(lon)) // Check if lat or lon is a NaN return INVALID; if (setzone == UTM || (lat >= -80 && lat < 84)) { int ilon = int(floor(Math::AngNormalize(lon))); if (ilon == Math::hd) ilon = -Math::hd; // ilon now in [-180,180) int zone = (ilon + 186)/6; int band = MGRS::LatitudeBand(lat); if (band == 7 && zone == 31 && ilon >= 3) // The Norway exception zone = 32; else if (band == 9 && ilon >= 0 && ilon < 42) // The Svalbard exception zone = 2 * ((ilon + 183)/12) + 1; return zone; } else return UPS; } void UTMUPS::Forward(real lat, real lon, int& zone, bool& northp, real& x, real& y, real& gamma, real& k, int setzone, bool mgrslimits) { if (fabs(lat) > Math::qd) throw GeographicErr("Latitude " + Utility::str(lat) + "d not in [-" + to_string(Math::qd) + "d, " + to_string(Math::qd) + "d]"); bool northp1 = !(signbit(lat)); int zone1 = StandardZone(lat, lon, setzone); if (zone1 == INVALID) { zone = zone1; northp = northp1; x = y = gamma = k = Math::NaN(); return; } real x1, y1, gamma1, k1; bool utmp = zone1 != UPS; if (utmp) { real lon0 = CentralMeridian(zone1), dlon = Math::AngDiff(lon0, lon); if (!(dlon <= 60)) // Check isn't really necessary because CheckCoords catches this case. // But this allows a more meaningful error message to be given. throw GeographicErr("Longitude " + Utility::str(lon) + "d more than 60d from center of UTM zone " + Utility::str(zone1)); TransverseMercator::UTM().Forward(lon0, lat, lon, x1, y1, gamma1, k1); } else { if (fabs(lat) < 70) // Check isn't really necessary ... (see above). throw GeographicErr("Latitude " + Utility::str(lat) + "d more than 20d from " + (northp1 ? "N" : "S") + " pole"); PolarStereographic::UPS().Forward(northp1, lat, lon, x1, y1, gamma1, k1); } int ind = (utmp ? 2 : 0) + (northp1 ? 1 : 0); x1 += falseeasting_[ind]; y1 += falsenorthing_[ind]; if (! CheckCoords(zone1 != UPS, northp1, x1, y1, mgrslimits, false) ) throw GeographicErr("Latitude " + Utility::str(lat) + ", longitude " + Utility::str(lon) + " out of legal range for " + (utmp ? "UTM zone " + Utility::str(zone1) : "UPS")); zone = zone1; northp = northp1; x = x1; y = y1; gamma = gamma1; k = k1; } void UTMUPS::Reverse(int zone, bool northp, real x, real y, real& lat, real& lon, real& gamma, real& k, bool mgrslimits) { using std::isnan; // Needed for Centos 7, ubuntu 14 if (zone == INVALID || isnan(x) || isnan(y)) { lat = lon = gamma = k = Math::NaN(); return; } if (!(zone >= MINZONE && zone <= MAXZONE)) throw GeographicErr("Zone " + Utility::str(zone) + " not in range [0, 60]"); bool utmp = zone != UPS; CheckCoords(utmp, northp, x, y, mgrslimits); int ind = (utmp ? 2 : 0) + (northp ? 1 : 0); x -= falseeasting_[ind]; y -= falsenorthing_[ind]; if (utmp) TransverseMercator::UTM().Reverse(CentralMeridian(zone), x, y, lat, lon, gamma, k); else PolarStereographic::UPS().Reverse(northp, x, y, lat, lon, gamma, k); } bool UTMUPS::CheckCoords(bool utmp, bool northp, real x, real y, bool mgrslimits, bool throwp) { // Limits are all multiples of 100km and are all closed on the both ends. // Failure tests are such that NaNs succeed. real slop = mgrslimits ? 0 : MGRS::tile_; int ind = (utmp ? 2 : 0) + (northp ? 1 : 0); if (x < mineasting_[ind] - slop || x > maxeasting_[ind] + slop) { if (!throwp) return false; throw GeographicErr("Easting " + Utility::str(x/1000) + "km not in " + (mgrslimits ? "MGRS/" : "") + (utmp ? "UTM" : "UPS") + " range for " + (northp ? "N" : "S" ) + " hemisphere [" + Utility::str((mineasting_[ind] - slop)/1000) + "km, " + Utility::str((maxeasting_[ind] + slop)/1000) + "km]"); } if (y < minnorthing_[ind] - slop || y > maxnorthing_[ind] + slop) { if (!throwp) return false; throw GeographicErr("Northing " + Utility::str(y/1000) + "km not in " + (mgrslimits ? "MGRS/" : "") + (utmp ? "UTM" : "UPS") + " range for " + (northp ? "N" : "S" ) + " hemisphere [" + Utility::str((minnorthing_[ind] - slop)/1000) + "km, " + Utility::str((maxnorthing_[ind] + slop)/1000) + "km]"); } return true; } void UTMUPS::Transfer(int zonein, bool northpin, real xin, real yin, int zoneout, bool northpout, real& xout, real& yout, int& zone) { bool northp = northpin; if (zonein != zoneout) { // Determine lat, lon real lat, lon; GeographicLib::UTMUPS::Reverse(zonein, northpin, xin, yin, lat, lon); // Try converting to zoneout real x, y; int zone1; GeographicLib::UTMUPS::Forward(lat, lon, zone1, northp, x, y, zoneout == UTMUPS::MATCH ? zonein : zoneout); if (zone1 == 0 && northp != northpout) throw GeographicErr ("Attempt to transfer UPS coordinates between hemispheres"); zone = zone1; xout = x; yout = y; } else { if (zoneout == 0 && northp != northpout) throw GeographicErr ("Attempt to transfer UPS coordinates between hemispheres"); zone = zoneout; xout = xin; yout = yin; } if (northp != northpout) // Can't get here if UPS yout += (northpout ? -1 : 1) * MGRS::utmNshift_; return; } void UTMUPS::DecodeZone(const string& zonestr, int& zone, bool& northp) { unsigned zlen = unsigned(zonestr.size()); if (zlen == 0) throw GeographicErr("Empty zone specification"); // Longest zone spec is 32north, 42south, invalid = 7 if (zlen > 7) throw GeographicErr("More than 7 characters in zone specification " + zonestr); const char* c = zonestr.c_str(); char* q; int zone1 = strtol(c, &q, 10); // if (zone1 == 0) zone1 = UPS; (not necessary) if (zone1 == UPS) { if (!(q == c)) // Don't allow 0n as an alternative to n for UPS coordinates throw GeographicErr("Illegal zone 0 in " + zonestr + ", use just the hemisphere for UPS"); } else if (!(zone1 >= MINUTMZONE && zone1 <= MAXUTMZONE)) throw GeographicErr("Zone " + Utility::str(zone1) + " not in range [1, 60]"); else if (!isdigit(zonestr[0])) throw GeographicErr("Must use unsigned number for zone " + Utility::str(zone1)); else if (q - c > 2) throw GeographicErr("More than 2 digits use to specify zone " + Utility::str(zone1)); string hemi(zonestr, q - c); for (string::iterator p = hemi.begin(); p != hemi.end(); ++p) *p = char(tolower(*p)); if (q == c && (hemi == "inv" || hemi == "invalid")) { zone = INVALID; northp = false; return; } bool northp1 = hemi == "north" || hemi == "n"; if (!(northp1 || hemi == "south" || hemi == "s")) throw GeographicErr(string("Illegal hemisphere ") + hemi + " in " + zonestr + ", specify north or south"); zone = zone1; northp = northp1; } string UTMUPS::EncodeZone(int zone, bool northp, bool abbrev) { if (zone == INVALID) return string(abbrev ? "inv" : "invalid"); if (!(zone >= MINZONE && zone <= MAXZONE)) throw GeographicErr("Zone " + Utility::str(zone) + " not in range [0, 60]"); ostringstream os; if (zone != UPS) os << setfill('0') << setw(2) << zone; if (abbrev) os << (northp ? 'n' : 's'); else os << (northp ? "north" : "south"); return os.str(); } void UTMUPS::DecodeEPSG(int epsg, int& zone, bool& northp) { northp = false; if (epsg >= epsg01N && epsg <= epsg60N) { zone = (epsg - epsg01N) + MINUTMZONE; northp = true; } else if (epsg == epsgN) { zone = UPS; northp = true; } else if (epsg >= epsg01S && epsg <= epsg60S) { zone = (epsg - epsg01S) + MINUTMZONE; } else if (epsg == epsgS) { zone = UPS; } else { zone = INVALID; } } int UTMUPS::EncodeEPSG(int zone, bool northp) { int epsg = -1; if (zone == UPS) epsg = epsgS; else if (zone >= MINUTMZONE && zone <= MAXUTMZONE) epsg = (zone - MINUTMZONE) + epsg01S; if (epsg >= 0 && northp) epsg += epsgN - epsgS; return epsg; } Math::real UTMUPS::UTMShift() { return real(MGRS::utmNshift_); } } // namespace GeographicLib geosphere/src/Utility.cpp0000644000176200001440000001630214323401076015173 0ustar liggesusers/** * \file Utility.cpp * \brief Implementation for GeographicLib::Utility class * * Copyright (c) Charles Karney (2011-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #include #include "Utility.h" #if defined(_MSC_VER) // Squelch warnings about unsafe use of getenv # pragma warning (disable: 4996) #endif namespace GeographicLib { using namespace std; int Utility::day(int y, int m, int d) { // Convert from date to sequential day and vice versa // // Here is some code to convert a date to sequential day and vice // versa. The sequential day is numbered so that January 1, 1 AD is day 1 // (a Saturday). So this is offset from the "Julian" day which starts the // numbering with 4713 BC. // // This is inspired by a talk by John Conway at the John von Neumann // National Supercomputer Center when he described his Doomsday algorithm // for figuring the day of the week. The code avoids explicitly doing ifs // (except for the decision of whether to use the Julian or Gregorian // calendar). Instead the equivalent result is achieved using integer // arithmetic. I got this idea from the routine for the day of the week // in MACLisp (I believe that that routine was written by Guy Steele). // // There are three issues to take care of // // 1. the rules for leap years, // 2. the inconvenient placement of leap days at the end of February, // 3. the irregular pattern of month lengths. // // We deal with these as follows: // // 1. Leap years are given by simple rules which are straightforward to // accommodate. // // 2. We simplify the calculations by moving January and February to the // previous year. Here we internally number the months March–December, // January, February as 0–9, 10, 11. // // 3. The pattern of month lengths from March through January is regular // with a 5-month period—31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 31. The // 5-month period is 153 days long. Since February is now at the end of // the year, we don't need to include its length in this part of the // calculation. bool greg = gregorian(y, m, d); y += (m + 9) / 12 - 1; // Move Jan and Feb to previous year, m = (m + 9) % 12; // making March month 0. return (1461 * y) / 4 // Julian years converted to days. Julian year is 365 + // 1/4 = 1461/4 days. // Gregorian leap year corrections. The 2 offset with respect to the // Julian calendar synchronizes the vernal equinox with that at the // time of the Council of Nicea (325 AD). + (greg ? (y / 100) / 4 - (y / 100) + 2 : 0) + (153 * m + 2) / 5 // The zero-based start of the m'th month + d - 1 // The zero-based day - 305; // The number of days between March 1 and December 31. // This makes 0001-01-01 day 1 } int Utility::day(int y, int m, int d, bool check) { int s = day(y, m, d); if (!check) return s; int y1, m1, d1; date(s, y1, m1, d1); if (!(s > 0 && y == y1 && m == m1 && d == d1)) throw GeographicErr("Invalid date " + str(y) + "-" + str(m) + "-" + str(d) + (s > 0 ? "; use " + str(y1) + "-" + str(m1) + "-" + str(d1) : " before 0001-01-01")); return s; } void Utility::date(int s, int& y, int& m, int& d) { int c = 0; bool greg = gregorian(s); s += 305; // s = 0 on March 1, 1BC if (greg) { s -= 2; // The 2 day Gregorian offset // Determine century with the Gregorian rules for leap years. The // Gregorian year is 365 + 1/4 - 1/100 + 1/400 = 146097/400 days. c = (4 * s + 3) / 146097; s -= (c * 146097) / 4; // s = 0 at beginning of century } y = (4 * s + 3) / 1461; // Determine the year using Julian rules. s -= (1461 * y) / 4; // s = 0 at start of year, i.e., March 1 y += c * 100; // Assemble full year m = (5 * s + 2) / 153; // Determine the month s -= (153 * m + 2) / 5; // s = 0 at beginning of month d = s + 1; // Determine day of month y += (m + 2) / 12; // Move Jan and Feb back to original year m = (m + 2) % 12 + 1; // Renumber the months so January = 1 } void Utility::date(const std::string& s, int& y, int& m, int& d) { if (s == "now") { time_t t = time(0); struct tm* now = gmtime(&t); y = now->tm_year + 1900; m = now->tm_mon + 1; d = now->tm_mday; return; } int y1, m1 = 1, d1 = 1; const char* digits = "0123456789"; string::size_type p1 = s.find_first_not_of(digits); if (p1 == string::npos) y1 = val(s); else if (s[p1] != '-') throw GeographicErr("Delimiter not hyphen in date " + s); else if (p1 == 0) throw GeographicErr("Empty year field in date " + s); else { y1 = val(s.substr(0, p1)); if (++p1 == s.size()) throw GeographicErr("Empty month field in date " + s); string::size_type p2 = s.find_first_not_of(digits, p1); if (p2 == string::npos) m1 = val(s.substr(p1)); else if (s[p2] != '-') throw GeographicErr("Delimiter not hyphen in date " + s); else if (p2 == p1) throw GeographicErr("Empty month field in date " + s); else { m1 = val(s.substr(p1, p2 - p1)); if (++p2 == s.size()) throw GeographicErr("Empty day field in date " + s); d1 = val(s.substr(p2)); } } y = y1; m = m1; d = d1; } std::string Utility::trim(const std::string& s) { unsigned beg = 0, end = unsigned(s.size()); while (beg < end && isspace(s[beg])) ++beg; while (beg < end && isspace(s[end - 1])) --end; return string(s, beg, end-beg); } int Utility::lookup(const std::string& s, char c) { string::size_type r = s.find(char(toupper(c))); return r == string::npos ? -1 : int(r); } int Utility::lookup(const char* s, char c) { const char* p = strchr(s, toupper(c)); return p != NULL ? int(p - s) : -1; } bool Utility::ParseLine(const std::string& line, std::string& key, std::string& value, char equals, char comment) { key.clear(); value.clear(); string::size_type n = comment ? line.find(comment) : line.size(); string linea = trim(line.substr(0, n)); if (linea.empty()) return false; n = equals ? linea.find(equals) : linea.find_first_of(" \t\n\v\f\r"); key = trim(linea.substr(0, n)); if (key.empty()) return false; if (n != string::npos) value = trim(linea.substr(n + 1)); return true; } int Utility::set_digits(int ndigits) { #if GEOGRAPHICLIB_PRECISION == 5 if (ndigits <= 0) { char* digitenv = getenv("GEOGRAPHICLIB_DIGITS"); if (digitenv) ndigits = strtol(digitenv, NULL, 0); if (ndigits <= 0) ndigits = 256; } #endif return Math::set_digits(ndigits); } } // namespace GeographicLib geosphere/src/CassiniSoldner.cpp0000644000176200001440000000570314323376011016453 0ustar liggesusers/** * \file CassiniSoldner.cpp * \brief Implementation for GeographicLib::CassiniSoldner class * * Copyright (c) Charles Karney (2009-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #include "CassiniSoldner.h" #if defined(_MSC_VER) // Squelch warnings about enum-float expressions # pragma warning (disable: 5055) #endif namespace GeographicLib { using namespace std; CassiniSoldner::CassiniSoldner(const Geodesic& earth) : _earth(earth) {} CassiniSoldner::CassiniSoldner(real lat0, real lon0, const Geodesic& earth) : _earth(earth) { Reset(lat0, lon0); } void CassiniSoldner::Reset(real lat0, real lon0) { _meridian = _earth.Line(lat0, lon0, real(0), Geodesic::LATITUDE | Geodesic::LONGITUDE | Geodesic::DISTANCE | Geodesic::DISTANCE_IN | Geodesic::AZIMUTH); real f = _earth.Flattening(); Math::sincosd(LatitudeOrigin(), _sbet0, _cbet0); _sbet0 *= (1 - f); Math::norm(_sbet0, _cbet0); } void CassiniSoldner::Forward(real lat, real lon, real& x, real& y, real& azi, real& rk) const { if (!Init()) return; real dlon = Math::AngDiff(LongitudeOrigin(), lon); real sig12, s12, azi1, azi2; sig12 = _earth.Inverse(lat, -fabs(dlon), lat, fabs(dlon), s12, azi1, azi2); sig12 *= real(0.5); s12 *= real(0.5); if (s12 == 0) { real da = Math::AngDiff(azi1, azi2)/2; if (fabs(dlon) <= Math::qd) { azi1 = Math::qd - da; azi2 = Math::qd + da; } else { azi1 = -Math::qd - da; azi2 = -Math::qd + da; } } if (signbit(dlon)) { azi2 = azi1; s12 = -s12; sig12 = -sig12; } x = s12; azi = Math::AngNormalize(azi2); GeodesicLine perp(_earth.Line(lat, dlon, azi, Geodesic::GEODESICSCALE)); real t; perp.GenPosition(true, -sig12, Geodesic::GEODESICSCALE, t, t, t, t, t, t, rk, t); real salp0, calp0; Math::sincosd(perp.EquatorialAzimuth(), salp0, calp0); real sbet1 = lat >=0 ? calp0 : -calp0, cbet1 = fabs(dlon) <= Math::qd ? fabs(salp0) : -fabs(salp0), sbet01 = sbet1 * _cbet0 - cbet1 * _sbet0, cbet01 = cbet1 * _cbet0 + sbet1 * _sbet0, sig01 = atan2(sbet01, cbet01) / Math::degree(); _meridian.GenPosition(true, sig01, Geodesic::DISTANCE, t, t, t, y, t, t, t, t); } void CassiniSoldner::Reverse(real x, real y, real& lat, real& lon, real& azi, real& rk) const { if (!Init()) return; real lat1, lon1; real azi0, t; _meridian.Position(y, lat1, lon1, azi0); _earth.Direct(lat1, lon1, azi0 + Math::qd, x, lat, lon, azi, rk, t); } } // namespace GeographicLib geosphere/src/Geocentric.cpp0000644000176200001440000001523614323376011015617 0ustar liggesusers/** * \file Geocentric.cpp * \brief Implementation for GeographicLib::Geocentric class * * Copyright (c) Charles Karney (2008-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #include "Geocentric.h" namespace GeographicLib { using namespace std; Geocentric::Geocentric(real a, real f) : _a(a) , _f(f) , _e2(_f * (2 - _f)) , _e2m(Math::sq(1 - _f)) // 1 - _e2 , _e2a(fabs(_e2)) , _e4a(Math::sq(_e2)) , _maxrad(2 * _a / numeric_limits::epsilon()) { if (!(isfinite(_a) && _a > 0)) throw GeographicErr("Equatorial radius is not positive"); if (!(isfinite(_f) && _f < 1)) throw GeographicErr("Polar semi-axis is not positive"); } const Geocentric& Geocentric::WGS84() { static const Geocentric wgs84(Constants::WGS84_a(), Constants::WGS84_f()); return wgs84; } void Geocentric::IntForward(real lat, real lon, real h, real& X, real& Y, real& Z, real M[dim2_]) const { real sphi, cphi, slam, clam; Math::sincosd(Math::LatFix(lat), sphi, cphi); Math::sincosd(lon, slam, clam); real n = _a/sqrt(1 - _e2 * Math::sq(sphi)); Z = (_e2m * n + h) * sphi; X = (n + h) * cphi; Y = X * slam; X *= clam; if (M) Rotation(sphi, cphi, slam, clam, M); } void Geocentric::IntReverse(real X, real Y, real Z, real& lat, real& lon, real& h, real M[dim2_]) const { real R = hypot(X, Y), slam = R != 0 ? Y / R : 0, clam = R != 0 ? X / R : 1; h = hypot(R, Z); // Distance to center of earth real sphi, cphi; if (h > _maxrad) { // We really far away (> 12 million light years); treat the earth as a // point and h, above, is an acceptable approximation to the height. // This avoids overflow, e.g., in the computation of disc below. It's // possible that h has overflowed to inf; but that's OK. // // Treat the case X, Y finite, but R overflows to +inf by scaling by 2. R = hypot(X/2, Y/2); slam = R != 0 ? (Y/2) / R : 0; clam = R != 0 ? (X/2) / R : 1; real H = hypot(Z/2, R); sphi = (Z/2) / H; cphi = R / H; } else if (_e4a == 0) { // Treat the spherical case. Dealing with underflow in the general case // with _e2 = 0 is difficult. Origin maps to N pole same as with // ellipsoid. real H = hypot(h == 0 ? 1 : Z, R); sphi = (h == 0 ? 1 : Z) / H; cphi = R / H; h -= _a; } else { // Treat prolate spheroids by swapping R and Z here and by switching // the arguments to phi = atan2(...) at the end. real p = Math::sq(R / _a), q = _e2m * Math::sq(Z / _a), r = (p + q - _e4a) / 6; if (_f < 0) swap(p, q); if ( !(_e4a * q == 0 && r <= 0) ) { real // Avoid possible division by zero when r = 0 by multiplying // equations for s and t by r^3 and r, resp. S = _e4a * p * q / 4, // S = r^3 * s r2 = Math::sq(r), r3 = r * r2, disc = S * (2 * r3 + S); real u = r; if (disc >= 0) { real T3 = S + r3; // Pick the sign on the sqrt to maximize abs(T3). This minimizes // loss of precision due to cancellation. The result is unchanged // because of the way the T is used in definition of u. T3 += T3 < 0 ? -sqrt(disc) : sqrt(disc); // T3 = (r * t)^3 // N.B. cbrt always returns the real root. cbrt(-8) = -2. real T = cbrt(T3); // T = r * t // T can be zero; but then r2 / T -> 0. u += T + (T != 0 ? r2 / T : 0); } else { // T is complex, but the way u is defined the result is real. real ang = atan2(sqrt(-disc), -(S + r3)); // There are three possible cube roots. We choose the root which // avoids cancellation. Note that disc < 0 implies that r < 0. u += 2 * r * cos(ang / 3); } real v = sqrt(Math::sq(u) + _e4a * q), // guaranteed positive // Avoid loss of accuracy when u < 0. Underflow doesn't occur in // e4 * q / (v - u) because u ~ e^4 when q is small and u < 0. uv = u < 0 ? _e4a * q / (v - u) : u + v, // u+v, guaranteed positive // Need to guard against w going negative due to roundoff in uv - q. w = fmax(real(0), _e2a * (uv - q) / (2 * v)), // Rearrange expression for k to avoid loss of accuracy due to // subtraction. Division by 0 not possible because uv > 0, w >= 0. k = uv / (sqrt(uv + Math::sq(w)) + w), k1 = _f >= 0 ? k : k - _e2, k2 = _f >= 0 ? k + _e2 : k, d = k1 * R / k2, H = hypot(Z/k1, R/k2); sphi = (Z/k1) / H; cphi = (R/k2) / H; h = (1 - _e2m/k1) * hypot(d, Z); } else { // e4 * q == 0 && r <= 0 // This leads to k = 0 (oblate, equatorial plane) and k + e^2 = 0 // (prolate, rotation axis) and the generation of 0/0 in the general // formulas for phi and h. using the general formula and division by 0 // in formula for h. So handle this case by taking the limits: // f > 0: z -> 0, k -> e2 * sqrt(q)/sqrt(e4 - p) // f < 0: R -> 0, k + e2 -> - e2 * sqrt(q)/sqrt(e4 - p) real zz = sqrt((_f >= 0 ? _e4a - p : p) / _e2m), xx = sqrt( _f < 0 ? _e4a - p : p ), H = hypot(zz, xx); sphi = zz / H; cphi = xx / H; if (Z < 0) sphi = -sphi; // for tiny negative Z (not for prolate) h = - _a * (_f >= 0 ? _e2m : 1) * H / _e2a; } } lat = Math::atan2d(sphi, cphi); lon = Math::atan2d(slam, clam); if (M) Rotation(sphi, cphi, slam, clam, M); } void Geocentric::Rotation(real sphi, real cphi, real slam, real clam, real M[dim2_]) { // This rotation matrix is given by the following quaternion operations // qrot(lam, [0,0,1]) * qrot(phi, [0,-1,0]) * [1,1,1,1]/2 // or // qrot(pi/2 + lam, [0,0,1]) * qrot(-pi/2 + phi , [-1,0,0]) // where // qrot(t,v) = [cos(t/2), sin(t/2)*v[1], sin(t/2)*v[2], sin(t/2)*v[3]] // Local X axis (east) in geocentric coords M[0] = -slam; M[3] = clam; M[6] = 0; // Local Y axis (north) in geocentric coords M[1] = -clam * sphi; M[4] = -slam * sphi; M[7] = cphi; // Local Z axis (up) in geocentric coords M[2] = clam * cphi; M[5] = slam * cphi; M[8] = sphi; } } // namespace GeographicLib geosphere/src/CircularEngine.cpp0000644000176200001440000000674014323376011016427 0ustar liggesusers/** * \file CircularEngine.cpp * \brief Implementation for GeographicLib::CircularEngine class * * Copyright (c) Charles Karney (2011) and licensed under * the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #include "CircularEngine.h" namespace GeographicLib { using namespace std; Math::real CircularEngine::Value(bool gradp, real sl, real cl, real& gradx, real& grady, real& gradz) const { gradp = _gradp && gradp; const vector& root( SphericalEngine::sqrttable() ); // Initialize outer sum real vc = 0, vc2 = 0, vs = 0, vs2 = 0; // v [N + 1], v [N + 2] // vr, vt, vl and similar w variable accumulate the sums for the // derivatives wrt r, theta, and lambda, respectively. real vrc = 0, vrc2 = 0, vrs = 0, vrs2 = 0; // vr[N + 1], vr[N + 2] real vtc = 0, vtc2 = 0, vts = 0, vts2 = 0; // vt[N + 1], vt[N + 2] real vlc = 0, vlc2 = 0, vls = 0, vls2 = 0; // vl[N + 1], vl[N + 2] for (int m = _mM; m >= 0; --m) { // m = M .. 0 // Now Sc[m] = wc, Ss[m] = ws // Sc'[m] = wtc, Ss'[m] = wtc if (m) { real v, A, B; // alpha[m], beta[m + 1] switch (_norm) { case FULL: v = root[2] * root[2 * m + 3] / root[m + 1]; A = cl * v * _uq; B = - v * root[2 * m + 5] / (root[8] * root[m + 2]) * _uq2; break; case SCHMIDT: v = root[2] * root[2 * m + 1] / root[m + 1]; A = cl * v * _uq; B = - v * root[2 * m + 3] / (root[8] * root[m + 2]) * _uq2; break; default: A = B = 0; } v = A * vc + B * vc2 + _wc[m] ; vc2 = vc ; vc = v; v = A * vs + B * vs2 + _ws[m] ; vs2 = vs ; vs = v; if (gradp) { v = A * vrc + B * vrc2 + _wrc[m]; vrc2 = vrc; vrc = v; v = A * vrs + B * vrs2 + _wrs[m]; vrs2 = vrs; vrs = v; v = A * vtc + B * vtc2 + _wtc[m]; vtc2 = vtc; vtc = v; v = A * vts + B * vts2 + _wts[m]; vts2 = vts; vts = v; v = A * vlc + B * vlc2 + m*_ws[m]; vlc2 = vlc; vlc = v; v = A * vls + B * vls2 - m*_wc[m]; vls2 = vls; vls = v; } } else { real A, B, qs; switch (_norm) { case FULL: A = root[3] * _uq; // F[1]/(q*cl) or F[1]/(q*sl) B = - root[15]/2 * _uq2; // beta[1]/q break; case SCHMIDT: A = _uq; B = - root[3]/2 * _uq2; break; default: A = B = 0; } qs = _q / SphericalEngine::scale(); vc = qs * (_wc[m] + A * (cl * vc + sl * vs ) + B * vc2); if (gradp) { qs /= _r; // The components of the gradient in circular coordinates are // r: dV/dr // theta: 1/r * dV/dtheta // lambda: 1/(r*u) * dV/dlambda vrc = - qs * (_wrc[m] + A * (cl * vrc + sl * vrs) + B * vrc2); vtc = qs * (_wtc[m] + A * (cl * vtc + sl * vts) + B * vtc2); vlc = qs / _u * ( A * (cl * vlc + sl * vls) + B * vlc2); } } } if (gradp) { // Rotate into cartesian (geocentric) coordinates gradx = cl * (_u * vrc + _t * vtc) - sl * vlc; grady = sl * (_u * vrc + _t * vtc) + cl * vlc; gradz = _t * vrc - _u * vtc ; } return vc; } } // namespace GeographicLib geosphere/src/DMS.h0000644000176200001440000004176314323377037013642 0ustar liggesusers/** * \file DMS.hpp * \brief Header for GeographicLib::DMS class * * Copyright (c) Charles Karney (2008-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #if !defined(GEOGRAPHICLIB_DMS_HPP) #define GEOGRAPHICLIB_DMS_HPP 1 #include "Constants.h" #include "Utility.h" #if defined(_MSC_VER) // Squelch warnings about dll vs vector and constant conditional expressions # pragma warning (push) # pragma warning (disable: 4251 4127) #endif namespace GeographicLib { /** * \brief Convert between degrees and the %DMS representation * * Parse a string representing degree, minutes, and seconds and return the * angle in degrees and format an angle in degrees as degree, minutes, and * seconds. In addition, handle NANs and infinities on input and output. * * Example of use: * \include example-DMS.cpp **********************************************************************/ class GEOGRAPHICLIB_EXPORT DMS { public: /** * Indicator for presence of hemisphere indicator (N/S/E/W) on latitudes * and longitudes. **********************************************************************/ enum flag { /** * No indicator present. * @hideinitializer **********************************************************************/ NONE = 0, /** * Latitude indicator (N/S) present. * @hideinitializer **********************************************************************/ LATITUDE = 1, /** * Longitude indicator (E/W) present. * @hideinitializer **********************************************************************/ LONGITUDE = 2, /** * Used in Encode to indicate output of an azimuth in [000, 360) with no * letter indicator. * @hideinitializer **********************************************************************/ AZIMUTH = 3, /** * Used in Encode to indicate output of a plain number. * @hideinitializer **********************************************************************/ NUMBER = 4, }; /** * Indicator for trailing units on an angle. **********************************************************************/ enum component { /** * Trailing unit is degrees. * @hideinitializer **********************************************************************/ DEGREE = 0, /** * Trailing unit is arc minutes. * @hideinitializer **********************************************************************/ MINUTE = 1, /** * Trailing unit is arc seconds. * @hideinitializer **********************************************************************/ SECOND = 2, }; private: typedef Math::real real; // Replace all occurrences of pat by c. If c is NULL remove pat. static void replace(std::string& s, const std::string& pat, char c); static const char* const hemispheres_; static const char* const signs_; static const char* const digits_; static const char* const dmsindicators_; static const char* const components_[3]; static Math::real NumMatch(const std::string& s); static Math::real InternalDecode(const std::string& dmsa, flag& ind); DMS() = delete; // Disable constructor public: /** * Convert a string in DMS to an angle. * * @param[in] dms string input. * @param[out] ind a DMS::flag value signaling the presence of a * hemisphere indicator. * @exception GeographicErr if \e dms is malformed (see below). * @return angle (degrees). * * Degrees, minutes, and seconds are indicated by the characters d, ' * (single quote), " (double quote), and these components may only be * given in this order. Any (but not all) components may be omitted and * other symbols (e.g., the ° symbol for degrees and the unicode prime * and double prime symbols for minutes and seconds) may be substituted; * two single quotes can be used instead of ". The last component * indicator may be omitted and is assumed to be the next smallest unit * (thus 33d10 is interpreted as 33d10'). The final component may be a * decimal fraction but the non-final components must be integers. Instead * of using d, ', and " to indicate degrees, minutes, and seconds, : * (colon) may be used to separate these components (numbers must * appear before and after each colon); thus 50d30'10.3" may be * written as 50:30:10.3, 5.5' may be written 0:5.5, and so on. The * integer parts of the minutes and seconds components must be less * than 60. A single leading sign is permitted. A hemisphere designator * (N, E, W, S) may be added to the beginning or end of the string. The * result is multiplied by the implied sign of the hemisphere designator * (negative for S and W). In addition \e ind is set to DMS::LATITUDE if N * or S is present, to DMS::LONGITUDE if E or W is present, and to * DMS::NONE otherwise. Leading and trailing whitespace is removed from * the string before processing. This routine throws an error on a * malformed string. No check is performed on the range of the result. * Examples of legal and illegal strings are * - LEGAL (all the entries on each line are equivalent) * - -20.51125, 20d30'40.5"S, -20°30'40.5, -20d30.675, * N-20d30'40.5", -20:30:40.5 * - 4d0'9, 4d9", 4d9'', 4:0:9, 004:00:09, 4.0025, 4.0025d, 4d0.15, * 04:.15 * - 4:59.99999999999999, 4:60.0, 4:59:59.9999999999999, 4:59:60.0, 5 * - ILLEGAL (the exception thrown explains the problem) * - 4d5"4', 4::5, 4:5:, :4:5, 4d4.5'4", -N20.5, 1.8e2d, 4:60, * 4:59:60 * * The decoding operation can also perform addition and subtraction * operations. If the string includes internal signs (i.e., not at * the beginning nor immediately after an initial hemisphere designator), * then the string is split immediately before such signs and each piece is * decoded according to the above rules and the results added; thus * S3-2.5+4.1N is parsed as the sum of S3, * -2.5, +4.1N. Any piece can include a * hemisphere designator; however, if multiple designators are given, they * must compatible; e.g., you cannot mix N and E. In addition, the * designator can appear at the beginning or end of the first piece, but * must be at the end of all subsequent pieces (a hemisphere designator is * not allowed after the initial sign). Examples of legal and illegal * combinations are * - LEGAL (these are all equivalent) * - -070:00:45, 70:01:15W+0:0.5, 70:01:15W-0:0:30W, W70:01:15+0:0:30E * - ILLEGAL (the exception thrown explains the problem) * - 70:01:15W+0:0:15N, W70:01:15+W0:0:15 * * \warning The "exponential" notation is not recognized. Thus * 7.0E1 is illegal, while 7.0E+1 is parsed as * (7.0E) + (+1), yielding the same result as * 8.0E. * * \note At present, all the string handling in the C++ implementation of * %GeographicLib is with 8-bit characters. The support for unicode * symbols for degrees, minutes, and seconds is therefore via the * UTF-8 encoding. (The * JavaScript implementation of this class uses unicode natively, of * course.) * * Here is the list of Unicode symbols supported for degrees, minutes, * seconds, and the plus and minus signs; various symbols denoting variants * of a space, which may separate the components of a DMS string, are * removed: * - degrees: * - d, D lower and upper case letters * - U+00b0 degree symbol (°) * - U+00ba masculine ordinal indicator (º) * - U+2070 superscript zero (â°) * - U+02da ring above (Ëš) * - U+2218 compose function (∘) * - * the GRiD symbol for degrees * - minutes: * - ' apostrophe * - ` grave accent * - U+2032 prime (′) * - U+2035 back prime (‵) * - U+00b4 acute accent (´) * - U+2018 left single quote (‘) * - U+2019 right single quote (’) * - U+201b reversed-9 single quote (‛) * - U+02b9 modifier letter prime (ʹ) * - U+02ca modifier letter acute accent (ËŠ) * - U+02cb modifier letter grave accent (Ë‹) * - seconds: * - " quotation mark * - U+2033 double prime (″) * - U+2036 reversed double prime (‶) * + U+02dd double acute accent (Ë) * - U+201c left double quote (“) * - U+201d right double quote (”) * - U+201f reversed-9 double quote (‟) * - U+02ba modifier letter double prime (ʺ) * - ' ' any two consecutive symbols for minutes * - plus sign: * - + plus * - U+2795 heavy plus (âž•) * - U+2064 invisible plus (|â¤|) * - minus sign: * - - hyphen * - U+2010 dash (â€) * - U+2011 non-breaking hyphen (‑) * - U+2013 en dash (–) * - U+2014 em dash (—) * - U+2212 minus sign (−) * - U+2796 heavy minus (âž–) * - ignored spaces: * - U+00a0 non-breaking space * - U+2007 figure space (| |) * - U+2009 thin space (| |) * - U+200a hair space ( | |) * - U+200b invisible space (|​|) * - U+202f narrow space ( | |) * - U+2063 invisible separator (|â£|) * . * The codes with a leading zero byte, e.g., U+00b0, are accepted in their * UTF-8 coded form 0xc2 0xb0 and as a single byte 0xb0. **********************************************************************/ static Math::real Decode(const std::string& dms, flag& ind); /** * Convert DMS to an angle. * * @param[in] d degrees. * @param[in] m arc minutes. * @param[in] s arc seconds. * @return angle (degrees) * * This does not propagate the sign on \e d to the other components, * so -3d20' would need to be represented as - DMS::Decode(3.0, 20.0) or * DMS::Decode(-3.0, -20.0). **********************************************************************/ static Math::real Decode(real d, real m = 0, real s = 0) { return d + (m + s / real(Math::ms)) / real(Math::dm); } /** * Convert a pair of strings to latitude and longitude. * * @param[in] dmsa first string. * @param[in] dmsb second string. * @param[out] lat latitude (degrees). * @param[out] lon longitude (degrees). * @param[in] longfirst if true assume longitude is given before latitude * in the absence of hemisphere designators (default false). * @exception GeographicErr if \e dmsa or \e dmsb is malformed. * @exception GeographicErr if \e dmsa and \e dmsb are both interpreted as * latitudes. * @exception GeographicErr if \e dmsa and \e dmsb are both interpreted as * longitudes. * @exception GeographicErr if decoded latitude is not in [−90°, * 90°]. * * By default, the \e lat (resp., \e lon) is assigned to the results of * decoding \e dmsa (resp., \e dmsb). However this is overridden if either * \e dmsa or \e dmsb contain a latitude or longitude hemisphere designator * (N, S, E, W). If an exception is thrown, \e lat and \e lon are * unchanged. **********************************************************************/ static void DecodeLatLon(const std::string& dmsa, const std::string& dmsb, real& lat, real& lon, bool longfirst = false); /** * Convert a string to an angle in degrees. * * @param[in] angstr input string. * @exception GeographicErr if \e angstr is malformed. * @exception GeographicErr if \e angstr includes a hemisphere designator. * @return angle (degrees) * * No hemisphere designator is allowed and no check is done on the range of * the result. **********************************************************************/ static Math::real DecodeAngle(const std::string& angstr); /** * Convert a string to an azimuth in degrees. * * @param[in] azistr input string. * @exception GeographicErr if \e azistr is malformed. * @exception GeographicErr if \e azistr includes a N/S designator. * @return azimuth (degrees) reduced to the range [−180°, * 180°]. * * A hemisphere designator E/W can be used; the result is multiplied by * −1 if W is present. **********************************************************************/ static Math::real DecodeAzimuth(const std::string& azistr); /** * Convert angle (in degrees) into a DMS string (using d, ', and "). * * @param[in] angle input angle (degrees) * @param[in] trailing DMS::component value indicating the trailing units * of the string (this component is given as a decimal number if * necessary). * @param[in] prec the number of digits after the decimal point for the * trailing component. * @param[in] ind DMS::flag value indicating additional formatting. * @param[in] dmssep if non-null, use as the DMS separator character * (instead of d, ', " delimiters). * @exception std::bad_alloc if memory for the string can't be allocated. * @return formatted string * * The interpretation of \e ind is as follows: * - ind == DMS::NONE, signed result no leading zeros on degrees except in * the units place, e.g., -8d03'. * - ind == DMS::LATITUDE, trailing N or S hemisphere designator, no sign, * pad degrees to 2 digits, e.g., 08d03'S. * - ind == DMS::LONGITUDE, trailing E or W hemisphere designator, no * sign, pad degrees to 3 digits, e.g., 008d03'W. * - ind == DMS::AZIMUTH, convert to the range [0, 360°), no * sign, pad degrees to 3 digits, e.g., 351d57'. * . * The integer parts of the minutes and seconds components are always given * with 2 digits. **********************************************************************/ static std::string Encode(real angle, component trailing, unsigned prec, flag ind = NONE, char dmssep = char(0)); /** * Convert angle into a DMS string (using d, ', and ") selecting the * trailing component based on the precision. * * @param[in] angle input angle (degrees) * @param[in] prec the precision relative to 1 degree. * @param[in] ind DMS::flag value indicated additional formatting. * @param[in] dmssep if non-null, use as the DMS separator character * (instead of d, ', " delimiters). * @exception std::bad_alloc if memory for the string can't be allocated. * @return formatted string * * \e prec indicates the precision relative to 1 degree, e.g., \e prec = 3 * gives a result accurate to 0.1' and \e prec = 4 gives a result accurate * to 1". \e ind is interpreted as in DMS::Encode with the additional * facility that DMS::NUMBER represents \e angle as a number in fixed * format with precision \e prec. **********************************************************************/ static std::string Encode(real angle, unsigned prec, flag ind = NONE, char dmssep = char(0)) { return ind == NUMBER ? Utility::str(angle, int(prec)) : Encode(angle, prec < 2 ? DEGREE : (prec < 4 ? MINUTE : SECOND), prec < 2 ? prec : (prec < 4 ? prec - 2 : prec - 4), ind, dmssep); } /** * Split angle into degrees and minutes * * @param[in] ang angle (degrees) * @param[out] d degrees (an integer returned as a real) * @param[out] m arc minutes. **********************************************************************/ static void Encode(real ang, real& d, real& m) { d = int(ang); m = real(Math::dm) * (ang - d); } /** * Split angle into degrees and minutes and seconds. * * @param[in] ang angle (degrees) * @param[out] d degrees (an integer returned as a real) * @param[out] m arc minutes (an integer returned as a real) * @param[out] s arc seconds. **********************************************************************/ static void Encode(real ang, real& d, real& m, real& s) { d = int(ang); ang = real(Math::dm) * (ang - d); m = int(ang); s = real(Math::ms) * (ang - m); } }; } // namespace GeographicLib #if defined(_MSC_VER) # pragma warning (pop) #endif #endif // GEOGRAPHICLIB_DMS_HPP geosphere/src/AzimuthalEquidistant.cpp0000644000176200001440000000257414323376011017707 0ustar liggesusers/** * \file AzimuthalEquidistant.cpp * \brief Implementation for GeographicLib::AzimuthalEquidistant class * * Copyright (c) Charles Karney (2009-2020) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #include "AzimuthalEquidistant.h" namespace GeographicLib { using namespace std; AzimuthalEquidistant::AzimuthalEquidistant(const Geodesic& earth) : eps_(real(0.01) * sqrt(numeric_limits::min())) , _earth(earth) {} void AzimuthalEquidistant::Forward(real lat0, real lon0, real lat, real lon, real& x, real& y, real& azi, real& rk) const { real sig, s, azi0, m; sig = _earth.Inverse(lat0, lon0, lat, lon, s, azi0, azi, m); Math::sincosd(azi0, x, y); x *= s; y *= s; rk = !(sig <= eps_) ? m / s : 1; } void AzimuthalEquidistant::Reverse(real lat0, real lon0, real x, real y, real& lat, real& lon, real& azi, real& rk) const { real azi0 = Math::atan2d(x, y), s = hypot(x, y); real sig, m; sig = _earth.Direct(lat0, lon0, azi0, s, lat, lon, azi, m); rk = !(sig <= eps_) ? m / s : 1; } } // namespace GeographicLib geosphere/src/OSGB.h0000644000176200001440000002334614323400205013726 0ustar liggesusers/** * \file OSGB.hpp * \brief Header for GeographicLib::OSGB class * * Copyright (c) Charles Karney (2010-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #if !defined(GEOGRAPHICLIB_OSGB_HPP) #define GEOGRAPHICLIB_OSGB_HPP 1 #include "Constants.h" #include "TransverseMercator.h" #if defined(_MSC_VER) // Squelch warnings about dll vs string # pragma warning (push) # pragma warning (disable: 4251) #endif namespace GeographicLib { /** * \brief Ordnance Survey grid system for Great Britain * * The class implements the coordinate system used by the Ordnance Survey for * maps of Great Britain and conversions to the grid reference system. * * See * - * A guide to coordinate systems in Great Britain * - * Using the National Grid * * \warning the latitudes and longitudes for the Ordnance Survey grid * system do not use the WGS84 datum. Do not use the values returned by this * class in the UTMUPS, MGRS, or Geoid classes without first converting the * datum (and vice versa). * * Example of use: * \include example-OSGB.cpp **********************************************************************/ class GEOGRAPHICLIB_EXPORT OSGB { private: typedef Math::real real; static const char* const letters_; static const char* const digits_; static const TransverseMercator& OSGBTM(); #if GEOGRAPHICLIB_PRECISION == 4 // Work around an enum lossage introduced in boost 1.76 // https://github.com/boostorg/multiprecision/issues/324 // and fixed in // https://github.com/boostorg/multiprecision/pull/333 static const int #else enum { #endif base_ = 10, tile_ = 100000, tilelevel_ = 5, tilegrid_ = 5, tileoffx_ = 2 * tilegrid_, tileoffy_ = 1 * tilegrid_, minx_ = - tileoffx_ * tile_, miny_ = - tileoffy_ * tile_, maxx_ = (tilegrid_*tilegrid_ - tileoffx_) * tile_, maxy_ = (tilegrid_*tilegrid_ - tileoffy_) * tile_, // Maximum precision is um maxprec_ = 5 + 6 #if GEOGRAPHICLIB_PRECISION == 4 ; #else }; #endif static real computenorthoffset(); static void CheckCoords(real x, real y); OSGB() = delete; // Disable constructor public: /** * Forward projection, from geographic to OSGB coordinates. * * @param[in] lat latitude of point (degrees). * @param[in] lon longitude of point (degrees). * @param[out] x easting of point (meters). * @param[out] y northing of point (meters). * @param[out] gamma meridian convergence at point (degrees). * @param[out] k scale of projection at point. * * \e lat should be in the range [−90°, 90°]. **********************************************************************/ static void Forward(real lat, real lon, real& x, real& y, real& gamma, real& k) { OSGBTM().Forward(OriginLongitude(), lat, lon, x, y, gamma, k); x += FalseEasting(); y += computenorthoffset(); } /** * Reverse projection, from OSGB coordinates to geographic. * * @param[in] x easting of point (meters). * @param[in] y northing of point (meters). * @param[out] lat latitude of point (degrees). * @param[out] lon longitude of point (degrees). * @param[out] gamma meridian convergence at point (degrees). * @param[out] k scale of projection at point. * * The value of \e lon returned is in the range [−180°, * 180°]. **********************************************************************/ static void Reverse(real x, real y, real& lat, real& lon, real& gamma, real& k) { x -= FalseEasting(); y -= computenorthoffset(); OSGBTM().Reverse(OriginLongitude(), x, y, lat, lon, gamma, k); } /** * OSGB::Forward without returning the convergence and scale. **********************************************************************/ static void Forward(real lat, real lon, real& x, real& y) { real gamma, k; Forward(lat, lon, x, y, gamma, k); } /** * OSGB::Reverse without returning the convergence and scale. **********************************************************************/ static void Reverse(real x, real y, real& lat, real& lon) { real gamma, k; Reverse(x, y, lat, lon, gamma, k); } /** * Convert OSGB coordinates to a grid reference. * * @param[in] x easting of point (meters). * @param[in] y northing of point (meters). * @param[in] prec precision relative to 100 km. * @param[out] gridref National Grid reference. * @exception GeographicErr if \e prec, \e x, or \e y is outside its * allowed range. * @exception std::bad_alloc if the memory for \e gridref can't be * allocatied. * * \e prec specifies the precision of the grid reference string as follows: * - prec = 0 (min), 100km * - prec = 1, 10km * - prec = 2, 1km * - prec = 3, 100m * - prec = 4, 10m * - prec = 5, 1m * - prec = 6, 0.1m * - prec = 11 (max), 1μm * * The easting must be in the range [−1000 km, 1500 km) and the * northing must be in the range [−500 km, 2000 km). These bounds * are consistent with rules for the letter designations for the grid * system. * * If \e x or \e y is NaN, the returned grid reference is "INVALID". **********************************************************************/ static void GridReference(real x, real y, int prec, std::string& gridref); /** * Convert OSGB grid reference to coordinates. * * @param[in] gridref National Grid reference. * @param[out] x easting of point (meters). * @param[out] y northing of point (meters). * @param[out] prec precision relative to 100 km. * @param[in] centerp if true (default), return center of the grid square, * else return SW (lower left) corner. * @exception GeographicErr if \e gridref is illegal. * * The grid reference must be of the form: two letters (not including I) * followed by an even number of digits (up to 22). * * If the first 2 characters of \e gridref are "IN", then \e x and \e y are * set to NaN and \e prec is set to −2. **********************************************************************/ static void GridReference(const std::string& gridref, real& x, real& y, int& prec, bool centerp = true); /** \name Inspector functions **********************************************************************/ ///@{ /** * @return \e a the equatorial radius of the Airy 1830 ellipsoid (meters). * * This is 20923713 ft converted to meters using the rule 1 ft = * 109.48401603−10 m. The Airy 1830 value is returned * because the OSGB projection is based on this ellipsoid. The conversion * factor from feet to meters is the one used for the 1936 retriangulation * of Britain; see Section A.1 (footnote 10 on p. 44) of A guide to * coordinate systems in Great Britain, v3.6 (2020). **********************************************************************/ static Math::real EquatorialRadius() { // result is about 6377563.3960320664406 m using std::pow; return pow(real(10), real(48401603 - 100000000) / 100000000) * real(20923713); } /** * @return \e f the inverse flattening of the Airy 1830 ellipsoid. * * For the Airy 1830 ellipsoid, \e a = 20923713 ft and \e b = 20853810 ft; * thus the flattening = (20923713 − 20853810)/20923713 = * 7767/2324857 = 1/299.32496459... (The Airy 1830 value is returned * because the OSGB projection is based on this ellipsoid.) **********************************************************************/ static Math::real Flattening() { return real(20923713 - 20853810) / real(20923713); } /** * @return \e k0 central scale for the OSGB projection (0.9996012717...). * * C. J. Mugnier, Grids & Datums, PE&RS, Oct. 2003, states that * this is defined as 109.9998268−10. **********************************************************************/ static Math::real CentralScale() { using std::pow; return pow(real(10), real(9998268 - 10000000) / 10000000); } /** * @return latitude of the origin for the OSGB projection (49 degrees). **********************************************************************/ static Math::real OriginLatitude() { return real(49); } /** * @return longitude of the origin for the OSGB projection (−2 * degrees). **********************************************************************/ static Math::real OriginLongitude() { return real(-2); } /** * @return false northing the OSGB projection (−100000 meters). **********************************************************************/ static Math::real FalseNorthing() { return real(-100000); } /** * @return false easting the OSGB projection (400000 meters). **********************************************************************/ static Math::real FalseEasting() { return real(400000); } ///@} }; } // namespace GeographicLib #if defined(_MSC_VER) # pragma warning (pop) #endif #endif // GEOGRAPHICLIB_OSGB_HPP geosphere/src/PolarStereographic.cpp0000644000176200001440000000770414323376012017334 0ustar liggesusers/** * \file PolarStereographic.cpp * \brief Implementation for GeographicLib::PolarStereographic class * * Copyright (c) Charles Karney (2008-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #include "PolarStereographic.h" #if defined(_MSC_VER) // Squelch warnings about enum-float expressions # pragma warning (disable: 5055) #endif namespace GeographicLib { using namespace std; PolarStereographic::PolarStereographic(real a, real f, real k0) : _a(a) , _f(f) , _e2(_f * (2 - _f)) , _es((_f < 0 ? -1 : 1) * sqrt(fabs(_e2))) , _e2m(1 - _e2) , _c( (1 - _f) * exp(Math::eatanhe(real(1), _es)) ) , _k0(k0) { if (!(isfinite(_a) && _a > 0)) throw GeographicErr("Equatorial radius is not positive"); if (!(isfinite(_f) && _f < 1)) throw GeographicErr("Polar semi-axis is not positive"); if (!(isfinite(_k0) && _k0 > 0)) throw GeographicErr("Scale is not positive"); } const PolarStereographic& PolarStereographic::UPS() { static const PolarStereographic ups(Constants::WGS84_a(), Constants::WGS84_f(), Constants::UPS_k0()); return ups; } // This formulation converts to conformal coordinates by tau = tan(phi) and // tau' = tan(phi') where phi' is the conformal latitude. The formulas are: // tau = tan(phi) // secphi = hypot(1, tau) // sig = sinh(e * atanh(e * tau / secphi)) // taup = tan(phip) = tau * hypot(1, sig) - sig * hypot(1, tau) // c = (1 - f) * exp(e * atanh(e)) // // Forward: // rho = (2*k0*a/c) / (hypot(1, taup) + taup) (taup >= 0) // = (2*k0*a/c) * (hypot(1, taup) - taup) (taup < 0) // // Reverse: // taup = ((2*k0*a/c) / rho - rho / (2*k0*a/c))/2 // // Scale: // k = (rho/a) * secphi * sqrt((1-e2) + e2 / secphi^2) // // In limit rho -> 0, tau -> inf, taup -> inf, secphi -> inf, secphip -> inf // secphip = taup = exp(-e * atanh(e)) * tau = exp(-e * atanh(e)) * secphi void PolarStereographic::Forward(bool northp, real lat, real lon, real& x, real& y, real& gamma, real& k) const { lat = Math::LatFix(lat); lat *= northp ? 1 : -1; real tau = Math::tand(lat), secphi = hypot(real(1), tau), taup = Math::taupf(tau, _es), rho = hypot(real(1), taup) + fabs(taup); rho = taup >= 0 ? (lat != Math::qd ? 1/rho : 0) : rho; rho *= 2 * _k0 * _a / _c; k = lat != Math::qd ? (rho / _a) * secphi * sqrt(_e2m + _e2 / Math::sq(secphi)) : _k0; Math::sincosd(lon, x, y); x *= rho; y *= (northp ? -rho : rho); gamma = Math::AngNormalize(northp ? lon : -lon); } void PolarStereographic::Reverse(bool northp, real x, real y, real& lat, real& lon, real& gamma, real& k) const { real rho = hypot(x, y), t = rho != 0 ? rho / (2 * _k0 * _a / _c) : Math::sq(numeric_limits::epsilon()), taup = (1 / t - t) / 2, tau = Math::tauf(taup, _es), secphi = hypot(real(1), tau); k = rho != 0 ? (rho / _a) * secphi * sqrt(_e2m + _e2 / Math::sq(secphi)) : _k0; lat = (northp ? 1 : -1) * Math::atand(tau); lon = Math::atan2d(x, northp ? -y : y ); gamma = Math::AngNormalize(northp ? lon : -lon); } void PolarStereographic::SetScale(real lat, real k) { if (!(isfinite(k) && k > 0)) throw GeographicErr("Scale is not positive"); if (!(-Math::qd < lat && lat <= Math::qd)) throw GeographicErr("Latitude must be in (-" + to_string(Math::qd) + "d, " + to_string(Math::qd) + "d]"); real x, y, gamma, kold; _k0 = 1; Forward(true, lat, 0, x, y, gamma, kold); _k0 *= k/kold; } } // namespace GeographicLib geosphere/src/LocalCartesian.cpp0000644000176200001440000000375714323376012016427 0ustar liggesusers/** * \file LocalCartesian.cpp * \brief Implementation for GeographicLib::LocalCartesian class * * Copyright (c) Charles Karney (2008-2015) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #include "LocalCartesian.h" namespace GeographicLib { using namespace std; void LocalCartesian::Reset(real lat0, real lon0, real h0) { _lat0 = Math::LatFix(lat0); _lon0 = Math::AngNormalize(lon0); _h0 = h0; _earth.Forward(_lat0, _lon0, _h0, _x0, _y0, _z0); real sphi, cphi, slam, clam; Math::sincosd(_lat0, sphi, cphi); Math::sincosd(_lon0, slam, clam); Geocentric::Rotation(sphi, cphi, slam, clam, _r); } void LocalCartesian::MatrixMultiply(real M[dim2_]) const { // M = r' . M real t[dim2_]; copy(M, M + dim2_, t); for (size_t i = 0; i < dim2_; ++i) { size_t row = i / dim_, col = i % dim_; M[i] = _r[row] * t[col] + _r[row+3] * t[col+3] + _r[row+6] * t[col+6]; } } void LocalCartesian::IntForward(real lat, real lon, real h, real& x, real& y, real& z, real M[dim2_]) const { real xc, yc, zc; _earth.IntForward(lat, lon, h, xc, yc, zc, M); xc -= _x0; yc -= _y0; zc -= _z0; x = _r[0] * xc + _r[3] * yc + _r[6] * zc; y = _r[1] * xc + _r[4] * yc + _r[7] * zc; z = _r[2] * xc + _r[5] * yc + _r[8] * zc; if (M) MatrixMultiply(M); } void LocalCartesian::IntReverse(real x, real y, real z, real& lat, real& lon, real& h, real M[dim2_]) const { real xc = _x0 + _r[0] * x + _r[1] * y + _r[2] * z, yc = _y0 + _r[3] * x + _r[4] * y + _r[5] * z, zc = _z0 + _r[6] * x + _r[7] * y + _r[8] * z; _earth.IntReverse(xc, yc, zc, lat, lon, h, M); if (M) MatrixMultiply(M); } } // namespace GeographicLib geosphere/src/Constants.h0000644000176200001440000003171114323377171015162 0ustar liggesusers/** * \file Constants.hpp * \brief Header for GeographicLib::Constants class * * Copyright (c) Charles Karney (2008-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #if !defined(GEOGRAPHICLIB_CONSTANTS_HPP) #define GEOGRAPHICLIB_CONSTANTS_HPP 1 #include "Config.h" /** * @relates GeographicLib::Constants * Pack the version components into a single integer. Users should not rely on * this particular packing of the components of the version number; see the * documentation for GEOGRAPHICLIB_VERSION, below. **********************************************************************/ #define GEOGRAPHICLIB_VERSION_NUM(a,b,c) ((((a) * 10000 + (b)) * 100) + (c)) /** * @relates GeographicLib::Constants * The version of GeographicLib as a single integer, packed as MMmmmmpp where * MM is the major version, mmmm is the minor version, and pp is the patch * level. Users should not rely on this particular packing of the components * of the version number. Instead they should use a test such as \code #if GEOGRAPHICLIB_VERSION >= GEOGRAPHICLIB_VERSION_NUM(1,37,0) ... #endif * \endcode **********************************************************************/ #define GEOGRAPHICLIB_VERSION \ GEOGRAPHICLIB_VERSION_NUM(GEOGRAPHICLIB_VERSION_MAJOR, \ GEOGRAPHICLIB_VERSION_MINOR, \ GEOGRAPHICLIB_VERSION_PATCH) // For reference, here is a table of Visual Studio and _MSC_VER // correspondences: // // _MSC_VER Visual Studio // 1100 vc5 // 1200 vc6 // 1300 vc7 // 1310 vc7.1 (2003) // 1400 vc8 (2005) // 1500 vc9 (2008) // 1600 vc10 (2010) // 1700 vc11 (2012) // 1800 vc12 (2013) // 1900 vc14 (2015) First version of VS to include enough C++11 support // 191[0-9] vc15 (2017) // 192[0-9] vc16 (2019) // 193[0-9] vc17 (2022) #if defined(_MSC_VER) && defined(GEOGRAPHICLIB_SHARED_LIB) && \ GEOGRAPHICLIB_SHARED_LIB # if GEOGRAPHICLIB_SHARED_LIB > 1 # error GEOGRAPHICLIB_SHARED_LIB must be 0 or 1 # elif defined(GeographicLib_SHARED_EXPORTS) # define GEOGRAPHICLIB_EXPORT __declspec(dllexport) # else # define GEOGRAPHICLIB_EXPORT __declspec(dllimport) # endif #else # define GEOGRAPHICLIB_EXPORT #endif // Use GEOGRAPHICLIB_DEPRECATED to mark functions, types or variables as // deprecated. Code inspired by Apache Subversion's svn_types.h file (via // MPFR). #if defined(__GNUC__) # if __GNUC__ > 4 # define GEOGRAPHICLIB_DEPRECATED(msg) __attribute__((deprecated(msg))) # else # define GEOGRAPHICLIB_DEPRECATED(msg) __attribute__((deprecated)) # endif #elif defined(_MSC_VER) && _MSC_VER >= 1300 # define GEOGRAPHICLIB_DEPRECATED(msg) __declspec(deprecated(msg)) #else # define GEOGRAPHICLIB_DEPRECATED(msg) #endif #include #include #include "Math.h" /** * \brief Namespace for %GeographicLib * * All of %GeographicLib is defined within the GeographicLib namespace. In * addition all the header files are included via %GeographicLib/Class.hpp. * This minimizes the likelihood of conflicts with other packages. **********************************************************************/ namespace GeographicLib { /** * \brief %Constants needed by %GeographicLib * * Define constants specifying the WGS84 ellipsoid, the UTM and UPS * projections, and various unit conversions. * * Example of use: * \include example-Constants.cpp **********************************************************************/ class GEOGRAPHICLIB_EXPORT Constants { private: typedef Math::real real; Constants() = delete; // Disable constructor public: /** * A synonym for Math::degree(). **********************************************************************/ static Math::real degree() { return Math::degree(); } /** * @return the number of radians in an arcminute. **********************************************************************/ static Math::real arcminute() { return Math::degree() / Math::real(Math::dm); } /** * @return the number of radians in an arcsecond. **********************************************************************/ static Math::real arcsecond() { return Math::degree() / Math::real(Math::ds); } /** \name Ellipsoid parameters **********************************************************************/ ///@{ /** * @tparam T the type of the returned value. * @return the equatorial radius of WGS84 ellipsoid (6378137 m). **********************************************************************/ template static T WGS84_a() { return 6378137 * meter(); } /** * @tparam T the type of the returned value. * @return the flattening of WGS84 ellipsoid (1/298.257223563). **********************************************************************/ template static T WGS84_f() { // Evaluating this as 1000000000 / T(298257223563LL) reduces the // round-off error by about 10%. However, expressing the flattening as // 1/298.257223563 is well ingrained. return 1 / ( T(298257223563LL) / 1000000000 ); } /** * @tparam T the type of the returned value. * @return the gravitational constant of the WGS84 ellipsoid, \e GM, in * m3 s−2. **********************************************************************/ template static T WGS84_GM() { return T(3986004) * 100000000 + 41800000; } /** * @tparam T the type of the returned value. * @return the angular velocity of the WGS84 ellipsoid, ω, in rad * s−1. **********************************************************************/ template static T WGS84_omega() { return 7292115 / (T(1000000) * 100000); } /** * @tparam T the type of the returned value. * @return the equatorial radius of GRS80 ellipsoid, \e a, in m. **********************************************************************/ template static T GRS80_a() { return 6378137 * meter(); } /** * @tparam T the type of the returned value. * @return the gravitational constant of the GRS80 ellipsoid, \e GM, in * m3 s−2. **********************************************************************/ template static T GRS80_GM() { return T(3986005) * 100000000; } /** * @tparam T the type of the returned value. * @return the angular velocity of the GRS80 ellipsoid, ω, in rad * s−1. * * This is about 2 π 366.25 / (365.25 × 24 × 3600) rad * s−1. 365.25 is the number of days in a Julian year and * 365.35/366.25 converts from solar days to sidereal days. Using the * number of days in a Gregorian year (365.2425) results in a worse * approximation (because the Gregorian year includes the precession of the * earth's axis). **********************************************************************/ template static T GRS80_omega() { return 7292115 / (T(1000000) * 100000); } /** * @tparam T the type of the returned value. * @return the dynamical form factor of the GRS80 ellipsoid, * J2. **********************************************************************/ template static T GRS80_J2() { return T(108263) / 100000000; } /** * @tparam T the type of the returned value. * @return the central scale factor for UTM (0.9996). **********************************************************************/ template static T UTM_k0() {return T(9996) / 10000; } /** * @tparam T the type of the returned value. * @return the central scale factor for UPS (0.994). **********************************************************************/ template static T UPS_k0() { return T(994) / 1000; } ///@} /** \name SI units **********************************************************************/ ///@{ /** * @tparam T the type of the returned value. * @return the number of meters in a meter. * * This is unity, but this lets the internal system of units be changed if * necessary. **********************************************************************/ template static T meter() { return T(1); } /** * @return the number of meters in a kilometer. **********************************************************************/ static Math::real kilometer() { return 1000 * meter(); } /** * @return the number of meters in a nautical mile (approximately 1 arc * minute) **********************************************************************/ static Math::real nauticalmile() { return 1852 * meter(); } /** * @tparam T the type of the returned value. * @return the number of square meters in a square meter. * * This is unity, but this lets the internal system of units be changed if * necessary. **********************************************************************/ template static T square_meter() { return meter() * meter(); } /** * @return the number of square meters in a hectare. **********************************************************************/ static Math::real hectare() { return 10000 * square_meter(); } /** * @return the number of square meters in a square kilometer. **********************************************************************/ static Math::real square_kilometer() { return kilometer() * kilometer(); } /** * @return the number of square meters in a square nautical mile. **********************************************************************/ static Math::real square_nauticalmile() { return nauticalmile() * nauticalmile(); } ///@} /** \name Anachronistic British units **********************************************************************/ ///@{ /** * @return the number of meters in an international foot. **********************************************************************/ static Math::real foot() { return real(254 * 12) / 10000 * meter(); } /** * @return the number of meters in a yard. **********************************************************************/ static Math::real yard() { return 3 * foot(); } /** * @return the number of meters in a fathom. **********************************************************************/ static Math::real fathom() { return 2 * yard(); } /** * @return the number of meters in a chain. **********************************************************************/ static Math::real chain() { return 22 * yard(); } /** * @return the number of meters in a furlong. **********************************************************************/ static Math::real furlong() { return 10 * chain(); } /** * @return the number of meters in a statute mile. **********************************************************************/ static Math::real mile() { return 8 * furlong(); } /** * @return the number of square meters in an acre. **********************************************************************/ static Math::real acre() { return chain() * furlong(); } /** * @return the number of square meters in a square statute mile. **********************************************************************/ static Math::real square_mile() { return mile() * mile(); } ///@} /** \name Anachronistic US units **********************************************************************/ ///@{ /** * @return the number of meters in a US survey foot. **********************************************************************/ static Math::real surveyfoot() { return real(1200) / 3937 * meter(); } ///@} }; /** * \brief Exception handling for %GeographicLib * * A class to handle exceptions. It's derived from std::runtime_error so it * can be caught by the usual catch clauses. * * Example of use: * \include example-GeographicErr.cpp **********************************************************************/ class GeographicErr : public std::runtime_error { public: /** * Constructor * * @param[in] msg a string message, which is accessible in the catch * clause via what(). **********************************************************************/ GeographicErr(const std::string& msg) : std::runtime_error(msg) {} }; } // namespace GeographicLib #endif // GEOGRAPHICLIB_CONSTANTS_HPP geosphere/src/SphericalHarmonic1.h0000644000176200001440000002706414323400206016652 0ustar liggesusers/** * \file SphericalHarmonic1.hpp * \brief Header for GeographicLib::SphericalHarmonic1 class * * Copyright (c) Charles Karney (2011) and licensed under * the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #if !defined(GEOGRAPHICLIB_SPHERICALHARMONIC1_HPP) #define GEOGRAPHICLIB_SPHERICALHARMONIC1_HPP 1 #include #include "Constants.h" #include "SphericalEngine.h" #include "CircularEngine.h" namespace GeographicLib { /** * \brief Spherical harmonic series with a correction to the coefficients * * This classes is similar to SphericalHarmonic, except that the coefficients * Cnm are replaced by * Cnm + \e tau C'nm (and * similarly for Snm). * * Example of use: * \include example-SphericalHarmonic1.cpp **********************************************************************/ class GEOGRAPHICLIB_EXPORT SphericalHarmonic1 { public: /** * Supported normalizations for associate Legendre polynomials. **********************************************************************/ enum normalization { /** * Fully normalized associated Legendre polynomials. See * SphericalHarmonic::FULL for documentation. * * @hideinitializer **********************************************************************/ FULL = SphericalEngine::FULL, /** * Schmidt semi-normalized associated Legendre polynomials. See * SphericalHarmonic::SCHMIDT for documentation. * * @hideinitializer **********************************************************************/ SCHMIDT = SphericalEngine::SCHMIDT, }; private: typedef Math::real real; SphericalEngine::coeff _c[2]; real _a; unsigned _norm; public: /** * Constructor with a full set of coefficients specified. * * @param[in] C the coefficients Cnm. * @param[in] S the coefficients Snm. * @param[in] N the maximum degree and order of the sum * @param[in] C1 the coefficients C'nm. * @param[in] S1 the coefficients S'nm. * @param[in] N1 the maximum degree and order of the correction * coefficients C'nm and * S'nm. * @param[in] a the reference radius appearing in the definition of the * sum. * @param[in] norm the normalization for the associated Legendre * polynomials, either SphericalHarmonic1::FULL (the default) or * SphericalHarmonic1::SCHMIDT. * @exception GeographicErr if \e N and \e N1 do not satisfy \e N ≥ * \e N1 ≥ −1. * @exception GeographicErr if any of the vectors of coefficients is not * large enough. * * See SphericalHarmonic for the way the coefficients should be stored. * * The class stores pointers to the first elements of \e C, \e S, \e * C', and \e S'. These arrays should not be altered or destroyed during * the lifetime of a SphericalHarmonic object. **********************************************************************/ SphericalHarmonic1(const std::vector& C, const std::vector& S, int N, const std::vector& C1, const std::vector& S1, int N1, real a, unsigned norm = FULL) : _a(a) , _norm(norm) { if (!(N1 <= N)) throw GeographicErr("N1 cannot be larger that N"); _c[0] = SphericalEngine::coeff(C, S, N); _c[1] = SphericalEngine::coeff(C1, S1, N1); } /** * Constructor with a subset of coefficients specified. * * @param[in] C the coefficients Cnm. * @param[in] S the coefficients Snm. * @param[in] N the degree used to determine the layout of \e C and \e S. * @param[in] nmx the maximum degree used in the sum. The sum over \e n is * from 0 thru \e nmx. * @param[in] mmx the maximum order used in the sum. The sum over \e m is * from 0 thru min(\e n, \e mmx). * @param[in] C1 the coefficients C'nm. * @param[in] S1 the coefficients S'nm. * @param[in] N1 the degree used to determine the layout of \e C' and \e * S'. * @param[in] nmx1 the maximum degree used for \e C' and \e S'. * @param[in] mmx1 the maximum order used for \e C' and \e S'. * @param[in] a the reference radius appearing in the definition of the * sum. * @param[in] norm the normalization for the associated Legendre * polynomials, either SphericalHarmonic1::FULL (the default) or * SphericalHarmonic1::SCHMIDT. * @exception GeographicErr if the parameters do not satisfy \e N ≥ \e * nmx ≥ \e mmx ≥ −1; \e N1 ≥ \e nmx1 ≥ \e mmx1 ≥ * −1; \e N ≥ \e N1; \e nmx ≥ \e nmx1; \e mmx ≥ \e mmx1. * @exception GeographicErr if any of the vectors of coefficients is not * large enough. * * The class stores pointers to the first elements of \e C, \e S, \e * C', and \e S'. These arrays should not be altered or destroyed during * the lifetime of a SphericalHarmonic object. **********************************************************************/ SphericalHarmonic1(const std::vector& C, const std::vector& S, int N, int nmx, int mmx, const std::vector& C1, const std::vector& S1, int N1, int nmx1, int mmx1, real a, unsigned norm = FULL) : _a(a) , _norm(norm) { if (!(nmx1 <= nmx)) throw GeographicErr("nmx1 cannot be larger that nmx"); if (!(mmx1 <= mmx)) throw GeographicErr("mmx1 cannot be larger that mmx"); _c[0] = SphericalEngine::coeff(C, S, N, nmx, mmx); _c[1] = SphericalEngine::coeff(C1, S1, N1, nmx1, mmx1); } /** * A default constructor so that the object can be created when the * constructor for another object is initialized. This default object can * then be reset with the default copy assignment operator. **********************************************************************/ SphericalHarmonic1() {} /** * Compute a spherical harmonic sum with a correction term. * * @param[in] tau multiplier for correction coefficients \e C' and \e S'. * @param[in] x cartesian coordinate. * @param[in] y cartesian coordinate. * @param[in] z cartesian coordinate. * @return \e V the spherical harmonic sum. * * This routine requires constant memory and thus never throws * an exception. **********************************************************************/ Math::real operator()(real tau, real x, real y, real z) const { real f[] = {1, tau}; real v = 0; real dummy; switch (_norm) { case FULL: v = SphericalEngine::Value (_c, f, x, y, z, _a, dummy, dummy, dummy); break; case SCHMIDT: default: // To avoid compiler warnings v = SphericalEngine::Value (_c, f, x, y, z, _a, dummy, dummy, dummy); break; } return v; } /** * Compute a spherical harmonic sum with a correction term and its * gradient. * * @param[in] tau multiplier for correction coefficients \e C' and \e S'. * @param[in] x cartesian coordinate. * @param[in] y cartesian coordinate. * @param[in] z cartesian coordinate. * @param[out] gradx \e x component of the gradient * @param[out] grady \e y component of the gradient * @param[out] gradz \e z component of the gradient * @return \e V the spherical harmonic sum. * * This is the same as the previous function, except that the components of * the gradients of the sum in the \e x, \e y, and \e z directions are * computed. This routine requires constant memory and thus never throws * an exception. **********************************************************************/ Math::real operator()(real tau, real x, real y, real z, real& gradx, real& grady, real& gradz) const { real f[] = {1, tau}; real v = 0; switch (_norm) { case FULL: v = SphericalEngine::Value (_c, f, x, y, z, _a, gradx, grady, gradz); break; case SCHMIDT: default: // To avoid compiler warnings v = SphericalEngine::Value (_c, f, x, y, z, _a, gradx, grady, gradz); break; } return v; } /** * Create a CircularEngine to allow the efficient evaluation of several * points on a circle of latitude at a fixed value of \e tau. * * @param[in] tau the multiplier for the correction coefficients. * @param[in] p the radius of the circle. * @param[in] z the height of the circle above the equatorial plane. * @param[in] gradp if true the returned object will be able to compute the * gradient of the sum. * @exception std::bad_alloc if the memory for the CircularEngine can't be * allocated. * @return the CircularEngine object. * * SphericalHarmonic1::operator()() exchanges the order of the sums in the * definition, i.e., ∑n = 0..N * ∑m = 0..n becomes ∑m = * 0..Nn = m..N. * SphericalHarmonic1::Circle performs the inner sum over degree \e n * (which entails about N2 operations). Calling * CircularEngine::operator()() on the returned object performs the outer * sum over the order \e m (about \e N operations). * * See SphericalHarmonic::Circle for an example of its use. **********************************************************************/ CircularEngine Circle(real tau, real p, real z, bool gradp) const { real f[] = {1, tau}; switch (_norm) { case FULL: return gradp ? SphericalEngine::Circle (_c, f, p, z, _a) : SphericalEngine::Circle (_c, f, p, z, _a); break; case SCHMIDT: default: // To avoid compiler warnings return gradp ? SphericalEngine::Circle (_c, f, p, z, _a) : SphericalEngine::Circle (_c, f, p, z, _a); break; } } /** * @return the zeroth SphericalEngine::coeff object. **********************************************************************/ const SphericalEngine::coeff& Coefficients() const { return _c[0]; } /** * @return the first SphericalEngine::coeff object. **********************************************************************/ const SphericalEngine::coeff& Coefficients1() const { return _c[1]; } }; } // namespace GeographicLib #endif // GEOGRAPHICLIB_SPHERICALHARMONIC1_HPP geosphere/src/GeodesicExact.cpp0000644000176200001440000016340114323377375016260 0ustar liggesusers/** * \file GeodesicExact.cpp * \brief Implementation for GeographicLib::GeodesicExact class * * Copyright (c) Charles Karney (2012-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ * * This is a reformulation of the geodesic problem. The notation is as * follows: * - at a general point (no suffix or 1 or 2 as suffix) * - phi = latitude * - beta = latitude on auxiliary sphere * - omega = longitude on auxiliary sphere * - lambda = longitude * - alpha = azimuth of great circle * - sigma = arc length along great circle * - s = distance * - tau = scaled distance (= sigma at multiples of pi/2) * - at northwards equator crossing * - beta = phi = 0 * - omega = lambda = 0 * - alpha = alpha0 * - sigma = s = 0 * - a 12 suffix means a difference, e.g., s12 = s2 - s1. * - s and c prefixes mean sin and cos **********************************************************************/ #include "GeodesicExact.h" #include "GeodesicLineExact.h" #if defined(_MSC_VER) // Squelch warnings about potentially uninitialized local variables, // constant conditional and enum-float expressions and mixing enums # pragma warning (disable: 4701 4127 5055 5054) #endif namespace GeographicLib { using namespace std; GeodesicExact::GeodesicExact(real a, real f) : maxit2_(maxit1_ + Math::digits() + 10) // Underflow guard. We require // tiny_ * epsilon() > 0 // tiny_ + epsilon() == epsilon() , tiny_(sqrt(numeric_limits::min())) , tol0_(numeric_limits::epsilon()) // Increase multiplier in defn of tol1_ from 100 to 200 to fix inverse // case 52.784459512564 0 -52.784459512563990912 179.634407464943777557 // which otherwise failed for Visual Studio 10 (Release and Debug) , tol1_(200 * tol0_) , tol2_(sqrt(tol0_)) , tolb_(tol0_) // Check on bisection interval , xthresh_(1000 * tol2_) , _a(a) , _f(f) , _f1(1 - _f) , _e2(_f * (2 - _f)) , _ep2(_e2 / Math::sq(_f1)) // e2 / (1 - e2) , _n(_f / ( 2 - _f)) , _b(_a * _f1) // The Geodesic class substitutes atanh(sqrt(e2)) for asinh(sqrt(ep2)) in // the definition of _c2. The latter is more accurate for very oblate // ellipsoids (which the Geodesic class does not attempt to handle). , _c2((Math::sq(_a) + Math::sq(_b) * (_f == 0 ? 1 : (_f > 0 ? asinh(sqrt(_ep2)) : atan(sqrt(-_e2))) / sqrt(fabs(_e2))))/2) // authalic radius squared // The sig12 threshold for "really short". Using the auxiliary sphere // solution with dnm computed at (bet1 + bet2) / 2, the relative error in // the azimuth consistency check is sig12^2 * abs(f) * min(1, 1-f/2) / 2. // (Error measured for 1/100 < b/a < 100 and abs(f) >= 1/1000. For a // given f and sig12, the max error occurs for lines near the pole. If // the old rule for computing dnm = (dn1 + dn2)/2 is used, then the error // increases by a factor of 2.) Setting this equal to epsilon gives // sig12 = etol2. Here 0.1 is a safety factor (error decreased by 100) // and max(0.001, abs(f)) stops etol2 getting too large in the nearly // spherical case. , _etol2(real(0.1) * tol2_ / sqrt( fmax(real(0.001), fabs(_f)) * fmin(real(1), 1 - _f/2) / 2 )) { if (!(isfinite(_a) && _a > 0)) throw GeographicErr("Equatorial radius is not positive"); if (!(isfinite(_b) && _b > 0)) throw GeographicErr("Polar semi-axis is not positive"); // Required number of terms in DST for full accuracy for all precisions as // a function of n in [-0.99, 0.99]. Values determined by running // develop/AreaEst compiled with GEOGRAPHICLIB_PRECISION = 5. For // precision 4 and 5, GEOGRAPHICLIB_DIGITS was set to, resp., 384 and 768. // The error criterion is relative error less than or equal to epsilon/2 = // 0.5^digits, with digits = 24, 53, 64, 113, 256. The first 4 are the the // "standard" values for float, double, long double, and float128; the last // is the default for GeographicLib + mpfr. Also listed is the value of // alp0 resulting in the most error for the given N. // // float double long double quad mpfr // n N alp0 N alp0 N alp0 N alp0 N alp0 // -0.99 1024 0.09 3072 0.05 4096 0.04 8192 43.50 16384 22.01 // -0.98 512 0.18 1536 0.10 2048 0.09 4096 0.06 8192 0.04 // -0.97 384 0.25 1024 0.16 1536 0.13 3072 0.09 6144 0.06 // -0.96 256 0.36 768 0.21 1024 0.18 2048 0.13 4096 0.09 // -0.95 192 0.47 768 0.23 768 0.23 1536 0.17 4096 0.10 // -0.94 192 0.51 512 0.31 768 0.26 1536 0.18 3072 0.13 // -0.93 192 0.55 384 0.39 512 0.34 1024 0.24 3072 0.14 // -0.92 128 0.73 384 0.42 512 0.37 1024 0.26 2048 0.18 // -0.91 128 0.77 384 0.45 384 0.45 768 0.32 2048 0.19 // -0.90 96 0.94 256 0.58 384 0.47 768 0.34 2048 0.21 // -0.89 96 0.99 256 0.61 384 0.50 768 0.35 1536 0.25 // -0.88 96 1.04 256 0.64 384 0.52 768 0.37 1536 0.26 // -0.87 96 1.09 192 0.77 256 0.67 512 0.47 1536 0.27 // -0.86 64 1.38 192 0.80 256 0.69 512 0.49 1536 0.28 // -0.85 64 1.43 192 0.83 256 0.72 512 0.51 1024 0.36 // -0.84 64 1.49 192 0.86 256 0.75 384 0.61 1024 0.37 // -0.83 64 1.54 192 0.89 192 0.89 384 0.63 1024 0.39 // -0.82 48 1.82 192 0.92 192 0.92 384 0.65 1024 0.40 // -0.81 48 1.88 128 1.16 192 0.95 384 0.67 1024 0.41 // -0.80 48 1.94 128 1.19 192 0.97 384 0.69 768 0.49 // -0.79 48 1.99 128 1.23 192 1.00 384 0.71 768 0.50 // -0.78 48 2.04 128 1.26 192 1.03 384 0.73 768 0.51 // -0.77 48 2.10 128 1.29 192 1.05 256 0.91 768 0.53 // -0.76 48 2.15 128 1.32 128 1.32 256 0.93 768 0.54 // -0.75 48 2.20 96 1.56 128 1.35 256 0.96 768 0.55 // -0.74 32 2.74 96 1.60 128 1.38 256 0.98 768 0.57 // -0.73 32 2.81 96 1.63 128 1.41 256 1.00 768 0.58 // -0.72 32 2.87 96 1.67 128 1.44 256 1.02 512 0.72 // -0.71 32 2.93 96 1.70 128 1.47 192 1.20 512 0.74 // -0.70 32 2.99 96 1.73 96 1.73 192 1.23 512 0.75 // -0.69 32 3.05 96 1.77 96 1.77 192 1.25 512 0.77 // -0.68 32 3.11 96 1.80 96 1.80 192 1.28 512 0.78 // -0.67 24 3.64 96 1.84 96 1.84 192 1.30 512 0.80 // -0.66 24 3.71 96 1.87 96 1.87 192 1.32 512 0.81 // -0.65 24 3.77 64 2.33 96 1.90 192 1.35 384 0.95 // -0.64 24 3.84 64 2.37 96 1.93 192 1.37 384 0.97 // -0.63 24 3.90 64 2.41 96 1.97 192 1.39 384 0.98 // -0.62 24 3.97 64 2.45 96 2.00 192 1.42 384 1.00 // -0.61 24 4.04 64 2.49 96 2.03 192 1.44 384 1.02 // -0.60 24 4.10 64 2.53 96 2.06 192 1.46 384 1.03 // -0.59 24 4.16 64 2.57 64 2.57 128 1.82 384 1.05 // -0.58 24 4.23 64 2.60 64 2.60 128 1.84 384 1.07 // -0.57 24 4.29 48 3.05 64 2.64 128 1.87 384 1.08 // -0.56 24 4.36 48 3.10 64 2.68 128 1.90 384 1.10 // -0.55 16 5.38 48 3.14 64 2.72 128 1.93 384 1.11 // -0.54 16 5.46 48 3.19 64 2.76 128 1.96 384 1.13 // -0.53 16 5.54 48 3.23 64 2.80 128 1.98 256 1.40 // -0.52 16 5.61 48 3.27 64 2.84 128 2.01 256 1.42 // -0.51 16 5.69 48 3.32 64 2.88 128 2.04 256 1.44 // -0.50 16 5.77 48 3.36 64 2.92 96 2.38 256 1.46 // -0.49 16 5.85 48 3.41 48 3.41 96 2.42 256 1.48 // -0.48 16 5.92 48 3.45 48 3.45 96 2.45 256 1.50 // -0.47 16 6.00 48 3.50 48 3.50 96 2.48 256 1.52 // -0.46 16 6.08 48 3.54 48 3.54 96 2.51 256 1.54 // -0.45 12 7.06 48 3.59 48 3.59 96 2.54 256 1.56 // -0.44 12 7.15 48 3.63 48 3.63 96 2.57 256 1.58 // -0.43 12 7.24 32 4.49 48 3.68 96 2.61 256 1.60 // -0.42 12 7.33 32 4.55 48 3.72 96 2.64 192 1.87 // -0.41 12 7.42 32 4.60 48 3.77 96 2.67 192 1.89 // -0.40 12 7.51 32 4.66 48 3.81 96 2.70 192 1.91 // -0.39 12 7.60 32 4.71 48 3.86 96 2.73 192 1.94 // -0.38 12 7.69 32 4.77 48 3.90 96 2.77 192 1.96 // -0.37 12 7.77 32 4.82 48 3.95 96 2.80 192 1.98 // -0.36 12 7.86 32 4.88 48 3.99 96 2.83 192 2.00 // -0.35 12 7.95 32 4.94 32 4.94 64 3.50 192 2.03 // -0.34 12 8.04 32 4.99 32 4.99 64 3.54 192 2.05 // -0.33 12 8.13 24 5.81 32 5.05 64 3.58 192 2.07 // -0.32 12 8.22 24 5.88 32 5.10 64 3.62 192 2.10 // -0.31 12 8.31 24 5.94 32 5.16 64 3.66 192 2.12 // -0.30 8 10.16 24 6.01 32 5.22 64 3.70 192 2.14 // -0.29 8 10.27 24 6.07 32 5.27 64 3.74 192 2.17 // -0.28 8 10.38 24 6.14 32 5.33 64 3.78 128 2.68 // -0.27 8 10.49 24 6.20 32 5.39 64 3.82 128 2.71 // -0.26 8 10.60 24 6.27 32 5.45 64 3.87 128 2.74 // -0.25 8 10.72 24 6.34 32 5.50 48 4.51 128 2.77 // -0.24 8 10.83 24 6.40 24 6.40 48 4.55 128 2.80 // -0.23 8 10.94 24 6.47 24 6.47 48 4.60 128 2.83 // -0.22 8 11.05 24 6.54 24 6.54 48 4.65 128 2.86 // -0.21 6 12.72 24 6.60 24 6.60 48 4.70 128 2.89 // -0.20 6 12.85 24 6.67 24 6.67 48 4.75 128 2.92 // -0.19 6 12.97 16 8.21 24 6.74 48 4.80 128 2.95 // -0.18 6 13.10 16 8.29 24 6.81 48 4.85 96 3.44 // -0.17 6 13.23 16 8.37 24 6.88 48 4.89 96 3.47 // -0.16 6 13.36 16 8.46 24 6.95 48 4.94 96 3.51 // -0.15 6 13.49 16 8.54 24 7.02 48 5.00 96 3.54 // -0.14 6 13.62 16 8.62 24 7.09 48 5.05 96 3.58 // -0.13 6 13.75 16 8.71 24 7.16 48 5.10 96 3.62 // -0.12 6 13.88 16 8.80 16 8.80 32 6.28 96 3.65 // -0.11 6 14.01 12 10.19 16 8.88 32 6.35 96 3.69 // -0.10 4 16.85 12 10.28 16 8.97 32 6.41 96 3.73 // -0.09 4 17.01 12 10.38 16 9.06 32 6.47 96 3.76 // -0.08 4 17.17 12 10.48 16 9.14 32 6.54 96 3.80 // -0.07 4 17.32 12 10.58 16 9.23 32 6.60 64 4.69 // -0.06 4 17.48 12 10.69 12 10.69 24 7.67 64 4.74 // -0.05 4 17.64 12 10.79 12 10.79 24 7.75 64 4.79 // -0.04 4 17.80 12 10.89 12 10.89 24 7.82 64 4.84 // -0.03 4 17.96 8 13.26 12 10.99 24 7.90 48 5.63 // -0.02 4 18.11 8 13.38 12 11.10 24 7.97 48 5.68 // -0.01 4 18.27 6 15.36 8 13.51 16 9.78 48 5.74 // 0.00 4 1.00 4 1.00 4 1.00 4 1.00 4 1.00 // 0.01 4 18.57 6 15.62 8 13.75 16 9.96 48 5.85 // 0.02 4 18.70 8 13.86 12 11.51 24 8.28 48 5.91 // 0.03 4 18.83 8 13.97 12 11.61 24 8.36 48 5.97 // 0.04 4 18.96 12 11.71 12 11.71 24 8.44 64 5.23 // 0.05 4 19.09 12 11.81 12 11.81 24 8.52 64 5.28 // 0.06 4 19.22 12 11.92 12 11.92 24 8.60 64 5.33 // 0.07 4 19.36 12 12.02 16 10.52 32 7.55 64 5.39 // 0.08 4 19.49 12 12.13 16 10.61 32 7.63 64 5.44 // 0.09 4 19.62 12 12.23 16 10.71 32 7.70 96 4.50 // 0.10 4 19.76 12 12.34 16 10.80 32 7.77 96 4.54 // 0.11 4 19.89 12 12.45 16 10.90 32 7.85 96 4.59 // 0.12 6 17.01 16 11.00 16 11.00 32 7.92 96 4.63 // 0.13 6 17.14 16 11.10 16 11.10 32 8.00 96 4.68 // 0.14 6 17.27 16 11.20 24 9.26 48 6.64 96 4.73 // 0.15 6 17.40 16 11.30 24 9.35 48 6.70 96 4.77 // 0.16 6 17.53 16 11.40 24 9.44 48 6.77 96 4.82 // 0.17 6 17.67 16 11.51 24 9.53 48 6.84 96 4.87 // 0.18 6 17.80 16 11.61 24 9.62 48 6.90 96 4.92 // 0.19 6 17.94 16 11.72 24 9.71 48 6.97 128 4.31 // 0.20 6 18.07 16 11.83 24 9.80 48 7.04 128 4.36 // 0.21 6 18.21 24 9.90 24 9.90 48 7.11 128 4.40 // 0.22 6 18.35 24 9.99 24 9.99 48 7.18 128 4.45 // 0.23 6 18.49 24 10.09 24 10.09 48 7.26 128 4.49 // 0.24 6 18.63 24 10.19 24 10.19 48 7.33 128 4.54 // 0.25 6 18.77 24 10.28 24 10.28 48 7.41 128 4.59 // 0.26 6 18.92 24 10.39 24 10.39 48 7.48 128 4.64 // 0.27 8 17.00 24 10.49 32 9.17 64 6.58 128 4.69 // 0.28 8 17.14 24 10.59 32 9.26 64 6.65 128 4.74 // 0.29 8 17.28 24 10.69 32 9.35 64 6.72 192 3.92 // 0.30 8 17.43 24 10.80 32 9.45 64 6.79 192 3.96 // 0.31 8 17.57 24 10.91 32 9.54 64 6.86 192 4.01 // 0.32 8 17.72 24 11.02 32 9.64 64 6.93 192 4.05 // 0.33 8 17.87 24 11.13 32 9.74 64 7.01 192 4.09 // 0.34 8 18.02 24 11.24 32 9.84 64 7.08 192 4.14 // 0.35 8 18.17 24 11.36 32 9.95 64 7.16 192 4.19 // 0.36 8 18.32 24 11.47 32 10.05 64 7.24 192 4.23 // 0.37 8 18.48 32 10.16 32 10.16 64 7.32 192 4.28 // 0.38 8 18.63 32 10.27 32 10.27 96 6.08 192 4.33 // 0.39 8 18.79 32 10.38 48 8.58 96 6.15 192 4.38 // 0.40 8 18.95 32 10.49 48 8.68 96 6.22 192 4.43 // 0.41 8 19.11 32 10.60 48 8.78 96 6.30 192 4.49 // 0.42 12 16.45 32 10.72 48 8.88 96 6.37 192 4.54 // 0.43 12 16.61 32 10.84 48 8.98 96 6.45 192 4.59 // 0.44 12 16.77 32 10.96 48 9.08 96 6.52 256 4.04 // 0.45 12 16.93 32 11.09 48 9.19 96 6.60 256 4.09 // 0.46 12 17.10 32 11.21 48 9.30 96 6.68 256 4.14 // 0.47 12 17.26 32 11.34 48 9.41 96 6.77 256 4.19 // 0.48 12 17.44 32 11.47 48 9.52 96 6.85 256 4.24 // 0.49 12 17.61 48 9.64 48 9.64 96 6.94 256 4.30 // 0.50 12 17.79 48 9.76 48 9.76 96 7.03 256 4.35 // 0.51 12 17.97 48 9.88 48 9.88 96 7.12 256 4.41 // 0.52 12 18.15 48 10.00 48 10.00 96 7.21 256 4.47 // 0.53 12 18.34 48 10.13 48 10.13 128 6.36 256 4.53 // 0.54 12 18.53 48 10.26 48 10.26 128 6.45 256 4.59 // 0.55 12 18.72 48 10.40 64 9.10 128 6.53 384 3.82 // 0.56 12 18.92 48 10.53 64 9.22 128 6.63 384 3.87 // 0.57 12 19.12 48 10.68 64 9.35 128 6.72 384 3.93 // 0.58 12 19.33 48 10.82 64 9.48 128 6.82 384 3.98 // 0.59 12 19.54 48 10.97 64 9.61 128 6.92 384 4.05 // 0.60 12 19.75 48 11.13 64 9.75 128 7.02 384 4.11 // 0.61 12 19.97 48 11.28 64 9.89 128 7.13 384 4.17 // 0.62 12 20.20 48 11.45 64 10.04 128 7.24 384 4.24 // 0.63 16 18.39 48 11.62 64 10.19 192 6.05 384 4.31 // 0.64 16 18.62 64 10.35 64 10.35 192 6.15 384 4.38 // 0.65 16 18.86 64 10.51 96 8.71 192 6.25 384 4.45 // 0.66 16 19.10 64 10.68 96 8.85 192 6.36 384 4.53 // 0.67 16 19.35 64 10.86 96 9.00 192 6.47 512 4.00 // 0.68 16 19.60 64 11.04 96 9.16 192 6.58 512 4.08 // 0.69 16 19.87 64 11.23 96 9.32 192 6.70 512 4.15 // 0.70 16 20.14 64 11.43 96 9.49 192 6.83 512 4.23 // 0.71 16 20.42 64 11.63 96 9.67 192 6.96 512 4.32 // 0.72 16 20.71 64 11.85 96 9.85 192 7.10 512 4.40 // 0.73 16 21.01 96 10.04 96 10.04 192 7.25 512 4.50 // 0.74 16 21.32 96 10.25 96 10.25 256 6.44 768 3.76 // 0.75 16 21.65 96 10.46 96 10.46 256 6.58 768 3.84 // 0.76 16 21.99 96 10.68 128 9.36 256 6.73 768 3.93 // 0.77 24 19.41 96 10.92 128 9.57 256 6.89 768 4.03 // 0.78 24 19.76 96 11.17 128 9.79 256 7.06 768 4.13 // 0.79 24 20.13 96 11.44 128 10.03 256 7.24 768 4.24 // 0.80 24 20.51 96 11.72 128 10.29 384 6.11 768 4.35 // 0.81 24 20.92 96 12.02 128 10.56 384 6.28 768 4.48 // 0.82 24 21.35 96 12.34 192 8.99 384 6.46 1024 4.00 // 0.83 24 21.81 128 11.16 192 9.26 384 6.66 1024 4.13 // 0.84 24 22.29 128 11.50 192 9.55 384 6.88 1024 4.26 // 0.85 24 22.82 128 11.86 192 9.87 384 7.11 1024 4.41 // 0.86 24 23.38 128 12.26 192 10.21 384 7.37 1024 4.58 // 0.87 24 24.00 128 12.70 192 10.59 512 6.67 1536 3.90 // 0.88 24 24.67 192 11.01 192 11.01 512 6.95 1536 4.06 // 0.89 24 25.41 192 11.48 256 10.07 512 7.26 1536 4.25 // 0.90 24 26.24 192 12.00 256 10.54 768 6.27 1536 4.47 // 0.91 24 27.17 192 12.61 256 11.09 768 6.62 2048 4.10 // 0.92 24 28.23 192 13.30 384 9.74 768 7.02 2048 4.35 // 0.93 24 29.45 256 12.46 384 10.38 768 7.50 3072 3.82 // 0.94 24 30.86 256 13.36 384 11.16 1024 7.05 3072 4.13 // 0.95 24 32.53 384 12.14 512 10.67 1024 7.72 3072 4.53 // 0.96 24 34.51 384 13.42 512 11.83 1536 7.09 4096 4.40 // 0.97 24 36.88 512 13.45 768 11.24 2048 7.11 6144 4.16 // 0.98 16 41.78 768 13.48 1024 11.88 3072 7.12 8192 4.42 // 0.99 8 44.82 1024 16.00 1536 13.51 6144 7.14 16384 4.43 static const int ndiv = 100; // Encode N as small integer: 2,3,4,6,8,12... -> 0,1,2,3,4,5... // using this awk script // // { // n = $1; // if (n % 3 == 0) { // s = 1; // n = n/3; // } else { // s = 0; // n = n/2; // } // p = int( log(n)/log(2)+0.5 ); // printf "%d\n", 2*p+s; // } // // A couple of changes have been made: (1) the decrease in N for float and // n > 0.97 has been removed; (2) entrys of n=+/-1 have been included // (incrementing the previous code value by 1). #if GEOGRAPHICLIB_PRECISION == 1 static const unsigned char narr[2*ndiv+1] = { 19,18,16,15,14,13,13,13,12,12,11,11,11,11,10,10,10,10,9,9,9,9,9,9,9,9,8, 8,8,8,8,8,8,7,7,7,7,7,7,7,7,7,7,7,7,6,6,6,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6, 6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,8 }; #elif GEOGRAPHICLIB_PRECISION == 2 static const unsigned char narr[2*ndiv+1] = { 22,21,19,18,17,17,16,15,15,15,14,14,14,13,13,13,13,13,13,12,12,12,12,12, 12,11,11,11,11,11,11,11,11,11,11,10,10,10,10,10,10,10,10,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,8,8,8,8,8,8,8,8,8,8,7,7,7,7,7,7,7,7,7,7,7,7,7,7,6,6,6,6,6,6, 6,6,5,5,5,5,5,5,5,5,4,4,3,2,3,4,4,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,7,7, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,12,12, 12,12,12,13,13,13,13,13,14,14,15,15,16,17,18,19 }; #elif GEOGRAPHICLIB_PRECISION == 3 static const unsigned char narr[2*ndiv+1] = { 23,22,20,19,18,17,17,16,16,15,15,15,15,14,14,14,14,13,13,13,13,13,13,13, 12,12,12,12,12,12,11,11,11,11,11,11,11,11,11,11,11,10,10,10,10,10,10,10, 10,10,10,9,9,9,9,9,9,9,9,9,9,9,9,9,9,8,8,8,8,8,8,8,8,8,8,8,7,7,7,7,7,7,7, 7,7,7,7,7,6,6,6,6,6,6,5,5,5,5,5,4,2,4,5,5,5,5,5,6,6,6,6,6,6,6,7,7,7,7,7, 7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,12,12,12, 12,12,12,13,13,13,13,13,13,13,14,14,14,15,15,15,16,16,17,18,19,20 }; #elif GEOGRAPHICLIB_PRECISION == 4 static const unsigned char narr[2*ndiv+1] = { 25,24,22,21,20,19,19,18,18,17,17,17,17,16,16,16,15,15,15,15,15,15,15,14, 14,14,14,14,14,13,13,13,13,13,13,13,13,13,13,13,13,12,12,12,12,12,12,12, 12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,10,10,10,10,10,10, 10,10,10,9,9,9,9,9,9,9,9,9,9,9,9,9,8,8,8,8,8,8,7,7,7,7,7,6,2,6,7,7,7,7,7, 8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,10,10,10, 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12, 12,13,13,13,13,13,13,13,13,13,13,13,14,14,14,14,14,14,15,15,15,15,15,15, 15,16,16,16,17,17,17,17,18,18,19,20,21,23,24 }; #elif GEOGRAPHICLIB_PRECISION == 5 static const unsigned char narr[2*ndiv+1] = { 27,26,24,23,22,22,21,21,20,20,20,19,19,19,19,18,18,18,18,18,17,17,17,17, 17,17,17,17,16,16,16,16,16,16,16,15,15,15,15,15,15,15,15,15,15,15,15,14, 14,14,14,14,14,14,14,14,14,14,13,13,13,13,13,13,13,13,13,13,13,13,13,13, 12,12,12,12,12,12,12,12,12,12,11,11,11,11,11,11,11,11,11,11,11,10,10,10, 10,9,9,9,2,9,9,9,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,12,12,12, 12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,14,14, 14,14,14,14,14,14,14,14,14,15,15,15,15,15,15,15,15,15,15,15,15,16,16,16, 16,16,16,16,17,17,17,17,17,17,17,17,18,18,18,18,18,19,19,19,19,20,20,21, 21,21,22,23,24,26,27 }; #else #error "Bad value for GEOGRAPHICLIB_PRECISION" #endif real n = ndiv * _n; // n in [-ndiv, ndiv] int j = ndiv + int(n < 0 ? floor(n) : ceil(n)); // j in [0, 2*ndiv] int N = int(narr[j]); // Decode 0,1,2,3,4,5... -> 2,3,4,6,8,12... N = (N % 2 == 0 ? 2 : 3) * (1 << (N/2)); #if GEOGRAPHICLIB_PRECISION == 5 if (Math::digits() > 256) { // Scale up N by the number of digits in the precision relative to // the number used for the test = 256. int M = (Math::digits() * N) / 256; while (N < M) N = N % 3 == 0 ? 4*N/3 : 3*N/2; } #endif _fft.reset(N); _nC4 = N; } const GeodesicExact& GeodesicExact::WGS84() { static const GeodesicExact wgs84(Constants::WGS84_a(), Constants::WGS84_f()); return wgs84; } GeodesicLineExact GeodesicExact::Line(real lat1, real lon1, real azi1, unsigned caps) const { return GeodesicLineExact(*this, lat1, lon1, azi1, caps); } Math::real GeodesicExact::GenDirect(real lat1, real lon1, real azi1, bool arcmode, real s12_a12, unsigned outmask, real& lat2, real& lon2, real& azi2, real& s12, real& m12, real& M12, real& M21, real& S12) const { // Automatically supply DISTANCE_IN if necessary if (!arcmode) outmask |= DISTANCE_IN; return GeodesicLineExact(*this, lat1, lon1, azi1, outmask) . // Note the dot! GenPosition(arcmode, s12_a12, outmask, lat2, lon2, azi2, s12, m12, M12, M21, S12); } GeodesicLineExact GeodesicExact::GenDirectLine(real lat1, real lon1, real azi1, bool arcmode, real s12_a12, unsigned caps) const { azi1 = Math::AngNormalize(azi1); real salp1, calp1; // Guard against underflow in salp0. Also -0 is converted to +0. Math::sincosd(Math::AngRound(azi1), salp1, calp1); // Automatically supply DISTANCE_IN if necessary if (!arcmode) caps |= DISTANCE_IN; return GeodesicLineExact(*this, lat1, lon1, azi1, salp1, calp1, caps, arcmode, s12_a12); } GeodesicLineExact GeodesicExact::DirectLine(real lat1, real lon1, real azi1, real s12, unsigned caps) const { return GenDirectLine(lat1, lon1, azi1, false, s12, caps); } GeodesicLineExact GeodesicExact::ArcDirectLine(real lat1, real lon1, real azi1, real a12, unsigned caps) const { return GenDirectLine(lat1, lon1, azi1, true, a12, caps); } Math::real GeodesicExact::GenInverse(real lat1, real lon1, real lat2, real lon2, unsigned outmask, real& s12, real& salp1, real& calp1, real& salp2, real& calp2, real& m12, real& M12, real& M21, real& S12) const { // Compute longitude difference (AngDiff does this carefully). Result is // in [-180, 180] but -180 is only for west-going geodesics. 180 is for // east-going and meridional geodesics. using std::isnan; // Needed for Centos 7, ubuntu 14 real lon12s, lon12 = Math::AngDiff(lon1, lon2, lon12s); // Make longitude difference positive. int lonsign = signbit(lon12) ? -1 : 1; lon12 *= lonsign; lon12s *= lonsign; real lam12 = lon12 * Math::degree(), slam12, clam12; // Calculate sincos of lon12 + error (this applies AngRound internally). Math::sincosde(lon12, lon12s, slam12, clam12); // the supplementary longitude difference lon12s = (Math::hd - lon12) - lon12s; // If really close to the equator, treat as on equator. lat1 = Math::AngRound(Math::LatFix(lat1)); lat2 = Math::AngRound(Math::LatFix(lat2)); // Swap points so that point with higher (abs) latitude is point 1 // If one latitude is a nan, then it becomes lat1. int swapp = fabs(lat1) < fabs(lat2) || isnan(lat2) ? -1 : 1; if (swapp < 0) { lonsign *= -1; swap(lat1, lat2); } // Make lat1 <= -0 int latsign = signbit(lat1) ? 1 : -1; lat1 *= latsign; lat2 *= latsign; // Now we have // // 0 <= lon12 <= 180 // -90 <= lat1 <= -0 // lat1 <= lat2 <= -lat1 // // longsign, swapp, latsign register the transformation to bring the // coordinates to this canonical form. In all cases, 1 means no change was // made. We make these transformations so that there are few cases to // check, e.g., on verifying quadrants in atan2. In addition, this // enforces some symmetries in the results returned. real sbet1, cbet1, sbet2, cbet2, s12x, m12x; // Initialize for the meridian. No longitude calculation is done in this // case to let the parameter default to 0. EllipticFunction E(-_ep2); Math::sincosd(lat1, sbet1, cbet1); sbet1 *= _f1; // Ensure cbet1 = +epsilon at poles; doing the fix on beta means that sig12 // will be <= 2*tiny for two points at the same pole. Math::norm(sbet1, cbet1); cbet1 = fmax(tiny_, cbet1); Math::sincosd(lat2, sbet2, cbet2); sbet2 *= _f1; // Ensure cbet2 = +epsilon at poles Math::norm(sbet2, cbet2); cbet2 = fmax(tiny_, cbet2); // If cbet1 < -sbet1, then cbet2 - cbet1 is a sensitive measure of the // |bet1| - |bet2|. Alternatively (cbet1 >= -sbet1), abs(sbet2) + sbet1 is // a better measure. This logic is used in assigning calp2 in Lambda12. // Sometimes these quantities vanish and in that case we force bet2 = +/- // bet1 exactly. An example where is is necessary is the inverse problem // 48.522876735459 0 -48.52287673545898293 179.599720456223079643 // which failed with Visual Studio 10 (Release and Debug) if (cbet1 < -sbet1) { if (cbet2 == cbet1) sbet2 = copysign(sbet1, sbet2); } else { if (fabs(sbet2) == -sbet1) cbet2 = cbet1; } real dn1 = (_f >= 0 ? sqrt(1 + _ep2 * Math::sq(sbet1)) : sqrt(1 - _e2 * Math::sq(cbet1)) / _f1), dn2 = (_f >= 0 ? sqrt(1 + _ep2 * Math::sq(sbet2)) : sqrt(1 - _e2 * Math::sq(cbet2)) / _f1); real a12, sig12; bool meridian = lat1 == -Math::qd || slam12 == 0; if (meridian) { // Endpoints are on a single full meridian, so the geodesic might lie on // a meridian. calp1 = clam12; salp1 = slam12; // Head to the target longitude calp2 = 1; salp2 = 0; // At the target we're heading north real // tan(bet) = tan(sig) * cos(alp) ssig1 = sbet1, csig1 = calp1 * cbet1, ssig2 = sbet2, csig2 = calp2 * cbet2; // sig12 = sig2 - sig1 sig12 = atan2(fmax(real(0), csig1 * ssig2 - ssig1 * csig2), csig1 * csig2 + ssig1 * ssig2); { real dummy; Lengths(E, sig12, ssig1, csig1, dn1, ssig2, csig2, dn2, cbet1, cbet2, outmask | REDUCEDLENGTH, s12x, m12x, dummy, M12, M21); } // Add the check for sig12 since zero length geodesics might yield m12 < // 0. Test case was // // echo 20.001 0 20.001 0 | GeodSolve -i // // In fact, we will have sig12 > pi/2 for meridional geodesic which is // not a shortest path. if (sig12 < 1 || m12x >= 0) { // Need at least 2, to handle 90 0 90 180 if (sig12 < 3 * tiny_ || // Prevent negative s12 or m12 for short lines (sig12 < tol0_ && (s12x < 0 || m12x < 0))) sig12 = m12x = s12x = 0; m12x *= _b; s12x *= _b; a12 = sig12 / Math::degree(); } else // m12 < 0, i.e., prolate and too close to anti-podal meridian = false; } // somg12 == 2 marks that it needs to be calculated real omg12 = 0, somg12 = 2, comg12 = 0; if (!meridian && sbet1 == 0 && // and sbet2 == 0 (_f <= 0 || lon12s >= _f * Math::hd)) { // Geodesic runs along equator calp1 = calp2 = 0; salp1 = salp2 = 1; s12x = _a * lam12; sig12 = omg12 = lam12 / _f1; m12x = _b * sin(sig12); if (outmask & GEODESICSCALE) M12 = M21 = cos(sig12); a12 = lon12 / _f1; } else if (!meridian) { // Now point1 and point2 belong within a hemisphere bounded by a // meridian and geodesic is neither meridional or equatorial. // Figure a starting point for Newton's method real dnm; sig12 = InverseStart(E, sbet1, cbet1, dn1, sbet2, cbet2, dn2, lam12, slam12, clam12, salp1, calp1, salp2, calp2, dnm); if (sig12 >= 0) { // Short lines (InverseStart sets salp2, calp2, dnm) s12x = sig12 * _b * dnm; m12x = Math::sq(dnm) * _b * sin(sig12 / dnm); if (outmask & GEODESICSCALE) M12 = M21 = cos(sig12 / dnm); a12 = sig12 / Math::degree(); omg12 = lam12 / (_f1 * dnm); } else { // Newton's method. This is a straightforward solution of f(alp1) = // lambda12(alp1) - lam12 = 0 with one wrinkle. f(alp) has exactly one // root in the interval (0, pi) and its derivative is positive at the // root. Thus f(alp) is positive for alp > alp1 and negative for alp < // alp1. During the course of the iteration, a range (alp1a, alp1b) is // maintained which brackets the root and with each evaluation of // f(alp) the range is shrunk, if possible. Newton's method is // restarted whenever the derivative of f is negative (because the new // value of alp1 is then further from the solution) or if the new // estimate of alp1 lies outside (0,pi); in this case, the new starting // guess is taken to be (alp1a + alp1b) / 2. // // initial values to suppress warnings (if loop is executed 0 times) real ssig1 = 0, csig1 = 0, ssig2 = 0, csig2 = 0, domg12 = 0; unsigned numit = 0; // Bracketing range real salp1a = tiny_, calp1a = 1, salp1b = tiny_, calp1b = -1; for (bool tripn = false, tripb = false;; ++numit) { // 1/4 meridian = 10e6 m and random input. max err is estimated max // error in nm (checking solution of inverse problem by direct // solution). iter is mean and sd of number of iterations // // max iter // log2(b/a) err mean sd // -7 387 5.33 3.68 // -6 345 5.19 3.43 // -5 269 5.00 3.05 // -4 210 4.76 2.44 // -3 115 4.55 1.87 // -2 69 4.35 1.38 // -1 36 4.05 1.03 // 0 15 0.01 0.13 // 1 25 5.10 1.53 // 2 96 5.61 2.09 // 3 318 6.02 2.74 // 4 985 6.24 3.22 // 5 2352 6.32 3.44 // 6 6008 6.30 3.45 // 7 19024 6.19 3.30 real dv; real v = Lambda12(sbet1, cbet1, dn1, sbet2, cbet2, dn2, salp1, calp1, slam12, clam12, salp2, calp2, sig12, ssig1, csig1, ssig2, csig2, E, domg12, numit < maxit1_, dv); if (tripb || // Reversed test to allow escape with NaNs !(fabs(v) >= (tripn ? 8 : 1) * tol0_) || // Enough bisections to get accurate result numit == maxit2_) break; // Update bracketing values if (v > 0 && (numit > maxit1_ || calp1/salp1 > calp1b/salp1b)) { salp1b = salp1; calp1b = calp1; } else if (v < 0 && (numit > maxit1_ || calp1/salp1 < calp1a/salp1a)) { salp1a = salp1; calp1a = calp1; } if (numit < maxit1_ && dv > 0) { real dalp1 = -v/dv; // |dalp1| < pi test moved earlier because GEOGRAPHICLIB_PRECISION // = 5 can result in dalp1 = 10^(10^8). Then sin(dalp1) takes ages // (because of the need to do accurate range reduction). if (fabs(dalp1) < Math::pi()) { real sdalp1 = sin(dalp1), cdalp1 = cos(dalp1), nsalp1 = salp1 * cdalp1 + calp1 * sdalp1; if (nsalp1 > 0) { calp1 = calp1 * cdalp1 - salp1 * sdalp1; salp1 = nsalp1; Math::norm(salp1, calp1); // In some regimes we don't get quadratic convergence because // slope -> 0. So use convergence conditions based on epsilon // instead of sqrt(epsilon). tripn = fabs(v) <= 16 * tol0_; continue; } } } // Either dv was not positive or updated value was outside legal // range. Use the midpoint of the bracket as the next estimate. // This mechanism is not needed for the WGS84 ellipsoid, but it does // catch problems with more eccentric ellipsoids. Its efficacy is // such for the WGS84 test set with the starting guess set to alp1 = // 90deg: // the WGS84 test set: mean = 5.21, sd = 3.93, max = 24 // WGS84 and random input: mean = 4.74, sd = 0.99 salp1 = (salp1a + salp1b)/2; calp1 = (calp1a + calp1b)/2; Math::norm(salp1, calp1); tripn = false; tripb = (fabs(salp1a - salp1) + (calp1a - calp1) < tolb_ || fabs(salp1 - salp1b) + (calp1 - calp1b) < tolb_); } { real dummy; Lengths(E, sig12, ssig1, csig1, dn1, ssig2, csig2, dn2, cbet1, cbet2, outmask, s12x, m12x, dummy, M12, M21); } m12x *= _b; s12x *= _b; a12 = sig12 / Math::degree(); if (outmask & AREA) { // omg12 = lam12 - domg12 real sdomg12 = sin(domg12), cdomg12 = cos(domg12); somg12 = slam12 * cdomg12 - clam12 * sdomg12; comg12 = clam12 * cdomg12 + slam12 * sdomg12; } } } if (outmask & DISTANCE) s12 = real(0) + s12x; // Convert -0 to 0 if (outmask & REDUCEDLENGTH) m12 = real(0) + m12x; // Convert -0 to 0 if (outmask & AREA) { real // From Lambda12: sin(alp1) * cos(bet1) = sin(alp0) salp0 = salp1 * cbet1, calp0 = hypot(calp1, salp1 * sbet1); // calp0 > 0 real alp12, // Multiplier = a^2 * e^2 * cos(alpha0) * sin(alpha0). A4 = Math::sq(_a) * calp0 * salp0 * _e2; if (A4 != 0) { real k2 = Math::sq(calp0) * _ep2, // From Lambda12: tan(bet) = tan(sig) * cos(alp) ssig1 = sbet1, csig1 = calp1 * cbet1, ssig2 = sbet2, csig2 = calp2 * cbet2; Math::norm(ssig1, csig1); Math::norm(ssig2, csig2); I4Integrand i4(_ep2, k2); vector C4a(_nC4); _fft.transform(i4, C4a.data()); real B41 = DST::integral(ssig1, csig1, C4a.data(), _nC4), B42 = DST::integral(ssig2, csig2, C4a.data(), _nC4); S12 = A4 * (B42 - B41); } else // Avoid problems with indeterminate sig1, sig2 on equator S12 = 0; if (!meridian && somg12 == 2) { somg12 = sin(omg12); comg12 = cos(omg12); } if (!meridian && // omg12 < 3/4 * pi comg12 > -real(0.7071) && // Long difference not too big sbet2 - sbet1 < real(1.75)) { // Lat difference not too big // Use tan(Gamma/2) = tan(omg12/2) // * (tan(bet1/2)+tan(bet2/2))/(1+tan(bet1/2)*tan(bet2/2)) // with tan(x/2) = sin(x)/(1+cos(x)) real domg12 = 1 + comg12, dbet1 = 1 + cbet1, dbet2 = 1 + cbet2; alp12 = 2 * atan2( somg12 * ( sbet1 * dbet2 + sbet2 * dbet1 ), domg12 * ( sbet1 * sbet2 + dbet1 * dbet2 ) ); } else { // alp12 = alp2 - alp1, used in atan2 so no need to normalize real salp12 = salp2 * calp1 - calp2 * salp1, calp12 = calp2 * calp1 + salp2 * salp1; // The right thing appears to happen if alp1 = +/-180 and alp2 = 0, viz // salp12 = -0 and alp12 = -180. However this depends on the sign // being attached to 0 correctly. The following ensures the correct // behavior. if (salp12 == 0 && calp12 < 0) { salp12 = tiny_ * calp1; calp12 = -1; } alp12 = atan2(salp12, calp12); } S12 += _c2 * alp12; S12 *= swapp * lonsign * latsign; // Convert -0 to 0 S12 += 0; } // Convert calp, salp to azimuth accounting for lonsign, swapp, latsign. if (swapp < 0) { swap(salp1, salp2); swap(calp1, calp2); if (outmask & GEODESICSCALE) swap(M12, M21); } salp1 *= swapp * lonsign; calp1 *= swapp * latsign; salp2 *= swapp * lonsign; calp2 *= swapp * latsign; // Returned value in [0, 180] return a12; } Math::real GeodesicExact::GenInverse(real lat1, real lon1, real lat2, real lon2, unsigned outmask, real& s12, real& azi1, real& azi2, real& m12, real& M12, real& M21, real& S12) const { outmask &= OUT_MASK; real salp1, calp1, salp2, calp2, a12 = GenInverse(lat1, lon1, lat2, lon2, outmask, s12, salp1, calp1, salp2, calp2, m12, M12, M21, S12); if (outmask & AZIMUTH) { azi1 = Math::atan2d(salp1, calp1); azi2 = Math::atan2d(salp2, calp2); } return a12; } GeodesicLineExact GeodesicExact::InverseLine(real lat1, real lon1, real lat2, real lon2, unsigned caps) const { real t, salp1, calp1, salp2, calp2, a12 = GenInverse(lat1, lon1, lat2, lon2, // No need to specify AZIMUTH here 0u, t, salp1, calp1, salp2, calp2, t, t, t, t), azi1 = Math::atan2d(salp1, calp1); // Ensure that a12 can be converted to a distance if (caps & (OUT_MASK & DISTANCE_IN)) caps |= DISTANCE; return GeodesicLineExact(*this, lat1, lon1, azi1, salp1, calp1, caps, true, a12); } void GeodesicExact::Lengths(const EllipticFunction& E, real sig12, real ssig1, real csig1, real dn1, real ssig2, real csig2, real dn2, real cbet1, real cbet2, unsigned outmask, real& s12b, real& m12b, real& m0, real& M12, real& M21) const { // Return m12b = (reduced length)/_b; also calculate s12b = distance/_b, // and m0 = coefficient of secular term in expression for reduced length. outmask &= OUT_ALL; // outmask & DISTANCE: set s12b // outmask & REDUCEDLENGTH: set m12b & m0 // outmask & GEODESICSCALE: set M12 & M21 // It's OK to have repeated dummy arguments, // e.g., s12b = m0 = M12 = M21 = dummy if (outmask & DISTANCE) // Missing a factor of _b s12b = E.E() / (Math::pi() / 2) * (sig12 + (E.deltaE(ssig2, csig2, dn2) - E.deltaE(ssig1, csig1, dn1))); if (outmask & (REDUCEDLENGTH | GEODESICSCALE)) { real m0x = - E.k2() * E.D() / (Math::pi() / 2), J12 = m0x * (sig12 + (E.deltaD(ssig2, csig2, dn2) - E.deltaD(ssig1, csig1, dn1))); if (outmask & REDUCEDLENGTH) { m0 = m0x; // Missing a factor of _b. Add parens around (csig1 * ssig2) and // (ssig1 * csig2) to ensure accurate cancellation in the case of // coincident points. m12b = dn2 * (csig1 * ssig2) - dn1 * (ssig1 * csig2) - csig1 * csig2 * J12; } if (outmask & GEODESICSCALE) { real csig12 = csig1 * csig2 + ssig1 * ssig2; real t = _ep2 * (cbet1 - cbet2) * (cbet1 + cbet2) / (dn1 + dn2); M12 = csig12 + (t * ssig2 - csig2 * J12) * ssig1 / dn1; M21 = csig12 - (t * ssig1 - csig1 * J12) * ssig2 / dn2; } } } Math::real GeodesicExact::Astroid(real x, real y) { // Solve k^4+2*k^3-(x^2+y^2-1)*k^2-2*y^2*k-y^2 = 0 for positive root k. // This solution is adapted from Geocentric::Reverse. real k; real p = Math::sq(x), q = Math::sq(y), r = (p + q - 1) / 6; if ( !(q == 0 && r <= 0) ) { real // Avoid possible division by zero when r = 0 by multiplying equations // for s and t by r^3 and r, resp. S = p * q / 4, // S = r^3 * s r2 = Math::sq(r), r3 = r * r2, // The discriminant of the quadratic equation for T3. This is zero on // the evolute curve p^(1/3)+q^(1/3) = 1 disc = S * (S + 2 * r3); real u = r; if (disc >= 0) { real T3 = S + r3; // Pick the sign on the sqrt to maximize abs(T3). This minimizes loss // of precision due to cancellation. The result is unchanged because // of the way the T is used in definition of u. T3 += T3 < 0 ? -sqrt(disc) : sqrt(disc); // T3 = (r * t)^3 // N.B. cbrt always returns the real root. cbrt(-8) = -2. real T = cbrt(T3); // T = r * t // T can be zero; but then r2 / T -> 0. u += T + (T != 0 ? r2 / T : 0); } else { // T is complex, but the way u is defined the result is real. real ang = atan2(sqrt(-disc), -(S + r3)); // There are three possible cube roots. We choose the root which // avoids cancellation. Note that disc < 0 implies that r < 0. u += 2 * r * cos(ang / 3); } real v = sqrt(Math::sq(u) + q), // guaranteed positive // Avoid loss of accuracy when u < 0. uv = u < 0 ? q / (v - u) : u + v, // u+v, guaranteed positive w = (uv - q) / (2 * v); // positive? // Rearrange expression for k to avoid loss of accuracy due to // subtraction. Division by 0 not possible because uv > 0, w >= 0. k = uv / (sqrt(uv + Math::sq(w)) + w); // guaranteed positive } else { // q == 0 && r <= 0 // y = 0 with |x| <= 1. Handle this case directly. // for y small, positive root is k = abs(y)/sqrt(1-x^2) k = 0; } return k; } Math::real GeodesicExact::InverseStart(EllipticFunction& E, real sbet1, real cbet1, real dn1, real sbet2, real cbet2, real dn2, real lam12, real slam12, real clam12, real& salp1, real& calp1, // Only updated if return val >= 0 real& salp2, real& calp2, // Only updated for short lines real& dnm) const { // Return a starting point for Newton's method in salp1 and calp1 (function // value is -1). If Newton's method doesn't need to be used, return also // salp2 and calp2 and function value is sig12. real sig12 = -1, // Return value // bet12 = bet2 - bet1 in [0, pi); bet12a = bet2 + bet1 in (-pi, 0] sbet12 = sbet2 * cbet1 - cbet2 * sbet1, cbet12 = cbet2 * cbet1 + sbet2 * sbet1; real sbet12a = sbet2 * cbet1 + cbet2 * sbet1; bool shortline = cbet12 >= 0 && sbet12 < real(0.5) && cbet2 * lam12 < real(0.5); real somg12, comg12; if (shortline) { real sbetm2 = Math::sq(sbet1 + sbet2); // sin((bet1+bet2)/2)^2 // = (sbet1 + sbet2)^2 / ((sbet1 + sbet2)^2 + (cbet1 + cbet2)^2) sbetm2 /= sbetm2 + Math::sq(cbet1 + cbet2); dnm = sqrt(1 + _ep2 * sbetm2); real omg12 = lam12 / (_f1 * dnm); somg12 = sin(omg12); comg12 = cos(omg12); } else { somg12 = slam12; comg12 = clam12; } salp1 = cbet2 * somg12; calp1 = comg12 >= 0 ? sbet12 + cbet2 * sbet1 * Math::sq(somg12) / (1 + comg12) : sbet12a - cbet2 * sbet1 * Math::sq(somg12) / (1 - comg12); real ssig12 = hypot(salp1, calp1), csig12 = sbet1 * sbet2 + cbet1 * cbet2 * comg12; if (shortline && ssig12 < _etol2) { // really short lines salp2 = cbet1 * somg12; calp2 = sbet12 - cbet1 * sbet2 * (comg12 >= 0 ? Math::sq(somg12) / (1 + comg12) : 1 - comg12); Math::norm(salp2, calp2); // Set return value sig12 = atan2(ssig12, csig12); } else if (fabs(_n) > real(0.1) || // Skip astroid calc if too eccentric csig12 >= 0 || ssig12 >= 6 * fabs(_n) * Math::pi() * Math::sq(cbet1)) { // Nothing to do, zeroth order spherical approximation is OK } else { // Scale lam12 and bet2 to x, y coordinate system where antipodal point // is at origin and singular point is at y = 0, x = -1. real x, y, lamscale, betscale; real lam12x = atan2(-slam12, -clam12); // lam12 - pi if (_f >= 0) { // In fact f == 0 does not get here // x = dlong, y = dlat { real k2 = Math::sq(sbet1) * _ep2; E.Reset(-k2, -_ep2, 1 + k2, 1 + _ep2); lamscale = _e2/_f1 * cbet1 * 2 * E.H(); } betscale = lamscale * cbet1; x = lam12x / lamscale; y = sbet12a / betscale; } else { // _f < 0 // x = dlat, y = dlong real cbet12a = cbet2 * cbet1 - sbet2 * sbet1, bet12a = atan2(sbet12a, cbet12a); real m12b, m0, dummy; // In the case of lon12 = 180, this repeats a calculation made in // Inverse. Lengths(E, Math::pi() + bet12a, sbet1, -cbet1, dn1, sbet2, cbet2, dn2, cbet1, cbet2, REDUCEDLENGTH, dummy, m12b, m0, dummy, dummy); x = -1 + m12b / (cbet1 * cbet2 * m0 * Math::pi()); betscale = x < -real(0.01) ? sbet12a / x : -_f * Math::sq(cbet1) * Math::pi(); lamscale = betscale / cbet1; y = lam12x / lamscale; } if (y > -tol1_ && x > -1 - xthresh_) { // strip near cut // Need real(x) here to cast away the volatility of x for min/max if (_f >= 0) { salp1 = fmin(real(1), -x); calp1 = - sqrt(1 - Math::sq(salp1)); } else { calp1 = fmax(real(x > -tol1_ ? 0 : -1), x); salp1 = sqrt(1 - Math::sq(calp1)); } } else { // Estimate alp1, by solving the astroid problem. // // Could estimate alpha1 = theta + pi/2, directly, i.e., // calp1 = y/k; salp1 = -x/(1+k); for _f >= 0 // calp1 = x/(1+k); salp1 = -y/k; for _f < 0 (need to check) // // However, it's better to estimate omg12 from astroid and use // spherical formula to compute alp1. This reduces the mean number of // Newton iterations for astroid cases from 2.24 (min 0, max 6) to 2.12 // (min 0 max 5). The changes in the number of iterations are as // follows: // // change percent // 1 5 // 0 78 // -1 16 // -2 0.6 // -3 0.04 // -4 0.002 // // The histogram of iterations is (m = number of iterations estimating // alp1 directly, n = number of iterations estimating via omg12, total // number of trials = 148605): // // iter m n // 0 148 186 // 1 13046 13845 // 2 93315 102225 // 3 36189 32341 // 4 5396 7 // 5 455 1 // 6 56 0 // // Because omg12 is near pi, estimate work with omg12a = pi - omg12 real k = Astroid(x, y); real omg12a = lamscale * ( _f >= 0 ? -x * k/(1 + k) : -y * (1 + k)/k ); somg12 = sin(omg12a); comg12 = -cos(omg12a); // Update spherical estimate of alp1 using omg12 instead of lam12 salp1 = cbet2 * somg12; calp1 = sbet12a - cbet2 * sbet1 * Math::sq(somg12) / (1 - comg12); } } // Sanity check on starting guess. Backwards check allows NaN through. if (!(salp1 <= 0)) Math::norm(salp1, calp1); else { salp1 = 1; calp1 = 0; } return sig12; } Math::real GeodesicExact::Lambda12(real sbet1, real cbet1, real dn1, real sbet2, real cbet2, real dn2, real salp1, real calp1, real slam120, real clam120, real& salp2, real& calp2, real& sig12, real& ssig1, real& csig1, real& ssig2, real& csig2, EllipticFunction& E, real& domg12, bool diffp, real& dlam12) const { if (sbet1 == 0 && calp1 == 0) // Break degeneracy of equatorial line. This case has already been // handled. calp1 = -tiny_; real // sin(alp1) * cos(bet1) = sin(alp0) salp0 = salp1 * cbet1, calp0 = hypot(calp1, salp1 * sbet1); // calp0 > 0 real somg1, comg1, somg2, comg2, somg12, comg12, cchi1, cchi2, lam12; // tan(bet1) = tan(sig1) * cos(alp1) // tan(omg1) = sin(alp0) * tan(sig1) = tan(omg1)=tan(alp1)*sin(bet1) ssig1 = sbet1; somg1 = salp0 * sbet1; csig1 = comg1 = calp1 * cbet1; // Without normalization we have schi1 = somg1. cchi1 = _f1 * dn1 * comg1; Math::norm(ssig1, csig1); // Math::norm(somg1, comg1); -- don't need to normalize! // Math::norm(schi1, cchi1); -- don't need to normalize! // Enforce symmetries in the case abs(bet2) = -bet1. Need to be careful // about this case, since this can yield singularities in the Newton // iteration. // sin(alp2) * cos(bet2) = sin(alp0) salp2 = cbet2 != cbet1 ? salp0 / cbet2 : salp1; // calp2 = sqrt(1 - sq(salp2)) // = sqrt(sq(calp0) - sq(sbet2)) / cbet2 // and subst for calp0 and rearrange to give (choose positive sqrt // to give alp2 in [0, pi/2]). calp2 = cbet2 != cbet1 || fabs(sbet2) != -sbet1 ? sqrt(Math::sq(calp1 * cbet1) + (cbet1 < -sbet1 ? (cbet2 - cbet1) * (cbet1 + cbet2) : (sbet1 - sbet2) * (sbet1 + sbet2))) / cbet2 : fabs(calp1); // tan(bet2) = tan(sig2) * cos(alp2) // tan(omg2) = sin(alp0) * tan(sig2). ssig2 = sbet2; somg2 = salp0 * sbet2; csig2 = comg2 = calp2 * cbet2; // Without normalization we have schi2 = somg2. cchi2 = _f1 * dn2 * comg2; Math::norm(ssig2, csig2); // Math::norm(somg2, comg2); -- don't need to normalize! // Math::norm(schi2, cchi2); -- don't need to normalize! // sig12 = sig2 - sig1, limit to [0, pi] sig12 = atan2(fmax(real(0), csig1 * ssig2 - ssig1 * csig2), csig1 * csig2 + ssig1 * ssig2); // omg12 = omg2 - omg1, limit to [0, pi] somg12 = fmax(real(0), comg1 * somg2 - somg1 * comg2); comg12 = comg1 * comg2 + somg1 * somg2; real k2 = Math::sq(calp0) * _ep2; E.Reset(-k2, -_ep2, 1 + k2, 1 + _ep2); // chi12 = chi2 - chi1, limit to [0, pi] real schi12 = fmax(real(0), cchi1 * somg2 - somg1 * cchi2), cchi12 = cchi1 * cchi2 + somg1 * somg2; // eta = chi12 - lam120 real eta = atan2(schi12 * clam120 - cchi12 * slam120, cchi12 * clam120 + schi12 * slam120); real deta12 = -_e2/_f1 * salp0 * E.H() / (Math::pi() / 2) * (sig12 + (E.deltaH(ssig2, csig2, dn2) - E.deltaH(ssig1, csig1, dn1))); lam12 = eta + deta12; // domg12 = deta12 + chi12 - omg12 domg12 = deta12 + atan2(schi12 * comg12 - cchi12 * somg12, cchi12 * comg12 + schi12 * somg12); if (diffp) { if (calp2 == 0) dlam12 = - 2 * _f1 * dn1 / sbet1; else { real dummy; Lengths(E, sig12, ssig1, csig1, dn1, ssig2, csig2, dn2, cbet1, cbet2, REDUCEDLENGTH, dummy, dlam12, dummy, dummy, dummy); dlam12 *= _f1 / (calp2 * cbet2); } } return lam12; } Math::real GeodesicExact::I4Integrand::asinhsqrt(real x) { // return asinh(sqrt(x))/sqrt(x) using std::sqrt; using std::asinh; using std::asin; return x == 0 ? 1 : (x > 0 ? asinh(sqrt(x))/sqrt(x) : asin(sqrt(-x))/sqrt(-x)); // NaNs end up here } Math::real GeodesicExact::I4Integrand::t(real x) { // This differs by from t as defined following Eq 61 in Karney (2013) by // the final subtraction of 1. This changes nothing since Eq 61 uses the // difference of two evaluations of t and improves the accuracy(?). using std::sqrt; // Group terms to minimize roundoff // with x = ep2, this is the same as // e2/(1-e2) + (atanh(e)/e - 1) return x + (sqrt(1 + x) * asinhsqrt(x) - 1); } Math::real GeodesicExact::I4Integrand::td(real x) { // d t(x) / dx using std::sqrt; return x == 0 ? 4/real(3) : // Group terms to minimize roundoff 1 + (1 - asinhsqrt(x) / sqrt(1+x)) / (2*x); } // Math::real GeodesicExact::I4Integrand::Dt(real x, real y) { // // ( t(x) - t(y) ) / (x - y) // using std::sqrt; using std::fabs; using std::asinh; using std::asin; // if (x == y) return td(x); // if (x * y <= 0) return ( t(x) - t(y) ) / (x - y); // real // sx = sqrt(fabs(x)), sx1 = sqrt(1 + x), // sy = sqrt(fabs(y)), sy1 = sqrt(1 + y), // z = (x - y) / (sx * sy1 + sy * sx1), // d1 = 2 * sx * sy, // d2 = 2 * (x * sy * sy1 + y * sx * sx1); // return x > 0 ? // ( 1 + (asinh(z)/z) / d1 - (asinh(sx) + asinh(sy)) / d2 ) : // // NaNs fall through to here // ( 1 - (asin (z)/z) / d1 - (asin (sx) + asin (sy)) / d2 ); // } Math::real GeodesicExact::I4Integrand::DtX(real y) const { // idiot version: // return ( tX - t(y) ) / (X - y); using std::sqrt; using std::fabs; using std::asinh; using std::asin; if (X == y) return tdX; if (X * y <= 0) return ( tX - t(y) ) / (X - y); real sy = sqrt(fabs(y)), sy1 = sqrt(1 + y), z = (X - y) / (sX * sy1 + sy * sX1), d1 = 2 * sX * sy, d2 = 2 * (X * sy * sy1 + y * sXX1); return X > 0 ? ( 1 + (asinh(z)/z) / d1 - (asinhsX + asinh(sy)) / d2 ) : // NaNs fall through to here ( 1 - (asin (z)/z) / d1 - (asinhsX + asin (sy)) / d2 ); } GeodesicExact::I4Integrand::I4Integrand(real ep2, real k2) : X( ep2 ) , tX( t(X) ) , tdX( td(X) ) , _k2( k2 ) { using std::fabs; using std::sqrt; using std::asinh; using std::asin; sX = sqrt(fabs(X)); // ep sX1 = sqrt(1 + X); // 1/(1-f) sXX1 = sX * sX1; asinhsX = X > 0 ? asinh(sX) : asin(sX); // atanh(e) } Math::real GeodesicExact::I4Integrand::operator()(real sig) const { using std::sin; real ssig = sin(sig); return - DtX(_k2 * Math::sq(ssig)) * ssig/2; } } // namespace GeographicLib geosphere/src/GravityCircle.h0000644000176200001440000002640314323400106015740 0ustar liggesusers/** * \file GravityCircle.hpp * \brief Header for GeographicLib::GravityCircle class * * Copyright (c) Charles Karney (2011-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #if !defined(GEOGRAPHICLIB_GRAVITYCIRCLE_HPP) #define GEOGRAPHICLIB_GRAVITYCIRCLE_HPP 1 #include #include "Constants.h" #include "CircularEngine.h" #include "GravityModel.h" namespace GeographicLib { /** * \brief Gravity on a circle of latitude * * Evaluate the earth's gravity field on a circle of constant height and * latitude. This uses a CircularEngine to pre-evaluate the inner sum of the * spherical harmonic sum, allowing the values of the field at several * different longitudes to be evaluated rapidly. * * Use GravityModel::Circle to create a GravityCircle object. (The * constructor for this class is private.) * * See \ref gravityparallel for an example of using GravityCircle (together * with OpenMP) to speed up the computation of geoid heights. * * Example of use: * \include example-GravityCircle.cpp * * Gravity is a command-line utility providing * access to the functionality of GravityModel and GravityCircle. **********************************************************************/ class GEOGRAPHICLIB_EXPORT GravityCircle { private: typedef Math::real real; enum mask { NONE = GravityModel::NONE, GRAVITY = GravityModel::GRAVITY, DISTURBANCE = GravityModel::DISTURBANCE, DISTURBING_POTENTIAL = GravityModel::DISTURBING_POTENTIAL, GEOID_HEIGHT = GravityModel::GEOID_HEIGHT, SPHERICAL_ANOMALY = GravityModel::SPHERICAL_ANOMALY, ALL = GravityModel::ALL, }; unsigned _caps; real _a, _f, _lat, _h, _zZ, _pPx, _invR, _cpsi, _spsi, _cphi, _sphi, _amodel, _gGMmodel, _dzonal0, _corrmult, _gamma0, _gamma, _frot; CircularEngine _gravitational, _disturbing, _correction; GravityCircle(mask caps, real a, real f, real lat, real h, real Z, real P, real cphi, real sphi, real amodel, real GMmodel, real dzonal0, real corrmult, real gamma0, real gamma, real frot, const CircularEngine& gravitational, const CircularEngine& disturbing, const CircularEngine& correction); friend class GravityModel; // GravityModel calls the private constructor Math::real W(real slam, real clam, real& gX, real& gY, real& gZ) const; Math::real V(real slam, real clam, real& gX, real& gY, real& gZ) const; Math::real InternalT(real slam, real clam, real& deltaX, real& deltaY, real& deltaZ, bool gradp, bool correct) const; public: /** * A default constructor for the normal gravity. This sets up an * uninitialized object which can be later replaced by the * GravityModel::Circle. **********************************************************************/ GravityCircle() : _a(-1) {} /** \name Compute the gravitational field **********************************************************************/ ///@{ /** * Evaluate the gravity. * * @param[in] lon the geographic longitude (degrees). * @param[out] gx the easterly component of the acceleration * (m s−2). * @param[out] gy the northerly component of the acceleration * (m s−2). * @param[out] gz the upward component of the acceleration * (m s−2); this is usually negative. * @return \e W the sum of the gravitational and centrifugal potentials * (m2 s−2). * * The function includes the effects of the earth's rotation. **********************************************************************/ Math::real Gravity(real lon, real& gx, real& gy, real& gz) const; /** * Evaluate the gravity disturbance vector. * * @param[in] lon the geographic longitude (degrees). * @param[out] deltax the easterly component of the disturbance vector * (m s−2). * @param[out] deltay the northerly component of the disturbance vector * (m s−2). * @param[out] deltaz the upward component of the disturbance vector * (m s−2). * @return \e T the corresponding disturbing potential * (m2 s−2). **********************************************************************/ Math::real Disturbance(real lon, real& deltax, real& deltay, real& deltaz) const; /** * Evaluate the geoid height. * * @param[in] lon the geographic longitude (degrees). * @return \e N the height of the geoid above the reference ellipsoid * (meters). * * Some approximations are made in computing the geoid height so that the * results of the NGA codes are reproduced accurately. Details are given * in \ref gravitygeoid. **********************************************************************/ Math::real GeoidHeight(real lon) const; /** * Evaluate the components of the gravity anomaly vector using the * spherical approximation. * * @param[in] lon the geographic longitude (degrees). * @param[out] Dg01 the gravity anomaly (m s−2). * @param[out] xi the northerly component of the deflection of the vertical * (degrees). * @param[out] eta the easterly component of the deflection of the vertical * (degrees). * * The spherical approximation (see Heiskanen and Moritz, Sec 2-14) is used * so that the results of the NGA codes are reproduced accurately. * approximations used here. Details are given in \ref gravitygeoid. **********************************************************************/ void SphericalAnomaly(real lon, real& Dg01, real& xi, real& eta) const; /** * Evaluate the components of the acceleration due to gravity and the * centrifugal acceleration in geocentric coordinates. * * @param[in] lon the geographic longitude (degrees). * @param[out] gX the \e X component of the acceleration * (m s−2). * @param[out] gY the \e Y component of the acceleration * (m s−2). * @param[out] gZ the \e Z component of the acceleration * (m s−2). * @return \e W = \e V + Φ the sum of the gravitational and * centrifugal potentials (m2 s−2). **********************************************************************/ Math::real W(real lon, real& gX, real& gY, real& gZ) const { real slam, clam; Math::sincosd(lon, slam, clam); return W(slam, clam, gX, gY, gZ); } /** * Evaluate the components of the acceleration due to gravity in geocentric * coordinates. * * @param[in] lon the geographic longitude (degrees). * @param[out] GX the \e X component of the acceleration * (m s−2). * @param[out] GY the \e Y component of the acceleration * (m s−2). * @param[out] GZ the \e Z component of the acceleration * (m s−2). * @return \e V = \e W - Φ the gravitational potential * (m2 s−2). **********************************************************************/ Math::real V(real lon, real& GX, real& GY, real& GZ) const { real slam, clam; Math::sincosd(lon, slam, clam); return V(slam, clam, GX, GY, GZ); } /** * Evaluate the components of the gravity disturbance in geocentric * coordinates. * * @param[in] lon the geographic longitude (degrees). * @param[out] deltaX the \e X component of the gravity disturbance * (m s−2). * @param[out] deltaY the \e Y component of the gravity disturbance * (m s−2). * @param[out] deltaZ the \e Z component of the gravity disturbance * (m s−2). * @return \e T = \e W - \e U the disturbing potential (also called the * anomalous potential) (m2 s−2). **********************************************************************/ Math::real T(real lon, real& deltaX, real& deltaY, real& deltaZ) const { real slam, clam; Math::sincosd(lon, slam, clam); return InternalT(slam, clam, deltaX, deltaY, deltaZ, true, true); } /** * Evaluate disturbing potential in geocentric coordinates. * * @param[in] lon the geographic longitude (degrees). * @return \e T = \e W - \e U the disturbing potential (also called the * anomalous potential) (m2 s−2). **********************************************************************/ Math::real T(real lon) const { real slam, clam, dummy; Math::sincosd(lon, slam, clam); return InternalT(slam, clam, dummy, dummy, dummy, false, true); } ///@} /** \name Inspector functions **********************************************************************/ ///@{ /** * @return true if the object has been initialized. **********************************************************************/ bool Init() const { return _a > 0; } /** * @return \e a the equatorial radius of the ellipsoid (meters). This is * the value inherited from the GravityModel object used in the * constructor. **********************************************************************/ Math::real EquatorialRadius() const { return Init() ? _a : Math::NaN(); } /** * @return \e f the flattening of the ellipsoid. This is the value * inherited from the GravityModel object used in the constructor. **********************************************************************/ Math::real Flattening() const { return Init() ? _f : Math::NaN(); } /** * @return the latitude of the circle (degrees). **********************************************************************/ Math::real Latitude() const { return Init() ? _lat : Math::NaN(); } /** * @return the height of the circle (meters). **********************************************************************/ Math::real Height() const { return Init() ? _h : Math::NaN(); } /** * @return \e caps the computational capabilities that this object was * constructed with. **********************************************************************/ unsigned Capabilities() const { return _caps; } /** * @param[in] testcaps a set of bitor'ed GravityModel::mask values. * @return true if the GravityCircle object has all these capabilities. **********************************************************************/ bool Capabilities(unsigned testcaps) const { return (_caps & testcaps) == testcaps; } ///@} }; } // namespace GeographicLib #endif // GEOGRAPHICLIB_GRAVITYCIRCLE_HPP geosphere/src/TransverseMercator.cpp0000644000176200001440000005450714323401055017367 0ustar liggesusers/** * \file TransverseMercator.cpp * \brief Implementation for GeographicLib::TransverseMercator class * * Copyright (c) Charles Karney (2008-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ * * This implementation follows closely JHS 154, ETRS89 - * järjestelmään liittyvät karttaprojektiot, * tasokoordinaatistot ja karttalehtijako (Map projections, plane * coordinates, and map sheet index for ETRS89), published by JUHTA, Finnish * Geodetic Institute, and the National Land Survey of Finland (2006). * * The relevant section is available as the 2008 PDF file * http://docs.jhs-suositukset.fi/jhs-suositukset/JHS154/JHS154_liite1.pdf * * This is a straight transcription of the formulas in this paper with the * following exceptions: * - use of 6th order series instead of 4th order series. This reduces the * error to about 5nm for the UTM range of coordinates (instead of 200nm), * with a speed penalty of only 1%; * - use Newton's method instead of plain iteration to solve for latitude in * terms of isometric latitude in the Reverse method; * - use of Horner's representation for evaluating polynomials and Clenshaw's * method for summing trigonometric series; * - several modifications of the formulas to improve the numerical accuracy; * - evaluating the convergence and scale using the expression for the * projection or its inverse. * * If the preprocessor variable GEOGRAPHICLIB_TRANSVERSEMERCATOR_ORDER is set * to an integer between 4 and 8, then this specifies the order of the series * used for the forward and reverse transformations. The default value is 6. * (The series accurate to 12th order is given in \ref tmseries.) **********************************************************************/ #include #include "TransverseMercator.h" #if defined(_MSC_VER) // Squelch warnings about enum-float expressions # pragma warning (disable: 5055) #endif namespace GeographicLib { using namespace std; TransverseMercator::TransverseMercator(real a, real f, real k0) : _a(a) , _f(f) , _k0(k0) , _e2(_f * (2 - _f)) , _es((_f < 0 ? -1 : 1) * sqrt(fabs(_e2))) , _e2m(1 - _e2) // _c = sqrt( pow(1 + _e, 1 + _e) * pow(1 - _e, 1 - _e) ) ) // See, for example, Lee (1976), p 100. , _c( sqrt(_e2m) * exp(Math::eatanhe(real(1), _es)) ) , _n(_f / (2 - _f)) { if (!(isfinite(_a) && _a > 0)) throw GeographicErr("Equatorial radius is not positive"); if (!(isfinite(_f) && _f < 1)) throw GeographicErr("Polar semi-axis is not positive"); if (!(isfinite(_k0) && _k0 > 0)) throw GeographicErr("Scale is not positive"); // Generated by Maxima on 2015-05-14 22:55:13-04:00 #if GEOGRAPHICLIB_TRANSVERSEMERCATOR_ORDER/2 == 2 static const real b1coeff[] = { // b1*(n+1), polynomial in n2 of order 2 1, 16, 64, 64, }; // count = 4 #elif GEOGRAPHICLIB_TRANSVERSEMERCATOR_ORDER/2 == 3 static const real b1coeff[] = { // b1*(n+1), polynomial in n2 of order 3 1, 4, 64, 256, 256, }; // count = 5 #elif GEOGRAPHICLIB_TRANSVERSEMERCATOR_ORDER/2 == 4 static const real b1coeff[] = { // b1*(n+1), polynomial in n2 of order 4 25, 64, 256, 4096, 16384, 16384, }; // count = 6 #else #error "Bad value for GEOGRAPHICLIB_TRANSVERSEMERCATOR_ORDER" #endif #if GEOGRAPHICLIB_TRANSVERSEMERCATOR_ORDER == 4 static const real alpcoeff[] = { // alp[1]/n^1, polynomial in n of order 3 164, 225, -480, 360, 720, // alp[2]/n^2, polynomial in n of order 2 557, -864, 390, 1440, // alp[3]/n^3, polynomial in n of order 1 -1236, 427, 1680, // alp[4]/n^4, polynomial in n of order 0 49561, 161280, }; // count = 14 #elif GEOGRAPHICLIB_TRANSVERSEMERCATOR_ORDER == 5 static const real alpcoeff[] = { // alp[1]/n^1, polynomial in n of order 4 -635, 328, 450, -960, 720, 1440, // alp[2]/n^2, polynomial in n of order 3 4496, 3899, -6048, 2730, 10080, // alp[3]/n^3, polynomial in n of order 2 15061, -19776, 6832, 26880, // alp[4]/n^4, polynomial in n of order 1 -171840, 49561, 161280, // alp[5]/n^5, polynomial in n of order 0 34729, 80640, }; // count = 20 #elif GEOGRAPHICLIB_TRANSVERSEMERCATOR_ORDER == 6 static const real alpcoeff[] = { // alp[1]/n^1, polynomial in n of order 5 31564, -66675, 34440, 47250, -100800, 75600, 151200, // alp[2]/n^2, polynomial in n of order 4 -1983433, 863232, 748608, -1161216, 524160, 1935360, // alp[3]/n^3, polynomial in n of order 3 670412, 406647, -533952, 184464, 725760, // alp[4]/n^4, polynomial in n of order 2 6601661, -7732800, 2230245, 7257600, // alp[5]/n^5, polynomial in n of order 1 -13675556, 3438171, 7983360, // alp[6]/n^6, polynomial in n of order 0 212378941, 319334400, }; // count = 27 #elif GEOGRAPHICLIB_TRANSVERSEMERCATOR_ORDER == 7 static const real alpcoeff[] = { // alp[1]/n^1, polynomial in n of order 6 1804025, 2020096, -4267200, 2204160, 3024000, -6451200, 4838400, 9676800, // alp[2]/n^2, polynomial in n of order 5 4626384, -9917165, 4316160, 3743040, -5806080, 2620800, 9676800, // alp[3]/n^3, polynomial in n of order 4 -67102379, 26816480, 16265880, -21358080, 7378560, 29030400, // alp[4]/n^4, polynomial in n of order 3 155912000, 72618271, -85060800, 24532695, 79833600, // alp[5]/n^5, polynomial in n of order 2 102508609, -109404448, 27505368, 63866880, // alp[6]/n^6, polynomial in n of order 1 -12282192400LL, 2760926233LL, 4151347200LL, // alp[7]/n^7, polynomial in n of order 0 1522256789, 1383782400, }; // count = 35 #elif GEOGRAPHICLIB_TRANSVERSEMERCATOR_ORDER == 8 static const real alpcoeff[] = { // alp[1]/n^1, polynomial in n of order 7 -75900428, 37884525, 42422016, -89611200, 46287360, 63504000, -135475200, 101606400, 203212800, // alp[2]/n^2, polynomial in n of order 6 148003883, 83274912, -178508970, 77690880, 67374720, -104509440, 47174400, 174182400, // alp[3]/n^3, polynomial in n of order 5 318729724, -738126169, 294981280, 178924680, -234938880, 81164160, 319334400, // alp[4]/n^4, polynomial in n of order 4 -40176129013LL, 14967552000LL, 6971354016LL, -8165836800LL, 2355138720LL, 7664025600LL, // alp[5]/n^5, polynomial in n of order 3 10421654396LL, 3997835751LL, -4266773472LL, 1072709352, 2490808320LL, // alp[6]/n^6, polynomial in n of order 2 175214326799LL, -171950693600LL, 38652967262LL, 58118860800LL, // alp[7]/n^7, polynomial in n of order 1 -67039739596LL, 13700311101LL, 12454041600LL, // alp[8]/n^8, polynomial in n of order 0 1424729850961LL, 743921418240LL, }; // count = 44 #else #error "Bad value for GEOGRAPHICLIB_TRANSVERSEMERCATOR_ORDER" #endif #if GEOGRAPHICLIB_TRANSVERSEMERCATOR_ORDER == 4 static const real betcoeff[] = { // bet[1]/n^1, polynomial in n of order 3 -4, 555, -960, 720, 1440, // bet[2]/n^2, polynomial in n of order 2 -437, 96, 30, 1440, // bet[3]/n^3, polynomial in n of order 1 -148, 119, 3360, // bet[4]/n^4, polynomial in n of order 0 4397, 161280, }; // count = 14 #elif GEOGRAPHICLIB_TRANSVERSEMERCATOR_ORDER == 5 static const real betcoeff[] = { // bet[1]/n^1, polynomial in n of order 4 -3645, -64, 8880, -15360, 11520, 23040, // bet[2]/n^2, polynomial in n of order 3 4416, -3059, 672, 210, 10080, // bet[3]/n^3, polynomial in n of order 2 -627, -592, 476, 13440, // bet[4]/n^4, polynomial in n of order 1 -3520, 4397, 161280, // bet[5]/n^5, polynomial in n of order 0 4583, 161280, }; // count = 20 #elif GEOGRAPHICLIB_TRANSVERSEMERCATOR_ORDER == 6 static const real betcoeff[] = { // bet[1]/n^1, polynomial in n of order 5 384796, -382725, -6720, 932400, -1612800, 1209600, 2419200, // bet[2]/n^2, polynomial in n of order 4 -1118711, 1695744, -1174656, 258048, 80640, 3870720, // bet[3]/n^3, polynomial in n of order 3 22276, -16929, -15984, 12852, 362880, // bet[4]/n^4, polynomial in n of order 2 -830251, -158400, 197865, 7257600, // bet[5]/n^5, polynomial in n of order 1 -435388, 453717, 15966720, // bet[6]/n^6, polynomial in n of order 0 20648693, 638668800, }; // count = 27 #elif GEOGRAPHICLIB_TRANSVERSEMERCATOR_ORDER == 7 static const real betcoeff[] = { // bet[1]/n^1, polynomial in n of order 6 -5406467, 6156736, -6123600, -107520, 14918400, -25804800, 19353600, 38707200, // bet[2]/n^2, polynomial in n of order 5 829456, -5593555, 8478720, -5873280, 1290240, 403200, 19353600, // bet[3]/n^3, polynomial in n of order 4 9261899, 3564160, -2708640, -2557440, 2056320, 58060800, // bet[4]/n^4, polynomial in n of order 3 14928352, -9132761, -1742400, 2176515, 79833600, // bet[5]/n^5, polynomial in n of order 2 -8005831, -1741552, 1814868, 63866880, // bet[6]/n^6, polynomial in n of order 1 -261810608, 268433009, 8302694400LL, // bet[7]/n^7, polynomial in n of order 0 219941297, 5535129600LL, }; // count = 35 #elif GEOGRAPHICLIB_TRANSVERSEMERCATOR_ORDER == 8 static const real betcoeff[] = { // bet[1]/n^1, polynomial in n of order 7 31777436, -37845269, 43097152, -42865200, -752640, 104428800, -180633600, 135475200, 270950400, // bet[2]/n^2, polynomial in n of order 6 24749483, 14930208, -100683990, 152616960, -105719040, 23224320, 7257600, 348364800, // bet[3]/n^3, polynomial in n of order 5 -232468668, 101880889, 39205760, -29795040, -28131840, 22619520, 638668800, // bet[4]/n^4, polynomial in n of order 4 324154477, 1433121792, -876745056, -167270400, 208945440, 7664025600LL, // bet[5]/n^5, polynomial in n of order 3 457888660, -312227409, -67920528, 70779852, 2490808320LL, // bet[6]/n^6, polynomial in n of order 2 -19841813847LL, -3665348512LL, 3758062126LL, 116237721600LL, // bet[7]/n^7, polynomial in n of order 1 -1989295244, 1979471673, 49816166400LL, // bet[8]/n^8, polynomial in n of order 0 191773887257LL, 3719607091200LL, }; // count = 44 #else #error "Bad value for GEOGRAPHICLIB_TRANSVERSEMERCATOR_ORDER" #endif static_assert(sizeof(b1coeff) / sizeof(real) == maxpow_/2 + 2, "Coefficient array size mismatch for b1"); static_assert(sizeof(alpcoeff) / sizeof(real) == (maxpow_ * (maxpow_ + 3))/2, "Coefficient array size mismatch for alp"); static_assert(sizeof(betcoeff) / sizeof(real) == (maxpow_ * (maxpow_ + 3))/2, "Coefficient array size mismatch for bet"); int m = maxpow_/2; _b1 = Math::polyval(m, b1coeff, Math::sq(_n)) / (b1coeff[m + 1] * (1+_n)); // _a1 is the equivalent radius for computing the circumference of // ellipse. _a1 = _b1 * _a; int o = 0; real d = _n; for (int l = 1; l <= maxpow_; ++l) { m = maxpow_ - l; _alp[l] = d * Math::polyval(m, alpcoeff + o, _n) / alpcoeff[o + m + 1]; _bet[l] = d * Math::polyval(m, betcoeff + o, _n) / betcoeff[o + m + 1]; o += m + 2; d *= _n; } // Post condition: o == sizeof(alpcoeff) / sizeof(real) && // o == sizeof(betcoeff) / sizeof(real) } const TransverseMercator& TransverseMercator::UTM() { static const TransverseMercator utm(Constants::WGS84_a(), Constants::WGS84_f(), Constants::UTM_k0()); return utm; } // Engsager and Poder (2007) use trigonometric series to convert between phi // and phip. Here are the series... // // Conversion from phi to phip: // // phip = phi + sum(c[j] * sin(2*j*phi), j, 1, 6) // // c[1] = - 2 * n // + 2/3 * n^2 // + 4/3 * n^3 // - 82/45 * n^4 // + 32/45 * n^5 // + 4642/4725 * n^6; // c[2] = 5/3 * n^2 // - 16/15 * n^3 // - 13/9 * n^4 // + 904/315 * n^5 // - 1522/945 * n^6; // c[3] = - 26/15 * n^3 // + 34/21 * n^4 // + 8/5 * n^5 // - 12686/2835 * n^6; // c[4] = 1237/630 * n^4 // - 12/5 * n^5 // - 24832/14175 * n^6; // c[5] = - 734/315 * n^5 // + 109598/31185 * n^6; // c[6] = 444337/155925 * n^6; // // Conversion from phip to phi: // // phi = phip + sum(d[j] * sin(2*j*phip), j, 1, 6) // // d[1] = 2 * n // - 2/3 * n^2 // - 2 * n^3 // + 116/45 * n^4 // + 26/45 * n^5 // - 2854/675 * n^6; // d[2] = 7/3 * n^2 // - 8/5 * n^3 // - 227/45 * n^4 // + 2704/315 * n^5 // + 2323/945 * n^6; // d[3] = 56/15 * n^3 // - 136/35 * n^4 // - 1262/105 * n^5 // + 73814/2835 * n^6; // d[4] = 4279/630 * n^4 // - 332/35 * n^5 // - 399572/14175 * n^6; // d[5] = 4174/315 * n^5 // - 144838/6237 * n^6; // d[6] = 601676/22275 * n^6; // // In order to maintain sufficient relative accuracy close to the pole use // // S = sum(c[i]*sin(2*i*phi),i,1,6) // taup = (tau + tan(S)) / (1 - tau * tan(S)) // In Math::taupf and Math::tauf we evaluate the forward transform explicitly // and solve the reverse one by Newton's method. // // There are adapted from TransverseMercatorExact (taup and taupinv). tau = // tan(phi), taup = sinh(psi) void TransverseMercator::Forward(real lon0, real lat, real lon, real& x, real& y, real& gamma, real& k) const { lat = Math::LatFix(lat); lon = Math::AngDiff(lon0, lon); // Explicitly enforce the parity int latsign = signbit(lat) ? -1 : 1, lonsign = signbit(lon) ? -1 : 1; lon *= lonsign; lat *= latsign; bool backside = lon > Math::qd; if (backside) { if (lat == 0) latsign = -1; lon = Math::hd - lon; } real sphi, cphi, slam, clam; Math::sincosd(lat, sphi, cphi); Math::sincosd(lon, slam, clam); // phi = latitude // phi' = conformal latitude // psi = isometric latitude // tau = tan(phi) // tau' = tan(phi') // [xi', eta'] = Gauss-Schreiber TM coordinates // [xi, eta] = Gauss-Krueger TM coordinates // // We use // tan(phi') = sinh(psi) // sin(phi') = tanh(psi) // cos(phi') = sech(psi) // denom^2 = 1-cos(phi')^2*sin(lam)^2 = 1-sech(psi)^2*sin(lam)^2 // sin(xip) = sin(phi')/denom = tanh(psi)/denom // cos(xip) = cos(phi')*cos(lam)/denom = sech(psi)*cos(lam)/denom // cosh(etap) = 1/denom = 1/denom // sinh(etap) = cos(phi')*sin(lam)/denom = sech(psi)*sin(lam)/denom real etap, xip; if (lat != Math::qd) { real tau = sphi / cphi, taup = Math::taupf(tau, _es); xip = atan2(taup, clam); // Used to be // etap = Math::atanh(sin(lam) / cosh(psi)); etap = asinh(slam / hypot(taup, clam)); // convergence and scale for Gauss-Schreiber TM (xip, etap) -- gamma0 = // atan(tan(xip) * tanh(etap)) = atan(tan(lam) * sin(phi')); // sin(phi') = tau'/sqrt(1 + tau'^2) // Krueger p 22 (44) gamma = Math::atan2d(slam * taup, clam * hypot(real(1), taup)); // k0 = sqrt(1 - _e2 * sin(phi)^2) * (cos(phi') / cos(phi)) * cosh(etap) // Note 1/cos(phi) = cosh(psip); // and cos(phi') * cosh(etap) = 1/hypot(sinh(psi), cos(lam)) // // This form has cancelling errors. This property is lost if cosh(psip) // is replaced by 1/cos(phi), even though it's using "primary" data (phi // instead of psip). k = sqrt(_e2m + _e2 * Math::sq(cphi)) * hypot(real(1), tau) / hypot(taup, clam); } else { xip = Math::pi()/2; etap = 0; gamma = lon; k = _c; } // {xi',eta'} is {northing,easting} for Gauss-Schreiber transverse Mercator // (for eta' = 0, xi' = bet). {xi,eta} is {northing,easting} for transverse // Mercator with constant scale on the central meridian (for eta = 0, xip = // rectifying latitude). Define // // zeta = xi + i*eta // zeta' = xi' + i*eta' // // The conversion from conformal to rectifying latitude can be expressed as // a series in _n: // // zeta = zeta' + sum(h[j-1]' * sin(2 * j * zeta'), j = 1..maxpow_) // // where h[j]' = O(_n^j). The reversion of this series gives // // zeta' = zeta - sum(h[j-1] * sin(2 * j * zeta), j = 1..maxpow_) // // which is used in Reverse. // // Evaluate sums via Clenshaw method. See // https://en.wikipedia.org/wiki/Clenshaw_algorithm // // Let // // S = sum(a[k] * phi[k](x), k = 0..n) // phi[k+1](x) = alpha[k](x) * phi[k](x) + beta[k](x) * phi[k-1](x) // // Evaluate S with // // b[n+2] = b[n+1] = 0 // b[k] = alpha[k](x) * b[k+1] + beta[k+1](x) * b[k+2] + a[k] // S = (a[0] + beta[1](x) * b[2]) * phi[0](x) + b[1] * phi[1](x) // // Here we have // // x = 2 * zeta' // phi[k](x) = sin(k * x) // alpha[k](x) = 2 * cos(x) // beta[k](x) = -1 // [ sin(A+B) - 2*cos(B)*sin(A) + sin(A-B) = 0, A = k*x, B = x ] // n = maxpow_ // a[k] = _alp[k] // S = b[1] * sin(x) // // For the derivative we have // // x = 2 * zeta' // phi[k](x) = cos(k * x) // alpha[k](x) = 2 * cos(x) // beta[k](x) = -1 // [ cos(A+B) - 2*cos(B)*cos(A) + cos(A-B) = 0, A = k*x, B = x ] // a[0] = 1; a[k] = 2*k*_alp[k] // S = (a[0] - b[2]) + b[1] * cos(x) // // Matrix formulation (not used here): // phi[k](x) = [sin(k * x); k * cos(k * x)] // alpha[k](x) = 2 * [cos(x), 0; -sin(x), cos(x)] // beta[k](x) = -1 * [1, 0; 0, 1] // a[k] = _alp[k] * [1, 0; 0, 1] // b[n+2] = b[n+1] = [0, 0; 0, 0] // b[k] = alpha[k](x) * b[k+1] + beta[k+1](x) * b[k+2] + a[k] // N.B., for all k: b[k](1,2) = 0; b[k](1,1) = b[k](2,2) // S = (a[0] + beta[1](x) * b[2]) * phi[0](x) + b[1] * phi[1](x) // phi[0](x) = [0; 0] // phi[1](x) = [sin(x); cos(x)] real c0 = cos(2 * xip), ch0 = cosh(2 * etap), s0 = sin(2 * xip), sh0 = sinh(2 * etap); complex a(2 * c0 * ch0, -2 * s0 * sh0); // 2 * cos(2*zeta') int n = maxpow_; complex y0(n & 1 ? _alp[n] : 0), y1, // default initializer is 0+i0 z0(n & 1 ? 2*n * _alp[n] : 0), z1; if (n & 1) --n; while (n) { y1 = a * y0 - y1 + _alp[n]; z1 = a * z0 - z1 + 2*n * _alp[n]; --n; y0 = a * y1 - y0 + _alp[n]; z0 = a * z1 - z0 + 2*n * _alp[n]; --n; } a /= real(2); // cos(2*zeta') z1 = real(1) - z1 + a * z0; a = complex(s0 * ch0, c0 * sh0); // sin(2*zeta') y1 = complex(xip, etap) + a * y0; // Fold in change in convergence and scale for Gauss-Schreiber TM to // Gauss-Krueger TM. gamma -= Math::atan2d(z1.imag(), z1.real()); k *= _b1 * abs(z1); real xi = y1.real(), eta = y1.imag(); y = _a1 * _k0 * (backside ? Math::pi() - xi : xi) * latsign; x = _a1 * _k0 * eta * lonsign; if (backside) gamma = Math::hd - gamma; gamma *= latsign * lonsign; gamma = Math::AngNormalize(gamma); k *= _k0; } void TransverseMercator::Reverse(real lon0, real x, real y, real& lat, real& lon, real& gamma, real& k) const { // This undoes the steps in Forward. The wrinkles are: (1) Use of the // reverted series to express zeta' in terms of zeta. (2) Newton's method // to solve for phi in terms of tan(phi). real xi = y / (_a1 * _k0), eta = x / (_a1 * _k0); // Explicitly enforce the parity int xisign = signbit(xi) ? -1 : 1, etasign = signbit(eta) ? -1 : 1; xi *= xisign; eta *= etasign; bool backside = xi > Math::pi()/2; if (backside) xi = Math::pi() - xi; real c0 = cos(2 * xi), ch0 = cosh(2 * eta), s0 = sin(2 * xi), sh0 = sinh(2 * eta); complex a(2 * c0 * ch0, -2 * s0 * sh0); // 2 * cos(2*zeta) int n = maxpow_; complex y0(n & 1 ? -_bet[n] : 0), y1, // default initializer is 0+i0 z0(n & 1 ? -2*n * _bet[n] : 0), z1; if (n & 1) --n; while (n) { y1 = a * y0 - y1 - _bet[n]; z1 = a * z0 - z1 - 2*n * _bet[n]; --n; y0 = a * y1 - y0 - _bet[n]; z0 = a * z1 - z0 - 2*n * _bet[n]; --n; } a /= real(2); // cos(2*zeta) z1 = real(1) - z1 + a * z0; a = complex(s0 * ch0, c0 * sh0); // sin(2*zeta) y1 = complex(xi, eta) + a * y0; // Convergence and scale for Gauss-Schreiber TM to Gauss-Krueger TM. gamma = Math::atan2d(z1.imag(), z1.real()); k = _b1 / abs(z1); // JHS 154 has // // phi' = asin(sin(xi') / cosh(eta')) (Krueger p 17 (25)) // lam = asin(tanh(eta') / cos(phi') // psi = asinh(tan(phi')) real xip = y1.real(), etap = y1.imag(), s = sinh(etap), c = fmax(real(0), cos(xip)), // cos(pi/2) might be negative r = hypot(s, c); if (r != 0) { lon = Math::atan2d(s, c); // Krueger p 17 (25) // Use Newton's method to solve for tau real sxip = sin(xip), tau = Math::tauf(sxip/r, _es); gamma += Math::atan2d(sxip * tanh(etap), c); // Krueger p 19 (31) lat = Math::atand(tau); // Note cos(phi') * cosh(eta') = r k *= sqrt(_e2m + _e2 / (1 + Math::sq(tau))) * hypot(real(1), tau) * r; } else { lat = Math::qd; lon = 0; k *= _c; } lat *= xisign; if (backside) lon = Math::hd - lon; lon *= etasign; lon = Math::AngNormalize(lon + lon0); if (backside) gamma = Math::hd - gamma; gamma *= xisign * etasign; gamma = Math::AngNormalize(gamma); k *= _k0; } } // namespace GeographicLib geosphere/src/a_geodesic.cpp0000644000176200001440000001050014677357014015622 0ustar liggesusers #include "Rcpp.h" //#include "geodesic.h" #include #include "Geodesic.h" #include "PolygonArea.h" //#include "Constants.hpp" #include "GeodesicLine.h" //using namespace GeographicLib; /* Robert Hijmans May 2015 December 2021 */ //SEXP _geodesic(SEXP longitude, SEXP latitude, SEXP azimuth, SEXP distance, SEXP pa, SEXP pf) { /* //[[Rcpp::export(name = ".geodesic")]] std::vector geodesic(std::vector lon1, std::vector lat1, std::vector azi1, std::vector s12, double a, double f) { struct geod_geodesic g; geod_init(&g, a, f); size_t n = lat1.size(); std::vector r(n * 3); for (size_t i=0; i < n; i++) { size_t j = i * 3; geod_direct(&g, lat1[i], lon1[i], azi1[i], s12[i], &r[j], &r[j+1], &r[j+2]); } return r; } */ //[[Rcpp::export(name = ".geodesic")]] std::vector geodesic(std::vector lon1, std::vector lat1, std::vector azi1, std::vector s12, double a, double f) { GeographicLib::Geodesic geod(a, f); size_t n = lat1.size(); std::vector r(n * 3); for (size_t i=0; i < n; i++) { size_t j = i * 3; geod.Direct(lat1[i], lon1[i], azi1[i], s12[i], r[j+1], r[j], r[j+2]); } return r; } //SEXP _inversegeodesic(SEXP longitude1, SEXP latitude1, SEXP longitude2, SEXP latitude2, SEXP pa, SEXP pf) { /* //[[Rcpp::export(name = ".inversegeodesic")]] std::vector inversegeodesic(std::vector lon1, std::vector lat1, std::vector lon2, std::vector lat2, double a, double f) { struct geod_geodesic g; geod_init(&g, a, f); size_t n = lat1.size(); std::vector r(n * 3); for (size_t i=0; i < n; i++) { size_t j = i * 3; geod_inverse(&g, lat1[i], lon1[i], lat2[i], lon2[i], &r[j], &r[j+1], &r[j+2]); } return r; } */ //[[Rcpp::export(name = ".inversegeodesic")]] std::vector inversegeodesic(std::vector lon1, std::vector lat1, std::vector lon2, std::vector lat2, double a, double f) { GeographicLib::Geodesic geod(a, f); size_t n = lat1.size(); std::vector r(n * 3); for (size_t i=0; i < n; i++) { size_t j = i * 3; geod.Inverse(lat1[i], lon1[i], lat2[i], lon2[i], r[j], r[j+1], r[j+2]); } return r; } //SEXP _polygonarea(SEXP longitude, SEXP latitude, SEXP pa, SEXP pf) { /* //[[Rcpp::export(name = ".polygonarea")]] std::vector polygonarea(std::vector lon, std::vector lat, double a, double f) { struct geod_geodesic g; struct geod_polygon p; geod_init(&g, a, f); geod_polygon_init(&p, 0); double A, P; for (size_t i=0; i r = {n, P, A}; return(r); } */ //[[Rcpp::export(name = ".polygonarea")]] std::vector polygonarea(std::vector lon, std::vector lat, double a, double f) { std::vector out(3); // n, perimeter, area; GeographicLib::Geodesic geod(a, f); GeographicLib::PolygonArea poly(geod); try { for (size_t i=0; i> geodesic_nodes(double lon1, double lat1, double lon2, double lat2, size_t n, double distance, bool arc, double a, double f) { GeographicLib::Geodesic geod(a, f); GeographicLib::GeodesicLine line = geod.InverseLine(lat1, lon1, lat2, lon2); // number of intervals if (n == 0) { if (distance <= 0) { n = 1; } else { n = int(ceil(line.Distance() / std::abs(distance))); } } std::vector> out(2); out[0].reserve(n+1); out[1].reserve(n+1); out[0].push_back(lon1); out[1].push_back(lat1); if (arc) { // intervals of equal arc length double da = line.Arc() / n; for (size_t i=1; i and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #if !defined(GEOGRAPHICLIB_RHUMB_HPP) #define GEOGRAPHICLIB_RHUMB_HPP 1 #include "Constants.h" #include "Ellipsoid.h" #if !defined(GEOGRAPHICLIB_RHUMBAREA_ORDER) /** * The order of the series approximation used in rhumb area calculations. * GEOGRAPHICLIB_RHUMBAREA_ORDER can be set to any integer in [4, 8]. **********************************************************************/ # define GEOGRAPHICLIB_RHUMBAREA_ORDER \ (GEOGRAPHICLIB_PRECISION == 2 ? 6 : \ (GEOGRAPHICLIB_PRECISION == 1 ? 4 : 8)) #endif namespace GeographicLib { class RhumbLine; template class PolygonAreaT; /** * \brief Solve of the direct and inverse rhumb problems. * * The path of constant azimuth between two points on an ellipsoid at (\e * lat1, \e lon1) and (\e lat2, \e lon2) is called the rhumb line (also * called the loxodrome). Its length is \e s12 and its azimuth is \e azi12. * (The azimuth is the heading measured clockwise from north.) * * Given \e lat1, \e lon1, \e azi12, and \e s12, we can determine \e lat2, * and \e lon2. This is the \e direct rhumb problem and its solution is * given by the function Rhumb::Direct. * * Given \e lat1, \e lon1, \e lat2, and \e lon2, we can determine \e azi12 * and \e s12. This is the \e inverse rhumb problem, whose solution is given * by Rhumb::Inverse. This finds the shortest such rhumb line, i.e., the one * that wraps no more than half way around the earth. If the end points are * on opposite meridians, there are two shortest rhumb lines and the * east-going one is chosen. * * These routines also optionally calculate the area under the rhumb line, \e * S12. This is the area, measured counter-clockwise, of the rhumb line * quadrilateral with corners (lat1,lon1), (0,lon1), * (0,lon2), and (lat2,lon2). * * Note that rhumb lines may be appreciably longer (up to 50%) than the * corresponding Geodesic. For example the distance between London Heathrow * and Tokyo Narita via the rhumb line is 11400 km which is 18% longer than * the geodesic distance 9600 km. * * For more information on rhumb lines see \ref rhumb. * * Example of use: * \include example-Rhumb.cpp **********************************************************************/ class GEOGRAPHICLIB_EXPORT Rhumb { private: typedef Math::real real; friend class RhumbLine; template friend class PolygonAreaT; Ellipsoid _ell; bool _exact; real _c2; static const int tm_maxord = GEOGRAPHICLIB_TRANSVERSEMERCATOR_ORDER; static const int maxpow_ = GEOGRAPHICLIB_RHUMBAREA_ORDER; // _rR[0] unused real _rR[maxpow_ + 1]; static real gd(real x) { using std::atan; using std::sinh; return atan(sinh(x)); } // Use divided differences to determine (mu2 - mu1) / (psi2 - psi1) // accurately // // Definition: Df(x,y,d) = (f(x) - f(y)) / (x - y) // See: // W. M. Kahan and R. J. Fateman, // Symbolic computation of divided differences, // SIGSAM Bull. 33(2), 7-28 (1999) // https://doi.org/10.1145/334714.334716 // http://www.cs.berkeley.edu/~fateman/papers/divdiff.pdf static real Dlog(real x, real y) { using std::sqrt; using std::asinh; real t = x - y; // Change // // atanh(t / (x + y)) // // to // // asinh(t / (2 * sqrt(x*y))) // // to avoid taking atanh(1) when x is large and y is 1. N.B., this // routine is invoked with positive x and y, so no need to guard against // taking the sqrt of a negative quantity. This fixes bogus results for // the area being returning when an endpoint is at a pole. return t != 0 ? 2 * asinh(t / (2 * sqrt(x*y))) / t : 1 / x; } // N.B., x and y are in degrees static real Dtan(real x, real y) { real d = x - y, tx = Math::tand(x), ty = Math::tand(y), txy = tx * ty; return d != 0 ? (2 * txy > -1 ? (1 + txy) * Math::tand(d) : tx - ty) / (d * Math::degree()) : 1 + txy; } static real Datan(real x, real y) { using std::atan; real d = x - y, xy = x * y; return d != 0 ? (2 * xy > -1 ? atan( d / (1 + xy) ) : atan(x) - atan(y)) / d : 1 / (1 + xy); } static real Dsin(real x, real y) { using std::sin; using std::cos; real d = (x - y) / 2; return cos((x + y)/2) * (d != 0 ? sin(d) / d : 1); } static real Dsinh(real x, real y) { using std::sinh; using std::cosh; real d = (x - y) / 2; return cosh((x + y) / 2) * (d != 0 ? sinh(d) / d : 1); } static real Dcosh(real x, real y) { using std::sinh; real d = (x - y) / 2; return sinh((x + y) / 2) * (d != 0 ? sinh(d) / d : 1); } static real Dasinh(real x, real y) { using std::asinh; using std::hypot; real d = x - y, hx = hypot(real(1), x), hy = hypot(real(1), y); return d != 0 ? asinh(x*y > 0 ? d * (x + y) / (x*hy + y*hx) : x*hy - y*hx) / d : 1 / hx; } static real Dgd(real x, real y) { using std::sinh; return Datan(sinh(x), sinh(y)) * Dsinh(x, y); } // N.B., x and y are the tangents of the angles static real Dgdinv(real x, real y) { return Dasinh(x, y) / Datan(x, y); } // Copied from LambertConformalConic... // Deatanhe(x,y) = eatanhe((x-y)/(1-e^2*x*y))/(x-y) real Deatanhe(real x, real y) const { real t = x - y, d = 1 - _ell._e2 * x * y; return t != 0 ? Math::eatanhe(t / d, _ell._es) / t : _ell._e2 / d; } // (E(x) - E(y)) / (x - y) -- E = incomplete elliptic integral of 2nd kind real DE(real x, real y) const; // (mux - muy) / (phix - phiy) using elliptic integrals real DRectifying(real latx, real laty) const; // (psix - psiy) / (phix - phiy) real DIsometric(real latx, real laty) const; // (sum(c[j]*sin(2*j*x),j=1..n) - sum(c[j]*sin(2*j*x),j=1..n)) / (x - y) static real SinCosSeries(bool sinp, real x, real y, const real c[], int n); // (mux - muy) / (chix - chiy) using Krueger's series real DConformalToRectifying(real chix, real chiy) const; // (chix - chiy) / (mux - muy) using Krueger's series real DRectifyingToConformal(real mux, real muy) const; // (mux - muy) / (psix - psiy) // N.B., psix and psiy are in degrees real DIsometricToRectifying(real psix, real psiy) const; // (psix - psiy) / (mux - muy) real DRectifyingToIsometric(real mux, real muy) const; real MeanSinXi(real psi1, real psi2) const; // The following two functions (with lots of ignored arguments) mimic the // interface to the corresponding Geodesic function. These are needed by // PolygonAreaT. void GenDirect(real lat1, real lon1, real azi12, bool, real s12, unsigned outmask, real& lat2, real& lon2, real&, real&, real&, real&, real&, real& S12) const { GenDirect(lat1, lon1, azi12, s12, outmask, lat2, lon2, S12); } void GenInverse(real lat1, real lon1, real lat2, real lon2, unsigned outmask, real& s12, real& azi12, real&, real& , real& , real& , real& S12) const { GenInverse(lat1, lon1, lat2, lon2, outmask, s12, azi12, S12); } public: /** * Bit masks for what calculations to do. They specify which results to * return in the general routines Rhumb::GenDirect and Rhumb::GenInverse * routines. RhumbLine::mask is a duplication of this enum. **********************************************************************/ enum mask { /** * No output. * @hideinitializer **********************************************************************/ NONE = 0U, /** * Calculate latitude \e lat2. * @hideinitializer **********************************************************************/ LATITUDE = 1U<<7, /** * Calculate longitude \e lon2. * @hideinitializer **********************************************************************/ LONGITUDE = 1U<<8, /** * Calculate azimuth \e azi12. * @hideinitializer **********************************************************************/ AZIMUTH = 1U<<9, /** * Calculate distance \e s12. * @hideinitializer **********************************************************************/ DISTANCE = 1U<<10, /** * Calculate area \e S12. * @hideinitializer **********************************************************************/ AREA = 1U<<14, /** * Unroll \e lon2 in the direct calculation. * @hideinitializer **********************************************************************/ LONG_UNROLL = 1U<<15, /** * Calculate everything. (LONG_UNROLL is not included in this mask.) * @hideinitializer **********************************************************************/ ALL = 0x7F80U, }; /** * Constructor for an ellipsoid with * * @param[in] a equatorial radius (meters). * @param[in] f flattening of ellipsoid. Setting \e f = 0 gives a sphere. * Negative \e f gives a prolate ellipsoid. * @param[in] exact if true (the default) use an addition theorem for * elliptic integrals to compute divided differences; otherwise use * series expansion (accurate for |f| < 0.01). * @exception GeographicErr if \e a or (1 − \e f) \e a is not * positive. * * See \ref rhumb, for a detailed description of the \e exact parameter. **********************************************************************/ Rhumb(real a, real f, bool exact = true); /** * Solve the direct rhumb problem returning also the area. * * @param[in] lat1 latitude of point 1 (degrees). * @param[in] lon1 longitude of point 1 (degrees). * @param[in] azi12 azimuth of the rhumb line (degrees). * @param[in] s12 distance between point 1 and point 2 (meters); it can be * negative. * @param[out] lat2 latitude of point 2 (degrees). * @param[out] lon2 longitude of point 2 (degrees). * @param[out] S12 area under the rhumb line (meters2). * * \e lat1 should be in the range [−90°, 90°]. The value of * \e lon2 returned is in the range [−180°, 180°]. * * If point 1 is a pole, the cosine of its latitude is taken to be * 1/ε2 (where ε is 2-52). This * position, which is extremely close to the actual pole, allows the * calculation to be carried out in finite terms. If \e s12 is large * enough that the rhumb line crosses a pole, the longitude of point 2 * is indeterminate (a NaN is returned for \e lon2 and \e S12). **********************************************************************/ void Direct(real lat1, real lon1, real azi12, real s12, real& lat2, real& lon2, real& S12) const { GenDirect(lat1, lon1, azi12, s12, LATITUDE | LONGITUDE | AREA, lat2, lon2, S12); } /** * Solve the direct rhumb problem without the area. **********************************************************************/ void Direct(real lat1, real lon1, real azi12, real s12, real& lat2, real& lon2) const { real t; GenDirect(lat1, lon1, azi12, s12, LATITUDE | LONGITUDE, lat2, lon2, t); } /** * The general direct rhumb problem. Rhumb::Direct is defined in terms * of this function. * * @param[in] lat1 latitude of point 1 (degrees). * @param[in] lon1 longitude of point 1 (degrees). * @param[in] azi12 azimuth of the rhumb line (degrees). * @param[in] s12 distance between point 1 and point 2 (meters); it can be * negative. * @param[in] outmask a bitor'ed combination of Rhumb::mask values * specifying which of the following parameters should be set. * @param[out] lat2 latitude of point 2 (degrees). * @param[out] lon2 longitude of point 2 (degrees). * @param[out] S12 area under the rhumb line (meters2). * * The Rhumb::mask values possible for \e outmask are * - \e outmask |= Rhumb::LATITUDE for the latitude \e lat2; * - \e outmask |= Rhumb::LONGITUDE for the latitude \e lon2; * - \e outmask |= Rhumb::AREA for the area \e S12; * - \e outmask |= Rhumb::ALL for all of the above; * - \e outmask |= Rhumb::LONG_UNROLL to unroll \e lon2 instead of wrapping * it into the range [−180°, 180°]. * . * With the Rhumb::LONG_UNROLL bit set, the quantity \e lon2 − * \e lon1 indicates how many times and in what sense the rhumb line * encircles the ellipsoid. **********************************************************************/ void GenDirect(real lat1, real lon1, real azi12, real s12, unsigned outmask, real& lat2, real& lon2, real& S12) const; /** * Solve the inverse rhumb problem returning also the area. * * @param[in] lat1 latitude of point 1 (degrees). * @param[in] lon1 longitude of point 1 (degrees). * @param[in] lat2 latitude of point 2 (degrees). * @param[in] lon2 longitude of point 2 (degrees). * @param[out] s12 rhumb distance between point 1 and point 2 (meters). * @param[out] azi12 azimuth of the rhumb line (degrees). * @param[out] S12 area under the rhumb line (meters2). * * The shortest rhumb line is found. If the end points are on opposite * meridians, there are two shortest rhumb lines and the east-going one is * chosen. \e lat1 and \e lat2 should be in the range [−90°, * 90°]. The value of \e azi12 returned is in the range * [−180°, 180°]. * * If either point is a pole, the cosine of its latitude is taken to be * 1/ε2 (where ε is 2-52). This * position, which is extremely close to the actual pole, allows the * calculation to be carried out in finite terms. **********************************************************************/ void Inverse(real lat1, real lon1, real lat2, real lon2, real& s12, real& azi12, real& S12) const { GenInverse(lat1, lon1, lat2, lon2, DISTANCE | AZIMUTH | AREA, s12, azi12, S12); } /** * Solve the inverse rhumb problem without the area. **********************************************************************/ void Inverse(real lat1, real lon1, real lat2, real lon2, real& s12, real& azi12) const { real t; GenInverse(lat1, lon1, lat2, lon2, DISTANCE | AZIMUTH, s12, azi12, t); } /** * The general inverse rhumb problem. Rhumb::Inverse is defined in terms * of this function. * * @param[in] lat1 latitude of point 1 (degrees). * @param[in] lon1 longitude of point 1 (degrees). * @param[in] lat2 latitude of point 2 (degrees). * @param[in] lon2 longitude of point 2 (degrees). * @param[in] outmask a bitor'ed combination of Rhumb::mask values * specifying which of the following parameters should be set. * @param[out] s12 rhumb distance between point 1 and point 2 (meters). * @param[out] azi12 azimuth of the rhumb line (degrees). * @param[out] S12 area under the rhumb line (meters2). * * The Rhumb::mask values possible for \e outmask are * - \e outmask |= Rhumb::DISTANCE for the latitude \e s12; * - \e outmask |= Rhumb::AZIMUTH for the latitude \e azi12; * - \e outmask |= Rhumb::AREA for the area \e S12; * - \e outmask |= Rhumb::ALL for all of the above; **********************************************************************/ void GenInverse(real lat1, real lon1, real lat2, real lon2, unsigned outmask, real& s12, real& azi12, real& S12) const; /** * Set up to compute several points on a single rhumb line. * * @param[in] lat1 latitude of point 1 (degrees). * @param[in] lon1 longitude of point 1 (degrees). * @param[in] azi12 azimuth of the rhumb line (degrees). * @return a RhumbLine object. * * \e lat1 should be in the range [−90°, 90°]. * * If point 1 is a pole, the cosine of its latitude is taken to be * 1/ε2 (where ε is 2-52). This * position, which is extremely close to the actual pole, allows the * calculation to be carried out in finite terms. **********************************************************************/ RhumbLine Line(real lat1, real lon1, real azi12) const; /** \name Inspector functions. **********************************************************************/ ///@{ /** * @return \e a the equatorial radius of the ellipsoid (meters). This is * the value used in the constructor. **********************************************************************/ Math::real EquatorialRadius() const { return _ell.EquatorialRadius(); } /** * @return \e f the flattening of the ellipsoid. This is the * value used in the constructor. **********************************************************************/ Math::real Flattening() const { return _ell.Flattening(); } /** * @return total area of ellipsoid in meters2. The area of a * polygon encircling a pole can be found by adding * Geodesic::EllipsoidArea()/2 to the sum of \e S12 for each side of the * polygon. **********************************************************************/ Math::real EllipsoidArea() const { return _ell.Area(); } ///@} /** * A global instantiation of Rhumb with the parameters for the WGS84 * ellipsoid. **********************************************************************/ static const Rhumb& WGS84(); }; /** * \brief Find a sequence of points on a single rhumb line. * * RhumbLine facilitates the determination of a series of points on a single * rhumb line. The starting point (\e lat1, \e lon1) and the azimuth \e * azi12 are specified in the call to Rhumb::Line which returns a RhumbLine * object. RhumbLine.Position returns the location of point 2 (and, * optionally, the corresponding area, \e S12) a distance \e s12 along the * rhumb line. * * There is no public constructor for this class. (Use Rhumb::Line to create * an instance.) The Rhumb object used to create a RhumbLine must stay in * scope as long as the RhumbLine. * * Example of use: * \include example-RhumbLine.cpp **********************************************************************/ class GEOGRAPHICLIB_EXPORT RhumbLine { private: typedef Math::real real; friend class Rhumb; const Rhumb& _rh; real _lat1, _lon1, _azi12, _salp, _calp, _mu1, _psi1, _r1; // copy assignment not allowed RhumbLine& operator=(const RhumbLine&) = delete; RhumbLine(const Rhumb& rh, real lat1, real lon1, real azi12); public: /** * Construction is via default copy constructor. **********************************************************************/ RhumbLine(const RhumbLine&) = default; /** * This is a duplication of Rhumb::mask. **********************************************************************/ enum mask { /** * No output. * @hideinitializer **********************************************************************/ NONE = Rhumb::NONE, /** * Calculate latitude \e lat2. * @hideinitializer **********************************************************************/ LATITUDE = Rhumb::LATITUDE, /** * Calculate longitude \e lon2. * @hideinitializer **********************************************************************/ LONGITUDE = Rhumb::LONGITUDE, /** * Calculate azimuth \e azi12. * @hideinitializer **********************************************************************/ AZIMUTH = Rhumb::AZIMUTH, /** * Calculate distance \e s12. * @hideinitializer **********************************************************************/ DISTANCE = Rhumb::DISTANCE, /** * Calculate area \e S12. * @hideinitializer **********************************************************************/ AREA = Rhumb::AREA, /** * Unroll \e lon2 in the direct calculation. * @hideinitializer **********************************************************************/ LONG_UNROLL = Rhumb::LONG_UNROLL, /** * Calculate everything. (LONG_UNROLL is not included in this mask.) * @hideinitializer **********************************************************************/ ALL = Rhumb::ALL, }; /** * Compute the position of point 2 which is a distance \e s12 (meters) from * point 1. The area is also computed. * * @param[in] s12 distance between point 1 and point 2 (meters); it can be * negative. * @param[out] lat2 latitude of point 2 (degrees). * @param[out] lon2 longitude of point 2 (degrees). * @param[out] S12 area under the rhumb line (meters2). * * The value of \e lon2 returned is in the range [−180°, * 180°]. * * If \e s12 is large enough that the rhumb line crosses a pole, the * longitude of point 2 is indeterminate (a NaN is returned for \e lon2 and * \e S12). **********************************************************************/ void Position(real s12, real& lat2, real& lon2, real& S12) const { GenPosition(s12, LATITUDE | LONGITUDE | AREA, lat2, lon2, S12); } /** * Compute the position of point 2 which is a distance \e s12 (meters) from * point 1. The area is not computed. **********************************************************************/ void Position(real s12, real& lat2, real& lon2) const { real t; GenPosition(s12, LATITUDE | LONGITUDE, lat2, lon2, t); } /** * The general position routine. RhumbLine::Position is defined in term so * this function. * * @param[in] s12 distance between point 1 and point 2 (meters); it can be * negative. * @param[in] outmask a bitor'ed combination of RhumbLine::mask values * specifying which of the following parameters should be set. * @param[out] lat2 latitude of point 2 (degrees). * @param[out] lon2 longitude of point 2 (degrees). * @param[out] S12 area under the rhumb line (meters2). * * The RhumbLine::mask values possible for \e outmask are * - \e outmask |= RhumbLine::LATITUDE for the latitude \e lat2; * - \e outmask |= RhumbLine::LONGITUDE for the latitude \e lon2; * - \e outmask |= RhumbLine::AREA for the area \e S12; * - \e outmask |= RhumbLine::ALL for all of the above; * - \e outmask |= RhumbLine::LONG_UNROLL to unroll \e lon2 instead of * wrapping it into the range [−180°, 180°]. * . * With the RhumbLine::LONG_UNROLL bit set, the quantity \e lon2 − \e * lon1 indicates how many times and in what sense the rhumb line encircles * the ellipsoid. * * If \e s12 is large enough that the rhumb line crosses a pole, the * longitude of point 2 is indeterminate (a NaN is returned for \e lon2 and * \e S12). **********************************************************************/ void GenPosition(real s12, unsigned outmask, real& lat2, real& lon2, real& S12) const; /** \name Inspector functions **********************************************************************/ ///@{ /** * @return \e lat1 the latitude of point 1 (degrees). **********************************************************************/ Math::real Latitude() const { return _lat1; } /** * @return \e lon1 the longitude of point 1 (degrees). **********************************************************************/ Math::real Longitude() const { return _lon1; } /** * @return \e azi12 the azimuth of the rhumb line (degrees). **********************************************************************/ Math::real Azimuth() const { return _azi12; } /** * @return \e a the equatorial radius of the ellipsoid (meters). This is * the value inherited from the Rhumb object used in the constructor. **********************************************************************/ Math::real EquatorialRadius() const { return _rh.EquatorialRadius(); } /** * @return \e f the flattening of the ellipsoid. This is the value * inherited from the Rhumb object used in the constructor. **********************************************************************/ Math::real Flattening() const { return _rh.Flattening(); } }; } // namespace GeographicLib #endif // GEOGRAPHICLIB_RHUMB_HPP geosphere/src/EllipticFunction.cpp0000644000176200001440000004520314677357014017023 0ustar liggesusers/** * \file EllipticFunction.cpp * \brief Implementation for GeographicLib::EllipticFunction class * * Copyright (c) Charles Karney (2008-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #include #include // std::numeric_limits #include // std::swap #include "EllipticFunction.h" #if defined(_MSC_VER) // Squelch warnings about constant conditional and enum-float expressions # pragma warning (disable: 4127 5055) #endif namespace GeographicLib { using namespace std; /* * Implementation of methods given in * * B. C. Carlson * Computation of elliptic integrals * Numerical Algorithms 10, 13-26 (1995) */ Math::real EllipticFunction::RF(real x, real y, real z) { // Carlson, eqs 2.2 - 2.7 static const real tolRF = pow(3 * numeric_limits::epsilon() * real(0.01), 1/real(8)); real A0 = (x + y + z)/3, An = A0, Q = fmax(fmax(fabs(A0-x), fabs(A0-y)), fabs(A0-z)) / tolRF, x0 = x, y0 = y, z0 = z, mul = 1; while (Q >= mul * fabs(An)) { // Max 6 trips real lam = sqrt(x0)*sqrt(y0) + sqrt(y0)*sqrt(z0) + sqrt(z0)*sqrt(x0); An = (An + lam)/4; x0 = (x0 + lam)/4; y0 = (y0 + lam)/4; z0 = (z0 + lam)/4; mul *= 4; } real X = (A0 - x) / (mul * An), Y = (A0 - y) / (mul * An), Z = - (X + Y), E2 = X*Y - Z*Z, E3 = X*Y*Z; // https://dlmf.nist.gov/19.36.E1 // Polynomial is // (1 - E2/10 + E3/14 + E2^2/24 - 3*E2*E3/44 // - 5*E2^3/208 + 3*E3^2/104 + E2^2*E3/16) // convert to Horner form... return (E3 * (6930 * E3 + E2 * (15015 * E2 - 16380) + 17160) + E2 * ((10010 - 5775 * E2) * E2 - 24024) + 240240) / (240240 * sqrt(An)); } Math::real EllipticFunction::RF(real x, real y) { // Carlson, eqs 2.36 - 2.38 static const real tolRG0 = real(2.7) * sqrt((numeric_limits::epsilon() * real(0.01))); real xn = sqrt(x), yn = sqrt(y); if (xn < yn) swap(xn, yn); while (fabs(xn-yn) > tolRG0 * xn) { // Max 4 trips real t = (xn + yn) /2; yn = sqrt(xn * yn); xn = t; } return Math::pi() / (xn + yn); } Math::real EllipticFunction::RC(real x, real y) { // Defined only for y != 0 and x >= 0. return ( !(x >= y) ? // x < y and catch nans // https://dlmf.nist.gov/19.2.E18 atan(sqrt((y - x) / x)) / sqrt(y - x) : ( x == y ? 1 / sqrt(y) : asinh( y > 0 ? // https://dlmf.nist.gov/19.2.E19 // atanh(sqrt((x - y) / x)) sqrt((x - y) / y) : // https://dlmf.nist.gov/19.2.E20 // atanh(sqrt(x / (x - y))) sqrt(-x / y) ) / sqrt(x - y) ) ); } Math::real EllipticFunction::RG(real x, real y, real z) { if (z == 0) swap(y, z); // Carlson, eq 1.7 return (z * RF(x, y, z) - (x-z) * (y-z) * RD(x, y, z) / 3 + sqrt(x * y / z)) / 2; } Math::real EllipticFunction::RG(real x, real y) { // Carlson, eqs 2.36 - 2.39 static const real tolRG0 = real(2.7) * sqrt((numeric_limits::epsilon() * real(0.01))); real x0 = sqrt(fmax(x, y)), y0 = sqrt(fmin(x, y)), xn = x0, yn = y0, s = 0, mul = real(0.25); while (fabs(xn-yn) > tolRG0 * xn) { // Max 4 trips real t = (xn + yn) /2; yn = sqrt(xn * yn); xn = t; mul *= 2; t = xn - yn; s += mul * t * t; } return (Math::sq( (x0 + y0)/2 ) - s) * Math::pi() / (2 * (xn + yn)); } Math::real EllipticFunction::RJ(real x, real y, real z, real p) { // Carlson, eqs 2.17 - 2.25 static const real tolRD = pow(real(0.2) * (numeric_limits::epsilon() * real(0.01)), 1/real(8)); real A0 = (x + y + z + 2*p)/5, An = A0, delta = (p-x) * (p-y) * (p-z), Q = fmax(fmax(fabs(A0-x), fabs(A0-y)), fmax(fabs(A0-z), fabs(A0-p))) / tolRD, x0 = x, y0 = y, z0 = z, p0 = p, mul = 1, mul3 = 1, s = 0; while (Q >= mul * fabs(An)) { // Max 7 trips real lam = sqrt(x0)*sqrt(y0) + sqrt(y0)*sqrt(z0) + sqrt(z0)*sqrt(x0), d0 = (sqrt(p0)+sqrt(x0)) * (sqrt(p0)+sqrt(y0)) * (sqrt(p0)+sqrt(z0)), e0 = delta/(mul3 * Math::sq(d0)); s += RC(1, 1 + e0)/(mul * d0); An = (An + lam)/4; x0 = (x0 + lam)/4; y0 = (y0 + lam)/4; z0 = (z0 + lam)/4; p0 = (p0 + lam)/4; mul *= 4; mul3 *= 64; } real X = (A0 - x) / (mul * An), Y = (A0 - y) / (mul * An), Z = (A0 - z) / (mul * An), P = -(X + Y + Z) / 2, E2 = X*Y + X*Z + Y*Z - 3*P*P, E3 = X*Y*Z + 2*P * (E2 + 2*P*P), E4 = (2*X*Y*Z + P * (E2 + 3*P*P)) * P, E5 = X*Y*Z*P*P; // https://dlmf.nist.gov/19.36.E2 // Polynomial is // (1 - 3*E2/14 + E3/6 + 9*E2^2/88 - 3*E4/22 - 9*E2*E3/52 + 3*E5/26 // - E2^3/16 + 3*E3^2/40 + 3*E2*E4/20 + 45*E2^2*E3/272 // - 9*(E3*E4+E2*E5)/68) return ((471240 - 540540 * E2) * E5 + (612612 * E2 - 540540 * E3 - 556920) * E4 + E3 * (306306 * E3 + E2 * (675675 * E2 - 706860) + 680680) + E2 * ((417690 - 255255 * E2) * E2 - 875160) + 4084080) / (4084080 * mul * An * sqrt(An)) + 6 * s; } Math::real EllipticFunction::RD(real x, real y, real z) { // Carlson, eqs 2.28 - 2.34 static const real tolRD = pow(real(0.2) * (numeric_limits::epsilon() * real(0.01)), 1/real(8)); real A0 = (x + y + 3*z)/5, An = A0, Q = fmax(fmax(fabs(A0-x), fabs(A0-y)), fabs(A0-z)) / tolRD, x0 = x, y0 = y, z0 = z, mul = 1, s = 0; while (Q >= mul * fabs(An)) { // Max 7 trips real lam = sqrt(x0)*sqrt(y0) + sqrt(y0)*sqrt(z0) + sqrt(z0)*sqrt(x0); s += 1/(mul * sqrt(z0) * (z0 + lam)); An = (An + lam)/4; x0 = (x0 + lam)/4; y0 = (y0 + lam)/4; z0 = (z0 + lam)/4; mul *= 4; } real X = (A0 - x) / (mul * An), Y = (A0 - y) / (mul * An), Z = -(X + Y) / 3, E2 = X*Y - 6*Z*Z, E3 = (3*X*Y - 8*Z*Z)*Z, E4 = 3 * (X*Y - Z*Z) * Z*Z, E5 = X*Y*Z*Z*Z; // https://dlmf.nist.gov/19.36.E2 // Polynomial is // (1 - 3*E2/14 + E3/6 + 9*E2^2/88 - 3*E4/22 - 9*E2*E3/52 + 3*E5/26 // - E2^3/16 + 3*E3^2/40 + 3*E2*E4/20 + 45*E2^2*E3/272 // - 9*(E3*E4+E2*E5)/68) return ((471240 - 540540 * E2) * E5 + (612612 * E2 - 540540 * E3 - 556920) * E4 + E3 * (306306 * E3 + E2 * (675675 * E2 - 706860) + 680680) + E2 * ((417690 - 255255 * E2) * E2 - 875160) + 4084080) / (4084080 * mul * An * sqrt(An)) + 3 * s; } void EllipticFunction::Reset(real k2, real alpha2, real kp2, real alphap2) { // Accept nans here (needed for GeodesicExact) if (k2 > 1) throw GeographicErr("Parameter k2 is not in (-inf, 1]"); if (alpha2 > 1) throw GeographicErr("Parameter alpha2 is not in (-inf, 1]"); if (kp2 < 0) throw GeographicErr("Parameter kp2 is not in [0, inf)"); if (alphap2 < 0) throw GeographicErr("Parameter alphap2 is not in [0, inf)"); _k2 = k2; _kp2 = kp2; _alpha2 = alpha2; _alphap2 = alphap2; _eps = _k2/Math::sq(sqrt(_kp2) + 1); // Values of complete elliptic integrals for k = 0,1 and alpha = 0,1 // K E D // k = 0: pi/2 pi/2 pi/4 // k = 1: inf 1 inf // Pi G H // k = 0, alpha = 0: pi/2 pi/2 pi/4 // k = 1, alpha = 0: inf 1 1 // k = 0, alpha = 1: inf inf pi/2 // k = 1, alpha = 1: inf inf inf // // Pi(0, k) = K(k) // G(0, k) = E(k) // H(0, k) = K(k) - D(k) // Pi(0, k) = K(k) // G(0, k) = E(k) // H(0, k) = K(k) - D(k) // Pi(alpha2, 0) = pi/(2*sqrt(1-alpha2)) // G(alpha2, 0) = pi/(2*sqrt(1-alpha2)) // H(alpha2, 0) = pi/(2*(1 + sqrt(1-alpha2))) // Pi(alpha2, 1) = inf // H(1, k) = K(k) // G(alpha2, 1) = H(alpha2, 1) = RC(1, alphap2) if (_k2 != 0) { // Complete elliptic integral K(k), Carlson eq. 4.1 // https://dlmf.nist.gov/19.25.E1 _kKc = _kp2 != 0 ? RF(_kp2, 1) : Math::infinity(); // Complete elliptic integral E(k), Carlson eq. 4.2 // https://dlmf.nist.gov/19.25.E1 _eEc = _kp2 != 0 ? 2 * RG(_kp2, 1) : 1; // D(k) = (K(k) - E(k))/k^2, Carlson eq.4.3 // https://dlmf.nist.gov/19.25.E1 _dDc = _kp2 != 0 ? RD(0, _kp2, 1) / 3 : Math::infinity(); } else { _kKc = _eEc = Math::pi()/2; _dDc = _kKc/2; } if (_alpha2 != 0) { // https://dlmf.nist.gov/19.25.E2 real rj = (_kp2 != 0 && _alphap2 != 0) ? RJ(0, _kp2, 1, _alphap2) : Math::infinity(), // Only use rc if _kp2 = 0. rc = _kp2 != 0 ? 0 : (_alphap2 != 0 ? RC(1, _alphap2) : Math::infinity()); // Pi(alpha^2, k) _pPic = _kp2 != 0 ? _kKc + _alpha2 * rj / 3 : Math::infinity(); // G(alpha^2, k) _gGc = _kp2 != 0 ? _kKc + (_alpha2 - _k2) * rj / 3 : rc; // H(alpha^2, k) _hHc = _kp2 != 0 ? _kKc - (_alphap2 != 0 ? _alphap2 * rj : 0) / 3 : rc; } else { _pPic = _kKc; _gGc = _eEc; // Hc = Kc - Dc but this involves large cancellations if k2 is close to // 1. So write (for alpha2 = 0) // Hc = int(cos(phi)^2/sqrt(1-k2*sin(phi)^2),phi,0,pi/2) // = 1/sqrt(1-k2) * int(sin(phi)^2/sqrt(1-k2/kp2*sin(phi)^2,...) // = 1/kp * D(i*k/kp) // and use D(k) = RD(0, kp2, 1) / 3 // so Hc = 1/kp * RD(0, 1/kp2, 1) / 3 // = kp2 * RD(0, 1, kp2) / 3 // using https://dlmf.nist.gov/19.20.E18 // Equivalently // RF(x, 1) - RD(0, x, 1)/3 = x * RD(0, 1, x)/3 for x > 0 // For k2 = 1 and alpha2 = 0, we have // Hc = int(cos(phi),...) = 1 _hHc = _kp2 != 0 ? _kp2 * RD(0, 1, _kp2) / 3 : 1; } } /* * Implementation of methods given in * * R. Bulirsch * Numerical Calculation of Elliptic Integrals and Elliptic Functions * Numericshe Mathematik 7, 78-90 (1965) */ void EllipticFunction::sncndn(real x, real& sn, real& cn, real& dn) const { // Bulirsch's sncndn routine, p 89. static const real tolJAC = sqrt(numeric_limits::epsilon() * real(0.01)); if (_kp2 != 0) { real mc = _kp2, d = 0; if (signbit(_kp2)) { d = 1 - mc; mc /= -d; d = sqrt(d); x *= d; } real c = 0; // To suppress warning about uninitialized variable real m[num_], n[num_]; unsigned l = 0; for (real a = 1; l < num_ || GEOGRAPHICLIB_PANIC; ++l) { // This converges quadratically. Max 5 trips m[l] = a; n[l] = mc = sqrt(mc); c = (a + mc) / 2; if (!(fabs(a - mc) > tolJAC * a)) { ++l; break; } mc *= a; a = c; } x *= c; sn = sin(x); cn = cos(x); dn = 1; if (sn != 0) { real a = cn / sn; c *= a; while (l--) { real b = m[l]; a *= c; c *= dn; dn = (n[l] + a) / (b + a); a = c / b; } a = 1 / sqrt(c*c + 1); sn = signbit(sn) ? -a : a; cn = c * sn; if (signbit(_kp2)) { swap(cn, dn); sn /= d; } } } else { sn = tanh(x); dn = cn = 1 / cosh(x); } } Math::real EllipticFunction::F(real sn, real cn, real dn) const { // Carlson, eq. 4.5 and // https://dlmf.nist.gov/19.25.E5 real cn2 = cn*cn, dn2 = dn*dn, fi = cn2 != 0 ? fabs(sn) * RF(cn2, dn2, 1) : K(); // Enforce usual trig-like symmetries if (signbit(cn)) fi = 2 * K() - fi; return copysign(fi, sn); } Math::real EllipticFunction::E(real sn, real cn, real dn) const { real cn2 = cn*cn, dn2 = dn*dn, sn2 = sn*sn, ei = cn2 != 0 ? fabs(sn) * ( _k2 <= 0 ? // Carlson, eq. 4.6 and // https://dlmf.nist.gov/19.25.E9 RF(cn2, dn2, 1) - _k2 * sn2 * RD(cn2, dn2, 1) / 3 : ( _kp2 >= 0 ? // https://dlmf.nist.gov/19.25.E10 _kp2 * RF(cn2, dn2, 1) + _k2 * _kp2 * sn2 * RD(cn2, 1, dn2) / 3 + _k2 * fabs(cn) / dn : // https://dlmf.nist.gov/19.25.E11 - _kp2 * sn2 * RD(dn2, 1, cn2) / 3 + dn / fabs(cn) ) ) : E(); // Enforce usual trig-like symmetries if (signbit(cn)) ei = 2 * E() - ei; return copysign(ei, sn); } Math::real EllipticFunction::D(real sn, real cn, real dn) const { // Carlson, eq. 4.8 and // https://dlmf.nist.gov/19.25.E13 real cn2 = cn*cn, dn2 = dn*dn, sn2 = sn*sn, di = cn2 != 0 ? fabs(sn) * sn2 * RD(cn2, dn2, 1) / 3 : D(); // Enforce usual trig-like symmetries if (signbit(cn)) di = 2 * D() - di; return copysign(di, sn); } Math::real EllipticFunction::Pi(real sn, real cn, real dn) const { // Carlson, eq. 4.7 and // https://dlmf.nist.gov/19.25.E14 real cn2 = cn*cn, dn2 = dn*dn, sn2 = sn*sn, pii = cn2 != 0 ? fabs(sn) * (RF(cn2, dn2, 1) + _alpha2 * sn2 * RJ(cn2, dn2, 1, cn2 + _alphap2 * sn2) / 3) : Pi(); // Enforce usual trig-like symmetries if (signbit(cn)) pii = 2 * Pi() - pii; return copysign(pii, sn); } Math::real EllipticFunction::G(real sn, real cn, real dn) const { real cn2 = cn*cn, dn2 = dn*dn, sn2 = sn*sn, gi = cn2 != 0 ? fabs(sn) * (RF(cn2, dn2, 1) + (_alpha2 - _k2) * sn2 * RJ(cn2, dn2, 1, cn2 + _alphap2 * sn2) / 3) : G(); // Enforce usual trig-like symmetries if (signbit(cn)) gi = 2 * G() - gi; return copysign(gi, sn); } Math::real EllipticFunction::H(real sn, real cn, real dn) const { real cn2 = cn*cn, dn2 = dn*dn, sn2 = sn*sn, // WARNING: large cancellation if k2 = 1, alpha2 = 0, and phi near pi/2 hi = cn2 != 0 ? fabs(sn) * (RF(cn2, dn2, 1) - _alphap2 * sn2 * RJ(cn2, dn2, 1, cn2 + _alphap2 * sn2) / 3) : H(); // Enforce usual trig-like symmetries if (signbit(cn)) hi = 2 * H() - hi; return copysign(hi, sn); } Math::real EllipticFunction::deltaF(real sn, real cn, real dn) const { // Function is periodic with period pi if (signbit(cn)) { cn = -cn; sn = -sn; } return F(sn, cn, dn) * (Math::pi()/2) / K() - atan2(sn, cn); } Math::real EllipticFunction::deltaE(real sn, real cn, real dn) const { // Function is periodic with period pi if (signbit(cn)) { cn = -cn; sn = -sn; } return E(sn, cn, dn) * (Math::pi()/2) / E() - atan2(sn, cn); } Math::real EllipticFunction::deltaPi(real sn, real cn, real dn) const { // Function is periodic with period pi if (signbit(cn)) { cn = -cn; sn = -sn; } return Pi(sn, cn, dn) * (Math::pi()/2) / Pi() - atan2(sn, cn); } Math::real EllipticFunction::deltaD(real sn, real cn, real dn) const { // Function is periodic with period pi if (signbit(cn)) { cn = -cn; sn = -sn; } return D(sn, cn, dn) * (Math::pi()/2) / D() - atan2(sn, cn); } Math::real EllipticFunction::deltaG(real sn, real cn, real dn) const { // Function is periodic with period pi if (signbit(cn)) { cn = -cn; sn = -sn; } return G(sn, cn, dn) * (Math::pi()/2) / G() - atan2(sn, cn); } Math::real EllipticFunction::deltaH(real sn, real cn, real dn) const { // Function is periodic with period pi if (signbit(cn)) { cn = -cn; sn = -sn; } return H(sn, cn, dn) * (Math::pi()/2) / H() - atan2(sn, cn); } Math::real EllipticFunction::F(real phi) const { real sn = sin(phi), cn = cos(phi), dn = Delta(sn, cn); return fabs(phi) < Math::pi() ? F(sn, cn, dn) : (deltaF(sn, cn, dn) + phi) * K() / (Math::pi()/2); } Math::real EllipticFunction::E(real phi) const { real sn = sin(phi), cn = cos(phi), dn = Delta(sn, cn); return fabs(phi) < Math::pi() ? E(sn, cn, dn) : (deltaE(sn, cn, dn) + phi) * E() / (Math::pi()/2); } Math::real EllipticFunction::Ed(real ang) const { // ang - Math::AngNormalize(ang) is (nearly) an exact multiple of 360 real n = round((ang - Math::AngNormalize(ang))/Math::td); real sn, cn; Math::sincosd(ang, sn, cn); return E(sn, cn, Delta(sn, cn)) + 4 * E() * n; } Math::real EllipticFunction::Pi(real phi) const { real sn = sin(phi), cn = cos(phi), dn = Delta(sn, cn); return fabs(phi) < Math::pi() ? Pi(sn, cn, dn) : (deltaPi(sn, cn, dn) + phi) * Pi() / (Math::pi()/2); } Math::real EllipticFunction::D(real phi) const { real sn = sin(phi), cn = cos(phi), dn = Delta(sn, cn); return fabs(phi) < Math::pi() ? D(sn, cn, dn) : (deltaD(sn, cn, dn) + phi) * D() / (Math::pi()/2); } Math::real EllipticFunction::G(real phi) const { real sn = sin(phi), cn = cos(phi), dn = Delta(sn, cn); return fabs(phi) < Math::pi() ? G(sn, cn, dn) : (deltaG(sn, cn, dn) + phi) * G() / (Math::pi()/2); } Math::real EllipticFunction::H(real phi) const { real sn = sin(phi), cn = cos(phi), dn = Delta(sn, cn); return fabs(phi) < Math::pi() ? H(sn, cn, dn) : (deltaH(sn, cn, dn) + phi) * H() / (Math::pi()/2); } Math::real EllipticFunction::Einv(real x) const { static const real tolJAC = sqrt(numeric_limits::epsilon() * real(0.01)); real n = floor(x / (2 * _eEc) + real(0.5)); x -= 2 * _eEc * n; // x now in [-ec, ec) // Linear approximation real phi = Math::pi() * x / (2 * _eEc); // phi in [-pi/2, pi/2) // First order correction phi -= _eps * sin(2 * phi) / 2; // For kp2 close to zero use asin(x/_eEc) or // J. P. Boyd, Applied Math. and Computation 218, 7005-7013 (2012) // https://doi.org/10.1016/j.amc.2011.12.021 for (int i = 0; i < num_ || GEOGRAPHICLIB_PANIC; ++i) { real sn = sin(phi), cn = cos(phi), dn = Delta(sn, cn), err = (E(sn, cn, dn) - x)/dn; phi -= err; if (!(fabs(err) > tolJAC)) break; } return n * Math::pi() + phi; } Math::real EllipticFunction::deltaEinv(real stau, real ctau) const { // Function is periodic with period pi if (signbit(ctau)) { ctau = -ctau; stau = -stau; } real tau = atan2(stau, ctau); return Einv( tau * E() / (Math::pi()/2) ) - tau; } } // namespace GeographicLib geosphere/src/AzimuthalEquidistant.h0000644000176200001440000001377414323401216017354 0ustar liggesusers/** * \file AzimuthalEquidistant.hpp * \brief Header for GeographicLib::AzimuthalEquidistant class * * Copyright (c) Charles Karney (2009-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #if !defined(GEOGRAPHICLIB_AZIMUTHALEQUIDISTANT_HPP) #define GEOGRAPHICLIB_AZIMUTHALEQUIDISTANT_HPP 1 #include "Geodesic.h" #include "Constants.h" namespace GeographicLib { /** * \brief Azimuthal equidistant projection * * Azimuthal equidistant projection centered at an arbitrary position on the * ellipsoid. For a point in projected space (\e x, \e y), the geodesic * distance from the center position is hypot(\e x, \e y) and the azimuth of * the geodesic from the center point is atan2(\e x, \e y). The Forward and * Reverse methods also return the azimuth \e azi of the geodesic at (\e x, * \e y) and reciprocal scale \e rk in the azimuthal direction which, * together with the basic properties of the projection, serve to specify * completely the local affine transformation between geographic and * projected coordinates. * * The conversions all take place using a Geodesic object (by default * Geodesic::WGS84()). For more information on geodesics see \ref geodesic. * * Example of use: * \include example-AzimuthalEquidistant.cpp * * GeodesicProj is a command-line utility * providing access to the functionality of AzimuthalEquidistant, Gnomonic, * and CassiniSoldner. **********************************************************************/ class GEOGRAPHICLIB_EXPORT AzimuthalEquidistant { private: typedef Math::real real; real eps_; Geodesic _earth; public: /** * Constructor for AzimuthalEquidistant. * * @param[in] earth the Geodesic object to use for geodesic calculations. * By default this uses the WGS84 ellipsoid. **********************************************************************/ explicit AzimuthalEquidistant(const Geodesic& earth = Geodesic::WGS84()); /** * Forward projection, from geographic to azimuthal equidistant. * * @param[in] lat0 latitude of center point of projection (degrees). * @param[in] lon0 longitude of center point of projection (degrees). * @param[in] lat latitude of point (degrees). * @param[in] lon longitude of point (degrees). * @param[out] x easting of point (meters). * @param[out] y northing of point (meters). * @param[out] azi azimuth of geodesic at point (degrees). * @param[out] rk reciprocal of azimuthal scale at point. * * \e lat0 and \e lat should be in the range [−90°, 90°]. * The scale of the projection is 1 in the "radial" direction, \e azi * clockwise from true north, and is 1/\e rk in the direction perpendicular * to this. A call to Forward followed by a call to Reverse will return * the original (\e lat, \e lon) (to within roundoff). **********************************************************************/ void Forward(real lat0, real lon0, real lat, real lon, real& x, real& y, real& azi, real& rk) const; /** * Reverse projection, from azimuthal equidistant to geographic. * * @param[in] lat0 latitude of center point of projection (degrees). * @param[in] lon0 longitude of center point of projection (degrees). * @param[in] x easting of point (meters). * @param[in] y northing of point (meters). * @param[out] lat latitude of point (degrees). * @param[out] lon longitude of point (degrees). * @param[out] azi azimuth of geodesic at point (degrees). * @param[out] rk reciprocal of azimuthal scale at point. * * \e lat0 should be in the range [−90°, 90°]. \e lat will * be in the range [−90°, 90°] and \e lon will be in the * range [−180°, 180°]. The scale of the projection is 1 in * the "radial" direction, \e azi clockwise from true north, and is 1/\e rk * in the direction perpendicular to this. A call to Reverse followed by a * call to Forward will return the original (\e x, \e y) (to roundoff) only * if the geodesic to (\e x, \e y) is a shortest path. **********************************************************************/ void Reverse(real lat0, real lon0, real x, real y, real& lat, real& lon, real& azi, real& rk) const; /** * AzimuthalEquidistant::Forward without returning the azimuth and scale. **********************************************************************/ void Forward(real lat0, real lon0, real lat, real lon, real& x, real& y) const { real azi, rk; Forward(lat0, lon0, lat, lon, x, y, azi, rk); } /** * AzimuthalEquidistant::Reverse without returning the azimuth and scale. **********************************************************************/ void Reverse(real lat0, real lon0, real x, real y, real& lat, real& lon) const { real azi, rk; Reverse(lat0, lon0, x, y, lat, lon, azi, rk); } /** \name Inspector functions **********************************************************************/ ///@{ /** * @return \e a the equatorial radius of the ellipsoid (meters). This is * the value inherited from the Geodesic object used in the constructor. **********************************************************************/ Math::real EquatorialRadius() const { return _earth.EquatorialRadius(); } /** * @return \e f the flattening of the ellipsoid. This is the value * inherited from the Geodesic object used in the constructor. **********************************************************************/ Math::real Flattening() const { return _earth.Flattening(); } ///@} }; } // namespace GeographicLib #endif // GEOGRAPHICLIB_AZIMUTHALEQUIDISTANT_HPP geosphere/src/TransverseMercatorExact.h0000644000176200001440000002673714323400206020022 0ustar liggesusers/** * \file TransverseMercatorExact.hpp * \brief Header for GeographicLib::TransverseMercatorExact class * * Copyright (c) Charles Karney (2008-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #if !defined(GEOGRAPHICLIB_TRANSVERSEMERCATOREXACT_HPP) #define GEOGRAPHICLIB_TRANSVERSEMERCATOREXACT_HPP 1 #include "Constants.h" #include "EllipticFunction.h" namespace GeographicLib { /** * \brief An exact implementation of the transverse Mercator projection * * Implementation of the Transverse Mercator Projection given in * - L. P. Lee, * Conformal * Projections Based On Jacobian Elliptic Functions, Part V of * Conformal Projections Based on Elliptic Functions, * (B. V. Gutsell, Toronto, 1976), 128pp., * ISBN: 0919870163 * (also appeared as: * Monograph 16, Suppl. No. 1 to Canadian Cartographer, Vol 13); * * borrow from archive.org. * - C. F. F. Karney, * * Transverse Mercator with an accuracy of a few nanometers, * J. Geodesy 85(8), 475--485 (Aug. 2011); * preprint * arXiv:1002.1417. * * Lee gives the correct results for forward and reverse transformations * subject to the branch cut rules (see the description of the \e extendp * argument to the constructor). The maximum error is about 8 nm (8 * nanometers), ground distance, for the forward and reverse transformations. * The error in the convergence is 2 × 10−15", * the relative error in the scale is 7 × 10−12%%. * See Sec. 3 of * arXiv:1002.1417 for details. * The method is "exact" in the sense that the errors are close to the * round-off limit and that no changes are needed in the algorithms for them * to be used with reals of a higher precision. Thus the errors using long * double (with a 64-bit fraction) are about 2000 times smaller than using * double (with a 53-bit fraction). * * This algorithm is about 4.5 times slower than the 6th-order Krüger * method, TransverseMercator, taking about 11 us for a combined forward and * reverse projection on a 2.66 GHz Intel machine (g++, version 4.3.0, -O3). * * The ellipsoid parameters and the central scale are set in the constructor. * The central meridian (which is a trivial shift of the longitude) is * specified as the \e lon0 argument of the TransverseMercatorExact::Forward * and TransverseMercatorExact::Reverse functions. The latitude of origin is * taken to be the equator. See the documentation on TransverseMercator for * how to include a false easting, false northing, or a latitude of origin. * * See tm-grid.kmz, for an * illustration of the transverse Mercator grid in Google Earth. * * This class also returns the meridian convergence \e gamma and scale \e k. * The meridian convergence is the bearing of grid north (the \e y axis) * measured clockwise from true north. * * See TransverseMercatorExact.cpp for more information on the * implementation. * * See \ref transversemercator for a discussion of this projection. * * Example of use: * \include example-TransverseMercatorExact.cpp * * TransverseMercatorProj is a * command-line utility providing access to the functionality of * TransverseMercator and TransverseMercatorExact. **********************************************************************/ class GEOGRAPHICLIB_EXPORT TransverseMercatorExact { private: typedef Math::real real; static const int numit_ = 10; real tol_, tol2_, taytol_; real _a, _f, _k0, _mu, _mv, _e; bool _extendp; EllipticFunction _eEu, _eEv; void zeta(real u, real snu, real cnu, real dnu, real v, real snv, real cnv, real dnv, real& taup, real& lam) const; void dwdzeta(real u, real snu, real cnu, real dnu, real v, real snv, real cnv, real dnv, real& du, real& dv) const; bool zetainv0(real psi, real lam, real& u, real& v) const; void zetainv(real taup, real lam, real& u, real& v) const; void sigma(real u, real snu, real cnu, real dnu, real v, real snv, real cnv, real dnv, real& xi, real& eta) const; void dwdsigma(real u, real snu, real cnu, real dnu, real v, real snv, real cnv, real dnv, real& du, real& dv) const; bool sigmainv0(real xi, real eta, real& u, real& v) const; void sigmainv(real xi, real eta, real& u, real& v) const; void Scale(real tau, real lam, real snu, real cnu, real dnu, real snv, real cnv, real dnv, real& gamma, real& k) const; public: /** * Constructor for an ellipsoid with * * @param[in] a equatorial radius (meters). * @param[in] f flattening of ellipsoid. * @param[in] k0 central scale factor. * @param[in] extendp use extended domain. * @exception GeographicErr if \e a, \e f, or \e k0 is not positive. * * The transverse Mercator projection has a branch point singularity at \e * lat = 0 and \e lon − \e lon0 = 90 (1 − \e e) or (for * TransverseMercatorExact::UTM) x = 18381 km, y = 0m. The \e extendp * argument governs where the branch cut is placed. With \e extendp = * false, the "standard" convention is followed, namely the cut is placed * along \e x > 18381 km, \e y = 0m. Forward can be called with any \e lat * and \e lon then produces the transformation shown in Lee, Fig 46. * Reverse analytically continues this in the ± \e x direction. As * a consequence, Reverse may map multiple points to the same geographic * location; for example, for TransverseMercatorExact::UTM, \e x = * 22051449.037349 m, \e y = −7131237.022729 m and \e x = * 29735142.378357 m, \e y = 4235043.607933 m both map to \e lat = * −2°, \e lon = 88°. * * With \e extendp = true, the branch cut is moved to the lower left * quadrant. The various symmetries of the transverse Mercator projection * can be used to explore the projection on any sheet. In this mode the * domains of \e lat, \e lon, \e x, and \e y are restricted to * - the union of * - \e lat in [0, 90] and \e lon − \e lon0 in [0, 90] * - \e lat in (-90, 0] and \e lon − \e lon0 in [90 (1 − \e e), 90] * - the union of * - x/(\e k0 \e a) in [0, ∞) and * y/(\e k0 \e a) in [0, E(e2)] * - x/(\e k0 \e a) in [K(1 − e2) − * E(1 − e2), ∞) and y/(\e k0 \e * a) in (−∞, 0] * . * See Sec. 5 of * arXiv:1002.1417 for a full * discussion of the treatment of the branch cut. * * The method will work for all ellipsoids used in terrestrial geodesy. * The method cannot be applied directly to the case of a sphere (\e f = 0) * because some the constants characterizing this method diverge in that * limit, and in practice, \e f should be larger than about * numeric_limits::epsilon(). However, TransverseMercator treats the * sphere exactly. **********************************************************************/ TransverseMercatorExact(real a, real f, real k0, bool extendp = false); /** * Forward projection, from geographic to transverse Mercator. * * @param[in] lon0 central meridian of the projection (degrees). * @param[in] lat latitude of point (degrees). * @param[in] lon longitude of point (degrees). * @param[out] x easting of point (meters). * @param[out] y northing of point (meters). * @param[out] gamma meridian convergence at point (degrees). * @param[out] k scale of projection at point. * * No false easting or northing is added. \e lat should be in the range * [−90°, 90°]. **********************************************************************/ void Forward(real lon0, real lat, real lon, real& x, real& y, real& gamma, real& k) const; /** * Reverse projection, from transverse Mercator to geographic. * * @param[in] lon0 central meridian of the projection (degrees). * @param[in] x easting of point (meters). * @param[in] y northing of point (meters). * @param[out] lat latitude of point (degrees). * @param[out] lon longitude of point (degrees). * @param[out] gamma meridian convergence at point (degrees). * @param[out] k scale of projection at point. * * No false easting or northing is added. The value of \e lon returned is * in the range [−180°, 180°]. **********************************************************************/ void Reverse(real lon0, real x, real y, real& lat, real& lon, real& gamma, real& k) const; /** * TransverseMercatorExact::Forward without returning the convergence and * scale. **********************************************************************/ void Forward(real lon0, real lat, real lon, real& x, real& y) const { real gamma, k; Forward(lon0, lat, lon, x, y, gamma, k); } /** * TransverseMercatorExact::Reverse without returning the convergence and * scale. **********************************************************************/ void Reverse(real lon0, real x, real y, real& lat, real& lon) const { real gamma, k; Reverse(lon0, x, y, lat, lon, gamma, k); } /** \name Inspector functions **********************************************************************/ ///@{ /** * @return \e a the equatorial radius of the ellipsoid (meters). This is * the value used in the constructor. **********************************************************************/ Math::real EquatorialRadius() const { return _a; } /** * @return \e f the flattening of the ellipsoid. This is the value used in * the constructor. **********************************************************************/ Math::real Flattening() const { return _f; } /** * @return \e k0 central scale for the projection. This is the value of \e * k0 used in the constructor and is the scale on the central meridian. **********************************************************************/ Math::real CentralScale() const { return _k0; } ///@} /** * A global instantiation of TransverseMercatorExact with the WGS84 * ellipsoid and the UTM scale factor. However, unlike UTM, no false * easting or northing is added. **********************************************************************/ static const TransverseMercatorExact& UTM(); }; } // namespace GeographicLib #endif // GEOGRAPHICLIB_TRANSVERSEMERCATOREXACT_HPP geosphere/src/GARS.h0000644000176200001440000001263014323377037013742 0ustar liggesusers/** * \file GARS.hpp * \brief Header for GeographicLib::GARS class * * Copyright (c) Charles Karney (2015-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #if !defined(GEOGRAPHICLIB_GARS_HPP) #define GEOGRAPHICLIB_GARS_HPP 1 #include "Constants.h" #if defined(_MSC_VER) // Squelch warnings about dll vs string # pragma warning (push) # pragma warning (disable: 4251) #endif namespace GeographicLib { /** * \brief Conversions for the Global Area Reference System (GARS) * * The Global Area Reference System is described in * - https://en.wikipedia.org/wiki/Global_Area_Reference_System * - https://earth-info.nga.mil/index.php?dir=coordsys&action=coordsys#tab_gars * . * It provides a compact string representation of a geographic area * (expressed as latitude and longitude). The classes Georef and Geohash * implement similar compact representations. * * Example of use: * \include example-GARS.cpp **********************************************************************/ class GEOGRAPHICLIB_EXPORT GARS { private: typedef Math::real real; static const char* const digits_; static const char* const letters_; #if GEOGRAPHICLIB_PRECISION == 4 // Work around an enum lossage introduced in boost 1.76 // https://github.com/boostorg/multiprecision/issues/324 // and fixed in // https://github.com/boostorg/multiprecision/pull/333 static const int #else enum { #endif lonorig_ = -Math::hd, // Origin for longitude latorig_ = -Math::qd, // Origin for latitude baselon_ = 10, // Base for longitude tiles baselat_ = 24, // Base for latitude tiles lonlen_ = 3, latlen_ = 2, baselen_ = lonlen_ + latlen_, mult1_ = 2, // base precision = 1/2 degree mult2_ = 2, // 6th char gives 2x more precision mult3_ = 3, // 7th char gives 3x more precision m_ = mult1_ * mult2_ * mult3_, maxprec_ = 2, maxlen_ = baselen_ + maxprec_ #if GEOGRAPHICLIB_PRECISION == 4 ; #else }; #endif GARS() = delete; // Disable constructor public: /** * Convert from geographic coordinates to GARS. * * @param[in] lat latitude of point (degrees). * @param[in] lon longitude of point (degrees). * @param[in] prec the precision of the resulting GARS. * @param[out] gars the GARS string. * @exception GeographicErr if \e lat is not in [−90°, * 90°]. * @exception std::bad_alloc if memory for \e gars can't be allocated. * * \e prec specifies the precision of \e gars as follows: * - \e prec = 0 (min), 30' precision, e.g., 006AG; * - \e prec = 1, 15' precision, e.g., 006AG3; * - \e prec = 2 (max), 5' precision, e.g., 006AG39. * * If \e lat or \e lon is NaN, then \e gars is set to "INVALID". **********************************************************************/ static void Forward(real lat, real lon, int prec, std::string& gars); /** * Convert from GARS to geographic coordinates. * * @param[in] gars the GARS. * @param[out] lat latitude of point (degrees). * @param[out] lon longitude of point (degrees). * @param[out] prec the precision of \e gars. * @param[in] centerp if true (the default) return the center of the * \e gars, otherwise return the south-west corner. * @exception GeographicErr if \e gars is illegal. * * The case of the letters in \e gars is ignored. \e prec is in the range * [0, 2] and gives the precision of \e gars as follows: * - \e prec = 0 (min), 30' precision, e.g., 006AG; * - \e prec = 1, 15' precision, e.g., 006AG3; * - \e prec = 2 (max), 5' precision, e.g., 006AG39. * * If the first 3 characters of \e gars are "INV", then \e lat and \e lon * are set to NaN and \e prec is unchanged. **********************************************************************/ static void Reverse(const std::string& gars, real& lat, real& lon, int& prec, bool centerp = true); /** * The angular resolution of a GARS. * * @param[in] prec the precision of the GARS. * @return the latitude-longitude resolution (degrees). * * Internally, \e prec is first put in the range [0, 2]. **********************************************************************/ static Math::real Resolution(int prec) { return 1/real(prec <= 0 ? mult1_ : (prec == 1 ? mult1_ * mult2_ : mult1_ * mult2_ * mult3_)); } /** * The GARS precision required to meet a given geographic resolution. * * @param[in] res the minimum of resolution in latitude and longitude * (degrees). * @return GARS precision. * * The returned length is in the range [0, 2]. **********************************************************************/ static int Precision(real res) { using std::fabs; res = fabs(res); for (int prec = 0; prec < maxprec_; ++prec) if (Resolution(prec) <= res) return prec; return maxprec_; } }; } // namespace GeographicLib #if defined(_MSC_VER) # pragma warning (pop) #endif #endif // GEOGRAPHICLIB_GARS_HPP geosphere/src/a_dist.c0000644000176200001440000000744114323373006014440 0ustar liggesusers/* Robert Hijmans, June 2011 */ #include #include #include "a_util.h" double distPlane(double x1, double y1, double x2, double y2) { return( sqrt(pow((x2-x1),2) + pow((y2-y1), 2)) ); } double distCos(double lon1, double lat1, double lon2, double lat2, double r) { double cosd; lon1 = toRad(lon1); lon2 = toRad(lon2); lat1 = toRad(lat1); lat2 = toRad(lat2); cosd = sin(lat1) * sin(lat2) + cos(lat1) * cos(lat2) * cos(lon1-lon2); return acos(cosd) * r; } double distHav(double lon1, double lat1, double lon2, double lat2, double r) { double dLat, dLon, a; lon1 = toRad(lon1); lon2 = toRad(lon2); lat1 = toRad(lat1); lat2 = toRad(lat2); dLat = lat2-lat1; dLon = lon2-lon1; a = sin(dLat/2.) * sin(dLat/2.) + cos(lat1) * cos(lat2) * sin(dLon/2.) * sin(dLon/2.); return 2. * atan2(sqrt(a), sqrt(1.-a)) * r; } double distVinSph(double lon1, double lat1, double lon2, double lat2, double r) { double x, x1, x2, y; lon1 = toRad(lon1); lon2 = toRad(lon2); lat1 = toRad(lat1); lat2 = toRad(lat2); x1 = cos(lat2) * sin(lon1-lon2); x2 = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(lon1-lon2); x = sqrt(x1*x1 + x2*x2); y = sin(lat1) * sin(lat2) + cos(lat1) * cos(lat2) * cos(lon1-lon2); return r * atan2(x, y); } double distVinEll(double lon1, double lat1, double lon2, double lat2, double a, double b, double f) { /* Calculate geodesic distance (in m) between two points specified by latitude/longitude (in numeric degrees) using Vincenty inverse formula for ellipsoids based on source http://www.movable-type.co.uk/scripts/latlong-vincenty.html by Chris Veness */ double L, U1, U2, sinU1, cosU1, sinU2, cosU2, lambda, sinLambda, cosLambda, sinSigma, cosSigma, sigma, sinAlpha, cosSqAlpha, cos2SigmaM, C, lambdaP, uSq, A, B, deltaSigma; int iterLimit, cont; if ((lon1 == lon2) & (lat1 == lat2)) { return 0.; } else if ( isnan(lon1) | isnan(lat1) | isnan(lon2) | isnan(lat2)) { return NAN; } else { lon1 = toRad(lon1); lon2 = toRad(lon2); lat1 = toRad(lat1); lat2 = toRad(lat2); L = (lon2-lon1); U1 = atan((1.-f) * tan(lat1)); U2 = atan((1.-f) * tan(lat2)); sinU1 = sin(U1); cosU1 = cos(U1); sinU2 = sin(U2); cosU2 = cos(U2); lambda = L; iterLimit = 100; cont = 1; while (cont) { sinLambda = sin(lambda); cosLambda = cos(lambda); sinSigma = sqrt((cosU2*sinLambda) * (cosU2*sinLambda) + (cosU1*sinU2-sinU1*cosU2*cosLambda) * (cosU1*sinU2-sinU1*cosU2*cosLambda)); cosSigma = sinU1*sinU2 + cosU1*cosU2*cosLambda; sigma = atan2(sinSigma, cosSigma); sinAlpha = cosU1 * cosU2 * sinLambda / sinSigma; cosSqAlpha = 1. - sinAlpha*sinAlpha; cos2SigmaM = cosSigma - 2.*sinU1*sinU2/cosSqAlpha; if (isnan(cos2SigmaM)) { cos2SigmaM = 0.; // equatorial line: cosSqAlpha=0 (par 6) } C = f/16.*cosSqAlpha*(4.+f*(4.-3.*cosSqAlpha)); lambdaP = lambda; lambda = L + (1.-C) * f * sinAlpha * (sigma + C*sinSigma*(cos2SigmaM+C*cosSigma*(-1.+2.*cos2SigmaM*cos2SigmaM))); iterLimit = iterLimit - 1; cont = (fabs(lambda-lambdaP) > 1e-12 && iterLimit > 0); } if (iterLimit==0) { return NAN; // formula failed to converge } else { uSq = cosSqAlpha * (a*a - b*b) / (b*b); A = 1. + uSq/16384.*(4096.+uSq*(-768.+uSq*(320.-175.*uSq))); B = uSq/1024. * (256.+uSq*(-128.+uSq*(74.-47.*uSq))); deltaSigma = B*sinSigma*(cos2SigmaM+B/4.*(cosSigma*(-1.+2.*cos2SigmaM*cos2SigmaM)- B/6.*cos2SigmaM*(-3.+4.*sinSigma*sinSigma)*(-3.+4.*cos2SigmaM*cos2SigmaM))); return b*A*(sigma-deltaSigma); } } } void distanceEllipsoid(int *n, double *lon1, double *lat1, double *lon2, double *lat2, double *a, double *b, double *f, int *m, double *dist) { if (*m > 0) { for(size_t i=0; i < *n; i++) { dist[i] = distVinEll(lon1[i], lat1[i], lon2[i], lat2[i], a[i], b[i], f[i]); } } } geosphere/src/MagneticCircle.cpp0000644000176200001440000000411014323400504016366 0ustar liggesusers/** * \file MagneticCircle.cpp * \brief Implementation for GeographicLib::MagneticCircle class * * Copyright (c) Charles Karney (2011-2021) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #include "MagneticCircle.h" #include #include #include "Geocentric.h" namespace GeographicLib { using namespace std; void MagneticCircle::FieldGeocentric(real slam, real clam, real& BX, real& BY, real& BZ, real& BXt, real& BYt, real& BZt) const { real BXc = 0, BYc = 0, BZc = 0; _circ0(slam, clam, BX, BY, BZ); _circ1(slam, clam, BXt, BYt, BZt); if (_constterm) _circ2(slam, clam, BXc, BYc, BZc); if (_interpolate) { BXt = (BXt - BX) / _dt0; BYt = (BYt - BY) / _dt0; BZt = (BZt - BZ) / _dt0; } BX += _t1 * BXt + BXc; BY += _t1 * BYt + BYc; BZ += _t1 * BZt + BZc; BXt *= - _a; BYt *= - _a; BZt *= - _a; BX *= - _a; BY *= - _a; BZ *= - _a; } void MagneticCircle::FieldGeocentric(real lon, real& BX, real& BY, real& BZ, real& BXt, real& BYt, real& BZt) const { real slam, clam; Math::sincosd(lon, slam, clam); FieldGeocentric(slam, clam, BX, BY, BZ, BXt, BYt, BZt); } void MagneticCircle::Field(real lon, bool diffp, real& Bx, real& By, real& Bz, real& Bxt, real& Byt, real& Bzt) const { real slam, clam; Math::sincosd(lon, slam, clam); real M[Geocentric::dim2_]; Geocentric::Rotation(_sphi, _cphi, slam, clam, M); real BX, BY, BZ, BXt, BYt, BZt; // Components in geocentric basis FieldGeocentric(slam, clam, BX, BY, BZ, BXt, BYt, BZt); if (diffp) Geocentric::Unrotate(M, BXt, BYt, BZt, Bxt, Byt, Bzt); Geocentric::Unrotate(M, BX, BY, BZ, Bx, By, Bz); } } // namespace GeographicLib geosphere/src/GeodesicLine.cpp0000644000176200001440000003102614323376011016062 0ustar liggesusers/** * \file GeodesicLine.cpp * \brief Implementation for GeographicLib::GeodesicLine class * * Copyright (c) Charles Karney (2009-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ * * This is a reformulation of the geodesic problem. The notation is as * follows: * - at a general point (no suffix or 1 or 2 as suffix) * - phi = latitude * - beta = latitude on auxiliary sphere * - omega = longitude on auxiliary sphere * - lambda = longitude * - alpha = azimuth of great circle * - sigma = arc length along great circle * - s = distance * - tau = scaled distance (= sigma at multiples of pi/2) * - at northwards equator crossing * - beta = phi = 0 * - omega = lambda = 0 * - alpha = alpha0 * - sigma = s = 0 * - a 12 suffix means a difference, e.g., s12 = s2 - s1. * - s and c prefixes mean sin and cos **********************************************************************/ #include "GeodesicLine.h" #if defined(_MSC_VER) // Squelch warnings about mixing enums # pragma warning (disable: 5054) #endif namespace GeographicLib { using namespace std; void GeodesicLine::LineInit(const Geodesic& g, real lat1, real lon1, real azi1, real salp1, real calp1, unsigned caps) { tiny_ = g.tiny_; _lat1 = Math::LatFix(lat1); _lon1 = lon1; _azi1 = azi1; _salp1 = salp1; _calp1 = calp1; _a = g._a; _f = g._f; _b = g._b; _c2 = g._c2; _f1 = g._f1; // Always allow latitude and azimuth and unrolling of longitude _caps = caps | LATITUDE | AZIMUTH | LONG_UNROLL; real cbet1, sbet1; Math::sincosd(Math::AngRound(_lat1), sbet1, cbet1); sbet1 *= _f1; // Ensure cbet1 = +epsilon at poles Math::norm(sbet1, cbet1); cbet1 = fmax(tiny_, cbet1); _dn1 = sqrt(1 + g._ep2 * Math::sq(sbet1)); // Evaluate alp0 from sin(alp1) * cos(bet1) = sin(alp0), _salp0 = _salp1 * cbet1; // alp0 in [0, pi/2 - |bet1|] // Alt: calp0 = hypot(sbet1, calp1 * cbet1). The following // is slightly better (consider the case salp1 = 0). _calp0 = hypot(_calp1, _salp1 * sbet1); // Evaluate sig with tan(bet1) = tan(sig1) * cos(alp1). // sig = 0 is nearest northward crossing of equator. // With bet1 = 0, alp1 = pi/2, we have sig1 = 0 (equatorial line). // With bet1 = pi/2, alp1 = -pi, sig1 = pi/2 // With bet1 = -pi/2, alp1 = 0 , sig1 = -pi/2 // Evaluate omg1 with tan(omg1) = sin(alp0) * tan(sig1). // With alp0 in (0, pi/2], quadrants for sig and omg coincide. // No atan2(0,0) ambiguity at poles since cbet1 = +epsilon. // With alp0 = 0, omg1 = 0 for alp1 = 0, omg1 = pi for alp1 = pi. _ssig1 = sbet1; _somg1 = _salp0 * sbet1; _csig1 = _comg1 = sbet1 != 0 || _calp1 != 0 ? cbet1 * _calp1 : 1; Math::norm(_ssig1, _csig1); // sig1 in (-pi, pi] // Math::norm(_somg1, _comg1); -- don't need to normalize! _k2 = Math::sq(_calp0) * g._ep2; real eps = _k2 / (2 * (1 + sqrt(1 + _k2)) + _k2); if (_caps & CAP_C1) { _aA1m1 = Geodesic::A1m1f(eps); Geodesic::C1f(eps, _cC1a); _bB11 = Geodesic::SinCosSeries(true, _ssig1, _csig1, _cC1a, nC1_); real s = sin(_bB11), c = cos(_bB11); // tau1 = sig1 + B11 _stau1 = _ssig1 * c + _csig1 * s; _ctau1 = _csig1 * c - _ssig1 * s; // Not necessary because C1pa reverts C1a // _bB11 = -SinCosSeries(true, _stau1, _ctau1, _cC1pa, nC1p_); } if (_caps & CAP_C1p) Geodesic::C1pf(eps, _cC1pa); if (_caps & CAP_C2) { _aA2m1 = Geodesic::A2m1f(eps); Geodesic::C2f(eps, _cC2a); _bB21 = Geodesic::SinCosSeries(true, _ssig1, _csig1, _cC2a, nC2_); } if (_caps & CAP_C3) { g.C3f(eps, _cC3a); _aA3c = -_f * _salp0 * g.A3f(eps); _bB31 = Geodesic::SinCosSeries(true, _ssig1, _csig1, _cC3a, nC3_-1); } if (_caps & CAP_C4) { g.C4f(eps, _cC4a); // Multiplier = a^2 * e^2 * cos(alpha0) * sin(alpha0) _aA4 = Math::sq(_a) * _calp0 * _salp0 * g._e2; _bB41 = Geodesic::SinCosSeries(false, _ssig1, _csig1, _cC4a, nC4_); } _a13 = _s13 = Math::NaN(); } GeodesicLine::GeodesicLine(const Geodesic& g, real lat1, real lon1, real azi1, unsigned caps) { azi1 = Math::AngNormalize(azi1); real salp1, calp1; // Guard against underflow in salp0. Also -0 is converted to +0. Math::sincosd(Math::AngRound(azi1), salp1, calp1); LineInit(g, lat1, lon1, azi1, salp1, calp1, caps); } GeodesicLine::GeodesicLine(const Geodesic& g, real lat1, real lon1, real azi1, real salp1, real calp1, unsigned caps, bool arcmode, real s13_a13) { LineInit(g, lat1, lon1, azi1, salp1, calp1, caps); GenSetDistance(arcmode, s13_a13); } Math::real GeodesicLine::GenPosition(bool arcmode, real s12_a12, unsigned outmask, real& lat2, real& lon2, real& azi2, real& s12, real& m12, real& M12, real& M21, real& S12) const { outmask &= _caps & OUT_MASK; if (!( Init() && (arcmode || (_caps & (OUT_MASK & DISTANCE_IN))) )) // Uninitialized or impossible distance calculation requested return Math::NaN(); // Avoid warning about uninitialized B12. real sig12, ssig12, csig12, B12 = 0, AB1 = 0; if (arcmode) { // Interpret s12_a12 as spherical arc length sig12 = s12_a12 * Math::degree(); Math::sincosd(s12_a12, ssig12, csig12); } else { // Interpret s12_a12 as distance real tau12 = s12_a12 / (_b * (1 + _aA1m1)), s = sin(tau12), c = cos(tau12); // tau2 = tau1 + tau12 B12 = - Geodesic::SinCosSeries(true, _stau1 * c + _ctau1 * s, _ctau1 * c - _stau1 * s, _cC1pa, nC1p_); sig12 = tau12 - (B12 - _bB11); ssig12 = sin(sig12); csig12 = cos(sig12); if (fabs(_f) > 0.01) { // Reverted distance series is inaccurate for |f| > 1/100, so correct // sig12 with 1 Newton iteration. The following table shows the // approximate maximum error for a = WGS_a() and various f relative to // GeodesicExact. // erri = the error in the inverse solution (nm) // errd = the error in the direct solution (series only) (nm) // errda = the error in the direct solution // (series + 1 Newton) (nm) // // f erri errd errda // -1/5 12e6 1.2e9 69e6 // -1/10 123e3 12e6 765e3 // -1/20 1110 108e3 7155 // -1/50 18.63 200.9 27.12 // -1/100 18.63 23.78 23.37 // -1/150 18.63 21.05 20.26 // 1/150 22.35 24.73 25.83 // 1/100 22.35 25.03 25.31 // 1/50 29.80 231.9 30.44 // 1/20 5376 146e3 10e3 // 1/10 829e3 22e6 1.5e6 // 1/5 157e6 3.8e9 280e6 real ssig2 = _ssig1 * csig12 + _csig1 * ssig12, csig2 = _csig1 * csig12 - _ssig1 * ssig12; B12 = Geodesic::SinCosSeries(true, ssig2, csig2, _cC1a, nC1_); real serr = (1 + _aA1m1) * (sig12 + (B12 - _bB11)) - s12_a12 / _b; sig12 = sig12 - serr / sqrt(1 + _k2 * Math::sq(ssig2)); ssig12 = sin(sig12); csig12 = cos(sig12); // Update B12 below } } real ssig2, csig2, sbet2, cbet2, salp2, calp2; // sig2 = sig1 + sig12 ssig2 = _ssig1 * csig12 + _csig1 * ssig12; csig2 = _csig1 * csig12 - _ssig1 * ssig12; real dn2 = sqrt(1 + _k2 * Math::sq(ssig2)); if (outmask & (DISTANCE | REDUCEDLENGTH | GEODESICSCALE)) { if (arcmode || fabs(_f) > 0.01) B12 = Geodesic::SinCosSeries(true, ssig2, csig2, _cC1a, nC1_); AB1 = (1 + _aA1m1) * (B12 - _bB11); } // sin(bet2) = cos(alp0) * sin(sig2) sbet2 = _calp0 * ssig2; // Alt: cbet2 = hypot(csig2, salp0 * ssig2); cbet2 = hypot(_salp0, _calp0 * csig2); if (cbet2 == 0) // I.e., salp0 = 0, csig2 = 0. Break the degeneracy in this case cbet2 = csig2 = tiny_; // tan(alp0) = cos(sig2)*tan(alp2) salp2 = _salp0; calp2 = _calp0 * csig2; // No need to normalize if (outmask & DISTANCE) s12 = arcmode ? _b * ((1 + _aA1m1) * sig12 + AB1) : s12_a12; if (outmask & LONGITUDE) { // tan(omg2) = sin(alp0) * tan(sig2) real somg2 = _salp0 * ssig2, comg2 = csig2, // No need to normalize E = copysign(real(1), _salp0); // east-going? // omg12 = omg2 - omg1 real omg12 = outmask & LONG_UNROLL ? E * (sig12 - (atan2( ssig2, csig2) - atan2( _ssig1, _csig1)) + (atan2(E * somg2, comg2) - atan2(E * _somg1, _comg1))) : atan2(somg2 * _comg1 - comg2 * _somg1, comg2 * _comg1 + somg2 * _somg1); real lam12 = omg12 + _aA3c * ( sig12 + (Geodesic::SinCosSeries(true, ssig2, csig2, _cC3a, nC3_-1) - _bB31)); real lon12 = lam12 / Math::degree(); lon2 = outmask & LONG_UNROLL ? _lon1 + lon12 : Math::AngNormalize(Math::AngNormalize(_lon1) + Math::AngNormalize(lon12)); } if (outmask & LATITUDE) lat2 = Math::atan2d(sbet2, _f1 * cbet2); if (outmask & AZIMUTH) azi2 = Math::atan2d(salp2, calp2); if (outmask & (REDUCEDLENGTH | GEODESICSCALE)) { real B22 = Geodesic::SinCosSeries(true, ssig2, csig2, _cC2a, nC2_), AB2 = (1 + _aA2m1) * (B22 - _bB21), J12 = (_aA1m1 - _aA2m1) * sig12 + (AB1 - AB2); if (outmask & REDUCEDLENGTH) // Add parens around (_csig1 * ssig2) and (_ssig1 * csig2) to ensure // accurate cancellation in the case of coincident points. m12 = _b * ((dn2 * (_csig1 * ssig2) - _dn1 * (_ssig1 * csig2)) - _csig1 * csig2 * J12); if (outmask & GEODESICSCALE) { real t = _k2 * (ssig2 - _ssig1) * (ssig2 + _ssig1) / (_dn1 + dn2); M12 = csig12 + (t * ssig2 - csig2 * J12) * _ssig1 / _dn1; M21 = csig12 - (t * _ssig1 - _csig1 * J12) * ssig2 / dn2; } } if (outmask & AREA) { real B42 = Geodesic::SinCosSeries(false, ssig2, csig2, _cC4a, nC4_); real salp12, calp12; if (_calp0 == 0 || _salp0 == 0) { // alp12 = alp2 - alp1, used in atan2 so no need to normalize salp12 = salp2 * _calp1 - calp2 * _salp1; calp12 = calp2 * _calp1 + salp2 * _salp1; // We used to include here some patch up code that purported to deal // with nearly meridional geodesics properly. However, this turned out // to be wrong once _salp1 = -0 was allowed (via // Geodesic::InverseLine). In fact, the calculation of {s,c}alp12 // was already correct (following the IEEE rules for handling signed // zeros). So the patch up code was unnecessary (as well as // dangerous). } else { // tan(alp) = tan(alp0) * sec(sig) // tan(alp2-alp1) = (tan(alp2) -tan(alp1)) / (tan(alp2)*tan(alp1)+1) // = calp0 * salp0 * (csig1-csig2) / (salp0^2 + calp0^2 * csig1*csig2) // If csig12 > 0, write // csig1 - csig2 = ssig12 * (csig1 * ssig12 / (1 + csig12) + ssig1) // else // csig1 - csig2 = csig1 * (1 - csig12) + ssig12 * ssig1 // No need to normalize salp12 = _calp0 * _salp0 * (csig12 <= 0 ? _csig1 * (1 - csig12) + ssig12 * _ssig1 : ssig12 * (_csig1 * ssig12 / (1 + csig12) + _ssig1)); calp12 = Math::sq(_salp0) + Math::sq(_calp0) * _csig1 * csig2; } S12 = _c2 * atan2(salp12, calp12) + _aA4 * (B42 - _bB41); } return arcmode ? s12_a12 : sig12 / Math::degree(); } void GeodesicLine::SetDistance(real s13) { _s13 = s13; real t; // This will set _a13 to NaN if the GeodesicLine doesn't have the // DISTANCE_IN capability. _a13 = GenPosition(false, _s13, 0u, t, t, t, t, t, t, t, t); } void GeodesicLine::SetArc(real a13) { _a13 = a13; // In case the GeodesicLine doesn't have the DISTANCE capability. _s13 = Math::NaN(); real t; GenPosition(true, _a13, DISTANCE, t, t, t, _s13, t, t, t, t); } void GeodesicLine::GenSetDistance(bool arcmode, real s13_a13) { arcmode ? SetArc(s13_a13) : SetDistance(s13_a13); } } // namespace GeographicLib geosphere/src/MGRS.h0000644000176200001440000004077014323377037013764 0ustar liggesusers/** * \file MGRS.hpp * \brief Header for GeographicLib::MGRS class * * Copyright (c) Charles Karney (2008-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #if !defined(GEOGRAPHICLIB_MGRS_HPP) #define GEOGRAPHICLIB_MGRS_HPP 1 #include "Constants.h" #include "UTMUPS.h" #if defined(_MSC_VER) // Squelch warnings about dll vs string # pragma warning (push) # pragma warning (disable: 4251) #endif namespace GeographicLib { /** * \brief Convert between UTM/UPS and %MGRS * * MGRS is defined in Chapter 3 of * - J. W. Hager, L. L. Fry, S. S. Jacks, D. R. Hill, * * Datums, Ellipsoids, Grids, and Grid Reference Systems, * Defense Mapping Agency, Technical Manual TM8358.1 (1990). * . * This document has been updated by the two NGA documents * - * Universal Grids and Grid Reference Systems, * NGA.STND.0037 (2014). * - * The Universal Grids and the Transverse Mercator and Polar Stereographic * Map Projections, NGA.SIG.0012 (2014). * * This implementation has the following properties: * - The conversions are closed, i.e., output from Forward is legal input for * Reverse and vice versa. Conversion in both directions preserve the * UTM/UPS selection and the UTM zone. * - Forward followed by Reverse and vice versa is approximately the * identity. (This is affected in predictable ways by errors in * determining the latitude band and by loss of precision in the MGRS * coordinates.) * - The trailing digits produced by Forward are consistent as the precision * is varied. Specifically, the digits are obtained by operating on the * easting with ⌊106 x⌋ and extracting the * required digits from the resulting number (and similarly for the * northing). * - All MGRS coordinates truncate to legal 100 km blocks. All MGRS * coordinates with a legal 100 km block prefix are legal (even though the * latitude band letter may now belong to a neighboring band). * - The range of UTM/UPS coordinates allowed for conversion to MGRS * coordinates is the maximum consistent with staying within the letter * ranges of the MGRS scheme. * - All the transformations are implemented as static methods in the MGRS * class. * * The NGA software package * geotrans * also provides conversions to and from MGRS. Version 3.0 (and earlier) * suffers from some drawbacks: * - Inconsistent rules are used to determine the whether a particular MGRS * coordinate is legal. A more systematic approach is taken here. * - The underlying projections are not very accurately implemented. * * Example of use: * \include example-MGRS.cpp **********************************************************************/ class GEOGRAPHICLIB_EXPORT MGRS { private: typedef Math::real real; static const char* const hemispheres_; static const char* const utmcols_[3]; static const char* const utmrow_; static const char* const upscols_[4]; static const char* const upsrows_[2]; static const char* const latband_; static const char* const upsband_; static const char* const digits_; static const int mineasting_[4]; static const int maxeasting_[4]; static const int minnorthing_[4]; static const int maxnorthing_[4]; #if GEOGRAPHICLIB_PRECISION == 4 // Work around an enum lossage introduced in boost 1.76 // https://github.com/boostorg/multiprecision/issues/324 // and fixed in // https://github.com/boostorg/multiprecision/pull/333 static const int #else enum { #endif base_ = 10, // Top-level tiles are 10^5 m = 100 km on a side tilelevel_ = 5, // Period of UTM row letters utmrowperiod_ = 20, // Row letters are shifted by 5 for even zones utmevenrowshift_ = 5, // Maximum precision is um maxprec_ = 5 + 6, // For generating digits at maxprec mult_ = 1000000 #if GEOGRAPHICLIB_PRECISION == 4 ; #else }; #endif static void CheckCoords(bool utmp, bool& northp, real& x, real& y); static int UTMRow(int iband, int icol, int irow); friend class UTMUPS; // UTMUPS::StandardZone calls LatitudeBand // Return latitude band number [-10, 10) for the given latitude (degrees). // The bands are reckoned in include their southern edges. static int LatitudeBand(real lat) { using std::floor; int ilat = int(floor(lat)); return (std::max)(-10, (std::min)(9, (ilat + 80)/8 - 10)); } // Return approximate latitude band number [-10, 10) for the given northing // (meters). With this rule, each 100km tile would have a unique band // letter corresponding to the latitude at the center of the tile. This // function isn't currently used. static int ApproxLatitudeBand(real y) { // northing at tile center in units of tile = 100km using std::floor; using std::fabs; using std::fmin; real ya = floor( fmin(real(88), fabs(y / real(tile_))) ) + real(0.5); // convert to lat (mult by 90/100) and then to band (divide by 8) // the +1 fine tunes the boundary between bands 3 and 4 int b = int(floor( ((ya * 9 + 1) / 10) / 8 )); // For the northern hemisphere we have // band rows num // N 0 0:8 9 // P 1 9:17 9 // Q 2 18:26 9 // R 3 27:34 8 // S 4 35:43 9 // T 5 44:52 9 // U 6 53:61 9 // V 7 62:70 9 // W 8 71:79 9 // X 9 80:94 15 return y >= 0 ? b : -(b + 1); } // UTMUPS accesses these enums #if GEOGRAPHICLIB_PRECISION == 4 // Work around an enum lossage introduced in boost 1.76 // https://github.com/boostorg/multiprecision/issues/324 // and fixed in // https://github.com/boostorg/multiprecision/pull/333 static const int #else enum { #endif tile_ = 100000, // Size MGRS blocks minutmcol_ = 1, maxutmcol_ = 9, minutmSrow_ = 10, maxutmSrow_ = 100, // Also used for UTM S false northing minutmNrow_ = 0, // Also used for UTM N false northing maxutmNrow_ = 95, minupsSind_ = 8, // These 4 ind's apply to easting and northing maxupsSind_ = 32, minupsNind_ = 13, maxupsNind_ = 27, upseasting_ = 20, // Also used for UPS false northing utmeasting_ = 5, // UTM false easting // Difference between S hemisphere northing and N hemisphere northing utmNshift_ = (maxutmSrow_ - minutmNrow_) * tile_ #if GEOGRAPHICLIB_PRECISION == 4 ; #else }; #endif MGRS() = delete; // Disable constructor public: /** * Convert UTM or UPS coordinate to an MGRS coordinate. * * @param[in] zone UTM zone (zero means UPS). * @param[in] northp hemisphere (true means north, false means south). * @param[in] x easting of point (meters). * @param[in] y northing of point (meters). * @param[in] prec precision relative to 100 km. * @param[out] mgrs MGRS string. * @exception GeographicErr if \e zone, \e x, or \e y is outside its * allowed range. * @exception GeographicErr if the memory for the MGRS string can't be * allocated. * * \e prec specifies the precision of the MGRS string as follows: * - \e prec = −1 (min), only the grid zone is returned * - \e prec = 0, 100 km * - \e prec = 1, 10 km * - \e prec = 2, 1 km * - \e prec = 3, 100 m * - \e prec = 4, 10 m * - \e prec = 5, 1 m * - \e prec = 6, 0.1 m * - … * - \e prec = 11 (max), 1 μm * * UTM eastings are allowed to be in the range [100 km, 900 km], northings * are allowed to be in in [0 km, 9500 km] for the northern hemisphere and * in [1000 km, 10000 km] for the southern hemisphere. (However UTM * northings can be continued across the equator. So the actual limits on * the northings are [−9000 km, 9500 km] for the "northern" * hemisphere and [1000 km, 19500 km] for the "southern" hemisphere.) * * UPS eastings/northings are allowed to be in the range [1300 km, 2700 km] * in the northern hemisphere and in [800 km, 3200 km] in the southern * hemisphere. * * The ranges are 100 km more restrictive than for the conversion between * geographic coordinates and UTM and UPS given by UTMUPS. These * restrictions are dictated by the allowed letters in MGRS coordinates. * The choice of 9500 km for the maximum northing for northern hemisphere * and of 1000 km as the minimum northing for southern hemisphere provide * at least 0.5 degree extension into standard UPS zones. The upper ends * of the ranges for the UPS coordinates is dictated by requiring symmetry * about the meridians 0E and 90E. * * All allowed UTM and UPS coordinates may now be converted to legal MGRS * coordinates with the proviso that eastings and northings on the upper * boundaries are silently reduced by about 4 nm (4 nanometers) to place * them \e within the allowed range. (This includes reducing a southern * hemisphere northing of 10000 km by 4 nm so that it is placed in latitude * band M.) The UTM or UPS coordinates are truncated to requested * precision to determine the MGRS coordinate. Thus in UTM zone 38n, the * square area with easting in [444 km, 445 km) and northing in [3688 km, * 3689 km) maps to MGRS coordinate 38SMB4488 (at \e prec = 2, 1 km), * Khulani Sq., Baghdad. * * The UTM/UPS selection and the UTM zone is preserved in the conversion to * MGRS coordinate. Thus for \e zone > 0, the MGRS coordinate begins with * the zone number followed by one of [C--M] for the southern * hemisphere and [N--X] for the northern hemisphere. For \e zone = * 0, the MGRS coordinates begins with one of [AB] for the southern * hemisphere and [XY] for the northern hemisphere. * * The conversion to the MGRS is exact for prec in [0, 5] except that a * neighboring latitude band letter may be given if the point is within 5nm * of a band boundary. For prec in [6, 11], the conversion is accurate to * roundoff. * * If \e prec = −1, then the "grid zone designation", e.g., 18T, is * returned. This consists of the UTM zone number (absent for UPS) and the * first letter of the MGRS string which labels the latitude band for UTM * and the hemisphere for UPS. * * If \e x or \e y is NaN or if \e zone is UTMUPS::INVALID, the returned * MGRS string is "INVALID". * * Return the result via a reference argument to avoid the overhead of * allocating a potentially large number of small strings. If an error is * thrown, then \e mgrs is unchanged. **********************************************************************/ static void Forward(int zone, bool northp, real x, real y, int prec, std::string& mgrs); /** * Convert UTM or UPS coordinate to an MGRS coordinate when the latitude is * known. * * @param[in] zone UTM zone (zero means UPS). * @param[in] northp hemisphere (true means north, false means south). * @param[in] x easting of point (meters). * @param[in] y northing of point (meters). * @param[in] lat latitude (degrees). * @param[in] prec precision relative to 100 km. * @param[out] mgrs MGRS string. * @exception GeographicErr if \e zone, \e x, or \e y is outside its * allowed range. * @exception GeographicErr if \e lat is inconsistent with the given UTM * coordinates. * @exception std::bad_alloc if the memory for \e mgrs can't be allocated. * * The latitude is ignored for \e zone = 0 (UPS); otherwise the latitude is * used to determine the latitude band and this is checked for consistency * using the same tests as Reverse. **********************************************************************/ static void Forward(int zone, bool northp, real x, real y, real lat, int prec, std::string& mgrs); /** * Convert a MGRS coordinate to UTM or UPS coordinates. * * @param[in] mgrs MGRS string. * @param[out] zone UTM zone (zero means UPS). * @param[out] northp hemisphere (true means north, false means south). * @param[out] x easting of point (meters). * @param[out] y northing of point (meters). * @param[out] prec precision relative to 100 km. * @param[in] centerp if true (default), return center of the MGRS square, * else return SW (lower left) corner. * @exception GeographicErr if \e mgrs is illegal. * * All conversions from MGRS to UTM/UPS are permitted provided the MGRS * coordinate is a possible result of a conversion in the other direction. * (The leading 0 may be dropped from an input MGRS coordinate for UTM * zones 1--9.) In addition, MGRS coordinates with a neighboring * latitude band letter are permitted provided that some portion of the * 100 km block is within the given latitude band. Thus * - 38VLS and 38WLS are allowed (latitude 64N intersects the square * 38[VW]LS); but 38VMS is not permitted (all of 38WMS is north of 64N) * - 38MPE and 38NPF are permitted (they straddle the equator); but 38NPE * and 38MPF are not permitted (the equator does not intersect either * block). * - Similarly ZAB and YZB are permitted (they straddle the prime * meridian); but YAB and ZZB are not (the prime meridian does not * intersect either block). * * The UTM/UPS selection and the UTM zone is preserved in the conversion * from MGRS coordinate. The conversion is exact for prec in [0, 5]. With * \e centerp = true, the conversion from MGRS to geographic and back is * stable. This is not assured if \e centerp = false. * * If a "grid zone designation" (for example, 18T or A) is given, then some * suitable (but essentially arbitrary) point within that grid zone is * returned. The main utility of the conversion is to allow \e zone and \e * northp to be determined. In this case, the \e centerp parameter is * ignored and \e prec is set to −1. * * If the first 3 characters of \e mgrs are "INV", then \e x and \e y are * set to NaN, \e zone is set to UTMUPS::INVALID, and \e prec is set to * −2. * * If an exception is thrown, then the arguments are unchanged. **********************************************************************/ static void Reverse(const std::string& mgrs, int& zone, bool& northp, real& x, real& y, int& prec, bool centerp = true); /** \name Inspector functions **********************************************************************/ ///@{ /** * @return \e a the equatorial radius of the WGS84 ellipsoid (meters). * * (The WGS84 value is returned because the UTM and UPS projections are * based on this ellipsoid.) **********************************************************************/ static Math::real EquatorialRadius() { return UTMUPS::EquatorialRadius(); } /** * @return \e f the flattening of the WGS84 ellipsoid. * * (The WGS84 value is returned because the UTM and UPS projections are * based on this ellipsoid.) **********************************************************************/ static Math::real Flattening() { return UTMUPS::Flattening(); } ///@} /** * Perform some checks on the UTMUPS coordinates on this ellipsoid. Throw * an error if any of the assumptions made in the MGRS class is not true. * This check needs to be carried out if the ellipsoid parameters (or the * UTM/UPS scales) are ever changed. **********************************************************************/ static void Check(); }; } // namespace GeographicLib #if defined(_MSC_VER) # pragma warning (pop) #endif #endif // GEOGRAPHICLIB_MGRS_HPP geosphere/src/Gnomonic.h0000644000176200001440000002431014323401345014743 0ustar liggesusers/** * \file Gnomonic.hpp * \brief Header for GeographicLib::Gnomonic class * * Copyright (c) Charles Karney (2010-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #if !defined(GEOGRAPHICLIB_GNOMONIC_HPP) #define GEOGRAPHICLIB_GNOMONIC_HPP 1 #include "Geodesic.h" #include "GeodesicLine.h" #include "Constants.h" namespace GeographicLib { /** * \brief %Gnomonic projection * * %Gnomonic projection centered at an arbitrary position \e C on the * ellipsoid. This projection is derived in Section 8 of * - C. F. F. Karney, * * Algorithms for geodesics, * J. Geodesy 87, 43--55 (2013); * DOI: * 10.1007/s00190-012-0578-z; * addenda: * * geod-addenda.html. * . * The projection of \e P is defined as follows: compute the geodesic line * from \e C to \e P; compute the reduced length \e m12, geodesic scale \e * M12, and ρ = m12/\e M12; finally \e x = ρ sin \e azi1; \e * y = ρ cos \e azi1, where \e azi1 is the azimuth of the geodesic at \e * C. The Gnomonic::Forward and Gnomonic::Reverse methods also return the * azimuth \e azi of the geodesic at \e P and reciprocal scale \e rk in the * azimuthal direction. The scale in the radial direction if * 1/rk2. * * For a sphere, ρ is reduces to \e a tan(s12/a), where \e * s12 is the length of the geodesic from \e C to \e P, and the gnomonic * projection has the property that all geodesics appear as straight lines. * For an ellipsoid, this property holds only for geodesics interesting the * centers. However geodesic segments close to the center are approximately * straight. * * Consider a geodesic segment of length \e l. Let \e T be the point on the * geodesic (extended if necessary) closest to \e C the center of the * projection and \e t be the distance \e CT. To lowest order, the maximum * deviation (as a true distance) of the corresponding gnomonic line segment * (i.e., with the same end points) from the geodesic is
*
* (K(T) - K(C)) * l2 \e t / 32.
*
* where \e K is the Gaussian curvature. * * This result applies for any surface. For an ellipsoid of revolution, * consider all geodesics whose end points are within a distance \e r of \e * C. For a given \e r, the deviation is maximum when the latitude of \e C * is 45°, when endpoints are a distance \e r away, and when their * azimuths from the center are ± 45° or ± 135°. * To lowest order in \e r and the flattening \e f, the deviation is \e f * (r/2a)3 \e r. * * The conversions all take place using a Geodesic object (by default * Geodesic::WGS84()). For more information on geodesics see \ref geodesic. * * \warning The definition of this projection for a sphere is * standard. However, there is no standard for how it should be extended to * an ellipsoid. The choices are: * - Declare that the projection is undefined for an ellipsoid. * - Project to a tangent plane from the center of the ellipsoid. This * causes great ellipses to appear as straight lines in the projection; * i.e., it generalizes the spherical great circle to a great ellipse. * This was proposed by independently by Bowring and Williams in 1997. * - Project to the conformal sphere with the constant of integration chosen * so that the values of the latitude match for the center point and * perform a central projection onto the plane tangent to the conformal * sphere at the center point. This causes normal sections through the * center point to appear as straight lines in the projection; i.e., it * generalizes the spherical great circle to a normal section. This was * proposed by I. G. Letoval'tsev, Generalization of the gnomonic * projection for a spheroid and the principal geodetic problems involved * in the alignment of surface routes, Geodesy and Aerophotography (5), * 271--274 (1963). * - The projection given here. This causes geodesics close to the center * point to appear as straight lines in the projection; i.e., it * generalizes the spherical great circle to a geodesic. * * Example of use: * \include example-Gnomonic.cpp * * GeodesicProj is a command-line utility * providing access to the functionality of AzimuthalEquidistant, Gnomonic, * and CassiniSoldner. **********************************************************************/ class GEOGRAPHICLIB_EXPORT Gnomonic { private: typedef Math::real real; real eps0_, eps_; Geodesic _earth; real _a, _f; // numit_ increased from 10 to 20 to fix convergence failure with high // precision (e.g., GEOGRAPHICLIB_DIGITS=2000) calculations. Reverse uses // Newton's method which converges quadratically and so numit_ = 10 would // normally be big enough. However, since the Geodesic class is based on a // series it is of limited accuracy; in particular, the derivative rules // used by Reverse only hold approximately. Consequently, after a few // iterations, the convergence in the Reverse falls back to improvements in // each step by a constant (albeit small) factor. static const int numit_ = 20; public: /** * Constructor for Gnomonic. * * @param[in] earth the Geodesic object to use for geodesic calculations. * By default this uses the WGS84 ellipsoid. **********************************************************************/ explicit Gnomonic(const Geodesic& earth = Geodesic::WGS84()); /** * Forward projection, from geographic to gnomonic. * * @param[in] lat0 latitude of center point of projection (degrees). * @param[in] lon0 longitude of center point of projection (degrees). * @param[in] lat latitude of point (degrees). * @param[in] lon longitude of point (degrees). * @param[out] x easting of point (meters). * @param[out] y northing of point (meters). * @param[out] azi azimuth of geodesic at point (degrees). * @param[out] rk reciprocal of azimuthal scale at point. * * \e lat0 and \e lat should be in the range [−90°, 90°]. * The scale of the projection is 1/rk2 in the "radial" * direction, \e azi clockwise from true north, and is 1/\e rk in the * direction perpendicular to this. If the point lies "over the horizon", * i.e., if \e rk ≤ 0, then NaNs are returned for \e x and \e y (the * correct values are returned for \e azi and \e rk). A call to Forward * followed by a call to Reverse will return the original (\e lat, \e lon) * (to within roundoff) provided the point in not over the horizon. **********************************************************************/ void Forward(real lat0, real lon0, real lat, real lon, real& x, real& y, real& azi, real& rk) const; /** * Reverse projection, from gnomonic to geographic. * * @param[in] lat0 latitude of center point of projection (degrees). * @param[in] lon0 longitude of center point of projection (degrees). * @param[in] x easting of point (meters). * @param[in] y northing of point (meters). * @param[out] lat latitude of point (degrees). * @param[out] lon longitude of point (degrees). * @param[out] azi azimuth of geodesic at point (degrees). * @param[out] rk reciprocal of azimuthal scale at point. * * \e lat0 should be in the range [−90°, 90°]. \e lat will * be in the range [−90°, 90°] and \e lon will be in the * range [−180°, 180°]. The scale of the projection is * 1/rk2 in the "radial" direction, \e azi clockwise from * true north, and is 1/\e rk in the direction perpendicular to this. Even * though all inputs should return a valid \e lat and \e lon, it's possible * that the procedure fails to converge for very large \e x or \e y; in * this case NaNs are returned for all the output arguments. A call to * Reverse followed by a call to Forward will return the original (\e x, \e * y) (to roundoff). **********************************************************************/ void Reverse(real lat0, real lon0, real x, real y, real& lat, real& lon, real& azi, real& rk) const; /** * Gnomonic::Forward without returning the azimuth and scale. **********************************************************************/ void Forward(real lat0, real lon0, real lat, real lon, real& x, real& y) const { real azi, rk; Forward(lat0, lon0, lat, lon, x, y, azi, rk); } /** * Gnomonic::Reverse without returning the azimuth and scale. **********************************************************************/ void Reverse(real lat0, real lon0, real x, real y, real& lat, real& lon) const { real azi, rk; Reverse(lat0, lon0, x, y, lat, lon, azi, rk); } /** \name Inspector functions **********************************************************************/ ///@{ /** * @return \e a the equatorial radius of the ellipsoid (meters). This is * the value inherited from the Geodesic object used in the constructor. **********************************************************************/ Math::real EquatorialRadius() const { return _earth.EquatorialRadius(); } /** * @return \e f the flattening of the ellipsoid. This is the value * inherited from the Geodesic object used in the constructor. **********************************************************************/ Math::real Flattening() const { return _earth.Flattening(); } ///@} }; } // namespace GeographicLib #endif // GEOGRAPHICLIB_GNOMONIC_HPP geosphere/src/Geoid.cpp0000644000176200001440000004133514323376045014572 0ustar liggesusers/** * \file Geoid.cpp * \brief Implementation for GeographicLib::Geoid class * * Copyright (c) Charles Karney (2009-2020) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #include "Geoid.h" // For getenv #include #include "Utility.h" #if !defined(GEOGRAPHICLIB_DATA) # if defined(_WIN32) # define GEOGRAPHICLIB_DATA "C:/ProgramData/GeographicLib" # else # define GEOGRAPHICLIB_DATA "/usr/local/share/GeographicLib" # endif #endif #if !defined(GEOGRAPHICLIB_GEOID_DEFAULT_NAME) # define GEOGRAPHICLIB_GEOID_DEFAULT_NAME "egm96-5" #endif #if defined(_MSC_VER) // Squelch warnings about unsafe use of getenv and enum-float expressions # pragma warning (disable: 4996 5055) #endif namespace GeographicLib { using namespace std; // This is the transfer matrix for a 3rd order fit with a 12-point stencil // with weights // // \x -1 0 1 2 // y // -1 . 1 1 . // 0 1 2 2 1 // 1 1 2 2 1 // 2 . 1 1 . // // A algorithm for n-dimensional polynomial fits is described in // F. H. Lesh, // Multi-dimensional least-squares polynomial curve fitting, // CACM 2, 29-30 (1959). // https://doi.org/10.1145/368424.368443 // // Here's the Maxima code to generate this matrix: // // /* The stencil and the weights */ // xarr:[ // 0, 1, // -1, 0, 1, 2, // -1, 0, 1, 2, // 0, 1]$ // yarr:[ // -1,-1, // 0, 0, 0, 0, // 1, 1, 1, 1, // 2, 2]$ // warr:[ // 1, 1, // 1, 2, 2, 1, // 1, 2, 2, 1, // 1, 1]$ // // /* [x exponent, y exponent] for cubic fit */ // pows:[ // [0,0], // [1,0],[0,1], // [2,0],[1,1],[0,2], // [3,0],[2,1],[1,2],[0,3]]$ // // basisvec(x,y,pows):=map(lambda([ex],(if ex[1]=0 then 1 else x^ex[1])* // (if ex[2]=0 then 1 else y^ex[2])),pows)$ // addterm(x,y,f,w,pows):=block([a,b,bb:basisvec(x,y,pows)], // a:w*(transpose(bb).bb), // b:(w*f) * bb, // [a,b])$ // // c3row(k):=block([a,b,c,pows:pows,n], // n:length(pows), // a:zeromatrix(n,n), // b:copylist(part(a,1)), // c:[a,b], // for i:1 thru length(xarr) do // c:c+addterm(xarr[i],yarr[i],if i=k then 1 else 0,warr[i],pows), // a:c[1],b:c[2], // part(transpose( a^^-1 . transpose(b)),1))$ // c3:[]$ // for k:1 thru length(warr) do c3:endcons(c3row(k),c3)$ // c3:apply(matrix,c3)$ // c0:part(ratsimp( // genmatrix(yc,1,length(warr)).abs(c3).genmatrix(yd,length(pows),1)),2)$ // c3:c0*c3$ const int Geoid::c0_ = 240; // Common denominator const int Geoid::c3_[stencilsize_ * nterms_] = { 9, -18, -88, 0, 96, 90, 0, 0, -60, -20, -9, 18, 8, 0, -96, 30, 0, 0, 60, -20, 9, -88, -18, 90, 96, 0, -20, -60, 0, 0, 186, -42, -42, -150, -96, -150, 60, 60, 60, 60, 54, 162, -78, 30, -24, -90, -60, 60, -60, 60, -9, -32, 18, 30, 24, 0, 20, -60, 0, 0, -9, 8, 18, 30, -96, 0, -20, 60, 0, 0, 54, -78, 162, -90, -24, 30, 60, -60, 60, -60, -54, 78, 78, 90, 144, 90, -60, -60, -60, -60, 9, -8, -18, -30, -24, 0, 20, 60, 0, 0, -9, 18, -32, 0, 24, 30, 0, 0, -60, 20, 9, -18, -8, 0, -24, -30, 0, 0, 60, 20, }; // Like c3, but with the coeffs of x, x^2, and x^3 constrained to be zero. // Use this at the N pole so that the height in independent of the longitude // there. // // Here's the Maxima code to generate this matrix (continued from above). // // /* figure which terms to exclude so that fit is indep of x at y=0 */ // mask:part(zeromatrix(1,length(pows)),1)+1$ // for i:1 thru length(pows) do // if pows[i][1]>0 and pows[i][2]=0 then mask[i]:0$ // // /* Same as c3row but with masked pows. */ // c3nrow(k):=block([a,b,c,powsa:[],n,d,e], // for i:1 thru length(mask) do if mask[i]>0 then // powsa:endcons(pows[i],powsa), // n:length(powsa), // a:zeromatrix(n,n), // b:copylist(part(a,1)), // c:[a,b], // for i:1 thru length(xarr) do // c:c+addterm(xarr[i],yarr[i],if i=k then 1 else 0,warr[i],powsa), // a:c[1],b:c[2], // d:part(transpose( a^^-1 . transpose(b)),1), // e:[], // for i:1 thru length(mask) do // if mask[i]>0 then (e:endcons(first(d),e),d:rest(d)) else e:endcons(0,e), // e)$ // c3n:[]$ // for k:1 thru length(warr) do c3n:endcons(c3nrow(k),c3n)$ // c3n:apply(matrix,c3n)$ // c0n:part(ratsimp( // genmatrix(yc,1,length(warr)).abs(c3n).genmatrix(yd,length(pows),1)),2)$ // c3n:c0n*c3n$ const int Geoid::c0n_ = 372; // Common denominator const int Geoid::c3n_[stencilsize_ * nterms_] = { 0, 0, -131, 0, 138, 144, 0, 0, -102, -31, 0, 0, 7, 0, -138, 42, 0, 0, 102, -31, 62, 0, -31, 0, 0, -62, 0, 0, 0, 31, 124, 0, -62, 0, 0, -124, 0, 0, 0, 62, 124, 0, -62, 0, 0, -124, 0, 0, 0, 62, 62, 0, -31, 0, 0, -62, 0, 0, 0, 31, 0, 0, 45, 0, -183, -9, 0, 93, 18, 0, 0, 0, 216, 0, 33, 87, 0, -93, 12, -93, 0, 0, 156, 0, 153, 99, 0, -93, -12, -93, 0, 0, -45, 0, -3, 9, 0, 93, -18, 0, 0, 0, -55, 0, 48, 42, 0, 0, -84, 31, 0, 0, -7, 0, -48, -42, 0, 0, 84, 31, }; // Like c3n, but y -> 1-y so that h is independent of x at y = 1. Use this // at the S pole so that the height in independent of the longitude there. // // Here's the Maxima code to generate this matrix (continued from above). // // /* Transform c3n to c3s by transforming y -> 1-y */ // vv:[ // v[11],v[12], // v[7],v[8],v[9],v[10], // v[3],v[4],v[5],v[6], // v[1],v[2]]$ // poly:expand(vv.(c3n/c0n).transpose(basisvec(x,1-y,pows)))$ // c3sf[i,j]:=coeff(coeff(coeff(poly,v[i]),x,pows[j][1]),y,pows[j][2])$ // c3s:genmatrix(c3sf,length(vv),length(pows))$ // c0s:part(ratsimp( // genmatrix(yc,1,length(warr)).abs(c3s).genmatrix(yd,length(pows),1)),2)$ // c3s:c0s*c3s$ const int Geoid::c0s_ = 372; // Common denominator const int Geoid::c3s_[stencilsize_ * nterms_] = { 18, -36, -122, 0, 120, 135, 0, 0, -84, -31, -18, 36, -2, 0, -120, 51, 0, 0, 84, -31, 36, -165, -27, 93, 147, -9, 0, -93, 18, 0, 210, 45, -111, -93, -57, -192, 0, 93, 12, 93, 162, 141, -75, -93, -129, -180, 0, 93, -12, 93, -36, -21, 27, 93, 39, 9, 0, -93, -18, 0, 0, 0, 62, 0, 0, 31, 0, 0, 0, -31, 0, 0, 124, 0, 0, 62, 0, 0, 0, -62, 0, 0, 124, 0, 0, 62, 0, 0, 0, -62, 0, 0, 62, 0, 0, 31, 0, 0, 0, -31, -18, 36, -64, 0, 66, 51, 0, 0, -102, 31, 18, -36, 2, 0, -66, -51, 0, 0, 102, 31, }; Geoid::Geoid(const std::string& name, const std::string& path, bool cubic, bool threadsafe) : _name(name) , _dir(path) , _cubic(cubic) , _a( Constants::WGS84_a() ) , _e2( (2 - Constants::WGS84_f()) * Constants::WGS84_f() ) , _degree( Math::degree() ) , _eps( sqrt(numeric_limits::epsilon()) ) , _threadsafe(false) // Set after cache is read { static_assert(sizeof(pixel_t) == pixel_size_, "pixel_t has the wrong size"); if (_dir.empty()) _dir = DefaultGeoidPath(); _filename = _dir + "/" + _name + (pixel_size_ != 4 ? ".pgm" : ".pgm4"); _file.open(_filename.c_str(), ios::binary); if (!(_file.good())) throw GeographicErr("File not readable " + _filename); string s; if (!(getline(_file, s) && s == "P5")) throw GeographicErr("File not in PGM format " + _filename); _offset = numeric_limits::max(); _scale = 0; _maxerror = _rmserror = -1; _description = "NONE"; _datetime = "UNKNOWN"; while (getline(_file, s)) { if (s.empty()) continue; if (s[0] == '#') { istringstream is(s); string commentid, key; if (!(is >> commentid >> key) || commentid != "#") continue; if (key == "Description" || key == "DateTime") { string::size_type p = s.find_first_not_of(" \t", unsigned(is.tellg())); if (p != string::npos) (key == "Description" ? _description : _datetime) = s.substr(p); } else if (key == "Offset") { if (!(is >> _offset)) throw GeographicErr("Error reading offset " + _filename); } else if (key == "Scale") { if (!(is >> _scale)) throw GeographicErr("Error reading scale " + _filename); } else if (key == (_cubic ? "MaxCubicError" : "MaxBilinearError")) { // It's not an error if the error can't be read is >> _maxerror; } else if (key == (_cubic ? "RMSCubicError" : "RMSBilinearError")) { // It's not an error if the error can't be read is >> _rmserror; } } else { istringstream is(s); if (!(is >> _width >> _height)) throw GeographicErr("Error reading raster size " + _filename); break; } } { unsigned maxval; if (!(_file >> maxval)) throw GeographicErr("Error reading maxval " + _filename); if (maxval != pixel_max_) throw GeographicErr("Incorrect value of maxval " + _filename); // Add 1 for whitespace after maxval _datastart = (unsigned long long)(_file.tellg()) + 1ULL; _swidth = (unsigned long long)(_width); } if (_offset == numeric_limits::max()) throw GeographicErr("Offset not set " + _filename); if (_scale == 0) throw GeographicErr("Scale not set " + _filename); if (_scale < 0) throw GeographicErr("Scale must be positive " + _filename); if (_height < 2 || _width < 2) // Coarsest grid spacing is 180deg. throw GeographicErr("Raster size too small " + _filename); if (_width & 1) // This is so that longitude grids can be extended thru the poles. throw GeographicErr("Raster width is odd " + _filename); if (!(_height & 1)) // This is so that latitude grid includes the equator. throw GeographicErr("Raster height is even " + _filename); _file.seekg(0, ios::end); if (!_file.good() || _datastart + pixel_size_ * _swidth * (unsigned long long)(_height) != (unsigned long long)(_file.tellg())) // Possibly this test should be "<" because the file contains, e.g., a // second image. However, for now we are more strict. throw GeographicErr("File has the wrong length " + _filename); _rlonres = _width / real(Math::td); _rlatres = (_height - 1) / real(Math::hd); _cache = false; _ix = _width; _iy = _height; // Ensure that file errors throw exceptions _file.exceptions(ifstream::eofbit | ifstream::failbit | ifstream::badbit); if (threadsafe) { CacheAll(); _file.close(); _threadsafe = true; } } Math::real Geoid::height(real lat, real lon) const { using std::isnan; // Needed for Centos 7, ubuntu 14 lat = Math::LatFix(lat); if (isnan(lat) || isnan(lon)) { return Math::NaN(); } lon = Math::AngNormalize(lon); real fx = lon * _rlonres, fy = -lat * _rlatres; int ix = int(floor(fx)), iy = min((_height - 1)/2 - 1, int(floor(fy))); fx -= ix; fy -= iy; iy += (_height - 1)/2; ix += ix < 0 ? _width : (ix >= _width ? -_width : 0); real v00 = 0, v01 = 0, v10 = 0, v11 = 0; real t[nterms_]; if (_threadsafe || !(ix == _ix && iy == _iy)) { if (!_cubic) { v00 = rawval(ix , iy ); v01 = rawval(ix + 1, iy ); v10 = rawval(ix , iy + 1); v11 = rawval(ix + 1, iy + 1); } else { real v[stencilsize_]; int k = 0; v[k++] = rawval(ix , iy - 1); v[k++] = rawval(ix + 1, iy - 1); v[k++] = rawval(ix - 1, iy ); v[k++] = rawval(ix , iy ); v[k++] = rawval(ix + 1, iy ); v[k++] = rawval(ix + 2, iy ); v[k++] = rawval(ix - 1, iy + 1); v[k++] = rawval(ix , iy + 1); v[k++] = rawval(ix + 1, iy + 1); v[k++] = rawval(ix + 2, iy + 1); v[k++] = rawval(ix , iy + 2); v[k++] = rawval(ix + 1, iy + 2); const int* c3x = iy == 0 ? c3n_ : (iy == _height - 2 ? c3s_ : c3_); int c0x = iy == 0 ? c0n_ : (iy == _height - 2 ? c0s_ : c0_); for (unsigned i = 0; i < nterms_; ++i) { t[i] = 0; for (unsigned j = 0; j < stencilsize_; ++j) t[i] += v[j] * c3x[nterms_ * j + i]; t[i] /= c0x; } } } else { // same cell; used cached coefficients if (!_cubic) { v00 = _v00; v01 = _v01; v10 = _v10; v11 = _v11; } else copy(_t, _t + nterms_, t); } if (!_cubic) { real a = (1 - fx) * v00 + fx * v01, b = (1 - fx) * v10 + fx * v11, c = (1 - fy) * a + fy * b, h = _offset + _scale * c; if (!_threadsafe) { _ix = ix; _iy = iy; _v00 = v00; _v01 = v01; _v10 = v10; _v11 = v11; } return h; } else { real h = t[0] + fx * (t[1] + fx * (t[3] + fx * t[6])) + fy * (t[2] + fx * (t[4] + fx * t[7]) + fy * (t[5] + fx * t[8] + fy * t[9])); h = _offset + _scale * h; if (!_threadsafe) { _ix = ix; _iy = iy; copy(t, t + nterms_, _t); } return h; } } void Geoid::CacheClear() const { if (!_threadsafe) { _cache = false; try { _data.clear(); // Use swap to release memory back to system vector< vector >().swap(_data); } catch (const exception&) { } } } void Geoid::CacheArea(real south, real west, real north, real east) const { if (_threadsafe) throw GeographicErr("Attempt to change cache of threadsafe Geoid"); if (south > north) { CacheClear(); return; } south = Math::LatFix(south); north = Math::LatFix(north); west = Math::AngNormalize(west); // west in [-180, 180) east = Math::AngNormalize(east); if (east <= west) east += Math::td; // east - west in (0, 360] int iw = int(floor(west * _rlonres)), ie = int(floor(east * _rlonres)), in = int(floor(-north * _rlatres)) + (_height - 1)/2, is = int(floor(-south * _rlatres)) + (_height - 1)/2; in = max(0, min(_height - 2, in)); is = max(0, min(_height - 2, is)); is += 1; ie += 1; if (_cubic) { in -= 1; is += 1; iw -= 1; ie += 1; } if (ie - iw >= _width - 1) { // Include entire longitude range iw = 0; ie = _width - 1; } else { ie += iw < 0 ? _width : (iw >= _width ? -_width : 0); iw += iw < 0 ? _width : (iw >= _width ? -_width : 0); } int oysize = int(_data.size()); _xsize = ie - iw + 1; _ysize = is - in + 1; _xoffset = iw; _yoffset = in; try { _data.resize(_ysize, vector(_xsize)); for (int iy = min(oysize, _ysize); iy--;) _data[iy].resize(_xsize); } catch (const bad_alloc&) { CacheClear(); throw GeographicErr("Insufficient memory for caching " + _filename); } try { for (int iy = in; iy <= is; ++iy) { int iy1 = iy, iw1 = iw; if (iy < 0 || iy >= _height) { // Allow points "beyond" the poles to support interpolation iy1 = iy1 < 0 ? -iy1 : 2 * (_height - 1) - iy1; iw1 += _width/2; if (iw1 >= _width) iw1 -= _width; } int xs1 = min(_width - iw1, _xsize); filepos(iw1, iy1); Utility::readarray (_file, &(_data[iy - in][0]), xs1); if (xs1 < _xsize) { // Wrap around longitude = 0 filepos(0, iy1); Utility::readarray (_file, &(_data[iy - in][xs1]), _xsize - xs1); } } _cache = true; } catch (const exception& e) { CacheClear(); throw GeographicErr(string("Error filling cache ") + e.what()); } } string Geoid::DefaultGeoidPath() { string path; char* geoidpath = getenv("GEOGRAPHICLIB_GEOID_PATH"); if (geoidpath) path = string(geoidpath); if (!path.empty()) return path; char* datapath = getenv("GEOGRAPHICLIB_DATA"); if (datapath) path = string(datapath); return (!path.empty() ? path : string(GEOGRAPHICLIB_DATA)) + "/geoids"; } string Geoid::DefaultGeoidName() { string name; char* geoidname = getenv("GEOGRAPHICLIB_GEOID_NAME"); if (geoidname) name = string(geoidname); return !name.empty() ? name : string(GEOGRAPHICLIB_GEOID_DEFAULT_NAME); } } // namespace GeographicLib geosphere/src/a_geolib.cpp0000644000176200001440000000320014430103256015260 0ustar liggesusers #include "Rcpp.h" #include #include "OSGB.h" //[[Rcpp::export(name = ".OSGB")]] std::vector osgb(std::vector x, std::vector y, std::string p, bool geo) { std::vector glv = {"100km", "10km", "1km", "100m", "10m", "1m", "500km", "50km", "5km", "500m" , "50m", "5m"}; int prec; auto it = std::find(glv.begin(), glv.end(), p); if (it != glv.end()) { prec = std::distance(glv.begin(), it); } else { return std::vector(0); } bool fiver = false; if (prec > 5) { prec = prec - 6; fiver = true; } if (geo) { for (size_t i=0; i out(x.size()); for (size_t i=0; i osgb_rev(std::vector g, int prec, bool centerp) { size_t n = g.size(); std::vector out(2 * n); for (size_t i=0; i and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ // Constants.hpp includes Math.hpp. Place this include outside Math.hpp's // include guard to enforce this ordering. #include "Constants.h" #if !defined(GEOGRAPHICLIB_MATH_HPP) #define GEOGRAPHICLIB_MATH_HPP 1 #if !defined(GEOGRAPHICLIB_WORDS_BIGENDIAN) # define GEOGRAPHICLIB_WORDS_BIGENDIAN 0 #endif #if !defined(GEOGRAPHICLIB_HAVE_LONG_DOUBLE) # define GEOGRAPHICLIB_HAVE_LONG_DOUBLE 0 #endif #if !defined(GEOGRAPHICLIB_PRECISION) /** * The precision of floating point numbers used in %GeographicLib. 1 means * float (single precision); 2 (the default) means double; 3 means long double; * 4 is reserved for quadruple precision. Nearly all the testing has been * carried out with doubles and that's the recommended configuration. In order * for long double to be used, GEOGRAPHICLIB_HAVE_LONG_DOUBLE needs to be * defined. Note that with Microsoft Visual Studio, long double is the same as * double. **********************************************************************/ # define GEOGRAPHICLIB_PRECISION 2 #endif #include #include #include #if GEOGRAPHICLIB_PRECISION == 4 #include #include #include #elif GEOGRAPHICLIB_PRECISION == 5 #include #endif #if GEOGRAPHICLIB_PRECISION > 3 // volatile keyword makes no sense for multiprec types #define GEOGRAPHICLIB_VOLATILE // Signal a convergence failure with multiprec types by throwing an exception // at loop exit. #define GEOGRAPHICLIB_PANIC \ (throw GeographicLib::GeographicErr("Convergence failure"), false) #else #define GEOGRAPHICLIB_VOLATILE volatile // Ignore convergence failures with standard floating points types by allowing // loop to exit cleanly. #define GEOGRAPHICLIB_PANIC false #endif namespace GeographicLib { /** * \brief Mathematical functions needed by %GeographicLib * * Define mathematical functions in order to localize system dependencies and * to provide generic versions of the functions. In addition define a real * type to be used by %GeographicLib. * * Example of use: * \include example-Math.cpp **********************************************************************/ class GEOGRAPHICLIB_EXPORT Math { private: void dummy(); // Static check for GEOGRAPHICLIB_PRECISION Math() = delete; // Disable constructor public: #if GEOGRAPHICLIB_HAVE_LONG_DOUBLE /** * The extended precision type for real numbers, used for some testing. * This is long double on computers with this type; otherwise it is double. **********************************************************************/ typedef long double extended; #else typedef double extended; #endif #if GEOGRAPHICLIB_PRECISION == 2 /** * The real type for %GeographicLib. Nearly all the testing has been done * with \e real = double. However, the algorithms should also work with * float and long double (where available). (CAUTION: reasonable * accuracy typically cannot be obtained using floats.) **********************************************************************/ typedef double real; #elif GEOGRAPHICLIB_PRECISION == 1 typedef float real; #elif GEOGRAPHICLIB_PRECISION == 3 typedef extended real; #elif GEOGRAPHICLIB_PRECISION == 4 typedef boost::multiprecision::float128 real; #elif GEOGRAPHICLIB_PRECISION == 5 typedef mpfr::mpreal real; #else typedef double real; #endif /** * The constants defining the standard (Babylonian) meanings of degrees, * minutes, and seconds, for angles. Read the constants as follows (for * example): \e ms = 60 is the ratio 1 minute / 1 second. The * abbreviations are * - \e t a whole turn (360°) * - \e h a half turn (180°) * - \e q a quarter turn (a right angle = 90°) * - \e d a degree * - \e m a minute * - \e s a second * . * Note that degree() is ratio 1 degree / 1 radian, thus, for example, * Math::degree() * Math::qd is the ratio 1 quarter turn / 1 radian = * π/2. * * Defining all these in one place would mean that it's simple to convert * to the centesimal system for measuring angles. The DMS class assumes * that Math::dm and Math::ms are less than or equal to 100 (so that two * digits suffice for the integer parts of the minutes and degrees * components of an angle). Switching to the centesimal convention will * break most of the tests. Also the normal definition of degree is baked * into some classes, e.g., UTMUPS, MGRS, Georef, Geohash, etc. **********************************************************************/ #if GEOGRAPHICLIB_PRECISION == 4 static const int #else enum dms { #endif qd = 90, ///< degrees per quarter turn dm = 60, ///< minutes per degree ms = 60, ///< seconds per minute hd = 2 * qd, ///< degrees per half turn td = 2 * hd, ///< degrees per turn ds = dm * ms ///< seconds per degree #if GEOGRAPHICLIB_PRECISION == 4 ; #else }; #endif /** * @return the number of bits of precision in a real number. **********************************************************************/ static int digits(); /** * Set the binary precision of a real number. * * @param[in] ndigits the number of bits of precision. * @return the resulting number of bits of precision. * * This only has an effect when GEOGRAPHICLIB_PRECISION = 5. See also * Utility::set_digits for caveats about when this routine should be * called. **********************************************************************/ static int set_digits(int ndigits); /** * @return the number of decimal digits of precision in a real number. **********************************************************************/ static int digits10(); /** * Number of additional decimal digits of precision for real relative to * double (0 for float). **********************************************************************/ static int extra_digits(); /** * true if the machine is big-endian. **********************************************************************/ static const bool bigendian = GEOGRAPHICLIB_WORDS_BIGENDIAN; /** * @tparam T the type of the returned value. * @return π. **********************************************************************/ template static T pi() { using std::atan2; static const T pi = atan2(T(0), T(-1)); return pi; } /** * @tparam T the type of the returned value. * @return the number of radians in a degree. **********************************************************************/ template static T degree() { static const T degree = pi() / T(hd); return degree; } /** * Square a number. * * @tparam T the type of the argument and the returned value. * @param[in] x * @return x2. **********************************************************************/ template static T sq(T x) { return x * x; } /** * Normalize a two-vector. * * @tparam T the type of the argument and the returned value. * @param[in,out] x on output set to x/hypot(x, y). * @param[in,out] y on output set to y/hypot(x, y). **********************************************************************/ template static void norm(T& x, T& y) { #if defined(_MSC_VER) && defined(_M_IX86) // hypot for Visual Studio (A=win32) fails monotonicity, e.g., with // x = 0.6102683302836215 // y1 = 0.7906090004346522 // y2 = y1 + 1e-16 // the test // hypot(x, y2) >= hypot(x, y1) // fails. Reported 2021-03-14: // https://developercommunity.visualstudio.com/t/1369259 // See also: // https://bugs.python.org/issue43088 using std::sqrt; T h = sqrt(x * x + y * y); #else using std::hypot; T h = hypot(x, y); #endif x /= h; y /= h; } /** * The error-free sum of two numbers. * * @tparam T the type of the argument and the returned value. * @param[in] u * @param[in] v * @param[out] t the exact error given by (\e u + \e v) - \e s. * @return \e s = round(\e u + \e v). * * See D. E. Knuth, TAOCP, Vol 2, 4.2.2, Theorem B. * * \note \e t can be the same as one of the first two arguments. **********************************************************************/ template static T sum(T u, T v, T& t); /** * Evaluate a polynomial. * * @tparam T the type of the arguments and returned value. * @param[in] N the order of the polynomial. * @param[in] p the coefficient array (of size \e N + 1) with * p0 being coefficient of xN. * @param[in] x the variable. * @return the value of the polynomial. * * Evaluate ∑n=0..N * pn xNn. * Return 0 if \e N < 0. Return p0, if \e N = 0 (even * if \e x is infinite or a nan). The evaluation uses Horner's method. **********************************************************************/ template static T polyval(int N, const T p[], T x) { // This used to employ Math::fma; but that's too slow and it seemed not // to improve the accuracy noticeably. This might change when there's // direct hardware support for fma. T y = N < 0 ? 0 : *p++; while (--N >= 0) y = y * x + *p++; return y; } /** * Normalize an angle. * * @tparam T the type of the argument and returned value. * @param[in] x the angle in degrees. * @return the angle reduced to the range [−180°, 180°]. * * The range of \e x is unrestricted. If the result is ±0° or * ±180° then the sign is the sign of \e x. **********************************************************************/ template static T AngNormalize(T x); /** * Normalize a latitude. * * @tparam T the type of the argument and returned value. * @param[in] x the angle in degrees. * @return x if it is in the range [−90°, 90°], otherwise * return NaN. **********************************************************************/ template static T LatFix(T x) { using std::fabs; return fabs(x) > T(qd) ? NaN() : x; } /** * The exact difference of two angles reduced to * [−180°, 180°]. * * @tparam T the type of the arguments and returned value. * @param[in] x the first angle in degrees. * @param[in] y the second angle in degrees. * @param[out] e the error term in degrees. * @return \e d, the truncated value of \e y − \e x. * * This computes \e z = \e y − \e x exactly, reduced to * [−180°, 180°]; and then sets \e z = \e d + \e e where \e d * is the nearest representable number to \e z and \e e is the truncation * error. If \e z = ±0° or ±180°, then the sign of * \e d is given by the sign of \e y − \e x. The maximum absolute * value of \e e is 2−26 (for doubles). **********************************************************************/ template static T AngDiff(T x, T y, T& e); /** * Difference of two angles reduced to [−180°, 180°] * * @tparam T the type of the arguments and returned value. * @param[in] x the first angle in degrees. * @param[in] y the second angle in degrees. * @return \e y − \e x, reduced to the range [−180°, * 180°]. * * The result is equivalent to computing the difference exactly, reducing * it to [−180°, 180°] and rounding the result. **********************************************************************/ template static T AngDiff(T x, T y) { T e; return AngDiff(x, y, e); } /** * Coarsen a value close to zero. * * @tparam T the type of the argument and returned value. * @param[in] x * @return the coarsened value. * * The makes the smallest gap in \e x = 1/16 − nextafter(1/16, 0) = * 1/257 for doubles = 0.8 pm on the earth if \e x is an angle * in degrees. (This is about 2000 times more resolution than we get with * angles around 90°.) We use this to avoid having to deal with near * singular cases when \e x is non-zero but tiny (e.g., * 10−200). This sign of ±0 is preserved. **********************************************************************/ template static T AngRound(T x); /** * Evaluate the sine and cosine function with the argument in degrees * * @tparam T the type of the arguments. * @param[in] x in degrees. * @param[out] sinx sin(x). * @param[out] cosx cos(x). * * The results obey exactly the elementary properties of the trigonometric * functions, e.g., sin 9° = cos 81° = − sin 123456789°. * If x = −0 or a negative multiple of 180°, then \e sinx = * −0; this is the only case where −0 is returned. **********************************************************************/ template static void sincosd(T x, T& sinx, T& cosx); /** * Evaluate the sine and cosine with reduced argument plus correction * * @tparam T the type of the arguments. * @param[in] x reduced angle in degrees. * @param[in] t correction in degrees. * @param[out] sinx sin(x + t). * @param[out] cosx cos(x + t). * * This is a variant of Math::sincosd allowing a correction to the angle to * be supplied. \e x must be in [−180°, 180°] and \e t is * assumed to be a small correction. Math::AngRound is applied to * the reduced angle to prevent problems with \e x + \e t being extremely * close but not exactly equal to one of the four cardinal directions. **********************************************************************/ template static void sincosde(T x, T t, T& sinx, T& cosx); /** * Evaluate the sine function with the argument in degrees * * @tparam T the type of the argument and the returned value. * @param[in] x in degrees. * @return sin(x). * * The result is +0 for \e x = +0 and positive multiples of 180°. The * result is −0 for \e x = -0 and negative multiples of 180°. **********************************************************************/ template static T sind(T x); /** * Evaluate the cosine function with the argument in degrees * * @tparam T the type of the argument and the returned value. * @param[in] x in degrees. * @return cos(x). * * The result is +0 for \e x an odd multiple of 90°. **********************************************************************/ template static T cosd(T x); /** * Evaluate the tangent function with the argument in degrees * * @tparam T the type of the argument and the returned value. * @param[in] x in degrees. * @return tan(x). * * If \e x is an odd multiple of 90°, then a suitably large (but * finite) value is returned. **********************************************************************/ template static T tand(T x); /** * Evaluate the atan2 function with the result in degrees * * @tparam T the type of the arguments and the returned value. * @param[in] y * @param[in] x * @return atan2(y, x) in degrees. * * The result is in the range [−180° 180°]. N.B., * atan2d(±0, −1) = ±180°. **********************************************************************/ template static T atan2d(T y, T x); /** * Evaluate the atan function with the result in degrees * * @tparam T the type of the argument and the returned value. * @param[in] x * @return atan(x) in degrees. **********************************************************************/ template static T atand(T x); /** * Evaluate e atanh(e x) * * @tparam T the type of the argument and the returned value. * @param[in] x * @param[in] es the signed eccentricity = sign(e2) * sqrt(|e2|) * @return e atanh(e x) * * If e2 is negative (e is imaginary), the * expression is evaluated in terms of atan. **********************************************************************/ template static T eatanhe(T x, T es); /** * tanχ in terms of tanφ * * @tparam T the type of the argument and the returned value. * @param[in] tau τ = tanφ * @param[in] es the signed eccentricity = sign(e2) * sqrt(|e2|) * @return τ′ = tanχ * * See Eqs. (7--9) of * C. F. F. Karney, * * Transverse Mercator with an accuracy of a few nanometers, * J. Geodesy 85(8), 475--485 (Aug. 2011) * (preprint * arXiv:1002.1417). **********************************************************************/ template static T taupf(T tau, T es); /** * tanφ in terms of tanχ * * @tparam T the type of the argument and the returned value. * @param[in] taup τ′ = tanχ * @param[in] es the signed eccentricity = sign(e2) * sqrt(|e2|) * @return τ = tanφ * * See Eqs. (19--21) of * C. F. F. Karney, * * Transverse Mercator with an accuracy of a few nanometers, * J. Geodesy 85(8), 475--485 (Aug. 2011) * (preprint * arXiv:1002.1417). **********************************************************************/ template static T tauf(T taup, T es); /** * The NaN (not a number) * * @tparam T the type of the returned value. * @return NaN if available, otherwise return the max real of type T. **********************************************************************/ template static T NaN(); /** * Infinity * * @tparam T the type of the returned value. * @return infinity if available, otherwise return the max real. **********************************************************************/ template static T infinity(); /** * Swap the bytes of a quantity * * @tparam T the type of the argument and the returned value. * @param[in] x * @return x with its bytes swapped. **********************************************************************/ template static T swab(T x) { union { T r; unsigned char c[sizeof(T)]; } b; b.r = x; for (int i = sizeof(T)/2; i--; ) std::swap(b.c[i], b.c[sizeof(T) - 1 - i]); return b.r; } }; } // namespace GeographicLib #endif // GEOGRAPHICLIB_MATH_HPP geosphere/src/DST.cpp0000644000176200001440000001050314677357014014175 0ustar liggesusers/** * \file DST.cpp * \brief Implementation for GeographicLib::DST class * * Copyright (c) Charles Karney (2022) and licensed under * the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #include "DST.h" #include // std::exp #include // std::complex #include //std::function #include // std::make_shared #include #include "kissfft.h" namespace GeographicLib { using namespace std; DST::DST(int N) : _N(N < 0 ? 0 : N) , _fft(make_shared(fft_t(2 * _N, false))) {} void DST::reset(int N) { N = N < 0 ? 0 : N; if (N == _N) return; _N = N; _fft->assign(2 * _N, false); } void DST::fft_transform(real data[], real F[], bool centerp) const { // Implement DST-III (centerp = false) or DST-IV (centerp = true). // Elements (0,N], resp. [0,N), of data should be set on input for centerp // = false, resp. true. F must have a size of at least N and on output // elements [0,N) of F contain the transform. if (_N == 0) return; if (centerp) { for (int i = 0; i < _N; ++i) { data[_N+i] = data[_N-1-i]; data[2*_N+i] = -data[i]; data[3*_N+i] = -data[_N-1-i]; } } else { data[0] = 0; // set [0] for (int i = 1; i < _N; ++i) data[_N+i] = data[_N-i]; // set [N+1,2*N-1] for (int i = 0; i < 2*_N; ++i) data[2*_N+i] = -data[i]; // [2*N, 4*N-1] } vector> ctemp(2*_N); _fft->transform_real(data, ctemp.data()); if (centerp) { real d = -Math::pi()/(4*_N); for (int i = 0, j = 1; i < _N; ++i, j+=2) ctemp[j] *= exp(complex(0, j*d)); } for (int i = 0, j = 1; i < _N; ++i, j+=2) { F[i] = -ctemp[j].imag() / (2*_N); } } void DST::fft_transform2(real data[], real F[]) const { // Elements [0,N), of data should be set to the N grid center values and F // should have size of at least 2*N. On input elements [0,N) of F contain // the size N transform; on output elements [0,2*N) of F contain the size // 2*N transform. fft_transform(data, F+_N, true); // Copy DST-IV order N tx to [0,N) elements of data for (int i = 0; i < _N; ++i) data[i] = F[i+_N]; for (int i = _N; i < 2*_N; ++i) // (DST-IV order N - DST-III order N) / 2 F[i] = (data[2*_N-1-i] - F[2*_N-1-i])/2; for (int i = 0; i < _N; ++i) // (DST-IV order N + DST-III order N) / 2 F[i] = (data[i] + F[i])/2; } void DST::transform(function f, real F[]) const { vector data(4 * _N); real d = Math::pi()/(2 * _N); for (int i = 1; i <= _N; ++i) data[i] = f( i * d ); fft_transform(data.data(), F, false); } void DST::refine(function f, real F[]) const { vector data(4 * _N); real d = Math::pi()/(4 * _N); for (int i = 0; i < _N; ++i) data[i] = f( (2*i + 1) * d ); fft_transform2(data.data(), F); } Math::real DST::eval(real sinx, real cosx, const real F[], int N) { // Evaluate // y = sum(F[i] * sin((2*i+1) * x), i, 0, N-1) // using Clenshaw summation. // Approx operation count = (N + 5) mult and (2 * N + 2) add real ar = 2 * (cosx - sinx) * (cosx + sinx), // 2 * cos(2 * x) y0 = N & 1 ? F[--N] : 0, y1 = 0; // accumulators for sum // Now N is even while (N > 0) { // Unroll loop x 2, so accumulators return to their original role y1 = ar * y0 - y1 + F[--N]; y0 = ar * y1 - y0 + F[--N]; } return sinx * (y0 + y1); // sin(x) * (y0 + y1) } Math::real DST::integral(real sinx, real cosx, const real F[], int N) { // Evaluate // y = -sum(F[i]/(2*i+1) * cos((2*i+1) * x), i, 0, N-1) // using Clenshaw summation. // Approx operation count = (N + 5) mult and (2 * N + 2) add int l = N; real ar = 2 * (cosx - sinx) * (cosx + sinx), // 2 * cos(2 * x) y0 = N & 1 ? F[--N]/(2*(--l)+1) : 0, y1 = 0; // accumulators for sum // Now N is even while (N > 0) { // Unroll loop x 2, so accumulators return to their original role y1 = ar * y0 - y1 + F[--N]/(2*(--l)+1); y0 = ar * y1 - y0 + F[--N]/(2*(--l)+1); } return cosx * (y1 - y0); // cos(x) * (y1 - y0) } } // namespace GeographicLib geosphere/src/Georef.cpp0000644000176200001440000001250514323376011014740 0ustar liggesusers/** * \file Georef.cpp * \brief Implementation for GeographicLib::Georef class * * Copyright (c) Charles Karney (2015-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #include "Georef.h" #include "Utility.h" #if defined(_MSC_VER) // Squelch warnings about enum-float expressions # pragma warning (disable: 5055) #endif namespace GeographicLib { using namespace std; const char* const Georef::digits_ = "0123456789"; const char* const Georef::lontile_ = "ABCDEFGHJKLMNPQRSTUVWXYZ"; const char* const Georef::lattile_ = "ABCDEFGHJKLM"; const char* const Georef::degrees_ = "ABCDEFGHJKLMNPQ"; void Georef::Forward(real lat, real lon, int prec, string& georef) { using std::isnan; // Needed for Centos 7, ubuntu 14 if (fabs(lat) > Math::qd) throw GeographicErr("Latitude " + Utility::str(lat) + "d not in [-" + to_string(Math::qd) + "d, " + to_string(Math::qd) + "d]"); if (isnan(lat) || isnan(lon)) { georef = "INVALID"; return; } lon = Math::AngNormalize(lon); // lon in [-180,180) if (lat == Math::qd) lat *= (1 - numeric_limits::epsilon() / 2); prec = max(-1, min(int(maxprec_), prec)); if (prec == 1) ++prec; // Disallow prec = 1 // The C++ standard mandates 64 bits for long long. But // check, to make sure. static_assert(numeric_limits::digits >= 45, "long long not wide enough to store 21600e9"); const long long m = 60000000000LL; long long x = (long long)(floor(lon * real(m))) - lonorig_ * m, y = (long long)(floor(lat * real(m))) - latorig_ * m; int ilon = int(x / m); int ilat = int(y / m); char georef1[maxlen_]; georef1[0] = lontile_[ilon / tile_]; georef1[1] = lattile_[ilat / tile_]; if (prec >= 0) { georef1[2] = degrees_[ilon % tile_]; georef1[3] = degrees_[ilat % tile_]; if (prec > 0) { x -= m * ilon; y -= m * ilat; long long d = (long long)pow(real(base_), maxprec_ - prec); x /= d; y /= d; for (int c = prec; c--;) { georef1[baselen_ + c ] = digits_[x % base_]; x /= base_; georef1[baselen_ + c + prec] = digits_[y % base_]; y /= base_; } } } georef.resize(baselen_ + 2 * prec); copy(georef1, georef1 + baselen_ + 2 * prec, georef.begin()); } void Georef::Reverse(const string& georef, real& lat, real& lon, int& prec, bool centerp) { int len = int(georef.length()); if (len >= 3 && toupper(georef[0]) == 'I' && toupper(georef[1]) == 'N' && toupper(georef[2]) == 'V') { lat = lon = Math::NaN(); return; } if (len < baselen_ - 2) throw GeographicErr("Georef must start with at least 2 letters " + georef); int prec1 = (2 + len - baselen_) / 2 - 1; int k; k = Utility::lookup(lontile_, georef[0]); if (k < 0) throw GeographicErr("Bad longitude tile letter in georef " + georef); real lon1 = k + lonorig_ / tile_; k = Utility::lookup(lattile_, georef[1]); if (k < 0) throw GeographicErr("Bad latitude tile letter in georef " + georef); real lat1 = k + latorig_ / tile_; real unit = 1; if (len > 2) { unit *= tile_; k = Utility::lookup(degrees_, georef[2]); if (k < 0) throw GeographicErr("Bad longitude degree letter in georef " + georef); lon1 = lon1 * tile_ + k; if (len < 4) throw GeographicErr("Missing latitude degree letter in georef " + georef); k = Utility::lookup(degrees_, georef[3]); if (k < 0) throw GeographicErr("Bad latitude degree letter in georef " + georef); lat1 = lat1 * tile_ + k; if (prec1 > 0) { if (georef.find_first_not_of(digits_, baselen_) != string::npos) throw GeographicErr("Non digits in trailing portion of georef " + georef.substr(baselen_)); if (len % 2) throw GeographicErr("Georef must end with an even number of digits " + georef.substr(baselen_)); if (prec1 == 1) throw GeographicErr("Georef needs at least 4 digits for minutes " + georef.substr(baselen_)); if (prec1 > maxprec_) throw GeographicErr("More than " + Utility::str(2*maxprec_) + " digits in georef " + georef.substr(baselen_)); for (int i = 0; i < prec1; ++i) { int m = i ? base_ : 6; unit *= m; int x = Utility::lookup(digits_, georef[baselen_ + i]), y = Utility::lookup(digits_, georef[baselen_ + i + prec1]); if (!(i || (x < m && y < m))) throw GeographicErr("Minutes terms in georef must be less than 60 " + georef.substr(baselen_)); lon1 = m * lon1 + x; lat1 = m * lat1 + y; } } } if (centerp) { unit *= 2; lat1 = 2 * lat1 + 1; lon1 = 2 * lon1 + 1; } lat = (tile_ * lat1) / unit; lon = (tile_ * lon1) / unit; prec = prec1; } } // namespace GeographicLib geosphere/src/Accumulator.h0000644000176200001440000001754514323400747015472 0ustar liggesusers/** * \file Accumulator.hpp * \brief Header for GeographicLib::Accumulator class * * Copyright (c) Charles Karney (2010-2020) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #if !defined(GEOGRAPHICLIB_ACCUMULATOR_HPP) #define GEOGRAPHICLIB_ACCUMULATOR_HPP 1 #include "Constants.h" namespace GeographicLib { /** * \brief An accumulator for sums * * This allows many numbers of floating point type \e T to be added together * with twice the normal precision. Thus if \e T is double, the effective * precision of the sum is 106 bits or about 32 decimal places. * * The implementation follows J. R. Shewchuk, * Adaptive Precision * Floating-Point Arithmetic and Fast Robust Geometric Predicates, * Discrete & Computational Geometry 18(3) 305--363 (1997). * * Approximate timings (summing a vector) * - double: 2ns * - Accumulator: 23ns * * In the documentation of the member functions, \e sum stands for the value * currently held in the accumulator. * * Example of use: * \include example-Accumulator.cpp **********************************************************************/ template class GEOGRAPHICLIB_EXPORT Accumulator { private: // _s + _t accumulators for the sum. T _s, _t; // Same as Math::sum, but requires abs(u) >= abs(v). This isn't currently // used. static T fastsum(T u, T v, T& t) { GEOGRAPHICLIB_VOLATILE T s = u + v; GEOGRAPHICLIB_VOLATILE T vp = s - u; t = v - vp; return s; } void Add(T y) { // Here's Shewchuk's solution... T u; // hold exact sum as [s, t, u] // Accumulate starting at least significant end y = Math::sum(y, _t, u); _s = Math::sum(y, _s, _t); // Start is _s, _t decreasing and non-adjacent. Sum is now (s + t + u) // exactly with s, t, u non-adjacent and in decreasing order (except for // possible zeros). The following code tries to normalize the result. // Ideally, we want _s = round(s+t+u) and _u = round(s+t+u - _s). The // following does an approximate job (and maintains the decreasing // non-adjacent property). Here are two "failures" using 3-bit floats: // // Case 1: _s is not equal to round(s+t+u) -- off by 1 ulp // [12, -1] - 8 -> [4, 0, -1] -> [4, -1] = 3 should be [3, 0] = 3 // // Case 2: _s+_t is not as close to s+t+u as it shold be // [64, 5] + 4 -> [64, 8, 1] -> [64, 8] = 72 (off by 1) // should be [80, -7] = 73 (exact) // // "Fixing" these problems is probably not worth the expense. The // representation inevitably leads to small errors in the accumulated // values. The additional errors illustrated here amount to 1 ulp of the // less significant word during each addition to the Accumulator and an // additional possible error of 1 ulp in the reported sum. // // Incidentally, the "ideal" representation described above is not // canonical, because _s = round(_s + _t) may not be true. For example, // with 3-bit floats: // // [128, 16] + 1 -> [160, -16] -- 160 = round(145). // But [160, 0] - 16 -> [128, 16] -- 128 = round(144). // if (_s == 0) // This implies t == 0, _s = u; // so result is u else _t += u; // otherwise just accumulate u to t. } T Sum(T y) const { Accumulator a(*this); a.Add(y); return a._s; } public: /** * Construct from a \e T. This is not declared explicit, so that you can * write Accumulator a = 5;. * * @param[in] y set \e sum = \e y. **********************************************************************/ Accumulator(T y = T(0)) : _s(y), _t(0) { static_assert(!std::numeric_limits::is_integer, "Accumulator type is not floating point"); } /** * Set the accumulator to a number. * * @param[in] y set \e sum = \e y. **********************************************************************/ Accumulator& operator=(T y) { _s = y; _t = 0; return *this; } /** * Return the value held in the accumulator. * * @return \e sum. **********************************************************************/ T operator()() const { return _s; } /** * Return the result of adding a number to \e sum (but don't change \e * sum). * * @param[in] y the number to be added to the sum. * @return \e sum + \e y. **********************************************************************/ T operator()(T y) const { return Sum(y); } /** * Add a number to the accumulator. * * @param[in] y set \e sum += \e y. **********************************************************************/ Accumulator& operator+=(T y) { Add(y); return *this; } /** * Subtract a number from the accumulator. * * @param[in] y set \e sum -= \e y. **********************************************************************/ Accumulator& operator-=(T y) { Add(-y); return *this; } /** * Multiply accumulator by an integer. To avoid loss of accuracy, use only * integers such that \e n × \e T is exactly representable as a \e T * (i.e., ± powers of two). Use \e n = −1 to negate \e sum. * * @param[in] n set \e sum *= \e n. **********************************************************************/ Accumulator& operator*=(int n) { _s *= n; _t *= n; return *this; } /** * Multiply accumulator by a number. The fma (fused multiply and add) * instruction is used (if available) in order to maintain accuracy. * * @param[in] y set \e sum *= \e y. **********************************************************************/ Accumulator& operator*=(T y) { using std::fma; T d = _s; _s *= y; d = fma(y, d, -_s); // the error in the first multiplication _t = fma(y, _t, d); // add error to the second term return *this; } /** * Reduce accumulator to the range [-y/2, y/2]. * * @param[in] y the modulus. **********************************************************************/ Accumulator& remainder(T y) { using std::remainder; _s = remainder(_s, y); Add(0); // This renormalizes the result. return *this; } /** * Test equality of an Accumulator with a number. **********************************************************************/ bool operator==(T y) const { return _s == y; } /** * Test inequality of an Accumulator with a number. **********************************************************************/ bool operator!=(T y) const { return _s != y; } /** * Less operator on an Accumulator and a number. **********************************************************************/ bool operator<(T y) const { return _s < y; } /** * Less or equal operator on an Accumulator and a number. **********************************************************************/ bool operator<=(T y) const { return _s <= y; } /** * Greater operator on an Accumulator and a number. **********************************************************************/ bool operator>(T y) const { return _s > y; } /** * Greater or equal operator on an Accumulator and a number. **********************************************************************/ bool operator>=(T y) const { return _s >= y; } }; } // namespace GeographicLib #endif // GEOGRAPHICLIB_ACCUMULATOR_HPP geosphere/src/TransverseMercatorExact.cpp0000644000176200001440000004140614323376012020352 0ustar liggesusers/** * \file TransverseMercatorExact.cpp * \brief Implementation for GeographicLib::TransverseMercatorExact class * * Copyright (c) Charles Karney (2008-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ * * The relevant section of Lee's paper is part V, pp 67--101, * Conformal * Projections Based On Jacobian Elliptic Functions; * * borrow from archive.org. * * The method entails using the Thompson Transverse Mercator as an * intermediate projection. The projections from the intermediate * coordinates to [\e phi, \e lam] and [\e x, \e y] are given by elliptic * functions. The inverse of these projections are found by Newton's method * with a suitable starting guess. * * This implementation and notation closely follows Lee, with the following * exceptions: *

*
Lee here Description *
x/a xi Northing (unit Earth) *
y/a eta Easting (unit Earth) *
s/a sigma xi + i * eta *
y x Easting *
x y Northing *
k e eccentricity *
k^2 mu elliptic function parameter *
k'^2 mv elliptic function complementary parameter *
m k scale *
zeta zeta complex longitude = Mercator = chi in paper *
s sigma complex GK = zeta in paper *
* * Minor alterations have been made in some of Lee's expressions in an * attempt to control round-off. For example atanh(sin(phi)) is replaced by * asinh(tan(phi)) which maintains accuracy near phi = pi/2. Such changes * are noted in the code. **********************************************************************/ #include "TransverseMercatorExact.h" #if defined(_MSC_VER) // Squelch warnings about constant conditional and enum-float expressions # pragma warning (disable: 4127 5055) #endif namespace GeographicLib { using namespace std; TransverseMercatorExact::TransverseMercatorExact(real a, real f, real k0, bool extendp) : tol_(numeric_limits::epsilon()) , tol2_(real(0.1) * tol_) , taytol_(pow(tol_, real(0.6))) , _a(a) , _f(f) , _k0(k0) , _mu(_f * (2 - _f)) // e^2 , _mv(1 - _mu) // 1 - e^2 , _e(sqrt(_mu)) , _extendp(extendp) , _eEu(_mu) , _eEv(_mv) { if (!(isfinite(_a) && _a > 0)) throw GeographicErr("Equatorial radius is not positive"); if (!(_f > 0)) throw GeographicErr("Flattening is not positive"); if (!(_f < 1)) throw GeographicErr("Polar semi-axis is not positive"); if (!(isfinite(_k0) && _k0 > 0)) throw GeographicErr("Scale is not positive"); } const TransverseMercatorExact& TransverseMercatorExact::UTM() { static const TransverseMercatorExact utm(Constants::WGS84_a(), Constants::WGS84_f(), Constants::UTM_k0()); return utm; } void TransverseMercatorExact::zeta(real /*u*/, real snu, real cnu, real dnu, real /*v*/, real snv, real cnv, real dnv, real& taup, real& lam) const { // Lee 54.17 but write // atanh(snu * dnv) = asinh(snu * dnv / sqrt(cnu^2 + _mv * snu^2 * snv^2)) // atanh(_e * snu / dnv) = // asinh(_e * snu / sqrt(_mu * cnu^2 + _mv * cnv^2)) // Overflow value s.t. atan(overflow) = pi/2 static const real overflow = 1 / Math::sq(numeric_limits::epsilon()); real d1 = sqrt(Math::sq(cnu) + _mv * Math::sq(snu * snv)), d2 = sqrt(_mu * Math::sq(cnu) + _mv * Math::sq(cnv)), t1 = (d1 != 0 ? snu * dnv / d1 : (signbit(snu) ? -overflow : overflow)), t2 = (d2 != 0 ? sinh( _e * asinh(_e * snu / d2) ) : (signbit(snu) ? -overflow : overflow)); // psi = asinh(t1) - asinh(t2) // taup = sinh(psi) taup = t1 * hypot(real(1), t2) - t2 * hypot(real(1), t1); lam = (d1 != 0 && d2 != 0) ? atan2(dnu * snv, cnu * cnv) - _e * atan2(_e * cnu * snv, dnu * cnv) : 0; } void TransverseMercatorExact::dwdzeta(real /*u*/, real snu, real cnu, real dnu, real /*v*/, real snv, real cnv, real dnv, real& du, real& dv) const { // Lee 54.21 but write (1 - dnu^2 * snv^2) = (cnv^2 + _mu * snu^2 * snv^2) // (see A+S 16.21.4) real d = _mv * Math::sq(Math::sq(cnv) + _mu * Math::sq(snu * snv)); du = cnu * dnu * dnv * (Math::sq(cnv) - _mu * Math::sq(snu * snv)) / d; dv = -snu * snv * cnv * (Math::sq(dnu * dnv) + _mu * Math::sq(cnu)) / d; } // Starting point for zetainv bool TransverseMercatorExact::zetainv0(real psi, real lam, real& u, real& v) const { bool retval = false; if (psi < -_e * Math::pi()/4 && lam > (1 - 2 * _e) * Math::pi()/2 && psi < lam - (1 - _e) * Math::pi()/2) { // N.B. this branch is normally not taken because psi < 0 is converted // psi > 0 by Forward. // // There's a log singularity at w = w0 = Eu.K() + i * Ev.K(), // corresponding to the south pole, where we have, approximately // // psi = _e + i * pi/2 - _e * atanh(cos(i * (w - w0)/(1 + _mu/2))) // // Inverting this gives: real psix = 1 - psi / _e, lamx = (Math::pi()/2 - lam) / _e; u = asinh(sin(lamx) / hypot(cos(lamx), sinh(psix))) * (1 + _mu/2); v = atan2(cos(lamx), sinh(psix)) * (1 + _mu/2); u = _eEu.K() - u; v = _eEv.K() - v; } else if (psi < _e * Math::pi()/2 && lam > (1 - 2 * _e) * Math::pi()/2) { // At w = w0 = i * Ev.K(), we have // // zeta = zeta0 = i * (1 - _e) * pi/2 // zeta' = zeta'' = 0 // // including the next term in the Taylor series gives: // // zeta = zeta0 - (_mv * _e) / 3 * (w - w0)^3 // // When inverting this, we map arg(w - w0) = [-90, 0] to // arg(zeta - zeta0) = [-90, 180] real dlam = lam - (1 - _e) * Math::pi()/2, rad = hypot(psi, dlam), // atan2(dlam-psi, psi+dlam) + 45d gives arg(zeta - zeta0) in range // [-135, 225). Subtracting 180 (since multiplier is negative) makes // range [-315, 45). Multiplying by 1/3 (for cube root) gives range // [-105, 15). In particular the range [-90, 180] in zeta space maps // to [-90, 0] in w space as required. ang = atan2(dlam-psi, psi+dlam) - real(0.75) * Math::pi(); // Error using this guess is about 0.21 * (rad/e)^(5/3) retval = rad < _e * taytol_; rad = cbrt(3 / (_mv * _e) * rad); ang /= 3; u = rad * cos(ang); v = rad * sin(ang) + _eEv.K(); } else { // Use spherical TM, Lee 12.6 -- writing atanh(sin(lam) / cosh(psi)) = // asinh(sin(lam) / hypot(cos(lam), sinh(psi))). This takes care of the // log singularity at zeta = Eu.K() (corresponding to the north pole) v = asinh(sin(lam) / hypot(cos(lam), sinh(psi))); u = atan2(sinh(psi), cos(lam)); // But scale to put 90,0 on the right place u *= _eEu.K() / (Math::pi()/2); v *= _eEu.K() / (Math::pi()/2); } return retval; } // Invert zeta using Newton's method void TransverseMercatorExact::zetainv(real taup, real lam, real& u, real& v) const { real psi = asinh(taup), scal = 1/hypot(real(1), taup); if (zetainv0(psi, lam, u, v)) return; real stol2 = tol2_ / Math::sq(fmax(psi, real(1))); // min iterations = 2, max iterations = 6; mean = 4.0 for (int i = 0, trip = 0; i < numit_ || GEOGRAPHICLIB_PANIC; ++i) { real snu, cnu, dnu, snv, cnv, dnv; _eEu.sncndn(u, snu, cnu, dnu); _eEv.sncndn(v, snv, cnv, dnv); real tau1, lam1, du1, dv1; zeta(u, snu, cnu, dnu, v, snv, cnv, dnv, tau1, lam1); dwdzeta(u, snu, cnu, dnu, v, snv, cnv, dnv, du1, dv1); tau1 -= taup; lam1 -= lam; tau1 *= scal; real delu = tau1 * du1 - lam1 * dv1, delv = tau1 * dv1 + lam1 * du1; u -= delu; v -= delv; if (trip) break; real delw2 = Math::sq(delu) + Math::sq(delv); if (!(delw2 >= stol2)) ++trip; } } void TransverseMercatorExact::sigma(real /*u*/, real snu, real cnu, real dnu, real v, real snv, real cnv, real dnv, real& xi, real& eta) const { // Lee 55.4 writing // dnu^2 + dnv^2 - 1 = _mu * cnu^2 + _mv * cnv^2 real d = _mu * Math::sq(cnu) + _mv * Math::sq(cnv); xi = _eEu.E(snu, cnu, dnu) - _mu * snu * cnu * dnu / d; eta = v - _eEv.E(snv, cnv, dnv) + _mv * snv * cnv * dnv / d; } void TransverseMercatorExact::dwdsigma(real /*u*/, real snu, real cnu, real dnu, real /*v*/, real snv, real cnv, real dnv, real& du, real& dv) const { // Reciprocal of 55.9: dw/ds = dn(w)^2/_mv, expanding complex dn(w) using // A+S 16.21.4 real d = _mv * Math::sq(Math::sq(cnv) + _mu * Math::sq(snu * snv)); real dnr = dnu * cnv * dnv, dni = - _mu * snu * cnu * snv; du = (Math::sq(dnr) - Math::sq(dni)) / d; dv = 2 * dnr * dni / d; } // Starting point for sigmainv bool TransverseMercatorExact::sigmainv0(real xi, real eta, real& u, real& v) const { bool retval = false; if (eta > real(1.25) * _eEv.KE() || (xi < -real(0.25) * _eEu.E() && xi < eta - _eEv.KE())) { // sigma as a simple pole at w = w0 = Eu.K() + i * Ev.K() and sigma is // approximated by // // sigma = (Eu.E() + i * Ev.KE()) + 1/(w - w0) real x = xi - _eEu.E(), y = eta - _eEv.KE(), r2 = Math::sq(x) + Math::sq(y); u = _eEu.K() + x/r2; v = _eEv.K() - y/r2; } else if ((eta > real(0.75) * _eEv.KE() && xi < real(0.25) * _eEu.E()) || eta > _eEv.KE()) { // At w = w0 = i * Ev.K(), we have // // sigma = sigma0 = i * Ev.KE() // sigma' = sigma'' = 0 // // including the next term in the Taylor series gives: // // sigma = sigma0 - _mv / 3 * (w - w0)^3 // // When inverting this, we map arg(w - w0) = [-pi/2, -pi/6] to // arg(sigma - sigma0) = [-pi/2, pi/2] // mapping arg = [-pi/2, -pi/6] to [-pi/2, pi/2] real deta = eta - _eEv.KE(), rad = hypot(xi, deta), // Map the range [-90, 180] in sigma space to [-90, 0] in w space. See // discussion in zetainv0 on the cut for ang. ang = atan2(deta-xi, xi+deta) - real(0.75) * Math::pi(); // Error using this guess is about 0.068 * rad^(5/3) retval = rad < 2 * taytol_; rad = cbrt(3 / _mv * rad); ang /= 3; u = rad * cos(ang); v = rad * sin(ang) + _eEv.K(); } else { // Else use w = sigma * Eu.K/Eu.E (which is correct in the limit _e -> 0) u = xi * _eEu.K()/_eEu.E(); v = eta * _eEu.K()/_eEu.E(); } return retval; } // Invert sigma using Newton's method void TransverseMercatorExact::sigmainv(real xi, real eta, real& u, real& v) const { if (sigmainv0(xi, eta, u, v)) return; // min iterations = 2, max iterations = 7; mean = 3.9 for (int i = 0, trip = 0; i < numit_ || GEOGRAPHICLIB_PANIC; ++i) { real snu, cnu, dnu, snv, cnv, dnv; _eEu.sncndn(u, snu, cnu, dnu); _eEv.sncndn(v, snv, cnv, dnv); real xi1, eta1, du1, dv1; sigma(u, snu, cnu, dnu, v, snv, cnv, dnv, xi1, eta1); dwdsigma(u, snu, cnu, dnu, v, snv, cnv, dnv, du1, dv1); xi1 -= xi; eta1 -= eta; real delu = xi1 * du1 - eta1 * dv1, delv = xi1 * dv1 + eta1 * du1; u -= delu; v -= delv; if (trip) break; real delw2 = Math::sq(delu) + Math::sq(delv); if (!(delw2 >= tol2_)) ++trip; } } void TransverseMercatorExact::Scale(real tau, real /*lam*/, real snu, real cnu, real dnu, real snv, real cnv, real dnv, real& gamma, real& k) const { real sec2 = 1 + Math::sq(tau); // sec(phi)^2 // Lee 55.12 -- negated for our sign convention. gamma gives the bearing // (clockwise from true north) of grid north gamma = atan2(_mv * snu * snv * cnv, cnu * dnu * dnv); // Lee 55.13 with nu given by Lee 9.1 -- in sqrt change the numerator // from // // (1 - snu^2 * dnv^2) to (_mv * snv^2 + cnu^2 * dnv^2) // // to maintain accuracy near phi = 90 and change the denomintor from // // (dnu^2 + dnv^2 - 1) to (_mu * cnu^2 + _mv * cnv^2) // // to maintain accuracy near phi = 0, lam = 90 * (1 - e). Similarly // rewrite sqrt term in 9.1 as // // _mv + _mu * c^2 instead of 1 - _mu * sin(phi)^2 k = sqrt(_mv + _mu / sec2) * sqrt(sec2) * sqrt( (_mv * Math::sq(snv) + Math::sq(cnu * dnv)) / (_mu * Math::sq(cnu) + _mv * Math::sq(cnv)) ); } void TransverseMercatorExact::Forward(real lon0, real lat, real lon, real& x, real& y, real& gamma, real& k) const { lat = Math::LatFix(lat); lon = Math::AngDiff(lon0, lon); // Explicitly enforce the parity int latsign = (!_extendp && signbit(lat)) ? -1 : 1, lonsign = (!_extendp && signbit(lon)) ? -1 : 1; lon *= lonsign; lat *= latsign; bool backside = !_extendp && lon > Math::qd; if (backside) { if (lat == 0) latsign = -1; lon = Math::hd - lon; } real lam = lon * Math::degree(), tau = Math::tand(lat); // u,v = coordinates for the Thompson TM, Lee 54 real u, v; if (lat == Math::qd) { u = _eEu.K(); v = 0; } else if (lat == 0 && lon == Math::qd * (1 - _e)) { u = 0; v = _eEv.K(); } else // tau = tan(phi), taup = sinh(psi) zetainv(Math::taupf(tau, _e), lam, u, v); real snu, cnu, dnu, snv, cnv, dnv; _eEu.sncndn(u, snu, cnu, dnu); _eEv.sncndn(v, snv, cnv, dnv); real xi, eta; sigma(u, snu, cnu, dnu, v, snv, cnv, dnv, xi, eta); if (backside) xi = 2 * _eEu.E() - xi; y = xi * _a * _k0 * latsign; x = eta * _a * _k0 * lonsign; if (lat == Math::qd) { gamma = lon; k = 1; } else { // Recompute (tau, lam) from (u, v) to improve accuracy of Scale zeta(u, snu, cnu, dnu, v, snv, cnv, dnv, tau, lam); tau = Math::tauf(tau, _e); Scale(tau, lam, snu, cnu, dnu, snv, cnv, dnv, gamma, k); gamma /= Math::degree(); } if (backside) gamma = Math::hd - gamma; gamma *= latsign * lonsign; k *= _k0; } void TransverseMercatorExact::Reverse(real lon0, real x, real y, real& lat, real& lon, real& gamma, real& k) const { // This undoes the steps in Forward. real xi = y / (_a * _k0), eta = x / (_a * _k0); // Explicitly enforce the parity int xisign = (!_extendp && signbit(xi)) ? -1 : 1, etasign = (!_extendp && signbit(eta)) ? -1 : 1; xi *= xisign; eta *= etasign; bool backside = !_extendp && xi > _eEu.E(); if (backside) xi = 2 * _eEu.E()- xi; // u,v = coordinates for the Thompson TM, Lee 54 real u, v; if (xi == 0 && eta == _eEv.KE()) { u = 0; v = _eEv.K(); } else sigmainv(xi, eta, u, v); real snu, cnu, dnu, snv, cnv, dnv; _eEu.sncndn(u, snu, cnu, dnu); _eEv.sncndn(v, snv, cnv, dnv); real phi, lam, tau; if (v != 0 || u != _eEu.K()) { zeta(u, snu, cnu, dnu, v, snv, cnv, dnv, tau, lam); tau = Math::tauf(tau, _e); phi = atan(tau); lat = phi / Math::degree(); lon = lam / Math::degree(); Scale(tau, lam, snu, cnu, dnu, snv, cnv, dnv, gamma, k); gamma /= Math::degree(); } else { lat = Math::qd; lon = lam = gamma = 0; k = 1; } if (backside) lon = Math::hd - lon; lon *= etasign; lon = Math::AngNormalize(lon + Math::AngNormalize(lon0)); lat *= xisign; if (backside) gamma = Math::hd - gamma; gamma *= xisign * etasign; k *= _k0; } } // namespace GeographicLib geosphere/src/PolygonArea.h0000644000176200001440000003234014323377037015426 0ustar liggesusers/** * \file PolygonArea.hpp * \brief Header for GeographicLib::PolygonAreaT class * * Copyright (c) Charles Karney (2010-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #if !defined(GEOGRAPHICLIB_POLYGONAREA_HPP) #define GEOGRAPHICLIB_POLYGONAREA_HPP 1 #include "Geodesic.h" #include "GeodesicExact.h" #include "Rhumb.h" #include "Accumulator.h" namespace GeographicLib { /** * \brief Polygon areas * * This computes the area of a polygon whose edges are geodesics using the * method given in Section 6 of * - C. F. F. Karney, * * Algorithms for geodesics, * J. Geodesy 87, 43--55 (2013); * DOI: * 10.1007/s00190-012-0578-z; * addenda: * * geod-addenda.html. * * Arbitrarily complex polygons are allowed. In the case self-intersecting * of polygons the area is accumulated "algebraically", e.g., the areas of * the 2 loops in a figure-8 polygon will partially cancel. * * This class lets you add vertices and edges one at a time to the polygon. * The sequence must start with a vertex and thereafter vertices and edges * can be added in any order. Any vertex after the first creates a new edge * which is the \e shortest geodesic from the previous vertex. In some * cases there may be two or many such shortest geodesics and the area is * then not uniquely defined. In this case, either add an intermediate * vertex or add the edge \e as an edge (by defining its direction and * length). * * The area and perimeter are accumulated at two times the standard floating * point precision to guard against the loss of accuracy with many-sided * polygons. At any point you can ask for the perimeter and area so far. * There's an option to treat the points as defining a polyline instead of a * polygon; in that case, only the perimeter is computed. * * This is a templated class to allow it to be used with Geodesic, * GeodesicExact, and Rhumb. GeographicLib::PolygonArea, * GeographicLib::PolygonAreaExact, and GeographicLib::PolygonAreaRhumb are * typedefs for these cases. * * For GeographicLib::PolygonArea (edges defined by Geodesic), an upper bound * on the error is about 0.1 m2 per vertex. However this is a * wildly pessimistic estimate in most cases. A more realistic estimate of * the error is given by a test involving 107 approximately * regular polygons on the WGS84 ellipsoid. The centers and the orientations * of the polygons were uniformly distributed, the number of vertices was * log-uniformly distributed in [3, 300], and the center to vertex distance * log-uniformly distributed in [0.1 m, 9000 km]. * * Using double precision (the standard precision for GeographicLib), the * maximum error in the perimeter was 200 nm, and the maximum error in the * area was
   *     0.0013 m^2 for perimeter < 10 km
   *     0.0070 m^2 for perimeter < 100 km
   *     0.070 m^2 for perimeter < 1000 km
   *     0.11 m^2 for all perimeters
   * 
* The errors are given in terms of the perimeter, because it is expected * that the errors depend mainly on the number of edges and the edge lengths. * * Using long doubles (GEOGRPAHICLIB_PRECISION = 3), the maximum error in the * perimeter was 200 pm, and the maximum error in the area was
   *     0.7 mm^2 for perim < 10 km
   *     3.2 mm^2 for perimeter < 100 km
   *     21 mm^2 for perimeter < 1000 km
   *     45 mm^2 for all perimeters
   * 
* * @tparam GeodType the geodesic class to use. * * Example of use: * \include example-PolygonArea.cpp * * Planimeter is a command-line utility * providing access to the functionality of PolygonAreaT. **********************************************************************/ template class PolygonAreaT { private: typedef Math::real real; GeodType _earth; real _area0; // Full ellipsoid area bool _polyline; // Assume polyline (don't close and skip area) unsigned _mask; unsigned _num; int _crossings; Accumulator<> _areasum, _perimetersum; real _lat0, _lon0, _lat1, _lon1; static int transit(real lon1, real lon2); // an alternate version of transit to deal with longitudes in the direct // problem. static int transitdirect(real lon1, real lon2); void Remainder(Accumulator<>& a) const { a.remainder(_area0); } void Remainder(real& a) const { using std::remainder; a = remainder(a, _area0); } template void AreaReduce(T& area, int crossings, bool reverse, bool sign) const; public: /** * Constructor for PolygonAreaT. * * @param[in] earth the Geodesic object to use for geodesic calculations. * @param[in] polyline if true that treat the points as defining a polyline * instead of a polygon (default = false). **********************************************************************/ PolygonAreaT(const GeodType& earth, bool polyline = false) : _earth(earth) , _area0(_earth.EllipsoidArea()) , _polyline(polyline) , _mask(GeodType::LATITUDE | GeodType::LONGITUDE | GeodType::DISTANCE | (_polyline ? GeodType::NONE : GeodType::AREA | GeodType::LONG_UNROLL)) { Clear(); } /** * Clear PolygonAreaT, allowing a new polygon to be started. **********************************************************************/ void Clear() { _num = 0; _crossings = 0; _areasum = 0; _perimetersum = 0; _lat0 = _lon0 = _lat1 = _lon1 = Math::NaN(); } /** * Add a point to the polygon or polyline. * * @param[in] lat the latitude of the point (degrees). * @param[in] lon the longitude of the point (degrees). * * \e lat should be in the range [−90°, 90°]. **********************************************************************/ void AddPoint(real lat, real lon); /** * Add an edge to the polygon or polyline. * * @param[in] azi azimuth at current point (degrees). * @param[in] s distance from current point to next point (meters). * * This does nothing if no points have been added yet. Use * PolygonAreaT::CurrentPoint to determine the position of the new vertex. **********************************************************************/ void AddEdge(real azi, real s); /** * Return the results so far. * * @param[in] reverse if true then clockwise (instead of counter-clockwise) * traversal counts as a positive area. * @param[in] sign if true then return a signed result for the area if * the polygon is traversed in the "wrong" direction instead of returning * the area for the rest of the earth. * @param[out] perimeter the perimeter of the polygon or length of the * polyline (meters). * @param[out] area the area of the polygon (meters2); only set * if \e polyline is false in the constructor. * @return the number of points. * * More points can be added to the polygon after this call. **********************************************************************/ unsigned Compute(bool reverse, bool sign, real& perimeter, real& area) const; /** * Return the results assuming a tentative final test point is added; * however, the data for the test point is not saved. This lets you report * a running result for the perimeter and area as the user moves the mouse * cursor. Ordinary floating point arithmetic is used to accumulate the * data for the test point; thus the area and perimeter returned are less * accurate than if PolygonAreaT::AddPoint and PolygonAreaT::Compute are * used. * * @param[in] lat the latitude of the test point (degrees). * @param[in] lon the longitude of the test point (degrees). * @param[in] reverse if true then clockwise (instead of counter-clockwise) * traversal counts as a positive area. * @param[in] sign if true then return a signed result for the area if * the polygon is traversed in the "wrong" direction instead of returning * the area for the rest of the earth. * @param[out] perimeter the approximate perimeter of the polygon or length * of the polyline (meters). * @param[out] area the approximate area of the polygon * (meters2); only set if polyline is false in the * constructor. * @return the number of points. * * \e lat should be in the range [−90°, 90°]. **********************************************************************/ unsigned TestPoint(real lat, real lon, bool reverse, bool sign, real& perimeter, real& area) const; /** * Return the results assuming a tentative final test point is added via an * azimuth and distance; however, the data for the test point is not saved. * This lets you report a running result for the perimeter and area as the * user moves the mouse cursor. Ordinary floating point arithmetic is used * to accumulate the data for the test point; thus the area and perimeter * returned are less accurate than if PolygonAreaT::AddEdge and * PolygonAreaT::Compute are used. * * @param[in] azi azimuth at current point (degrees). * @param[in] s distance from current point to final test point (meters). * @param[in] reverse if true then clockwise (instead of counter-clockwise) * traversal counts as a positive area. * @param[in] sign if true then return a signed result for the area if * the polygon is traversed in the "wrong" direction instead of returning * the area for the rest of the earth. * @param[out] perimeter the approximate perimeter of the polygon or length * of the polyline (meters). * @param[out] area the approximate area of the polygon * (meters2); only set if polyline is false in the * constructor. * @return the number of points. **********************************************************************/ unsigned TestEdge(real azi, real s, bool reverse, bool sign, real& perimeter, real& area) const; /** \name Inspector functions **********************************************************************/ ///@{ /** * @return \e a the equatorial radius of the ellipsoid (meters). This is * the value inherited from the Geodesic object used in the constructor. **********************************************************************/ Math::real EquatorialRadius() const { return _earth.EquatorialRadius(); } /** * @return \e f the flattening of the ellipsoid. This is the value * inherited from the Geodesic object used in the constructor. **********************************************************************/ Math::real Flattening() const { return _earth.Flattening(); } /** * Report the previous vertex added to the polygon or polyline. * * @param[out] lat the latitude of the point (degrees). * @param[out] lon the longitude of the point (degrees). * * If no points have been added, then NaNs are returned. Otherwise, \e lon * will be in the range [−180°, 180°]. **********************************************************************/ void CurrentPoint(real& lat, real& lon) const { lat = _lat1; lon = _lon1; } /** * Report the number of points currently in the polygon or polyline. * * @return the number of points. * * If no points have been added, then 0 is returned. **********************************************************************/ unsigned NumberPoints() const { return _num; } /** * Report whether the current object is a polygon or a polyline. * * @return true if the object is a polyline. **********************************************************************/ bool Polyline() const { return _polyline; } ///@} }; /** * @relates PolygonAreaT * * Polygon areas using Geodesic. This should be used if the flattening is * small. **********************************************************************/ typedef PolygonAreaT PolygonArea; /** * @relates PolygonAreaT * * Polygon areas using GeodesicExact. (But note that the implementation of * areas in GeodesicExact uses a high order series and this is only accurate * for modest flattenings.) **********************************************************************/ typedef PolygonAreaT PolygonAreaExact; /** * @relates PolygonAreaT * * Polygon areas using Rhumb. **********************************************************************/ typedef PolygonAreaT PolygonAreaRhumb; } // namespace GeographicLib #endif // GEOGRAPHICLIB_POLYGONAREA_HPP geosphere/src/GravityModel.cpp0000644000176200001440000003411114323376031016136 0ustar liggesusers/** * \file GravityModel.cpp * \brief Implementation for GeographicLib::GravityModel class * * Copyright (c) Charles Karney (2011-2020) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #include "GravityModel.h" #include #include #include "SphericalEngine.h" #include "GravityCircle.h" #include "Utility.h" #if !defined(GEOGRAPHICLIB_DATA) # if defined(_WIN32) # define GEOGRAPHICLIB_DATA "C:/ProgramData/GeographicLib" # else # define GEOGRAPHICLIB_DATA "/usr/local/share/GeographicLib" # endif #endif #if !defined(GEOGRAPHICLIB_GRAVITY_DEFAULT_NAME) # define GEOGRAPHICLIB_GRAVITY_DEFAULT_NAME "egm96" #endif #if defined(_MSC_VER) // Squelch warnings about unsafe use of getenv # pragma warning (disable: 4996) #endif namespace GeographicLib { using namespace std; GravityModel::GravityModel(const std::string& name, const std::string& path, int Nmax, int Mmax) : _name(name) , _dir(path) , _description("NONE") , _date("UNKNOWN") , _amodel(Math::NaN()) , _gGMmodel(Math::NaN()) , _zeta0(0) , _corrmult(1) , _nmx(-1) , _mmx(-1) , _norm(SphericalHarmonic::FULL) { if (_dir.empty()) _dir = DefaultGravityPath(); bool truncate = Nmax >= 0 || Mmax >= 0; if (truncate) { if (Nmax >= 0 && Mmax < 0) Mmax = Nmax; if (Nmax < 0) Nmax = numeric_limits::max(); if (Mmax < 0) Mmax = numeric_limits::max(); } ReadMetadata(_name); { string coeff = _filename + ".cof"; ifstream coeffstr(coeff.c_str(), ios::binary); if (!coeffstr.good()) throw GeographicErr("Error opening " + coeff); char id[idlength_ + 1]; coeffstr.read(id, idlength_); if (!coeffstr.good()) throw GeographicErr("No header in " + coeff); id[idlength_] = '\0'; if (_id != string(id)) throw GeographicErr("ID mismatch: " + _id + " vs " + id); int N, M; if (truncate) { N = Nmax; M = Mmax; } SphericalEngine::coeff::readcoeffs(coeffstr, N, M, _cCx, _sSx, truncate); if (!(N >= 0 && M >= 0)) throw GeographicErr("Degree and order must be at least 0"); if (_cCx[0] != 0) throw GeographicErr("The degree 0 term should be zero"); _cCx[0] = 1; // Include the 1/r term in the sum _gravitational = SphericalHarmonic(_cCx, _sSx, N, N, M, _amodel, _norm); if (truncate) { N = Nmax; M = Mmax; } SphericalEngine::coeff::readcoeffs(coeffstr, N, M, _cCC, _cCS, truncate); if (N < 0) { N = M = 0; _cCC.resize(1, real(0)); } _cCC[0] += _zeta0 / _corrmult; _correction = SphericalHarmonic(_cCC, _cCS, N, N, M, real(1), _norm); int pos = int(coeffstr.tellg()); coeffstr.seekg(0, ios::end); if (pos != coeffstr.tellg()) throw GeographicErr("Extra data in " + coeff); } int nmx = _gravitational.Coefficients().nmx(); _nmx = max(nmx, _correction.Coefficients().nmx()); _mmx = max(_gravitational.Coefficients().mmx(), _correction.Coefficients().mmx()); // Adjust the normalization of the normal potential to match the model. real mult = _earth._gGM / _gGMmodel; real amult = Math::sq(_earth._a / _amodel); // The 0th term in _zonal should be is 1 + _dzonal0. Instead set it to 1 // to give exact cancellation with the (0,0) term in the model and account // for _dzonal0 separately. _zonal.clear(); _zonal.push_back(1); _dzonal0 = (_earth.MassConstant() - _gGMmodel) / _gGMmodel; for (int n = 2; n <= nmx; n += 2) { // Only include as many normal zonal terms as matter. Figuring the limit // in this way works because the coefficients of the normal potential // (which is smooth) decay much more rapidly that the corresponding // coefficient of the model potential (which is bumpy). Typically this // goes out to n = 18. mult *= amult; real r = _cCx[n], // the model term s = - mult * _earth.Jn(n) / sqrt(real(2 * n + 1)), // the normal term t = r - s; // the difference if (t == r) // the normal term is negligible break; _zonal.push_back(0); // index = n - 1; the odd terms are 0 _zonal.push_back(s); } int nmx1 = int(_zonal.size()) - 1; _disturbing = SphericalHarmonic1(_cCx, _sSx, _gravitational.Coefficients().N(), nmx, _gravitational.Coefficients().mmx(), _zonal, _zonal, // This is not accessed! nmx1, nmx1, 0, _amodel, SphericalHarmonic1::normalization(_norm)); } void GravityModel::ReadMetadata(const string& name) { const char* spaces = " \t\n\v\f\r"; _filename = _dir + "/" + name + ".egm"; ifstream metastr(_filename.c_str()); if (!metastr.good()) throw GeographicErr("Cannot open " + _filename); string line; getline(metastr, line); if (!(line.size() >= 6 && line.substr(0,5) == "EGMF-")) throw GeographicErr(_filename + " does not contain EGMF-n signature"); string::size_type n = line.find_first_of(spaces, 5); if (n != string::npos) n -= 5; string version(line, 5, n); if (version != "1") throw GeographicErr("Unknown version in " + _filename + ": " + version); string key, val; real a = Math::NaN(), GM = a, omega = a, f = a, J2 = a; while (getline(metastr, line)) { if (!Utility::ParseLine(line, key, val)) continue; // Process key words if (key == "Name") _name = val; else if (key == "Description") _description = val; else if (key == "ReleaseDate") _date = val; else if (key == "ModelRadius") _amodel = Utility::val(val); else if (key == "ModelMass") _gGMmodel = Utility::val(val); else if (key == "AngularVelocity") omega = Utility::val(val); else if (key == "ReferenceRadius") a = Utility::val(val); else if (key == "ReferenceMass") GM = Utility::val(val); else if (key == "Flattening") f = Utility::fract(val); else if (key == "DynamicalFormFactor") J2 = Utility::fract(val); else if (key == "HeightOffset") _zeta0 = Utility::fract(val); else if (key == "CorrectionMultiplier") _corrmult = Utility::fract(val); else if (key == "Normalization") { if (val == "FULL" || val == "Full" || val == "full") _norm = SphericalHarmonic::FULL; else if (val == "SCHMIDT" || val == "Schmidt" || val == "schmidt") _norm = SphericalHarmonic::SCHMIDT; else throw GeographicErr("Unknown normalization " + val); } else if (key == "ByteOrder") { if (val == "Big" || val == "big") throw GeographicErr("Only little-endian ordering is supported"); else if (!(val == "Little" || val == "little")) throw GeographicErr("Unknown byte ordering " + val); } else if (key == "ID") _id = val; // else unrecognized keywords are skipped } // Check values if (!(isfinite(_amodel) && _amodel > 0)) throw GeographicErr("Model radius must be positive"); if (!(isfinite(_gGMmodel) && _gGMmodel > 0)) throw GeographicErr("Model mass constant must be positive"); if (!(isfinite(_corrmult) && _corrmult > 0)) throw GeographicErr("Correction multiplier must be positive"); if (!(isfinite(_zeta0))) throw GeographicErr("Height offset must be finite"); if (int(_id.size()) != idlength_) throw GeographicErr("Invalid ID"); if (isfinite(f) && isfinite(J2)) throw GeographicErr("Cannot specify both f and J2"); _earth = NormalGravity(a, GM, omega, isfinite(f) ? f : J2, isfinite(f)); } Math::real GravityModel::InternalT(real X, real Y, real Z, real& deltaX, real& deltaY, real& deltaZ, bool gradp, bool correct) const { // If correct, then produce the correct T = W - U. Otherwise, neglect the // n = 0 term (which is proportial to the difference in the model and // reference values of GM). if (_dzonal0 == 0) // No need to do the correction correct = false; real T, invR = correct ? 1 / hypot(hypot(X, Y), Z) : 1; if (gradp) { // initial values to suppress warnings deltaX = deltaY = deltaZ = 0; T = _disturbing(-1, X, Y, Z, deltaX, deltaY, deltaZ); real f = _gGMmodel / _amodel; deltaX *= f; deltaY *= f; deltaZ *= f; if (correct) { invR = _gGMmodel * _dzonal0 * invR * invR * invR; deltaX += X * invR; deltaY += Y * invR; deltaZ += Z * invR; } } else T = _disturbing(-1, X, Y, Z); T = (T / _amodel - (correct ? _dzonal0 : 0) * invR) * _gGMmodel; return T; } Math::real GravityModel::V(real X, real Y, real Z, real& GX, real& GY, real& GZ) const { real Vres = _gravitational(X, Y, Z, GX, GY, GZ), f = _gGMmodel / _amodel; Vres *= f; GX *= f; GY *= f; GZ *= f; return Vres; } Math::real GravityModel::W(real X, real Y, real Z, real& gX, real& gY, real& gZ) const { real fX, fY, Wres = V(X, Y, Z, gX, gY, gZ) + _earth.Phi(X, Y, fX, fY); gX += fX; gY += fY; return Wres; } void GravityModel::SphericalAnomaly(real lat, real lon, real h, real& Dg01, real& xi, real& eta) const { real X, Y, Z, M[Geocentric::dim2_]; _earth.Earth().IntForward(lat, lon, h, X, Y, Z, M); real deltax, deltay, deltaz, T = InternalT(X, Y, Z, deltax, deltay, deltaz, true, false), clam = M[3], slam = -M[0], P = hypot(X, Y), R = hypot(P, Z), // psi is geocentric latitude cpsi = R != 0 ? P / R : M[7], spsi = R != 0 ? Z / R : M[8]; // Rotate cartesian into spherical coordinates real MC[Geocentric::dim2_]; Geocentric::Rotation(spsi, cpsi, slam, clam, MC); Geocentric::Unrotate(MC, deltax, deltay, deltaz, deltax, deltay, deltaz); // H+M, Eq 2-151c Dg01 = - deltaz - 2 * T / R; real gammaX, gammaY, gammaZ; _earth.U(X, Y, Z, gammaX, gammaY, gammaZ); real gamma = hypot( hypot(gammaX, gammaY), gammaZ); xi = -(deltay/gamma) / Math::degree(); eta = -(deltax/gamma) / Math::degree(); } Math::real GravityModel::GeoidHeight(real lat, real lon) const { real X, Y, Z; _earth.Earth().IntForward(lat, lon, 0, X, Y, Z, NULL); real gamma0 = _earth.SurfaceGravity(lat), dummy, T = InternalT(X, Y, Z, dummy, dummy, dummy, false, false), invR = 1 / hypot(hypot(X, Y), Z), correction = _corrmult * _correction(invR * X, invR * Y, invR * Z); // _zeta0 has been included in _correction return T/gamma0 + correction; } Math::real GravityModel::Gravity(real lat, real lon, real h, real& gx, real& gy, real& gz) const { real X, Y, Z, M[Geocentric::dim2_]; _earth.Earth().IntForward(lat, lon, h, X, Y, Z, M); real Wres = W(X, Y, Z, gx, gy, gz); Geocentric::Unrotate(M, gx, gy, gz, gx, gy, gz); return Wres; } Math::real GravityModel::Disturbance(real lat, real lon, real h, real& deltax, real& deltay, real& deltaz) const { real X, Y, Z, M[Geocentric::dim2_]; _earth.Earth().IntForward(lat, lon, h, X, Y, Z, M); real Tres = InternalT(X, Y, Z, deltax, deltay, deltaz, true, true); Geocentric::Unrotate(M, deltax, deltay, deltaz, deltax, deltay, deltaz); return Tres; } GravityCircle GravityModel::Circle(real lat, real h, unsigned caps) const { if (h != 0) // Disallow invoking GeoidHeight unless h is zero. caps &= ~(CAP_GAMMA0 | CAP_C); real X, Y, Z, M[Geocentric::dim2_]; _earth.Earth().IntForward(lat, 0, h, X, Y, Z, M); // Y = 0, cphi = M[7], sphi = M[8]; real invR = 1 / hypot(X, Z), gamma0 = (caps & CAP_GAMMA0 ?_earth.SurfaceGravity(lat) : Math::NaN()), fx, fy, fz, gamma; if (caps & CAP_GAMMA) { _earth.U(X, Y, Z, fx, fy, fz); // fy = 0 gamma = hypot(fx, fz); } else gamma = Math::NaN(); _earth.Phi(X, Y, fx, fy); return GravityCircle(GravityCircle::mask(caps), _earth._a, _earth._f, lat, h, Z, X, M[7], M[8], _amodel, _gGMmodel, _dzonal0, _corrmult, gamma0, gamma, fx, caps & CAP_G ? _gravitational.Circle(X, Z, true) : CircularEngine(), // N.B. If CAP_DELTA is set then CAP_T should be too. caps & CAP_T ? _disturbing.Circle(-1, X, Z, (caps&CAP_DELTA) != 0) : CircularEngine(), caps & CAP_C ? _correction.Circle(invR * X, invR * Z, false) : CircularEngine()); } string GravityModel::DefaultGravityPath() { string path; char* gravitypath = getenv("GEOGRAPHICLIB_GRAVITY_PATH"); if (gravitypath) path = string(gravitypath); if (!path.empty()) return path; char* datapath = getenv("GEOGRAPHICLIB_DATA"); if (datapath) path = string(datapath); return (!path.empty() ? path : string(GEOGRAPHICLIB_DATA)) + "/gravity"; } string GravityModel::DefaultGravityName() { string name; char* gravityname = getenv("GEOGRAPHICLIB_GRAVITY_NAME"); if (gravityname) name = string(gravityname); return !name.empty() ? name : string(GEOGRAPHICLIB_GRAVITY_DEFAULT_NAME); } } // namespace GeographicLib geosphere/src/NearestNeighbor.h0000644000176200001440000010554714323400352016262 0ustar liggesusers/** * \file NearestNeighbor.hpp * \brief Header for GeographicLib::NearestNeighbor class * * Copyright (c) Charles Karney (2016-2020) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #if !defined(GEOGRAPHICLIB_NEARESTNEIGHBOR_HPP) #define GEOGRAPHICLIB_NEARESTNEIGHBOR_HPP 1 #include // for nth_element, max_element, etc. #include #include // for priority_queue #include // for swap + pair #include #include #include #include #include // Only for GeographicLib::GeographicErr #include "Constants.h" #if defined(GEOGRAPHICLIB_HAVE_BOOST_SERIALIZATION) && \ GEOGRAPHICLIB_HAVE_BOOST_SERIALIZATION #include #include #include #include #endif #if defined(_MSC_VER) // Squelch warnings about constant conditional expressions # pragma warning (push) # pragma warning (disable: 4127) #endif namespace GeographicLib { /** * \brief Nearest-neighbor calculations * * This class solves the nearest-neighbor problm using a vantage-point tree * as described in \ref nearest. * * This class is templated so that it can handle arbitrary metric spaces as * follows: * * @tparam dist_t the type used for measuring distances; it can be a real or * signed integer type; in typical geodetic applications, \e dist_t might * be double. * @tparam pos_t the type for specifying the positions of points; geodetic * application might bundle the latitude and longitude into a * std::pair. * @tparam distfun_t the type of a function object which takes takes two * positions (of type \e pos_t) and returns the distance (of type \e * dist_t); in geodetic applications, this might be a class which is * constructed with a Geodesic object and which implements a member * function with a signature dist_t operator() (const pos_t&, const * pos_t&) const, which returns the geodesic distance between two * points. * * \note The distance measure must satisfy the triangle inequality, \f$ * d(a,c) \le d(a,b) + d(b,c) \f$ for all points \e a, \e b, \e c. The * geodesic distance (given by Geodesic::Inverse) does, while the great * ellipse distance and the rhumb line distance do not. If you use * the ordinary Euclidean distance, i.e., \f$ \sqrt{(x_a-x_b)^2 + * (y_a-y_b)^2} \f$ for two dimensions, don't be tempted to leave out the * square root in the interests of "efficiency"; the squared distance does * not satisfy the triangle inequality! * * \note This is a "header-only" implementation and, as such, depends in a * minimal way on the rest of GeographicLib (the only dependency is through * the use of GeographicLib::GeographicErr for handling and run-time * exceptions). Therefore, it is easy to extract this class from the rest of * GeographicLib and use it as a stand-alone facility. * * The \e dist_t type must support numeric_limits queries (specifically: * is_signed, is_integer, max(), digits). * * The NearestNeighbor object is constructed with a vector of points (type \e * pos_t) and a distance function (type \e distfun_t). However the object * does \e not store the points. When querying the object with Search(), * it's necessary to supply the same vector of points and the same distance * function. * * There's no capability in this implementation to add or remove points from * the set. Instead Initialize() should be called to re-initialize the * object with the modified vector of points. * * Because of the overhead in constructing a NearestNeighbor object for a * large set of points, functions Save() and Load() are provided to save the * object to an external file. operator<<(), operator>>() and Boost * serialization can also be used to save and restore a NearestNeighbor * object. This is illustrated in the example. * * Example of use: * \include example-NearestNeighbor.cpp **********************************************************************/ template class NearestNeighbor { // For tracking changes to the I/O format static const int version = 1; // This is what we get "free"; but if sizeof(dist_t) = 1 (unlikely), allow // 4 slots (and this accommodates the default value bucket = 4). static const int maxbucket = (2 + ((4 * sizeof(dist_t)) / sizeof(int) >= 2 ? (4 * sizeof(dist_t)) / sizeof(int) : 2)); public: /** * Default constructor for NearestNeighbor. * * This is equivalent to specifying an empty set of points. **********************************************************************/ NearestNeighbor() : _numpoints(0), _bucket(0), _cost(0) {} /** * Constructor for NearestNeighbor. * * @param[in] pts a vector of points to include in the set. * @param[in] dist the distance function object. * @param[in] bucket the size of the buckets at the leaf nodes; this must * lie in [0, 2 + 4*sizeof(dist_t)/sizeof(int)] (default 4). * @exception GeographicErr if the value of \e bucket is out of bounds or * the size of \e pts is too big for an int. * @exception std::bad_alloc if memory for the tree can't be allocated. * * \e pts may contain coincident points (i.e., the distance between them * vanishes); these are treated as distinct. * * The choice of \e bucket is a tradeoff between space and efficiency. A * larger \e bucket decreases the size of the NearestNeighbor object which * scales as pts.size() / max(1, bucket) and reduces the number of distance * calculations to construct the object by log2(bucket) * pts.size(). * However each search then requires about bucket additional distance * calculations. * * \warning The distances computed by \e dist must satisfy the standard * metric conditions. If not, the results are undefined. Neither the data * in \e pts nor the query points should contain NaNs or infinities because * such data violates the metric conditions. * * \warning The same arguments \e pts and \e dist must be provided * to the Search() function. **********************************************************************/ NearestNeighbor(const std::vector& pts, const distfun_t& dist, int bucket = 4) { Initialize(pts, dist, bucket); } /** * Initialize or re-initialize NearestNeighbor. * * @param[in] pts a vector of points to include in the tree. * @param[in] dist the distance function object. * @param[in] bucket the size of the buckets at the leaf nodes; this must * lie in [0, 2 + 4*sizeof(dist_t)/sizeof(int)] (default 4). * @exception GeographicErr if the value of \e bucket is out of bounds or * the size of \e pts is too big for an int. * @exception std::bad_alloc if memory for the tree can't be allocated. * * See also the documentation on the constructor. * * If an exception is thrown, the state of the NearestNeighbor is * unchanged. **********************************************************************/ void Initialize(const std::vector& pts, const distfun_t& dist, int bucket = 4) { static_assert(std::numeric_limits::is_signed, "dist_t must be a signed type"); if (!( 0 <= bucket && bucket <= maxbucket )) throw GeographicLib::GeographicErr ("bucket must lie in [0, 2 + 4*sizeof(dist_t)/sizeof(int)]"); if (pts.size() > size_t(std::numeric_limits::max())) throw GeographicLib::GeographicErr("pts array too big"); // the pair contains distance+id std::vector ids(pts.size()); for (int k = int(ids.size()); k--;) ids[k] = std::make_pair(dist_t(0), k); int cost = 0; std::vector tree; init(pts, dist, bucket, tree, ids, cost, 0, int(ids.size()), int(ids.size()/2)); _tree.swap(tree); _numpoints = int(pts.size()); _bucket = bucket; _mc = _sc = 0; _cost = cost; _c1 = _k = _cmax = 0; _cmin = std::numeric_limits::max(); } /** * Search the NearestNeighbor. * * @param[in] pts the vector of points used for initialization. * @param[in] dist the distance function object used for initialization. * @param[in] query the query point. * @param[out] ind a vector of indices to the closest points found. * @param[in] k the number of points to search for (default = 1). * @param[in] maxdist only return points with distances of \e maxdist or * less from \e query (default is the maximum \e dist_t). * @param[in] mindist only return points with distances of more than * \e mindist from \e query (default = −1). * @param[in] exhaustive whether to do an exhaustive search (default true). * @param[in] tol the tolerance on the results (default 0). * @return the distance to the closest point found (−1 if no points * are found). * @exception GeographicErr if \e pts has a different size from that used * to construct the object. * * The indices returned in \e ind are sorted by distance from \e query * (closest first). * * The simplest invocation is with just the 4 non-optional arguments. This * returns the closest distance and the index to the closest point in * ind0. If there are several points equally close, then * ind0 gives the index of an arbirary one of them. If * there's no closest point (because the set of points is empty), then \e * ind is empty and −1 is returned. * * With \e exhaustive = true and \e tol = 0 (their default values), this * finds the indices of \e k closest neighbors to \e query whose distances * to \e query are in (\e mindist, \e maxdist]. If \e mindist and \e * maxdist have their default values, then these bounds have no effect. If * \e query is one of the points in the tree, then set \e mindist = 0 to * prevent this point (and other coincident points) from being returned. * * If \e exhaustive = false, exit as soon as \e k results satisfying the * distance criteria are found. If less than \e k results are returned * then the search was exhaustive even if \e exhaustive = false. * * If \e tol is positive, do an approximate search; in this case the * results are to be interpreted as follows: if the k'th distance is * \e dk, then all results with distances less than or equal \e dk − * \e tol are correct; all others are suspect — there may be other * closer results with distances greater or equal to \e dk − \e tol. * If less than \e k results are found, then the search is exact. * * \e mindist should be used to exclude a "small" neighborhood of the query * point (relative to the average spacing of the data). If \e mindist is * large, the efficiency of the search deteriorates. * * \note Only the shortest distance is returned (as as the function value). * The distances to other points (indexed by indj * for \e j > 0) can be found by invoking \e dist again. * * \warning The arguments \e pts and \e dist must be identical to those * used to initialize the NearestNeighbor; if not, this function will * return some meaningless result (however, if the size of \e pts is wrong, * this function throw an exception). * * \warning The query point cannot be a NaN or infinite because then the * metric conditions are violated. **********************************************************************/ dist_t Search(const std::vector& pts, const distfun_t& dist, const pos_t& query, std::vector& ind, int k = 1, dist_t maxdist = std::numeric_limits::max(), dist_t mindist = -1, bool exhaustive = true, dist_t tol = 0) const { if (_numpoints != int(pts.size())) throw GeographicLib::GeographicErr("pts array has wrong size"); std::priority_queue results; if (_numpoints > 0 && k > 0 && maxdist > mindist) { // distance to the kth closest point so far dist_t tau = maxdist; // first is negative of how far query is outside boundary of node // +1 if on boundary or inside // second is node index std::priority_queue todo; todo.push(std::make_pair(dist_t(1), int(_tree.size()) - 1)); int c = 0; while (!todo.empty()) { int n = todo.top().second; dist_t d = -todo.top().first; todo.pop(); dist_t tau1 = tau - tol; // compare tau and d again since tau may have become smaller. if (!( n >= 0 && tau1 >= d )) continue; const Node& current = _tree[n]; dist_t dst = 0; // to suppress warning about uninitialized variable bool exitflag = false, leaf = current.index < 0; for (int i = 0; i < (leaf ? _bucket : 1); ++i) { int index = leaf ? current.leaves[i] : current.index; if (index < 0) break; dst = dist(pts[index], query); ++c; if (dst > mindist && dst <= tau) { if (int(results.size()) == k) results.pop(); results.push(std::make_pair(dst, index)); if (int(results.size()) == k) { if (exhaustive) tau = results.top().first; else { exitflag = true; break; } if (tau <= tol) { exitflag = true; break; } } } } if (exitflag) break; if (current.index < 0) continue; tau1 = tau - tol; for (int l = 0; l < 2; ++l) { if (current.data.child[l] >= 0 && dst + current.data.upper[l] >= mindist) { if (dst < current.data.lower[l]) { d = current.data.lower[l] - dst; if (tau1 >= d) todo.push(std::make_pair(-d, current.data.child[l])); } else if (dst > current.data.upper[l]) { d = dst - current.data.upper[l]; if (tau1 >= d) todo.push(std::make_pair(-d, current.data.child[l])); } else todo.push(std::make_pair(dist_t(1), current.data.child[l])); } } } ++_k; _c1 += c; double omc = _mc; _mc += (c - omc) / _k; _sc += (c - omc) * (c - _mc); if (c > _cmax) _cmax = c; if (c < _cmin) _cmin = c; } dist_t d = -1; ind.resize(results.size()); for (int i = int(ind.size()); i--;) { ind[i] = int(results.top().second); if (i == 0) d = results.top().first; results.pop(); } return d; } /** * @return the total number of points in the set. **********************************************************************/ int NumPoints() const { return _numpoints; } /** * Write the object to an I/O stream. * * @param[in,out] os the stream to write to. * @param[in] bin if true (the default) save in binary mode. * @exception std::bad_alloc if memory for the string representation of the * object can't be allocated. * * The counters tracking the statistics of searches are not saved; however * the initializtion cost is saved. The format of the binary saves is \e * not portable. * * \note * Boost serialization can also be used to save and restore a * NearestNeighbor object. This requires that the * GEOGRAPHICLIB_HAVE_BOOST_SERIALIZATION macro be defined. **********************************************************************/ void Save(std::ostream& os, bool bin = true) const { int realspec = std::numeric_limits::digits * (std::numeric_limits::is_integer ? -1 : 1); if (bin) { char id[] = "NearestNeighbor_"; os.write(id, 16); int buf[6]; buf[0] = version; buf[1] = realspec; buf[2] = _bucket; buf[3] = _numpoints; buf[4] = int(_tree.size()); buf[5] = _cost; os.write(reinterpret_cast(buf), 6 * sizeof(int)); for (int i = 0; i < int(_tree.size()); ++i) { const Node& node = _tree[i]; os.write(reinterpret_cast(&node.index), sizeof(int)); if (node.index >= 0) { os.write(reinterpret_cast(node.data.lower), 2 * sizeof(dist_t)); os.write(reinterpret_cast(node.data.upper), 2 * sizeof(dist_t)); os.write(reinterpret_cast(node.data.child), 2 * sizeof(int)); } else { os.write(reinterpret_cast(node.leaves), _bucket * sizeof(int)); } } } else { std::stringstream ostring; // Ensure enough precision for type dist_t. With C++11, max_digits10 // can be used instead. if (!std::numeric_limits::is_integer) { static const int prec = int(std::ceil(std::numeric_limits::digits * std::log10(2.0) + 1)); ostring.precision(prec); } ostring << version << " " << realspec << " " << _bucket << " " << _numpoints << " " << _tree.size() << " " << _cost; for (int i = 0; i < int(_tree.size()); ++i) { const Node& node = _tree[i]; ostring << "\n" << node.index; if (node.index >= 0) { for (int l = 0; l < 2; ++l) ostring << " " << node.data.lower[l] << " " << node.data.upper[l] << " " << node.data.child[l]; } else { for (int l = 0; l < _bucket; ++l) ostring << " " << node.leaves[l]; } } os << ostring.str(); } } /** * Read the object from an I/O stream. * * @param[in,out] is the stream to read from * @param[in] bin if true (the default) load in binary mode. * @exception GeographicErr if the state read from \e is is illegal. * @exception std::bad_alloc if memory for the tree can't be allocated. * * The counters tracking the statistics of searches are reset by this * operation. Binary data must have been saved on a machine with the same * architecture. If an exception is thrown, the state of the * NearestNeighbor is unchanged. * * \note * Boost serialization can also be used to save and restore a * NearestNeighbor object. This requires that the * GEOGRAPHICLIB_HAVE_BOOST_SERIALIZATION macro be defined. * * \warning The same arguments \e pts and \e dist used for * initialization must be provided to the Search() function. **********************************************************************/ void Load(std::istream& is, bool bin = true) { int version1, realspec, bucket, numpoints, treesize, cost; if (bin) { char id[17]; is.read(id, 16); id[16] = '\0'; if (!(std::strcmp(id, "NearestNeighbor_") == 0)) throw GeographicLib::GeographicErr("Bad ID"); is.read(reinterpret_cast(&version1), sizeof(int)); is.read(reinterpret_cast(&realspec), sizeof(int)); is.read(reinterpret_cast(&bucket), sizeof(int)); is.read(reinterpret_cast(&numpoints), sizeof(int)); is.read(reinterpret_cast(&treesize), sizeof(int)); is.read(reinterpret_cast(&cost), sizeof(int)); } else { if (!( is >> version1 >> realspec >> bucket >> numpoints >> treesize >> cost )) throw GeographicLib::GeographicErr("Bad header"); } if (!( version1 == version )) throw GeographicLib::GeographicErr("Incompatible version"); if (!( realspec == std::numeric_limits::digits * (std::numeric_limits::is_integer ? -1 : 1) )) throw GeographicLib::GeographicErr("Different dist_t types"); if (!( 0 <= bucket && bucket <= maxbucket )) throw GeographicLib::GeographicErr("Bad bucket size"); if (!( 0 <= treesize && treesize <= numpoints )) throw GeographicLib::GeographicErr("Bad number of points or tree size"); if (!( 0 <= cost )) throw GeographicLib::GeographicErr("Bad value for cost"); std::vector tree; tree.reserve(treesize); for (int i = 0; i < treesize; ++i) { Node node; if (bin) { is.read(reinterpret_cast(&node.index), sizeof(int)); if (node.index >= 0) { is.read(reinterpret_cast(node.data.lower), 2 * sizeof(dist_t)); is.read(reinterpret_cast(node.data.upper), 2 * sizeof(dist_t)); is.read(reinterpret_cast(node.data.child), 2 * sizeof(int)); } else { is.read(reinterpret_cast(node.leaves), bucket * sizeof(int)); for (int l = bucket; l < maxbucket; ++l) node.leaves[l] = 0; } } else { if (!( is >> node.index )) throw GeographicLib::GeographicErr("Bad index"); if (node.index >= 0) { for (int l = 0; l < 2; ++l) { if (!( is >> node.data.lower[l] >> node.data.upper[l] >> node.data.child[l] )) throw GeographicLib::GeographicErr("Bad node data"); } } else { // Must be at least one valid leaf followed by a sequence end // markers (-1). for (int l = 0; l < bucket; ++l) { if (!( is >> node.leaves[l] )) throw GeographicLib::GeographicErr("Bad leaf data"); } for (int l = bucket; l < maxbucket; ++l) node.leaves[l] = 0; } } node.Check(numpoints, treesize, bucket); tree.push_back(node); } _tree.swap(tree); _numpoints = numpoints; _bucket = bucket; _mc = _sc = 0; _cost = cost; _c1 = _k = _cmax = 0; _cmin = std::numeric_limits::max(); } /** * Write the object to stream \e os as text. * * @param[in,out] os the output stream. * @param[in] t the NearestNeighbor object to be saved. * @exception std::bad_alloc if memory for the string representation of the * object can't be allocated. **********************************************************************/ friend std::ostream& operator<<(std::ostream& os, const NearestNeighbor& t) { t.Save(os, false); return os; } /** * Read the object from stream \e is as text. * * @param[in,out] is the input stream. * @param[out] t the NearestNeighbor object to be loaded. * @exception GeographicErr if the state read from \e is is illegal. * @exception std::bad_alloc if memory for the tree can't be allocated. **********************************************************************/ friend std::istream& operator>>(std::istream& is, NearestNeighbor& t) { t.Load(is, false); return is; } /** * Swap with another NearestNeighbor object. * * @param[in,out] t the NearestNeighbor object to swap with. **********************************************************************/ void swap(NearestNeighbor& t) { std::swap(_numpoints, t._numpoints); std::swap(_bucket, t._bucket); std::swap(_cost, t._cost); _tree.swap(t._tree); std::swap(_mc, t._mc); std::swap(_sc, t._sc); std::swap(_c1, t._c1); std::swap(_k, t._k); std::swap(_cmin, t._cmin); std::swap(_cmax, t._cmax); } /** * The accumulated statistics on the searches so far. * * @param[out] setupcost the cost of initializing the NearestNeighbor. * @param[out] numsearches the number of calls to Search(). * @param[out] searchcost the total cost of the calls to Search(). * @param[out] mincost the minimum cost of a Search(). * @param[out] maxcost the maximum cost of a Search(). * @param[out] mean the mean cost of a Search(). * @param[out] sd the standard deviation in the cost of a Search(). * * Here "cost" measures the number of distance calculations needed. Note * that the accumulation of statistics is \e not thread safe. **********************************************************************/ void Statistics(int& setupcost, int& numsearches, int& searchcost, int& mincost, int& maxcost, double& mean, double& sd) const { setupcost = _cost; numsearches = _k; searchcost = _c1; mincost = _cmin; maxcost = _cmax; mean = _mc; sd = std::sqrt(_sc / (_k - 1)); } /** * Reset the counters for the accumulated statistics on the searches so * far. **********************************************************************/ void ResetStatistics() const { _mc = _sc = 0; _c1 = _k = _cmax = 0; _cmin = std::numeric_limits::max(); } private: // Package up a dist_t and an int. We will want to sort on the dist_t so // put it first. typedef std::pair item; // \cond SKIP class Node { public: struct bounds { dist_t lower[2], upper[2]; // bounds on inner/outer distances int child[2]; }; union { bounds data; int leaves[maxbucket]; }; int index; Node() : index(-1) { for (int i = 0; i < 2; ++i) { data.lower[i] = data.upper[i] = 0; data.child[i] = -1; } } // Sanity check on a Node void Check(int numpoints, int treesize, int bucket) const { if (!( -1 <= index && index < numpoints )) throw GeographicLib::GeographicErr("Bad index"); if (index >= 0) { if (!( -1 <= data.child[0] && data.child[0] < treesize && -1 <= data.child[1] && data.child[1] < treesize )) throw GeographicLib::GeographicErr("Bad child pointers"); if (!( 0 <= data.lower[0] && data.lower[0] <= data.upper[0] && data.upper[0] <= data.lower[1] && data.lower[1] <= data.upper[1] )) throw GeographicLib::GeographicErr("Bad bounds"); } else { // Must be at least one valid leaf followed by a sequence end markers // (-1). bool start = true; for (int l = 0; l < bucket; ++l) { if (!( (start ? ((l == 0 ? 0 : -1) <= leaves[l] && leaves[l] < numpoints) : leaves[l] == -1) )) throw GeographicLib::GeographicErr("Bad leaf data"); start = leaves[l] >= 0; } for (int l = bucket; l < maxbucket; ++l) { if (leaves[l] != 0) throw GeographicLib::GeographicErr("Bad leaf data"); } } } #if defined(GEOGRAPHICLIB_HAVE_BOOST_SERIALIZATION) && \ GEOGRAPHICLIB_HAVE_BOOST_SERIALIZATION friend class boost::serialization::access; template void save(Archive& ar, const unsigned int) const { ar & boost::serialization::make_nvp("index", index); if (index < 0) ar & boost::serialization::make_nvp("leaves", leaves); else ar & boost::serialization::make_nvp("lower", data.lower) & boost::serialization::make_nvp("upper", data.upper) & boost::serialization::make_nvp("child", data.child); } template void load(Archive& ar, const unsigned int) { ar & boost::serialization::make_nvp("index", index); if (index < 0) ar & boost::serialization::make_nvp("leaves", leaves); else ar & boost::serialization::make_nvp("lower", data.lower) & boost::serialization::make_nvp("upper", data.upper) & boost::serialization::make_nvp("child", data.child); } template void serialize(Archive& ar, const unsigned int file_version) { boost::serialization::split_member(ar, *this, file_version); } #endif }; // \endcond #if defined(GEOGRAPHICLIB_HAVE_BOOST_SERIALIZATION) && \ GEOGRAPHICLIB_HAVE_BOOST_SERIALIZATION friend class boost::serialization::access; template void save(Archive& ar, const unsigned) const { int realspec = std::numeric_limits::digits * (std::numeric_limits::is_integer ? -1 : 1); // Need to use version1, otherwise load error in debug mode on Linux: // undefined reference to GeographicLib::NearestNeighbor<...>::version. int version1 = version; ar & boost::serialization::make_nvp("version", version1) & boost::serialization::make_nvp("realspec", realspec) & boost::serialization::make_nvp("bucket", _bucket) & boost::serialization::make_nvp("numpoints", _numpoints) & boost::serialization::make_nvp("cost", _cost) & boost::serialization::make_nvp("tree", _tree); } template void load(Archive& ar, const unsigned) { int version1, realspec, bucket, numpoints, cost; ar & boost::serialization::make_nvp("version", version1); if (version1 != version) throw GeographicLib::GeographicErr("Incompatible version"); std::vector tree; ar & boost::serialization::make_nvp("realspec", realspec); if (!( realspec == std::numeric_limits::digits * (std::numeric_limits::is_integer ? -1 : 1) )) throw GeographicLib::GeographicErr("Different dist_t types"); ar & boost::serialization::make_nvp("bucket", bucket); if (!( 0 <= bucket && bucket <= maxbucket )) throw GeographicLib::GeographicErr("Bad bucket size"); ar & boost::serialization::make_nvp("numpoints", numpoints) & boost::serialization::make_nvp("cost", cost) & boost::serialization::make_nvp("tree", tree); if (!( 0 <= int(tree.size()) && int(tree.size()) <= numpoints )) throw GeographicLib::GeographicErr("Bad number of points or tree size"); for (int i = 0; i < int(tree.size()); ++i) tree[i].Check(numpoints, int(tree.size()), bucket); _tree.swap(tree); _numpoints = numpoints; _bucket = bucket; _mc = _sc = 0; _cost = cost; _c1 = _k = _cmax = 0; _cmin = std::numeric_limits::max(); } template void serialize(Archive& ar, const unsigned int file_version) { boost::serialization::split_member(ar, *this, file_version); } #endif int _numpoints, _bucket, _cost; std::vector _tree; // Counters to track stastistics on the cost of searches mutable double _mc, _sc; mutable int _c1, _k, _cmin, _cmax; int init(const std::vector& pts, const distfun_t& dist, int bucket, std::vector& tree, std::vector& ids, int& cost, int l, int u, int vp) { if (u == l) return -1; Node node; if (u - l > (bucket == 0 ? 1 : bucket)) { // choose a vantage point and move it to the start int i = vp; std::swap(ids[l], ids[i]); int m = (u + l + 1) / 2; for (int k = l + 1; k < u; ++k) { ids[k].first = dist(pts[ids[l].second], pts[ids[k].second]); ++cost; } // partition around the median distance std::nth_element(ids.begin() + l + 1, ids.begin() + m, ids.begin() + u); node.index = ids[l].second; if (m > l + 1) { // node.child[0] is possibly empty typename std::vector::iterator t = std::min_element(ids.begin() + l + 1, ids.begin() + m); node.data.lower[0] = t->first; t = std::max_element(ids.begin() + l + 1, ids.begin() + m); node.data.upper[0] = t->first; // Use point with max distance as vantage point; this point act as a // "corner" point and leads to a good partition. node.data.child[0] = init(pts, dist, bucket, tree, ids, cost, l + 1, m, int(t - ids.begin())); } typename std::vector::iterator t = std::max_element(ids.begin() + m, ids.begin() + u); node.data.lower[1] = ids[m].first; node.data.upper[1] = t->first; // Use point with max distance as vantage point here too node.data.child[1] = init(pts, dist, bucket, tree, ids, cost, m, u, int(t - ids.begin())); } else { if (bucket == 0) node.index = ids[l].second; else { node.index = -1; // Sort the bucket entries so that the tree is independent of the // implementation of nth_element. std::sort(ids.begin() + l, ids.begin() + u); for (int i = l; i < u; ++i) node.leaves[i-l] = ids[i].second; for (int i = u - l; i < bucket; ++i) node.leaves[i] = -1; for (int i = bucket; i < maxbucket; ++i) node.leaves[i] = 0; } } tree.push_back(node); return int(tree.size()) - 1; } }; } // namespace GeographicLib namespace std { /** * Swap two GeographicLib::NearestNeighbor objects. * * @tparam dist_t the type used for measuring distances. * @tparam pos_t the type for specifying the positions of points. * @tparam distfun_t the type for a function object which calculates * distances between points. * @param[in,out] a the first GeographicLib::NearestNeighbor to swap. * @param[in,out] b the second GeographicLib::NearestNeighbor to swap. **********************************************************************/ template void swap(GeographicLib::NearestNeighbor& a, GeographicLib::NearestNeighbor& b) { a.swap(b); } } // namespace std #if defined(_MSC_VER) # pragma warning (pop) #endif #endif // GEOGRAPHICLIB_NEARESTNEIGHBOR_HPP geosphere/src/GeodesicExact.h0000644000176200001440000011311714323377037015717 0ustar liggesusers/** * \file GeodesicExact.hpp * \brief Header for GeographicLib::GeodesicExact class * * Copyright (c) Charles Karney (2012-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #if !defined(GEOGRAPHICLIB_GEODESICEXACT_HPP) #define GEOGRAPHICLIB_GEODESICEXACT_HPP 1 #include "Constants.h" #include "EllipticFunction.h" #include "DST.h" #include namespace GeographicLib { class GEOGRAPHICLIB_EXPORT DST; class GeodesicLineExact; /** * \brief Exact geodesic calculations * * The equations for geodesics on an ellipsoid can be expressed in terms of * incomplete elliptic integrals. The Geodesic class expands these integrals * in a series in the flattening \e f and this provides an accurate solution * for \e f ∈ [-0.01, 0.01]. The GeodesicExact class computes the * ellitpic integrals directly and so provides a solution which is valid for * all \e f. However, in practice, its use should be limited to about * b/\e a ∈ [0.01, 100] or \e f ∈ [−99, 0.99]. * * For the WGS84 ellipsoid, these classes are 2--3 times \e slower than the * series solution and 2--3 times \e less \e accurate (because it's less easy * to control round-off errors with the elliptic integral formulation); i.e., * the error is about 40 nm (40 nanometers) instead of 15 nm. However the * error in the series solution scales as f7 while the * error in the elliptic integral solution depends weakly on \e f. If the * quarter meridian distance is 10000 km and the ratio b/\e a = 1 * − \e f is varied then the approximate maximum error (expressed as a * distance) is
   *       1 - f  error (nm)
   *       1/128     387
   *       1/64      345
   *       1/32      269
   *       1/16      210
   *       1/8       115
   *       1/4        69
   *       1/2        36
   *         1        15
   *         2        25
   *         4        96
   *         8       318
   *        16       985
   *        32      2352
   *        64      6008
   *       128     19024
   * 
* * The area in this classes is computing by finding an accurate approximation * to the area integrand using a discrete sine transform fitting \e N equally * spaced points in σ. \e N chosen to ensure full accuracy for * b/\e a ∈ [0.01, 100] or \e f ∈ [−99, 0.99]. * * See \ref geodellip for the formulation. See the documentation on the * Geodesic class for additional information on the geodesic problems. * * Example of use: * \include example-GeodesicExact.cpp * * GeodSolve is a command-line utility * providing access to the functionality of GeodesicExact and * GeodesicLineExact (via the -E option). **********************************************************************/ class GEOGRAPHICLIB_EXPORT GeodesicExact { private: typedef Math::real real; friend class GeodesicLineExact; static const unsigned maxit1_ = 20; unsigned maxit2_; real tiny_, tol0_, tol1_, tol2_, tolb_, xthresh_; enum captype { CAP_NONE = 0U, CAP_E = 1U<<0, // Skip 1U<<1 for compatibility with Geodesic (not required) CAP_D = 1U<<2, CAP_H = 1U<<3, CAP_C4 = 1U<<4, CAP_ALL = 0x1FU, CAP_MASK = CAP_ALL, OUT_ALL = 0x7F80U, OUT_MASK = 0xFF80U, // Includes LONG_UNROLL }; static real Astroid(real x, real y); real _a, _f, _f1, _e2, _ep2, _n, _b, _c2, _etol2; int _nC4; DST _fft; void Lengths(const EllipticFunction& E, real sig12, real ssig1, real csig1, real dn1, real ssig2, real csig2, real dn2, real cbet1, real cbet2, unsigned outmask, real& s12s, real& m12a, real& m0, real& M12, real& M21) const; real InverseStart(EllipticFunction& E, real sbet1, real cbet1, real dn1, real sbet2, real cbet2, real dn2, real lam12, real slam12, real clam12, real& salp1, real& calp1, real& salp2, real& calp2, real& dnm) const; real Lambda12(real sbet1, real cbet1, real dn1, real sbet2, real cbet2, real dn2, real salp1, real calp1, real slam120, real clam120, real& salp2, real& calp2, real& sig12, real& ssig1, real& csig1, real& ssig2, real& csig2, EllipticFunction& E, real& domg12, bool diffp, real& dlam12) const; real GenInverse(real lat1, real lon1, real lat2, real lon2, unsigned outmask, real& s12, real& salp1, real& calp1, real& salp2, real& calp2, real& m12, real& M12, real& M21, real& S12) const; class I4Integrand { private: real X, tX, tdX, sX, sX1, sXX1, asinhsX, _k2; static real asinhsqrt(real x); static real t(real x); static real td(real x); // static real Dt(real x, real y); real DtX(real y) const; public: I4Integrand(real ep2, real k2); real operator()(real sig) const; }; public: /** * Bit masks for what calculations to do. These masks do double duty. * They signify to the GeodesicLineExact::GeodesicLineExact constructor and * to GeodesicExact::Line what capabilities should be included in the * GeodesicLineExact object. They also specify which results to return in * the general routines GeodesicExact::GenDirect and * GeodesicExact::GenInverse routines. GeodesicLineExact::mask is a * duplication of this enum. **********************************************************************/ enum mask { /** * No capabilities, no output. * @hideinitializer **********************************************************************/ NONE = 0U, /** * Calculate latitude \e lat2. (It's not necessary to include this as a * capability to GeodesicLineExact because this is included by default.) * @hideinitializer **********************************************************************/ LATITUDE = 1U<<7 | CAP_NONE, /** * Calculate longitude \e lon2. * @hideinitializer **********************************************************************/ LONGITUDE = 1U<<8 | CAP_H, /** * Calculate azimuths \e azi1 and \e azi2. (It's not necessary to * include this as a capability to GeodesicLineExact because this is * included by default.) * @hideinitializer **********************************************************************/ AZIMUTH = 1U<<9 | CAP_NONE, /** * Calculate distance \e s12. * @hideinitializer **********************************************************************/ DISTANCE = 1U<<10 | CAP_E, /** * A combination of the common capabilities: GeodesicExact::LATITUDE, * GeodesicExact::LONGITUDE, GeodesicExact::AZIMUTH, * GeodesicExact::DISTANCE. * @hideinitializer **********************************************************************/ STANDARD = LATITUDE | LONGITUDE | AZIMUTH | DISTANCE, /** * Allow distance \e s12 to be used as input in the direct geodesic * problem. * @hideinitializer **********************************************************************/ DISTANCE_IN = 1U<<11 | CAP_E, /** * Calculate reduced length \e m12. * @hideinitializer **********************************************************************/ REDUCEDLENGTH = 1U<<12 | CAP_D, /** * Calculate geodesic scales \e M12 and \e M21. * @hideinitializer **********************************************************************/ GEODESICSCALE = 1U<<13 | CAP_D, /** * Calculate area \e S12. * @hideinitializer **********************************************************************/ AREA = 1U<<14 | CAP_C4, /** * Unroll \e lon2 in the direct calculation. * @hideinitializer **********************************************************************/ LONG_UNROLL = 1U<<15, /** * All capabilities, calculate everything. (GeodesicExact::LONG_UNROLL * is not included in this mask.) * @hideinitializer **********************************************************************/ ALL = OUT_ALL| CAP_ALL, }; /** \name Constructor **********************************************************************/ ///@{ /** * Constructor for an ellipsoid with * * @param[in] a equatorial radius (meters). * @param[in] f flattening of ellipsoid. Setting \e f = 0 gives a sphere. * Negative \e f gives a prolate ellipsoid. * @exception GeographicErr if \e a or (1 − \e f) \e a is not * positive. **********************************************************************/ GeodesicExact(real a, real f); ///@} /** \name Direct geodesic problem specified in terms of distance. **********************************************************************/ ///@{ /** * Perform the direct geodesic calculation where the length of the geodesic * is specified in terms of distance. * * @param[in] lat1 latitude of point 1 (degrees). * @param[in] lon1 longitude of point 1 (degrees). * @param[in] azi1 azimuth at point 1 (degrees). * @param[in] s12 distance between point 1 and point 2 (meters); it can be * signed. * @param[out] lat2 latitude of point 2 (degrees). * @param[out] lon2 longitude of point 2 (degrees). * @param[out] azi2 (forward) azimuth at point 2 (degrees). * @param[out] m12 reduced length of geodesic (meters). * @param[out] M12 geodesic scale of point 2 relative to point 1 * (dimensionless). * @param[out] M21 geodesic scale of point 1 relative to point 2 * (dimensionless). * @param[out] S12 area under the geodesic (meters2). * @return \e a12 arc length of between point 1 and point 2 (degrees). * * \e lat1 should be in the range [−90°, 90°]. The values of * \e lon2 and \e azi2 returned are in the range [−180°, * 180°]. * * If either point is at a pole, the azimuth is defined by keeping the * longitude fixed, writing \e lat = ±(90° − ε), * and taking the limit ε → 0+. An arc length greater that * 180° signifies a geodesic which is not a shortest path. (For a * prolate ellipsoid, an additional condition is necessary for a shortest * path: the longitudinal extent must not exceed of 180°.) * * The following functions are overloaded versions of GeodesicExact::Direct * which omit some of the output parameters. Note, however, that the arc * length is always computed and returned as the function value. **********************************************************************/ Math::real Direct(real lat1, real lon1, real azi1, real s12, real& lat2, real& lon2, real& azi2, real& m12, real& M12, real& M21, real& S12) const { real t; return GenDirect(lat1, lon1, azi1, false, s12, LATITUDE | LONGITUDE | AZIMUTH | REDUCEDLENGTH | GEODESICSCALE | AREA, lat2, lon2, azi2, t, m12, M12, M21, S12); } /** * See the documentation for GeodesicExact::Direct. **********************************************************************/ Math::real Direct(real lat1, real lon1, real azi1, real s12, real& lat2, real& lon2) const { real t; return GenDirect(lat1, lon1, azi1, false, s12, LATITUDE | LONGITUDE, lat2, lon2, t, t, t, t, t, t); } /** * See the documentation for GeodesicExact::Direct. **********************************************************************/ Math::real Direct(real lat1, real lon1, real azi1, real s12, real& lat2, real& lon2, real& azi2) const { real t; return GenDirect(lat1, lon1, azi1, false, s12, LATITUDE | LONGITUDE | AZIMUTH, lat2, lon2, azi2, t, t, t, t, t); } /** * See the documentation for GeodesicExact::Direct. **********************************************************************/ Math::real Direct(real lat1, real lon1, real azi1, real s12, real& lat2, real& lon2, real& azi2, real& m12) const { real t; return GenDirect(lat1, lon1, azi1, false, s12, LATITUDE | LONGITUDE | AZIMUTH | REDUCEDLENGTH, lat2, lon2, azi2, t, m12, t, t, t); } /** * See the documentation for GeodesicExact::Direct. **********************************************************************/ Math::real Direct(real lat1, real lon1, real azi1, real s12, real& lat2, real& lon2, real& azi2, real& M12, real& M21) const { real t; return GenDirect(lat1, lon1, azi1, false, s12, LATITUDE | LONGITUDE | AZIMUTH | GEODESICSCALE, lat2, lon2, azi2, t, t, M12, M21, t); } /** * See the documentation for GeodesicExact::Direct. **********************************************************************/ Math::real Direct(real lat1, real lon1, real azi1, real s12, real& lat2, real& lon2, real& azi2, real& m12, real& M12, real& M21) const { real t; return GenDirect(lat1, lon1, azi1, false, s12, LATITUDE | LONGITUDE | AZIMUTH | REDUCEDLENGTH | GEODESICSCALE, lat2, lon2, azi2, t, m12, M12, M21, t); } ///@} /** \name Direct geodesic problem specified in terms of arc length. **********************************************************************/ ///@{ /** * Perform the direct geodesic calculation where the length of the geodesic * is specified in terms of arc length. * * @param[in] lat1 latitude of point 1 (degrees). * @param[in] lon1 longitude of point 1 (degrees). * @param[in] azi1 azimuth at point 1 (degrees). * @param[in] a12 arc length between point 1 and point 2 (degrees); it can * be signed. * @param[out] lat2 latitude of point 2 (degrees). * @param[out] lon2 longitude of point 2 (degrees). * @param[out] azi2 (forward) azimuth at point 2 (degrees). * @param[out] s12 distance between point 1 and point 2 (meters). * @param[out] m12 reduced length of geodesic (meters). * @param[out] M12 geodesic scale of point 2 relative to point 1 * (dimensionless). * @param[out] M21 geodesic scale of point 1 relative to point 2 * (dimensionless). * @param[out] S12 area under the geodesic (meters2). * * \e lat1 should be in the range [−90°, 90°]. The values of * \e lon2 and \e azi2 returned are in the range [−180°, * 180°]. * * If either point is at a pole, the azimuth is defined by keeping the * longitude fixed, writing \e lat = ±(90° − ε), * and taking the limit ε → 0+. An arc length greater that * 180° signifies a geodesic which is not a shortest path. (For a * prolate ellipsoid, an additional condition is necessary for a shortest * path: the longitudinal extent must not exceed of 180°.) * * The following functions are overloaded versions of GeodesicExact::Direct * which omit some of the output parameters. **********************************************************************/ void ArcDirect(real lat1, real lon1, real azi1, real a12, real& lat2, real& lon2, real& azi2, real& s12, real& m12, real& M12, real& M21, real& S12) const { GenDirect(lat1, lon1, azi1, true, a12, LATITUDE | LONGITUDE | AZIMUTH | DISTANCE | REDUCEDLENGTH | GEODESICSCALE | AREA, lat2, lon2, azi2, s12, m12, M12, M21, S12); } /** * See the documentation for GeodesicExact::ArcDirect. **********************************************************************/ void ArcDirect(real lat1, real lon1, real azi1, real a12, real& lat2, real& lon2) const { real t; GenDirect(lat1, lon1, azi1, true, a12, LATITUDE | LONGITUDE, lat2, lon2, t, t, t, t, t, t); } /** * See the documentation for GeodesicExact::ArcDirect. **********************************************************************/ void ArcDirect(real lat1, real lon1, real azi1, real a12, real& lat2, real& lon2, real& azi2) const { real t; GenDirect(lat1, lon1, azi1, true, a12, LATITUDE | LONGITUDE | AZIMUTH, lat2, lon2, azi2, t, t, t, t, t); } /** * See the documentation for GeodesicExact::ArcDirect. **********************************************************************/ void ArcDirect(real lat1, real lon1, real azi1, real a12, real& lat2, real& lon2, real& azi2, real& s12) const { real t; GenDirect(lat1, lon1, azi1, true, a12, LATITUDE | LONGITUDE | AZIMUTH | DISTANCE, lat2, lon2, azi2, s12, t, t, t, t); } /** * See the documentation for GeodesicExact::ArcDirect. **********************************************************************/ void ArcDirect(real lat1, real lon1, real azi1, real a12, real& lat2, real& lon2, real& azi2, real& s12, real& m12) const { real t; GenDirect(lat1, lon1, azi1, true, a12, LATITUDE | LONGITUDE | AZIMUTH | DISTANCE | REDUCEDLENGTH, lat2, lon2, azi2, s12, m12, t, t, t); } /** * See the documentation for GeodesicExact::ArcDirect. **********************************************************************/ void ArcDirect(real lat1, real lon1, real azi1, real a12, real& lat2, real& lon2, real& azi2, real& s12, real& M12, real& M21) const { real t; GenDirect(lat1, lon1, azi1, true, a12, LATITUDE | LONGITUDE | AZIMUTH | DISTANCE | GEODESICSCALE, lat2, lon2, azi2, s12, t, M12, M21, t); } /** * See the documentation for GeodesicExact::ArcDirect. **********************************************************************/ void ArcDirect(real lat1, real lon1, real azi1, real a12, real& lat2, real& lon2, real& azi2, real& s12, real& m12, real& M12, real& M21) const { real t; GenDirect(lat1, lon1, azi1, true, a12, LATITUDE | LONGITUDE | AZIMUTH | DISTANCE | REDUCEDLENGTH | GEODESICSCALE, lat2, lon2, azi2, s12, m12, M12, M21, t); } ///@} /** \name General version of the direct geodesic solution. **********************************************************************/ ///@{ /** * The general direct geodesic calculation. GeodesicExact::Direct and * GeodesicExact::ArcDirect are defined in terms of this function. * * @param[in] lat1 latitude of point 1 (degrees). * @param[in] lon1 longitude of point 1 (degrees). * @param[in] azi1 azimuth at point 1 (degrees). * @param[in] arcmode boolean flag determining the meaning of the second * parameter. * @param[in] s12_a12 if \e arcmode is false, this is the distance between * point 1 and point 2 (meters); otherwise it is the arc length between * point 1 and point 2 (degrees); it can be signed. * @param[in] outmask a bitor'ed combination of GeodesicExact::mask values * specifying which of the following parameters should be set. * @param[out] lat2 latitude of point 2 (degrees). * @param[out] lon2 longitude of point 2 (degrees). * @param[out] azi2 (forward) azimuth at point 2 (degrees). * @param[out] s12 distance between point 1 and point 2 (meters). * @param[out] m12 reduced length of geodesic (meters). * @param[out] M12 geodesic scale of point 2 relative to point 1 * (dimensionless). * @param[out] M21 geodesic scale of point 1 relative to point 2 * (dimensionless). * @param[out] S12 area under the geodesic (meters2). * @return \e a12 arc length of between point 1 and point 2 (degrees). * * The GeodesicExact::mask values possible for \e outmask are * - \e outmask |= GeodesicExact::LATITUDE for the latitude \e lat2; * - \e outmask |= GeodesicExact::LONGITUDE for the latitude \e lon2; * - \e outmask |= GeodesicExact::AZIMUTH for the latitude \e azi2; * - \e outmask |= GeodesicExact::DISTANCE for the distance \e s12; * - \e outmask |= GeodesicExact::REDUCEDLENGTH for the reduced length \e * m12; * - \e outmask |= GeodesicExact::GEODESICSCALE for the geodesic scales \e * M12 and \e M21; * - \e outmask |= GeodesicExact::AREA for the area \e S12; * - \e outmask |= GeodesicExact::ALL for all of the above; * - \e outmask |= GeodesicExact::LONG_UNROLL to unroll \e lon2 instead of * wrapping it into the range [−180°, 180°]. * . * The function value \e a12 is always computed and returned and this * equals \e s12_a12 is \e arcmode is true. If \e outmask includes * GeodesicExact::DISTANCE and \e arcmode is false, then \e s12 = \e * s12_a12. It is not necessary to include GeodesicExact::DISTANCE_IN in * \e outmask; this is automatically included is \e arcmode is false. * * With the GeodesicExact::LONG_UNROLL bit set, the quantity \e lon2 * − \e lon1 indicates how many times and in what sense the geodesic * encircles the ellipsoid. **********************************************************************/ Math::real GenDirect(real lat1, real lon1, real azi1, bool arcmode, real s12_a12, unsigned outmask, real& lat2, real& lon2, real& azi2, real& s12, real& m12, real& M12, real& M21, real& S12) const; ///@} /** \name Inverse geodesic problem. **********************************************************************/ ///@{ /** * Perform the inverse geodesic calculation. * * @param[in] lat1 latitude of point 1 (degrees). * @param[in] lon1 longitude of point 1 (degrees). * @param[in] lat2 latitude of point 2 (degrees). * @param[in] lon2 longitude of point 2 (degrees). * @param[out] s12 distance between point 1 and point 2 (meters). * @param[out] azi1 azimuth at point 1 (degrees). * @param[out] azi2 (forward) azimuth at point 2 (degrees). * @param[out] m12 reduced length of geodesic (meters). * @param[out] M12 geodesic scale of point 2 relative to point 1 * (dimensionless). * @param[out] M21 geodesic scale of point 1 relative to point 2 * (dimensionless). * @param[out] S12 area under the geodesic (meters2). * @return \e a12 arc length of between point 1 and point 2 (degrees). * * \e lat1 and \e lat2 should be in the range [−90°, 90°]. * The values of \e azi1 and \e azi2 returned are in the range * [−180°, 180°]. * * If either point is at a pole, the azimuth is defined by keeping the * longitude fixed, writing \e lat = ±(90° − ε), * and taking the limit ε → 0+. * * The following functions are overloaded versions of * GeodesicExact::Inverse which omit some of the output parameters. Note, * however, that the arc length is always computed and returned as the * function value. **********************************************************************/ Math::real Inverse(real lat1, real lon1, real lat2, real lon2, real& s12, real& azi1, real& azi2, real& m12, real& M12, real& M21, real& S12) const { return GenInverse(lat1, lon1, lat2, lon2, DISTANCE | AZIMUTH | REDUCEDLENGTH | GEODESICSCALE | AREA, s12, azi1, azi2, m12, M12, M21, S12); } /** * See the documentation for GeodesicExact::Inverse. **********************************************************************/ Math::real Inverse(real lat1, real lon1, real lat2, real lon2, real& s12) const { real t; return GenInverse(lat1, lon1, lat2, lon2, DISTANCE, s12, t, t, t, t, t, t); } /** * See the documentation for GeodesicExact::Inverse. **********************************************************************/ Math::real Inverse(real lat1, real lon1, real lat2, real lon2, real& azi1, real& azi2) const { real t; return GenInverse(lat1, lon1, lat2, lon2, AZIMUTH, t, azi1, azi2, t, t, t, t); } /** * See the documentation for GeodesicExact::Inverse. **********************************************************************/ Math::real Inverse(real lat1, real lon1, real lat2, real lon2, real& s12, real& azi1, real& azi2) const { real t; return GenInverse(lat1, lon1, lat2, lon2, DISTANCE | AZIMUTH, s12, azi1, azi2, t, t, t, t); } /** * See the documentation for GeodesicExact::Inverse. **********************************************************************/ Math::real Inverse(real lat1, real lon1, real lat2, real lon2, real& s12, real& azi1, real& azi2, real& m12) const { real t; return GenInverse(lat1, lon1, lat2, lon2, DISTANCE | AZIMUTH | REDUCEDLENGTH, s12, azi1, azi2, m12, t, t, t); } /** * See the documentation for GeodesicExact::Inverse. **********************************************************************/ Math::real Inverse(real lat1, real lon1, real lat2, real lon2, real& s12, real& azi1, real& azi2, real& M12, real& M21) const { real t; return GenInverse(lat1, lon1, lat2, lon2, DISTANCE | AZIMUTH | GEODESICSCALE, s12, azi1, azi2, t, M12, M21, t); } /** * See the documentation for GeodesicExact::Inverse. **********************************************************************/ Math::real Inverse(real lat1, real lon1, real lat2, real lon2, real& s12, real& azi1, real& azi2, real& m12, real& M12, real& M21) const { real t; return GenInverse(lat1, lon1, lat2, lon2, DISTANCE | AZIMUTH | REDUCEDLENGTH | GEODESICSCALE, s12, azi1, azi2, m12, M12, M21, t); } ///@} /** \name General version of inverse geodesic solution. **********************************************************************/ ///@{ /** * The general inverse geodesic calculation. GeodesicExact::Inverse is * defined in terms of this function. * * @param[in] lat1 latitude of point 1 (degrees). * @param[in] lon1 longitude of point 1 (degrees). * @param[in] lat2 latitude of point 2 (degrees). * @param[in] lon2 longitude of point 2 (degrees). * @param[in] outmask a bitor'ed combination of GeodesicExact::mask values * specifying which of the following parameters should be set. * @param[out] s12 distance between point 1 and point 2 (meters). * @param[out] azi1 azimuth at point 1 (degrees). * @param[out] azi2 (forward) azimuth at point 2 (degrees). * @param[out] m12 reduced length of geodesic (meters). * @param[out] M12 geodesic scale of point 2 relative to point 1 * (dimensionless). * @param[out] M21 geodesic scale of point 1 relative to point 2 * (dimensionless). * @param[out] S12 area under the geodesic (meters2). * @return \e a12 arc length of between point 1 and point 2 (degrees). * * The GeodesicExact::mask values possible for \e outmask are * - \e outmask |= GeodesicExact::DISTANCE for the distance \e s12; * - \e outmask |= GeodesicExact::AZIMUTH for the latitude \e azi2; * - \e outmask |= GeodesicExact::REDUCEDLENGTH for the reduced length \e * m12; * - \e outmask |= GeodesicExact::GEODESICSCALE for the geodesic scales \e * M12 and \e M21; * - \e outmask |= GeodesicExact::AREA for the area \e S12; * - \e outmask |= GeodesicExact::ALL for all of the above. * . * The arc length is always computed and returned as the function value. **********************************************************************/ Math::real GenInverse(real lat1, real lon1, real lat2, real lon2, unsigned outmask, real& s12, real& azi1, real& azi2, real& m12, real& M12, real& M21, real& S12) const; ///@} /** \name Interface to GeodesicLineExact. **********************************************************************/ ///@{ /** * Set up to compute several points on a single geodesic. * * @param[in] lat1 latitude of point 1 (degrees). * @param[in] lon1 longitude of point 1 (degrees). * @param[in] azi1 azimuth at point 1 (degrees). * @param[in] caps bitor'ed combination of GeodesicExact::mask values * specifying the capabilities the GeodesicLineExact object should * possess, i.e., which quantities can be returned in calls to * GeodesicLineExact::Position. * @return a GeodesicLineExact object. * * \e lat1 should be in the range [−90°, 90°]. * * The GeodesicExact::mask values are * - \e caps |= GeodesicExact::LATITUDE for the latitude \e lat2; this is * added automatically; * - \e caps |= GeodesicExact::LONGITUDE for the latitude \e lon2; * - \e caps |= GeodesicExact::AZIMUTH for the azimuth \e azi2; this is * added automatically; * - \e caps |= GeodesicExact::DISTANCE for the distance \e s12; * - \e caps |= GeodesicExact::REDUCEDLENGTH for the reduced length \e m12; * - \e caps |= GeodesicExact::GEODESICSCALE for the geodesic scales \e M12 * and \e M21; * - \e caps |= GeodesicExact::AREA for the area \e S12; * - \e caps |= GeodesicExact::DISTANCE_IN permits the length of the * geodesic to be given in terms of \e s12; without this capability the * length can only be specified in terms of arc length; * - \e caps |= GeodesicExact::ALL for all of the above. * . * The default value of \e caps is GeodesicExact::ALL which turns on all * the capabilities. * * If the point is at a pole, the azimuth is defined by keeping \e lon1 * fixed, writing \e lat1 = ±(90 − ε), and taking the * limit ε → 0+. **********************************************************************/ GeodesicLineExact Line(real lat1, real lon1, real azi1, unsigned caps = ALL) const; /** * Define a GeodesicLineExact in terms of the inverse geodesic problem. * * @param[in] lat1 latitude of point 1 (degrees). * @param[in] lon1 longitude of point 1 (degrees). * @param[in] lat2 latitude of point 2 (degrees). * @param[in] lon2 longitude of point 2 (degrees). * @param[in] caps bitor'ed combination of GeodesicExact::mask values * specifying the capabilities the GeodesicLineExact object should * possess, i.e., which quantities can be returned in calls to * GeodesicLineExact::Position. * @return a GeodesicLineExact object. * * This function sets point 3 of the GeodesicLineExact to correspond to * point 2 of the inverse geodesic problem. * * \e lat1 and \e lat2 should be in the range [−90°, 90°]. **********************************************************************/ GeodesicLineExact InverseLine(real lat1, real lon1, real lat2, real lon2, unsigned caps = ALL) const; /** * Define a GeodesicLineExact in terms of the direct geodesic problem * specified in terms of distance. * * @param[in] lat1 latitude of point 1 (degrees). * @param[in] lon1 longitude of point 1 (degrees). * @param[in] azi1 azimuth at point 1 (degrees). * @param[in] s12 distance between point 1 and point 2 (meters); it can be * negative. * @param[in] caps bitor'ed combination of GeodesicExact::mask values * specifying the capabilities the GeodesicLineExact object should * possess, i.e., which quantities can be returned in calls to * GeodesicLineExact::Position. * @return a GeodesicLineExact object. * * This function sets point 3 of the GeodesicLineExact to correspond to * point 2 of the direct geodesic problem. * * \e lat1 should be in the range [−90°, 90°]. **********************************************************************/ GeodesicLineExact DirectLine(real lat1, real lon1, real azi1, real s12, unsigned caps = ALL) const; /** * Define a GeodesicLineExact in terms of the direct geodesic problem * specified in terms of arc length. * * @param[in] lat1 latitude of point 1 (degrees). * @param[in] lon1 longitude of point 1 (degrees). * @param[in] azi1 azimuth at point 1 (degrees). * @param[in] a12 arc length between point 1 and point 2 (degrees); it can * be negative. * @param[in] caps bitor'ed combination of GeodesicExact::mask values * specifying the capabilities the GeodesicLineExact object should * possess, i.e., which quantities can be returned in calls to * GeodesicLineExact::Position. * @return a GeodesicLineExact object. * * This function sets point 3 of the GeodesicLineExact to correspond to * point 2 of the direct geodesic problem. * * \e lat1 should be in the range [−90°, 90°]. **********************************************************************/ GeodesicLineExact ArcDirectLine(real lat1, real lon1, real azi1, real a12, unsigned caps = ALL) const; /** * Define a GeodesicLineExact in terms of the direct geodesic problem * specified in terms of either distance or arc length. * * @param[in] lat1 latitude of point 1 (degrees). * @param[in] lon1 longitude of point 1 (degrees). * @param[in] azi1 azimuth at point 1 (degrees). * @param[in] arcmode boolean flag determining the meaning of the \e * s12_a12. * @param[in] s12_a12 if \e arcmode is false, this is the distance between * point 1 and point 2 (meters); otherwise it is the arc length between * point 1 and point 2 (degrees); it can be negative. * @param[in] caps bitor'ed combination of GeodesicExact::mask values * specifying the capabilities the GeodesicLineExact object should * possess, i.e., which quantities can be returned in calls to * GeodesicLineExact::Position. * @return a GeodesicLineExact object. * * This function sets point 3 of the GeodesicLineExact to correspond to * point 2 of the direct geodesic problem. * * \e lat1 should be in the range [−90°, 90°]. **********************************************************************/ GeodesicLineExact GenDirectLine(real lat1, real lon1, real azi1, bool arcmode, real s12_a12, unsigned caps = ALL) const; ///@} /** \name Inspector functions. **********************************************************************/ ///@{ /** * @return \e a the equatorial radius of the ellipsoid (meters). This is * the value used in the constructor. **********************************************************************/ Math::real EquatorialRadius() const { return _a; } /** * @return \e f the flattening of the ellipsoid. This is the * value used in the constructor. **********************************************************************/ Math::real Flattening() const { return _f; } /** * @return total area of ellipsoid in meters2. The area of a * polygon encircling a pole can be found by adding * GeodesicExact::EllipsoidArea()/2 to the sum of \e S12 for each side of * the polygon. **********************************************************************/ Math::real EllipsoidArea() const { return 4 * Math::pi() * _c2; } ///@} /** * A global instantiation of GeodesicExact with the parameters for the * WGS84 ellipsoid. **********************************************************************/ static const GeodesicExact& WGS84(); }; } // namespace GeographicLib #endif // GEOGRAPHICLIB_GEODESICEXACT_HPP geosphere/src/Geodesic.h0000644000176200001440000012770414323377037014741 0ustar liggesusers/** * \file Geodesic.hpp * \brief Header for GeographicLib::Geodesic class * * Copyright (c) Charles Karney (2009-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #if !defined(GEOGRAPHICLIB_GEODESIC_HPP) #define GEOGRAPHICLIB_GEODESIC_HPP 1 #include "Constants.h" #if !defined(GEOGRAPHICLIB_GEODESIC_ORDER) /** * The order of the expansions used by Geodesic. * GEOGRAPHICLIB_GEODESIC_ORDER can be set to any integer in [3, 8]. **********************************************************************/ # define GEOGRAPHICLIB_GEODESIC_ORDER \ (GEOGRAPHICLIB_PRECISION == 2 ? 6 : \ (GEOGRAPHICLIB_PRECISION == 1 ? 3 : \ (GEOGRAPHICLIB_PRECISION == 3 ? 7 : 8))) #endif namespace GeographicLib { class GeodesicLine; /** * \brief %Geodesic calculations * * The shortest path between two points on an ellipsoid at (\e lat1, \e lon1) * and (\e lat2, \e lon2) is called the geodesic. Its length is \e s12 and * the geodesic from point 1 to point 2 has azimuths \e azi1 and \e azi2 at * the two end points. (The azimuth is the heading measured clockwise from * north. \e azi2 is the "forward" azimuth, i.e., the heading that takes you * beyond point 2 not back to point 1.) In the figure below, latitude is * labeled φ, longitude λ (with λ12 = * λ2 − λ1), and azimuth α. * * spheroidal triangle * * Given \e lat1, \e lon1, \e azi1, and \e s12, we can determine \e lat2, \e * lon2, and \e azi2. This is the \e direct geodesic problem and its * solution is given by the function Geodesic::Direct. (If \e s12 is * sufficiently large that the geodesic wraps more than halfway around the * earth, there will be another geodesic between the points with a smaller \e * s12.) * * Given \e lat1, \e lon1, \e lat2, and \e lon2, we can determine \e azi1, \e * azi2, and \e s12. This is the \e inverse geodesic problem, whose solution * is given by Geodesic::Inverse. Usually, the solution to the inverse * problem is unique. In cases where there are multiple solutions (all with * the same \e s12, of course), all the solutions can be easily generated * once a particular solution is provided. * * The standard way of specifying the direct problem is the specify the * distance \e s12 to the second point. However it is sometimes useful * instead to specify the arc length \e a12 (in degrees) on the auxiliary * sphere. This is a mathematical construct used in solving the geodesic * problems. The solution of the direct problem in this form is provided by * Geodesic::ArcDirect. An arc length in excess of 180° indicates that * the geodesic is not a shortest path. In addition, the arc length between * an equatorial crossing and the next extremum of latitude for a geodesic is * 90°. * * This class can also calculate several other quantities related to * geodesics. These are: * - reduced length. If we fix the first point and increase \e azi1 * by \e dazi1 (radians), the second point is displaced \e m12 \e dazi1 in * the direction \e azi2 + 90°. The quantity \e m12 is called * the "reduced length" and is symmetric under interchange of the two * points. On a curved surface the reduced length obeys a symmetry * relation, \e m12 + \e m21 = 0. On a flat surface, we have \e m12 = \e * s12. The ratio s12/\e m12 gives the azimuthal scale for an * azimuthal equidistant projection. * - geodesic scale. Consider a reference geodesic and a second * geodesic parallel to this one at point 1 and separated by a small * distance \e dt. The separation of the two geodesics at point 2 is \e * M12 \e dt where \e M12 is called the "geodesic scale". \e M21 is * defined similarly (with the geodesics being parallel at point 2). On a * flat surface, we have \e M12 = \e M21 = 1. The quantity 1/\e M12 gives * the scale of the Cassini-Soldner projection. * - area. The area between the geodesic from point 1 to point 2 and * the equation is represented by \e S12; it is the area, measured * counter-clockwise, of the geodesic quadrilateral with corners * (lat1,lon1), (0,lon1), (0,lon2), and * (lat2,lon2). It can be used to compute the area of any * geodesic polygon. * * Overloaded versions of Geodesic::Direct, Geodesic::ArcDirect, and * Geodesic::Inverse allow these quantities to be returned. In addition * there are general functions Geodesic::GenDirect, and Geodesic::GenInverse * which allow an arbitrary set of results to be computed. The quantities \e * m12, \e M12, \e M21 which all specify the behavior of nearby geodesics * obey addition rules. If points 1, 2, and 3 all lie on a single geodesic, * then the following rules hold: * - \e s13 = \e s12 + \e s23 * - \e a13 = \e a12 + \e a23 * - \e S13 = \e S12 + \e S23 * - \e m13 = \e m12 \e M23 + \e m23 \e M21 * - \e M13 = \e M12 \e M23 − (1 − \e M12 \e M21) \e m23 / \e m12 * - \e M31 = \e M32 \e M21 − (1 − \e M23 \e M32) \e m12 / \e m23 * * Additional functionality is provided by the GeodesicLine class, which * allows a sequence of points along a geodesic to be computed. * * The shortest distance returned by the solution of the inverse problem is * (obviously) uniquely defined. However, in a few special cases there are * multiple azimuths which yield the same shortest distance. Here is a * catalog of those cases: * - \e lat1 = −\e lat2 (with neither point at a pole). If \e azi1 = * \e azi2, the geodesic is unique. Otherwise there are two geodesics and * the second one is obtained by setting [\e azi1, \e azi2] → [\e * azi2, \e azi1], [\e M12, \e M21] → [\e M21, \e M12], \e S12 → * −\e S12. (This occurs when the longitude difference is near * ±180° for oblate ellipsoids.) * - \e lon2 = \e lon1 ± 180° (with neither point at a pole). If * \e azi1 = 0° or ±180°, the geodesic is unique. Otherwise * there are two geodesics and the second one is obtained by setting [\e * azi1, \e azi2] → [−\e azi1, −\e azi2], \e S12 → * −\e S12. (This occurs when \e lat2 is near −\e lat1 for * prolate ellipsoids.) * - Points 1 and 2 at opposite poles. There are infinitely many geodesics * which can be generated by setting [\e azi1, \e azi2] → [\e azi1, \e * azi2] + [\e d, −\e d], for arbitrary \e d. (For spheres, this * prescription applies when points 1 and 2 are antipodal.) * - \e s12 = 0 (coincident points). There are infinitely many geodesics * which can be generated by setting [\e azi1, \e azi2] → * [\e azi1, \e azi2] + [\e d, \e d], for arbitrary \e d. * * The calculations are accurate to better than 15 nm (15 nanometers) for the * WGS84 ellipsoid. See Sec. 9 of * arXiv:1102.1215v1 for * details. The algorithms used by this class are based on series expansions * using the flattening \e f as a small parameter. These are only accurate * for |f| < 0.02; however reasonably accurate results will be * obtained for |f| < 0.2. Here is a table of the approximate * maximum error (expressed as a distance) for an ellipsoid with the same * equatorial radius as the WGS84 ellipsoid and different values of the * flattening.
   *     |f|      error
   *     0.01     25 nm
   *     0.02     30 nm
   *     0.05     10 um
   *     0.1     1.5 mm
   *     0.2     300 mm
   * 
* For very eccentric ellipsoids, use GeodesicExact instead. * * The algorithms are described in * - C. F. F. Karney, * * Algorithms for geodesics, * J. Geodesy 87, 43--55 (2013); * DOI: * 10.1007/s00190-012-0578-z; * addenda: * * geod-addenda.html. * . * For more information on geodesics see \ref geodesic. * * Example of use: * \include example-Geodesic.cpp * * GeodSolve is a command-line utility * providing access to the functionality of Geodesic and GeodesicLine. **********************************************************************/ class GEOGRAPHICLIB_EXPORT Geodesic { private: typedef Math::real real; friend class GeodesicLine; static const int nA1_ = GEOGRAPHICLIB_GEODESIC_ORDER; static const int nC1_ = GEOGRAPHICLIB_GEODESIC_ORDER; static const int nC1p_ = GEOGRAPHICLIB_GEODESIC_ORDER; static const int nA2_ = GEOGRAPHICLIB_GEODESIC_ORDER; static const int nC2_ = GEOGRAPHICLIB_GEODESIC_ORDER; static const int nA3_ = GEOGRAPHICLIB_GEODESIC_ORDER; static const int nA3x_ = nA3_; static const int nC3_ = GEOGRAPHICLIB_GEODESIC_ORDER; static const int nC3x_ = (nC3_ * (nC3_ - 1)) / 2; static const int nC4_ = GEOGRAPHICLIB_GEODESIC_ORDER; static const int nC4x_ = (nC4_ * (nC4_ + 1)) / 2; // Size for temporary array // nC = max(max(nC1_, nC1p_, nC2_) + 1, max(nC3_, nC4_)) static const int nC_ = GEOGRAPHICLIB_GEODESIC_ORDER + 1; static const unsigned maxit1_ = 20; unsigned maxit2_; real tiny_, tol0_, tol1_, tol2_, tolb_, xthresh_; enum captype { CAP_NONE = 0U, CAP_C1 = 1U<<0, CAP_C1p = 1U<<1, CAP_C2 = 1U<<2, CAP_C3 = 1U<<3, CAP_C4 = 1U<<4, CAP_ALL = 0x1FU, CAP_MASK = CAP_ALL, OUT_ALL = 0x7F80U, OUT_MASK = 0xFF80U, // Includes LONG_UNROLL }; static real SinCosSeries(bool sinp, real sinx, real cosx, const real c[], int n); static real Astroid(real x, real y); real _a, _f, _f1, _e2, _ep2, _n, _b, _c2, _etol2; real _aA3x[nA3x_], _cC3x[nC3x_], _cC4x[nC4x_]; void Lengths(real eps, real sig12, real ssig1, real csig1, real dn1, real ssig2, real csig2, real dn2, real cbet1, real cbet2, unsigned outmask, real& s12s, real& m12a, real& m0, real& M12, real& M21, real Ca[]) const; real InverseStart(real sbet1, real cbet1, real dn1, real sbet2, real cbet2, real dn2, real lam12, real slam12, real clam12, real& salp1, real& calp1, real& salp2, real& calp2, real& dnm, real Ca[]) const; real Lambda12(real sbet1, real cbet1, real dn1, real sbet2, real cbet2, real dn2, real salp1, real calp1, real slam120, real clam120, real& salp2, real& calp2, real& sig12, real& ssig1, real& csig1, real& ssig2, real& csig2, real& eps, real& domg12, bool diffp, real& dlam12, real Ca[]) const; real GenInverse(real lat1, real lon1, real lat2, real lon2, unsigned outmask, real& s12, real& salp1, real& calp1, real& salp2, real& calp2, real& m12, real& M12, real& M21, real& S12) const; // These are Maxima generated functions to provide series approximations to // the integrals for the ellipsoidal geodesic. static real A1m1f(real eps); static void C1f(real eps, real c[]); static void C1pf(real eps, real c[]); static real A2m1f(real eps); static void C2f(real eps, real c[]); void A3coeff(); real A3f(real eps) const; void C3coeff(); void C3f(real eps, real c[]) const; void C4coeff(); void C4f(real k2, real c[]) const; public: /** * Bit masks for what calculations to do. These masks do double duty. * They signify to the GeodesicLine constructor and to * Geodesic::Line what capabilities should be included in the GeodesicLine * object. They also specify which results to return in the general * routines Geodesic::GenDirect and Geodesic::GenInverse routines. * GeodesicLine::mask is a duplication of this enum. **********************************************************************/ enum mask { /** * No capabilities, no output. * @hideinitializer **********************************************************************/ NONE = 0U, /** * Calculate latitude \e lat2. (It's not necessary to include this as a * capability to GeodesicLine because this is included by default.) * @hideinitializer **********************************************************************/ LATITUDE = 1U<<7 | CAP_NONE, /** * Calculate longitude \e lon2. * @hideinitializer **********************************************************************/ LONGITUDE = 1U<<8 | CAP_C3, /** * Calculate azimuths \e azi1 and \e azi2. (It's not necessary to * include this as a capability to GeodesicLine because this is included * by default.) * @hideinitializer **********************************************************************/ AZIMUTH = 1U<<9 | CAP_NONE, /** * Calculate distance \e s12. * @hideinitializer **********************************************************************/ DISTANCE = 1U<<10 | CAP_C1, /** * A combination of the common capabilities: Geodesic::LATITUDE, * Geodesic::LONGITUDE, Geodesic::AZIMUTH, Geodesic::DISTANCE. * @hideinitializer **********************************************************************/ STANDARD = LATITUDE | LONGITUDE | AZIMUTH | DISTANCE, /** * Allow distance \e s12 to be used as input in the direct geodesic * problem. * @hideinitializer **********************************************************************/ DISTANCE_IN = 1U<<11 | CAP_C1 | CAP_C1p, /** * Calculate reduced length \e m12. * @hideinitializer **********************************************************************/ REDUCEDLENGTH = 1U<<12 | CAP_C1 | CAP_C2, /** * Calculate geodesic scales \e M12 and \e M21. * @hideinitializer **********************************************************************/ GEODESICSCALE = 1U<<13 | CAP_C1 | CAP_C2, /** * Calculate area \e S12. * @hideinitializer **********************************************************************/ AREA = 1U<<14 | CAP_C4, /** * Unroll \e lon2 in the direct calculation. * @hideinitializer **********************************************************************/ LONG_UNROLL = 1U<<15, /** * All capabilities, calculate everything. (Geodesic::LONG_UNROLL is not * included in this mask.) * @hideinitializer **********************************************************************/ ALL = OUT_ALL| CAP_ALL, }; /** \name Constructor **********************************************************************/ ///@{ /** * Constructor for an ellipsoid with * * @param[in] a equatorial radius (meters). * @param[in] f flattening of ellipsoid. Setting \e f = 0 gives a sphere. * Negative \e f gives a prolate ellipsoid. * @exception GeographicErr if \e a or (1 − \e f) \e a is not * positive. **********************************************************************/ Geodesic(real a, real f); ///@} /** \name Direct geodesic problem specified in terms of distance. **********************************************************************/ ///@{ /** * Solve the direct geodesic problem where the length of the geodesic * is specified in terms of distance. * * @param[in] lat1 latitude of point 1 (degrees). * @param[in] lon1 longitude of point 1 (degrees). * @param[in] azi1 azimuth at point 1 (degrees). * @param[in] s12 distance between point 1 and point 2 (meters); it can be * negative. * @param[out] lat2 latitude of point 2 (degrees). * @param[out] lon2 longitude of point 2 (degrees). * @param[out] azi2 (forward) azimuth at point 2 (degrees). * @param[out] m12 reduced length of geodesic (meters). * @param[out] M12 geodesic scale of point 2 relative to point 1 * (dimensionless). * @param[out] M21 geodesic scale of point 1 relative to point 2 * (dimensionless). * @param[out] S12 area under the geodesic (meters2). * @return \e a12 arc length of between point 1 and point 2 (degrees). * * \e lat1 should be in the range [−90°, 90°]. The values of * \e lon2 and \e azi2 returned are in the range [−180°, * 180°]. * * If either point is at a pole, the azimuth is defined by keeping the * longitude fixed, writing \e lat = ±(90° − ε), * and taking the limit ε → 0+. An arc length greater that * 180° signifies a geodesic which is not a shortest path. (For a * prolate ellipsoid, an additional condition is necessary for a shortest * path: the longitudinal extent must not exceed of 180°.) * * The following functions are overloaded versions of Geodesic::Direct * which omit some of the output parameters. Note, however, that the arc * length is always computed and returned as the function value. **********************************************************************/ Math::real Direct(real lat1, real lon1, real azi1, real s12, real& lat2, real& lon2, real& azi2, real& m12, real& M12, real& M21, real& S12) const { real t; return GenDirect(lat1, lon1, azi1, false, s12, LATITUDE | LONGITUDE | AZIMUTH | REDUCEDLENGTH | GEODESICSCALE | AREA, lat2, lon2, azi2, t, m12, M12, M21, S12); } /** * See the documentation for Geodesic::Direct. **********************************************************************/ Math::real Direct(real lat1, real lon1, real azi1, real s12, real& lat2, real& lon2) const { real t; return GenDirect(lat1, lon1, azi1, false, s12, LATITUDE | LONGITUDE, lat2, lon2, t, t, t, t, t, t); } /** * See the documentation for Geodesic::Direct. **********************************************************************/ Math::real Direct(real lat1, real lon1, real azi1, real s12, real& lat2, real& lon2, real& azi2) const { real t; return GenDirect(lat1, lon1, azi1, false, s12, LATITUDE | LONGITUDE | AZIMUTH, lat2, lon2, azi2, t, t, t, t, t); } /** * See the documentation for Geodesic::Direct. **********************************************************************/ Math::real Direct(real lat1, real lon1, real azi1, real s12, real& lat2, real& lon2, real& azi2, real& m12) const { real t; return GenDirect(lat1, lon1, azi1, false, s12, LATITUDE | LONGITUDE | AZIMUTH | REDUCEDLENGTH, lat2, lon2, azi2, t, m12, t, t, t); } /** * See the documentation for Geodesic::Direct. **********************************************************************/ Math::real Direct(real lat1, real lon1, real azi1, real s12, real& lat2, real& lon2, real& azi2, real& M12, real& M21) const { real t; return GenDirect(lat1, lon1, azi1, false, s12, LATITUDE | LONGITUDE | AZIMUTH | GEODESICSCALE, lat2, lon2, azi2, t, t, M12, M21, t); } /** * See the documentation for Geodesic::Direct. **********************************************************************/ Math::real Direct(real lat1, real lon1, real azi1, real s12, real& lat2, real& lon2, real& azi2, real& m12, real& M12, real& M21) const { real t; return GenDirect(lat1, lon1, azi1, false, s12, LATITUDE | LONGITUDE | AZIMUTH | REDUCEDLENGTH | GEODESICSCALE, lat2, lon2, azi2, t, m12, M12, M21, t); } ///@} /** \name Direct geodesic problem specified in terms of arc length. **********************************************************************/ ///@{ /** * Solve the direct geodesic problem where the length of the geodesic * is specified in terms of arc length. * * @param[in] lat1 latitude of point 1 (degrees). * @param[in] lon1 longitude of point 1 (degrees). * @param[in] azi1 azimuth at point 1 (degrees). * @param[in] a12 arc length between point 1 and point 2 (degrees); it can * be negative. * @param[out] lat2 latitude of point 2 (degrees). * @param[out] lon2 longitude of point 2 (degrees). * @param[out] azi2 (forward) azimuth at point 2 (degrees). * @param[out] s12 distance between point 1 and point 2 (meters). * @param[out] m12 reduced length of geodesic (meters). * @param[out] M12 geodesic scale of point 2 relative to point 1 * (dimensionless). * @param[out] M21 geodesic scale of point 1 relative to point 2 * (dimensionless). * @param[out] S12 area under the geodesic (meters2). * * \e lat1 should be in the range [−90°, 90°]. The values of * \e lon2 and \e azi2 returned are in the range [−180°, * 180°]. * * If either point is at a pole, the azimuth is defined by keeping the * longitude fixed, writing \e lat = ±(90° − ε), * and taking the limit ε → 0+. An arc length greater that * 180° signifies a geodesic which is not a shortest path. (For a * prolate ellipsoid, an additional condition is necessary for a shortest * path: the longitudinal extent must not exceed of 180°.) * * The following functions are overloaded versions of Geodesic::Direct * which omit some of the output parameters. **********************************************************************/ void ArcDirect(real lat1, real lon1, real azi1, real a12, real& lat2, real& lon2, real& azi2, real& s12, real& m12, real& M12, real& M21, real& S12) const { GenDirect(lat1, lon1, azi1, true, a12, LATITUDE | LONGITUDE | AZIMUTH | DISTANCE | REDUCEDLENGTH | GEODESICSCALE | AREA, lat2, lon2, azi2, s12, m12, M12, M21, S12); } /** * See the documentation for Geodesic::ArcDirect. **********************************************************************/ void ArcDirect(real lat1, real lon1, real azi1, real a12, real& lat2, real& lon2) const { real t; GenDirect(lat1, lon1, azi1, true, a12, LATITUDE | LONGITUDE, lat2, lon2, t, t, t, t, t, t); } /** * See the documentation for Geodesic::ArcDirect. **********************************************************************/ void ArcDirect(real lat1, real lon1, real azi1, real a12, real& lat2, real& lon2, real& azi2) const { real t; GenDirect(lat1, lon1, azi1, true, a12, LATITUDE | LONGITUDE | AZIMUTH, lat2, lon2, azi2, t, t, t, t, t); } /** * See the documentation for Geodesic::ArcDirect. **********************************************************************/ void ArcDirect(real lat1, real lon1, real azi1, real a12, real& lat2, real& lon2, real& azi2, real& s12) const { real t; GenDirect(lat1, lon1, azi1, true, a12, LATITUDE | LONGITUDE | AZIMUTH | DISTANCE, lat2, lon2, azi2, s12, t, t, t, t); } /** * See the documentation for Geodesic::ArcDirect. **********************************************************************/ void ArcDirect(real lat1, real lon1, real azi1, real a12, real& lat2, real& lon2, real& azi2, real& s12, real& m12) const { real t; GenDirect(lat1, lon1, azi1, true, a12, LATITUDE | LONGITUDE | AZIMUTH | DISTANCE | REDUCEDLENGTH, lat2, lon2, azi2, s12, m12, t, t, t); } /** * See the documentation for Geodesic::ArcDirect. **********************************************************************/ void ArcDirect(real lat1, real lon1, real azi1, real a12, real& lat2, real& lon2, real& azi2, real& s12, real& M12, real& M21) const { real t; GenDirect(lat1, lon1, azi1, true, a12, LATITUDE | LONGITUDE | AZIMUTH | DISTANCE | GEODESICSCALE, lat2, lon2, azi2, s12, t, M12, M21, t); } /** * See the documentation for Geodesic::ArcDirect. **********************************************************************/ void ArcDirect(real lat1, real lon1, real azi1, real a12, real& lat2, real& lon2, real& azi2, real& s12, real& m12, real& M12, real& M21) const { real t; GenDirect(lat1, lon1, azi1, true, a12, LATITUDE | LONGITUDE | AZIMUTH | DISTANCE | REDUCEDLENGTH | GEODESICSCALE, lat2, lon2, azi2, s12, m12, M12, M21, t); } ///@} /** \name General version of the direct geodesic solution. **********************************************************************/ ///@{ /** * The general direct geodesic problem. Geodesic::Direct and * Geodesic::ArcDirect are defined in terms of this function. * * @param[in] lat1 latitude of point 1 (degrees). * @param[in] lon1 longitude of point 1 (degrees). * @param[in] azi1 azimuth at point 1 (degrees). * @param[in] arcmode boolean flag determining the meaning of the \e * s12_a12. * @param[in] s12_a12 if \e arcmode is false, this is the distance between * point 1 and point 2 (meters); otherwise it is the arc length between * point 1 and point 2 (degrees); it can be negative. * @param[in] outmask a bitor'ed combination of Geodesic::mask values * specifying which of the following parameters should be set. * @param[out] lat2 latitude of point 2 (degrees). * @param[out] lon2 longitude of point 2 (degrees). * @param[out] azi2 (forward) azimuth at point 2 (degrees). * @param[out] s12 distance between point 1 and point 2 (meters). * @param[out] m12 reduced length of geodesic (meters). * @param[out] M12 geodesic scale of point 2 relative to point 1 * (dimensionless). * @param[out] M21 geodesic scale of point 1 relative to point 2 * (dimensionless). * @param[out] S12 area under the geodesic (meters2). * @return \e a12 arc length of between point 1 and point 2 (degrees). * * The Geodesic::mask values possible for \e outmask are * - \e outmask |= Geodesic::LATITUDE for the latitude \e lat2; * - \e outmask |= Geodesic::LONGITUDE for the latitude \e lon2; * - \e outmask |= Geodesic::AZIMUTH for the latitude \e azi2; * - \e outmask |= Geodesic::DISTANCE for the distance \e s12; * - \e outmask |= Geodesic::REDUCEDLENGTH for the reduced length \e * m12; * - \e outmask |= Geodesic::GEODESICSCALE for the geodesic scales \e * M12 and \e M21; * - \e outmask |= Geodesic::AREA for the area \e S12; * - \e outmask |= Geodesic::ALL for all of the above; * - \e outmask |= Geodesic::LONG_UNROLL to unroll \e lon2 instead of * wrapping it into the range [−180°, 180°]. * . * The function value \e a12 is always computed and returned and this * equals \e s12_a12 is \e arcmode is true. If \e outmask includes * Geodesic::DISTANCE and \e arcmode is false, then \e s12 = \e s12_a12. * It is not necessary to include Geodesic::DISTANCE_IN in \e outmask; this * is automatically included is \e arcmode is false. * * With the Geodesic::LONG_UNROLL bit set, the quantity \e lon2 − \e * lon1 indicates how many times and in what sense the geodesic encircles * the ellipsoid. **********************************************************************/ Math::real GenDirect(real lat1, real lon1, real azi1, bool arcmode, real s12_a12, unsigned outmask, real& lat2, real& lon2, real& azi2, real& s12, real& m12, real& M12, real& M21, real& S12) const; ///@} /** \name Inverse geodesic problem. **********************************************************************/ ///@{ /** * Solve the inverse geodesic problem. * * @param[in] lat1 latitude of point 1 (degrees). * @param[in] lon1 longitude of point 1 (degrees). * @param[in] lat2 latitude of point 2 (degrees). * @param[in] lon2 longitude of point 2 (degrees). * @param[out] s12 distance between point 1 and point 2 (meters). * @param[out] azi1 azimuth at point 1 (degrees). * @param[out] azi2 (forward) azimuth at point 2 (degrees). * @param[out] m12 reduced length of geodesic (meters). * @param[out] M12 geodesic scale of point 2 relative to point 1 * (dimensionless). * @param[out] M21 geodesic scale of point 1 relative to point 2 * (dimensionless). * @param[out] S12 area under the geodesic (meters2). * @return \e a12 arc length of between point 1 and point 2 (degrees). * * \e lat1 and \e lat2 should be in the range [−90°, 90°]. * The values of \e azi1 and \e azi2 returned are in the range * [−180°, 180°]. * * If either point is at a pole, the azimuth is defined by keeping the * longitude fixed, writing \e lat = ±(90° − ε), * and taking the limit ε → 0+. * * The solution to the inverse problem is found using Newton's method. If * this fails to converge (this is very unlikely in geodetic applications * but does occur for very eccentric ellipsoids), then the bisection method * is used to refine the solution. * * The following functions are overloaded versions of Geodesic::Inverse * which omit some of the output parameters. Note, however, that the arc * length is always computed and returned as the function value. **********************************************************************/ Math::real Inverse(real lat1, real lon1, real lat2, real lon2, real& s12, real& azi1, real& azi2, real& m12, real& M12, real& M21, real& S12) const { return GenInverse(lat1, lon1, lat2, lon2, DISTANCE | AZIMUTH | REDUCEDLENGTH | GEODESICSCALE | AREA, s12, azi1, azi2, m12, M12, M21, S12); } /** * See the documentation for Geodesic::Inverse. **********************************************************************/ Math::real Inverse(real lat1, real lon1, real lat2, real lon2, real& s12) const { real t; return GenInverse(lat1, lon1, lat2, lon2, DISTANCE, s12, t, t, t, t, t, t); } /** * See the documentation for Geodesic::Inverse. **********************************************************************/ Math::real Inverse(real lat1, real lon1, real lat2, real lon2, real& azi1, real& azi2) const { real t; return GenInverse(lat1, lon1, lat2, lon2, AZIMUTH, t, azi1, azi2, t, t, t, t); } /** * See the documentation for Geodesic::Inverse. **********************************************************************/ Math::real Inverse(real lat1, real lon1, real lat2, real lon2, real& s12, real& azi1, real& azi2) const { real t; return GenInverse(lat1, lon1, lat2, lon2, DISTANCE | AZIMUTH, s12, azi1, azi2, t, t, t, t); } /** * See the documentation for Geodesic::Inverse. **********************************************************************/ Math::real Inverse(real lat1, real lon1, real lat2, real lon2, real& s12, real& azi1, real& azi2, real& m12) const { real t; return GenInverse(lat1, lon1, lat2, lon2, DISTANCE | AZIMUTH | REDUCEDLENGTH, s12, azi1, azi2, m12, t, t, t); } /** * See the documentation for Geodesic::Inverse. **********************************************************************/ Math::real Inverse(real lat1, real lon1, real lat2, real lon2, real& s12, real& azi1, real& azi2, real& M12, real& M21) const { real t; return GenInverse(lat1, lon1, lat2, lon2, DISTANCE | AZIMUTH | GEODESICSCALE, s12, azi1, azi2, t, M12, M21, t); } /** * See the documentation for Geodesic::Inverse. **********************************************************************/ Math::real Inverse(real lat1, real lon1, real lat2, real lon2, real& s12, real& azi1, real& azi2, real& m12, real& M12, real& M21) const { real t; return GenInverse(lat1, lon1, lat2, lon2, DISTANCE | AZIMUTH | REDUCEDLENGTH | GEODESICSCALE, s12, azi1, azi2, m12, M12, M21, t); } ///@} /** \name General version of inverse geodesic solution. **********************************************************************/ ///@{ /** * The general inverse geodesic calculation. Geodesic::Inverse is defined * in terms of this function. * * @param[in] lat1 latitude of point 1 (degrees). * @param[in] lon1 longitude of point 1 (degrees). * @param[in] lat2 latitude of point 2 (degrees). * @param[in] lon2 longitude of point 2 (degrees). * @param[in] outmask a bitor'ed combination of Geodesic::mask values * specifying which of the following parameters should be set. * @param[out] s12 distance between point 1 and point 2 (meters). * @param[out] azi1 azimuth at point 1 (degrees). * @param[out] azi2 (forward) azimuth at point 2 (degrees). * @param[out] m12 reduced length of geodesic (meters). * @param[out] M12 geodesic scale of point 2 relative to point 1 * (dimensionless). * @param[out] M21 geodesic scale of point 1 relative to point 2 * (dimensionless). * @param[out] S12 area under the geodesic (meters2). * @return \e a12 arc length of between point 1 and point 2 (degrees). * * The Geodesic::mask values possible for \e outmask are * - \e outmask |= Geodesic::DISTANCE for the distance \e s12; * - \e outmask |= Geodesic::AZIMUTH for the latitude \e azi2; * - \e outmask |= Geodesic::REDUCEDLENGTH for the reduced length \e * m12; * - \e outmask |= Geodesic::GEODESICSCALE for the geodesic scales \e * M12 and \e M21; * - \e outmask |= Geodesic::AREA for the area \e S12; * - \e outmask |= Geodesic::ALL for all of the above. * . * The arc length is always computed and returned as the function value. **********************************************************************/ Math::real GenInverse(real lat1, real lon1, real lat2, real lon2, unsigned outmask, real& s12, real& azi1, real& azi2, real& m12, real& M12, real& M21, real& S12) const; ///@} /** \name Interface to GeodesicLine. **********************************************************************/ ///@{ /** * Set up to compute several points on a single geodesic. * * @param[in] lat1 latitude of point 1 (degrees). * @param[in] lon1 longitude of point 1 (degrees). * @param[in] azi1 azimuth at point 1 (degrees). * @param[in] caps bitor'ed combination of Geodesic::mask values * specifying the capabilities the GeodesicLine object should possess, * i.e., which quantities can be returned in calls to * GeodesicLine::Position. * @return a GeodesicLine object. * * \e lat1 should be in the range [−90°, 90°]. * * The Geodesic::mask values are * - \e caps |= Geodesic::LATITUDE for the latitude \e lat2; this is * added automatically; * - \e caps |= Geodesic::LONGITUDE for the latitude \e lon2; * - \e caps |= Geodesic::AZIMUTH for the azimuth \e azi2; this is * added automatically; * - \e caps |= Geodesic::DISTANCE for the distance \e s12; * - \e caps |= Geodesic::REDUCEDLENGTH for the reduced length \e m12; * - \e caps |= Geodesic::GEODESICSCALE for the geodesic scales \e M12 * and \e M21; * - \e caps |= Geodesic::AREA for the area \e S12; * - \e caps |= Geodesic::DISTANCE_IN permits the length of the * geodesic to be given in terms of \e s12; without this capability the * length can only be specified in terms of arc length; * - \e caps |= Geodesic::ALL for all of the above. * . * The default value of \e caps is Geodesic::ALL. * * If the point is at a pole, the azimuth is defined by keeping \e lon1 * fixed, writing \e lat1 = ±(90 − ε), and taking the * limit ε → 0+. **********************************************************************/ GeodesicLine Line(real lat1, real lon1, real azi1, unsigned caps = ALL) const; /** * Define a GeodesicLine in terms of the inverse geodesic problem. * * @param[in] lat1 latitude of point 1 (degrees). * @param[in] lon1 longitude of point 1 (degrees). * @param[in] lat2 latitude of point 2 (degrees). * @param[in] lon2 longitude of point 2 (degrees). * @param[in] caps bitor'ed combination of Geodesic::mask values * specifying the capabilities the GeodesicLine object should possess, * i.e., which quantities can be returned in calls to * GeodesicLine::Position. * @return a GeodesicLine object. * * This function sets point 3 of the GeodesicLine to correspond to point 2 * of the inverse geodesic problem. * * \e lat1 and \e lat2 should be in the range [−90°, 90°]. **********************************************************************/ GeodesicLine InverseLine(real lat1, real lon1, real lat2, real lon2, unsigned caps = ALL) const; /** * Define a GeodesicLine in terms of the direct geodesic problem specified * in terms of distance. * * @param[in] lat1 latitude of point 1 (degrees). * @param[in] lon1 longitude of point 1 (degrees). * @param[in] azi1 azimuth at point 1 (degrees). * @param[in] s12 distance between point 1 and point 2 (meters); it can be * negative. * @param[in] caps bitor'ed combination of Geodesic::mask values * specifying the capabilities the GeodesicLine object should possess, * i.e., which quantities can be returned in calls to * GeodesicLine::Position. * @return a GeodesicLine object. * * This function sets point 3 of the GeodesicLine to correspond to point 2 * of the direct geodesic problem. * * \e lat1 should be in the range [−90°, 90°]. **********************************************************************/ GeodesicLine DirectLine(real lat1, real lon1, real azi1, real s12, unsigned caps = ALL) const; /** * Define a GeodesicLine in terms of the direct geodesic problem specified * in terms of arc length. * * @param[in] lat1 latitude of point 1 (degrees). * @param[in] lon1 longitude of point 1 (degrees). * @param[in] azi1 azimuth at point 1 (degrees). * @param[in] a12 arc length between point 1 and point 2 (degrees); it can * be negative. * @param[in] caps bitor'ed combination of Geodesic::mask values * specifying the capabilities the GeodesicLine object should possess, * i.e., which quantities can be returned in calls to * GeodesicLine::Position. * @return a GeodesicLine object. * * This function sets point 3 of the GeodesicLine to correspond to point 2 * of the direct geodesic problem. * * \e lat1 should be in the range [−90°, 90°]. **********************************************************************/ GeodesicLine ArcDirectLine(real lat1, real lon1, real azi1, real a12, unsigned caps = ALL) const; /** * Define a GeodesicLine in terms of the direct geodesic problem specified * in terms of either distance or arc length. * * @param[in] lat1 latitude of point 1 (degrees). * @param[in] lon1 longitude of point 1 (degrees). * @param[in] azi1 azimuth at point 1 (degrees). * @param[in] arcmode boolean flag determining the meaning of the \e * s12_a12. * @param[in] s12_a12 if \e arcmode is false, this is the distance between * point 1 and point 2 (meters); otherwise it is the arc length between * point 1 and point 2 (degrees); it can be negative. * @param[in] caps bitor'ed combination of Geodesic::mask values * specifying the capabilities the GeodesicLine object should possess, * i.e., which quantities can be returned in calls to * GeodesicLine::Position. * @return a GeodesicLine object. * * This function sets point 3 of the GeodesicLine to correspond to point 2 * of the direct geodesic problem. * * \e lat1 should be in the range [−90°, 90°]. **********************************************************************/ GeodesicLine GenDirectLine(real lat1, real lon1, real azi1, bool arcmode, real s12_a12, unsigned caps = ALL) const; ///@} /** \name Inspector functions. **********************************************************************/ ///@{ /** * @return \e a the equatorial radius of the ellipsoid (meters). This is * the value used in the constructor. **********************************************************************/ Math::real EquatorialRadius() const { return _a; } /** * @return \e f the flattening of the ellipsoid. This is the * value used in the constructor. **********************************************************************/ Math::real Flattening() const { return _f; } /** * @return total area of ellipsoid in meters2. The area of a * polygon encircling a pole can be found by adding * Geodesic::EllipsoidArea()/2 to the sum of \e S12 for each side of the * polygon. **********************************************************************/ Math::real EllipsoidArea() const { return 4 * Math::pi() * _c2; } ///@} /** * A global instantiation of Geodesic with the parameters for the WGS84 * ellipsoid. **********************************************************************/ static const Geodesic& WGS84(); }; } // namespace GeographicLib #endif // GEOGRAPHICLIB_GEODESIC_HPP geosphere/src/OSGB.cpp0000644000176200001440000001273414323376012014270 0ustar liggesusers/** * \file OSGB.cpp * \brief Implementation for GeographicLib::OSGB class * * Copyright (c) Charles Karney (2010-2020) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #include "OSGB.h" #include "Utility.h" #if defined(_MSC_VER) // Squelch warnings about enum-float expressions # pragma warning (disable: 5055) #endif namespace GeographicLib { using namespace std; const char* const OSGB::letters_ = "ABCDEFGHJKLMNOPQRSTUVWXYZ"; const char* const OSGB::digits_ = "0123456789"; const TransverseMercator& OSGB::OSGBTM() { static const TransverseMercator osgbtm(EquatorialRadius(), Flattening(), CentralScale()); return osgbtm; } Math::real OSGB::computenorthoffset() { real x, y; static const real northoffset = ( OSGBTM().Forward(real(0), OriginLatitude(), real(0), x, y), FalseNorthing() - y ); return northoffset; } void OSGB::GridReference(real x, real y, int prec, std::string& gridref) { using std::isnan; // Needed for Centos 7, ubuntu 14 CheckCoords(x, y); if (!(prec >= 0 && prec <= maxprec_)) throw GeographicErr("OSGB precision " + Utility::str(prec) + " not in [0, " + Utility::str(int(maxprec_)) + "]"); if (isnan(x) || isnan(y)) { gridref = "INVALID"; return; } char grid[2 + 2 * maxprec_]; int xh = int(floor(x / tile_)), yh = int(floor(y / tile_)); real xf = x - tile_ * xh, yf = y - tile_ * yh; xh += tileoffx_; yh += tileoffy_; int z = 0; grid[z++] = letters_[(tilegrid_ - (yh / tilegrid_) - 1) * tilegrid_ + (xh / tilegrid_)]; grid[z++] = letters_[(tilegrid_ - (yh % tilegrid_) - 1) * tilegrid_ + (xh % tilegrid_)]; // Need extra real because, since C++11, pow(float, int) returns double real mult = real(pow(real(base_), max(tilelevel_ - prec, 0))); int ix = int(floor(xf / mult)), iy = int(floor(yf / mult)); for (int c = min(prec, int(tilelevel_)); c--;) { grid[z + c] = digits_[ ix % base_ ]; ix /= base_; grid[z + c + prec] = digits_[ iy % base_ ]; iy /= base_; } if (prec > tilelevel_) { xf -= floor(xf / mult); yf -= floor(yf / mult); mult = real(pow(real(base_), prec - tilelevel_)); ix = int(floor(xf * mult)); iy = int(floor(yf * mult)); for (int c = prec - tilelevel_; c--;) { grid[z + c + tilelevel_] = digits_[ ix % base_ ]; ix /= base_; grid[z + c + tilelevel_ + prec] = digits_[ iy % base_ ]; iy /= base_; } } int mlen = z + 2 * prec; gridref.resize(mlen); copy(grid, grid + mlen, gridref.begin()); } void OSGB::GridReference(const std::string& gridref, real& x, real& y, int& prec, bool centerp) { int len = int(gridref.size()), p = 0; if (len >= 2 && toupper(gridref[0]) == 'I' && toupper(gridref[1]) == 'N') { x = y = Math::NaN(); prec = -2; // For compatibility with MGRS::Reverse. return; } char grid[2 + 2 * maxprec_]; for (int i = 0; i < len; ++i) { if (!isspace(gridref[i])) { if (p >= 2 + 2 * maxprec_) throw GeographicErr("OSGB string " + gridref + " too long"); grid[p++] = gridref[i]; } } len = p; p = 0; if (len < 2) throw GeographicErr("OSGB string " + gridref + " too short"); if (len % 2) throw GeographicErr("OSGB string " + gridref + " has odd number of characters"); int xh = 0, yh = 0; while (p < 2) { int i = Utility::lookup(letters_, grid[p++]); if (i < 0) throw GeographicErr("Illegal prefix character " + gridref); yh = yh * tilegrid_ + tilegrid_ - (i / tilegrid_) - 1; xh = xh * tilegrid_ + (i % tilegrid_); } xh -= tileoffx_; yh -= tileoffy_; int prec1 = (len - p)/2; real unit = tile_, x1 = unit * xh, y1 = unit * yh; for (int i = 0; i < prec1; ++i) { unit /= base_; int ix = Utility::lookup(digits_, grid[p + i]), iy = Utility::lookup(digits_, grid[p + i + prec1]); if (ix < 0 || iy < 0) throw GeographicErr("Encountered a non-digit in " + gridref); x1 += unit * ix; y1 += unit * iy; } if (centerp) { x1 += unit/2; y1 += unit/2; } x = x1; y = y1; prec = prec1; } void OSGB::CheckCoords(real x, real y) { // Limits are all multiples of 100km and are all closed on the lower end // and open on the upper end -- and this is reflected in the error // messages. NaNs are let through. if (x < minx_ || x >= maxx_) throw GeographicErr("Easting " + Utility::str(int(floor(x/1000))) + "km not in OSGB range [" + Utility::str(minx_/1000) + "km, " + Utility::str(maxx_/1000) + "km)"); if (y < miny_ || y >= maxy_) throw GeographicErr("Northing " + Utility::str(int(floor(y/1000))) + "km not in OSGB range [" + Utility::str(miny_/1000) + "km, " + Utility::str(maxy_/1000) + "km)"); } } // namespace GeographicLib geosphere/src/SphericalHarmonic2.h0000644000176200001440000003317314323400206016651 0ustar liggesusers/** * \file SphericalHarmonic2.hpp * \brief Header for GeographicLib::SphericalHarmonic2 class * * Copyright (c) Charles Karney (2011-2012) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #if !defined(GEOGRAPHICLIB_SPHERICALHARMONIC2_HPP) #define GEOGRAPHICLIB_SPHERICALHARMONIC2_HPP 1 #include #include "Constants.h" #include "SphericalEngine.h" #include "CircularEngine.h" namespace GeographicLib { /** * \brief Spherical harmonic series with two corrections to the coefficients * * This classes is similar to SphericalHarmonic, except that the coefficients * Cnm are replaced by * Cnm + \e tau' C'nm + \e * tau'' C''nm (and similarly for * Snm). * * Example of use: * \include example-SphericalHarmonic2.cpp **********************************************************************/ // Don't include the GEOGRPAHIC_EXPORT because this header-only class isn't // used by any other classes in the library. class /*GEOGRAPHICLIB_EXPORT*/ SphericalHarmonic2 { public: /** * Supported normalizations for associate Legendre polynomials. **********************************************************************/ enum normalization { /** * Fully normalized associated Legendre polynomials. See * SphericalHarmonic::FULL for documentation. * * @hideinitializer **********************************************************************/ FULL = SphericalEngine::FULL, /** * Schmidt semi-normalized associated Legendre polynomials. See * SphericalHarmonic::SCHMIDT for documentation. * * @hideinitializer **********************************************************************/ SCHMIDT = SphericalEngine::SCHMIDT, }; private: typedef Math::real real; SphericalEngine::coeff _c[3]; real _a; unsigned _norm; public: /** * Constructor with a full set of coefficients specified. * * @param[in] C the coefficients Cnm. * @param[in] S the coefficients Snm. * @param[in] N the maximum degree and order of the sum * @param[in] C1 the coefficients C'nm. * @param[in] S1 the coefficients S'nm. * @param[in] N1 the maximum degree and order of the first correction * coefficients C'nm and * S'nm. * @param[in] C2 the coefficients C''nm. * @param[in] S2 the coefficients S''nm. * @param[in] N2 the maximum degree and order of the second correction * coefficients C'nm and * S'nm. * @param[in] a the reference radius appearing in the definition of the * sum. * @param[in] norm the normalization for the associated Legendre * polynomials, either SphericalHarmonic2::FULL (the default) or * SphericalHarmonic2::SCHMIDT. * @exception GeographicErr if \e N and \e N1 do not satisfy \e N ≥ * \e N1 ≥ −1, and similarly for \e N2. * @exception GeographicErr if any of the vectors of coefficients is not * large enough. * * See SphericalHarmonic for the way the coefficients should be stored. \e * N1 and \e N2 should satisfy \e N1 ≤ \e N and \e N2 ≤ \e N. * * The class stores pointers to the first elements of \e C, \e S, \e * C', \e S', \e C'', and \e S''. These arrays should not be altered or * destroyed during the lifetime of a SphericalHarmonic object. **********************************************************************/ SphericalHarmonic2(const std::vector& C, const std::vector& S, int N, const std::vector& C1, const std::vector& S1, int N1, const std::vector& C2, const std::vector& S2, int N2, real a, unsigned norm = FULL) : _a(a) , _norm(norm) { if (!(N1 <= N && N2 <= N)) throw GeographicErr("N1 and N2 cannot be larger that N"); _c[0] = SphericalEngine::coeff(C, S, N); _c[1] = SphericalEngine::coeff(C1, S1, N1); _c[2] = SphericalEngine::coeff(C2, S2, N2); } /** * Constructor with a subset of coefficients specified. * * @param[in] C the coefficients Cnm. * @param[in] S the coefficients Snm. * @param[in] N the degree used to determine the layout of \e C and \e S. * @param[in] nmx the maximum degree used in the sum. The sum over \e n is * from 0 thru \e nmx. * @param[in] mmx the maximum order used in the sum. The sum over \e m is * from 0 thru min(\e n, \e mmx). * @param[in] C1 the coefficients C'nm. * @param[in] S1 the coefficients S'nm. * @param[in] N1 the degree used to determine the layout of \e C' and \e * S'. * @param[in] nmx1 the maximum degree used for \e C' and \e S'. * @param[in] mmx1 the maximum order used for \e C' and \e S'. * @param[in] C2 the coefficients C''nm. * @param[in] S2 the coefficients S''nm. * @param[in] N2 the degree used to determine the layout of \e C'' and \e * S''. * @param[in] nmx2 the maximum degree used for \e C'' and \e S''. * @param[in] mmx2 the maximum order used for \e C'' and \e S''. * @param[in] a the reference radius appearing in the definition of the * sum. * @param[in] norm the normalization for the associated Legendre * polynomials, either SphericalHarmonic2::FULL (the default) or * SphericalHarmonic2::SCHMIDT. * @exception GeographicErr if the parameters do not satisfy \e N ≥ \e * nmx ≥ \e mmx ≥ −1; \e N1 ≥ \e nmx1 ≥ \e mmx1 ≥ * −1; \e N ≥ \e N1; \e nmx ≥ \e nmx1; \e mmx ≥ \e mmx1; * and similarly for \e N2, \e nmx2, and \e mmx2. * @exception GeographicErr if any of the vectors of coefficients is not * large enough. * * The class stores pointers to the first elements of \e C, \e S, \e * C', \e S', \e C'', and \e S''. These arrays should not be altered or * destroyed during the lifetime of a SphericalHarmonic object. **********************************************************************/ SphericalHarmonic2(const std::vector& C, const std::vector& S, int N, int nmx, int mmx, const std::vector& C1, const std::vector& S1, int N1, int nmx1, int mmx1, const std::vector& C2, const std::vector& S2, int N2, int nmx2, int mmx2, real a, unsigned norm = FULL) : _a(a) , _norm(norm) { if (!(nmx1 <= nmx && nmx2 <= nmx)) throw GeographicErr("nmx1 and nmx2 cannot be larger that nmx"); if (!(mmx1 <= mmx && mmx2 <= mmx)) throw GeographicErr("mmx1 and mmx2 cannot be larger that mmx"); _c[0] = SphericalEngine::coeff(C, S, N, nmx, mmx); _c[1] = SphericalEngine::coeff(C1, S1, N1, nmx1, mmx1); _c[2] = SphericalEngine::coeff(C2, S2, N2, nmx2, mmx2); } /** * A default constructor so that the object can be created when the * constructor for another object is initialized. This default object can * then be reset with the default copy assignment operator. **********************************************************************/ SphericalHarmonic2() {} /** * Compute a spherical harmonic sum with two correction terms. * * @param[in] tau1 multiplier for correction coefficients \e C' and \e S'. * @param[in] tau2 multiplier for correction coefficients \e C'' and \e * S''. * @param[in] x cartesian coordinate. * @param[in] y cartesian coordinate. * @param[in] z cartesian coordinate. * @return \e V the spherical harmonic sum. * * This routine requires constant memory and thus never throws an * exception. **********************************************************************/ Math::real operator()(real tau1, real tau2, real x, real y, real z) const { real f[] = {1, tau1, tau2}; real v = 0; real dummy; switch (_norm) { case FULL: v = SphericalEngine::Value (_c, f, x, y, z, _a, dummy, dummy, dummy); break; case SCHMIDT: default: // To avoid compiler warnings v = SphericalEngine::Value (_c, f, x, y, z, _a, dummy, dummy, dummy); break; } return v; } /** * Compute a spherical harmonic sum with two correction terms and its * gradient. * * @param[in] tau1 multiplier for correction coefficients \e C' and \e S'. * @param[in] tau2 multiplier for correction coefficients \e C'' and \e * S''. * @param[in] x cartesian coordinate. * @param[in] y cartesian coordinate. * @param[in] z cartesian coordinate. * @param[out] gradx \e x component of the gradient * @param[out] grady \e y component of the gradient * @param[out] gradz \e z component of the gradient * @return \e V the spherical harmonic sum. * * This is the same as the previous function, except that the components of * the gradients of the sum in the \e x, \e y, and \e z directions are * computed. This routine requires constant memory and thus never throws * an exception. **********************************************************************/ Math::real operator()(real tau1, real tau2, real x, real y, real z, real& gradx, real& grady, real& gradz) const { real f[] = {1, tau1, tau2}; real v = 0; switch (_norm) { case FULL: v = SphericalEngine::Value (_c, f, x, y, z, _a, gradx, grady, gradz); break; case SCHMIDT: default: // To avoid compiler warnings v = SphericalEngine::Value (_c, f, x, y, z, _a, gradx, grady, gradz); break; } return v; } /** * Create a CircularEngine to allow the efficient evaluation of several * points on a circle of latitude at fixed values of \e tau1 and \e tau2. * * @param[in] tau1 multiplier for correction coefficients \e C' and \e S'. * @param[in] tau2 multiplier for correction coefficients \e C'' and \e * S''. * @param[in] p the radius of the circle. * @param[in] z the height of the circle above the equatorial plane. * @param[in] gradp if true the returned object will be able to compute the * gradient of the sum. * @exception std::bad_alloc if the memory for the CircularEngine can't be * allocated. * @return the CircularEngine object. * * SphericalHarmonic2::operator()() exchanges the order of the sums in the * definition, i.e., ∑n = 0..N * ∑m = 0..n becomes ∑m = * 0..Nn = m..N.. * SphericalHarmonic2::Circle performs the inner sum over degree \e n * (which entails about N2 operations). Calling * CircularEngine::operator()() on the returned object performs the outer * sum over the order \e m (about \e N operations). * * See SphericalHarmonic::Circle for an example of its use. **********************************************************************/ CircularEngine Circle(real tau1, real tau2, real p, real z, bool gradp) const { real f[] = {1, tau1, tau2}; switch (_norm) { case FULL: return gradp ? SphericalEngine::Circle (_c, f, p, z, _a) : SphericalEngine::Circle (_c, f, p, z, _a); break; case SCHMIDT: default: // To avoid compiler warnings return gradp ? SphericalEngine::Circle (_c, f, p, z, _a) : SphericalEngine::Circle (_c, f, p, z, _a); break; } } /** * @return the zeroth SphericalEngine::coeff object. **********************************************************************/ const SphericalEngine::coeff& Coefficients() const { return _c[0]; } /** * @return the first SphericalEngine::coeff object. **********************************************************************/ const SphericalEngine::coeff& Coefficients1() const { return _c[1]; } /** * @return the second SphericalEngine::coeff object. **********************************************************************/ const SphericalEngine::coeff& Coefficients2() const { return _c[2]; } }; } // namespace GeographicLib #endif // GEOGRAPHICLIB_SPHERICALHARMONIC2_HPP geosphere/src/a_util.h0000644000176200001440000000054013472155746014465 0ustar liggesusers/* modulo */ double mod(double x, double n) ; /* Convert degrees to radians */ double toRad(double deg) ; /* Convert radians to degrees */ double toDeg(double rad) ; /* normatlize longitude between -180 .. 180 degrees*/ double normalizeLonDeg(double lon); /* normatlize longitude between -pi .. p1 radians*/ double normalizeLonRad(double lon); geosphere/src/AlbersEqualArea.cpp0000644000176200001440000005330414677357014016542 0ustar liggesusers/** * \file AlbersEqualArea.cpp * \brief Implementation for GeographicLib::AlbersEqualArea class * * Copyright (c) Charles Karney (2010-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #include #include // std::numeric_limits #include // std::to_string #include // std::swap #include "AlbersEqualArea.h" #if defined(_MSC_VER) // Squelch warnings about constant conditional and enum-float expressions # pragma warning (disable: 4127 5055) #endif namespace GeographicLib { using namespace std; AlbersEqualArea::AlbersEqualArea(real a, real f, real stdlat, real k0) : eps_(numeric_limits::epsilon()) , epsx_(Math::sq(eps_)) , epsx2_(Math::sq(epsx_)) , tol_(sqrt(eps_)) , tol0_(tol_ * sqrt(sqrt(eps_))) , _a(a) , _f(f) , _fm(1 - _f) , _e2(_f * (2 - _f)) , _e(sqrt(fabs(_e2))) , _e2m(1 - _e2) , _qZ(1 + _e2m * atanhee(real(1))) , _qx(_qZ / ( 2 * _e2m )) { if (!(isfinite(_a) && _a > 0)) throw GeographicErr("Equatorial radius is not positive"); if (!(isfinite(_f) && _f < 1)) throw GeographicErr("Polar semi-axis is not positive"); if (!(isfinite(k0) && k0 > 0)) throw GeographicErr("Scale is not positive"); if (!(fabs(stdlat) <= Math::qd)) throw GeographicErr("Standard latitude not in [-" + to_string(Math::qd) + "d, " + to_string(Math::qd) + "d]"); real sphi, cphi; Math::sincosd(stdlat, sphi, cphi); Init(sphi, cphi, sphi, cphi, k0); } AlbersEqualArea::AlbersEqualArea(real a, real f, real stdlat1, real stdlat2, real k1) : eps_(numeric_limits::epsilon()) , epsx_(Math::sq(eps_)) , epsx2_(Math::sq(epsx_)) , tol_(sqrt(eps_)) , tol0_(tol_ * sqrt(sqrt(eps_))) , _a(a) , _f(f) , _fm(1 - _f) , _e2(_f * (2 - _f)) , _e(sqrt(fabs(_e2))) , _e2m(1 - _e2) , _qZ(1 + _e2m * atanhee(real(1))) , _qx(_qZ / ( 2 * _e2m )) { if (!(isfinite(_a) && _a > 0)) throw GeographicErr("Equatorial radius is not positive"); if (!(isfinite(_f) && _f < 1)) throw GeographicErr("Polar semi-axis is not positive"); if (!(isfinite(k1) && k1 > 0)) throw GeographicErr("Scale is not positive"); if (!(fabs(stdlat1) <= Math::qd)) throw GeographicErr("Standard latitude 1 not in [-" + to_string(Math::qd) + "d, " + to_string(Math::qd) + "d]"); if (!(fabs(stdlat2) <= Math::qd)) throw GeographicErr("Standard latitude 2 not in [-" + to_string(Math::qd) + "d, " + to_string(Math::qd) + "d]"); real sphi1, cphi1, sphi2, cphi2; Math::sincosd(stdlat1, sphi1, cphi1); Math::sincosd(stdlat2, sphi2, cphi2); Init(sphi1, cphi1, sphi2, cphi2, k1); } AlbersEqualArea::AlbersEqualArea(real a, real f, real sinlat1, real coslat1, real sinlat2, real coslat2, real k1) : eps_(numeric_limits::epsilon()) , epsx_(Math::sq(eps_)) , epsx2_(Math::sq(epsx_)) , tol_(sqrt(eps_)) , tol0_(tol_ * sqrt(sqrt(eps_))) , _a(a) , _f(f) , _fm(1 - _f) , _e2(_f * (2 - _f)) , _e(sqrt(fabs(_e2))) , _e2m(1 - _e2) , _qZ(1 + _e2m * atanhee(real(1))) , _qx(_qZ / ( 2 * _e2m )) { if (!(isfinite(_a) && _a > 0)) throw GeographicErr("Equatorial radius is not positive"); if (!(isfinite(_f) && _f < 1)) throw GeographicErr("Polar semi-axis is not positive"); if (!(isfinite(k1) && k1 > 0)) throw GeographicErr("Scale is not positive"); if (signbit(coslat1)) throw GeographicErr("Standard latitude 1 not in [-" + to_string(Math::qd) + "d, " + to_string(Math::qd) + "d]"); if (signbit(coslat2)) throw GeographicErr("Standard latitude 2 not in [-" + to_string(Math::qd) + "d, " + to_string(Math::qd) + "d]"); if (!(fabs(sinlat1) <= 1 && coslat1 <= 1) || (coslat1 == 0 && sinlat1 == 0)) throw GeographicErr("Bad sine/cosine of standard latitude 1"); if (!(fabs(sinlat2) <= 1 && coslat2 <= 1) || (coslat2 == 0 && sinlat2 == 0)) throw GeographicErr("Bad sine/cosine of standard latitude 2"); if (coslat1 == 0 && coslat2 == 0 && sinlat1 * sinlat2 <= 0) throw GeographicErr ("Standard latitudes cannot be opposite poles"); Init(sinlat1, coslat1, sinlat2, coslat2, k1); } void AlbersEqualArea::Init(real sphi1, real cphi1, real sphi2, real cphi2, real k1) { { real r; r = hypot(sphi1, cphi1); sphi1 /= r; cphi1 /= r; r = hypot(sphi2, cphi2); sphi2 /= r; cphi2 /= r; } bool polar = (cphi1 == 0); cphi1 = fmax(epsx_, cphi1); // Avoid singularities at poles cphi2 = fmax(epsx_, cphi2); // Determine hemisphere of tangent latitude _sign = sphi1 + sphi2 >= 0 ? 1 : -1; // Internally work with tangent latitude positive sphi1 *= _sign; sphi2 *= _sign; if (sphi1 > sphi2) { swap(sphi1, sphi2); swap(cphi1, cphi2); // Make phi1 < phi2 } real tphi1 = sphi1/cphi1, tphi2 = sphi2/cphi2; // q = (1-e^2)*(sphi/(1-e^2*sphi^2) - atanhee(sphi)) // qZ = q(pi/2) = (1 + (1-e^2)*atanhee(1)) // atanhee(x) = atanh(e*x)/e // q = sxi * qZ // dq/dphi = 2*(1-e^2)*cphi/(1-e^2*sphi^2)^2 // // n = (m1^2-m2^2)/(q2-q1) -> sin(phi0) for phi1, phi2 -> phi0 // C = m1^2 + n*q1 = (m1^2*q2-m2^2*q1)/(q2-q1) // let // rho(pi/2)/rho(-pi/2) = (1-s)/(1+s) // s = n*qZ/C // = qZ * (m1^2-m2^2)/(m1^2*q2-m2^2*q1) // = qZ * (scbet2^2 - scbet1^2)/(scbet2^2*q2 - scbet1^2*q1) // = (scbet2^2 - scbet1^2)/(scbet2^2*sxi2 - scbet1^2*sxi1) // = (tbet2^2 - tbet1^2)/(scbet2^2*sxi2 - scbet1^2*sxi1) // 1-s = -((1-sxi2)*scbet2^2 - (1-sxi1)*scbet1^2)/ // (scbet2^2*sxi2 - scbet1^2*sxi1) // // Define phi0 to give same value of s, i.e., // s = sphi0 * qZ / (m0^2 + sphi0*q0) // = sphi0 * scbet0^2 / (1/qZ + sphi0 * scbet0^2 * sxi0) real tphi0, C; if (polar || tphi1 == tphi2) { tphi0 = tphi2; C = 1; // ignored } else { real tbet1 = _fm * tphi1, scbet12 = 1 + Math::sq(tbet1), tbet2 = _fm * tphi2, scbet22 = 1 + Math::sq(tbet2), txi1 = txif(tphi1), cxi1 = 1/hyp(txi1), sxi1 = txi1 * cxi1, txi2 = txif(tphi2), cxi2 = 1/hyp(txi2), sxi2 = txi2 * cxi2, dtbet2 = _fm * (tbet1 + tbet2), es1 = 1 - _e2 * Math::sq(sphi1), es2 = 1 - _e2 * Math::sq(sphi2), /* dsxi = ( (_e2 * sq(sphi2 + sphi1) + es2 + es1) / (2 * es2 * es1) + Datanhee(sphi2, sphi1) ) * Dsn(tphi2, tphi1, sphi2, sphi1) / ( 2 * _qx ), */ dsxi = ( (1 + _e2 * sphi1 * sphi2) / (es2 * es1) + Datanhee(sphi2, sphi1) ) * Dsn(tphi2, tphi1, sphi2, sphi1) / ( 2 * _qx ), den = (sxi2 + sxi1) * dtbet2 + (scbet22 + scbet12) * dsxi, // s = (sq(tbet2) - sq(tbet1)) / (scbet22*sxi2 - scbet12*sxi1) s = 2 * dtbet2 / den, // 1-s = -(sq(scbet2)*(1-sxi2) - sq(scbet1)*(1-sxi1)) / // (scbet22*sxi2 - scbet12*sxi1) // Write // sq(scbet)*(1-sxi) = sq(scbet)*(1-sphi) * (1-sxi)/(1-sphi) sm1 = -Dsn(tphi2, tphi1, sphi2, sphi1) * ( -( ((sphi2 <= 0 ? (1 - sxi2) / (1 - sphi2) : Math::sq(cxi2/cphi2) * (1 + sphi2) / (1 + sxi2)) + (sphi1 <= 0 ? (1 - sxi1) / (1 - sphi1) : Math::sq(cxi1/cphi1) * (1 + sphi1) / (1 + sxi1))) ) * (1 + _e2 * (sphi1 + sphi2 + sphi1 * sphi2)) / (1 + (sphi1 + sphi2 + sphi1 * sphi2)) + (scbet22 * (sphi2 <= 0 ? 1 - sphi2 : Math::sq(cphi2) / ( 1 + sphi2)) + scbet12 * (sphi1 <= 0 ? 1 - sphi1 : Math::sq(cphi1) / ( 1 + sphi1))) * (_e2 * (1 + sphi1 + sphi2 + _e2 * sphi1 * sphi2)/(es1 * es2) +_e2m * DDatanhee(sphi1, sphi2) ) / _qZ ) / den; // C = (scbet22*sxi2 - scbet12*sxi1) / (scbet22 * scbet12 * (sx2 - sx1)) C = den / (2 * scbet12 * scbet22 * dsxi); tphi0 = (tphi2 + tphi1)/2; real stol = tol0_ * fmax(real(1), fabs(tphi0)); for (int i = 0; i < 2*numit0_ || GEOGRAPHICLIB_PANIC; ++i) { // Solve (scbet0^2 * sphi0) / (1/qZ + scbet0^2 * sphi0 * sxi0) = s // for tphi0 by Newton's method on // v(tphi0) = (scbet0^2 * sphi0) - s * (1/qZ + scbet0^2 * sphi0 * sxi0) // = 0 // Alt: // (scbet0^2 * sphi0) / (1/qZ - scbet0^2 * sphi0 * (1-sxi0)) // = s / (1-s) // w(tphi0) = (1-s) * (scbet0^2 * sphi0) // - s * (1/qZ - scbet0^2 * sphi0 * (1-sxi0)) // = (1-s) * (scbet0^2 * sphi0) // - S/qZ * (1 - scbet0^2 * sphi0 * (qZ-q0)) // Now // qZ-q0 = (1+e2*sphi0)*(1-sphi0)/(1-e2*sphi0^2) + // (1-e2)*atanhee((1-sphi0)/(1-e2*sphi0)) // In limit sphi0 -> 1, qZ-q0 -> 2*(1-sphi0)/(1-e2), so wrte // qZ-q0 = 2*(1-sphi0)/(1-e2) + A + B // A = (1-sphi0)*( (1+e2*sphi0)/(1-e2*sphi0^2) - (1+e2)/(1-e2) ) // = -e2 *(1-sphi0)^2 * (2+(1+e2)*sphi0) / ((1-e2)*(1-e2*sphi0^2)) // B = (1-e2)*atanhee((1-sphi0)/(1-e2*sphi0)) - (1-sphi0) // = (1-sphi0)*(1-e2)/(1-e2*sphi0)* // ((atanhee(x)/x-1) - e2*(1-sphi0)/(1-e2)) // x = (1-sphi0)/(1-e2*sphi0), atanhee(x)/x = atanh(e*x)/(e*x) // // 1 - scbet0^2 * sphi0 * (qZ-q0) // = 1 - scbet0^2 * sphi0 * (2*(1-sphi0)/(1-e2) + A + B) // = D - scbet0^2 * sphi0 * (A + B) // D = 1 - scbet0^2 * sphi0 * 2*(1-sphi0)/(1-e2) // = (1-sphi0)*(1-e2*(1+2*sphi0*(1+sphi0)))/((1-e2)*(1+sphi0)) // dD/dsphi0 = -2*(1-e2*sphi0^2*(2*sphi0+3))/((1-e2)*(1+sphi0)^2) // d(A+B)/dsphi0 = 2*(1-sphi0^2)*e2*(2-e2*(1+sphi0^2))/ // ((1-e2)*(1-e2*sphi0^2)^2) real scphi02 = 1 + Math::sq(tphi0), scphi0 = sqrt(scphi02), // sphi0m = 1-sin(phi0) = 1/( sec(phi0) * (tan(phi0) + sec(phi0)) ) sphi0 = tphi0 / scphi0, sphi0m = 1/(scphi0 * (tphi0 + scphi0)), // scbet0^2 * sphi0 g = (1 + Math::sq( _fm * tphi0 )) * sphi0, // dg/dsphi0 = dg/dtphi0 * scphi0^3 dg = _e2m * scphi02 * (1 + 2 * Math::sq(tphi0)) + _e2, D = sphi0m * (1 - _e2*(1 + 2*sphi0*(1+sphi0))) / (_e2m * (1+sphi0)), // dD/dsphi0 dD = -2 * (1 - _e2*Math::sq(sphi0) * (2*sphi0+3)) / (_e2m * Math::sq(1+sphi0)), A = -_e2 * Math::sq(sphi0m) * (2+(1+_e2)*sphi0) / (_e2m*(1-_e2*Math::sq(sphi0))), B = (sphi0m * _e2m / (1 - _e2*sphi0) * (atanhxm1(_e2 * Math::sq(sphi0m / (1-_e2*sphi0))) - _e2*sphi0m/_e2m)), // d(A+B)/dsphi0 dAB = (2 * _e2 * (2 - _e2 * (1 + Math::sq(sphi0))) / (_e2m * Math::sq(1 - _e2*Math::sq(sphi0)) * scphi02)), u = sm1 * g - s/_qZ * ( D - g * (A + B) ), // du/dsphi0 du = sm1 * dg - s/_qZ * (dD - dg * (A + B) - g * dAB), dtu = -u/du * (scphi0 * scphi02); tphi0 += dtu; if (!(fabs(dtu) >= stol)) break; } } _txi0 = txif(tphi0); _scxi0 = hyp(_txi0); _sxi0 = _txi0 / _scxi0; _n0 = tphi0/hyp(tphi0); _m02 = 1 / (1 + Math::sq(_fm * tphi0)); _nrho0 = polar ? 0 : _a * sqrt(_m02); _k0 = sqrt(tphi1 == tphi2 ? 1 : C / (_m02 + _n0 * _qZ * _sxi0)) * k1; _k2 = Math::sq(_k0); _lat0 = _sign * atan(tphi0)/Math::degree(); } const AlbersEqualArea& AlbersEqualArea::CylindricalEqualArea() { static const AlbersEqualArea cylindricalequalarea(Constants::WGS84_a(), Constants::WGS84_f(), real(0), real(1), real(0), real(1), real(1)); return cylindricalequalarea; } const AlbersEqualArea& AlbersEqualArea::AzimuthalEqualAreaNorth() { static const AlbersEqualArea azimuthalequalareanorth(Constants::WGS84_a(), Constants::WGS84_f(), real(1), real(0), real(1), real(0), real(1)); return azimuthalequalareanorth; } const AlbersEqualArea& AlbersEqualArea::AzimuthalEqualAreaSouth() { static const AlbersEqualArea azimuthalequalareasouth(Constants::WGS84_a(), Constants::WGS84_f(), real(-1), real(0), real(-1), real(0), real(1)); return azimuthalequalareasouth; } Math::real AlbersEqualArea::txif(real tphi) const { // sxi = ( sphi/(1-e2*sphi^2) + atanhee(sphi) ) / // ( 1/(1-e2) + atanhee(1) ) // // txi = ( sphi/(1-e2*sphi^2) + atanhee(sphi) ) / // sqrt( ( (1+e2*sphi)*(1-sphi)/( (1-e2*sphi^2) * (1-e2) ) + // atanhee((1-sphi)/(1-e2*sphi)) ) * // ( (1-e2*sphi)*(1+sphi)/( (1-e2*sphi^2) * (1-e2) ) + // atanhee((1+sphi)/(1+e2*sphi)) ) ) // = ( tphi/(1-e2*sphi^2) + atanhee(sphi, e2)/cphi ) / // sqrt( // ( (1+e2*sphi)/( (1-e2*sphi^2) * (1-e2) ) + Datanhee(1, sphi) ) * // ( (1-e2*sphi)/( (1-e2*sphi^2) * (1-e2) ) + Datanhee(1, -sphi) ) ) // // This function maintains odd parity real cphi = 1 / sqrt(1 + Math::sq(tphi)), sphi = tphi * cphi, es1 = _e2 * sphi, es2m1 = 1 - es1 * sphi, // 1 - e2 * sphi^2 es2m1a = _e2m * es2m1; // (1 - e2 * sphi^2) * (1 - e2) return ( tphi / es2m1 + atanhee(sphi) / cphi ) / sqrt( ( (1 + es1) / es2m1a + Datanhee(1, sphi) ) * ( (1 - es1) / es2m1a + Datanhee(1, -sphi) ) ); } Math::real AlbersEqualArea::tphif(real txi) const { real tphi = txi, stol = tol_ * fmax(real(1), fabs(txi)); // CHECK: min iterations = 1, max iterations = 2; mean = 1.99 for (int i = 0; i < numit_ || GEOGRAPHICLIB_PANIC; ++i) { // dtxi/dtphi = (scxi/scphi)^3 * 2*(1-e^2)/(qZ*(1-e^2*sphi^2)^2) real txia = txif(tphi), tphi2 = Math::sq(tphi), scphi2 = 1 + tphi2, scterm = scphi2/(1 + Math::sq(txia)), dtphi = (txi - txia) * scterm * sqrt(scterm) * _qx * Math::sq(1 - _e2 * tphi2 / scphi2); tphi += dtphi; if (!(fabs(dtphi) >= stol)) break; } return tphi; } // return atanh(sqrt(x))/sqrt(x) - 1 = x/3 + x^2/5 + x^3/7 + ... // typical x < e^2 = 2*f Math::real AlbersEqualArea::atanhxm1(real x) { real s = 0; if (fabs(x) < real(0.5)) { static const real lg2eps_ = -log2(numeric_limits::epsilon() / 2); int e; frexp(x, &e); e = -e; // x = [0.5,1) * 2^(-e) // estimate n s.t. x^n/(2*n+1) < x/3 * epsilon/2 // a stronger condition is x^(n-1) < epsilon/2 // taking log2 of both sides, a stronger condition is // (n-1)*(-e) < -lg2eps or (n-1)*e > lg2eps or n > ceiling(lg2eps/e)+1 int n = x == 0 ? 1 : int(ceil(lg2eps_ / e)) + 1; while (n--) // iterating from n-1 down to 0 s = x * s + (n ? 1 : 0)/Math::real(2*n + 1); } else { real xs = sqrt(fabs(x)); s = (x > 0 ? atanh(xs) : atan(xs)) / xs - 1; } return s; } // return (Datanhee(1,y) - Datanhee(1,x))/(y-x) Math::real AlbersEqualArea::DDatanhee(real x, real y) const { // This function is called with x = sphi1, y = sphi2, phi1 <= phi2, sphi2 // >= 0, abs(sphi1) <= phi2. However for safety's sake we enforce x <= y. if (y < x) swap(x, y); // ensure that x <= y real q1 = fabs(_e2), q2 = fabs(2 * _e / _e2m * (1 - x)); return x <= 0 || !(fmin(q1, q2) < real(0.75)) ? DDatanhee0(x, y) : (q1 < q2 ? DDatanhee1(x, y) : DDatanhee2(x, y)); } // Rearrange difference so that 1 - x is in the denominator, then do a // straight divided difference. Math::real AlbersEqualArea::DDatanhee0(real x, real y) const { return (Datanhee(1, y) - Datanhee(x, y))/(1 - x); } // The expansion for e2 small Math::real AlbersEqualArea::DDatanhee1(real x, real y) const { // The series in e2 is // sum( c[l] * e2^l, l, 1, N) // where // c[l] = sum( x^i * y^j; i >= 0, j >= 0, i+j < 2*l) / (2*l + 1) // = ( (x-y) - (1-y) * x^(2*l+1) + (1-x) * y^(2*l+1) ) / // ( (2*l+1) * (x-y) * (1-y) * (1-x) ) // For x = y = 1, c[l] = l // // In the limit x,y -> 1, // // DDatanhee -> e2/(1-e2)^2 = sum(l * e2^l, l, 1, inf) // // Use if e2 is sufficiently small. real s = 0; real z = 1, k = 1, t = 0, c = 0, en = 1; while (true) { t = y * t + z; c += t; z *= x; t = y * t + z; c += t; z *= x; k += 2; en *= _e2; // Here en[l] = e2^l, k[l] = 2*l + 1, // c[l] = sum( x^i * y^j; i >= 0, j >= 0, i+j < 2*l) / (2*l + 1) // Taylor expansion is // s = sum( c[l] * e2^l, l, 1, N) real ds = en * c / k; s += ds; if (!(fabs(ds) > fabs(s) * eps_/2)) break; // Iterate until the added term is sufficiently small } return s; } // The expansion for x (and y) close to 1 Math::real AlbersEqualArea::DDatanhee2(real x, real y) const { // If x and y are both close to 1, expand in Taylor series in dx = 1-x and // dy = 1-y: // // DDatanhee = sum(C_m * (dx^(m+1) - dy^(m+1)) / (dx - dy), m, 0, inf) // // where // // C_m = sum( (m+2)!! / (m+2-2*k)!! * // ((m+1)/2)! / ((m+1)/2-k)! / // (k! * (2*k-1)!!) * // e2^((m+1)/2+k), // k, 0, (m+1)/2) * (-1)^m / ((m+2) * (1-e2)^(m+2)) // for m odd, and // // C_m = sum( 2 * (m+1)!! / (m+1-2*k)!! * // (m/2+1)! / (m/2-k)! / // (k! * (2*k+1)!!) * // e2^(m/2+1+k), // k, 0, m/2)) * (-1)^m / ((m+2) * (1-e2)^(m+2)) // for m even. // // Here i!! is the double factorial extended to negative i with // i!! = (i+2)!!/(i+2). // // Note that // (dx^(m+1) - dy^(m+1)) / (dx - dy) = // dx^m + dx^(m-1)*dy ... + dx*dy^(m-1) + dy^m // // Leading (m = 0) term is e2 / (1 - e2)^2 // // Magnitude of mth term relative to the leading term scales as // // 2*(2*e/(1-e2)*dx)^m // // So use series if (2*e/(1-e2)*dx) is sufficiently small real s, dx = 1 - x, dy = 1 - y, xy = 1, yy = 1, ee = _e2 / Math::sq(_e2m); s = ee; for (int m = 1; ; ++m) { real c = m + 2, t = c; yy *= dy; // yy = dy^m xy = dx * xy + yy; // Now xy = dx^m + dx^(m-1)*dy ... + dx*dy^(m-1) + dy^m // = (dx^(m+1) - dy^(m+1)) / (dx - dy) // max value = (m+1) * max(dx,dy)^m ee /= -_e2m; if (m % 2 == 0) ee *= _e2; // Now ee = (-1)^m * e2^(floor(m/2)+1) / (1-e2)^(m+2) int kmax = (m+1)/2; for (int k = kmax - 1; k >= 0; --k) { // max coeff is less than 2^(m+1) c *= (k + 1) * (2 * (k + m - 2*kmax) + 3); c /= (kmax - k) * (2 * (kmax - k) + 1); // Horner sum for inner _e2 series t = _e2 * t + c; } // Straight sum for outer m series real ds = t * ee * xy / (m + 2); s = s + ds; if (!(fabs(ds) > fabs(s) * eps_/2)) break; // Iterate until the added term is sufficiently small } return s; } void AlbersEqualArea::Forward(real lon0, real lat, real lon, real& x, real& y, real& gamma, real& k) const { lon = Math::AngDiff(lon0, lon); lat *= _sign; real sphi, cphi; Math::sincosd(Math::LatFix(lat) * _sign, sphi, cphi); cphi = fmax(epsx_, cphi); real lam = lon * Math::degree(), tphi = sphi/cphi, txi = txif(tphi), sxi = txi/hyp(txi), dq = _qZ * Dsn(txi, _txi0, sxi, _sxi0) * (txi - _txi0), drho = - _a * dq / (sqrt(_m02 - _n0 * dq) + _nrho0 / _a), theta = _k2 * _n0 * lam, stheta = sin(theta), ctheta = cos(theta), t = _nrho0 + _n0 * drho; x = t * (_n0 != 0 ? stheta / _n0 : _k2 * lam) / _k0; y = (_nrho0 * (_n0 != 0 ? (ctheta < 0 ? 1 - ctheta : Math::sq(stheta)/(1 + ctheta)) / _n0 : 0) - drho * ctheta) / _k0; k = _k0 * (t != 0 ? t * hyp(_fm * tphi) / _a : 1); y *= _sign; gamma = _sign * theta / Math::degree(); } void AlbersEqualArea::Reverse(real lon0, real x, real y, real& lat, real& lon, real& gamma, real& k) const { y *= _sign; real nx = _k0 * _n0 * x, ny = _k0 * _n0 * y, y1 = _nrho0 - ny, den = hypot(nx, y1) + _nrho0, // 0 implies origin with polar aspect drho = den != 0 ? (_k0*x*nx - 2*_k0*y*_nrho0 + _k0*y*ny) / den : 0, // dsxia = scxi0 * dsxi dsxia = - _scxi0 * (2 * _nrho0 + _n0 * drho) * drho / (Math::sq(_a) * _qZ), txi = (_txi0 + dsxia) / sqrt(fmax(1 - dsxia * (2*_txi0 + dsxia), epsx2_)), tphi = tphif(txi), theta = atan2(nx, y1), lam = _n0 != 0 ? theta / (_k2 * _n0) : x / (y1 * _k0); gamma = _sign * theta / Math::degree(); lat = Math::atand(_sign * tphi); lon = lam / Math::degree(); lon = Math::AngNormalize(lon + Math::AngNormalize(lon0)); k = _k0 * (den != 0 ? (_nrho0 + _n0 * drho) * hyp(_fm * tphi) / _a : 1); } void AlbersEqualArea::SetScale(real lat, real k) { if (!(isfinite(k) && k > 0)) throw GeographicErr("Scale is not positive"); if (!(fabs(lat) < Math::qd)) throw GeographicErr("Latitude for SetScale not in (-" + to_string(Math::qd) + "d, " + to_string(Math::qd) + "d)"); real x, y, gamma, kold; Forward(0, lat, 0, x, y, gamma, kold); k /= kold; _k0 *= k; _k2 = Math::sq(_k0); } } // namespace GeographicLib geosphere/src/LambertConformalConic.cpp0000644000176200001440000004566714323376012017754 0ustar liggesusers/** * \file LambertConformalConic.cpp * \brief Implementation for GeographicLib::LambertConformalConic class * * Copyright (c) Charles Karney (2010-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #include "LambertConformalConic.h" #if defined(_MSC_VER) // Squelch warnings about enum-float expressions # pragma warning (disable: 5055) #endif namespace GeographicLib { using namespace std; LambertConformalConic::LambertConformalConic(real a, real f, real stdlat, real k0) : eps_(numeric_limits::epsilon()) , epsx_(Math::sq(eps_)) , ahypover_(Math::digits() * log(real(numeric_limits::radix)) + 2) , _a(a) , _f(f) , _fm(1 - _f) , _e2(_f * (2 - _f)) , _es((_f < 0 ? -1 : 1) * sqrt(fabs(_e2))) { if (!(isfinite(_a) && _a > 0)) throw GeographicErr("Equatorial radius is not positive"); if (!(isfinite(_f) && _f < 1)) throw GeographicErr("Polar semi-axis is not positive"); if (!(isfinite(k0) && k0 > 0)) throw GeographicErr("Scale is not positive"); if (!(fabs(stdlat) <= Math::qd)) throw GeographicErr("Standard latitude not in [-" + to_string(Math::qd) + "d, " + to_string(Math::qd) + "d]"); real sphi, cphi; Math::sincosd(stdlat, sphi, cphi); Init(sphi, cphi, sphi, cphi, k0); } LambertConformalConic::LambertConformalConic(real a, real f, real stdlat1, real stdlat2, real k1) : eps_(numeric_limits::epsilon()) , epsx_(Math::sq(eps_)) , ahypover_(Math::digits() * log(real(numeric_limits::radix)) + 2) , _a(a) , _f(f) , _fm(1 - _f) , _e2(_f * (2 - _f)) , _es((_f < 0 ? -1 : 1) * sqrt(fabs(_e2))) { if (!(isfinite(_a) && _a > 0)) throw GeographicErr("Equatorial radius is not positive"); if (!(isfinite(_f) && _f < 1)) throw GeographicErr("Polar semi-axis is not positive"); if (!(isfinite(k1) && k1 > 0)) throw GeographicErr("Scale is not positive"); if (!(fabs(stdlat1) <= Math::qd)) throw GeographicErr("Standard latitude 1 not in [-" + to_string(Math::qd) + "d, " + to_string(Math::qd) + "d]"); if (!(fabs(stdlat2) <= Math::qd)) throw GeographicErr("Standard latitude 2 not in [-" + to_string(Math::qd) + "d, " + to_string(Math::qd) + "d]"); real sphi1, cphi1, sphi2, cphi2; Math::sincosd(stdlat1, sphi1, cphi1); Math::sincosd(stdlat2, sphi2, cphi2); Init(sphi1, cphi1, sphi2, cphi2, k1); } LambertConformalConic::LambertConformalConic(real a, real f, real sinlat1, real coslat1, real sinlat2, real coslat2, real k1) : eps_(numeric_limits::epsilon()) , epsx_(Math::sq(eps_)) , ahypover_(Math::digits() * log(real(numeric_limits::radix)) + 2) , _a(a) , _f(f) , _fm(1 - _f) , _e2(_f * (2 - _f)) , _es((_f < 0 ? -1 : 1) * sqrt(fabs(_e2))) { if (!(isfinite(_a) && _a > 0)) throw GeographicErr("Equatorial radius is not positive"); if (!(isfinite(_f) && _f < 1)) throw GeographicErr("Polar semi-axis is not positive"); if (!(isfinite(k1) && k1 > 0)) throw GeographicErr("Scale is not positive"); if (signbit(coslat1)) throw GeographicErr("Standard latitude 1 not in [-" + to_string(Math::qd) + "d, " + to_string(Math::qd) + "d]"); if (signbit(coslat2)) throw GeographicErr("Standard latitude 2 not in [-" + to_string(Math::qd) + "d, " + to_string(Math::qd) + "d]"); if (!(fabs(sinlat1) <= 1 && coslat1 <= 1) || (coslat1 == 0 && sinlat1 == 0)) throw GeographicErr("Bad sine/cosine of standard latitude 1"); if (!(fabs(sinlat2) <= 1 && coslat2 <= 1) || (coslat2 == 0 && sinlat2 == 0)) throw GeographicErr("Bad sine/cosine of standard latitude 2"); if (coslat1 == 0 || coslat2 == 0) if (!(coslat1 == coslat2 && sinlat1 == sinlat2)) throw GeographicErr ("Standard latitudes must be equal is either is a pole"); Init(sinlat1, coslat1, sinlat2, coslat2, k1); } void LambertConformalConic::Init(real sphi1, real cphi1, real sphi2, real cphi2, real k1) { { real r; r = hypot(sphi1, cphi1); sphi1 /= r; cphi1 /= r; r = hypot(sphi2, cphi2); sphi2 /= r; cphi2 /= r; } bool polar = (cphi1 == 0); cphi1 = fmax(epsx_, cphi1); // Avoid singularities at poles cphi2 = fmax(epsx_, cphi2); // Determine hemisphere of tangent latitude _sign = sphi1 + sphi2 >= 0 ? 1 : -1; // Internally work with tangent latitude positive sphi1 *= _sign; sphi2 *= _sign; if (sphi1 > sphi2) { swap(sphi1, sphi2); swap(cphi1, cphi2); // Make phi1 < phi2 } real tphi1 = sphi1/cphi1, tphi2 = sphi2/cphi2, tphi0; // // Snyder: 15-8: n = (log(m1) - log(m2))/(log(t1)-log(t2)) // // m = cos(bet) = 1/sec(bet) = 1/sqrt(1+tan(bet)^2) // bet = parametric lat, tan(bet) = (1-f)*tan(phi) // // t = tan(pi/4-chi/2) = 1/(sec(chi) + tan(chi)) = sec(chi) - tan(chi) // log(t) = -asinh(tan(chi)) = -psi // chi = conformal lat // tan(chi) = tan(phi)*cosh(xi) - sinh(xi)*sec(phi) // xi = eatanhe(sin(phi)), eatanhe(x) = e * atanh(e*x) // // n = (log(sec(bet2))-log(sec(bet1)))/(asinh(tan(chi2))-asinh(tan(chi1))) // // Let log(sec(bet)) = b(tphi), asinh(tan(chi)) = c(tphi) // Then n = Db(tphi2, tphi1)/Dc(tphi2, tphi1) // In limit tphi2 -> tphi1, n -> sphi1 // real tbet1 = _fm * tphi1, scbet1 = hyp(tbet1), tbet2 = _fm * tphi2, scbet2 = hyp(tbet2); real scphi1 = 1/cphi1, xi1 = Math::eatanhe(sphi1, _es), shxi1 = sinh(xi1), chxi1 = hyp(shxi1), tchi1 = chxi1 * tphi1 - shxi1 * scphi1, scchi1 = hyp(tchi1), scphi2 = 1/cphi2, xi2 = Math::eatanhe(sphi2, _es), shxi2 = sinh(xi2), chxi2 = hyp(shxi2), tchi2 = chxi2 * tphi2 - shxi2 * scphi2, scchi2 = hyp(tchi2), psi1 = asinh(tchi1); if (tphi2 - tphi1 != 0) { // Db(tphi2, tphi1) real num = Dlog1p(Math::sq(tbet2)/(1 + scbet2), Math::sq(tbet1)/(1 + scbet1)) * Dhyp(tbet2, tbet1, scbet2, scbet1) * _fm; // Dc(tphi2, tphi1) real den = Dasinh(tphi2, tphi1, scphi2, scphi1) - Deatanhe(sphi2, sphi1) * Dsn(tphi2, tphi1, sphi2, sphi1); _n = num/den; if (_n < 1/real(4)) _nc = sqrt((1 - _n) * (1 + _n)); else { // Compute nc = cos(phi0) = sqrt((1 - n) * (1 + n)), evaluating 1 - n // carefully. First write // // Dc(tphi2, tphi1) * (tphi2 - tphi1) // = log(tchi2 + scchi2) - log(tchi1 + scchi1) // // then den * (1 - n) = // (log((tchi2 + scchi2)/(2*scbet2)) - // log((tchi1 + scchi1)/(2*scbet1))) / (tphi2 - tphi1) // = Dlog1p(a2, a1) * (tchi2+scchi2 + tchi1+scchi1)/(4*scbet1*scbet2) // * fm * Q // // where // a1 = ( (tchi1 - scbet1) + (scchi1 - scbet1) ) / (2 * scbet1) // Q = ((scbet2 + scbet1)/fm)/((scchi2 + scchi1)/D(tchi2, tchi1)) // - (tbet2 + tbet1)/(scbet2 + scbet1) real t; { real // s1 = (scbet1 - scchi1) * (scbet1 + scchi1) s1 = (tphi1 * (2 * shxi1 * chxi1 * scphi1 - _e2 * tphi1) - Math::sq(shxi1) * (1 + 2 * Math::sq(tphi1))), s2 = (tphi2 * (2 * shxi2 * chxi2 * scphi2 - _e2 * tphi2) - Math::sq(shxi2) * (1 + 2 * Math::sq(tphi2))), // t1 = scbet1 - tchi1 t1 = tchi1 < 0 ? scbet1 - tchi1 : (s1 + 1)/(scbet1 + tchi1), t2 = tchi2 < 0 ? scbet2 - tchi2 : (s2 + 1)/(scbet2 + tchi2), a2 = -(s2 / (scbet2 + scchi2) + t2) / (2 * scbet2), a1 = -(s1 / (scbet1 + scchi1) + t1) / (2 * scbet1); t = Dlog1p(a2, a1) / den; } // multiply by (tchi2 + scchi2 + tchi1 + scchi1)/(4*scbet1*scbet2) * fm t *= ( ( (tchi2 >= 0 ? scchi2 + tchi2 : 1/(scchi2 - tchi2)) + (tchi1 >= 0 ? scchi1 + tchi1 : 1/(scchi1 - tchi1)) ) / (4 * scbet1 * scbet2) ) * _fm; // Rewrite // Q = (1 - (tbet2 + tbet1)/(scbet2 + scbet1)) - // (1 - ((scbet2 + scbet1)/fm)/((scchi2 + scchi1)/D(tchi2, tchi1))) // = tbm - tam // where real tbm = ( ((tbet1 > 0 ? 1/(scbet1+tbet1) : scbet1 - tbet1) + (tbet2 > 0 ? 1/(scbet2+tbet2) : scbet2 - tbet2)) / (scbet1+scbet2) ); // tam = (1 - ((scbet2+scbet1)/fm)/((scchi2+scchi1)/D(tchi2, tchi1))) // // Let // (scbet2 + scbet1)/fm = scphi2 + scphi1 + dbet // (scchi2 + scchi1)/D(tchi2, tchi1) = scphi2 + scphi1 + dchi // then // tam = D(tchi2, tchi1) * (dchi - dbet) / (scchi1 + scchi2) real // D(tchi2, tchi1) dtchi = den / Dasinh(tchi2, tchi1, scchi2, scchi1), // (scbet2 + scbet1)/fm - (scphi2 + scphi1) dbet = (_e2/_fm) * ( 1 / (scbet2 + _fm * scphi2) + 1 / (scbet1 + _fm * scphi1) ); // dchi = (scchi2 + scchi1)/D(tchi2, tchi1) - (scphi2 + scphi1) // Let // tzet = chxiZ * tphi - shxiZ * scphi // tchi = tzet + nu // scchi = sczet + mu // where // xiZ = eatanhe(1), shxiZ = sinh(xiZ), chxiZ = cosh(xiZ) // nu = scphi * (shxiZ - shxi) - tphi * (chxiZ - chxi) // mu = - scphi * (chxiZ - chxi) + tphi * (shxiZ - shxi) // then // dchi = ((mu2 + mu1) - D(nu2, nu1) * (scphi2 + scphi1)) / // D(tchi2, tchi1) real xiZ = Math::eatanhe(real(1), _es), shxiZ = sinh(xiZ), chxiZ = hyp(shxiZ), // These are differences not divided differences // dxiZ1 = xiZ - xi1; dshxiZ1 = shxiZ - shxi; dchxiZ1 = chxiZ - chxi dxiZ1 = Deatanhe(real(1), sphi1)/(scphi1*(tphi1+scphi1)), dxiZ2 = Deatanhe(real(1), sphi2)/(scphi2*(tphi2+scphi2)), dshxiZ1 = Dsinh(xiZ, xi1, shxiZ, shxi1, chxiZ, chxi1) * dxiZ1, dshxiZ2 = Dsinh(xiZ, xi2, shxiZ, shxi2, chxiZ, chxi2) * dxiZ2, dchxiZ1 = Dhyp(shxiZ, shxi1, chxiZ, chxi1) * dshxiZ1, dchxiZ2 = Dhyp(shxiZ, shxi2, chxiZ, chxi2) * dshxiZ2, // mu1 + mu2 amu12 = (- scphi1 * dchxiZ1 + tphi1 * dshxiZ1 - scphi2 * dchxiZ2 + tphi2 * dshxiZ2), // D(xi2, xi1) dxi = Deatanhe(sphi1, sphi2) * Dsn(tphi2, tphi1, sphi2, sphi1), // D(nu2, nu1) dnu12 = ( (_f * 4 * scphi2 * dshxiZ2 > _f * scphi1 * dshxiZ1 ? // Use divided differences (dshxiZ1 + dshxiZ2)/2 * Dhyp(tphi1, tphi2, scphi1, scphi2) - ( (scphi1 + scphi2)/2 * Dsinh(xi1, xi2, shxi1, shxi2, chxi1, chxi2) * dxi ) : // Use ratio of differences (scphi2 * dshxiZ2 - scphi1 * dshxiZ1)/(tphi2 - tphi1)) + ( (tphi1 + tphi2)/2 * Dhyp(shxi1, shxi2, chxi1, chxi2) * Dsinh(xi1, xi2, shxi1, shxi2, chxi1, chxi2) * dxi ) - (dchxiZ1 + dchxiZ2)/2 ), // dtchi * dchi dchia = (amu12 - dnu12 * (scphi2 + scphi1)), tam = (dchia - dtchi * dbet) / (scchi1 + scchi2); t *= tbm - tam; _nc = sqrt(fmax(real(0), t) * (1 + _n)); } { real r = hypot(_n, _nc); _n /= r; _nc /= r; } tphi0 = _n / _nc; } else { tphi0 = tphi1; _nc = 1/hyp(tphi0); _n = tphi0 * _nc; if (polar) _nc = 0; } _scbet0 = hyp(_fm * tphi0); real shxi0 = sinh(Math::eatanhe(_n, _es)); _tchi0 = tphi0 * hyp(shxi0) - shxi0 * hyp(tphi0); _scchi0 = hyp(_tchi0); _psi0 = asinh(_tchi0); _lat0 = atan(_sign * tphi0) / Math::degree(); _t0nm1 = expm1(- _n * _psi0); // Snyder's t0^n - 1 // a * k1 * m1/t1^n = a * k1 * m2/t2^n = a * k1 * n * (Snyder's F) // = a * k1 / (scbet1 * exp(-n * psi1)) _scale = _a * k1 / scbet1 * // exp(n * psi1) = exp(- (1 - n) * psi1) * exp(psi1) // with (1-n) = nc^2/(1+n) and exp(-psi1) = scchi1 + tchi1 exp( - (Math::sq(_nc)/(1 + _n)) * psi1 ) * (tchi1 >= 0 ? scchi1 + tchi1 : 1 / (scchi1 - tchi1)); // Scale at phi0 = k0 = k1 * (scbet0*exp(-n*psi0))/(scbet1*exp(-n*psi1)) // = k1 * scbet0/scbet1 * exp(n * (psi1 - psi0)) // psi1 - psi0 = Dasinh(tchi1, tchi0) * (tchi1 - tchi0) _k0 = k1 * (_scbet0/scbet1) * exp( - (Math::sq(_nc)/(1 + _n)) * Dasinh(tchi1, _tchi0, scchi1, _scchi0) * (tchi1 - _tchi0)) * (tchi1 >= 0 ? scchi1 + tchi1 : 1 / (scchi1 - tchi1)) / (_scchi0 + _tchi0); _nrho0 = polar ? 0 : _a * _k0 / _scbet0; { // Figure _drhomax using code at beginning of Forward with lat = -90 real sphi = -1, cphi = epsx_, tphi = sphi/cphi, scphi = 1/cphi, shxi = sinh(Math::eatanhe(sphi, _es)), tchi = hyp(shxi) * tphi - shxi * scphi, scchi = hyp(tchi), psi = asinh(tchi), dpsi = Dasinh(tchi, _tchi0, scchi, _scchi0) * (tchi - _tchi0); _drhomax = - _scale * (2 * _nc < 1 && dpsi != 0 ? (exp(Math::sq(_nc)/(1 + _n) * psi ) * (tchi > 0 ? 1/(scchi + tchi) : (scchi - tchi)) - (_t0nm1 + 1))/(-_n) : Dexp(-_n * psi, -_n * _psi0) * dpsi); } } const LambertConformalConic& LambertConformalConic::Mercator() { static const LambertConformalConic mercator(Constants::WGS84_a(), Constants::WGS84_f(), real(0), real(1)); return mercator; } void LambertConformalConic::Forward(real lon0, real lat, real lon, real& x, real& y, real& gamma, real& k) const { lon = Math::AngDiff(lon0, lon); // From Snyder, we have // // theta = n * lambda // x = rho * sin(theta) // = (nrho0 + n * drho) * sin(theta)/n // y = rho0 - rho * cos(theta) // = nrho0 * (1-cos(theta))/n - drho * cos(theta) // // where nrho0 = n * rho0, drho = rho - rho0 // and drho is evaluated with divided differences real sphi, cphi; Math::sincosd(Math::LatFix(lat) * _sign, sphi, cphi); cphi = fmax(epsx_, cphi); real lam = lon * Math::degree(), tphi = sphi/cphi, scbet = hyp(_fm * tphi), scphi = 1/cphi, shxi = sinh(Math::eatanhe(sphi, _es)), tchi = hyp(shxi) * tphi - shxi * scphi, scchi = hyp(tchi), psi = asinh(tchi), theta = _n * lam, stheta = sin(theta), ctheta = cos(theta), dpsi = Dasinh(tchi, _tchi0, scchi, _scchi0) * (tchi - _tchi0), drho = - _scale * (2 * _nc < 1 && dpsi != 0 ? (exp(Math::sq(_nc)/(1 + _n) * psi ) * (tchi > 0 ? 1/(scchi + tchi) : (scchi - tchi)) - (_t0nm1 + 1))/(-_n) : Dexp(-_n * psi, -_n * _psi0) * dpsi); x = (_nrho0 + _n * drho) * (_n != 0 ? stheta / _n : lam); y = _nrho0 * (_n != 0 ? (ctheta < 0 ? 1 - ctheta : Math::sq(stheta)/(1 + ctheta)) / _n : 0) - drho * ctheta; k = _k0 * (scbet/_scbet0) / (exp( - (Math::sq(_nc)/(1 + _n)) * dpsi ) * (tchi >= 0 ? scchi + tchi : 1 / (scchi - tchi)) / (_scchi0 + _tchi0)); y *= _sign; gamma = _sign * theta / Math::degree(); } void LambertConformalConic::Reverse(real lon0, real x, real y, real& lat, real& lon, real& gamma, real& k) const { // From Snyder, we have // // x = rho * sin(theta) // rho0 - y = rho * cos(theta) // // rho = hypot(x, rho0 - y) // drho = (n*x^2 - 2*y*nrho0 + n*y^2)/(hypot(n*x, nrho0-n*y) + nrho0) // theta = atan2(n*x, nrho0-n*y) // // From drho, obtain t^n-1 // psi = -log(t), so // dpsi = - Dlog1p(t^n-1, t0^n-1) * drho / scale y *= _sign; real // Guard against 0 * inf in computation of ny nx = _n * x, ny = _n != 0 ? _n * y : 0, y1 = _nrho0 - ny, den = hypot(nx, y1) + _nrho0, // 0 implies origin with polar aspect // isfinite test is to avoid inf/inf drho = ((den != 0 && isfinite(den)) ? (x*nx + y * (ny - 2*_nrho0)) / den : den); drho = fmin(drho, _drhomax); if (_n == 0) drho = fmax(drho, -_drhomax); real tnm1 = _t0nm1 + _n * drho/_scale, dpsi = (den == 0 ? 0 : (tnm1 + 1 != 0 ? - Dlog1p(tnm1, _t0nm1) * drho / _scale : ahypover_)); real tchi; if (2 * _n <= 1) { // tchi = sinh(psi) real psi = _psi0 + dpsi, tchia = sinh(psi), scchi = hyp(tchia), dtchi = Dsinh(psi, _psi0, tchia, _tchi0, scchi, _scchi0) * dpsi; tchi = _tchi0 + dtchi; // Update tchi using divided difference } else { // tchi = sinh(-1/n * log(tn)) // = sinh((1-1/n) * log(tn) - log(tn)) // = + sinh((1-1/n) * log(tn)) * cosh(log(tn)) // - cosh((1-1/n) * log(tn)) * sinh(log(tn)) // (1-1/n) = - nc^2/(n*(1+n)) // cosh(log(tn)) = (tn + 1/tn)/2; sinh(log(tn)) = (tn - 1/tn)/2 real tn = tnm1 + 1 == 0 ? epsx_ : tnm1 + 1, sh = sinh( -Math::sq(_nc)/(_n * (1 + _n)) * (2 * tn > 1 ? log1p(tnm1) : log(tn)) ); tchi = sh * (tn + 1/tn)/2 - hyp(sh) * (tnm1 * (tn + 1)/tn)/2; } // log(t) = -asinh(tan(chi)) = -psi gamma = atan2(nx, y1); real tphi = Math::tauf(tchi, _es), scbet = hyp(_fm * tphi), scchi = hyp(tchi), lam = _n != 0 ? gamma / _n : x / y1; lat = Math::atand(_sign * tphi); lon = lam / Math::degree(); lon = Math::AngNormalize(lon + Math::AngNormalize(lon0)); k = _k0 * (scbet/_scbet0) / (exp(_nc != 0 ? - (Math::sq(_nc)/(1 + _n)) * dpsi : 0) * (tchi >= 0 ? scchi + tchi : 1 / (scchi - tchi)) / (_scchi0 + _tchi0)); gamma /= _sign * Math::degree(); } void LambertConformalConic::SetScale(real lat, real k) { if (!(isfinite(k) && k > 0)) throw GeographicErr("Scale is not positive"); if (!(fabs(lat) <= Math::qd)) throw GeographicErr("Latitude for SetScale not in [-" + to_string(Math::qd) + "d, " + to_string(Math::qd) + "d]"); if (fabs(lat) == Math::qd && !(_nc == 0 && lat * _n > 0)) throw GeographicErr("Incompatible polar latitude in SetScale"); real x, y, gamma, kold; Forward(0, lat, 0, x, y, gamma, kold); k /= kold; _scale *= k; _k0 *= k; } } // namespace GeographicLib geosphere/src/MagneticModel.h0000644000176200001440000004373314323400205015706 0ustar liggesusers/** * \file MagneticModel.hpp * \brief Header for GeographicLib::MagneticModel class * * Copyright (c) Charles Karney (2011-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #if !defined(GEOGRAPHICLIB_MAGNETICMODEL_HPP) #define GEOGRAPHICLIB_MAGNETICMODEL_HPP 1 #include "Constants.h" #include "Geocentric.h" #include "SphericalHarmonic.h" #if defined(_MSC_VER) // Squelch warnings about dll vs vector # pragma warning (push) # pragma warning (disable: 4251) #endif namespace GeographicLib { class MagneticCircle; /** * \brief Model of the earth's magnetic field * * Evaluate the earth's magnetic field according to a model. At present only * internal magnetic fields are handled. These are due to the earth's code * and crust; these vary slowly (over many years). Excluded are the effects * of currents in the ionosphere and magnetosphere which have daily and * annual variations. * * See \ref magnetic for details of how to install the magnetic models and * the data format. * * See * - General information: * - http://geomag.org/models/index.html * - WMM2010: * - https://ngdc.noaa.gov/geomag/WMM/DoDWMM.shtml * - https://ngdc.noaa.gov/geomag/WMM/data/WMM2010/WMM2010COF.zip * - WMM2015 (deprecated): * - https://ngdc.noaa.gov/geomag/WMM/DoDWMM.shtml * - https://ngdc.noaa.gov/geomag/WMM/data/WMM2015/WMM2015COF.zip * - WMM2015V2: * - https://ngdc.noaa.gov/geomag/WMM/DoDWMM.shtml * - https://ngdc.noaa.gov/geomag/WMM/data/WMM2015/WMM2015v2COF.zip * - WMM2020: * - https://ngdc.noaa.gov/geomag/WMM/DoDWMM.shtml * - https://ngdc.noaa.gov/geomag/WMM/data/WMM2020/WMM2020COF.zip * - IGRF11: * - https://ngdc.noaa.gov/IAGA/vmod/igrf.html * - https://ngdc.noaa.gov/IAGA/vmod/igrf11coeffs.txt * - https://ngdc.noaa.gov/IAGA/vmod/geomag70_linux.tar.gz * - EMM2010: * - https://ngdc.noaa.gov/geomag/EMM/index.html * - https://ngdc.noaa.gov/geomag/EMM/data/geomag/EMM2010_Sph_Windows_Linux.zip * - EMM2015: * - https://ngdc.noaa.gov/geomag/EMM/index.html * - https://www.ngdc.noaa.gov/geomag/EMM/data/geomag/EMM2015_Sph_Linux.zip * - EMM2017: * - https://ngdc.noaa.gov/geomag/EMM/index.html * - https://www.ngdc.noaa.gov/geomag/EMM/data/geomag/EMM2017_Sph_Linux.zip * * Example of use: * \include example-MagneticModel.cpp * * MagneticField is a command-line utility * providing access to the functionality of MagneticModel and MagneticCircle. **********************************************************************/ class GEOGRAPHICLIB_EXPORT MagneticModel { private: typedef Math::real real; static const int idlength_ = 8; std::string _name, _dir, _description, _date, _filename, _id; real _t0, _dt0, _tmin, _tmax, _a, _hmin, _hmax; int _nNmodels, _nNconstants, _nmx, _mmx; SphericalHarmonic::normalization _norm; Geocentric _earth; std::vector< std::vector > _gG; std::vector< std::vector > _hH; std::vector _harm; void Field(real t, real lat, real lon, real h, bool diffp, real& Bx, real& By, real& Bz, real& Bxt, real& Byt, real& Bzt) const; void ReadMetadata(const std::string& name); // copy constructor not allowed MagneticModel(const MagneticModel&) = delete; // nor copy assignment MagneticModel& operator=(const MagneticModel&) = delete; public: /** \name Setting up the magnetic model **********************************************************************/ ///@{ /** * Construct a magnetic model. * * @param[in] name the name of the model. * @param[in] path (optional) directory for data file. * @param[in] earth (optional) Geocentric object for converting * coordinates; default Geocentric::WGS84(). * @param[in] Nmax (optional) if non-negative, truncate the degree of the * model this value. * @param[in] Mmax (optional) if non-negative, truncate the order of the * model this value. * @exception GeographicErr if the data file cannot be found, is * unreadable, or is corrupt, or if \e Mmax > \e Nmax. * @exception std::bad_alloc if the memory necessary for storing the model * can't be allocated. * * A filename is formed by appending ".wmm" (World Magnetic Model) to the * name. If \e path is specified (and is non-empty), then the file is * loaded from directory, \e path. Otherwise the path is given by the * DefaultMagneticPath(). * * This file contains the metadata which specifies the properties of the * model. The coefficients for the spherical harmonic sums are obtained * from a file obtained by appending ".cof" to metadata file (so the * filename ends in ".wwm.cof"). * * The model is not tied to a particular ellipsoidal model of the earth. * The final earth argument to the constructor specifies an ellipsoid to * allow geodetic coordinates to the transformed into the spherical * coordinates used in the spherical harmonic sum. * * If \e Nmax ≥ 0 and \e Mmax < 0, then \e Mmax is set to \e Nmax. * After the model is loaded, the maximum degree and order of the model can * be found by the Degree() and Order() methods. **********************************************************************/ explicit MagneticModel(const std::string& name, const std::string& path = "", const Geocentric& earth = Geocentric::WGS84(), int Nmax = -1, int Mmax = -1); ///@} /** \name Compute the magnetic field **********************************************************************/ ///@{ /** * Evaluate the components of the geomagnetic field. * * @param[in] t the time (fractional years). * @param[in] lat latitude of the point (degrees). * @param[in] lon longitude of the point (degrees). * @param[in] h the height of the point above the ellipsoid (meters). * @param[out] Bx the easterly component of the magnetic field (nanotesla). * @param[out] By the northerly component of the magnetic field * (nanotesla). * @param[out] Bz the vertical (up) component of the magnetic field * (nanotesla). * * Use Utility::fractionalyear to convert a date of the form yyyy-mm or * yyyy-mm-dd into a fractional year. **********************************************************************/ void operator()(real t, real lat, real lon, real h, real& Bx, real& By, real& Bz) const { real dummy; Field(t, lat, lon, h, false, Bx, By, Bz, dummy, dummy, dummy); } /** * Evaluate the components of the geomagnetic field and their time * derivatives * * @param[in] t the time (fractional years). * @param[in] lat latitude of the point (degrees). * @param[in] lon longitude of the point (degrees). * @param[in] h the height of the point above the ellipsoid (meters). * @param[out] Bx the easterly component of the magnetic field (nanotesla). * @param[out] By the northerly component of the magnetic field * (nanotesla). * @param[out] Bz the vertical (up) component of the magnetic field * (nanotesla). * @param[out] Bxt the rate of change of \e Bx (nT/yr). * @param[out] Byt the rate of change of \e By (nT/yr). * @param[out] Bzt the rate of change of \e Bz (nT/yr). * * Use Utility::fractionalyear to convert a date of the form yyyy-mm or * yyyy-mm-dd into a fractional year. **********************************************************************/ void operator()(real t, real lat, real lon, real h, real& Bx, real& By, real& Bz, real& Bxt, real& Byt, real& Bzt) const { Field(t, lat, lon, h, true, Bx, By, Bz, Bxt, Byt, Bzt); } /** * Create a MagneticCircle object to allow the geomagnetic field at many * points with constant \e lat, \e h, and \e t and varying \e lon to be * computed efficiently. * * @param[in] t the time (fractional years). * @param[in] lat latitude of the point (degrees). * @param[in] h the height of the point above the ellipsoid (meters). * @exception std::bad_alloc if the memory necessary for creating a * MagneticCircle can't be allocated. * @return a MagneticCircle object whose MagneticCircle::operator()(real * lon) member function computes the field at particular values of \e * lon. * * If the field at several points on a circle of latitude need to be * calculated then creating a MagneticCircle and using its member functions * will be substantially faster, especially for high-degree models. * * Use Utility::fractionalyear to convert a date of the form yyyy-mm or * yyyy-mm-dd into a fractional year. **********************************************************************/ MagneticCircle Circle(real t, real lat, real h) const; /** * Compute the magnetic field in geocentric coordinate. * * @param[in] t the time (fractional years). * @param[in] X geocentric coordinate (meters). * @param[in] Y geocentric coordinate (meters). * @param[in] Z geocentric coordinate (meters). * @param[out] BX the \e X component of the magnetic field (nT). * @param[out] BY the \e Y component of the magnetic field (nT). * @param[out] BZ the \e Z component of the magnetic field (nT). * @param[out] BXt the rate of change of \e BX (nT/yr). * @param[out] BYt the rate of change of \e BY (nT/yr). * @param[out] BZt the rate of change of \e BZ (nT/yr). * * Use Utility::fractionalyear to convert a date of the form yyyy-mm or * yyyy-mm-dd into a fractional year. **********************************************************************/ void FieldGeocentric(real t, real X, real Y, real Z, real& BX, real& BY, real& BZ, real& BXt, real& BYt, real& BZt) const; /** * Compute various quantities dependent on the magnetic field. * * @param[in] Bx the \e x (easterly) component of the magnetic field (nT). * @param[in] By the \e y (northerly) component of the magnetic field (nT). * @param[in] Bz the \e z (vertical, up positive) component of the magnetic * field (nT). * @param[out] H the horizontal magnetic field (nT). * @param[out] F the total magnetic field (nT). * @param[out] D the declination of the field (degrees east of north). * @param[out] I the inclination of the field (degrees down from * horizontal). **********************************************************************/ static void FieldComponents(real Bx, real By, real Bz, real& H, real& F, real& D, real& I) { real Ht, Ft, Dt, It; FieldComponents(Bx, By, Bz, real(0), real(1), real(0), H, F, D, I, Ht, Ft, Dt, It); } /** * Compute various quantities dependent on the magnetic field and its rate * of change. * * @param[in] Bx the \e x (easterly) component of the magnetic field (nT). * @param[in] By the \e y (northerly) component of the magnetic field (nT). * @param[in] Bz the \e z (vertical, up positive) component of the magnetic * field (nT). * @param[in] Bxt the rate of change of \e Bx (nT/yr). * @param[in] Byt the rate of change of \e By (nT/yr). * @param[in] Bzt the rate of change of \e Bz (nT/yr). * @param[out] H the horizontal magnetic field (nT). * @param[out] F the total magnetic field (nT). * @param[out] D the declination of the field (degrees east of north). * @param[out] I the inclination of the field (degrees down from * horizontal). * @param[out] Ht the rate of change of \e H (nT/yr). * @param[out] Ft the rate of change of \e F (nT/yr). * @param[out] Dt the rate of change of \e D (degrees/yr). * @param[out] It the rate of change of \e I (degrees/yr). **********************************************************************/ static void FieldComponents(real Bx, real By, real Bz, real Bxt, real Byt, real Bzt, real& H, real& F, real& D, real& I, real& Ht, real& Ft, real& Dt, real& It); ///@} /** \name Inspector functions **********************************************************************/ ///@{ /** * @return the description of the magnetic model, if available, from the * Description file in the data file; if absent, return "NONE". **********************************************************************/ const std::string& Description() const { return _description; } /** * @return date of the model, if available, from the ReleaseDate field in * the data file; if absent, return "UNKNOWN". **********************************************************************/ const std::string& DateTime() const { return _date; } /** * @return full file name used to load the magnetic model. **********************************************************************/ const std::string& MagneticFile() const { return _filename; } /** * @return "name" used to load the magnetic model (from the first argument * of the constructor, but this may be overridden by the model file). **********************************************************************/ const std::string& MagneticModelName() const { return _name; } /** * @return directory used to load the magnetic model. **********************************************************************/ const std::string& MagneticModelDirectory() const { return _dir; } /** * @return the minimum height above the ellipsoid (in meters) for which * this MagneticModel should be used. * * Because the model will typically provide useful results * slightly outside the range of allowed heights, no check of \e t * argument is made by MagneticModel::operator()() or * MagneticModel::Circle. **********************************************************************/ Math::real MinHeight() const { return _hmin; } /** * @return the maximum height above the ellipsoid (in meters) for which * this MagneticModel should be used. * * Because the model will typically provide useful results * slightly outside the range of allowed heights, no check of \e t * argument is made by MagneticModel::operator()() or * MagneticModel::Circle. **********************************************************************/ Math::real MaxHeight() const { return _hmax; } /** * @return the minimum time (in years) for which this MagneticModel should * be used. * * Because the model will typically provide useful results * slightly outside the range of allowed times, no check of \e t * argument is made by MagneticModel::operator()() or * MagneticModel::Circle. **********************************************************************/ Math::real MinTime() const { return _tmin; } /** * @return the maximum time (in years) for which this MagneticModel should * be used. * * Because the model will typically provide useful results * slightly outside the range of allowed times, no check of \e t * argument is made by MagneticModel::operator()() or * MagneticModel::Circle. **********************************************************************/ Math::real MaxTime() const { return _tmax; } /** * @return \e a the equatorial radius of the ellipsoid (meters). This is * the value of \e a inherited from the Geocentric object used in the * constructor. **********************************************************************/ Math::real EquatorialRadius() const { return _earth.EquatorialRadius(); } /** * @return \e f the flattening of the ellipsoid. This is the value * inherited from the Geocentric object used in the constructor. **********************************************************************/ Math::real Flattening() const { return _earth.Flattening(); } /** * @return \e Nmax the maximum degree of the components of the model. **********************************************************************/ int Degree() const { return _nmx; } /** * @return \e Mmax the maximum order of the components of the model. **********************************************************************/ int Order() const { return _mmx; } ///@} /** * @return the default path for magnetic model data files. * * This is the value of the environment variable * GEOGRAPHICLIB_MAGNETIC_PATH, if set; otherwise, it is * $GEOGRAPHICLIB_DATA/magnetic if the environment variable * GEOGRAPHICLIB_DATA is set; otherwise, it is a compile-time default * (/usr/local/share/GeographicLib/magnetic on non-Windows systems and * C:/ProgramData/GeographicLib/magnetic on Windows systems). **********************************************************************/ static std::string DefaultMagneticPath(); /** * @return the default name for the magnetic model. * * This is the value of the environment variable * GEOGRAPHICLIB_MAGNETIC_NAME, if set; otherwise, it is "wmm2020". The * MagneticModel class does not use this function; it is just provided as a * convenience for a calling program when constructing a MagneticModel * object. **********************************************************************/ static std::string DefaultMagneticName(); }; } // namespace GeographicLib #if defined(_MSC_VER) # pragma warning (pop) #endif #endif // GEOGRAPHICLIB_MAGNETICMODEL_HPP geosphere/src/Accumulator.cpp0000644000176200001440000000113214323375571016014 0ustar liggesusers/** * \file Accumulator.cpp * \brief Implementation for GeographicLib::Accumulator class * * Copyright (c) Charles Karney (2013-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #include "Accumulator.h" namespace GeographicLib { /// \cond SKIP // Need to instantiate Accumulator to get the code into the shared library. template class GEOGRAPHICLIB_EXPORT Accumulator; /// \endcond } // namespace GeographicLib geosphere/src/Math.cpp0000644000176200001440000002625714323376012014434 0ustar liggesusers/** * \file Math.cpp * \brief Implementation for GeographicLib::Math class * * Copyright (c) Charles Karney (2015-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #include "Math.h" #if defined(_MSC_VER) // Squelch warnings about constant conditional and enum-float expressions # pragma warning (disable: 4127 5055) #endif namespace GeographicLib { using namespace std; void Math::dummy() { static_assert(GEOGRAPHICLIB_PRECISION >= 1 && GEOGRAPHICLIB_PRECISION <= 5, "Bad value of precision"); } int Math::digits() { #if GEOGRAPHICLIB_PRECISION != 5 return numeric_limits::digits; #else return numeric_limits::digits(); #endif } int Math::set_digits(int ndigits) { #if GEOGRAPHICLIB_PRECISION != 5 (void)ndigits; #else mpfr::mpreal::set_default_prec(ndigits >= 2 ? ndigits : 2); #endif return digits(); } int Math::digits10() { #if GEOGRAPHICLIB_PRECISION != 5 return numeric_limits::digits10; #else return numeric_limits::digits10(); #endif } int Math::extra_digits() { return digits10() > numeric_limits::digits10 ? digits10() - numeric_limits::digits10 : 0; } template T Math::sum(T u, T v, T& t) { GEOGRAPHICLIB_VOLATILE T s = u + v; GEOGRAPHICLIB_VOLATILE T up = s - v; GEOGRAPHICLIB_VOLATILE T vpp = s - up; up -= u; vpp -= v; // if s = 0, then t = 0 and give t the same sign as s // mpreal needs T(0) here t = s != 0 ? T(0) - (up + vpp) : s; // u + v = s + t // = round(u + v) + t return s; } template T Math::AngNormalize(T x) { T y = remainder(x, T(td)); #if GEOGRAPHICLIB_PRECISION == 4 // boost-quadmath doesn't set the sign of 0 correctly, see // https://github.com/boostorg/multiprecision/issues/426 // Fixed by https://github.com/boostorg/multiprecision/pull/428 if (y == 0) y = copysign(y, x); #endif return fabs(y) == T(hd) ? copysign(T(hd), x) : y; } template T Math::AngDiff(T x, T y, T& e) { // Use remainder instead of AngNormalize, since we treat boundary cases // later taking account of the error T d = sum(remainder(-x, T(td)), remainder( y, T(td)), e); // This second sum can only change d if abs(d) < 128, so don't need to // apply remainder yet again. d = sum(remainder(d, T(td)), e, e); // Fix the sign if d = -180, 0, 180. if (d == 0 || fabs(d) == hd) // If e == 0, take sign from y - x // else (e != 0, implies d = +/-180), d and e must have opposite signs d = copysign(d, e == 0 ? y - x : -e); return d; } template T Math::AngRound(T x) { static const T z = T(1)/T(16); GEOGRAPHICLIB_VOLATILE T y = fabs(x); GEOGRAPHICLIB_VOLATILE T w = z - y; // The compiler mustn't "simplify" z - (z - y) to y y = w > 0 ? z - w : y; return copysign(y, x); } template void Math::sincosd(T x, T& sinx, T& cosx) { // In order to minimize round-off errors, this function exactly reduces // the argument to the range [-45, 45] before converting it to radians. T r; int q = 0; r = remquo(x, T(qd), &q); // now abs(r) <= 45 r *= degree(); // g++ -O turns these two function calls into a call to sincos T s = sin(r), c = cos(r); switch (unsigned(q) & 3U) { case 0U: sinx = s; cosx = c; break; case 1U: sinx = c; cosx = -s; break; case 2U: sinx = -s; cosx = -c; break; default: sinx = -c; cosx = s; break; // case 3U } // http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1950.pdf // mpreal needs T(0) here cosx += T(0); // special values from F.10.1.12 if (sinx == 0) sinx = copysign(sinx, x); // special values from F.10.1.13 } template void Math::sincosde(T x, T t, T& sinx, T& cosx) { // In order to minimize round-off errors, this function exactly reduces // the argument to the range [-45, 45] before converting it to radians. // This implementation allows x outside [-180, 180], but implementations in // other languages may not. T r; int q = 0; r = AngRound(remquo(x, T(qd), &q) + t); // now abs(r) <= 45 r *= degree(); // g++ -O turns these two function calls into a call to sincos T s = sin(r), c = cos(r); switch (unsigned(q) & 3U) { case 0U: sinx = s; cosx = c; break; case 1U: sinx = c; cosx = -s; break; case 2U: sinx = -s; cosx = -c; break; default: sinx = -c; cosx = s; break; // case 3U } // http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1950.pdf // mpreal needs T(0) here cosx += T(0); // special values from F.10.1.12 if (sinx == 0) sinx = copysign(sinx, x); // special values from F.10.1.13 } template T Math::sind(T x) { // See sincosd T r; int q = 0; r = remquo(x, T(qd), &q); // now abs(r) <= 45 r *= degree(); unsigned p = unsigned(q); r = p & 1U ? cos(r) : sin(r); if (p & 2U) r = -r; if (r == 0) r = copysign(r, x); return r; } template T Math::cosd(T x) { // See sincosd T r; int q = 0; r = remquo(x, T(qd), &q); // now abs(r) <= 45 r *= degree(); unsigned p = unsigned(q + 1); r = p & 1U ? cos(r) : sin(r); if (p & 2U) r = -r; // mpreal needs T(0) here return T(0) + r; } template T Math::tand(T x) { static const T overflow = 1 / sq(numeric_limits::epsilon()); T s, c; sincosd(x, s, c); // http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1950.pdf T r = s / c; // special values from F.10.1.14 // With C++17 this becomes clamp(s / c, -overflow, overflow); // Use max/min here (instead of fmax/fmin) to preserve NaN return min(max(r, -overflow), overflow); } template T Math::atan2d(T y, T x) { // In order to minimize round-off errors, this function rearranges the // arguments so that result of atan2 is in the range [-pi/4, pi/4] before // converting it to degrees and mapping the result to the correct // quadrant. int q = 0; if (fabs(y) > fabs(x)) { swap(x, y); q = 2; } if (signbit(x)) { x = -x; ++q; } // here x >= 0 and x >= abs(y), so angle is in [-pi/4, pi/4] T ang = atan2(y, x) / degree(); switch (q) { case 1: ang = copysign(T(hd), y) - ang; break; case 2: ang = qd - ang; break; case 3: ang = -qd + ang; break; default: break; } return ang; } template T Math::atand(T x) { return atan2d(x, T(1)); } template T Math::eatanhe(T x, T es) { return es > 0 ? es * atanh(es * x) : -es * atan(es * x); } template T Math::taupf(T tau, T es) { // Need this test, otherwise tau = +/-inf gives taup = nan. if (isfinite(tau)) { T tau1 = hypot(T(1), tau), sig = sinh( eatanhe(tau / tau1, es ) ); return hypot(T(1), sig) * tau - sig * tau1; } else return tau; } template T Math::tauf(T taup, T es) { static const int numit = 5; // min iterations = 1, max iterations = 2; mean = 1.95 static const T tol = sqrt(numeric_limits::epsilon()) / 10; static const T taumax = 2 / sqrt(numeric_limits::epsilon()); T e2m = 1 - sq(es), // To lowest order in e^2, taup = (1 - e^2) * tau = _e2m * tau; so use // tau = taup/e2m as a starting guess. Only 1 iteration is needed for // |lat| < 3.35 deg, otherwise 2 iterations are needed. If, instead, tau // = taup is used the mean number of iterations increases to 1.999 (2 // iterations are needed except near tau = 0). // // For large tau, taup = exp(-es*atanh(es)) * tau. Use this as for the // initial guess for |taup| > 70 (approx |phi| > 89deg). Then for // sufficiently large tau (such that sqrt(1+tau^2) = |tau|), we can exit // with the intial guess and avoid overflow problems. This also reduces // the mean number of iterations slightly from 1.963 to 1.954. tau = fabs(taup) > 70 ? taup * exp(eatanhe(T(1), es)) : taup/e2m, stol = tol * fmax(T(1), fabs(taup)); if (!(fabs(tau) < taumax)) return tau; // handles +/-inf and nan for (int i = 0; i < numit || GEOGRAPHICLIB_PANIC; ++i) { T taupa = taupf(tau, es), dtau = (taup - taupa) * (1 + e2m * sq(tau)) / ( e2m * hypot(T(1), tau) * hypot(T(1), taupa) ); tau += dtau; if (!(fabs(dtau) >= stol)) break; } return tau; } template T Math::NaN() { #if defined(_MSC_VER) return numeric_limits::has_quiet_NaN ? numeric_limits::quiet_NaN() : (numeric_limits::max)(); #else return numeric_limits::has_quiet_NaN ? numeric_limits::quiet_NaN() : numeric_limits::max(); #endif } template T Math::infinity() { #if defined(_MSC_VER) return numeric_limits::has_infinity ? numeric_limits::infinity() : (numeric_limits::max)(); #else return numeric_limits::has_infinity ? numeric_limits::infinity() : numeric_limits::max(); #endif } /// \cond SKIP // Instantiate #define GEOGRAPHICLIB_MATH_INSTANTIATE(T) \ template T GEOGRAPHICLIB_EXPORT Math::sum (T, T, T&); \ template T GEOGRAPHICLIB_EXPORT Math::AngNormalize (T); \ template T GEOGRAPHICLIB_EXPORT Math::AngDiff (T, T, T&); \ template T GEOGRAPHICLIB_EXPORT Math::AngRound (T); \ template void GEOGRAPHICLIB_EXPORT Math::sincosd (T, T&, T&); \ template void GEOGRAPHICLIB_EXPORT Math::sincosde (T, T, T&, T&); \ template T GEOGRAPHICLIB_EXPORT Math::sind (T); \ template T GEOGRAPHICLIB_EXPORT Math::cosd (T); \ template T GEOGRAPHICLIB_EXPORT Math::tand (T); \ template T GEOGRAPHICLIB_EXPORT Math::atan2d (T, T); \ template T GEOGRAPHICLIB_EXPORT Math::atand (T); \ template T GEOGRAPHICLIB_EXPORT Math::eatanhe (T, T); \ template T GEOGRAPHICLIB_EXPORT Math::taupf (T, T); \ template T GEOGRAPHICLIB_EXPORT Math::tauf (T, T); \ template T GEOGRAPHICLIB_EXPORT Math::NaN (); \ template T GEOGRAPHICLIB_EXPORT Math::infinity (); // Instantiate with the standard floating type GEOGRAPHICLIB_MATH_INSTANTIATE(float) GEOGRAPHICLIB_MATH_INSTANTIATE(double) #if GEOGRAPHICLIB_HAVE_LONG_DOUBLE // Instantiate if long double is distinct from double GEOGRAPHICLIB_MATH_INSTANTIATE(long double) #endif #if GEOGRAPHICLIB_PRECISION > 3 // Instantiate with the high precision type GEOGRAPHICLIB_MATH_INSTANTIATE(Math::real) #endif #undef GEOGRAPHICLIB_MATH_INSTANTIATE // Also we need int versions for Utility::nummatch template int GEOGRAPHICLIB_EXPORT Math::NaN (); template int GEOGRAPHICLIB_EXPORT Math::infinity(); /// \endcond } // namespace GeographicLib geosphere/src/Geohash.h0000644000176200001440000001455014323377037014567 0ustar liggesusers/** * \file Geohash.hpp * \brief Header for GeographicLib::Geohash class * * Copyright (c) Charles Karney (2012-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #if !defined(GEOGRAPHICLIB_GEOHASH_HPP) #define GEOGRAPHICLIB_GEOHASH_HPP 1 #include "Constants.h" #if defined(_MSC_VER) // Squelch warnings about dll vs string # pragma warning (push) # pragma warning (disable: 4251) #endif namespace GeographicLib { /** * \brief Conversions for geohashes * * Geohashes are described in * - https://en.wikipedia.org/wiki/Geohash * - http://geohash.org/ * . * They provide a compact string representation of a particular geographic * location (expressed as latitude and longitude), with the property that if * trailing characters are dropped from the string the geographic location * remains nearby. The classes Georef and GARS implement similar compact * representations. * * Example of use: * \include example-Geohash.cpp **********************************************************************/ class GEOGRAPHICLIB_EXPORT Geohash { private: typedef Math::real real; static const int maxlen_ = 18; static const unsigned long long mask_ = 1ULL << 45; static const char* const lcdigits_; static const char* const ucdigits_; Geohash() = delete; // Disable constructor public: /** * Convert from geographic coordinates to a geohash. * * @param[in] lat latitude of point (degrees). * @param[in] lon longitude of point (degrees). * @param[in] len the length of the resulting geohash. * @param[out] geohash the geohash. * @exception GeographicErr if \e lat is not in [−90°, * 90°]. * @exception std::bad_alloc if memory for \e geohash can't be allocated. * * Internally, \e len is first put in the range [0, 18]. (\e len = 18 * provides approximately 1μm precision.) * * If \e lat or \e lon is NaN, the returned geohash is "invalid". **********************************************************************/ static void Forward(real lat, real lon, int len, std::string& geohash); /** * Convert from a geohash to geographic coordinates. * * @param[in] geohash the geohash. * @param[out] lat latitude of point (degrees). * @param[out] lon longitude of point (degrees). * @param[out] len the length of the geohash. * @param[in] centerp if true (the default) return the center of the * geohash location, otherwise return the south-west corner. * @exception GeographicErr if \e geohash contains illegal characters. * * Only the first 18 characters for \e geohash are considered. (18 * characters provides approximately 1μm precision.) The case of the * letters in \e geohash is ignored. * * If the first 3 characters of \e geohash are "inv", then \e lat and \e * lon are set to NaN and \e len is unchanged. ("nan" is treated * similarly.) **********************************************************************/ static void Reverse(const std::string& geohash, real& lat, real& lon, int& len, bool centerp = true); /** * The latitude resolution of a geohash. * * @param[in] len the length of the geohash. * @return the latitude resolution (degrees). * * Internally, \e len is first put in the range [0, 18]. **********************************************************************/ static Math::real LatitudeResolution(int len) { using std::ldexp; len = (std::max)(0, (std::min)(int(maxlen_), len)); return ldexp(real(Math::hd), -(5 * len / 2)); } /** * The longitude resolution of a geohash. * * @param[in] len the length of the geohash. * @return the longitude resolution (degrees). * * Internally, \e len is first put in the range [0, 18]. **********************************************************************/ static Math::real LongitudeResolution(int len) { using std::ldexp; len = (std::max)(0, (std::min)(int(maxlen_), len)); return ldexp(real(Math::td), -(5 * len - 5 * len / 2)); } /** * The geohash length required to meet a given geographic resolution. * * @param[in] res the minimum of resolution in latitude and longitude * (degrees). * @return geohash length. * * The returned length is in the range [0, 18]. **********************************************************************/ static int GeohashLength(real res) { using std::fabs; res = fabs(res); for (int len = 0; len < maxlen_; ++len) if (LongitudeResolution(len) <= res) return len; return maxlen_; } /** * The geohash length required to meet a given geographic resolution. * * @param[in] latres the resolution in latitude (degrees). * @param[in] lonres the resolution in longitude (degrees). * @return geohash length. * * The returned length is in the range [0, 18]. **********************************************************************/ static int GeohashLength(real latres, real lonres) { using std::fabs; latres = fabs(latres); lonres = fabs(lonres); for (int len = 0; len < maxlen_; ++len) if (LatitudeResolution(len) <= latres && LongitudeResolution(len) <= lonres) return len; return maxlen_; } /** * The decimal geographic precision required to match a given geohash * length. This is the number of digits needed after decimal point in a * decimal degrees representation. * * @param[in] len the length of the geohash. * @return the decimal precision (may be negative). * * Internally, \e len is first put in the range [0, 18]. The returned * decimal precision is in the range [−2, 12]. **********************************************************************/ static int DecimalPrecision(int len) { using std::floor; using std::log; return -int(floor(log(LatitudeResolution(len))/log(Math::real(10)))); } }; } // namespace GeographicLib #if defined(_MSC_VER) # pragma warning (pop) #endif #endif // GEOGRAPHICLIB_GEOHASH_HPP geosphere/src/Gnomonic.cpp0000644000176200001440000000513414323376011015302 0ustar liggesusers/** * \file Gnomonic.cpp * \brief Implementation for GeographicLib::Gnomonic class * * Copyright (c) Charles Karney (2010-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #include "Gnomonic.h" #if defined(_MSC_VER) // Squelch warnings about potentially uninitialized local variables and // constant conditional expressions # pragma warning (disable: 4701 4127) #endif namespace GeographicLib { using namespace std; Gnomonic::Gnomonic(const Geodesic& earth) : eps0_(numeric_limits::epsilon()) , eps_(real(0.01) * sqrt(eps0_)) , _earth(earth) , _a(_earth.EquatorialRadius()) , _f(_earth.Flattening()) {} void Gnomonic::Forward(real lat0, real lon0, real lat, real lon, real& x, real& y, real& azi, real& rk) const { real azi0, m, M, t; _earth.GenInverse(lat0, lon0, lat, lon, Geodesic::AZIMUTH | Geodesic::REDUCEDLENGTH | Geodesic::GEODESICSCALE, t, azi0, azi, m, M, t, t); rk = M; if (M <= 0) x = y = Math::NaN(); else { real rho = m/M; Math::sincosd(azi0, x, y); x *= rho; y *= rho; } } void Gnomonic::Reverse(real lat0, real lon0, real x, real y, real& lat, real& lon, real& azi, real& rk) const { real azi0 = Math::atan2d(x, y), rho = hypot(x, y), s = _a * atan(rho/_a); bool little = rho <= _a; if (!little) rho = 1/rho; GeodesicLine line(_earth.Line(lat0, lon0, azi0, Geodesic::LATITUDE | Geodesic::LONGITUDE | Geodesic::AZIMUTH | Geodesic::DISTANCE_IN | Geodesic::REDUCEDLENGTH | Geodesic::GEODESICSCALE)); int count = numit_, trip = 0; real lat1, lon1, azi1, M; while (count-- || GEOGRAPHICLIB_PANIC) { real m, t; line.Position(s, lat1, lon1, azi1, m, M, t); if (trip) break; // If little, solve rho(s) = rho with drho(s)/ds = 1/M^2 // else solve 1/rho(s) = 1/rho with d(1/rho(s))/ds = -1/m^2 real ds = little ? (m - rho * M) * M : (rho * m - M) * m; s -= ds; // Reversed test to allow escape with NaNs if (!(fabs(ds) >= eps_ * _a)) ++trip; } if (trip) { lat = lat1; lon = lon1; azi = azi1; rk = M; } else lat = lon = azi = rk = Math::NaN(); return; } } // namespace GeographicLib geosphere/src/GeodesicLine.h0000644000176200001440000007401414323377037015544 0ustar liggesusers/** * \file GeodesicLine.hpp * \brief Header for GeographicLib::GeodesicLine class * * Copyright (c) Charles Karney (2009-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #if !defined(GEOGRAPHICLIB_GEODESICLINE_HPP) #define GEOGRAPHICLIB_GEODESICLINE_HPP 1 #include "Constants.h" #include "Geodesic.h" namespace GeographicLib { /** * \brief A geodesic line * * GeodesicLine facilitates the determination of a series of points on a * single geodesic. The starting point (\e lat1, \e lon1) and the azimuth \e * azi1 are specified in the constructor; alternatively, the Geodesic::Line * method can be used to create a GeodesicLine. GeodesicLine.Position * returns the location of point 2 a distance \e s12 along the geodesic. In * addition, GeodesicLine.ArcPosition gives the position of point 2 an arc * length \e a12 along the geodesic. * * You can register the position of a reference point 3 a distance (arc * length), \e s13 (\e a13) along the geodesic with the * GeodesicLine.SetDistance (GeodesicLine.SetArc) functions. Points a * fractional distance along the line can be found by providing, for example, * 0.5 * Distance() as an argument to GeodesicLine.Position. The * Geodesic::InverseLine or Geodesic::DirectLine methods return GeodesicLine * objects with point 3 set to the point 2 of the corresponding geodesic * problem. GeodesicLine objects created with the public constructor or with * Geodesic::Line have \e s13 and \e a13 set to NaNs. * * The default copy constructor and assignment operators work with this * class. Similarly, a vector can be used to hold GeodesicLine objects. * * The calculations are accurate to better than 15 nm (15 nanometers). See * Sec. 9 of * arXiv:1102.1215v1 for * details. The algorithms used by this class are based on series expansions * using the flattening \e f as a small parameter. These are only accurate * for |f| < 0.02; however reasonably accurate results will be * obtained for |f| < 0.2. For very eccentric ellipsoids, use * GeodesicLineExact instead. * * The algorithms are described in * - C. F. F. Karney, * * Algorithms for geodesics, * J. Geodesy 87, 43--55 (2013); * DOI: * 10.1007/s00190-012-0578-z; * addenda: * * geod-addenda.html. * . * For more information on geodesics see \ref geodesic. * * Example of use: * \include example-GeodesicLine.cpp * * GeodSolve is a command-line utility * providing access to the functionality of Geodesic and GeodesicLine. **********************************************************************/ class GEOGRAPHICLIB_EXPORT GeodesicLine { private: typedef Math::real real; friend class Geodesic; static const int nC1_ = Geodesic::nC1_; static const int nC1p_ = Geodesic::nC1p_; static const int nC2_ = Geodesic::nC2_; static const int nC3_ = Geodesic::nC3_; static const int nC4_ = Geodesic::nC4_; real tiny_; real _lat1, _lon1, _azi1; real _a, _f, _b, _c2, _f1, _salp0, _calp0, _k2, _salp1, _calp1, _ssig1, _csig1, _dn1, _stau1, _ctau1, _somg1, _comg1, _aA1m1, _aA2m1, _aA3c, _bB11, _bB21, _bB31, _aA4, _bB41; real _a13, _s13; // index zero elements of _cC1a, _cC1pa, _cC2a, _cC3a are unused real _cC1a[nC1_ + 1], _cC1pa[nC1p_ + 1], _cC2a[nC2_ + 1], _cC3a[nC3_], _cC4a[nC4_]; // all the elements of _cC4a are used unsigned _caps; void LineInit(const Geodesic& g, real lat1, real lon1, real azi1, real salp1, real calp1, unsigned caps); GeodesicLine(const Geodesic& g, real lat1, real lon1, real azi1, real salp1, real calp1, unsigned caps, bool arcmode, real s13_a13); enum captype { CAP_NONE = Geodesic::CAP_NONE, CAP_C1 = Geodesic::CAP_C1, CAP_C1p = Geodesic::CAP_C1p, CAP_C2 = Geodesic::CAP_C2, CAP_C3 = Geodesic::CAP_C3, CAP_C4 = Geodesic::CAP_C4, CAP_ALL = Geodesic::CAP_ALL, CAP_MASK = Geodesic::CAP_MASK, OUT_ALL = Geodesic::OUT_ALL, OUT_MASK = Geodesic::OUT_MASK, }; public: /** * Bit masks for what calculations to do. They signify to the * GeodesicLine::GeodesicLine constructor and to Geodesic::Line what * capabilities should be included in the GeodesicLine object. This is * merely a duplication of Geodesic::mask. **********************************************************************/ enum mask { /** * No capabilities, no output. * @hideinitializer **********************************************************************/ NONE = Geodesic::NONE, /** * Calculate latitude \e lat2. (It's not necessary to include this as a * capability to GeodesicLine because this is included by default.) * @hideinitializer **********************************************************************/ LATITUDE = Geodesic::LATITUDE, /** * Calculate longitude \e lon2. * @hideinitializer **********************************************************************/ LONGITUDE = Geodesic::LONGITUDE, /** * Calculate azimuths \e azi1 and \e azi2. (It's not necessary to * include this as a capability to GeodesicLine because this is included * by default.) * @hideinitializer **********************************************************************/ AZIMUTH = Geodesic::AZIMUTH, /** * Calculate distance \e s12. * @hideinitializer **********************************************************************/ DISTANCE = Geodesic::DISTANCE, /** * A combination of the common capabilities: GeodesicLine::LATITUDE, * GeodesicLine::LONGITUDE, GeodesicLine::AZIMUTH, GeodesicLine::DISTANCE. * @hideinitializer **********************************************************************/ STANDARD = Geodesic::STANDARD, /** * Allow distance \e s12 to be used as input in the direct geodesic * problem. * @hideinitializer **********************************************************************/ DISTANCE_IN = Geodesic::DISTANCE_IN, /** * Calculate reduced length \e m12. * @hideinitializer **********************************************************************/ REDUCEDLENGTH = Geodesic::REDUCEDLENGTH, /** * Calculate geodesic scales \e M12 and \e M21. * @hideinitializer **********************************************************************/ GEODESICSCALE = Geodesic::GEODESICSCALE, /** * Calculate area \e S12. * @hideinitializer **********************************************************************/ AREA = Geodesic::AREA, /** * Unroll \e lon2 in the direct calculation. * @hideinitializer **********************************************************************/ LONG_UNROLL = Geodesic::LONG_UNROLL, /** * All capabilities, calculate everything. (GeodesicLine::LONG_UNROLL is * not included in this mask.) * @hideinitializer **********************************************************************/ ALL = Geodesic::ALL, }; /** \name Constructors **********************************************************************/ ///@{ /** * Constructor for a geodesic line staring at latitude \e lat1, longitude * \e lon1, and azimuth \e azi1 (all in degrees). * * @param[in] g A Geodesic object used to compute the necessary information * about the GeodesicLine. * @param[in] lat1 latitude of point 1 (degrees). * @param[in] lon1 longitude of point 1 (degrees). * @param[in] azi1 azimuth at point 1 (degrees). * @param[in] caps bitor'ed combination of GeodesicLine::mask values * specifying the capabilities the GeodesicLine object should possess, * i.e., which quantities can be returned in calls to * GeodesicLine::Position. * * \e lat1 should be in the range [−90°, 90°]. * * The GeodesicLine::mask values are * - \e caps |= GeodesicLine::LATITUDE for the latitude \e lat2; this is * added automatically; * - \e caps |= GeodesicLine::LONGITUDE for the latitude \e lon2; * - \e caps |= GeodesicLine::AZIMUTH for the latitude \e azi2; this is * added automatically; * - \e caps |= GeodesicLine::DISTANCE for the distance \e s12; * - \e caps |= GeodesicLine::REDUCEDLENGTH for the reduced length \e m12; * - \e caps |= GeodesicLine::GEODESICSCALE for the geodesic scales \e M12 * and \e M21; * - \e caps |= GeodesicLine::AREA for the area \e S12; * - \e caps |= GeodesicLine::DISTANCE_IN permits the length of the * geodesic to be given in terms of \e s12; without this capability the * length can only be specified in terms of arc length; * - \e caps |= GeodesicLine::ALL for all of the above. * . * The default value of \e caps is GeodesicLine::ALL. * * If the point is at a pole, the azimuth is defined by keeping \e lon1 * fixed, writing \e lat1 = ±(90° − ε), and taking * the limit ε → 0+. **********************************************************************/ GeodesicLine(const Geodesic& g, real lat1, real lon1, real azi1, unsigned caps = ALL); /** * A default constructor. If GeodesicLine::Position is called on the * resulting object, it returns immediately (without doing any * calculations). The object can be set with a call to Geodesic::Line. * Use Init() to test whether object is still in this uninitialized state. **********************************************************************/ GeodesicLine() : _caps(0U) {} ///@} /** \name Position in terms of distance **********************************************************************/ ///@{ /** * Compute the position of point 2 which is a distance \e s12 (meters) from * point 1. * * @param[in] s12 distance from point 1 to point 2 (meters); it can be * negative. * @param[out] lat2 latitude of point 2 (degrees). * @param[out] lon2 longitude of point 2 (degrees); requires that the * GeodesicLine object was constructed with \e caps |= * GeodesicLine::LONGITUDE. * @param[out] azi2 (forward) azimuth at point 2 (degrees). * @param[out] m12 reduced length of geodesic (meters); requires that the * GeodesicLine object was constructed with \e caps |= * GeodesicLine::REDUCEDLENGTH. * @param[out] M12 geodesic scale of point 2 relative to point 1 * (dimensionless); requires that the GeodesicLine object was constructed * with \e caps |= GeodesicLine::GEODESICSCALE. * @param[out] M21 geodesic scale of point 1 relative to point 2 * (dimensionless); requires that the GeodesicLine object was constructed * with \e caps |= GeodesicLine::GEODESICSCALE. * @param[out] S12 area under the geodesic (meters2); requires * that the GeodesicLine object was constructed with \e caps |= * GeodesicLine::AREA. * @return \e a12 arc length from point 1 to point 2 (degrees). * * The values of \e lon2 and \e azi2 returned are in the range * [−180°, 180°]. * * The GeodesicLine object \e must have been constructed with \e caps |= * GeodesicLine::DISTANCE_IN; otherwise Math::NaN() is returned and no * parameters are set. Requesting a value which the GeodesicLine object is * not capable of computing is not an error; the corresponding argument * will not be altered. * * The following functions are overloaded versions of * GeodesicLine::Position which omit some of the output parameters. Note, * however, that the arc length is always computed and returned as the * function value. **********************************************************************/ Math::real Position(real s12, real& lat2, real& lon2, real& azi2, real& m12, real& M12, real& M21, real& S12) const { real t; return GenPosition(false, s12, LATITUDE | LONGITUDE | AZIMUTH | REDUCEDLENGTH | GEODESICSCALE | AREA, lat2, lon2, azi2, t, m12, M12, M21, S12); } /** * See the documentation for GeodesicLine::Position. **********************************************************************/ Math::real Position(real s12, real& lat2, real& lon2) const { real t; return GenPosition(false, s12, LATITUDE | LONGITUDE, lat2, lon2, t, t, t, t, t, t); } /** * See the documentation for GeodesicLine::Position. **********************************************************************/ Math::real Position(real s12, real& lat2, real& lon2, real& azi2) const { real t; return GenPosition(false, s12, LATITUDE | LONGITUDE | AZIMUTH, lat2, lon2, azi2, t, t, t, t, t); } /** * See the documentation for GeodesicLine::Position. **********************************************************************/ Math::real Position(real s12, real& lat2, real& lon2, real& azi2, real& m12) const { real t; return GenPosition(false, s12, LATITUDE | LONGITUDE | AZIMUTH | REDUCEDLENGTH, lat2, lon2, azi2, t, m12, t, t, t); } /** * See the documentation for GeodesicLine::Position. **********************************************************************/ Math::real Position(real s12, real& lat2, real& lon2, real& azi2, real& M12, real& M21) const { real t; return GenPosition(false, s12, LATITUDE | LONGITUDE | AZIMUTH | GEODESICSCALE, lat2, lon2, azi2, t, t, M12, M21, t); } /** * See the documentation for GeodesicLine::Position. **********************************************************************/ Math::real Position(real s12, real& lat2, real& lon2, real& azi2, real& m12, real& M12, real& M21) const { real t; return GenPosition(false, s12, LATITUDE | LONGITUDE | AZIMUTH | REDUCEDLENGTH | GEODESICSCALE, lat2, lon2, azi2, t, m12, M12, M21, t); } ///@} /** \name Position in terms of arc length **********************************************************************/ ///@{ /** * Compute the position of point 2 which is an arc length \e a12 (degrees) * from point 1. * * @param[in] a12 arc length from point 1 to point 2 (degrees); it can * be negative. * @param[out] lat2 latitude of point 2 (degrees). * @param[out] lon2 longitude of point 2 (degrees); requires that the * GeodesicLine object was constructed with \e caps |= * GeodesicLine::LONGITUDE. * @param[out] azi2 (forward) azimuth at point 2 (degrees). * @param[out] s12 distance from point 1 to point 2 (meters); requires * that the GeodesicLine object was constructed with \e caps |= * GeodesicLine::DISTANCE. * @param[out] m12 reduced length of geodesic (meters); requires that the * GeodesicLine object was constructed with \e caps |= * GeodesicLine::REDUCEDLENGTH. * @param[out] M12 geodesic scale of point 2 relative to point 1 * (dimensionless); requires that the GeodesicLine object was constructed * with \e caps |= GeodesicLine::GEODESICSCALE. * @param[out] M21 geodesic scale of point 1 relative to point 2 * (dimensionless); requires that the GeodesicLine object was constructed * with \e caps |= GeodesicLine::GEODESICSCALE. * @param[out] S12 area under the geodesic (meters2); requires * that the GeodesicLine object was constructed with \e caps |= * GeodesicLine::AREA. * * The values of \e lon2 and \e azi2 returned are in the range * [−180°, 180°]. * * Requesting a value which the GeodesicLine object is not capable of * computing is not an error; the corresponding argument will not be * altered. * * The following functions are overloaded versions of * GeodesicLine::ArcPosition which omit some of the output parameters. **********************************************************************/ void ArcPosition(real a12, real& lat2, real& lon2, real& azi2, real& s12, real& m12, real& M12, real& M21, real& S12) const { GenPosition(true, a12, LATITUDE | LONGITUDE | AZIMUTH | DISTANCE | REDUCEDLENGTH | GEODESICSCALE | AREA, lat2, lon2, azi2, s12, m12, M12, M21, S12); } /** * See the documentation for GeodesicLine::ArcPosition. **********************************************************************/ void ArcPosition(real a12, real& lat2, real& lon2) const { real t; GenPosition(true, a12, LATITUDE | LONGITUDE, lat2, lon2, t, t, t, t, t, t); } /** * See the documentation for GeodesicLine::ArcPosition. **********************************************************************/ void ArcPosition(real a12, real& lat2, real& lon2, real& azi2) const { real t; GenPosition(true, a12, LATITUDE | LONGITUDE | AZIMUTH, lat2, lon2, azi2, t, t, t, t, t); } /** * See the documentation for GeodesicLine::ArcPosition. **********************************************************************/ void ArcPosition(real a12, real& lat2, real& lon2, real& azi2, real& s12) const { real t; GenPosition(true, a12, LATITUDE | LONGITUDE | AZIMUTH | DISTANCE, lat2, lon2, azi2, s12, t, t, t, t); } /** * See the documentation for GeodesicLine::ArcPosition. **********************************************************************/ void ArcPosition(real a12, real& lat2, real& lon2, real& azi2, real& s12, real& m12) const { real t; GenPosition(true, a12, LATITUDE | LONGITUDE | AZIMUTH | DISTANCE | REDUCEDLENGTH, lat2, lon2, azi2, s12, m12, t, t, t); } /** * See the documentation for GeodesicLine::ArcPosition. **********************************************************************/ void ArcPosition(real a12, real& lat2, real& lon2, real& azi2, real& s12, real& M12, real& M21) const { real t; GenPosition(true, a12, LATITUDE | LONGITUDE | AZIMUTH | DISTANCE | GEODESICSCALE, lat2, lon2, azi2, s12, t, M12, M21, t); } /** * See the documentation for GeodesicLine::ArcPosition. **********************************************************************/ void ArcPosition(real a12, real& lat2, real& lon2, real& azi2, real& s12, real& m12, real& M12, real& M21) const { real t; GenPosition(true, a12, LATITUDE | LONGITUDE | AZIMUTH | DISTANCE | REDUCEDLENGTH | GEODESICSCALE, lat2, lon2, azi2, s12, m12, M12, M21, t); } ///@} /** \name The general position function. **********************************************************************/ ///@{ /** * The general position function. GeodesicLine::Position and * GeodesicLine::ArcPosition are defined in terms of this function. * * @param[in] arcmode boolean flag determining the meaning of the second * parameter; if \e arcmode is false, then the GeodesicLine object must * have been constructed with \e caps |= GeodesicLine::DISTANCE_IN. * @param[in] s12_a12 if \e arcmode is false, this is the distance between * point 1 and point 2 (meters); otherwise it is the arc length between * point 1 and point 2 (degrees); it can be negative. * @param[in] outmask a bitor'ed combination of GeodesicLine::mask values * specifying which of the following parameters should be set. * @param[out] lat2 latitude of point 2 (degrees). * @param[out] lon2 longitude of point 2 (degrees); requires that the * GeodesicLine object was constructed with \e caps |= * GeodesicLine::LONGITUDE. * @param[out] azi2 (forward) azimuth at point 2 (degrees). * @param[out] s12 distance from point 1 to point 2 (meters); requires * that the GeodesicLine object was constructed with \e caps |= * GeodesicLine::DISTANCE. * @param[out] m12 reduced length of geodesic (meters); requires that the * GeodesicLine object was constructed with \e caps |= * GeodesicLine::REDUCEDLENGTH. * @param[out] M12 geodesic scale of point 2 relative to point 1 * (dimensionless); requires that the GeodesicLine object was constructed * with \e caps |= GeodesicLine::GEODESICSCALE. * @param[out] M21 geodesic scale of point 1 relative to point 2 * (dimensionless); requires that the GeodesicLine object was constructed * with \e caps |= GeodesicLine::GEODESICSCALE. * @param[out] S12 area under the geodesic (meters2); requires * that the GeodesicLine object was constructed with \e caps |= * GeodesicLine::AREA. * @return \e a12 arc length from point 1 to point 2 (degrees). * * The GeodesicLine::mask values possible for \e outmask are * - \e outmask |= GeodesicLine::LATITUDE for the latitude \e lat2; * - \e outmask |= GeodesicLine::LONGITUDE for the latitude \e lon2; * - \e outmask |= GeodesicLine::AZIMUTH for the latitude \e azi2; * - \e outmask |= GeodesicLine::DISTANCE for the distance \e s12; * - \e outmask |= GeodesicLine::REDUCEDLENGTH for the reduced length \e * m12; * - \e outmask |= GeodesicLine::GEODESICSCALE for the geodesic scales \e * M12 and \e M21; * - \e outmask |= GeodesicLine::AREA for the area \e S12; * - \e outmask |= GeodesicLine::ALL for all of the above; * - \e outmask |= GeodesicLine::LONG_UNROLL to unroll \e lon2 instead of * reducing it into the range [−180°, 180°]. * . * Requesting a value which the GeodesicLine object is not capable of * computing is not an error; the corresponding argument will not be * altered. Note, however, that the arc length is always computed and * returned as the function value. * * With the GeodesicLine::LONG_UNROLL bit set, the quantity \e lon2 − * \e lon1 indicates how many times and in what sense the geodesic * encircles the ellipsoid. **********************************************************************/ Math::real GenPosition(bool arcmode, real s12_a12, unsigned outmask, real& lat2, real& lon2, real& azi2, real& s12, real& m12, real& M12, real& M21, real& S12) const; ///@} /** \name Setting point 3 **********************************************************************/ ///@{ /** * Specify position of point 3 in terms of distance. * * @param[in] s13 the distance from point 1 to point 3 (meters); it * can be negative. * * This is only useful if the GeodesicLine object has been constructed * with \e caps |= GeodesicLine::DISTANCE_IN. **********************************************************************/ void SetDistance(real s13); /** * Specify position of point 3 in terms of arc length. * * @param[in] a13 the arc length from point 1 to point 3 (degrees); it * can be negative. * * The distance \e s13 is only set if the GeodesicLine object has been * constructed with \e caps |= GeodesicLine::DISTANCE. **********************************************************************/ void SetArc(real a13); /** * Specify position of point 3 in terms of either distance or arc length. * * @param[in] arcmode boolean flag determining the meaning of the second * parameter; if \e arcmode is false, then the GeodesicLine object must * have been constructed with \e caps |= GeodesicLine::DISTANCE_IN. * @param[in] s13_a13 if \e arcmode is false, this is the distance from * point 1 to point 3 (meters); otherwise it is the arc length from * point 1 to point 3 (degrees); it can be negative. **********************************************************************/ void GenSetDistance(bool arcmode, real s13_a13); ///@} /** \name Inspector functions **********************************************************************/ ///@{ /** * @return true if the object has been initialized. **********************************************************************/ bool Init() const { return _caps != 0U; } /** * @return \e lat1 the latitude of point 1 (degrees). **********************************************************************/ Math::real Latitude() const { return Init() ? _lat1 : Math::NaN(); } /** * @return \e lon1 the longitude of point 1 (degrees). **********************************************************************/ Math::real Longitude() const { return Init() ? _lon1 : Math::NaN(); } /** * @return \e azi1 the azimuth (degrees) of the geodesic line at point 1. **********************************************************************/ Math::real Azimuth() const { return Init() ? _azi1 : Math::NaN(); } /** * The sine and cosine of \e azi1. * * @param[out] sazi1 the sine of \e azi1. * @param[out] cazi1 the cosine of \e azi1. **********************************************************************/ void Azimuth(real& sazi1, real& cazi1) const { if (Init()) { sazi1 = _salp1; cazi1 = _calp1; } } /** * @return \e azi0 the azimuth (degrees) of the geodesic line as it crosses * the equator in a northward direction. * * The result lies in [−90°, 90°]. **********************************************************************/ Math::real EquatorialAzimuth() const { return Init() ? Math::atan2d(_salp0, _calp0) : Math::NaN(); } /** * The sine and cosine of \e azi0. * * @param[out] sazi0 the sine of \e azi0. * @param[out] cazi0 the cosine of \e azi0. **********************************************************************/ void EquatorialAzimuth(real& sazi0, real& cazi0) const { if (Init()) { sazi0 = _salp0; cazi0 = _calp0; } } /** * @return \e a1 the arc length (degrees) between the northward equatorial * crossing and point 1. * * The result lies in [−180°, 180°]. **********************************************************************/ Math::real EquatorialArc() const { return Init() ? Math::atan2d(_ssig1, _csig1) : Math::NaN(); } /** * @return \e a the equatorial radius of the ellipsoid (meters). This is * the value inherited from the Geodesic object used in the constructor. **********************************************************************/ Math::real EquatorialRadius() const { return Init() ? _a : Math::NaN(); } /** * @return \e f the flattening of the ellipsoid. This is the value * inherited from the Geodesic object used in the constructor. **********************************************************************/ Math::real Flattening() const { return Init() ? _f : Math::NaN(); } /** * @return \e caps the computational capabilities that this object was * constructed with. LATITUDE and AZIMUTH are always included. **********************************************************************/ unsigned Capabilities() const { return _caps; } /** * Test what capabilities are available. * * @param[in] testcaps a set of bitor'ed GeodesicLine::mask values. * @return true if the GeodesicLine object has all these capabilities. **********************************************************************/ bool Capabilities(unsigned testcaps) const { testcaps &= OUT_ALL; return (_caps & testcaps) == testcaps; } /** * The distance or arc length to point 3. * * @param[in] arcmode boolean flag determining the meaning of returned * value. * @return \e s13 if \e arcmode is false; \e a13 if \e arcmode is true. **********************************************************************/ Math::real GenDistance(bool arcmode) const { return Init() ? (arcmode ? _a13 : _s13) : Math::NaN(); } /** * @return \e s13, the distance to point 3 (meters). **********************************************************************/ Math::real Distance() const { return GenDistance(false); } /** * @return \e a13, the arc length to point 3 (degrees). **********************************************************************/ Math::real Arc() const { return GenDistance(true); } ///@} }; } // namespace GeographicLib #endif // GEOGRAPHICLIB_GEODESICLINE_HPP geosphere/src/DMS.cpp0000644000176200001440000004674514323376011014171 0ustar liggesusers/** * \file DMS.cpp * \brief Implementation for GeographicLib::DMS class * * Copyright (c) Charles Karney (2008-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #include "DMS.h" #include "Utility.h" #if defined(_MSC_VER) // Squelch warnings about constant conditional and enum-float expressions # pragma warning (disable: 4127 5055) #endif namespace GeographicLib { using namespace std; const char* const DMS::hemispheres_ = "SNWE"; const char* const DMS::signs_ = "-+"; const char* const DMS::digits_ = "0123456789"; const char* const DMS::dmsindicators_ = "D'\":"; const char* const DMS::components_[] = {"degrees", "minutes", "seconds"}; // Replace all occurrences of pat by c. If c is NULL remove pat. void DMS::replace(std::string& s, const std::string& pat, char c) { string::size_type p = 0; int count = c ? 1 : 0; while (true) { p = s.find(pat, p); if (p == string::npos) break; s.replace(p, pat.length(), count, c); } } Math::real DMS::Decode(const std::string& dms, flag& ind) { // Here's a table of the allowed characters // S unicode dec UTF-8 descripton // DEGREE // d U+0064 100 64 d // D U+0044 68 44 D // ° U+00b0 176 c2 b0 degree symbol // º U+00ba 186 c2 ba alt symbol // â° U+2070 8304 e2 81 b0 sup zero // Ëš U+02da 730 cb 9a ring above // ∘ U+2218 8728 e2 88 98 compose function // * U+002a 42 2a GRiD symbol for degrees // MINUTES // ' U+0027 39 27 apostrophe // ` U+0060 96 60 grave accent // ′ U+2032 8242 e2 80 b2 prime // ‵ U+2035 8245 e2 80 b5 back prime // ´ U+00b4 180 c2 b4 acute accent // ‘ U+2018 8216 e2 80 98 left single quote (also ext ASCII 0x91) // ’ U+2019 8217 e2 80 99 right single quote (also ext ASCII 0x92) // ‛ U+201b 8219 e2 80 9b reversed-9 single quote // ʹ U+02b9 697 ca b9 modifier letter prime // ËŠ U+02ca 714 cb 8a modifier letter acute accent // Ë‹ U+02cb 715 cb 8b modifier letter grave accent // SECONDS // " U+0022 34 22 quotation mark // ″ U+2033 8243 e2 80 b3 double prime // ‶ U+2036 8246 e2 80 b6 reversed double prime // Ë U+02dd 733 cb 9d double acute accent // “ U+201c 8220 e2 80 9c left double quote (also ext ASCII 0x93) // †U+201d 8221 e2 80 9d right double quote (also ext ASCII 0x94) // ‟ U+201f 8223 e2 80 9f reversed-9 double quote // ʺ U+02ba 698 ca ba modifier letter double prime // PLUS // + U+002b 43 2b plus sign // âž• U+2795 10133 e2 9e 95 heavy plus // U+2064 8292 e2 81 a4 invisible plus |â¤| // MINUS // - U+002d 45 2d hyphen // †U+2010 8208 e2 80 90 dash // ‑ U+2011 8209 e2 80 91 non-breaking hyphen // – U+2013 8211 e2 80 93 en dash (also ext ASCII 0x96) // — U+2014 8212 e2 80 94 em dash (also ext ASCII 0x97) // − U+2212 8722 e2 88 92 minus sign // âž– U+2796 10134 e2 9e 96 heavy minus // IGNORED //   U+00a0 160 c2 a0 non-breaking space // U+2007 8199 e2 80 87 figure space | | // U+2009 8201 e2 80 89 thin space | | // U+200a 8202 e2 80 8a hair space | | // U+200b 8203 e2 80 8b invisible space |​| //   U+202f 8239 e2 80 af narrow space | | // U+2063 8291 e2 81 a3 invisible separator |â£| // « U+00ab 171 c2 ab left guillemot (for cgi-bin) // » U+00bb 187 c2 bb right guillemot (for cgi-bin) string dmsa = dms; replace(dmsa, "\xc2\xb0", 'd' ); // U+00b0 degree symbol replace(dmsa, "\xc2\xba", 'd' ); // U+00ba alt symbol replace(dmsa, "\xe2\x81\xb0", 'd' ); // U+2070 sup zero replace(dmsa, "\xcb\x9a", 'd' ); // U+02da ring above replace(dmsa, "\xe2\x88\x98", 'd' ); // U+2218 compose function replace(dmsa, "\xe2\x80\xb2", '\''); // U+2032 prime replace(dmsa, "\xe2\x80\xb5", '\''); // U+2035 back prime replace(dmsa, "\xc2\xb4", '\''); // U+00b4 acute accent replace(dmsa, "\xe2\x80\x98", '\''); // U+2018 left single quote replace(dmsa, "\xe2\x80\x99", '\''); // U+2019 right single quote replace(dmsa, "\xe2\x80\x9b", '\''); // U+201b reversed-9 single quote replace(dmsa, "\xca\xb9", '\''); // U+02b9 modifier letter prime replace(dmsa, "\xcb\x8a", '\''); // U+02ca modifier letter acute accent replace(dmsa, "\xcb\x8b", '\''); // U+02cb modifier letter grave accent replace(dmsa, "\xe2\x80\xb3", '"' ); // U+2033 double prime replace(dmsa, "\xe2\x80\xb6", '"' ); // U+2036 reversed double prime replace(dmsa, "\xcb\x9d", '"' ); // U+02dd double acute accent replace(dmsa, "\xe2\x80\x9c", '"' ); // U+201c left double quote replace(dmsa, "\xe2\x80\x9d", '"' ); // U+201d right double quote replace(dmsa, "\xe2\x80\x9f", '"' ); // U+201f reversed-9 double quote replace(dmsa, "\xca\xba", '"' ); // U+02ba modifier letter double prime replace(dmsa, "\xe2\x9e\x95", '+' ); // U+2795 heavy plus replace(dmsa, "\xe2\x81\xa4", '+' ); // U+2064 invisible plus replace(dmsa, "\xe2\x80\x90", '-' ); // U+2010 dash replace(dmsa, "\xe2\x80\x91", '-' ); // U+2011 non-breaking hyphen replace(dmsa, "\xe2\x80\x93", '-' ); // U+2013 en dash replace(dmsa, "\xe2\x80\x94", '-' ); // U+2014 em dash replace(dmsa, "\xe2\x88\x92", '-' ); // U+2212 minus sign replace(dmsa, "\xe2\x9e\x96", '-' ); // U+2796 heavy minus replace(dmsa, "\xc2\xa0", '\0'); // U+00a0 non-breaking space replace(dmsa, "\xe2\x80\x87", '\0'); // U+2007 figure space replace(dmsa, "\xe2\x80\x89", '\0'); // U+2007 thin space replace(dmsa, "\xe2\x80\x8a", '\0'); // U+200a hair space replace(dmsa, "\xe2\x80\x8b", '\0'); // U+200b invisible space replace(dmsa, "\xe2\x80\xaf", '\0'); // U+202f narrow space replace(dmsa, "\xe2\x81\xa3", '\0'); // U+2063 invisible separator replace(dmsa, "\xb0", 'd' ); // 0xb0 bare degree symbol replace(dmsa, "\xba", 'd' ); // 0xba bare alt symbol replace(dmsa, "*", 'd' ); // GRiD symbol for degree replace(dmsa, "`", '\''); // grave accent replace(dmsa, "\xb4", '\''); // 0xb4 bare acute accent // Don't implement these alternatives; they are only relevant for cgi-bin // replace(dmsa, "\x91", '\''); // 0x91 ext ASCII left single quote // replace(dmsa, "\x92", '\''); // 0x92 ext ASCII right single quote // replace(dmsa, "\x93", '"' ); // 0x93 ext ASCII left double quote // replace(dmsa, "\x94", '"' ); // 0x94 ext ASCII right double quote // replace(dmsa, "\x96", '-' ); // 0x96 ext ASCII en dash // replace(dmsa, "\x97", '-' ); // 0x97 ext ASCII em dash replace(dmsa, "\xa0", '\0'); // 0xa0 bare non-breaking space replace(dmsa, "''", '"' ); // '' -> " string::size_type beg = 0, end = unsigned(dmsa.size()); while (beg < end && isspace(dmsa[beg])) ++beg; while (beg < end && isspace(dmsa[end - 1])) --end; // The trimmed string in [beg, end) real v = -0.0; // So "-0" returns -0.0 int i = 0; flag ind1 = NONE; // p is pointer to the next piece that needs decoding for (string::size_type p = beg, pb; p < end; p = pb, ++i) { string::size_type pa = p; // Skip over initial hemisphere letter (for i == 0) if (i == 0 && Utility::lookup(hemispheres_, dmsa[pa]) >= 0) ++pa; // Skip over initial sign (checking for it if i == 0) if (i > 0 || (pa < end && Utility::lookup(signs_, dmsa[pa]) >= 0)) ++pa; // Find next sign pb = min(dmsa.find_first_of(signs_, pa), end); flag ind2 = NONE; v += InternalDecode(dmsa.substr(p, pb - p), ind2); if (ind1 == NONE) ind1 = ind2; else if (!(ind2 == NONE || ind1 == ind2)) throw GeographicErr("Incompatible hemisphere specifier in " + dmsa.substr(beg, pb - beg)); } if (i == 0) throw GeographicErr("Empty or incomplete DMS string " + dmsa.substr(beg, end - beg)); ind = ind1; return v; } Math::real DMS::InternalDecode(const string& dmsa, flag& ind) { string errormsg; do { // Executed once (provides the ability to break) int sign = 1; unsigned beg = 0, end = unsigned(dmsa.size()); flag ind1 = NONE; int k = -1; if (end > beg && (k = Utility::lookup(hemispheres_, dmsa[beg])) >= 0) { ind1 = (k / 2) ? LONGITUDE : LATITUDE; sign = k % 2 ? 1 : -1; ++beg; } if (end > beg && (k = Utility::lookup(hemispheres_, dmsa[end-1])) >= 0) { if (k >= 0) { if (ind1 != NONE) { if (toupper(dmsa[beg - 1]) == toupper(dmsa[end - 1])) errormsg = "Repeated hemisphere indicators " + Utility::str(dmsa[beg - 1]) + " in " + dmsa.substr(beg - 1, end - beg + 1); else errormsg = "Contradictory hemisphere indicators " + Utility::str(dmsa[beg - 1]) + " and " + Utility::str(dmsa[end - 1]) + " in " + dmsa.substr(beg - 1, end - beg + 1); break; } ind1 = (k / 2) ? LONGITUDE : LATITUDE; sign = k % 2 ? 1 : -1; --end; } } if (end > beg && (k = Utility::lookup(signs_, dmsa[beg])) >= 0) { if (k >= 0) { sign *= k ? 1 : -1; ++beg; } } if (end == beg) { errormsg = "Empty or incomplete DMS string " + dmsa; break; } real ipieces[] = {0, 0, 0}; real fpieces[] = {0, 0, 0}; unsigned npiece = 0; real icurrent = 0; real fcurrent = 0; unsigned ncurrent = 0, p = beg; bool pointseen = false; unsigned digcount = 0, intcount = 0; while (p < end) { char x = dmsa[p++]; if ((k = Utility::lookup(digits_, x)) >= 0) { ++ncurrent; if (digcount > 0) ++digcount; // Count of decimal digits else { icurrent = 10 * icurrent + k; ++intcount; } } else if (x == '.') { if (pointseen) { errormsg = "Multiple decimal points in " + dmsa.substr(beg, end - beg); break; } pointseen = true; digcount = 1; } else if ((k = Utility::lookup(dmsindicators_, x)) >= 0) { if (k >= 3) { if (p == end) { errormsg = "Illegal for : to appear at the end of " + dmsa.substr(beg, end - beg); break; } k = npiece; } if (unsigned(k) == npiece - 1) { errormsg = "Repeated " + string(components_[k]) + " component in " + dmsa.substr(beg, end - beg); break; } else if (unsigned(k) < npiece) { errormsg = string(components_[k]) + " component follows " + string(components_[npiece - 1]) + " component in " + dmsa.substr(beg, end - beg); break; } if (ncurrent == 0) { errormsg = "Missing numbers in " + string(components_[k]) + " component of " + dmsa.substr(beg, end - beg); break; } if (digcount > 0) { istringstream s(dmsa.substr(p - intcount - digcount - 1, intcount + digcount)); s >> fcurrent; icurrent = 0; } ipieces[k] = icurrent; fpieces[k] = icurrent + fcurrent; if (p < end) { npiece = k + 1; icurrent = fcurrent = 0; ncurrent = digcount = intcount = 0; } } else if (Utility::lookup(signs_, x) >= 0) { errormsg = "Internal sign in DMS string " + dmsa.substr(beg, end - beg); break; } else { errormsg = "Illegal character " + Utility::str(x) + " in DMS string " + dmsa.substr(beg, end - beg); break; } } if (!errormsg.empty()) break; if (Utility::lookup(dmsindicators_, dmsa[p - 1]) < 0) { if (npiece >= 3) { errormsg = "Extra text following seconds in DMS string " + dmsa.substr(beg, end - beg); break; } if (ncurrent == 0) { errormsg = "Missing numbers in trailing component of " + dmsa.substr(beg, end - beg); break; } if (digcount > 0) { istringstream s(dmsa.substr(p - intcount - digcount, intcount + digcount)); s >> fcurrent; icurrent = 0; } ipieces[npiece] = icurrent; fpieces[npiece] = icurrent + fcurrent; } if (pointseen && digcount == 0) { errormsg = "Decimal point in non-terminal component of " + dmsa.substr(beg, end - beg); break; } // Note that we accept 59.999999... even though it rounds to 60. if (ipieces[1] >= Math::dm || fpieces[1] > Math::dm ) { errormsg = "Minutes " + Utility::str(fpieces[1]) + " not in range [0, " + to_string(Math::dm) + ")"; break; } if (ipieces[2] >= Math::ms || fpieces[2] > Math::ms) { errormsg = "Seconds " + Utility::str(fpieces[2]) + " not in range [0, " + to_string(Math::ms) + ")"; break; } ind = ind1; // Assume check on range of result is made by calling routine (which // might be able to offer a better diagnostic). return real(sign) * ( fpieces[2] != 0 ? (Math::ms*(Math::dm*fpieces[0] + fpieces[1]) + fpieces[2])/Math::ds : ( fpieces[1] != 0 ? (Math::dm*fpieces[0] + fpieces[1]) / Math::dm : fpieces[0] ) ); } while (false); real val = Utility::nummatch(dmsa); if (val == 0) throw GeographicErr(errormsg); else ind = NONE; return val; } void DMS::DecodeLatLon(const string& stra, const string& strb, real& lat, real& lon, bool longfirst) { real a, b; flag ia, ib; a = Decode(stra, ia); b = Decode(strb, ib); if (ia == NONE && ib == NONE) { // Default to lat, long unless longfirst ia = longfirst ? LONGITUDE : LATITUDE; ib = longfirst ? LATITUDE : LONGITUDE; } else if (ia == NONE) ia = flag(LATITUDE + LONGITUDE - ib); else if (ib == NONE) ib = flag(LATITUDE + LONGITUDE - ia); if (ia == ib) throw GeographicErr("Both " + stra + " and " + strb + " interpreted as " + (ia == LATITUDE ? "latitudes" : "longitudes")); real lat1 = ia == LATITUDE ? a : b, lon1 = ia == LATITUDE ? b : a; if (fabs(lat1) > Math::qd) throw GeographicErr("Latitude " + Utility::str(lat1) + "d not in [-" + to_string(Math::qd) + "d, " + to_string(Math::qd) + "d]"); lat = lat1; lon = lon1; } Math::real DMS::DecodeAngle(const string& angstr) { flag ind; real ang = Decode(angstr, ind); if (ind != NONE) throw GeographicErr("Arc angle " + angstr + " includes a hemisphere, N/E/W/S"); return ang; } Math::real DMS::DecodeAzimuth(const string& azistr) { flag ind; real azi = Decode(azistr, ind); if (ind == LATITUDE) throw GeographicErr("Azimuth " + azistr + " has a latitude hemisphere, N/S"); return Math::AngNormalize(azi); } string DMS::Encode(real angle, component trailing, unsigned prec, flag ind, char dmssep) { // Assume check on range of input angle has been made by calling // routine (which might be able to offer a better diagnostic). if (!isfinite(angle)) return angle < 0 ? string("-inf") : (angle > 0 ? string("inf") : string("nan")); // 15 - 2 * trailing = ceiling(log10(2^53/90/60^trailing)). // This suffices to give full real precision for numbers in [-90,90] prec = min(15 + Math::extra_digits() - 2 * unsigned(trailing), prec); real scale = trailing == MINUTE ? Math::dm : (trailing == SECOND ? Math::ds : 1); if (ind == AZIMUTH) { angle = Math::AngNormalize(angle); // Only angles strictly less than 0 can become 360; since +/-180 are // folded together, we convert -0 to +0 (instead of 360). if (angle < 0) angle += Math::td; else angle = Math::real(0) + angle; } int sign = signbit(angle) ? -1 : 1; angle *= sign; // Break off integer part to preserve precision and avoid overflow in // manipulation of fractional part for MINUTE and SECOND real idegree = trailing == DEGREE ? 0 : floor(angle), fdegree = (angle - idegree) * scale; string s = Utility::str(fdegree, prec), degree, minute, second; switch (trailing) { case DEGREE: degree = s; break; default: // case MINUTE: case SECOND: string::size_type p = s.find_first_of('.'); long long i; if (p == 0) i = 0; else { i = stoll(s); if (p == string::npos) s.clear(); else s = s.substr(p); } // Now i in [0,Math::dm] or [0,Math::ds] for MINUTE/DEGREE switch (trailing) { case MINUTE: minute = to_string(i % Math::dm) + s; i /= Math::dm; degree = Utility::str(i + idegree, 0); // no overflow since i in [0,1] break; default: // case SECOND: second = to_string(i % Math::ms) + s; i /= Math::ms; minute = to_string(i % Math::dm) ; i /= Math::dm; degree = Utility::str(i + idegree, 0); // no overflow since i in [0,1] break; } break; } // No glue together degree+minute+second with // sign + zero-fill + delimiters + hemisphere ostringstream str; if (prec) ++prec; // Extra width for decimal point if (ind == NONE && sign < 0) str << '-'; str << setfill('0'); switch (trailing) { case DEGREE: if (ind != NONE) str << setw(1 + min(int(ind), 2) + prec); str << degree; // Don't include degree designator (d) if it is the trailing component. break; case MINUTE: if (ind != NONE) str << setw(1 + min(int(ind), 2)); str << degree << (dmssep ? dmssep : char(tolower(dmsindicators_[0]))) << setw(2 + prec) << minute; if (!dmssep) str << char(tolower(dmsindicators_[1])); break; default: // case SECOND: if (ind != NONE) str << setw(1 + min(int(ind), 2)); str << degree << (dmssep ? dmssep : char(tolower(dmsindicators_[0]))) << setw(2) << minute << (dmssep ? dmssep : char(tolower(dmsindicators_[1]))) << setw(2 + prec) << second; if (!dmssep) str << char(tolower(dmsindicators_[2])); break; } if (ind != NONE && ind != AZIMUTH) str << hemispheres_[(ind == LATITUDE ? 0 : 2) + (sign < 0 ? 0 : 1)]; return str.str(); } } // namespace GeographicLib geosphere/src/Georef.h0000644000176200001440000001350514323377037014417 0ustar liggesusers/** * \file Georef.hpp * \brief Header for GeographicLib::Georef class * * Copyright (c) Charles Karney (2015-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #if !defined(GEOGRAPHICLIB_GEOREF_HPP) #define GEOGRAPHICLIB_GEOREF_HPP 1 #include "Constants.h" #if defined(_MSC_VER) // Squelch warnings about dll vs string # pragma warning (push) # pragma warning (disable: 4251) #endif namespace GeographicLib { /** * \brief Conversions for the World Geographic Reference System (georef) * * The World Geographic Reference System is described in * - https://en.wikipedia.org/wiki/Georef * - https://web.archive.org/web/20161214054445/http://earth-info.nga.mil/GandG/coordsys/grids/georef.pdf * . * It provides a compact string representation of a geographic area * (expressed as latitude and longitude). The classes GARS and Geohash * implement similar compact representations. * * Example of use: * \include example-Georef.cpp **********************************************************************/ class GEOGRAPHICLIB_EXPORT Georef { private: typedef Math::real real; static const char* const digits_; static const char* const lontile_; static const char* const lattile_; static const char* const degrees_; #if GEOGRAPHICLIB_PRECISION == 4 // Work around an enum lossage introduced in boost 1.76 // https://github.com/boostorg/multiprecision/issues/324 // and fixed in // https://github.com/boostorg/multiprecision/pull/333 static const int #else enum { #endif tile_ = 15, // The size of tile in degrees lonorig_ = -Math::hd, // Origin for longitude latorig_ = -Math::qd, // Origin for latitude base_ = 10, // Base for minutes baselen_ = 4, maxprec_ = 11, // approximately equivalent to MGRS class maxlen_ = baselen_ + 2 * maxprec_ #if GEOGRAPHICLIB_PRECISION == 4 ; #else }; #endif Georef() = delete; // Disable constructor public: /** * Convert from geographic coordinates to georef. * * @param[in] lat latitude of point (degrees). * @param[in] lon longitude of point (degrees). * @param[in] prec the precision of the resulting georef. * @param[out] georef the georef string. * @exception GeographicErr if \e lat is not in [−90°, * 90°]. * @exception std::bad_alloc if memory for \e georef can't be allocated. * * \e prec specifies the precision of \e georef as follows: * - \e prec = −1 (min), 15° * - \e prec = 0, 1° * - \e prec = 1, converted to \e prec = 2 * - \e prec = 2, 1' * - \e prec = 3, 0.1' * - \e prec = 4, 0.01' * - \e prec = 5, 0.001' * - … * - \e prec = 11 (max), 10−9' * * If \e lat or \e lon is NaN, then \e georef is set to "INVALID". **********************************************************************/ static void Forward(real lat, real lon, int prec, std::string& georef); /** * Convert from Georef to geographic coordinates. * * @param[in] georef the Georef. * @param[out] lat latitude of point (degrees). * @param[out] lon longitude of point (degrees). * @param[out] prec the precision of \e georef. * @param[in] centerp if true (the default) return the center * \e georef, otherwise return the south-west corner. * @exception GeographicErr if \e georef is illegal. * * The case of the letters in \e georef is ignored. \e prec is in the * range [−1, 11] and gives the precision of \e georef as follows: * - \e prec = −1 (min), 15° * - \e prec = 0, 1° * - \e prec = 1, not returned * - \e prec = 2, 1' * - \e prec = 3, 0.1' * - \e prec = 4, 0.01' * - \e prec = 5, 0.001' * - … * - \e prec = 11 (max), 10−9' * * If the first 3 characters of \e georef are "INV", then \e lat and \e lon * are set to NaN and \e prec is unchanged. **********************************************************************/ static void Reverse(const std::string& georef, real& lat, real& lon, int& prec, bool centerp = true); /** * The angular resolution of a Georef. * * @param[in] prec the precision of the Georef. * @return the latitude-longitude resolution (degrees). * * Internally, \e prec is first put in the range [−1, 11]. **********************************************************************/ static Math::real Resolution(int prec) { if (prec < 1) return real(prec < 0 ? 15 : 1); else { using std::pow; // Treat prec = 1 as 2. prec = (std::max)(2, (std::min)(int(maxprec_), prec)); // Need extra real because, since C++11, pow(float, int) returns double return 1/(60 * real(pow(real(base_), prec - 2))); } } /** * The Georef precision required to meet a given geographic resolution. * * @param[in] res the minimum of resolution in latitude and longitude * (degrees). * @return Georef precision. * * The returned length is in the range [0, 11]. **********************************************************************/ static int Precision(real res) { using std::fabs; res = fabs(res); for (int prec = 0; prec < maxprec_; ++prec) { if (prec == 1) continue; if (Resolution(prec) <= res) return prec; } return maxprec_; } }; } // namespace GeographicLib #if defined(_MSC_VER) # pragma warning (pop) #endif #endif // GEOGRAPHICLIB_GEOREF_HPP geosphere/src/LocalCartesian.h0000644000176200001440000002312514323377037016073 0ustar liggesusers/** * \file LocalCartesian.hpp * \brief Header for GeographicLib::LocalCartesian class * * Copyright (c) Charles Karney (2008-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #if !defined(GEOGRAPHICLIB_LOCALCARTESIAN_HPP) #define GEOGRAPHICLIB_LOCALCARTESIAN_HPP 1 #include "Geocentric.h" #include "Constants.h" namespace GeographicLib { /** * \brief Local cartesian coordinates * * Convert between geodetic coordinates latitude = \e lat, longitude = \e * lon, height = \e h (measured vertically from the surface of the ellipsoid) * to local cartesian coordinates (\e x, \e y, \e z). The origin of local * cartesian coordinate system is at \e lat = \e lat0, \e lon = \e lon0, \e h * = \e h0. The \e z axis is normal to the ellipsoid; the \e y axis points * due north. The plane \e z = - \e h0 is tangent to the ellipsoid. * * The conversions all take place via geocentric coordinates using a * Geocentric object (by default Geocentric::WGS84()). * * Example of use: * \include example-LocalCartesian.cpp * * CartConvert is a command-line utility * providing access to the functionality of Geocentric and LocalCartesian. **********************************************************************/ class GEOGRAPHICLIB_EXPORT LocalCartesian { private: typedef Math::real real; static const size_t dim_ = 3; static const size_t dim2_ = dim_ * dim_; Geocentric _earth; real _lat0, _lon0, _h0; real _x0, _y0, _z0, _r[dim2_]; void IntForward(real lat, real lon, real h, real& x, real& y, real& z, real M[dim2_]) const; void IntReverse(real x, real y, real z, real& lat, real& lon, real& h, real M[dim2_]) const; void MatrixMultiply(real M[dim2_]) const; public: /** * Constructor setting the origin. * * @param[in] lat0 latitude at origin (degrees). * @param[in] lon0 longitude at origin (degrees). * @param[in] h0 height above ellipsoid at origin (meters); default 0. * @param[in] earth Geocentric object for the transformation; default * Geocentric::WGS84(). * * \e lat0 should be in the range [−90°, 90°]. **********************************************************************/ LocalCartesian(real lat0, real lon0, real h0 = 0, const Geocentric& earth = Geocentric::WGS84()) : _earth(earth) { Reset(lat0, lon0, h0); } /** * Default constructor. * * @param[in] earth Geocentric object for the transformation; default * Geocentric::WGS84(). * * Sets \e lat0 = 0, \e lon0 = 0, \e h0 = 0. **********************************************************************/ explicit LocalCartesian(const Geocentric& earth = Geocentric::WGS84()) : _earth(earth) { Reset(real(0), real(0), real(0)); } /** * Reset the origin. * * @param[in] lat0 latitude at origin (degrees). * @param[in] lon0 longitude at origin (degrees). * @param[in] h0 height above ellipsoid at origin (meters); default 0. * * \e lat0 should be in the range [−90°, 90°]. **********************************************************************/ void Reset(real lat0, real lon0, real h0 = 0); /** * Convert from geodetic to local cartesian coordinates. * * @param[in] lat latitude of point (degrees). * @param[in] lon longitude of point (degrees). * @param[in] h height of point above the ellipsoid (meters). * @param[out] x local cartesian coordinate (meters). * @param[out] y local cartesian coordinate (meters). * @param[out] z local cartesian coordinate (meters). * * \e lat should be in the range [−90°, 90°]. **********************************************************************/ void Forward(real lat, real lon, real h, real& x, real& y, real& z) const { IntForward(lat, lon, h, x, y, z, NULL); } /** * Convert from geodetic to local cartesian coordinates and return rotation * matrix. * * @param[in] lat latitude of point (degrees). * @param[in] lon longitude of point (degrees). * @param[in] h height of point above the ellipsoid (meters). * @param[out] x local cartesian coordinate (meters). * @param[out] y local cartesian coordinate (meters). * @param[out] z local cartesian coordinate (meters). * @param[out] M if the length of the vector is 9, fill with the rotation * matrix in row-major order. * * \e lat should be in the range [−90°, 90°]. * * Let \e v be a unit vector located at (\e lat, \e lon, \e h). We can * express \e v as \e column vectors in one of two ways * - in east, north, up coordinates (where the components are relative to a * local coordinate system at (\e lat, \e lon, \e h)); call this * representation \e v1. * - in \e x, \e y, \e z coordinates (where the components are relative to * the local coordinate system at (\e lat0, \e lon0, \e h0)); call this * representation \e v0. * . * Then we have \e v0 = \e M ⋅ \e v1. **********************************************************************/ void Forward(real lat, real lon, real h, real& x, real& y, real& z, std::vector& M) const { if (M.end() == M.begin() + dim2_) { real t[dim2_]; IntForward(lat, lon, h, x, y, z, t); std::copy(t, t + dim2_, M.begin()); } else IntForward(lat, lon, h, x, y, z, NULL); } /** * Convert from local cartesian to geodetic coordinates. * * @param[in] x local cartesian coordinate (meters). * @param[in] y local cartesian coordinate (meters). * @param[in] z local cartesian coordinate (meters). * @param[out] lat latitude of point (degrees). * @param[out] lon longitude of point (degrees). * @param[out] h height of point above the ellipsoid (meters). * * In general, there are multiple solutions and the result which minimizes * |h |is returned, i.e., (lat, lon) corresponds to * the closest point on the ellipsoid. The value of \e lon returned is in * the range [−180°, 180°]. **********************************************************************/ void Reverse(real x, real y, real z, real& lat, real& lon, real& h) const { IntReverse(x, y, z, lat, lon, h, NULL); } /** * Convert from local cartesian to geodetic coordinates and return rotation * matrix. * * @param[in] x local cartesian coordinate (meters). * @param[in] y local cartesian coordinate (meters). * @param[in] z local cartesian coordinate (meters). * @param[out] lat latitude of point (degrees). * @param[out] lon longitude of point (degrees). * @param[out] h height of point above the ellipsoid (meters). * @param[out] M if the length of the vector is 9, fill with the rotation * matrix in row-major order. * * Let \e v be a unit vector located at (\e lat, \e lon, \e h). We can * express \e v as \e column vectors in one of two ways * - in east, north, up coordinates (where the components are relative to a * local coordinate system at (\e lat, \e lon, \e h)); call this * representation \e v1. * - in \e x, \e y, \e z coordinates (where the components are relative to * the local coordinate system at (\e lat0, \e lon0, \e h0)); call this * representation \e v0. * . * Then we have \e v1 = MT ⋅ \e v0, where * MT is the transpose of \e M. **********************************************************************/ void Reverse(real x, real y, real z, real& lat, real& lon, real& h, std::vector& M) const { if (M.end() == M.begin() + dim2_) { real t[dim2_]; IntReverse(x, y, z, lat, lon, h, t); std::copy(t, t + dim2_, M.begin()); } else IntReverse(x, y, z, lat, lon, h, NULL); } /** \name Inspector functions **********************************************************************/ ///@{ /** * @return latitude of the origin (degrees). **********************************************************************/ Math::real LatitudeOrigin() const { return _lat0; } /** * @return longitude of the origin (degrees). **********************************************************************/ Math::real LongitudeOrigin() const { return _lon0; } /** * @return height of the origin (meters). **********************************************************************/ Math::real HeightOrigin() const { return _h0; } /** * @return \e a the equatorial radius of the ellipsoid (meters). This is * the value of \e a inherited from the Geocentric object used in the * constructor. **********************************************************************/ Math::real EquatorialRadius() const { return _earth.EquatorialRadius(); } /** * @return \e f the flattening of the ellipsoid. This is the value * inherited from the Geocentric object used in the constructor. **********************************************************************/ Math::real Flattening() const { return _earth.Flattening(); } ///@} }; } // namespace GeographicLib #endif // GEOGRAPHICLIB_LOCALCARTESIAN_HPP geosphere/src/Ellipsoid.cpp0000644000176200001440000001043014677357014015466 0ustar liggesusers/** * \file Ellipsoid.cpp * \brief Implementation for GeographicLib::Ellipsoid class * * Copyright (c) Charles Karney (2012-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #include #include // std::numeric_limits #include "Ellipsoid.h" #if defined(_MSC_VER) // Squelch warnings about enum-float expressions # pragma warning (disable: 5055) #endif namespace GeographicLib { using namespace std; Ellipsoid::Ellipsoid(real a, real f) : stol_(real(0.01) * sqrt(numeric_limits::epsilon())) , _a(a) , _f(f) , _f1(1 - _f) , _f12(Math::sq(_f1)) , _e2(_f * (2 - _f)) , _es((_f < 0 ? -1 : 1) * sqrt(fabs(_e2))) , _e12(_e2 / (1 - _e2)) , _n(_f / (2 - _f)) , _b(_a * _f1) , _tm(_a, _f, real(1)) , _ell(-_e12) , _au(_a, _f, real(0), real(1), real(0), real(1), real(1)) {} const Ellipsoid& Ellipsoid::WGS84() { static const Ellipsoid wgs84(Constants::WGS84_a(), Constants::WGS84_f()); return wgs84; } Math::real Ellipsoid::QuarterMeridian() const { return _b * _ell.E(); } Math::real Ellipsoid::Area() const { return 4 * Math::pi() * ((Math::sq(_a) + Math::sq(_b) * (_e2 == 0 ? 1 : (_e2 > 0 ? atanh(sqrt(_e2)) : atan(sqrt(-_e2))) / sqrt(fabs(_e2))))/2); } Math::real Ellipsoid::ParametricLatitude(real phi) const { return Math::atand(_f1 * Math::tand(Math::LatFix(phi))); } Math::real Ellipsoid::InverseParametricLatitude(real beta) const { return Math::atand(Math::tand(Math::LatFix(beta)) / _f1); } Math::real Ellipsoid::GeocentricLatitude(real phi) const { return Math::atand(_f12 * Math::tand(Math::LatFix(phi))); } Math::real Ellipsoid::InverseGeocentricLatitude(real theta) const { return Math::atand(Math::tand(Math::LatFix(theta)) / _f12); } Math::real Ellipsoid::RectifyingLatitude(real phi) const { return fabs(phi) == Math::qd ? phi: Math::qd * MeridianDistance(phi) / QuarterMeridian(); } Math::real Ellipsoid::InverseRectifyingLatitude(real mu) const { if (fabs(mu) == Math::qd) return mu; return InverseParametricLatitude(_ell.Einv(mu * _ell.E() / Math::qd) / Math::degree()); } Math::real Ellipsoid::AuthalicLatitude(real phi) const { return Math::atand(_au.txif(Math::tand(Math::LatFix(phi)))); } Math::real Ellipsoid::InverseAuthalicLatitude(real xi) const { return Math::atand(_au.tphif(Math::tand(Math::LatFix(xi)))); } Math::real Ellipsoid::ConformalLatitude(real phi) const { return Math::atand(Math::taupf(Math::tand(Math::LatFix(phi)), _es)); } Math::real Ellipsoid::InverseConformalLatitude(real chi) const { return Math::atand(Math::tauf(Math::tand(Math::LatFix(chi)), _es)); } Math::real Ellipsoid::IsometricLatitude(real phi) const { return asinh(Math::taupf(Math::tand(Math::LatFix(phi)), _es)) / Math::degree(); } Math::real Ellipsoid::InverseIsometricLatitude(real psi) const { return Math::atand(Math::tauf(sinh(psi * Math::degree()), _es)); } Math::real Ellipsoid::CircleRadius(real phi) const { return fabs(phi) == Math::qd ? 0 : // a * cos(beta) _a / hypot(real(1), _f1 * Math::tand(Math::LatFix(phi))); } Math::real Ellipsoid::CircleHeight(real phi) const { real tbeta = _f1 * Math::tand(phi); // b * sin(beta) return _b * tbeta / hypot(real(1), _f1 * Math::tand(Math::LatFix(phi))); } Math::real Ellipsoid::MeridianDistance(real phi) const { return _b * _ell.Ed( ParametricLatitude(phi) ); } Math::real Ellipsoid::MeridionalCurvatureRadius(real phi) const { real v = 1 - _e2 * Math::sq(Math::sind(Math::LatFix(phi))); return _a * (1 - _e2) / (v * sqrt(v)); } Math::real Ellipsoid::TransverseCurvatureRadius(real phi) const { real v = 1 - _e2 * Math::sq(Math::sind(Math::LatFix(phi))); return _a / sqrt(v); } Math::real Ellipsoid::NormalCurvatureRadius(real phi, real azi) const { real calp, salp, v = 1 - _e2 * Math::sq(Math::sind(Math::LatFix(phi))); Math::sincosd(azi, salp, calp); return _a / (sqrt(v) * (Math::sq(calp) * v / (1 - _e2) + Math::sq(salp))); } } // namespace GeographicLib geosphere/src/Geoid.h0000644000176200001440000004557114323377037014247 0ustar liggesusers/** * \file Geoid.hpp * \brief Header for GeographicLib::Geoid class * * Copyright (c) Charles Karney (2009-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #if !defined(GEOGRAPHICLIB_GEOID_HPP) #define GEOGRAPHICLIB_GEOID_HPP 1 #include #include #include "Constants.h" #if defined(_MSC_VER) // Squelch warnings about dll vs vector and constant conditional expressions # pragma warning (push) # pragma warning (disable: 4251 4127) #endif #if !defined(GEOGRAPHICLIB_GEOID_PGM_PIXEL_WIDTH) /** * The size of the pixel data in the pgm data files for the geoids. 2 is the * standard size corresponding to a maxval 216−1. Setting it * to 4 uses a maxval of 232−1 and changes the extension for * the data files from .pgm to .pgm4. Note that the format of these pgm4 files * is a non-standard extension of the pgm format. **********************************************************************/ # define GEOGRAPHICLIB_GEOID_PGM_PIXEL_WIDTH 2 #endif namespace GeographicLib { /** * \brief Looking up the height of the geoid above the ellipsoid * * This class evaluates the height of one of the standard geoids, EGM84, * EGM96, or EGM2008 by bilinear or cubic interpolation into a rectangular * grid of data. These geoid models are documented in * - EGM84: * https://earth-info.nga.mil/index.php?dir=wgs84&action=wgs84#tab_egm84 * - EGM96: * https://earth-info.nga.mil/index.php?dir=wgs84&action=wgs84#tab_egm96 * - EGM2008: * https://earth-info.nga.mil/index.php?dir=wgs84&action=wgs84#tab_egm2008 * * The geoids are defined in terms of spherical harmonics. However in order * to provide a quick and flexible method of evaluating the geoid heights, * this class evaluates the height by interpolation into a grid of * precomputed values. * * The height of the geoid above the ellipsoid, \e N, is sometimes called the * geoid undulation. It can be used to convert a height above the ellipsoid, * \e h, to the corresponding height above the geoid (the orthometric height, * roughly the height above mean sea level), \e H, using the relations * *    \e h = \e N + \e H; *   \e H = −\e N + \e h. * * See \ref geoid for details of how to install the data sets, the data * format, estimates of the interpolation errors, and how to use caching. * * This class is typically \e not thread safe in that a single instantiation * cannot be safely used by multiple threads because of the way the object * reads the data set and because it maintains a single-cell cache. If * multiple threads need to calculate geoid heights they should all construct * thread-local instantiations. Alternatively, set the optional \e * threadsafe parameter to true in the constructor. This causes the * constructor to read all the data into memory and to turn off the * single-cell caching which results in a Geoid object which \e is thread * safe. * * Example of use: * \include example-Geoid.cpp * * GeoidEval is a command-line utility * providing access to the functionality of Geoid. **********************************************************************/ class GEOGRAPHICLIB_EXPORT Geoid { private: typedef Math::real real; #if GEOGRAPHICLIB_GEOID_PGM_PIXEL_WIDTH != 4 typedef unsigned short pixel_t; static const unsigned pixel_size_ = 2; static const unsigned pixel_max_ = 0xffffu; #else typedef unsigned pixel_t; static const unsigned pixel_size_ = 4; static const unsigned pixel_max_ = 0xffffffffu; #endif static const unsigned stencilsize_ = 12; static const unsigned nterms_ = ((3 + 1) * (3 + 2))/2; // for a cubic fit static const int c0_; static const int c0n_; static const int c0s_; static const int c3_[stencilsize_ * nterms_]; static const int c3n_[stencilsize_ * nterms_]; static const int c3s_[stencilsize_ * nterms_]; std::string _name, _dir, _filename; const bool _cubic; const real _a, _e2, _degree, _eps; mutable std::ifstream _file; real _rlonres, _rlatres; std::string _description, _datetime; real _offset, _scale, _maxerror, _rmserror; int _width, _height; unsigned long long _datastart, _swidth; bool _threadsafe; // Area cache mutable std::vector< std::vector > _data; mutable bool _cache; // NE corner and extent of cache mutable int _xoffset, _yoffset, _xsize, _ysize; // Cell cache mutable int _ix, _iy; mutable real _v00, _v01, _v10, _v11; mutable real _t[nterms_]; void filepos(int ix, int iy) const { _file.seekg(std::streamoff (_datastart + pixel_size_ * (unsigned(iy)*_swidth + unsigned(ix)))); } real rawval(int ix, int iy) const { if (ix < 0) ix += _width; else if (ix >= _width) ix -= _width; if (_cache && iy >= _yoffset && iy < _yoffset + _ysize && ((ix >= _xoffset && ix < _xoffset + _xsize) || (ix + _width >= _xoffset && ix + _width < _xoffset + _xsize))) { return real(_data[iy - _yoffset] [ix >= _xoffset ? ix - _xoffset : ix + _width - _xoffset]); } else { if (iy < 0 || iy >= _height) { iy = iy < 0 ? -iy : 2 * (_height - 1) - iy; ix += (ix < _width/2 ? 1 : -1) * _width/2; } try { filepos(ix, iy); // initial values to suppress warnings in case get fails char a = 0, b = 0; _file.get(a); _file.get(b); unsigned r = ((unsigned char)(a) << 8) | (unsigned char)(b); if (pixel_size_ == 4) { _file.get(a); _file.get(b); r = (r << 16) | ((unsigned char)(a) << 8) | (unsigned char)(b); } return real(r); } catch (const std::exception& e) { // throw GeographicErr("Error reading " + _filename + ": " // + e.what()); // triggers complaints about the "binary '+'" under Visual Studio. // So use '+=' instead. std::string err("Error reading "); err += _filename; err += ": "; err += e.what(); throw GeographicErr(err); } } } real height(real lat, real lon) const; Geoid(const Geoid&) = delete; // copy constructor not allowed Geoid& operator=(const Geoid&) = delete; // copy assignment not allowed public: /** * Flags indicating conversions between heights above the geoid and heights * above the ellipsoid. **********************************************************************/ enum convertflag { /** * The multiplier for converting from heights above the geoid to heights * above the ellipsoid. **********************************************************************/ ELLIPSOIDTOGEOID = -1, /** * No conversion. **********************************************************************/ NONE = 0, /** * The multiplier for converting from heights above the ellipsoid to * heights above the geoid. **********************************************************************/ GEOIDTOELLIPSOID = 1, }; /** \name Setting up the geoid **********************************************************************/ ///@{ /** * Construct a geoid. * * @param[in] name the name of the geoid. * @param[in] path (optional) directory for data file. * @param[in] cubic (optional) interpolation method; false means bilinear, * true (the default) means cubic. * @param[in] threadsafe (optional), if true, construct a thread safe * object. The default is false * @exception GeographicErr if the data file cannot be found, is * unreadable, or is corrupt. * @exception GeographicErr if \e threadsafe is true but the memory * necessary for caching the data can't be allocated. * * The data file is formed by appending ".pgm" to the name. If \e path is * specified (and is non-empty), then the file is loaded from directory, \e * path. Otherwise the path is given by DefaultGeoidPath(). If the \e * threadsafe parameter is true, the data set is read into memory, the data * file is closed, and single-cell caching is turned off; this results in a * Geoid object which \e is thread safe. **********************************************************************/ explicit Geoid(const std::string& name, const std::string& path = "", bool cubic = true, bool threadsafe = false); /** * Set up a cache. * * @param[in] south latitude (degrees) of the south edge of the cached * area. * @param[in] west longitude (degrees) of the west edge of the cached area. * @param[in] north latitude (degrees) of the north edge of the cached * area. * @param[in] east longitude (degrees) of the east edge of the cached area. * @exception GeographicErr if the memory necessary for caching the data * can't be allocated (in this case, you will have no cache and can try * again with a smaller area). * @exception GeographicErr if there's a problem reading the data. * @exception GeographicErr if this is called on a threadsafe Geoid. * * Cache the data for the specified "rectangular" area bounded by the * parallels \e south and \e north and the meridians \e west and \e east. * \e east is always interpreted as being east of \e west, if necessary by * adding 360° to its value. \e south and \e north should be in * the range [−90°, 90°]. **********************************************************************/ void CacheArea(real south, real west, real north, real east) const; /** * Cache all the data. * * @exception GeographicErr if the memory necessary for caching the data * can't be allocated (in this case, you will have no cache and can try * again with a smaller area). * @exception GeographicErr if there's a problem reading the data. * @exception GeographicErr if this is called on a threadsafe Geoid. * * On most computers, this is fast for data sets with grid resolution of 5' * or coarser. For a 1' grid, the required RAM is 450MB; a 2.5' grid needs * 72MB; and a 5' grid needs 18MB. **********************************************************************/ void CacheAll() const { CacheArea(real(-Math::qd), real(0), real( Math::qd), real(Math::td)); } /** * Clear the cache. This never throws an error. (This does nothing with a * thread safe Geoid.) **********************************************************************/ void CacheClear() const; ///@} /** \name Compute geoid heights **********************************************************************/ ///@{ /** * Compute the geoid height at a point * * @param[in] lat latitude of the point (degrees). * @param[in] lon longitude of the point (degrees). * @exception GeographicErr if there's a problem reading the data; this * never happens if (\e lat, \e lon) is within a successfully cached * area. * @return the height of the geoid above the ellipsoid (meters). * * The latitude should be in [−90°, 90°]. **********************************************************************/ Math::real operator()(real lat, real lon) const { return height(lat, lon); } /** * Convert a height above the geoid to a height above the ellipsoid and * vice versa. * * @param[in] lat latitude of the point (degrees). * @param[in] lon longitude of the point (degrees). * @param[in] h height of the point (degrees). * @param[in] d a Geoid::convertflag specifying the direction of the * conversion; Geoid::GEOIDTOELLIPSOID means convert a height above the * geoid to a height above the ellipsoid; Geoid::ELLIPSOIDTOGEOID means * convert a height above the ellipsoid to a height above the geoid. * @exception GeographicErr if there's a problem reading the data; this * never happens if (\e lat, \e lon) is within a successfully cached * area. * @return converted height (meters). **********************************************************************/ Math::real ConvertHeight(real lat, real lon, real h, convertflag d) const { return h + real(d) * height(lat, lon); } ///@} /** \name Inspector functions **********************************************************************/ ///@{ /** * @return geoid description, if available, in the data file; if * absent, return "NONE". **********************************************************************/ const std::string& Description() const { return _description; } /** * @return date of the data file; if absent, return "UNKNOWN". **********************************************************************/ const std::string& DateTime() const { return _datetime; } /** * @return full file name used to load the geoid data. **********************************************************************/ const std::string& GeoidFile() const { return _filename; } /** * @return "name" used to load the geoid data (from the first argument of * the constructor). **********************************************************************/ const std::string& GeoidName() const { return _name; } /** * @return directory used to load the geoid data. **********************************************************************/ const std::string& GeoidDirectory() const { return _dir; } /** * @return interpolation method ("cubic" or "bilinear"). **********************************************************************/ const std::string Interpolation() const { return std::string(_cubic ? "cubic" : "bilinear"); } /** * @return estimate of the maximum interpolation and quantization error * (meters). * * This relies on the value being stored in the data file. If the value is * absent, return −1. **********************************************************************/ Math::real MaxError() const { return _maxerror; } /** * @return estimate of the RMS interpolation and quantization error * (meters). * * This relies on the value being stored in the data file. If the value is * absent, return −1. **********************************************************************/ Math::real RMSError() const { return _rmserror; } /** * @return offset (meters). * * This in used in converting from the pixel values in the data file to * geoid heights. **********************************************************************/ Math::real Offset() const { return _offset; } /** * @return scale (meters). * * This in used in converting from the pixel values in the data file to * geoid heights. **********************************************************************/ Math::real Scale() const { return _scale; } /** * @return true if the object is constructed to be thread safe. **********************************************************************/ bool ThreadSafe() const { return _threadsafe; } /** * @return true if a data cache is active. **********************************************************************/ bool Cache() const { return _cache; } /** * @return west edge of the cached area; the cache includes this edge. **********************************************************************/ Math::real CacheWest() const { return _cache ? ((_xoffset + (_xsize == _width ? 0 : _cubic) + _width/2) % _width - _width/2) / _rlonres : 0; } /** * @return east edge of the cached area; the cache excludes this edge. **********************************************************************/ Math::real CacheEast() const { return _cache ? CacheWest() + (_xsize - (_xsize == _width ? 0 : 1 + 2 * _cubic)) / _rlonres : 0; } /** * @return north edge of the cached area; the cache includes this edge. **********************************************************************/ Math::real CacheNorth() const { return _cache ? real(Math::qd) - (_yoffset + _cubic) / _rlatres : 0; } /** * @return south edge of the cached area; the cache excludes this edge * unless it's the south pole. **********************************************************************/ Math::real CacheSouth() const { return _cache ? real(Math::qd) - ( _yoffset + _ysize - 1 - _cubic) / _rlatres : 0; } /** * @return \e a the equatorial radius of the WGS84 ellipsoid (meters). * * (The WGS84 value is returned because the supported geoid models are all * based on this ellipsoid.) **********************************************************************/ Math::real EquatorialRadius() const { return Constants::WGS84_a(); } /** * @return \e f the flattening of the WGS84 ellipsoid. * * (The WGS84 value is returned because the supported geoid models are all * based on this ellipsoid.) **********************************************************************/ Math::real Flattening() const { return Constants::WGS84_f(); } ///@} /** * @return the default path for geoid data files. * * This is the value of the environment variable GEOGRAPHICLIB_GEOID_PATH, * if set; otherwise, it is $GEOGRAPHICLIB_DATA/geoids if the environment * variable GEOGRAPHICLIB_DATA is set; otherwise, it is a compile-time * default (/usr/local/share/GeographicLib/geoids on non-Windows systems * and C:/ProgramData/GeographicLib/geoids on Windows systems). **********************************************************************/ static std::string DefaultGeoidPath(); /** * @return the default name for the geoid. * * This is the value of the environment variable GEOGRAPHICLIB_GEOID_NAME, * if set; otherwise, it is "egm96-5". The Geoid class does not use this * function; it is just provided as a convenience for a calling program * when constructing a Geoid object. **********************************************************************/ static std::string DefaultGeoidName(); }; } // namespace GeographicLib #if defined(_MSC_VER) # pragma warning (pop) #endif #endif // GEOGRAPHICLIB_GEOID_HPP geosphere/src/UTMUPS.h0000644000176200001440000005003714323377037014246 0ustar liggesusers/** * \file UTMUPS.hpp * \brief Header for GeographicLib::UTMUPS class * * Copyright (c) Charles Karney (2008-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #if !defined(GEOGRAPHICLIB_UTMUPS_HPP) #define GEOGRAPHICLIB_UTMUPS_HPP 1 #include "Constants.h" namespace GeographicLib { /** * \brief Convert between geographic coordinates and UTM/UPS * * UTM and UPS are defined * - J. W. Hager, J. F. Behensky, and B. W. Drew, * * The Universal Grids: Universal Transverse Mercator (UTM) and Universal * Polar Stereographic (UPS), Defense Mapping Agency, Technical Manual * TM8358.2 (1989). * . * Section 2-3 defines UTM and section 3-2.4 defines UPS. This document also * includes approximate algorithms for the computation of the underlying * transverse Mercator and polar stereographic projections. Here we * substitute much more accurate algorithms given by * GeographicLib:TransverseMercator and GeographicLib:PolarStereographic. * These are the algorithms recommended by the NGA document * - * The Universal Grids and the Transverse Mercator and Polar Stereographic * Map Projections, NGA.SIG.0012 (2014). * * In this implementation, the conversions are closed, i.e., output from * Forward is legal input for Reverse and vice versa. The error is about 5nm * in each direction. However, the conversion from legal UTM/UPS coordinates * to geographic coordinates and back might throw an error if the initial * point is within 5nm of the edge of the allowed range for the UTM/UPS * coordinates. * * The simplest way to guarantee the closed property is to define allowed * ranges for the eastings and northings for UTM and UPS coordinates. The * UTM boundaries are the same for all zones. (The only place the * exceptional nature of the zone boundaries is evident is when converting to * UTM/UPS coordinates requesting the standard zone.) The MGRS lettering * scheme imposes natural limits on UTM/UPS coordinates which may be * converted into MGRS coordinates. For the conversion to/from geographic * coordinates these ranges have been extended by 100km in order to provide a * generous overlap between UTM and UPS and between UTM zones. * * The NGA software package * geotrans * also provides conversions to and from UTM and UPS. Version 2.4.2 (and * earlier) suffers from some drawbacks: * - Inconsistent rules are used to determine the whether a particular UTM or * UPS coordinate is legal. A more systematic approach is taken here. * - The underlying projections are not very accurately implemented. * * The GeographicLib::UTMUPS::EncodeZone encodes the UTM zone and hemisphere * to allow UTM/UPS coordinated to be displayed as, for example, "38N 444500 * 3688500". According to NGA.SIG.0012_2.0.0_UTMUPS the use of "N" to denote * "north" in the context is not allowed (since a upper case letter in this * context denotes the MGRS latitude band). Consequently, as of version * 1.36, EncodeZone uses the lower case letters "n" and "s" to denote the * hemisphere. In addition EncodeZone accepts an optional final argument \e * abbrev, which, if false, results in the hemisphere being spelled out as in * "38north". * * Example of use: * \include example-UTMUPS.cpp **********************************************************************/ class GEOGRAPHICLIB_EXPORT UTMUPS { private: typedef Math::real real; static const int falseeasting_[4]; static const int falsenorthing_[4]; static const int mineasting_[4]; static const int maxeasting_[4]; static const int minnorthing_[4]; static const int maxnorthing_[4]; static const int epsg01N = 32601; // EPSG code for UTM 01N static const int epsg60N = 32660; // EPSG code for UTM 60N static const int epsgN = 32661; // EPSG code for UPS N static const int epsg01S = 32701; // EPSG code for UTM 01S static const int epsg60S = 32760; // EPSG code for UTM 60S static const int epsgS = 32761; // EPSG code for UPS S static real CentralMeridian(int zone) { return real(6 * zone - 183); } // Throw an error if easting or northing are outside standard ranges. If // throwp = false, return bool instead. static bool CheckCoords(bool utmp, bool northp, real x, real y, bool msgrlimits = false, bool throwp = true); UTMUPS() = delete; // Disable constructor public: /** * In this class we bring together the UTM and UPS coordinates systems. * The UTM divides the earth between latitudes −80° and 84° * into 60 zones numbered 1 thru 60. Zone assign zone number 0 to the UPS * regions, covering the two poles. Within UTMUPS, non-negative zone * numbers refer to one of the "physical" zones, 0 for UPS and [1, 60] for * UTM. Negative "pseudo-zone" numbers are used to select one of the * physical zones. **********************************************************************/ enum zonespec { /** * The smallest pseudo-zone number. **********************************************************************/ MINPSEUDOZONE = -4, /** * A marker for an undefined or invalid zone. Equivalent to NaN. **********************************************************************/ INVALID = -4, /** * If a coordinate already include zone information (e.g., it is an MGRS * coordinate), use that, otherwise apply the UTMUPS::STANDARD rules. **********************************************************************/ MATCH = -3, /** * Apply the standard rules for UTM zone assigment extending the UTM zone * to each pole to give a zone number in [1, 60]. For example, use UTM * zone 38 for longitude in [42°, 48°). The rules include the * Norway and Svalbard exceptions. **********************************************************************/ UTM = -2, /** * Apply the standard rules for zone assignment to give a zone number in * [0, 60]. If the latitude is not in [−80°, 84°), then * use UTMUPS::UPS = 0, otherwise apply the rules for UTMUPS::UTM. The * tests on latitudes and longitudes are all closed on the lower end open * on the upper. Thus for UTM zone 38, latitude is in [−80°, * 84°) and longitude is in [42°, 48°). **********************************************************************/ STANDARD = -1, /** * The largest pseudo-zone number. **********************************************************************/ MAXPSEUDOZONE = -1, /** * The smallest physical zone number. **********************************************************************/ MINZONE = 0, /** * The zone number used for UPS **********************************************************************/ UPS = 0, /** * The smallest UTM zone number. **********************************************************************/ MINUTMZONE = 1, /** * The largest UTM zone number. **********************************************************************/ MAXUTMZONE = 60, /** * The largest physical zone number. **********************************************************************/ MAXZONE = 60, }; /** * The standard zone. * * @param[in] lat latitude (degrees). * @param[in] lon longitude (degrees). * @param[in] setzone zone override (optional). If omitted, use the * standard rules for picking the zone. If \e setzone is given then use * that zone if it is non-negative, otherwise apply the rules given in * UTMUPS::zonespec. * @exception GeographicErr if \e setzone is outside the range * [UTMUPS::MINPSEUDOZONE, UTMUPS::MAXZONE] = [−4, 60]. * * This is exact. **********************************************************************/ static int StandardZone(real lat, real lon, int setzone = STANDARD); /** * Forward projection, from geographic to UTM/UPS. * * @param[in] lat latitude of point (degrees). * @param[in] lon longitude of point (degrees). * @param[out] zone the UTM zone (zero means UPS). * @param[out] northp hemisphere (true means north, false means south). * @param[out] x easting of point (meters). * @param[out] y northing of point (meters). * @param[out] gamma meridian convergence at point (degrees). * @param[out] k scale of projection at point. * @param[in] setzone zone override (optional). * @param[in] mgrslimits if true enforce the stricter MGRS limits on the * coordinates (default = false). * @exception GeographicErr if \e lat is not in [−90°, * 90°]. * @exception GeographicErr if the resulting \e x or \e y is out of allowed * range (see Reverse); in this case, these arguments are unchanged. * * If \e setzone is omitted, use the standard rules for picking the zone. * If \e setzone is given then use that zone if it is non-negative, * otherwise apply the rules given in UTMUPS::zonespec. The accuracy of * the conversion is about 5nm. * * The northing \e y jumps by UTMUPS::UTMShift() when crossing the equator * in the southerly direction. Sometimes it is useful to remove this * discontinuity in \e y by extending the "northern" hemisphere using * UTMUPS::Transfer: * \code double lat = -1, lon = 123; int zone; bool northp; double x, y, gamma, k; GeographicLib::UTMUPS::Forward(lat, lon, zone, northp, x, y, gamma, k); GeographicLib::UTMUPS::Transfer(zone, northp, x, y, zone, true, x, y, zone); northp = true; \endcode **********************************************************************/ static void Forward(real lat, real lon, int& zone, bool& northp, real& x, real& y, real& gamma, real& k, int setzone = STANDARD, bool mgrslimits = false); /** * Reverse projection, from UTM/UPS to geographic. * * @param[in] zone the UTM zone (zero means UPS). * @param[in] northp hemisphere (true means north, false means south). * @param[in] x easting of point (meters). * @param[in] y northing of point (meters). * @param[out] lat latitude of point (degrees). * @param[out] lon longitude of point (degrees). * @param[out] gamma meridian convergence at point (degrees). * @param[out] k scale of projection at point. * @param[in] mgrslimits if true enforce the stricter MGRS limits on the * coordinates (default = false). * @exception GeographicErr if \e zone, \e x, or \e y is out of allowed * range; this this case the arguments are unchanged. * * The accuracy of the conversion is about 5nm. * * UTM eastings are allowed to be in the range [0km, 1000km], northings are * allowed to be in in [0km, 9600km] for the northern hemisphere and in * [900km, 10000km] for the southern hemisphere. However UTM northings * can be continued across the equator. So the actual limits on the * northings are [-9100km, 9600km] for the "northern" hemisphere and * [900km, 19600km] for the "southern" hemisphere. * * UPS eastings and northings are allowed to be in the range [1200km, * 2800km] in the northern hemisphere and in [700km, 3300km] in the * southern hemisphere. * * These ranges are 100km larger than allowed for the conversions to MGRS. * (100km is the maximum extra padding consistent with eastings remaining * non-negative.) This allows generous overlaps between zones and UTM and * UPS. If \e mgrslimits = true, then all the ranges are shrunk by 100km * so that they agree with the stricter MGRS ranges. No checks are * performed besides these (e.g., to limit the distance outside the * standard zone boundaries). **********************************************************************/ static void Reverse(int zone, bool northp, real x, real y, real& lat, real& lon, real& gamma, real& k, bool mgrslimits = false); /** * UTMUPS::Forward without returning convergence and scale. **********************************************************************/ static void Forward(real lat, real lon, int& zone, bool& northp, real& x, real& y, int setzone = STANDARD, bool mgrslimits = false) { real gamma, k; Forward(lat, lon, zone, northp, x, y, gamma, k, setzone, mgrslimits); } /** * UTMUPS::Reverse without returning convergence and scale. **********************************************************************/ static void Reverse(int zone, bool northp, real x, real y, real& lat, real& lon, bool mgrslimits = false) { real gamma, k; Reverse(zone, northp, x, y, lat, lon, gamma, k, mgrslimits); } /** * Transfer UTM/UPS coordinated from one zone to another. * * @param[in] zonein the UTM zone for \e xin and \e yin (or zero for UPS). * @param[in] northpin hemisphere for \e xin and \e yin (true means north, * false means south). * @param[in] xin easting of point (meters) in \e zonein. * @param[in] yin northing of point (meters) in \e zonein. * @param[in] zoneout the requested UTM zone for \e xout and \e yout (or * zero for UPS). * @param[in] northpout hemisphere for \e xout output and \e yout. * @param[out] xout easting of point (meters) in \e zoneout. * @param[out] yout northing of point (meters) in \e zoneout. * @param[out] zone the actual UTM zone for \e xout and \e yout (or zero * for UPS); this equals \e zoneout if \e zoneout ≥ 0. * @exception GeographicErr if \e zonein is out of range (see below). * @exception GeographicErr if \e zoneout is out of range (see below). * @exception GeographicErr if \e xin or \e yin fall outside their allowed * ranges (see UTMUPS::Reverse). * @exception GeographicErr if \e xout or \e yout fall outside their * allowed ranges (see UTMUPS::Reverse). * * \e zonein must be in the range [UTMUPS::MINZONE, UTMUPS::MAXZONE] = [0, * 60] with \e zonein = UTMUPS::UPS, 0, indicating UPS. \e zonein may * also be UTMUPS::INVALID. * * \e zoneout must be in the range [UTMUPS::MINPSEUDOZONE, UTMUPS::MAXZONE] * = [-4, 60]. If \e zoneout < UTMUPS::MINZONE then the rules give in * the documentation of UTMUPS::zonespec are applied, and \e zone is set to * the actual zone used for output. * * (\e xout, \e yout) can overlap with (\e xin, \e yin). **********************************************************************/ static void Transfer(int zonein, bool northpin, real xin, real yin, int zoneout, bool northpout, real& xout, real& yout, int& zone); /** * Decode a UTM/UPS zone string. * * @param[in] zonestr string representation of zone and hemisphere. * @param[out] zone the UTM zone (zero means UPS). * @param[out] northp hemisphere (true means north, false means south). * @exception GeographicErr if \e zonestr is malformed. * * For UTM, \e zonestr has the form of a zone number in the range * [UTMUPS::MINUTMZONE, UTMUPS::MAXUTMZONE] = [1, 60] followed by a * hemisphere letter, n or s (or "north" or "south" spelled out). For UPS, * it consists just of the hemisphere letter (or the spelled out * hemisphere). The returned value of \e zone is UTMUPS::UPS = 0 for UPS. * Note well that "38s" indicates the southern hemisphere of zone 38 and * not latitude band S, 32° ≤ \e lat < 40°. n, 01s, 2n, 38s, * south, 3north are legal. 0n, 001s, +3n, 61n, 38P are illegal. INV is a * special value for which the returned value of \e is UTMUPS::INVALID. **********************************************************************/ static void DecodeZone(const std::string& zonestr, int& zone, bool& northp); /** * Encode a UTM/UPS zone string. * * @param[in] zone the UTM zone (zero means UPS). * @param[in] northp hemisphere (true means north, false means south). * @param[in] abbrev if true (the default) use abbreviated (n/s) notation * for hemisphere; otherwise spell out the hemisphere (north/south) * @exception GeographicErr if \e zone is out of range (see below). * @exception std::bad_alloc if memoy for the string can't be allocated. * @return string representation of zone and hemisphere. * * \e zone must be in the range [UTMUPS::MINZONE, UTMUPS::MAXZONE] = [0, * 60] with \e zone = UTMUPS::UPS, 0, indicating UPS (but the resulting * string does not contain "0"). \e zone may also be UTMUPS::INVALID, in * which case the returned string is "inv". This reverses * UTMUPS::DecodeZone. **********************************************************************/ static std::string EncodeZone(int zone, bool northp, bool abbrev = true); /** * Decode EPSG. * * @param[in] epsg the EPSG code. * @param[out] zone the UTM zone (zero means UPS). * @param[out] northp hemisphere (true means north, false means south). * * EPSG (European Petroleum Survery Group) codes are a way to refer to many * different projections. DecodeEPSG decodes those referring to UTM or UPS * projections for the WGS84 ellipsoid. If the code does not refer to one * of these projections, \e zone is set to UTMUPS::INVALID. See * https://www.spatialreference.org/ref/epsg/ **********************************************************************/ static void DecodeEPSG(int epsg, int& zone, bool& northp); /** * Encode zone as EPSG. * * @param[in] zone the UTM zone (zero means UPS). * @param[in] northp hemisphere (true means north, false means south). * @return EPSG code (or -1 if \e zone is not in the range * [UTMUPS::MINZONE, UTMUPS::MAXZONE] = [0, 60]) * * Convert \e zone and \e northp to the corresponding EPSG (European * Petroleum Survery Group) codes **********************************************************************/ static int EncodeEPSG(int zone, bool northp); /** * @return shift (meters) necessary to align north and south halves of a * UTM zone (107). **********************************************************************/ static Math::real UTMShift(); /** \name Inspector functions **********************************************************************/ ///@{ /** * @return \e a the equatorial radius of the WGS84 ellipsoid (meters). * * (The WGS84 value is returned because the UTM and UPS projections are * based on this ellipsoid.) **********************************************************************/ static Math::real EquatorialRadius() { return Constants::WGS84_a(); } /** * @return \e f the flattening of the WGS84 ellipsoid. * * (The WGS84 value is returned because the UTM and UPS projections are * based on this ellipsoid.) **********************************************************************/ static Math::real Flattening() { return Constants::WGS84_f(); } ///@} }; } // namespace GeographicLib #endif // GEOGRAPHICLIB_UTMUPS_HPP geosphere/src/GeoCoords.cpp0000644000176200001440000001375314323376011015423 0ustar liggesusers/** * \file GeoCoords.cpp * \brief Implementation for GeographicLib::GeoCoords class * * Copyright (c) Charles Karney (2008-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #include "GeoCoords.h" #include "MGRS.h" #include "DMS.h" #include "Utility.h" namespace GeographicLib { using namespace std; void GeoCoords::Reset(const std::string& s, bool centerp, bool longfirst) { vector sa; const char* spaces = " \t\n\v\f\r,"; // Include comma as a space for (string::size_type pos0 = 0, pos1; pos0 != string::npos;) { pos1 = s.find_first_not_of(spaces, pos0); if (pos1 == string::npos) break; pos0 = s.find_first_of(spaces, pos1); sa.push_back(s.substr(pos1, pos0 == string::npos ? pos0 : pos0 - pos1)); } if (sa.size() == 1) { int prec; MGRS::Reverse(sa[0], _zone, _northp, _easting, _northing, prec, centerp); UTMUPS::Reverse(_zone, _northp, _easting, _northing, _lat, _long, _gamma, _k); } else if (sa.size() == 2) { DMS::DecodeLatLon(sa[0], sa[1], _lat, _long, longfirst); UTMUPS::Forward( _lat, _long, _zone, _northp, _easting, _northing, _gamma, _k); } else if (sa.size() == 3) { unsigned zoneind, coordind; if (sa[0].size() > 0 && isalpha(sa[0][sa[0].size() - 1])) { zoneind = 0; coordind = 1; } else if (sa[2].size() > 0 && isalpha(sa[2][sa[2].size() - 1])) { zoneind = 2; coordind = 0; } else throw GeographicErr("Neither " + sa[0] + " nor " + sa[2] + " of the form UTM/UPS Zone + Hemisphere" + " (ex: 38n, 09s, n)"); UTMUPS::DecodeZone(sa[zoneind], _zone, _northp); for (unsigned i = 0; i < 2; ++i) (i ? _northing : _easting) = Utility::val(sa[coordind + i]); UTMUPS::Reverse(_zone, _northp, _easting, _northing, _lat, _long, _gamma, _k); FixHemisphere(); } else throw GeographicErr("Coordinate requires 1, 2, or 3 elements"); CopyToAlt(); } string GeoCoords::GeoRepresentation(int prec, bool longfirst) const { using std::isnan; // Needed for Centos 7, ubuntu 14 prec = max(0, min(9 + Math::extra_digits(), prec) + 5); return Utility::str(longfirst ? _long : _lat, prec) + " " + Utility::str(longfirst ? _lat : _long, prec); } string GeoCoords::DMSRepresentation(int prec, bool longfirst, char dmssep) const { prec = max(0, min(10 + Math::extra_digits(), prec) + 5); return DMS::Encode(longfirst ? _long : _lat, unsigned(prec), longfirst ? DMS::LONGITUDE : DMS::LATITUDE, dmssep) + " " + DMS::Encode(longfirst ? _lat : _long, unsigned(prec), longfirst ? DMS::LATITUDE : DMS::LONGITUDE, dmssep); } string GeoCoords::MGRSRepresentation(int prec) const { // Max precision is um prec = max(-1, min(6, prec) + 5); string mgrs; MGRS::Forward(_zone, _northp, _easting, _northing, _lat, prec, mgrs); return mgrs; } string GeoCoords::AltMGRSRepresentation(int prec) const { // Max precision is um prec = max(-1, min(6, prec) + 5); string mgrs; MGRS::Forward(_alt_zone, _northp, _alt_easting, _alt_northing, _lat, prec, mgrs); return mgrs; } void GeoCoords::UTMUPSString(int zone, bool northp, real easting, real northing, int prec, bool abbrev, string& utm) { ostringstream os; prec = max(-5, min(9 + Math::extra_digits(), prec)); // Need extra real because, since C++11, pow(float, int) returns double real scale = prec < 0 ? real(pow(real(10), -prec)) : real(1); os << UTMUPS::EncodeZone(zone, northp, abbrev) << fixed << setfill('0'); if (isfinite(easting)) { os << " " << Utility::str(easting / scale, max(0, prec)); if (prec < 0 && fabs(easting / scale) > real(0.5)) os << setw(-prec) << 0; } else os << " nan"; if (isfinite(northing)) { os << " " << Utility::str(northing / scale, max(0, prec)); if (prec < 0 && fabs(northing / scale) > real(0.5)) os << setw(-prec) << 0; } else os << " nan"; utm = os.str(); } string GeoCoords::UTMUPSRepresentation(int prec, bool abbrev) const { string utm; UTMUPSString(_zone, _northp, _easting, _northing, prec, abbrev, utm); return utm; } string GeoCoords::UTMUPSRepresentation(bool northp, int prec, bool abbrev) const { real e, n; int z; UTMUPS::Transfer(_zone, _northp, _easting, _northing, _zone, northp, e, n, z); string utm; UTMUPSString(_zone, northp, e, n, prec, abbrev, utm); return utm; } string GeoCoords::AltUTMUPSRepresentation(int prec, bool abbrev) const { string utm; UTMUPSString(_alt_zone, _northp, _alt_easting, _alt_northing, prec, abbrev, utm); return utm; } string GeoCoords::AltUTMUPSRepresentation(bool northp, int prec, bool abbrev) const { real e, n; int z; UTMUPS::Transfer(_alt_zone, _northp, _alt_easting, _alt_northing, _alt_zone, northp, e, n, z); string utm; UTMUPSString(_alt_zone, northp, e, n, prec, abbrev, utm); return utm; } void GeoCoords::FixHemisphere() { using std::isnan; // Needed for Centos 7, ubuntu 14 if (_lat == 0 || (_northp && _lat >= 0) || (!_northp && _lat < 0) || isnan(_lat)) // Allow either hemisphere for equator return; if (_zone != UTMUPS::UPS) { _northing += (_northp ? 1 : -1) * UTMUPS::UTMShift(); _northp = !_northp; } else throw GeographicErr("Hemisphere mixup"); } } // namespace GeographicLib geosphere/src/Geocentric.h0000644000176200001440000002573614323377037015303 0ustar liggesusers/** * \file Geocentric.hpp * \brief Header for GeographicLib::Geocentric class * * Copyright (c) Charles Karney (2008-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #if !defined(GEOGRAPHICLIB_GEOCENTRIC_HPP) #define GEOGRAPHICLIB_GEOCENTRIC_HPP 1 #include #include "Constants.h" namespace GeographicLib { /** * \brief %Geocentric coordinates * * Convert between geodetic coordinates latitude = \e lat, longitude = \e * lon, height = \e h (measured vertically from the surface of the ellipsoid) * to geocentric coordinates (\e X, \e Y, \e Z). The origin of geocentric * coordinates is at the center of the earth. The \e Z axis goes thru the * north pole, \e lat = 90°. The \e X axis goes thru \e lat = 0, * \e lon = 0. %Geocentric coordinates are also known as earth centered, * earth fixed (ECEF) coordinates. * * The conversion from geographic to geocentric coordinates is * straightforward. For the reverse transformation we use * - H. Vermeille, * Direct * transformation from geocentric coordinates to geodetic coordinates, * J. Geodesy 76, 451--454 (2002). * . * Several changes have been made to ensure that the method returns accurate * results for all finite inputs (even if \e h is infinite). The changes are * described in Appendix B of * - C. F. F. Karney, * Geodesics * on an ellipsoid of revolution, * Feb. 2011; * preprint * arxiv:1102.1215v1. * . * Vermeille similarly updated his method in * - H. Vermeille, * * An analytical method to transform geocentric into * geodetic coordinates, J. Geodesy 85, 105--117 (2011). * . * See \ref geocentric for more information. * * The errors in these routines are close to round-off. Specifically, for * points within 5000 km of the surface of the ellipsoid (either inside or * outside the ellipsoid), the error is bounded by 7 nm (7 nanometers) for * the WGS84 ellipsoid. See \ref geocentric for further information on the * errors. * * Example of use: * \include example-Geocentric.cpp * * CartConvert is a command-line utility * providing access to the functionality of Geocentric and LocalCartesian. **********************************************************************/ class GEOGRAPHICLIB_EXPORT Geocentric { private: typedef Math::real real; friend class LocalCartesian; friend class MagneticCircle; // MagneticCircle uses Rotation friend class MagneticModel; // MagneticModel uses IntForward friend class GravityCircle; // GravityCircle uses Rotation friend class GravityModel; // GravityModel uses IntForward friend class NormalGravity; // NormalGravity uses IntForward static const size_t dim_ = 3; static const size_t dim2_ = dim_ * dim_; real _a, _f, _e2, _e2m, _e2a, _e4a, _maxrad; static void Rotation(real sphi, real cphi, real slam, real clam, real M[dim2_]); static void Rotate(const real M[dim2_], real x, real y, real z, real& X, real& Y, real& Z) { // Perform [X,Y,Z]^t = M.[x,y,z]^t // (typically local cartesian to geocentric) X = M[0] * x + M[1] * y + M[2] * z; Y = M[3] * x + M[4] * y + M[5] * z; Z = M[6] * x + M[7] * y + M[8] * z; } static void Unrotate(const real M[dim2_], real X, real Y, real Z, real& x, real& y, real& z) { // Perform [x,y,z]^t = M^t.[X,Y,Z]^t // (typically geocentric to local cartesian) x = M[0] * X + M[3] * Y + M[6] * Z; y = M[1] * X + M[4] * Y + M[7] * Z; z = M[2] * X + M[5] * Y + M[8] * Z; } void IntForward(real lat, real lon, real h, real& X, real& Y, real& Z, real M[dim2_]) const; void IntReverse(real X, real Y, real Z, real& lat, real& lon, real& h, real M[dim2_]) const; public: /** * Constructor for an ellipsoid with * * @param[in] a equatorial radius (meters). * @param[in] f flattening of ellipsoid. Setting \e f = 0 gives a sphere. * Negative \e f gives a prolate ellipsoid. * @exception GeographicErr if \e a or (1 − \e f) \e a is not * positive. **********************************************************************/ Geocentric(real a, real f); /** * A default constructor (for use by NormalGravity). **********************************************************************/ Geocentric() : _a(-1) {} /** * Convert from geodetic to geocentric coordinates. * * @param[in] lat latitude of point (degrees). * @param[in] lon longitude of point (degrees). * @param[in] h height of point above the ellipsoid (meters). * @param[out] X geocentric coordinate (meters). * @param[out] Y geocentric coordinate (meters). * @param[out] Z geocentric coordinate (meters). * * \e lat should be in the range [−90°, 90°]. **********************************************************************/ void Forward(real lat, real lon, real h, real& X, real& Y, real& Z) const { if (Init()) IntForward(lat, lon, h, X, Y, Z, NULL); } /** * Convert from geodetic to geocentric coordinates and return rotation * matrix. * * @param[in] lat latitude of point (degrees). * @param[in] lon longitude of point (degrees). * @param[in] h height of point above the ellipsoid (meters). * @param[out] X geocentric coordinate (meters). * @param[out] Y geocentric coordinate (meters). * @param[out] Z geocentric coordinate (meters). * @param[out] M if the length of the vector is 9, fill with the rotation * matrix in row-major order. * * Let \e v be a unit vector located at (\e lat, \e lon, \e h). We can * express \e v as \e column vectors in one of two ways * - in east, north, up coordinates (where the components are relative to a * local coordinate system at (\e lat, \e lon, \e h)); call this * representation \e v1. * - in geocentric \e X, \e Y, \e Z coordinates; call this representation * \e v0. * . * Then we have \e v0 = \e M ⋅ \e v1. **********************************************************************/ void Forward(real lat, real lon, real h, real& X, real& Y, real& Z, std::vector& M) const { if (!Init()) return; if (M.end() == M.begin() + dim2_) { real t[dim2_]; IntForward(lat, lon, h, X, Y, Z, t); std::copy(t, t + dim2_, M.begin()); } else IntForward(lat, lon, h, X, Y, Z, NULL); } /** * Convert from geocentric to geodetic to coordinates. * * @param[in] X geocentric coordinate (meters). * @param[in] Y geocentric coordinate (meters). * @param[in] Z geocentric coordinate (meters). * @param[out] lat latitude of point (degrees). * @param[out] lon longitude of point (degrees). * @param[out] h height of point above the ellipsoid (meters). * * In general, there are multiple solutions and the result which minimizes * |h |is returned, i.e., (lat, lon) corresponds to * the closest point on the ellipsoid. If there are still multiple * solutions with different latitudes (applies only if \e Z = 0), then the * solution with \e lat > 0 is returned. If there are still multiple * solutions with different longitudes (applies only if \e X = \e Y = 0) * then \e lon = 0 is returned. The value of \e h returned satisfies \e h * ≥ − \e a (1 − e2) / sqrt(1 − * e2 sin2\e lat). The value of \e lon * returned is in the range [−180°, 180°]. **********************************************************************/ void Reverse(real X, real Y, real Z, real& lat, real& lon, real& h) const { if (Init()) IntReverse(X, Y, Z, lat, lon, h, NULL); } /** * Convert from geocentric to geodetic to coordinates. * * @param[in] X geocentric coordinate (meters). * @param[in] Y geocentric coordinate (meters). * @param[in] Z geocentric coordinate (meters). * @param[out] lat latitude of point (degrees). * @param[out] lon longitude of point (degrees). * @param[out] h height of point above the ellipsoid (meters). * @param[out] M if the length of the vector is 9, fill with the rotation * matrix in row-major order. * * Let \e v be a unit vector located at (\e lat, \e lon, \e h). We can * express \e v as \e column vectors in one of two ways * - in east, north, up coordinates (where the components are relative to a * local coordinate system at (\e lat, \e lon, \e h)); call this * representation \e v1. * - in geocentric \e X, \e Y, \e Z coordinates; call this representation * \e v0. * . * Then we have \e v1 = MT ⋅ \e v0, where * MT is the transpose of \e M. **********************************************************************/ void Reverse(real X, real Y, real Z, real& lat, real& lon, real& h, std::vector& M) const { if (!Init()) return; if (M.end() == M.begin() + dim2_) { real t[dim2_]; IntReverse(X, Y, Z, lat, lon, h, t); std::copy(t, t + dim2_, M.begin()); } else IntReverse(X, Y, Z, lat, lon, h, NULL); } /** \name Inspector functions **********************************************************************/ ///@{ /** * @return true if the object has been initialized. **********************************************************************/ bool Init() const { return _a > 0; } /** * @return \e a the equatorial radius of the ellipsoid (meters). This is * the value used in the constructor. **********************************************************************/ Math::real EquatorialRadius() const { return Init() ? _a : Math::NaN(); } /** * @return \e f the flattening of the ellipsoid. This is the * value used in the constructor. **********************************************************************/ Math::real Flattening() const { return Init() ? _f : Math::NaN(); } ///@} /** * A global instantiation of Geocentric with the parameters for the WGS84 * ellipsoid. **********************************************************************/ static const Geocentric& WGS84(); }; } // namespace GeographicLib #endif // GEOGRAPHICLIB_GEOCENTRIC_HPP geosphere/src/DST.h0000644000176200001440000001355114323400722013627 0ustar liggesusers/** * \file DST.hpp * \brief Header for GeographicLib::DST class * * Copyright (c) Charles Karney (2022) and licensed under * the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #if !defined(GEOGRAPHICLIB_DST_HPP) #define GEOGRAPHICLIB_DST_HPP 1 #include "Constants.h" #include #include template class kissfft; namespace GeographicLib { /** * \brief Discrete sine transforms * * This decomposes periodic functions \f$ f(\sigma) \f$ (period \f$ 2\pi \f$) * which are odd about \f$ \sigma = 0 \f$ and even about \f$ \sigma = \frac12 * \pi \f$ into a Fourier series * \f[ * f(\sigma) = \sum_{l=0}^\infty F_l \sin\bigl((2l+1)\sigma\bigr). * \f] * * The first \f$ N \f$ components of \f$ F_l \f$, for \f$0 \le l < N\f$ may * be approximated by * \f[ * F_l = \frac2N \sum_{j=1}^{N} * p_j f(\sigma_j) \sin\bigl((2l+1)\sigma_j\bigr), * \f] * where \f$ \sigma_j = j\pi/(2N) \f$ and \f$ p_j = \frac12 \f$ for \f$ j = N * \f$ and \f$ 1 \f$ otherwise. \f$ F_l \f$ is a discrete sine transform of * type DST-III and may be conveniently computed using the fast Fourier * transform, FFT; this is implemented with the DST::transform method. * * Having computed \f$ F_l \f$ based on \f$ N \f$ evaluations of \f$ * f(\sigma) \f$ at \f$ \sigma_j = j\pi/(2N) \f$, it is possible to * refine these transform values and add another \f$ N \f$ coefficients by * evaluating \f$ f(\sigma) \f$ at \f$ (j-\frac12)\pi/(2N) \f$; this is * implemented with the DST::refine method. * * Here we compute FFTs using the kissfft package * https://github.com/mborgerding/kissfft by Mark Borgerding. * * Example of use: * \include example-DST.cpp * * \note The FFTW package https://www.fftw.org/ can also be used. However * this is a more complicated dependency, its CMake support is broken, and it * doesn't work with mpreals (GEOGRAPHICLIB_PRECISION = 5). **********************************************************************/ class DST { private: typedef Math::real real; int _N; typedef kissfft fft_t; std::shared_ptr _fft; // Implement DST-III (centerp = false) or DST-IV (centerp = true) void fft_transform(real data[], real F[], bool centerp) const; // Add another N terms to F void fft_transform2(real data[], real F[]) const; public: /** * Constructor specifying the number of points to use. * @param[in] N the number of points to use. **********************************************************************/ GEOGRAPHICLIB_EXPORT DST(int N = 0); /** * Reset the given number of points. * @param[in] N the number of points to use. **********************************************************************/ void GEOGRAPHICLIB_EXPORT reset(int N); /** * Return the number of points. * @return the number of points to use. **********************************************************************/ int N() const { return _N; } /** * Determine first \e N terms in the Fourier series * @param[in] f the function used for evaluation. * @param[out] F the first \e N coefficients of the Fourier series. * * The evaluates \f$ f(\sigma) \f$ at \f$ \sigma = (j + 1) \pi / (2 N) \f$ * for integer \f$ j \in [0, N) \f$. \e F should be an array of length at * least \e N. **********************************************************************/ void GEOGRAPHICLIB_EXPORT transform(std::function f, real F[]) const; /** * Refine the Fourier series by doubling the number of points sampled * @param[in] f the function used for evaluation. * @param[inout] F on input the first \e N coefficents of the Fourier * series; on output the refined transform based on 2\e N points, i.e., * the first 2\e N coefficents. * * The evaluates \f$ f(\sigma) \f$ at additional points \f$ \sigma = (j + * \frac12) \pi / (2 N) \f$ for integer \f$ j \in [0, N) \f$, computes the * DST-IV transform of these, and combines this with the input \e F to * compute the 2\e N term DST-III discrete sine transform. This is * equivalent to calling transform with twice the value of \e N but is more * efficient, given that the \e N term coefficients are already known. See * the example code above. **********************************************************************/ void GEOGRAPHICLIB_EXPORT refine(std::function f, real F[]) const; /** * Evaluate the Fourier sum given the sine and cosine of the angle * @param[in] sinx sinσ. * @param[in] cosx cosσ. * @param[in] F the array of Fourier coefficients. * @param[in] N the number of Fourier coefficients. * @return the value of the Fourier sum. **********************************************************************/ static real GEOGRAPHICLIB_EXPORT eval(real sinx, real cosx, const real F[], int N); /** * Evaluate the integral of Fourier sum given the sine and cosine of the * angle * @param[in] sinx sinσ. * @param[in] cosx cosσ. * @param[in] F the array of Fourier coefficients. * @param[in] N the number of Fourier coefficients. * @return the value of the integral. * * The constant of integration is chosen so that the integral is zero at * \f$ \sigma = \frac12\pi \f$. **********************************************************************/ static real GEOGRAPHICLIB_EXPORT integral(real sinx, real cosx, const real F[], int N); }; } // namespace GeographicLib #endif // GEOGRAPHICLIB_DST_HPP geosphere/src/SphericalHarmonic.h0000644000176200001440000003524314323400147016573 0ustar liggesusers/** * \file SphericalHarmonic.hpp * \brief Header for GeographicLib::SphericalHarmonic class * * Copyright (c) Charles Karney (2011-2019) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #if !defined(GEOGRAPHICLIB_SPHERICALHARMONIC_HPP) #define GEOGRAPHICLIB_SPHERICALHARMONIC_HPP 1 #include #include "Constants.h" #include "SphericalEngine.h" #include "CircularEngine.h" namespace GeographicLib { /** * \brief Spherical harmonic series * * This class evaluates the spherical harmonic sum \verbatim V(x, y, z) = sum(n = 0..N)[ q^(n+1) * sum(m = 0..n)[ (C[n,m] * cos(m*lambda) + S[n,m] * sin(m*lambda)) * P[n,m](cos(theta)) ] ] \endverbatim * where * - p2 = x2 + y2, * - r2 = p2 + z2, * - \e q = a/r, * - θ = atan2(\e p, \e z) = the spherical \e colatitude, * - λ = atan2(\e y, \e x) = the longitude. * - Pnm(\e t) is the associated Legendre polynomial of * degree \e n and order \e m. * * Two normalizations are supported for Pnm * - fully normalized denoted by SphericalHarmonic::FULL. * - Schmidt semi-normalized denoted by SphericalHarmonic::SCHMIDT. * * Clenshaw summation is used for the sums over both \e n and \e m. This * allows the computation to be carried out without the need for any * temporary arrays. See SphericalEngine.cpp for more information on the * implementation. * * References: * - C. W. Clenshaw, * * A note on the summation of Chebyshev series, * %Math. Tables Aids Comput. 9(51), 118--120 (1955). * - R. E. Deakin, Derivatives of the earth's potentials, Geomatics * Research Australasia 68, 31--60, (June 1998). * - W. A. Heiskanen and H. Moritz, Physical Geodesy, (Freeman, San * Francisco, 1967). (See Sec. 1-14, for a definition of Pbar.) * - S. A. Holmes and W. E. Featherstone, * * A unified approach to the Clenshaw summation and the recursive * computation of very high degree and order normalised associated Legendre * functions, J. Geodesy 76(5), 279--299 (2002). * - C. C. Tscherning and K. Poder, * * Some geodetic applications of Clenshaw summation, * Boll. Geod. Sci. Aff. 41(4), 349--375 (1982). * * Example of use: * \include example-SphericalHarmonic.cpp **********************************************************************/ class GEOGRAPHICLIB_EXPORT SphericalHarmonic { public: /** * Supported normalizations for the associated Legendre polynomials. **********************************************************************/ enum normalization { /** * Fully normalized associated Legendre polynomials. * * These are defined by * Pnmfull(\e z) * = (−1)m * sqrt(\e k (2\e n + 1) (\e n − \e m)! / (\e n + \e m)!) * Pnm(\e z), where * Pnm(\e z) is Ferrers * function (also known as the Legendre function on the cut or the * associated Legendre polynomial) https://dlmf.nist.gov/14.7.E10 and * \e k = 1 for \e m = 0 and \e k = 2 otherwise. * * The mean squared value of * Pnmfull(cosθ) * cos(mλ) and * Pnmfull(cosθ) * sin(mλ) over the sphere is 1. * * @hideinitializer **********************************************************************/ FULL = SphericalEngine::FULL, /** * Schmidt semi-normalized associated Legendre polynomials. * * These are defined by * Pnmschmidt(\e z) * = (−1)m * sqrt(\e k (\e n − \e m)! / (\e n + \e m)!) * Pnm(\e z), where * Pnm(\e z) is Ferrers * function (also known as the Legendre function on the cut or the * associated Legendre polynomial) https://dlmf.nist.gov/14.7.E10 and * \e k = 1 for \e m = 0 and \e k = 2 otherwise. * * The mean squared value of * Pnmschmidt(cosθ) * cos(mλ) and * Pnmschmidt(cosθ) * sin(mλ) over the sphere is 1/(2\e n + 1). * * @hideinitializer **********************************************************************/ SCHMIDT = SphericalEngine::SCHMIDT, }; private: typedef Math::real real; SphericalEngine::coeff _c[1]; real _a; unsigned _norm; public: /** * Constructor with a full set of coefficients specified. * * @param[in] C the coefficients Cnm. * @param[in] S the coefficients Snm. * @param[in] N the maximum degree and order of the sum * @param[in] a the reference radius appearing in the definition of the * sum. * @param[in] norm the normalization for the associated Legendre * polynomials, either SphericalHarmonic::FULL (the default) or * SphericalHarmonic::SCHMIDT. * @exception GeographicErr if \e N does not satisfy \e N ≥ −1. * @exception GeographicErr if \e C or \e S is not big enough to hold the * coefficients. * * The coefficients Cnm and * Snm are stored in the one-dimensional vectors * \e C and \e S which must contain (\e N + 1)(\e N + 2)/2 and \e N (\e N + * 1)/2 elements, respectively, stored in "column-major" order. Thus for * \e N = 3, the order would be: * C00, * C10, * C20, * C30, * C11, * C21, * C31, * C22, * C32, * C33. * In general the (\e n,\e m) element is at index \e m \e N − \e m * (\e m − 1)/2 + \e n. The layout of \e S is the same except that * the first column is omitted (since the \e m = 0 terms never contribute * to the sum) and the 0th element is S11 * * The class stores pointers to the first elements of \e C and \e S. * These arrays should not be altered or destroyed during the lifetime of a * SphericalHarmonic object. **********************************************************************/ SphericalHarmonic(const std::vector& C, const std::vector& S, int N, real a, unsigned norm = FULL) : _a(a) , _norm(norm) { _c[0] = SphericalEngine::coeff(C, S, N); } /** * Constructor with a subset of coefficients specified. * * @param[in] C the coefficients Cnm. * @param[in] S the coefficients Snm. * @param[in] N the degree used to determine the layout of \e C and \e S. * @param[in] nmx the maximum degree used in the sum. The sum over \e n is * from 0 thru \e nmx. * @param[in] mmx the maximum order used in the sum. The sum over \e m is * from 0 thru min(\e n, \e mmx). * @param[in] a the reference radius appearing in the definition of the * sum. * @param[in] norm the normalization for the associated Legendre * polynomials, either SphericalHarmonic::FULL (the default) or * SphericalHarmonic::SCHMIDT. * @exception GeographicErr if \e N, \e nmx, and \e mmx do not satisfy * \e N ≥ \e nmx ≥ \e mmx ≥ −1. * @exception GeographicErr if \e C or \e S is not big enough to hold the * coefficients. * * The class stores pointers to the first elements of \e C and \e S. * These arrays should not be altered or destroyed during the lifetime of a * SphericalHarmonic object. **********************************************************************/ SphericalHarmonic(const std::vector& C, const std::vector& S, int N, int nmx, int mmx, real a, unsigned norm = FULL) : _a(a) , _norm(norm) { _c[0] = SphericalEngine::coeff(C, S, N, nmx, mmx); } /** * A default constructor so that the object can be created when the * constructor for another object is initialized. This default object can * then be reset with the default copy assignment operator. **********************************************************************/ SphericalHarmonic() {} /** * Compute the spherical harmonic sum. * * @param[in] x cartesian coordinate. * @param[in] y cartesian coordinate. * @param[in] z cartesian coordinate. * @return \e V the spherical harmonic sum. * * This routine requires constant memory and thus never throws an * exception. **********************************************************************/ Math::real operator()(real x, real y, real z) const { real f[] = {1}; real v = 0; real dummy; switch (_norm) { case FULL: v = SphericalEngine::Value (_c, f, x, y, z, _a, dummy, dummy, dummy); break; case SCHMIDT: default: // To avoid compiler warnings v = SphericalEngine::Value (_c, f, x, y, z, _a, dummy, dummy, dummy); break; } return v; } /** * Compute a spherical harmonic sum and its gradient. * * @param[in] x cartesian coordinate. * @param[in] y cartesian coordinate. * @param[in] z cartesian coordinate. * @param[out] gradx \e x component of the gradient * @param[out] grady \e y component of the gradient * @param[out] gradz \e z component of the gradient * @return \e V the spherical harmonic sum. * * This is the same as the previous function, except that the components of * the gradients of the sum in the \e x, \e y, and \e z directions are * computed. This routine requires constant memory and thus never throws * an exception. **********************************************************************/ Math::real operator()(real x, real y, real z, real& gradx, real& grady, real& gradz) const { real f[] = {1}; real v = 0; switch (_norm) { case FULL: v = SphericalEngine::Value (_c, f, x, y, z, _a, gradx, grady, gradz); break; case SCHMIDT: default: // To avoid compiler warnings v = SphericalEngine::Value (_c, f, x, y, z, _a, gradx, grady, gradz); break; } return v; } /** * Create a CircularEngine to allow the efficient evaluation of several * points on a circle of latitude. * * @param[in] p the radius of the circle. * @param[in] z the height of the circle above the equatorial plane. * @param[in] gradp if true the returned object will be able to compute the * gradient of the sum. * @exception std::bad_alloc if the memory for the CircularEngine can't be * allocated. * @return the CircularEngine object. * * SphericalHarmonic::operator()() exchanges the order of the sums in the * definition, i.e., ∑n = 0..N * ∑m = 0..n becomes ∑m = * 0..Nn = m..N. * SphericalHarmonic::Circle performs the inner sum over degree \e n (which * entails about N2 operations). Calling * CircularEngine::operator()() on the returned object performs the outer * sum over the order \e m (about \e N operations). * * Here's an example of computing the spherical sum at a sequence of * longitudes without using a CircularEngine object \code SphericalHarmonic h(...); // Create the SphericalHarmonic object double r = 2, lat = 33, lon0 = 44, dlon = 0.01; double phi = lat * Math::degree(), z = r * sin(phi), p = r * cos(phi); for (int i = 0; i <= 100; ++i) { real lon = lon0 + i * dlon, lam = lon * Math::degree(); std::cout << lon << " " << h(p * cos(lam), p * sin(lam), z) << "\n"; } \endcode * Here is the same calculation done using a CircularEngine object. This * will be about N/2 times faster. \code SphericalHarmonic h(...); // Create the SphericalHarmonic object double r = 2, lat = 33, lon0 = 44, dlon = 0.01; double phi = lat * Math::degree(), z = r * sin(phi), p = r * cos(phi); CircularEngine c(h(p, z, false)); // Create the CircularEngine object for (int i = 0; i <= 100; ++i) { real lon = lon0 + i * dlon; std::cout << lon << " " << c(lon) << "\n"; } \endcode **********************************************************************/ CircularEngine Circle(real p, real z, bool gradp) const { real f[] = {1}; switch (_norm) { case FULL: return gradp ? SphericalEngine::Circle (_c, f, p, z, _a) : SphericalEngine::Circle (_c, f, p, z, _a); break; case SCHMIDT: default: // To avoid compiler warnings return gradp ? SphericalEngine::Circle (_c, f, p, z, _a) : SphericalEngine::Circle (_c, f, p, z, _a); break; } } /** * @return the zeroth SphericalEngine::coeff object. **********************************************************************/ const SphericalEngine::coeff& Coefficients() const { return _c[0]; } }; } // namespace GeographicLib #endif // GEOGRAPHICLIB_SPHERICALHARMONIC_HPP geosphere/src/NormalGravity.h0000644000176200001440000004402514323377037016007 0ustar liggesusers/** * \file NormalGravity.hpp * \brief Header for GeographicLib::NormalGravity class * * Copyright (c) Charles Karney (2011-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #if !defined(GEOGRAPHICLIB_NORMALGRAVITY_HPP) #define GEOGRAPHICLIB_NORMALGRAVITY_HPP 1 #include "Constants.h" #include "Geocentric.h" namespace GeographicLib { /** * \brief The normal gravity of the earth * * "Normal" gravity refers to an idealization of the earth which is modeled * as an rotating ellipsoid. The eccentricity of the ellipsoid, the rotation * speed, and the distribution of mass within the ellipsoid are such that the * ellipsoid is a "level ellipoid", a surface of constant potential * (gravitational plus centrifugal). The acceleration due to gravity is * therefore perpendicular to the surface of the ellipsoid. * * Because the distribution of mass within the ellipsoid is unspecified, only * the potential exterior to the ellipsoid is well defined. In this class, * the mass is assumed to be to concentrated on a "focal disc" of radius, * (a2b2)1/2, where * \e a is the equatorial radius of the ellipsoid and \e b is its polar * semi-axis. In the case of an oblate ellipsoid, the mass is concentrated * on a "focal rod" of length 2(b2 − * a2)1/2. As a result the potential is well * defined everywhere. * * There is a closed solution to this problem which is implemented here. * Series "approximations" are only used to evaluate certain combinations of * elementary functions where use of the closed expression results in a loss * of accuracy for small arguments due to cancellation of the leading terms. * However these series include sufficient terms to give full machine * precision. * * Although the formulation used in this class applies to ellipsoids with * arbitrary flattening, in practice, its use should be limited to about * b/\e a ∈ [0.01, 100] or \e f ∈ [−99, 0.99]. * * Definitions: * - V0, the gravitational contribution to the normal * potential; * - Φ, the rotational contribution to the normal potential; * - \e U = V0 + Φ, the total potential; * - Γ = ∇V0, the acceleration due to * mass of the earth; * - f = ∇Φ, the centrifugal acceleration; * - γ = ∇\e U = Γ + f, the normal * acceleration; * - \e X, \e Y, \e Z, geocentric coordinates; * - \e x, \e y, \e z, local cartesian coordinates used to denote the east, * north and up directions. * * References: * - C. Somigliana, Teoria generale del campo gravitazionale dell'ellissoide * di rotazione, Mem. Soc. Astron. Ital, 4, 541--599 (1929). * - W. A. Heiskanen and H. Moritz, Physical Geodesy (Freeman, San * Francisco, 1967), Secs. 1-19, 2-7, 2-8 (2-9, 2-10), 6-2 (6-3). * - B. Hofmann-Wellenhof, H. Moritz, Physical Geodesy (Second edition, * Springer, 2006) https://doi.org/10.1007/978-3-211-33545-1 * - H. Moritz, Geodetic Reference System 1980, J. Geodesy 54(3), 395-405 * (1980) https://doi.org/10.1007/BF02521480 * * For more information on normal gravity see \ref normalgravity. * * Example of use: * \include example-NormalGravity.cpp **********************************************************************/ class GEOGRAPHICLIB_EXPORT NormalGravity { private: static const int maxit_ = 20; typedef Math::real real; friend class GravityModel; real _a, _gGM, _omega, _f, _jJ2, _omega2, _aomega2; real _e2, _ep2, _b, _eE, _uU0, _gammae, _gammap, _qQ0, _k, _fstar; Geocentric _earth; static real atanzz(real x, bool alt) { // This routine obeys the identity // atanzz(x, alt) = atanzz(-x/(1+x), !alt) // // Require x >= -1. Best to call with alt, s.t. x >= 0; this results in // a call to atan, instead of asin, or to asinh, instead of atanh. using std::sqrt; using std::fabs; using std::atan; using std::asin; using std::asinh; using std::atanh; real z = sqrt(fabs(x)); return x == 0 ? 1 : (alt ? (!(x < 0) ? asinh(z) : asin(z)) / sqrt(fabs(x) / (1 + x)) : (!(x < 0) ? atan(z) : atanh(z)) / z); } static real atan7series(real x); static real atan5series(real x); static real Qf(real x, bool alt); static real Hf(real x, bool alt); static real QH3f(real x, bool alt); real Jn(int n) const; void Initialize(real a, real GM, real omega, real f_J2, bool geometricp); public: /** \name Setting up the normal gravity **********************************************************************/ ///@{ /** * Constructor for the normal gravity. * * @param[in] a equatorial radius (meters). * @param[in] GM mass constant of the ellipsoid * (meters3/seconds2); this is the product of \e G * the gravitational constant and \e M the mass of the earth (usually * including the mass of the earth's atmosphere). * @param[in] omega the angular velocity (rad s−1). * @param[in] f_J2 either the flattening of the ellipsoid \e f or the * the dynamical form factor \e J2. * @param[out] geometricp if true (the default), then \e f_J2 denotes the * flattening, else it denotes the dynamical form factor \e J2. * @exception if \e a is not positive or if the other parameters do not * obey the restrictions given below. * * The shape of the ellipsoid can be given in one of two ways: * - geometrically (\e geomtricp = true), the ellipsoid is defined by the * flattening \e f = (\e a − \e b) / \e a, where \e a and \e b are * the equatorial radius and the polar semi-axis. The parameters should * obey \e a > 0, \e f < 1. There are no restrictions on \e GM or * \e omega, in particular, \e GM need not be positive. * - physically (\e geometricp = false), the ellipsoid is defined by the * dynamical form factor J2 = (\e C − \e A) / * Ma2, where \e A and \e C are the equatorial and * polar moments of inertia and \e M is the mass of the earth. The * parameters should obey \e a > 0, \e GM > 0 and \e J2 < 1/3 * − (omega2a3/GM) * 8/(45π). There is no restriction on \e omega. **********************************************************************/ NormalGravity(real a, real GM, real omega, real f_J2, bool geometricp = true); /** * A default constructor for the normal gravity. This sets up an * uninitialized object and is used by GravityModel which constructs this * object before it has read in the parameters for the reference ellipsoid. **********************************************************************/ NormalGravity() : _a(-1) {} ///@} /** \name Compute the gravity **********************************************************************/ ///@{ /** * Evaluate the gravity on the surface of the ellipsoid. * * @param[in] lat the geographic latitude (degrees). * @return γ the acceleration due to gravity, positive downwards * (m s−2). * * Due to the axial symmetry of the ellipsoid, the result is independent of * the value of the longitude. This acceleration is perpendicular to the * surface of the ellipsoid. It includes the effects of the earth's * rotation. **********************************************************************/ Math::real SurfaceGravity(real lat) const; /** * Evaluate the gravity at an arbitrary point above (or below) the * ellipsoid. * * @param[in] lat the geographic latitude (degrees). * @param[in] h the height above the ellipsoid (meters). * @param[out] gammay the northerly component of the acceleration * (m s−2). * @param[out] gammaz the upward component of the acceleration * (m s−2); this is usually negative. * @return \e U the corresponding normal potential * (m2 s−2). * * Due to the axial symmetry of the ellipsoid, the result is independent of * the value of the longitude and the easterly component of the * acceleration vanishes, \e gammax = 0. The function includes the effects * of the earth's rotation. When \e h = 0, this function gives \e gammay = * 0 and the returned value matches that of NormalGravity::SurfaceGravity. **********************************************************************/ Math::real Gravity(real lat, real h, real& gammay, real& gammaz) const; /** * Evaluate the components of the acceleration due to gravity and the * centrifugal acceleration in geocentric coordinates. * * @param[in] X geocentric coordinate of point (meters). * @param[in] Y geocentric coordinate of point (meters). * @param[in] Z geocentric coordinate of point (meters). * @param[out] gammaX the \e X component of the acceleration * (m s−2). * @param[out] gammaY the \e Y component of the acceleration * (m s−2). * @param[out] gammaZ the \e Z component of the acceleration * (m s−2). * @return \e U = V0 + Φ the sum of the * gravitational and centrifugal potentials * (m2 s−2). * * The acceleration given by γ = ∇\e U = * ∇V0 + ∇Φ = Γ + f. **********************************************************************/ Math::real U(real X, real Y, real Z, real& gammaX, real& gammaY, real& gammaZ) const; /** * Evaluate the components of the acceleration due to the gravitational * force in geocentric coordinates. * * @param[in] X geocentric coordinate of point (meters). * @param[in] Y geocentric coordinate of point (meters). * @param[in] Z geocentric coordinate of point (meters). * @param[out] GammaX the \e X component of the acceleration due to the * gravitational force (m s−2). * @param[out] GammaY the \e Y component of the acceleration due to the * @param[out] GammaZ the \e Z component of the acceleration due to the * gravitational force (m s−2). * @return V0 the gravitational potential * (m2 s−2). * * This function excludes the centrifugal acceleration and is appropriate * to use for space applications. In terrestrial applications, the * function NormalGravity::U (which includes this effect) should usually be * used. **********************************************************************/ Math::real V0(real X, real Y, real Z, real& GammaX, real& GammaY, real& GammaZ) const; /** * Evaluate the centrifugal acceleration in geocentric coordinates. * * @param[in] X geocentric coordinate of point (meters). * @param[in] Y geocentric coordinate of point (meters). * @param[out] fX the \e X component of the centrifugal acceleration * (m s−2). * @param[out] fY the \e Y component of the centrifugal acceleration * (m s−2). * @return Φ the centrifugal potential (m2 * s−2). * * Φ is independent of \e Z, thus \e fZ = 0. This function * NormalGravity::U sums the results of NormalGravity::V0 and * NormalGravity::Phi. **********************************************************************/ Math::real Phi(real X, real Y, real& fX, real& fY) const; ///@} /** \name Inspector functions **********************************************************************/ ///@{ /** * @return true if the object has been initialized. **********************************************************************/ bool Init() const { return _a > 0; } /** * @return \e a the equatorial radius of the ellipsoid (meters). This is * the value used in the constructor. **********************************************************************/ Math::real EquatorialRadius() const { return Init() ? _a : Math::NaN(); } /** * @return \e GM the mass constant of the ellipsoid * (m3 s−2). This is the value used in the * constructor. **********************************************************************/ Math::real MassConstant() const { return Init() ? _gGM : Math::NaN(); } /** * @return Jn the dynamical form factors of the * ellipsoid. * * If \e n = 2 (the default), this is the value of J2 * used in the constructor. Otherwise it is the zonal coefficient of the * Legendre harmonic sum of the normal gravitational potential. Note that * Jn = 0 if \e n is odd. In most gravity * applications, fully normalized Legendre functions are used and the * corresponding coefficient is Cn0 = * −Jn / sqrt(2 \e n + 1). **********************************************************************/ Math::real DynamicalFormFactor(int n = 2) const { return Init() ? ( n == 2 ? _jJ2 : Jn(n)) : Math::NaN(); } /** * @return ω the angular velocity of the ellipsoid (rad * s−1). This is the value used in the constructor. **********************************************************************/ Math::real AngularVelocity() const { return Init() ? _omega : Math::NaN(); } /** * @return f the flattening of the ellipsoid (\e a − \e b)/\e * a. **********************************************************************/ Math::real Flattening() const { return Init() ? _f : Math::NaN(); } /** * @return γe the normal gravity at equator (m * s−2). **********************************************************************/ Math::real EquatorialGravity() const { return Init() ? _gammae : Math::NaN(); } /** * @return γp the normal gravity at poles (m * s−2). **********************************************************************/ Math::real PolarGravity() const { return Init() ? _gammap : Math::NaN(); } /** * @return f* the gravity flattening (γp − * γe) / γe. **********************************************************************/ Math::real GravityFlattening() const { return Init() ? _fstar : Math::NaN(); } /** * @return U0 the constant normal potential for the * surface of the ellipsoid (m2 s−2). **********************************************************************/ Math::real SurfacePotential() const { return Init() ? _uU0 : Math::NaN(); } /** * @return the Geocentric object used by this instance. **********************************************************************/ const Geocentric& Earth() const { return _earth; } ///@} /** * A global instantiation of NormalGravity for the WGS84 ellipsoid. **********************************************************************/ static const NormalGravity& WGS84(); /** * A global instantiation of NormalGravity for the GRS80 ellipsoid. **********************************************************************/ static const NormalGravity& GRS80(); /** * Compute the flattening from the dynamical form factor. * * @param[in] a equatorial radius (meters). * @param[in] GM mass constant of the ellipsoid * (meters3/seconds2); this is the product of \e G * the gravitational constant and \e M the mass of the earth (usually * including the mass of the earth's atmosphere). * @param[in] omega the angular velocity (rad s−1). * @param[in] J2 the dynamical form factor. * @return \e f the flattening of the ellipsoid. * * This routine requires \e a > 0, \e GM > 0, \e J2 < 1/3 − * omega2a3/GM 8/(45π). A * NaN is returned if these conditions do not hold. The restriction to * positive \e GM is made because for negative \e GM two solutions are * possible. **********************************************************************/ static Math::real J2ToFlattening(real a, real GM, real omega, real J2); /** * Compute the dynamical form factor from the flattening. * * @param[in] a equatorial radius (meters). * @param[in] GM mass constant of the ellipsoid * (meters3/seconds2); this is the product of \e G * the gravitational constant and \e M the mass of the earth (usually * including the mass of the earth's atmosphere). * @param[in] omega the angular velocity (rad s−1). * @param[in] f the flattening of the ellipsoid. * @return \e J2 the dynamical form factor. * * This routine requires \e a > 0, \e GM ≠ 0, \e f < 1. The * values of these parameters are not checked. **********************************************************************/ static Math::real FlatteningToJ2(real a, real GM, real omega, real f); }; } // namespace GeographicLib #endif // GEOGRAPHICLIB_NORMALGRAVITY_HPP geosphere/src/GravityCircle.cpp0000644000176200001440000001212114323376035016300 0ustar liggesusers/** * \file GravityCircle.cpp * \brief Implementation for GeographicLib::GravityCircle class * * Copyright (c) Charles Karney (2011-2020) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #include "GravityCircle.h" #include #include #include "Geocentric.h" namespace GeographicLib { using namespace std; GravityCircle::GravityCircle(mask caps, real a, real f, real lat, real h, real Z, real P, real cphi, real sphi, real amodel, real GMmodel, real dzonal0, real corrmult, real gamma0, real gamma, real frot, const CircularEngine& gravitational, const CircularEngine& disturbing, const CircularEngine& correction) : _caps(caps) , _a(a) , _f(f) , _lat(Math::LatFix(lat)) , _h(h) , _zZ(Z) , _pPx(P) , _invR(1 / hypot(_pPx, _zZ)) , _cpsi(_pPx * _invR) , _spsi(_zZ * _invR) , _cphi(cphi) , _sphi(sphi) , _amodel(amodel) , _gGMmodel(GMmodel) , _dzonal0(dzonal0) , _corrmult(corrmult) , _gamma0(gamma0) , _gamma(gamma) , _frot(frot) , _gravitational(gravitational) , _disturbing(disturbing) , _correction(correction) {} Math::real GravityCircle::Gravity(real lon, real& gx, real& gy, real& gz) const { real slam, clam, M[Geocentric::dim2_]; Math::sincosd(lon, slam, clam); real Wres = W(slam, clam, gx, gy, gz); Geocentric::Rotation(_sphi, _cphi, slam, clam, M); Geocentric::Unrotate(M, gx, gy, gz, gx, gy, gz); return Wres; } Math::real GravityCircle::Disturbance(real lon, real& deltax, real& deltay, real& deltaz) const { real slam, clam, M[Geocentric::dim2_]; Math::sincosd(lon, slam, clam); real Tres = InternalT(slam, clam, deltax, deltay, deltaz, true, true); Geocentric::Rotation(_sphi, _cphi, slam, clam, M); Geocentric::Unrotate(M, deltax, deltay, deltaz, deltax, deltay, deltaz); return Tres; } Math::real GravityCircle::GeoidHeight(real lon) const { if ((_caps & GEOID_HEIGHT) != GEOID_HEIGHT) return Math::NaN(); real slam, clam, dummy; Math::sincosd(lon, slam, clam); real T = InternalT(slam, clam, dummy, dummy, dummy, false, false); real correction = _corrmult * _correction(slam, clam); return T/_gamma0 + correction; } void GravityCircle::SphericalAnomaly(real lon, real& Dg01, real& xi, real& eta) const { if ((_caps & SPHERICAL_ANOMALY) != SPHERICAL_ANOMALY) { Dg01 = xi = eta = Math::NaN(); return; } real slam, clam; Math::sincosd(lon, slam, clam); real deltax, deltay, deltaz, T = InternalT(slam, clam, deltax, deltay, deltaz, true, false); // Rotate cartesian into spherical coordinates real MC[Geocentric::dim2_]; Geocentric::Rotation(_spsi, _cpsi, slam, clam, MC); Geocentric::Unrotate(MC, deltax, deltay, deltaz, deltax, deltay, deltaz); // H+M, Eq 2-151c Dg01 = - deltaz - 2 * T * _invR; xi = -(deltay/_gamma) / Math::degree(); eta = -(deltax/_gamma) / Math::degree(); } Math::real GravityCircle::W(real slam, real clam, real& gX, real& gY, real& gZ) const { real Wres = V(slam, clam, gX, gY, gZ) + _frot * _pPx / 2; gX += _frot * clam; gY += _frot * slam; return Wres; } Math::real GravityCircle::V(real slam, real clam, real& GX, real& GY, real& GZ) const { if ((_caps & GRAVITY) != GRAVITY) { GX = GY = GZ = Math::NaN(); return Math::NaN(); } real Vres = _gravitational(slam, clam, GX, GY, GZ), f = _gGMmodel / _amodel; Vres *= f; GX *= f; GY *= f; GZ *= f; return Vres; } Math::real GravityCircle::InternalT(real slam, real clam, real& deltaX, real& deltaY, real& deltaZ, bool gradp, bool correct) const { if (gradp) { if ((_caps & DISTURBANCE) != DISTURBANCE) { deltaX = deltaY = deltaZ = Math::NaN(); return Math::NaN(); } } else { if ((_caps & DISTURBING_POTENTIAL) != DISTURBING_POTENTIAL) return Math::NaN(); } if (_dzonal0 == 0) correct = false; real T = (gradp ? _disturbing(slam, clam, deltaX, deltaY, deltaZ) : _disturbing(slam, clam)); T = (T / _amodel - (correct ? _dzonal0 : 0) * _invR) * _gGMmodel; if (gradp) { real f = _gGMmodel / _amodel; deltaX *= f; deltaY *= f; deltaZ *= f; if (correct) { real r3 = _gGMmodel * _dzonal0 * _invR * _invR * _invR; deltaX += _pPx * clam * r3; deltaY += _pPx * slam * r3; deltaZ += _zZ * r3; } } return T; } } // namespace GeographicLib geosphere/src/PolygonArea.cpp0000644000176200001440000001672214323376012015757 0ustar liggesusers/** * \file PolygonArea.cpp * \brief Implementation for GeographicLib::PolygonAreaT class * * Copyright (c) Charles Karney (2010-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #include "PolygonArea.h" #if defined(_MSC_VER) // Squelch warnings about enum-float expressions # pragma warning (disable: 5055) #endif namespace GeographicLib { using namespace std; template int PolygonAreaT::transit(real lon1, real lon2) { // Return 1 or -1 if crossing prime meridian in east or west direction. // Otherwise return zero. longitude = +/-0 considered to be positive. // This is (should be?) compatible with transitdirect which computes // exactly the parity of // int(floor((lon1 + lon12) / 360)) - int(floor(lon1 / 360))) real lon12 = Math::AngDiff(lon1, lon2); lon1 = Math::AngNormalize(lon1); lon2 = Math::AngNormalize(lon2); // N.B. lon12 == 0 gives cross = 0 return // edge case lon1 = 180, lon2 = 360->0, lon12 = 180 to give 1 lon12 > 0 && ((lon1 < 0 && lon2 >= 0) || // lon12 > 0 && lon1 > 0 && lon2 == 0 implies lon1 == 180 (lon1 > 0 && lon2 == 0)) ? 1 : // non edge case lon1 = -180, lon2 = -360->-0, lon12 = -180 (lon12 < 0 && lon1 >= 0 && lon2 < 0 ? -1 : 0); // This was the old method (treating +/- 0 as negative). However, with the // new scheme for handling longitude differences this fails on: // lon1 = -180, lon2 = -360->-0, lon12 = -180 gives 0 not -1. // return // lon1 <= 0 && lon2 > 0 && lon12 > 0 ? 1 : // (lon2 <= 0 && lon1 > 0 && lon12 < 0 ? -1 : 0); } // an alternate version of transit to deal with longitudes in the direct // problem. template int PolygonAreaT::transitdirect(real lon1, real lon2) { // Compute exactly the parity of // int(floor(lon2 / 360)) - int(floor(lon1 / 360)) using std::remainder; // C++ C remainder -> [-360, 360] // Java % -> (-720, 720) switch to IEEEremainder -> [-360, 360] // JS % -> (-720, 720) // Python fmod -> (-720, 720) swith to Math.remainder // Fortran, Octave skip // If mod function gives result in [-360, 360] // [0, 360) -> 0; [-360, 0) or 360 -> 1 // If mod function gives result in (-720, 720) // [0, 360) or [-inf, -360) -> 0; [-360, 0) or [360, inf) -> 1 lon1 = remainder(lon1, real(2 * Math::td)); lon2 = remainder(lon2, real(2 * Math::td)); return ( (lon2 >= 0 && lon2 < Math::td ? 0 : 1) - (lon1 >= 0 && lon1 < Math::td ? 0 : 1) ); } template void PolygonAreaT::AddPoint(real lat, real lon) { if (_num == 0) { _lat0 = _lat1 = lat; _lon0 = _lon1 = lon; } else { real s12, S12, t; _earth.GenInverse(_lat1, _lon1, lat, lon, _mask, s12, t, t, t, t, t, S12); _perimetersum += s12; if (!_polyline) { _areasum += S12; _crossings += transit(_lon1, lon); } _lat1 = lat; _lon1 = lon; } ++_num; } template void PolygonAreaT::AddEdge(real azi, real s) { if (_num) { // Do nothing if _num is zero real lat, lon, S12, t; _earth.GenDirect(_lat1, _lon1, azi, false, s, _mask, lat, lon, t, t, t, t, t, S12); _perimetersum += s; if (!_polyline) { _areasum += S12; _crossings += transitdirect(_lon1, lon); } _lat1 = lat; _lon1 = lon; ++_num; } } template unsigned PolygonAreaT::Compute(bool reverse, bool sign, real& perimeter, real& area) const { real s12, S12, t; if (_num < 2) { perimeter = 0; if (!_polyline) area = 0; return _num; } if (_polyline) { perimeter = _perimetersum(); return _num; } _earth.GenInverse(_lat1, _lon1, _lat0, _lon0, _mask, s12, t, t, t, t, t, S12); perimeter = _perimetersum(s12); Accumulator<> tempsum(_areasum); tempsum += S12; int crossings = _crossings + transit(_lon1, _lon0); AreaReduce(tempsum, crossings, reverse, sign); area = real(0) + tempsum(); return _num; } template unsigned PolygonAreaT::TestPoint(real lat, real lon, bool reverse, bool sign, real& perimeter, real& area) const { if (_num == 0) { perimeter = 0; if (!_polyline) area = 0; return 1; } perimeter = _perimetersum(); real tempsum = _polyline ? 0 : _areasum(); int crossings = _crossings; unsigned num = _num + 1; for (int i = 0; i < (_polyline ? 1 : 2); ++i) { real s12, S12, t; _earth.GenInverse(i == 0 ? _lat1 : lat, i == 0 ? _lon1 : lon, i != 0 ? _lat0 : lat, i != 0 ? _lon0 : lon, _mask, s12, t, t, t, t, t, S12); perimeter += s12; if (!_polyline) { tempsum += S12; crossings += transit(i == 0 ? _lon1 : lon, i != 0 ? _lon0 : lon); } } if (_polyline) return num; AreaReduce(tempsum, crossings, reverse, sign); area = real(0) + tempsum; return num; } template unsigned PolygonAreaT::TestEdge(real azi, real s, bool reverse, bool sign, real& perimeter, real& area) const { if (_num == 0) { // we don't have a starting point! perimeter = Math::NaN(); if (!_polyline) area = Math::NaN(); return 0; } unsigned num = _num + 1; perimeter = _perimetersum() + s; if (_polyline) return num; real tempsum = _areasum(); int crossings = _crossings; { real lat, lon, s12, S12, t; _earth.GenDirect(_lat1, _lon1, azi, false, s, _mask, lat, lon, t, t, t, t, t, S12); tempsum += S12; crossings += transitdirect(_lon1, lon); _earth.GenInverse(lat, lon, _lat0, _lon0, _mask, s12, t, t, t, t, t, S12); perimeter += s12; tempsum += S12; crossings += transit(lon, _lon0); } AreaReduce(tempsum, crossings, reverse, sign); area = real(0) + tempsum; return num; } template template void PolygonAreaT::AreaReduce(T& area, int crossings, bool reverse, bool sign) const { Remainder(area); if (crossings & 1) area += (area < 0 ? 1 : -1) * _area0/2; // area is with the clockwise sense. If !reverse convert to // counter-clockwise convention. if (!reverse) area *= -1; // If sign put area in (-_area0/2, _area0/2], else put area in [0, _area0) if (sign) { if (area > _area0/2) area -= _area0; else if (area <= -_area0/2) area += _area0; } else { if (area >= _area0) area -= _area0; else if (area < 0) area += _area0; } } template class GEOGRAPHICLIB_EXPORT PolygonAreaT; template class GEOGRAPHICLIB_EXPORT PolygonAreaT; template class GEOGRAPHICLIB_EXPORT PolygonAreaT; } // namespace GeographicLib geosphere/src/Geodesic.cpp0000644000176200001440000022131214677360124015263 0ustar liggesusers/** * \file Geodesic.cpp * \brief Implementation for GeographicLib::Geodesic class * * Copyright (c) Charles Karney (2009-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ * * This is a reformulation of the geodesic problem. The notation is as * follows: * - at a general point (no suffix or 1 or 2 as suffix) * - phi = latitude * - beta = latitude on auxiliary sphere * - omega = longitude on auxiliary sphere * - lambda = longitude * - alpha = azimuth of great circle * - sigma = arc length along great circle * - s = distance * - tau = scaled distance (= sigma at multiples of pi/2) * - at northwards equator crossing * - beta = phi = 0 * - omega = lambda = 0 * - alpha = alpha0 * - sigma = s = 0 * - a 12 suffix means a difference, e.g., s12 = s2 - s1. * - s and c prefixes mean sin and cos **********************************************************************/ #include // std::min #include #include // std::numeric_limits #include // std::swap //#include <__math/traits.h> // std::__math::isnan #include "Geodesic.h" #include "GeodesicLine.h" #if defined(_MSC_VER) // Squelch warnings about potentially uninitialized local variables, // constant conditional and enum-float expressions and mixing enums # pragma warning (disable: 4701 4127 5055 5054) #endif namespace GeographicLib { using namespace std; Geodesic::Geodesic(real a, real f) : maxit2_(maxit1_ + Math::digits() + 10) // Underflow guard. We require // tiny_ * epsilon() > 0 // tiny_ + epsilon() == epsilon() , tiny_(sqrt(numeric_limits::min())) , tol0_(numeric_limits::epsilon()) // Increase multiplier in defn of tol1_ from 100 to 200 to fix inverse // case 52.784459512564 0 -52.784459512563990912 179.634407464943777557 // which otherwise failed for Visual Studio 10 (Release and Debug) , tol1_(200 * tol0_) , tol2_(sqrt(tol0_)) , tolb_(tol0_) // Check on bisection interval , xthresh_(1000 * tol2_) , _a(a) , _f(f) , _f1(1 - _f) , _e2(_f * (2 - _f)) , _ep2(_e2 / Math::sq(_f1)) // e2 / (1 - e2) , _n(_f / ( 2 - _f)) , _b(_a * _f1) , _c2((Math::sq(_a) + Math::sq(_b) * (_e2 == 0 ? 1 : Math::eatanhe(real(1), (_f < 0 ? -1 : 1) * sqrt(fabs(_e2))) / _e2)) / 2) // authalic radius squared // The sig12 threshold for "really short". Using the auxiliary sphere // solution with dnm computed at (bet1 + bet2) / 2, the relative error in // the azimuth consistency check is sig12^2 * abs(f) * min(1, 1-f/2) / 2. // (Error measured for 1/100 < b/a < 100 and abs(f) >= 1/1000. For a // given f and sig12, the max error occurs for lines near the pole. If // the old rule for computing dnm = (dn1 + dn2)/2 is used, then the error // increases by a factor of 2.) Setting this equal to epsilon gives // sig12 = etol2. Here 0.1 is a safety factor (error decreased by 100) // and max(0.001, abs(f)) stops etol2 getting too large in the nearly // spherical case. , _etol2(real(0.1) * tol2_ / sqrt( fmax(real(0.001), fabs(_f)) * fmin(real(1), 1 - _f/2) / 2 )) { if (!(isfinite(_a) && _a > 0)) throw GeographicErr("Equatorial radius is not positive"); if (!(isfinite(_b) && _b > 0)) throw GeographicErr("Polar semi-axis is not positive"); A3coeff(); C3coeff(); C4coeff(); } const Geodesic& Geodesic::WGS84() { static const Geodesic wgs84(Constants::WGS84_a(), Constants::WGS84_f()); return wgs84; } Math::real Geodesic::SinCosSeries(bool sinp, real sinx, real cosx, const real c[], int n) { // Evaluate // y = sinp ? sum(c[i] * sin( 2*i * x), i, 1, n) : // sum(c[i] * cos((2*i+1) * x), i, 0, n-1) // using Clenshaw summation. N.B. c[0] is unused for sin series // Approx operation count = (n + 5) mult and (2 * n + 2) add c += (n + sinp); // Point to one beyond last element real ar = 2 * (cosx - sinx) * (cosx + sinx), // 2 * cos(2 * x) y0 = n & 1 ? *--c : 0, y1 = 0; // accumulators for sum // Now n is even n /= 2; while (n--) { // Unroll loop x 2, so accumulators return to their original role y1 = ar * y0 - y1 + *--c; y0 = ar * y1 - y0 + *--c; } return sinp ? 2 * sinx * cosx * y0 // sin(2 * x) * y0 : cosx * (y0 - y1); // cos(x) * (y0 - y1) } GeodesicLine Geodesic::Line(real lat1, real lon1, real azi1, unsigned caps) const { return GeodesicLine(*this, lat1, lon1, azi1, caps); } Math::real Geodesic::GenDirect(real lat1, real lon1, real azi1, bool arcmode, real s12_a12, unsigned outmask, real& lat2, real& lon2, real& azi2, real& s12, real& m12, real& M12, real& M21, real& S12) const { // Automatically supply DISTANCE_IN if necessary if (!arcmode) outmask |= DISTANCE_IN; return GeodesicLine(*this, lat1, lon1, azi1, outmask) . // Note the dot! GenPosition(arcmode, s12_a12, outmask, lat2, lon2, azi2, s12, m12, M12, M21, S12); } GeodesicLine Geodesic::GenDirectLine(real lat1, real lon1, real azi1, bool arcmode, real s12_a12, unsigned caps) const { azi1 = Math::AngNormalize(azi1); real salp1, calp1; // Guard against underflow in salp0. Also -0 is converted to +0. Math::sincosd(Math::AngRound(azi1), salp1, calp1); // Automatically supply DISTANCE_IN if necessary if (!arcmode) caps |= DISTANCE_IN; return GeodesicLine(*this, lat1, lon1, azi1, salp1, calp1, caps, arcmode, s12_a12); } GeodesicLine Geodesic::DirectLine(real lat1, real lon1, real azi1, real s12, unsigned caps) const { return GenDirectLine(lat1, lon1, azi1, false, s12, caps); } GeodesicLine Geodesic::ArcDirectLine(real lat1, real lon1, real azi1, real a12, unsigned caps) const { return GenDirectLine(lat1, lon1, azi1, true, a12, caps); } Math::real Geodesic::GenInverse(real lat1, real lon1, real lat2, real lon2, unsigned outmask, real& s12, real& salp1, real& calp1, real& salp2, real& calp2, real& m12, real& M12, real& M21, real& S12) const { // Compute longitude difference (AngDiff does this carefully). using std::isnan; // Needed for Centos 7, ubuntu 14 real lon12s, lon12 = Math::AngDiff(lon1, lon2, lon12s); // Make longitude difference positive. int lonsign = signbit(lon12) ? -1 : 1; lon12 *= lonsign; lon12s *= lonsign; real lam12 = lon12 * Math::degree(), slam12, clam12; // Calculate sincos of lon12 + error (this applies AngRound internally). Math::sincosde(lon12, lon12s, slam12, clam12); // the supplementary longitude difference lon12s = (Math::hd - lon12) - lon12s; // If really close to the equator, treat as on equator. lat1 = Math::AngRound(Math::LatFix(lat1)); lat2 = Math::AngRound(Math::LatFix(lat2)); // Swap points so that point with higher (abs) latitude is point 1. // If one latitude is a nan, then it becomes lat1. int swapp = fabs(lat1) < fabs(lat2) || isnan(lat2) ? -1 : 1; if (swapp < 0) { lonsign *= -1; swap(lat1, lat2); } // Make lat1 <= -0 int latsign = signbit(lat1) ? 1 : -1; lat1 *= latsign; lat2 *= latsign; // Now we have // // 0 <= lon12 <= 180 // -90 <= lat1 <= -0 // lat1 <= lat2 <= -lat1 // // longsign, swapp, latsign register the transformation to bring the // coordinates to this canonical form. In all cases, 1 means no change was // made. We make these transformations so that there are few cases to // check, e.g., on verifying quadrants in atan2. In addition, this // enforces some symmetries in the results returned. real sbet1, cbet1, sbet2, cbet2, s12x, m12x; Math::sincosd(lat1, sbet1, cbet1); sbet1 *= _f1; // Ensure cbet1 = +epsilon at poles; doing the fix on beta means that sig12 // will be <= 2*tiny for two points at the same pole. Math::norm(sbet1, cbet1); cbet1 = fmax(tiny_, cbet1); Math::sincosd(lat2, sbet2, cbet2); sbet2 *= _f1; // Ensure cbet2 = +epsilon at poles Math::norm(sbet2, cbet2); cbet2 = fmax(tiny_, cbet2); // If cbet1 < -sbet1, then cbet2 - cbet1 is a sensitive measure of the // |bet1| - |bet2|. Alternatively (cbet1 >= -sbet1), abs(sbet2) + sbet1 is // a better measure. This logic is used in assigning calp2 in Lambda12. // Sometimes these quantities vanish and in that case we force bet2 = +/- // bet1 exactly. An example where is is necessary is the inverse problem // 48.522876735459 0 -48.52287673545898293 179.599720456223079643 // which failed with Visual Studio 10 (Release and Debug) if (cbet1 < -sbet1) { if (cbet2 == cbet1) sbet2 = copysign(sbet1, sbet2); } else { if (fabs(sbet2) == -sbet1) cbet2 = cbet1; } real dn1 = sqrt(1 + _ep2 * Math::sq(sbet1)), dn2 = sqrt(1 + _ep2 * Math::sq(sbet2)); real a12, sig12; // index zero element of this array is unused real Ca[nC_]; bool meridian = lat1 == -Math::qd || slam12 == 0; if (meridian) { // Endpoints are on a single full meridian, so the geodesic might lie on // a meridian. calp1 = clam12; salp1 = slam12; // Head to the target longitude calp2 = 1; salp2 = 0; // At the target we're heading north real // tan(bet) = tan(sig) * cos(alp) ssig1 = sbet1, csig1 = calp1 * cbet1, ssig2 = sbet2, csig2 = calp2 * cbet2; // sig12 = sig2 - sig1 sig12 = atan2(fmax(real(0), csig1 * ssig2 - ssig1 * csig2) + real(0), csig1 * csig2 + ssig1 * ssig2); { real dummy; Lengths(_n, sig12, ssig1, csig1, dn1, ssig2, csig2, dn2, cbet1, cbet2, outmask | DISTANCE | REDUCEDLENGTH, s12x, m12x, dummy, M12, M21, Ca); } // Add the check for sig12 since zero length geodesics might yield m12 < // 0. Test case was // // echo 20.001 0 20.001 0 | GeodSolve -i // // In fact, we will have sig12 > pi/2 for meridional geodesic which is // not a shortest path. // TODO: investigate m12 < 0 result for aarch/ppc (with -f -p 20) // 20.001000000000001 0.000000000000000 180.000000000000000 // 20.001000000000001 0.000000000000000 180.000000000000000 // 0.0000000002 0.000000000000001 -0.0000000001 // 0.99999999999999989 0.99999999999999989 0.000 if (sig12 < 1 || m12x >= 0) { // Need at least 2, to handle 90 0 90 180 if (sig12 < 3 * tiny_ || // Prevent negative s12 or m12 for short lines (sig12 < tol0_ && (s12x < 0 || m12x < 0))) sig12 = m12x = s12x = 0; m12x *= _b; s12x *= _b; a12 = sig12 / Math::degree(); } else // m12 < 0, i.e., prolate and too close to anti-podal meridian = false; } // somg12 == 2 marks that it needs to be calculated real omg12 = 0, somg12 = 2, comg12 = 0; if (!meridian && sbet1 == 0 && // and sbet2 == 0 (_f <= 0 || lon12s >= _f * Math::hd)) { // Geodesic runs along equator calp1 = calp2 = 0; salp1 = salp2 = 1; s12x = _a * lam12; sig12 = omg12 = lam12 / _f1; m12x = _b * sin(sig12); if (outmask & GEODESICSCALE) M12 = M21 = cos(sig12); a12 = lon12 / _f1; } else if (!meridian) { // Now point1 and point2 belong within a hemisphere bounded by a // meridian and geodesic is neither meridional or equatorial. // Figure a starting point for Newton's method real dnm; sig12 = InverseStart(sbet1, cbet1, dn1, sbet2, cbet2, dn2, lam12, slam12, clam12, salp1, calp1, salp2, calp2, dnm, Ca); if (sig12 >= 0) { // Short lines (InverseStart sets salp2, calp2, dnm) s12x = sig12 * _b * dnm; m12x = Math::sq(dnm) * _b * sin(sig12 / dnm); if (outmask & GEODESICSCALE) M12 = M21 = cos(sig12 / dnm); a12 = sig12 / Math::degree(); omg12 = lam12 / (_f1 * dnm); } else { // Newton's method. This is a straightforward solution of f(alp1) = // lambda12(alp1) - lam12 = 0 with one wrinkle. f(alp) has exactly one // root in the interval (0, pi) and its derivative is positive at the // root. Thus f(alp) is positive for alp > alp1 and negative for alp < // alp1. During the course of the iteration, a range (alp1a, alp1b) is // maintained which brackets the root and with each evaluation of // f(alp) the range is shrunk, if possible. Newton's method is // restarted whenever the derivative of f is negative (because the new // value of alp1 is then further from the solution) or if the new // estimate of alp1 lies outside (0,pi); in this case, the new starting // guess is taken to be (alp1a + alp1b) / 2. // // initial values to suppress warnings (if loop is executed 0 times) real ssig1 = 0, csig1 = 0, ssig2 = 0, csig2 = 0, eps = 0, domg12 = 0; unsigned numit = 0; // Bracketing range real salp1a = tiny_, calp1a = 1, salp1b = tiny_, calp1b = -1; for (bool tripn = false, tripb = false;; ++numit) { // the WGS84 test set: mean = 1.47, sd = 1.25, max = 16 // WGS84 and random input: mean = 2.85, sd = 0.60 real dv; real v = Lambda12(sbet1, cbet1, dn1, sbet2, cbet2, dn2, salp1, calp1, slam12, clam12, salp2, calp2, sig12, ssig1, csig1, ssig2, csig2, eps, domg12, numit < maxit1_, dv, Ca); if (tripb || // Reversed test to allow escape with NaNs !(fabs(v) >= (tripn ? 8 : 1) * tol0_) || // Enough bisections to get accurate result numit == maxit2_) break; // Update bracketing values if (v > 0 && (numit > maxit1_ || calp1/salp1 > calp1b/salp1b)) { salp1b = salp1; calp1b = calp1; } else if (v < 0 && (numit > maxit1_ || calp1/salp1 < calp1a/salp1a)) { salp1a = salp1; calp1a = calp1; } if (numit < maxit1_ && dv > 0) { real dalp1 = -v/dv; // |dalp1| < pi test moved earlier because GEOGRAPHICLIB_PRECISION // = 5 can result in dalp1 = 10^(10^8). Then sin(dalp1) takes ages // (because of the need to do accurate range reduction). if (fabs(dalp1) < Math::pi()) { real sdalp1 = sin(dalp1), cdalp1 = cos(dalp1), nsalp1 = salp1 * cdalp1 + calp1 * sdalp1; if (nsalp1 > 0) { calp1 = calp1 * cdalp1 - salp1 * sdalp1; salp1 = nsalp1; Math::norm(salp1, calp1); // In some regimes we don't get quadratic convergence because // slope -> 0. So use convergence conditions based on epsilon // instead of sqrt(epsilon). tripn = fabs(v) <= 16 * tol0_; continue; } } } // Either dv was not positive or updated value was outside legal // range. Use the midpoint of the bracket as the next estimate. // This mechanism is not needed for the WGS84 ellipsoid, but it does // catch problems with more eccentric ellipsoids. Its efficacy is // such for the WGS84 test set with the starting guess set to alp1 = // 90deg: // the WGS84 test set: mean = 5.21, sd = 3.93, max = 24 // WGS84 and random input: mean = 4.74, sd = 0.99 salp1 = (salp1a + salp1b)/2; calp1 = (calp1a + calp1b)/2; Math::norm(salp1, calp1); tripn = false; tripb = (fabs(salp1a - salp1) + (calp1a - calp1) < tolb_ || fabs(salp1 - salp1b) + (calp1 - calp1b) < tolb_); } { real dummy; // Ensure that the reduced length and geodesic scale are computed in // a "canonical" way, with the I2 integral. unsigned lengthmask = outmask | (outmask & (REDUCEDLENGTH | GEODESICSCALE) ? DISTANCE : NONE); Lengths(eps, sig12, ssig1, csig1, dn1, ssig2, csig2, dn2, cbet1, cbet2, lengthmask, s12x, m12x, dummy, M12, M21, Ca); } m12x *= _b; s12x *= _b; a12 = sig12 / Math::degree(); if (outmask & AREA) { // omg12 = lam12 - domg12 real sdomg12 = sin(domg12), cdomg12 = cos(domg12); somg12 = slam12 * cdomg12 - clam12 * sdomg12; comg12 = clam12 * cdomg12 + slam12 * sdomg12; } } } if (outmask & DISTANCE) s12 = real(0) + s12x; // Convert -0 to 0 if (outmask & REDUCEDLENGTH) m12 = real(0) + m12x; // Convert -0 to 0 if (outmask & AREA) { real // From Lambda12: sin(alp1) * cos(bet1) = sin(alp0) salp0 = salp1 * cbet1, calp0 = hypot(calp1, salp1 * sbet1); // calp0 > 0 real alp12; if (calp0 != 0 && salp0 != 0) { real // From Lambda12: tan(bet) = tan(sig) * cos(alp) ssig1 = sbet1, csig1 = calp1 * cbet1, ssig2 = sbet2, csig2 = calp2 * cbet2, k2 = Math::sq(calp0) * _ep2, eps = k2 / (2 * (1 + sqrt(1 + k2)) + k2), // Multiplier = a^2 * e^2 * cos(alpha0) * sin(alpha0). A4 = Math::sq(_a) * calp0 * salp0 * _e2; Math::norm(ssig1, csig1); Math::norm(ssig2, csig2); C4f(eps, Ca); real B41 = SinCosSeries(false, ssig1, csig1, Ca, nC4_), B42 = SinCosSeries(false, ssig2, csig2, Ca, nC4_); S12 = A4 * (B42 - B41); } else // Avoid problems with indeterminate sig1, sig2 on equator S12 = 0; if (!meridian && somg12 == 2) { somg12 = sin(omg12); comg12 = cos(omg12); } if (!meridian && // omg12 < 3/4 * pi comg12 > -real(0.7071) && // Long difference not too big sbet2 - sbet1 < real(1.75)) { // Lat difference not too big // Use tan(Gamma/2) = tan(omg12/2) // * (tan(bet1/2)+tan(bet2/2))/(1+tan(bet1/2)*tan(bet2/2)) // with tan(x/2) = sin(x)/(1+cos(x)) real domg12 = 1 + comg12, dbet1 = 1 + cbet1, dbet2 = 1 + cbet2; alp12 = 2 * atan2( somg12 * ( sbet1 * dbet2 + sbet2 * dbet1 ), domg12 * ( sbet1 * sbet2 + dbet1 * dbet2 ) ); } else { // alp12 = alp2 - alp1, used in atan2 so no need to normalize real salp12 = salp2 * calp1 - calp2 * salp1, calp12 = calp2 * calp1 + salp2 * salp1; // The right thing appears to happen if alp1 = +/-180 and alp2 = 0, viz // salp12 = -0 and alp12 = -180. However this depends on the sign // being attached to 0 correctly. The following ensures the correct // behavior. if (salp12 == 0 && calp12 < 0) { salp12 = tiny_ * calp1; calp12 = -1; } alp12 = atan2(salp12, calp12); } S12 += _c2 * alp12; S12 *= swapp * lonsign * latsign; // Convert -0 to 0 S12 += 0; } // Convert calp, salp to azimuth accounting for lonsign, swapp, latsign. if (swapp < 0) { swap(salp1, salp2); swap(calp1, calp2); if (outmask & GEODESICSCALE) swap(M12, M21); } salp1 *= swapp * lonsign; calp1 *= swapp * latsign; salp2 *= swapp * lonsign; calp2 *= swapp * latsign; // Returned value in [0, 180] return a12; } Math::real Geodesic::GenInverse(real lat1, real lon1, real lat2, real lon2, unsigned outmask, real& s12, real& azi1, real& azi2, real& m12, real& M12, real& M21, real& S12) const { outmask &= OUT_MASK; real salp1, calp1, salp2, calp2, a12 = GenInverse(lat1, lon1, lat2, lon2, outmask, s12, salp1, calp1, salp2, calp2, m12, M12, M21, S12); if (outmask & AZIMUTH) { azi1 = Math::atan2d(salp1, calp1); azi2 = Math::atan2d(salp2, calp2); } return a12; } GeodesicLine Geodesic::InverseLine(real lat1, real lon1, real lat2, real lon2, unsigned caps) const { real t, salp1, calp1, salp2, calp2, a12 = GenInverse(lat1, lon1, lat2, lon2, // No need to specify AZIMUTH here 0u, t, salp1, calp1, salp2, calp2, t, t, t, t), azi1 = Math::atan2d(salp1, calp1); // Ensure that a12 can be converted to a distance if (caps & (OUT_MASK & DISTANCE_IN)) caps |= DISTANCE; return GeodesicLine(*this, lat1, lon1, azi1, salp1, calp1, caps, true, a12); } void Geodesic::Lengths(real eps, real sig12, real ssig1, real csig1, real dn1, real ssig2, real csig2, real dn2, real cbet1, real cbet2, unsigned outmask, real& s12b, real& m12b, real& m0, real& M12, real& M21, // Scratch area of the right size real Ca[]) const { // Return m12b = (reduced length)/_b; also calculate s12b = distance/_b, // and m0 = coefficient of secular term in expression for reduced length. outmask &= OUT_MASK; // outmask & DISTANCE: set s12b // outmask & REDUCEDLENGTH: set m12b & m0 // outmask & GEODESICSCALE: set M12 & M21 real m0x = 0, J12 = 0, A1 = 0, A2 = 0; real Cb[nC2_ + 1]; if (outmask & (DISTANCE | REDUCEDLENGTH | GEODESICSCALE)) { A1 = A1m1f(eps); C1f(eps, Ca); if (outmask & (REDUCEDLENGTH | GEODESICSCALE)) { A2 = A2m1f(eps); C2f(eps, Cb); m0x = A1 - A2; A2 = 1 + A2; } A1 = 1 + A1; } if (outmask & DISTANCE) { real B1 = SinCosSeries(true, ssig2, csig2, Ca, nC1_) - SinCosSeries(true, ssig1, csig1, Ca, nC1_); // Missing a factor of _b s12b = A1 * (sig12 + B1); if (outmask & (REDUCEDLENGTH | GEODESICSCALE)) { real B2 = SinCosSeries(true, ssig2, csig2, Cb, nC2_) - SinCosSeries(true, ssig1, csig1, Cb, nC2_); J12 = m0x * sig12 + (A1 * B1 - A2 * B2); } } else if (outmask & (REDUCEDLENGTH | GEODESICSCALE)) { // Assume here that nC1_ >= nC2_ for (int l = 1; l <= nC2_; ++l) Cb[l] = A1 * Ca[l] - A2 * Cb[l]; J12 = m0x * sig12 + (SinCosSeries(true, ssig2, csig2, Cb, nC2_) - SinCosSeries(true, ssig1, csig1, Cb, nC2_)); } if (outmask & REDUCEDLENGTH) { m0 = m0x; // Missing a factor of _b. // Add parens around (csig1 * ssig2) and (ssig1 * csig2) to ensure // accurate cancellation in the case of coincident points. m12b = dn2 * (csig1 * ssig2) - dn1 * (ssig1 * csig2) - csig1 * csig2 * J12; } if (outmask & GEODESICSCALE) { real csig12 = csig1 * csig2 + ssig1 * ssig2; real t = _ep2 * (cbet1 - cbet2) * (cbet1 + cbet2) / (dn1 + dn2); M12 = csig12 + (t * ssig2 - csig2 * J12) * ssig1 / dn1; M21 = csig12 - (t * ssig1 - csig1 * J12) * ssig2 / dn2; } } Math::real Geodesic::Astroid(real x, real y) { // Solve k^4+2*k^3-(x^2+y^2-1)*k^2-2*y^2*k-y^2 = 0 for positive root k. // This solution is adapted from Geocentric::Reverse. real k; real p = Math::sq(x), q = Math::sq(y), r = (p + q - 1) / 6; if ( !(q == 0 && r <= 0) ) { real // Avoid possible division by zero when r = 0 by multiplying equations // for s and t by r^3 and r, resp. S = p * q / 4, // S = r^3 * s r2 = Math::sq(r), r3 = r * r2, // The discriminant of the quadratic equation for T3. This is zero on // the evolute curve p^(1/3)+q^(1/3) = 1 disc = S * (S + 2 * r3); real u = r; if (disc >= 0) { real T3 = S + r3; // Pick the sign on the sqrt to maximize abs(T3). This minimizes loss // of precision due to cancellation. The result is unchanged because // of the way the T is used in definition of u. T3 += T3 < 0 ? -sqrt(disc) : sqrt(disc); // T3 = (r * t)^3 // N.B. cbrt always returns the real root. cbrt(-8) = -2. real T = cbrt(T3); // T = r * t // T can be zero; but then r2 / T -> 0. u += T + (T != 0 ? r2 / T : 0); } else { // T is complex, but the way u is defined the result is real. real ang = atan2(sqrt(-disc), -(S + r3)); // There are three possible cube roots. We choose the root which // avoids cancellation. Note that disc < 0 implies that r < 0. u += 2 * r * cos(ang / 3); } real v = sqrt(Math::sq(u) + q), // guaranteed positive // Avoid loss of accuracy when u < 0. uv = u < 0 ? q / (v - u) : u + v, // u+v, guaranteed positive w = (uv - q) / (2 * v); // positive? // Rearrange expression for k to avoid loss of accuracy due to // subtraction. Division by 0 not possible because uv > 0, w >= 0. k = uv / (sqrt(uv + Math::sq(w)) + w); // guaranteed positive } else { // q == 0 && r <= 0 // y = 0 with |x| <= 1. Handle this case directly. // for y small, positive root is k = abs(y)/sqrt(1-x^2) k = 0; } return k; } Math::real Geodesic::InverseStart(real sbet1, real cbet1, real dn1, real sbet2, real cbet2, real dn2, real lam12, real slam12, real clam12, real& salp1, real& calp1, // Only updated if return val >= 0 real& salp2, real& calp2, // Only updated for short lines real& dnm, // Scratch area of the right size real Ca[]) const { // Return a starting point for Newton's method in salp1 and calp1 (function // value is -1). If Newton's method doesn't need to be used, return also // salp2 and calp2 and function value is sig12. real sig12 = -1, // Return value // bet12 = bet2 - bet1 in [0, pi); bet12a = bet2 + bet1 in (-pi, 0] sbet12 = sbet2 * cbet1 - cbet2 * sbet1, cbet12 = cbet2 * cbet1 + sbet2 * sbet1; real sbet12a = sbet2 * cbet1 + cbet2 * sbet1; bool shortline = cbet12 >= 0 && sbet12 < real(0.5) && cbet2 * lam12 < real(0.5); real somg12, comg12; if (shortline) { real sbetm2 = Math::sq(sbet1 + sbet2); // sin((bet1+bet2)/2)^2 // = (sbet1 + sbet2)^2 / ((sbet1 + sbet2)^2 + (cbet1 + cbet2)^2) sbetm2 /= sbetm2 + Math::sq(cbet1 + cbet2); dnm = sqrt(1 + _ep2 * sbetm2); real omg12 = lam12 / (_f1 * dnm); somg12 = sin(omg12); comg12 = cos(omg12); } else { somg12 = slam12; comg12 = clam12; } salp1 = cbet2 * somg12; calp1 = comg12 >= 0 ? sbet12 + cbet2 * sbet1 * Math::sq(somg12) / (1 + comg12) : sbet12a - cbet2 * sbet1 * Math::sq(somg12) / (1 - comg12); real ssig12 = hypot(salp1, calp1), csig12 = sbet1 * sbet2 + cbet1 * cbet2 * comg12; if (shortline && ssig12 < _etol2) { // really short lines salp2 = cbet1 * somg12; calp2 = sbet12 - cbet1 * sbet2 * (comg12 >= 0 ? Math::sq(somg12) / (1 + comg12) : 1 - comg12); Math::norm(salp2, calp2); // Set return value sig12 = atan2(ssig12, csig12); } else if (fabs(_n) > real(0.1) || // Skip astroid calc if too eccentric csig12 >= 0 || ssig12 >= 6 * fabs(_n) * Math::pi() * Math::sq(cbet1)) { // Nothing to do, zeroth order spherical approximation is OK } else { // Scale lam12 and bet2 to x, y coordinate system where antipodal point // is at origin and singular point is at y = 0, x = -1. real x, y, lamscale, betscale; real lam12x = atan2(-slam12, -clam12); // lam12 - pi if (_f >= 0) { // In fact f == 0 does not get here // x = dlong, y = dlat { real k2 = Math::sq(sbet1) * _ep2, eps = k2 / (2 * (1 + sqrt(1 + k2)) + k2); lamscale = _f * cbet1 * A3f(eps) * Math::pi(); } betscale = lamscale * cbet1; x = lam12x / lamscale; y = sbet12a / betscale; } else { // _f < 0 // x = dlat, y = dlong real cbet12a = cbet2 * cbet1 - sbet2 * sbet1, bet12a = atan2(sbet12a, cbet12a); real m12b, m0, dummy; // In the case of lon12 = 180, this repeats a calculation made in // Inverse. Lengths(_n, Math::pi() + bet12a, sbet1, -cbet1, dn1, sbet2, cbet2, dn2, cbet1, cbet2, REDUCEDLENGTH, dummy, m12b, m0, dummy, dummy, Ca); x = -1 + m12b / (cbet1 * cbet2 * m0 * Math::pi()); betscale = x < -real(0.01) ? sbet12a / x : -_f * Math::sq(cbet1) * Math::pi(); lamscale = betscale / cbet1; y = lam12x / lamscale; } if (y > -tol1_ && x > -1 - xthresh_) { // strip near cut // Need real(x) here to cast away the volatility of x for min/max if (_f >= 0) { salp1 = fmin(real(1), -x); calp1 = - sqrt(1 - Math::sq(salp1)); } else { calp1 = fmax(real(x > -tol1_ ? 0 : -1), x); salp1 = sqrt(1 - Math::sq(calp1)); } } else { // Estimate alp1, by solving the astroid problem. // // Could estimate alpha1 = theta + pi/2, directly, i.e., // calp1 = y/k; salp1 = -x/(1+k); for _f >= 0 // calp1 = x/(1+k); salp1 = -y/k; for _f < 0 (need to check) // // However, it's better to estimate omg12 from astroid and use // spherical formula to compute alp1. This reduces the mean number of // Newton iterations for astroid cases from 2.24 (min 0, max 6) to 2.12 // (min 0 max 5). The changes in the number of iterations are as // follows: // // change percent // 1 5 // 0 78 // -1 16 // -2 0.6 // -3 0.04 // -4 0.002 // // The histogram of iterations is (m = number of iterations estimating // alp1 directly, n = number of iterations estimating via omg12, total // number of trials = 148605): // // iter m n // 0 148 186 // 1 13046 13845 // 2 93315 102225 // 3 36189 32341 // 4 5396 7 // 5 455 1 // 6 56 0 // // Because omg12 is near pi, estimate work with omg12a = pi - omg12 real k = Astroid(x, y); real omg12a = lamscale * ( _f >= 0 ? -x * k/(1 + k) : -y * (1 + k)/k ); somg12 = sin(omg12a); comg12 = -cos(omg12a); // Update spherical estimate of alp1 using omg12 instead of lam12 salp1 = cbet2 * somg12; calp1 = sbet12a - cbet2 * sbet1 * Math::sq(somg12) / (1 - comg12); } } // Sanity check on starting guess. Backwards check allows NaN through. if (!(salp1 <= 0)) Math::norm(salp1, calp1); else { salp1 = 1; calp1 = 0; } return sig12; } Math::real Geodesic::Lambda12(real sbet1, real cbet1, real dn1, real sbet2, real cbet2, real dn2, real salp1, real calp1, real slam120, real clam120, real& salp2, real& calp2, real& sig12, real& ssig1, real& csig1, real& ssig2, real& csig2, real& eps, real& domg12, bool diffp, real& dlam12, // Scratch area of the right size real Ca[]) const { if (sbet1 == 0 && calp1 == 0) // Break degeneracy of equatorial line. This case has already been // handled. calp1 = -tiny_; real // sin(alp1) * cos(bet1) = sin(alp0) salp0 = salp1 * cbet1, calp0 = hypot(calp1, salp1 * sbet1); // calp0 > 0 real somg1, comg1, somg2, comg2, somg12, comg12, lam12; // tan(bet1) = tan(sig1) * cos(alp1) // tan(omg1) = sin(alp0) * tan(sig1) = tan(omg1)=tan(alp1)*sin(bet1) ssig1 = sbet1; somg1 = salp0 * sbet1; csig1 = comg1 = calp1 * cbet1; Math::norm(ssig1, csig1); // Math::norm(somg1, comg1); -- don't need to normalize! // Enforce symmetries in the case abs(bet2) = -bet1. Need to be careful // about this case, since this can yield singularities in the Newton // iteration. // sin(alp2) * cos(bet2) = sin(alp0) salp2 = cbet2 != cbet1 ? salp0 / cbet2 : salp1; // calp2 = sqrt(1 - sq(salp2)) // = sqrt(sq(calp0) - sq(sbet2)) / cbet2 // and subst for calp0 and rearrange to give (choose positive sqrt // to give alp2 in [0, pi/2]). calp2 = cbet2 != cbet1 || fabs(sbet2) != -sbet1 ? sqrt(Math::sq(calp1 * cbet1) + (cbet1 < -sbet1 ? (cbet2 - cbet1) * (cbet1 + cbet2) : (sbet1 - sbet2) * (sbet1 + sbet2))) / cbet2 : fabs(calp1); // tan(bet2) = tan(sig2) * cos(alp2) // tan(omg2) = sin(alp0) * tan(sig2). ssig2 = sbet2; somg2 = salp0 * sbet2; csig2 = comg2 = calp2 * cbet2; Math::norm(ssig2, csig2); // Math::norm(somg2, comg2); -- don't need to normalize! // sig12 = sig2 - sig1, limit to [0, pi] sig12 = atan2(fmax(real(0), csig1 * ssig2 - ssig1 * csig2) + real(0), csig1 * csig2 + ssig1 * ssig2); // omg12 = omg2 - omg1, limit to [0, pi] somg12 = fmax(real(0), comg1 * somg2 - somg1 * comg2) + real(0); comg12 = comg1 * comg2 + somg1 * somg2; // eta = omg12 - lam120 real eta = atan2(somg12 * clam120 - comg12 * slam120, comg12 * clam120 + somg12 * slam120); real B312; real k2 = Math::sq(calp0) * _ep2; eps = k2 / (2 * (1 + sqrt(1 + k2)) + k2); C3f(eps, Ca); B312 = (SinCosSeries(true, ssig2, csig2, Ca, nC3_-1) - SinCosSeries(true, ssig1, csig1, Ca, nC3_-1)); domg12 = -_f * A3f(eps) * salp0 * (sig12 + B312); lam12 = eta + domg12; if (diffp) { if (calp2 == 0) dlam12 = - 2 * _f1 * dn1 / sbet1; else { real dummy; Lengths(eps, sig12, ssig1, csig1, dn1, ssig2, csig2, dn2, cbet1, cbet2, REDUCEDLENGTH, dummy, dlam12, dummy, dummy, dummy, Ca); dlam12 *= _f1 / (calp2 * cbet2); } } return lam12; } Math::real Geodesic::A3f(real eps) const { // Evaluate A3 return Math::polyval(nA3_ - 1, _aA3x, eps); } void Geodesic::C3f(real eps, real c[]) const { // Evaluate C3 coeffs // Elements c[1] thru c[nC3_ - 1] are set real mult = 1; int o = 0; for (int l = 1; l < nC3_; ++l) { // l is index of C3[l] int m = nC3_ - l - 1; // order of polynomial in eps mult *= eps; c[l] = mult * Math::polyval(m, _cC3x + o, eps); o += m + 1; } // Post condition: o == nC3x_ } void Geodesic::C4f(real eps, real c[]) const { // Evaluate C4 coeffs // Elements c[0] thru c[nC4_ - 1] are set real mult = 1; int o = 0; for (int l = 0; l < nC4_; ++l) { // l is index of C4[l] int m = nC4_ - l - 1; // order of polynomial in eps c[l] = mult * Math::polyval(m, _cC4x + o, eps); o += m + 1; mult *= eps; } // Post condition: o == nC4x_ } // The static const coefficient arrays in the following functions are // generated by Maxima and give the coefficients of the Taylor expansions for // the geodesics. The convention on the order of these coefficients is as // follows: // // ascending order in the trigonometric expansion, // then powers of eps in descending order, // finally powers of n in descending order. // // (For some expansions, only a subset of levels occur.) For each polynomial // of order n at the lowest level, the (n+1) coefficients of the polynomial // are followed by a divisor which is applied to the whole polynomial. In // this way, the coefficients are expressible with no round off error. The // sizes of the coefficient arrays are: // // A1m1f, A2m1f = floor(N/2) + 2 // C1f, C1pf, C2f, A3coeff = (N^2 + 7*N - 2*floor(N/2)) / 4 // C3coeff = (N - 1) * (N^2 + 7*N - 2*floor(N/2)) / 8 // C4coeff = N * (N + 1) * (N + 5) / 6 // // where N = GEOGRAPHICLIB_GEODESIC_ORDER // = nA1 = nA2 = nC1 = nC1p = nA3 = nC4 // The scale factor A1-1 = mean value of (d/dsigma)I1 - 1 Math::real Geodesic::A1m1f(real eps) { // Generated by Maxima on 2015-05-05 18:08:12-04:00 #if GEOGRAPHICLIB_GEODESIC_ORDER/2 == 1 static const real coeff[] = { // (1-eps)*A1-1, polynomial in eps2 of order 1 1, 0, 4, }; #elif GEOGRAPHICLIB_GEODESIC_ORDER/2 == 2 static const real coeff[] = { // (1-eps)*A1-1, polynomial in eps2 of order 2 1, 16, 0, 64, }; #elif GEOGRAPHICLIB_GEODESIC_ORDER/2 == 3 static const real coeff[] = { // (1-eps)*A1-1, polynomial in eps2 of order 3 1, 4, 64, 0, 256, }; #elif GEOGRAPHICLIB_GEODESIC_ORDER/2 == 4 static const real coeff[] = { // (1-eps)*A1-1, polynomial in eps2 of order 4 25, 64, 256, 4096, 0, 16384, }; #else #error "Bad value for GEOGRAPHICLIB_GEODESIC_ORDER" #endif static_assert(sizeof(coeff) / sizeof(real) == nA1_/2 + 2, "Coefficient array size mismatch in A1m1f"); int m = nA1_/2; real t = Math::polyval(m, coeff, Math::sq(eps)) / coeff[m + 1]; return (t + eps) / (1 - eps); } // The coefficients C1[l] in the Fourier expansion of B1 void Geodesic::C1f(real eps, real c[]) { // Generated by Maxima on 2015-05-05 18:08:12-04:00 #if GEOGRAPHICLIB_GEODESIC_ORDER == 3 static const real coeff[] = { // C1[1]/eps^1, polynomial in eps2 of order 1 3, -8, 16, // C1[2]/eps^2, polynomial in eps2 of order 0 -1, 16, // C1[3]/eps^3, polynomial in eps2 of order 0 -1, 48, }; #elif GEOGRAPHICLIB_GEODESIC_ORDER == 4 static const real coeff[] = { // C1[1]/eps^1, polynomial in eps2 of order 1 3, -8, 16, // C1[2]/eps^2, polynomial in eps2 of order 1 1, -2, 32, // C1[3]/eps^3, polynomial in eps2 of order 0 -1, 48, // C1[4]/eps^4, polynomial in eps2 of order 0 -5, 512, }; #elif GEOGRAPHICLIB_GEODESIC_ORDER == 5 static const real coeff[] = { // C1[1]/eps^1, polynomial in eps2 of order 2 -1, 6, -16, 32, // C1[2]/eps^2, polynomial in eps2 of order 1 1, -2, 32, // C1[3]/eps^3, polynomial in eps2 of order 1 9, -16, 768, // C1[4]/eps^4, polynomial in eps2 of order 0 -5, 512, // C1[5]/eps^5, polynomial in eps2 of order 0 -7, 1280, }; #elif GEOGRAPHICLIB_GEODESIC_ORDER == 6 static const real coeff[] = { // C1[1]/eps^1, polynomial in eps2 of order 2 -1, 6, -16, 32, // C1[2]/eps^2, polynomial in eps2 of order 2 -9, 64, -128, 2048, // C1[3]/eps^3, polynomial in eps2 of order 1 9, -16, 768, // C1[4]/eps^4, polynomial in eps2 of order 1 3, -5, 512, // C1[5]/eps^5, polynomial in eps2 of order 0 -7, 1280, // C1[6]/eps^6, polynomial in eps2 of order 0 -7, 2048, }; #elif GEOGRAPHICLIB_GEODESIC_ORDER == 7 static const real coeff[] = { // C1[1]/eps^1, polynomial in eps2 of order 3 19, -64, 384, -1024, 2048, // C1[2]/eps^2, polynomial in eps2 of order 2 -9, 64, -128, 2048, // C1[3]/eps^3, polynomial in eps2 of order 2 -9, 72, -128, 6144, // C1[4]/eps^4, polynomial in eps2 of order 1 3, -5, 512, // C1[5]/eps^5, polynomial in eps2 of order 1 35, -56, 10240, // C1[6]/eps^6, polynomial in eps2 of order 0 -7, 2048, // C1[7]/eps^7, polynomial in eps2 of order 0 -33, 14336, }; #elif GEOGRAPHICLIB_GEODESIC_ORDER == 8 static const real coeff[] = { // C1[1]/eps^1, polynomial in eps2 of order 3 19, -64, 384, -1024, 2048, // C1[2]/eps^2, polynomial in eps2 of order 3 7, -18, 128, -256, 4096, // C1[3]/eps^3, polynomial in eps2 of order 2 -9, 72, -128, 6144, // C1[4]/eps^4, polynomial in eps2 of order 2 -11, 96, -160, 16384, // C1[5]/eps^5, polynomial in eps2 of order 1 35, -56, 10240, // C1[6]/eps^6, polynomial in eps2 of order 1 9, -14, 4096, // C1[7]/eps^7, polynomial in eps2 of order 0 -33, 14336, // C1[8]/eps^8, polynomial in eps2 of order 0 -429, 262144, }; #else #error "Bad value for GEOGRAPHICLIB_GEODESIC_ORDER" #endif static_assert(sizeof(coeff) / sizeof(real) == (nC1_*nC1_ + 7*nC1_ - 2*(nC1_/2)) / 4, "Coefficient array size mismatch in C1f"); real eps2 = Math::sq(eps), d = eps; int o = 0; for (int l = 1; l <= nC1_; ++l) { // l is index of C1p[l] int m = (nC1_ - l) / 2; // order of polynomial in eps^2 c[l] = d * Math::polyval(m, coeff + o, eps2) / coeff[o + m + 1]; o += m + 2; d *= eps; } // Post condition: o == sizeof(coeff) / sizeof(real) } // The coefficients C1p[l] in the Fourier expansion of B1p void Geodesic::C1pf(real eps, real c[]) { // Generated by Maxima on 2015-05-05 18:08:12-04:00 #if GEOGRAPHICLIB_GEODESIC_ORDER == 3 static const real coeff[] = { // C1p[1]/eps^1, polynomial in eps2 of order 1 -9, 16, 32, // C1p[2]/eps^2, polynomial in eps2 of order 0 5, 16, // C1p[3]/eps^3, polynomial in eps2 of order 0 29, 96, }; #elif GEOGRAPHICLIB_GEODESIC_ORDER == 4 static const real coeff[] = { // C1p[1]/eps^1, polynomial in eps2 of order 1 -9, 16, 32, // C1p[2]/eps^2, polynomial in eps2 of order 1 -37, 30, 96, // C1p[3]/eps^3, polynomial in eps2 of order 0 29, 96, // C1p[4]/eps^4, polynomial in eps2 of order 0 539, 1536, }; #elif GEOGRAPHICLIB_GEODESIC_ORDER == 5 static const real coeff[] = { // C1p[1]/eps^1, polynomial in eps2 of order 2 205, -432, 768, 1536, // C1p[2]/eps^2, polynomial in eps2 of order 1 -37, 30, 96, // C1p[3]/eps^3, polynomial in eps2 of order 1 -225, 116, 384, // C1p[4]/eps^4, polynomial in eps2 of order 0 539, 1536, // C1p[5]/eps^5, polynomial in eps2 of order 0 3467, 7680, }; #elif GEOGRAPHICLIB_GEODESIC_ORDER == 6 static const real coeff[] = { // C1p[1]/eps^1, polynomial in eps2 of order 2 205, -432, 768, 1536, // C1p[2]/eps^2, polynomial in eps2 of order 2 4005, -4736, 3840, 12288, // C1p[3]/eps^3, polynomial in eps2 of order 1 -225, 116, 384, // C1p[4]/eps^4, polynomial in eps2 of order 1 -7173, 2695, 7680, // C1p[5]/eps^5, polynomial in eps2 of order 0 3467, 7680, // C1p[6]/eps^6, polynomial in eps2 of order 0 38081, 61440, }; #elif GEOGRAPHICLIB_GEODESIC_ORDER == 7 static const real coeff[] = { // C1p[1]/eps^1, polynomial in eps2 of order 3 -4879, 9840, -20736, 36864, 73728, // C1p[2]/eps^2, polynomial in eps2 of order 2 4005, -4736, 3840, 12288, // C1p[3]/eps^3, polynomial in eps2 of order 2 8703, -7200, 3712, 12288, // C1p[4]/eps^4, polynomial in eps2 of order 1 -7173, 2695, 7680, // C1p[5]/eps^5, polynomial in eps2 of order 1 -141115, 41604, 92160, // C1p[6]/eps^6, polynomial in eps2 of order 0 38081, 61440, // C1p[7]/eps^7, polynomial in eps2 of order 0 459485, 516096, }; #elif GEOGRAPHICLIB_GEODESIC_ORDER == 8 static const real coeff[] = { // C1p[1]/eps^1, polynomial in eps2 of order 3 -4879, 9840, -20736, 36864, 73728, // C1p[2]/eps^2, polynomial in eps2 of order 3 -86171, 120150, -142080, 115200, 368640, // C1p[3]/eps^3, polynomial in eps2 of order 2 8703, -7200, 3712, 12288, // C1p[4]/eps^4, polynomial in eps2 of order 2 1082857, -688608, 258720, 737280, // C1p[5]/eps^5, polynomial in eps2 of order 1 -141115, 41604, 92160, // C1p[6]/eps^6, polynomial in eps2 of order 1 -2200311, 533134, 860160, // C1p[7]/eps^7, polynomial in eps2 of order 0 459485, 516096, // C1p[8]/eps^8, polynomial in eps2 of order 0 109167851, 82575360, }; #else #error "Bad value for GEOGRAPHICLIB_GEODESIC_ORDER" #endif static_assert(sizeof(coeff) / sizeof(real) == (nC1p_*nC1p_ + 7*nC1p_ - 2*(nC1p_/2)) / 4, "Coefficient array size mismatch in C1pf"); real eps2 = Math::sq(eps), d = eps; int o = 0; for (int l = 1; l <= nC1p_; ++l) { // l is index of C1p[l] int m = (nC1p_ - l) / 2; // order of polynomial in eps^2 c[l] = d * Math::polyval(m, coeff + o, eps2) / coeff[o + m + 1]; o += m + 2; d *= eps; } // Post condition: o == sizeof(coeff) / sizeof(real) } // The scale factor A2-1 = mean value of (d/dsigma)I2 - 1 Math::real Geodesic::A2m1f(real eps) { // Generated by Maxima on 2015-05-29 08:09:47-04:00 #if GEOGRAPHICLIB_GEODESIC_ORDER/2 == 1 static const real coeff[] = { // (eps+1)*A2-1, polynomial in eps2 of order 1 -3, 0, 4, }; // count = 3 #elif GEOGRAPHICLIB_GEODESIC_ORDER/2 == 2 static const real coeff[] = { // (eps+1)*A2-1, polynomial in eps2 of order 2 -7, -48, 0, 64, }; // count = 4 #elif GEOGRAPHICLIB_GEODESIC_ORDER/2 == 3 static const real coeff[] = { // (eps+1)*A2-1, polynomial in eps2 of order 3 -11, -28, -192, 0, 256, }; // count = 5 #elif GEOGRAPHICLIB_GEODESIC_ORDER/2 == 4 static const real coeff[] = { // (eps+1)*A2-1, polynomial in eps2 of order 4 -375, -704, -1792, -12288, 0, 16384, }; // count = 6 #else #error "Bad value for GEOGRAPHICLIB_GEODESIC_ORDER" #endif static_assert(sizeof(coeff) / sizeof(real) == nA2_/2 + 2, "Coefficient array size mismatch in A2m1f"); int m = nA2_/2; real t = Math::polyval(m, coeff, Math::sq(eps)) / coeff[m + 1]; return (t - eps) / (1 + eps); } // The coefficients C2[l] in the Fourier expansion of B2 void Geodesic::C2f(real eps, real c[]) { // Generated by Maxima on 2015-05-05 18:08:12-04:00 #if GEOGRAPHICLIB_GEODESIC_ORDER == 3 static const real coeff[] = { // C2[1]/eps^1, polynomial in eps2 of order 1 1, 8, 16, // C2[2]/eps^2, polynomial in eps2 of order 0 3, 16, // C2[3]/eps^3, polynomial in eps2 of order 0 5, 48, }; #elif GEOGRAPHICLIB_GEODESIC_ORDER == 4 static const real coeff[] = { // C2[1]/eps^1, polynomial in eps2 of order 1 1, 8, 16, // C2[2]/eps^2, polynomial in eps2 of order 1 1, 6, 32, // C2[3]/eps^3, polynomial in eps2 of order 0 5, 48, // C2[4]/eps^4, polynomial in eps2 of order 0 35, 512, }; #elif GEOGRAPHICLIB_GEODESIC_ORDER == 5 static const real coeff[] = { // C2[1]/eps^1, polynomial in eps2 of order 2 1, 2, 16, 32, // C2[2]/eps^2, polynomial in eps2 of order 1 1, 6, 32, // C2[3]/eps^3, polynomial in eps2 of order 1 15, 80, 768, // C2[4]/eps^4, polynomial in eps2 of order 0 35, 512, // C2[5]/eps^5, polynomial in eps2 of order 0 63, 1280, }; #elif GEOGRAPHICLIB_GEODESIC_ORDER == 6 static const real coeff[] = { // C2[1]/eps^1, polynomial in eps2 of order 2 1, 2, 16, 32, // C2[2]/eps^2, polynomial in eps2 of order 2 35, 64, 384, 2048, // C2[3]/eps^3, polynomial in eps2 of order 1 15, 80, 768, // C2[4]/eps^4, polynomial in eps2 of order 1 7, 35, 512, // C2[5]/eps^5, polynomial in eps2 of order 0 63, 1280, // C2[6]/eps^6, polynomial in eps2 of order 0 77, 2048, }; #elif GEOGRAPHICLIB_GEODESIC_ORDER == 7 static const real coeff[] = { // C2[1]/eps^1, polynomial in eps2 of order 3 41, 64, 128, 1024, 2048, // C2[2]/eps^2, polynomial in eps2 of order 2 35, 64, 384, 2048, // C2[3]/eps^3, polynomial in eps2 of order 2 69, 120, 640, 6144, // C2[4]/eps^4, polynomial in eps2 of order 1 7, 35, 512, // C2[5]/eps^5, polynomial in eps2 of order 1 105, 504, 10240, // C2[6]/eps^6, polynomial in eps2 of order 0 77, 2048, // C2[7]/eps^7, polynomial in eps2 of order 0 429, 14336, }; #elif GEOGRAPHICLIB_GEODESIC_ORDER == 8 static const real coeff[] = { // C2[1]/eps^1, polynomial in eps2 of order 3 41, 64, 128, 1024, 2048, // C2[2]/eps^2, polynomial in eps2 of order 3 47, 70, 128, 768, 4096, // C2[3]/eps^3, polynomial in eps2 of order 2 69, 120, 640, 6144, // C2[4]/eps^4, polynomial in eps2 of order 2 133, 224, 1120, 16384, // C2[5]/eps^5, polynomial in eps2 of order 1 105, 504, 10240, // C2[6]/eps^6, polynomial in eps2 of order 1 33, 154, 4096, // C2[7]/eps^7, polynomial in eps2 of order 0 429, 14336, // C2[8]/eps^8, polynomial in eps2 of order 0 6435, 262144, }; #else #error "Bad value for GEOGRAPHICLIB_GEODESIC_ORDER" #endif static_assert(sizeof(coeff) / sizeof(real) == (nC2_*nC2_ + 7*nC2_ - 2*(nC2_/2)) / 4, "Coefficient array size mismatch in C2f"); real eps2 = Math::sq(eps), d = eps; int o = 0; for (int l = 1; l <= nC2_; ++l) { // l is index of C2[l] int m = (nC2_ - l) / 2; // order of polynomial in eps^2 c[l] = d * Math::polyval(m, coeff + o, eps2) / coeff[o + m + 1]; o += m + 2; d *= eps; } // Post condition: o == sizeof(coeff) / sizeof(real) } // The scale factor A3 = mean value of (d/dsigma)I3 void Geodesic::A3coeff() { // Generated by Maxima on 2015-05-05 18:08:13-04:00 #if GEOGRAPHICLIB_GEODESIC_ORDER == 3 static const real coeff[] = { // A3, coeff of eps^2, polynomial in n of order 0 -1, 4, // A3, coeff of eps^1, polynomial in n of order 1 1, -1, 2, // A3, coeff of eps^0, polynomial in n of order 0 1, 1, }; #elif GEOGRAPHICLIB_GEODESIC_ORDER == 4 static const real coeff[] = { // A3, coeff of eps^3, polynomial in n of order 0 -1, 16, // A3, coeff of eps^2, polynomial in n of order 1 -1, -2, 8, // A3, coeff of eps^1, polynomial in n of order 1 1, -1, 2, // A3, coeff of eps^0, polynomial in n of order 0 1, 1, }; #elif GEOGRAPHICLIB_GEODESIC_ORDER == 5 static const real coeff[] = { // A3, coeff of eps^4, polynomial in n of order 0 -3, 64, // A3, coeff of eps^3, polynomial in n of order 1 -3, -1, 16, // A3, coeff of eps^2, polynomial in n of order 2 3, -1, -2, 8, // A3, coeff of eps^1, polynomial in n of order 1 1, -1, 2, // A3, coeff of eps^0, polynomial in n of order 0 1, 1, }; #elif GEOGRAPHICLIB_GEODESIC_ORDER == 6 static const real coeff[] = { // A3, coeff of eps^5, polynomial in n of order 0 -3, 128, // A3, coeff of eps^4, polynomial in n of order 1 -2, -3, 64, // A3, coeff of eps^3, polynomial in n of order 2 -1, -3, -1, 16, // A3, coeff of eps^2, polynomial in n of order 2 3, -1, -2, 8, // A3, coeff of eps^1, polynomial in n of order 1 1, -1, 2, // A3, coeff of eps^0, polynomial in n of order 0 1, 1, }; #elif GEOGRAPHICLIB_GEODESIC_ORDER == 7 static const real coeff[] = { // A3, coeff of eps^6, polynomial in n of order 0 -5, 256, // A3, coeff of eps^5, polynomial in n of order 1 -5, -3, 128, // A3, coeff of eps^4, polynomial in n of order 2 -10, -2, -3, 64, // A3, coeff of eps^3, polynomial in n of order 3 5, -1, -3, -1, 16, // A3, coeff of eps^2, polynomial in n of order 2 3, -1, -2, 8, // A3, coeff of eps^1, polynomial in n of order 1 1, -1, 2, // A3, coeff of eps^0, polynomial in n of order 0 1, 1, }; #elif GEOGRAPHICLIB_GEODESIC_ORDER == 8 static const real coeff[] = { // A3, coeff of eps^7, polynomial in n of order 0 -25, 2048, // A3, coeff of eps^6, polynomial in n of order 1 -15, -20, 1024, // A3, coeff of eps^5, polynomial in n of order 2 -5, -10, -6, 256, // A3, coeff of eps^4, polynomial in n of order 3 -5, -20, -4, -6, 128, // A3, coeff of eps^3, polynomial in n of order 3 5, -1, -3, -1, 16, // A3, coeff of eps^2, polynomial in n of order 2 3, -1, -2, 8, // A3, coeff of eps^1, polynomial in n of order 1 1, -1, 2, // A3, coeff of eps^0, polynomial in n of order 0 1, 1, }; #else #error "Bad value for GEOGRAPHICLIB_GEODESIC_ORDER" #endif static_assert(sizeof(coeff) / sizeof(real) == (nA3_*nA3_ + 7*nA3_ - 2*(nA3_/2)) / 4, "Coefficient array size mismatch in A3f"); int o = 0, k = 0; for (int j = nA3_ - 1; j >= 0; --j) { // coeff of eps^j int m = min(nA3_ - j - 1, j); // order of polynomial in n _aA3x[k++] = Math::polyval(m, coeff + o, _n) / coeff[o + m + 1]; o += m + 2; } // Post condition: o == sizeof(coeff) / sizeof(real) && k == nA3x_ } // The coefficients C3[l] in the Fourier expansion of B3 void Geodesic::C3coeff() { // Generated by Maxima on 2015-05-05 18:08:13-04:00 #if GEOGRAPHICLIB_GEODESIC_ORDER == 3 static const real coeff[] = { // C3[1], coeff of eps^2, polynomial in n of order 0 1, 8, // C3[1], coeff of eps^1, polynomial in n of order 1 -1, 1, 4, // C3[2], coeff of eps^2, polynomial in n of order 0 1, 16, }; #elif GEOGRAPHICLIB_GEODESIC_ORDER == 4 static const real coeff[] = { // C3[1], coeff of eps^3, polynomial in n of order 0 3, 64, // C3[1], coeff of eps^2, polynomial in n of order 1 // This is a case where a leading 0 term has been inserted to maintain the // pattern in the orders of the polynomials. 0, 1, 8, // C3[1], coeff of eps^1, polynomial in n of order 1 -1, 1, 4, // C3[2], coeff of eps^3, polynomial in n of order 0 3, 64, // C3[2], coeff of eps^2, polynomial in n of order 1 -3, 2, 32, // C3[3], coeff of eps^3, polynomial in n of order 0 5, 192, }; #elif GEOGRAPHICLIB_GEODESIC_ORDER == 5 static const real coeff[] = { // C3[1], coeff of eps^4, polynomial in n of order 0 5, 128, // C3[1], coeff of eps^3, polynomial in n of order 1 3, 3, 64, // C3[1], coeff of eps^2, polynomial in n of order 2 -1, 0, 1, 8, // C3[1], coeff of eps^1, polynomial in n of order 1 -1, 1, 4, // C3[2], coeff of eps^4, polynomial in n of order 0 3, 128, // C3[2], coeff of eps^3, polynomial in n of order 1 -2, 3, 64, // C3[2], coeff of eps^2, polynomial in n of order 2 1, -3, 2, 32, // C3[3], coeff of eps^4, polynomial in n of order 0 3, 128, // C3[3], coeff of eps^3, polynomial in n of order 1 -9, 5, 192, // C3[4], coeff of eps^4, polynomial in n of order 0 7, 512, }; #elif GEOGRAPHICLIB_GEODESIC_ORDER == 6 static const real coeff[] = { // C3[1], coeff of eps^5, polynomial in n of order 0 3, 128, // C3[1], coeff of eps^4, polynomial in n of order 1 2, 5, 128, // C3[1], coeff of eps^3, polynomial in n of order 2 -1, 3, 3, 64, // C3[1], coeff of eps^2, polynomial in n of order 2 -1, 0, 1, 8, // C3[1], coeff of eps^1, polynomial in n of order 1 -1, 1, 4, // C3[2], coeff of eps^5, polynomial in n of order 0 5, 256, // C3[2], coeff of eps^4, polynomial in n of order 1 1, 3, 128, // C3[2], coeff of eps^3, polynomial in n of order 2 -3, -2, 3, 64, // C3[2], coeff of eps^2, polynomial in n of order 2 1, -3, 2, 32, // C3[3], coeff of eps^5, polynomial in n of order 0 7, 512, // C3[3], coeff of eps^4, polynomial in n of order 1 -10, 9, 384, // C3[3], coeff of eps^3, polynomial in n of order 2 5, -9, 5, 192, // C3[4], coeff of eps^5, polynomial in n of order 0 7, 512, // C3[4], coeff of eps^4, polynomial in n of order 1 -14, 7, 512, // C3[5], coeff of eps^5, polynomial in n of order 0 21, 2560, }; #elif GEOGRAPHICLIB_GEODESIC_ORDER == 7 static const real coeff[] = { // C3[1], coeff of eps^6, polynomial in n of order 0 21, 1024, // C3[1], coeff of eps^5, polynomial in n of order 1 11, 12, 512, // C3[1], coeff of eps^4, polynomial in n of order 2 2, 2, 5, 128, // C3[1], coeff of eps^3, polynomial in n of order 3 -5, -1, 3, 3, 64, // C3[1], coeff of eps^2, polynomial in n of order 2 -1, 0, 1, 8, // C3[1], coeff of eps^1, polynomial in n of order 1 -1, 1, 4, // C3[2], coeff of eps^6, polynomial in n of order 0 27, 2048, // C3[2], coeff of eps^5, polynomial in n of order 1 1, 5, 256, // C3[2], coeff of eps^4, polynomial in n of order 2 -9, 2, 6, 256, // C3[2], coeff of eps^3, polynomial in n of order 3 2, -3, -2, 3, 64, // C3[2], coeff of eps^2, polynomial in n of order 2 1, -3, 2, 32, // C3[3], coeff of eps^6, polynomial in n of order 0 3, 256, // C3[3], coeff of eps^5, polynomial in n of order 1 -4, 21, 1536, // C3[3], coeff of eps^4, polynomial in n of order 2 -6, -10, 9, 384, // C3[3], coeff of eps^3, polynomial in n of order 3 -1, 5, -9, 5, 192, // C3[4], coeff of eps^6, polynomial in n of order 0 9, 1024, // C3[4], coeff of eps^5, polynomial in n of order 1 -10, 7, 512, // C3[4], coeff of eps^4, polynomial in n of order 2 10, -14, 7, 512, // C3[5], coeff of eps^6, polynomial in n of order 0 9, 1024, // C3[5], coeff of eps^5, polynomial in n of order 1 -45, 21, 2560, // C3[6], coeff of eps^6, polynomial in n of order 0 11, 2048, }; #elif GEOGRAPHICLIB_GEODESIC_ORDER == 8 static const real coeff[] = { // C3[1], coeff of eps^7, polynomial in n of order 0 243, 16384, // C3[1], coeff of eps^6, polynomial in n of order 1 10, 21, 1024, // C3[1], coeff of eps^5, polynomial in n of order 2 3, 11, 12, 512, // C3[1], coeff of eps^4, polynomial in n of order 3 -2, 2, 2, 5, 128, // C3[1], coeff of eps^3, polynomial in n of order 3 -5, -1, 3, 3, 64, // C3[1], coeff of eps^2, polynomial in n of order 2 -1, 0, 1, 8, // C3[1], coeff of eps^1, polynomial in n of order 1 -1, 1, 4, // C3[2], coeff of eps^7, polynomial in n of order 0 187, 16384, // C3[2], coeff of eps^6, polynomial in n of order 1 69, 108, 8192, // C3[2], coeff of eps^5, polynomial in n of order 2 -2, 1, 5, 256, // C3[2], coeff of eps^4, polynomial in n of order 3 -6, -9, 2, 6, 256, // C3[2], coeff of eps^3, polynomial in n of order 3 2, -3, -2, 3, 64, // C3[2], coeff of eps^2, polynomial in n of order 2 1, -3, 2, 32, // C3[3], coeff of eps^7, polynomial in n of order 0 139, 16384, // C3[3], coeff of eps^6, polynomial in n of order 1 -1, 12, 1024, // C3[3], coeff of eps^5, polynomial in n of order 2 -77, -8, 42, 3072, // C3[3], coeff of eps^4, polynomial in n of order 3 10, -6, -10, 9, 384, // C3[3], coeff of eps^3, polynomial in n of order 3 -1, 5, -9, 5, 192, // C3[4], coeff of eps^7, polynomial in n of order 0 127, 16384, // C3[4], coeff of eps^6, polynomial in n of order 1 -43, 72, 8192, // C3[4], coeff of eps^5, polynomial in n of order 2 -7, -40, 28, 2048, // C3[4], coeff of eps^4, polynomial in n of order 3 -7, 20, -28, 14, 1024, // C3[5], coeff of eps^7, polynomial in n of order 0 99, 16384, // C3[5], coeff of eps^6, polynomial in n of order 1 -15, 9, 1024, // C3[5], coeff of eps^5, polynomial in n of order 2 75, -90, 42, 5120, // C3[6], coeff of eps^7, polynomial in n of order 0 99, 16384, // C3[6], coeff of eps^6, polynomial in n of order 1 -99, 44, 8192, // C3[7], coeff of eps^7, polynomial in n of order 0 429, 114688, }; #else #error "Bad value for GEOGRAPHICLIB_GEODESIC_ORDER" #endif static_assert(sizeof(coeff) / sizeof(real) == ((nC3_-1)*(nC3_*nC3_ + 7*nC3_ - 2*(nC3_/2)))/8, "Coefficient array size mismatch in C3coeff"); int o = 0, k = 0; for (int l = 1; l < nC3_; ++l) { // l is index of C3[l] for (int j = nC3_ - 1; j >= l; --j) { // coeff of eps^j int m = min(nC3_ - j - 1, j); // order of polynomial in n _cC3x[k++] = Math::polyval(m, coeff + o, _n) / coeff[o + m + 1]; o += m + 2; } } // Post condition: o == sizeof(coeff) / sizeof(real) && k == nC3x_ } void Geodesic::C4coeff() { // Generated by Maxima on 2015-05-05 18:08:13-04:00 #if GEOGRAPHICLIB_GEODESIC_ORDER == 3 static const real coeff[] = { // C4[0], coeff of eps^2, polynomial in n of order 0 -2, 105, // C4[0], coeff of eps^1, polynomial in n of order 1 16, -7, 35, // C4[0], coeff of eps^0, polynomial in n of order 2 8, -28, 70, 105, // C4[1], coeff of eps^2, polynomial in n of order 0 -2, 105, // C4[1], coeff of eps^1, polynomial in n of order 1 -16, 7, 315, // C4[2], coeff of eps^2, polynomial in n of order 0 4, 525, }; #elif GEOGRAPHICLIB_GEODESIC_ORDER == 4 static const real coeff[] = { // C4[0], coeff of eps^3, polynomial in n of order 0 11, 315, // C4[0], coeff of eps^2, polynomial in n of order 1 -32, -6, 315, // C4[0], coeff of eps^1, polynomial in n of order 2 -32, 48, -21, 105, // C4[0], coeff of eps^0, polynomial in n of order 3 4, 24, -84, 210, 315, // C4[1], coeff of eps^3, polynomial in n of order 0 -1, 105, // C4[1], coeff of eps^2, polynomial in n of order 1 64, -18, 945, // C4[1], coeff of eps^1, polynomial in n of order 2 32, -48, 21, 945, // C4[2], coeff of eps^3, polynomial in n of order 0 -8, 1575, // C4[2], coeff of eps^2, polynomial in n of order 1 -32, 12, 1575, // C4[3], coeff of eps^3, polynomial in n of order 0 8, 2205, }; #elif GEOGRAPHICLIB_GEODESIC_ORDER == 5 static const real coeff[] = { // C4[0], coeff of eps^4, polynomial in n of order 0 4, 1155, // C4[0], coeff of eps^3, polynomial in n of order 1 -368, 121, 3465, // C4[0], coeff of eps^2, polynomial in n of order 2 1088, -352, -66, 3465, // C4[0], coeff of eps^1, polynomial in n of order 3 48, -352, 528, -231, 1155, // C4[0], coeff of eps^0, polynomial in n of order 4 16, 44, 264, -924, 2310, 3465, // C4[1], coeff of eps^4, polynomial in n of order 0 4, 1155, // C4[1], coeff of eps^3, polynomial in n of order 1 80, -99, 10395, // C4[1], coeff of eps^2, polynomial in n of order 2 -896, 704, -198, 10395, // C4[1], coeff of eps^1, polynomial in n of order 3 -48, 352, -528, 231, 10395, // C4[2], coeff of eps^4, polynomial in n of order 0 -8, 1925, // C4[2], coeff of eps^3, polynomial in n of order 1 384, -88, 17325, // C4[2], coeff of eps^2, polynomial in n of order 2 320, -352, 132, 17325, // C4[3], coeff of eps^4, polynomial in n of order 0 -16, 8085, // C4[3], coeff of eps^3, polynomial in n of order 1 -256, 88, 24255, // C4[4], coeff of eps^4, polynomial in n of order 0 64, 31185, }; #elif GEOGRAPHICLIB_GEODESIC_ORDER == 6 static const real coeff[] = { // C4[0], coeff of eps^5, polynomial in n of order 0 97, 15015, // C4[0], coeff of eps^4, polynomial in n of order 1 1088, 156, 45045, // C4[0], coeff of eps^3, polynomial in n of order 2 -224, -4784, 1573, 45045, // C4[0], coeff of eps^2, polynomial in n of order 3 -10656, 14144, -4576, -858, 45045, // C4[0], coeff of eps^1, polynomial in n of order 4 64, 624, -4576, 6864, -3003, 15015, // C4[0], coeff of eps^0, polynomial in n of order 5 100, 208, 572, 3432, -12012, 30030, 45045, // C4[1], coeff of eps^5, polynomial in n of order 0 1, 9009, // C4[1], coeff of eps^4, polynomial in n of order 1 -2944, 468, 135135, // C4[1], coeff of eps^3, polynomial in n of order 2 5792, 1040, -1287, 135135, // C4[1], coeff of eps^2, polynomial in n of order 3 5952, -11648, 9152, -2574, 135135, // C4[1], coeff of eps^1, polynomial in n of order 4 -64, -624, 4576, -6864, 3003, 135135, // C4[2], coeff of eps^5, polynomial in n of order 0 8, 10725, // C4[2], coeff of eps^4, polynomial in n of order 1 1856, -936, 225225, // C4[2], coeff of eps^3, polynomial in n of order 2 -8448, 4992, -1144, 225225, // C4[2], coeff of eps^2, polynomial in n of order 3 -1440, 4160, -4576, 1716, 225225, // C4[3], coeff of eps^5, polynomial in n of order 0 -136, 63063, // C4[3], coeff of eps^4, polynomial in n of order 1 1024, -208, 105105, // C4[3], coeff of eps^3, polynomial in n of order 2 3584, -3328, 1144, 315315, // C4[4], coeff of eps^5, polynomial in n of order 0 -128, 135135, // C4[4], coeff of eps^4, polynomial in n of order 1 -2560, 832, 405405, // C4[5], coeff of eps^5, polynomial in n of order 0 128, 99099, }; #elif GEOGRAPHICLIB_GEODESIC_ORDER == 7 static const real coeff[] = { // C4[0], coeff of eps^6, polynomial in n of order 0 10, 9009, // C4[0], coeff of eps^5, polynomial in n of order 1 -464, 291, 45045, // C4[0], coeff of eps^4, polynomial in n of order 2 -4480, 1088, 156, 45045, // C4[0], coeff of eps^3, polynomial in n of order 3 10736, -224, -4784, 1573, 45045, // C4[0], coeff of eps^2, polynomial in n of order 4 1664, -10656, 14144, -4576, -858, 45045, // C4[0], coeff of eps^1, polynomial in n of order 5 16, 64, 624, -4576, 6864, -3003, 15015, // C4[0], coeff of eps^0, polynomial in n of order 6 56, 100, 208, 572, 3432, -12012, 30030, 45045, // C4[1], coeff of eps^6, polynomial in n of order 0 10, 9009, // C4[1], coeff of eps^5, polynomial in n of order 1 112, 15, 135135, // C4[1], coeff of eps^4, polynomial in n of order 2 3840, -2944, 468, 135135, // C4[1], coeff of eps^3, polynomial in n of order 3 -10704, 5792, 1040, -1287, 135135, // C4[1], coeff of eps^2, polynomial in n of order 4 -768, 5952, -11648, 9152, -2574, 135135, // C4[1], coeff of eps^1, polynomial in n of order 5 -16, -64, -624, 4576, -6864, 3003, 135135, // C4[2], coeff of eps^6, polynomial in n of order 0 -4, 25025, // C4[2], coeff of eps^5, polynomial in n of order 1 -1664, 168, 225225, // C4[2], coeff of eps^4, polynomial in n of order 2 1664, 1856, -936, 225225, // C4[2], coeff of eps^3, polynomial in n of order 3 6784, -8448, 4992, -1144, 225225, // C4[2], coeff of eps^2, polynomial in n of order 4 128, -1440, 4160, -4576, 1716, 225225, // C4[3], coeff of eps^6, polynomial in n of order 0 64, 315315, // C4[3], coeff of eps^5, polynomial in n of order 1 1792, -680, 315315, // C4[3], coeff of eps^4, polynomial in n of order 2 -2048, 1024, -208, 105105, // C4[3], coeff of eps^3, polynomial in n of order 3 -1792, 3584, -3328, 1144, 315315, // C4[4], coeff of eps^6, polynomial in n of order 0 -512, 405405, // C4[4], coeff of eps^5, polynomial in n of order 1 2048, -384, 405405, // C4[4], coeff of eps^4, polynomial in n of order 2 3072, -2560, 832, 405405, // C4[5], coeff of eps^6, polynomial in n of order 0 -256, 495495, // C4[5], coeff of eps^5, polynomial in n of order 1 -2048, 640, 495495, // C4[6], coeff of eps^6, polynomial in n of order 0 512, 585585, }; #elif GEOGRAPHICLIB_GEODESIC_ORDER == 8 static const real coeff[] = { // C4[0], coeff of eps^7, polynomial in n of order 0 193, 85085, // C4[0], coeff of eps^6, polynomial in n of order 1 4192, 850, 765765, // C4[0], coeff of eps^5, polynomial in n of order 2 20960, -7888, 4947, 765765, // C4[0], coeff of eps^4, polynomial in n of order 3 12480, -76160, 18496, 2652, 765765, // C4[0], coeff of eps^3, polynomial in n of order 4 -154048, 182512, -3808, -81328, 26741, 765765, // C4[0], coeff of eps^2, polynomial in n of order 5 3232, 28288, -181152, 240448, -77792, -14586, 765765, // C4[0], coeff of eps^1, polynomial in n of order 6 96, 272, 1088, 10608, -77792, 116688, -51051, 255255, // C4[0], coeff of eps^0, polynomial in n of order 7 588, 952, 1700, 3536, 9724, 58344, -204204, 510510, 765765, // C4[1], coeff of eps^7, polynomial in n of order 0 349, 2297295, // C4[1], coeff of eps^6, polynomial in n of order 1 -1472, 510, 459459, // C4[1], coeff of eps^5, polynomial in n of order 2 -39840, 1904, 255, 2297295, // C4[1], coeff of eps^4, polynomial in n of order 3 52608, 65280, -50048, 7956, 2297295, // C4[1], coeff of eps^3, polynomial in n of order 4 103744, -181968, 98464, 17680, -21879, 2297295, // C4[1], coeff of eps^2, polynomial in n of order 5 -1344, -13056, 101184, -198016, 155584, -43758, 2297295, // C4[1], coeff of eps^1, polynomial in n of order 6 -96, -272, -1088, -10608, 77792, -116688, 51051, 2297295, // C4[2], coeff of eps^7, polynomial in n of order 0 464, 1276275, // C4[2], coeff of eps^6, polynomial in n of order 1 -928, -612, 3828825, // C4[2], coeff of eps^5, polynomial in n of order 2 64256, -28288, 2856, 3828825, // C4[2], coeff of eps^4, polynomial in n of order 3 -126528, 28288, 31552, -15912, 3828825, // C4[2], coeff of eps^3, polynomial in n of order 4 -41472, 115328, -143616, 84864, -19448, 3828825, // C4[2], coeff of eps^2, polynomial in n of order 5 160, 2176, -24480, 70720, -77792, 29172, 3828825, // C4[3], coeff of eps^7, polynomial in n of order 0 -16, 97461, // C4[3], coeff of eps^6, polynomial in n of order 1 -16384, 1088, 5360355, // C4[3], coeff of eps^5, polynomial in n of order 2 -2560, 30464, -11560, 5360355, // C4[3], coeff of eps^4, polynomial in n of order 3 35840, -34816, 17408, -3536, 1786785, // C4[3], coeff of eps^3, polynomial in n of order 4 7168, -30464, 60928, -56576, 19448, 5360355, // C4[4], coeff of eps^7, polynomial in n of order 0 128, 2297295, // C4[4], coeff of eps^6, polynomial in n of order 1 26624, -8704, 6891885, // C4[4], coeff of eps^5, polynomial in n of order 2 -77824, 34816, -6528, 6891885, // C4[4], coeff of eps^4, polynomial in n of order 3 -32256, 52224, -43520, 14144, 6891885, // C4[5], coeff of eps^7, polynomial in n of order 0 -6784, 8423415, // C4[5], coeff of eps^6, polynomial in n of order 1 24576, -4352, 8423415, // C4[5], coeff of eps^5, polynomial in n of order 2 45056, -34816, 10880, 8423415, // C4[6], coeff of eps^7, polynomial in n of order 0 -1024, 3318315, // C4[6], coeff of eps^6, polynomial in n of order 1 -28672, 8704, 9954945, // C4[7], coeff of eps^7, polynomial in n of order 0 1024, 1640925, }; #else #error "Bad value for GEOGRAPHICLIB_GEODESIC_ORDER" #endif static_assert(sizeof(coeff) / sizeof(real) == (nC4_ * (nC4_ + 1) * (nC4_ + 5)) / 6, "Coefficient array size mismatch in C4coeff"); int o = 0, k = 0; for (int l = 0; l < nC4_; ++l) { // l is index of C4[l] for (int j = nC4_ - 1; j >= l; --j) { // coeff of eps^j int m = nC4_ - j - 1; // order of polynomial in n _cC4x[k++] = Math::polyval(m, coeff + o, _n) / coeff[o + m + 1]; o += m + 2; } } // Post condition: o == sizeof(coeff) / sizeof(real) && k == nC4x_ } } // namespace GeographicLib geosphere/src/LambertConformalConic.h0000644000176200001440000003466414323400205017404 0ustar liggesusers/** * \file LambertConformalConic.hpp * \brief Header for GeographicLib::LambertConformalConic class * * Copyright (c) Charles Karney (2010-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #if !defined(GEOGRAPHICLIB_LAMBERTCONFORMALCONIC_HPP) #define GEOGRAPHICLIB_LAMBERTCONFORMALCONIC_HPP 1 #include "Constants.h" namespace GeographicLib { /** * \brief Lambert conformal conic projection * * Implementation taken from the report, * - J. P. Snyder, * Map Projections: A * Working Manual, USGS Professional Paper 1395 (1987), * pp. 107--109. * * This is a implementation of the equations in Snyder except that divided * differences have been used to transform the expressions into ones which * may be evaluated accurately and that Newton's method is used to invert the * projection. In this implementation, the projection correctly becomes the * Mercator projection or the polar stereographic projection when the * standard latitude is the equator or a pole. The accuracy of the * projections is about 10 nm (10 nanometers). * * The ellipsoid parameters, the standard parallels, and the scale on the * standard parallels are set in the constructor. Internally, the case with * two standard parallels is converted into a single standard parallel, the * latitude of tangency (also the latitude of minimum scale), with a scale * specified on this parallel. This latitude is also used as the latitude of * origin which is returned by LambertConformalConic::OriginLatitude. The * scale on the latitude of origin is given by * LambertConformalConic::CentralScale. The case with two distinct standard * parallels where one is a pole is singular and is disallowed. The central * meridian (which is a trivial shift of the longitude) is specified as the * \e lon0 argument of the LambertConformalConic::Forward and * LambertConformalConic::Reverse functions. * * This class also returns the meridian convergence \e gamma and scale \e k. * The meridian convergence is the bearing of grid north (the \e y axis) * measured clockwise from true north. * * There is no provision in this * class for specifying a false easting or false northing or a different * latitude of origin. However these are can be simply included by the * calling function. For example the Pennsylvania South state coordinate * system ( * EPSG:3364) is obtained by: * \include example-LambertConformalConic.cpp * * ConicProj is a command-line utility * providing access to the functionality of LambertConformalConic and * AlbersEqualArea. **********************************************************************/ class GEOGRAPHICLIB_EXPORT LambertConformalConic { private: typedef Math::real real; real eps_, epsx_, ahypover_; real _a, _f, _fm, _e2, _es; real _sign, _n, _nc, _t0nm1, _scale, _lat0, _k0; real _scbet0, _tchi0, _scchi0, _psi0, _nrho0, _drhomax; static const int numit_ = 5; static real hyp(real x) { using std::hypot; return hypot(real(1), x); } // Divided differences // Definition: Df(x,y) = (f(x)-f(y))/(x-y) // See: // W. M. Kahan and R. J. Fateman, // Symbolic computation of divided differences, // SIGSAM Bull. 33(2), 7-28 (1999) // https://doi.org/10.1145/334714.334716 // http://www.cs.berkeley.edu/~fateman/papers/divdiff.pdf // // General rules // h(x) = f(g(x)): Dh(x,y) = Df(g(x),g(y))*Dg(x,y) // h(x) = f(x)*g(x): // Dh(x,y) = Df(x,y)*g(x) + Dg(x,y)*f(y) // = Df(x,y)*g(y) + Dg(x,y)*f(x) // = Df(x,y)*(g(x)+g(y))/2 + Dg(x,y)*(f(x)+f(y))/2 // // hyp(x) = sqrt(1+x^2): Dhyp(x,y) = (x+y)/(hyp(x)+hyp(y)) static real Dhyp(real x, real y, real hx, real hy) // hx = hyp(x) { return (x + y) / (hx + hy); } // sn(x) = x/sqrt(1+x^2): Dsn(x,y) = (x+y)/((sn(x)+sn(y))*(1+x^2)*(1+y^2)) static real Dsn(real x, real y, real sx, real sy) { // sx = x/hyp(x) real t = x * y; return t > 0 ? (x + y) * Math::sq( (sx * sy)/t ) / (sx + sy) : (x - y != 0 ? (sx - sy) / (x - y) : 1); } // Dlog1p(x,y) = log1p((x-y)/(1+y))/(x-y) static real Dlog1p(real x, real y) { using std::log1p; real t = x - y; if (t < 0) { t = -t; y = x; } return t != 0 ? log1p(t / (1 + y)) / t : 1 / (1 + x); } // Dexp(x,y) = exp((x+y)/2) * 2*sinh((x-y)/2)/(x-y) static real Dexp(real x, real y) { using std::sinh; using std::exp; real t = (x - y)/2; return (t != 0 ? sinh(t)/t : 1) * exp((x + y)/2); } // Dsinh(x,y) = 2*sinh((x-y)/2)/(x-y) * cosh((x+y)/2) // cosh((x+y)/2) = (c+sinh(x)*sinh(y)/c)/2 // c=sqrt((1+cosh(x))*(1+cosh(y))) // cosh((x+y)/2) = sqrt( (sinh(x)*sinh(y) + cosh(x)*cosh(y) + 1)/2 ) static real Dsinh(real x, real y, real sx, real sy, real cx, real cy) // sx = sinh(x), cx = cosh(x) { // real t = (x - y)/2, c = sqrt((1 + cx) * (1 + cy)); // return (t ? sinh(t)/t : real(1)) * (c + sx * sy / c) /2; using std::sinh; using std::sqrt; real t = (x - y)/2; return (t != 0 ? sinh(t)/t : 1) * sqrt((sx * sy + cx * cy + 1) /2); } // Dasinh(x,y) = asinh((x-y)*(x+y)/(x*sqrt(1+y^2)+y*sqrt(1+x^2)))/(x-y) // = asinh((x*sqrt(1+y^2)-y*sqrt(1+x^2)))/(x-y) static real Dasinh(real x, real y, real hx, real hy) { // hx = hyp(x) using std::asinh; real t = x - y; return t != 0 ? asinh(x*y > 0 ? t * (x + y) / (x*hy + y*hx) : x*hy - y*hx) / t : 1 / hx; } // Deatanhe(x,y) = eatanhe((x-y)/(1-e^2*x*y))/(x-y) real Deatanhe(real x, real y) const { real t = x - y, d = 1 - _e2 * x * y; return t != 0 ? Math::eatanhe(t / d, _es) / t : _e2 / d; } void Init(real sphi1, real cphi1, real sphi2, real cphi2, real k1); public: /** * Constructor with a single standard parallel. * * @param[in] a equatorial radius of ellipsoid (meters). * @param[in] f flattening of ellipsoid. Setting \e f = 0 gives a sphere. * Negative \e f gives a prolate ellipsoid. * @param[in] stdlat standard parallel (degrees), the circle of tangency. * @param[in] k0 scale on the standard parallel. * @exception GeographicErr if \e a, (1 − \e f) \e a, or \e k0 is * not positive. * @exception GeographicErr if \e stdlat is not in [−90°, * 90°]. **********************************************************************/ LambertConformalConic(real a, real f, real stdlat, real k0); /** * Constructor with two standard parallels. * * @param[in] a equatorial radius of ellipsoid (meters). * @param[in] f flattening of ellipsoid. Setting \e f = 0 gives a sphere. * Negative \e f gives a prolate ellipsoid. * @param[in] stdlat1 first standard parallel (degrees). * @param[in] stdlat2 second standard parallel (degrees). * @param[in] k1 scale on the standard parallels. * @exception GeographicErr if \e a, (1 − \e f) \e a, or \e k1 is * not positive. * @exception GeographicErr if \e stdlat1 or \e stdlat2 is not in * [−90°, 90°], or if either \e stdlat1 or \e * stdlat2 is a pole and \e stdlat1 is not equal \e stdlat2. **********************************************************************/ LambertConformalConic(real a, real f, real stdlat1, real stdlat2, real k1); /** * Constructor with two standard parallels specified by sines and cosines. * * @param[in] a equatorial radius of ellipsoid (meters). * @param[in] f flattening of ellipsoid. Setting \e f = 0 gives a sphere. * Negative \e f gives a prolate ellipsoid. * @param[in] sinlat1 sine of first standard parallel. * @param[in] coslat1 cosine of first standard parallel. * @param[in] sinlat2 sine of second standard parallel. * @param[in] coslat2 cosine of second standard parallel. * @param[in] k1 scale on the standard parallels. * @exception GeographicErr if \e a, (1 − \e f) \e a, or \e k1 is * not positive. * @exception GeographicErr if \e stdlat1 or \e stdlat2 is not in * [−90°, 90°], or if either \e stdlat1 or \e * stdlat2 is a pole and \e stdlat1 is not equal \e stdlat2. * * This allows parallels close to the poles to be specified accurately. * This routine computes the latitude of origin and the scale at this * latitude. In the case where \e lat1 and \e lat2 are different, the * errors in this routines are as follows: if \e dlat = abs(\e lat2 − * \e lat1) ≤ 160° and max(abs(\e lat1), abs(\e lat2)) ≤ 90 * − min(0.0002, 2.2 × 10−6(180 − \e * dlat), 6 × 10−8 dlat2) (in * degrees), then the error in the latitude of origin is less than 4.5 * × 10−14d and the relative error in the scale is * less than 7 × 10−15. **********************************************************************/ LambertConformalConic(real a, real f, real sinlat1, real coslat1, real sinlat2, real coslat2, real k1); /** * Set the scale for the projection. * * @param[in] lat (degrees). * @param[in] k scale at latitude \e lat (default 1). * @exception GeographicErr \e k is not positive. * @exception GeographicErr if \e lat is not in [−90°, * 90°]. **********************************************************************/ void SetScale(real lat, real k = real(1)); /** * Forward projection, from geographic to Lambert conformal conic. * * @param[in] lon0 central meridian longitude (degrees). * @param[in] lat latitude of point (degrees). * @param[in] lon longitude of point (degrees). * @param[out] x easting of point (meters). * @param[out] y northing of point (meters). * @param[out] gamma meridian convergence at point (degrees). * @param[out] k scale of projection at point. * * The latitude origin is given by LambertConformalConic::LatitudeOrigin(). * No false easting or northing is added and \e lat should be in the range * [−90°, 90°]. The error in the projection is less than * about 10 nm (10 nanometers), true distance, and the errors in the * meridian convergence and scale are consistent with this. The values of * \e x and \e y returned for points which project to infinity (i.e., one * or both of the poles) will be large but finite. **********************************************************************/ void Forward(real lon0, real lat, real lon, real& x, real& y, real& gamma, real& k) const; /** * Reverse projection, from Lambert conformal conic to geographic. * * @param[in] lon0 central meridian longitude (degrees). * @param[in] x easting of point (meters). * @param[in] y northing of point (meters). * @param[out] lat latitude of point (degrees). * @param[out] lon longitude of point (degrees). * @param[out] gamma meridian convergence at point (degrees). * @param[out] k scale of projection at point. * * The latitude origin is given by LambertConformalConic::LatitudeOrigin(). * No false easting or northing is added. The value of \e lon returned is * in the range [−180°, 180°]. The error in the projection * is less than about 10 nm (10 nanometers), true distance, and the errors * in the meridian convergence and scale are consistent with this. **********************************************************************/ void Reverse(real lon0, real x, real y, real& lat, real& lon, real& gamma, real& k) const; /** * LambertConformalConic::Forward without returning the convergence and * scale. **********************************************************************/ void Forward(real lon0, real lat, real lon, real& x, real& y) const { real gamma, k; Forward(lon0, lat, lon, x, y, gamma, k); } /** * LambertConformalConic::Reverse without returning the convergence and * scale. **********************************************************************/ void Reverse(real lon0, real x, real y, real& lat, real& lon) const { real gamma, k; Reverse(lon0, x, y, lat, lon, gamma, k); } /** \name Inspector functions **********************************************************************/ ///@{ /** * @return \e a the equatorial radius of the ellipsoid (meters). This is * the value used in the constructor. **********************************************************************/ Math::real EquatorialRadius() const { return _a; } /** * @return \e f the flattening of the ellipsoid. This is the * value used in the constructor. **********************************************************************/ Math::real Flattening() const { return _f; } /** * @return latitude of the origin for the projection (degrees). * * This is the latitude of minimum scale and equals the \e stdlat in the * 1-parallel constructor and lies between \e stdlat1 and \e stdlat2 in the * 2-parallel constructors. **********************************************************************/ Math::real OriginLatitude() const { return _lat0; } /** * @return central scale for the projection. This is the scale on the * latitude of origin. **********************************************************************/ Math::real CentralScale() const { return _k0; } ///@} /** * A global instantiation of LambertConformalConic with the WGS84 * ellipsoid, \e stdlat = 0, and \e k0 = 1. This degenerates to the * Mercator projection. **********************************************************************/ static const LambertConformalConic& Mercator(); }; } // namespace GeographicLib #endif // GEOGRAPHICLIB_LAMBERTCONFORMALCONIC_HPP geosphere/src/TransverseMercator.h0000644000176200001440000002140014323377037017032 0ustar liggesusers/** * \file TransverseMercator.hpp * \brief Header for GeographicLib::TransverseMercator class * * Copyright (c) Charles Karney (2008-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #if !defined(GEOGRAPHICLIB_TRANSVERSEMERCATOR_HPP) #define GEOGRAPHICLIB_TRANSVERSEMERCATOR_HPP 1 #include "Constants.h" #if !defined(GEOGRAPHICLIB_TRANSVERSEMERCATOR_ORDER) /** * The order of the series approximation used in TransverseMercator. * GEOGRAPHICLIB_TRANSVERSEMERCATOR_ORDER can be set to any integer in [4, 8]. **********************************************************************/ # define GEOGRAPHICLIB_TRANSVERSEMERCATOR_ORDER \ (GEOGRAPHICLIB_PRECISION == 2 ? 6 : \ (GEOGRAPHICLIB_PRECISION == 1 ? 4 : 8)) #endif namespace GeographicLib { /** * \brief Transverse Mercator projection * * This uses Krüger's method which evaluates the projection and its * inverse in terms of a series. See * - L. Krüger, * Konforme * Abbildung des Erdellipsoids in der Ebene (Conformal mapping of the * ellipsoidal earth to the plane), Royal Prussian Geodetic Institute, New * Series 52, 172 pp. (1912). * - C. F. F. Karney, * * Transverse Mercator with an accuracy of a few nanometers, * J. Geodesy 85(8), 475--485 (Aug. 2011); * preprint * arXiv:1002.1417. * * Krüger's method has been extended from 4th to 6th order. The maximum * error is 5 nm (5 nanometers), ground distance, for all positions within 35 * degrees of the central meridian. The error in the convergence is 2 * × 10−15" and the relative error in the scale * is 6 × 10−12%%. See Sec. 4 of * arXiv:1002.1417 for details. * The speed penalty in going to 6th order is only about 1%. * * There's a singularity in the projection at φ = 0°, λ * − λ0 = ±(1 − \e e)90° (≈ * ±82.6° for the WGS84 ellipsoid), where \e e is the * eccentricity. Beyond this point, the series ceases to converge and the * results from this method will be garbage. To be on the safe side, don't * use this method if the angular distance from the central meridian exceeds * (1 − 2e)90° (≈ 75° for the WGS84 ellipsoid) * * TransverseMercatorExact is an alternative implementation of the projection * using exact formulas which yield accurate (to 8 nm) results over the * entire ellipsoid. * * The ellipsoid parameters and the central scale are set in the constructor. * The central meridian (which is a trivial shift of the longitude) is * specified as the \e lon0 argument of the TransverseMercator::Forward and * TransverseMercator::Reverse functions. The latitude of origin is taken to * be the equator. There is no provision in this class for specifying a * false easting or false northing or a different latitude of origin. * However these are can be simply included by the calling function. For * example, the UTMUPS class applies the false easting and false northing for * the UTM projections. A more complicated example is the British National * Grid ( * EPSG:7405) which requires the use of a latitude of origin. This is * implemented by the GeographicLib::OSGB class. * * This class also returns the meridian convergence \e gamma and scale \e k. * The meridian convergence is the bearing of grid north (the \e y axis) * measured clockwise from true north. * * See TransverseMercator.cpp for more information on the implementation. * * See \ref transversemercator for a discussion of this projection. * * Example of use: * \include example-TransverseMercator.cpp * * TransverseMercatorProj is a * command-line utility providing access to the functionality of * TransverseMercator and TransverseMercatorExact. **********************************************************************/ class GEOGRAPHICLIB_EXPORT TransverseMercator { private: typedef Math::real real; static const int maxpow_ = GEOGRAPHICLIB_TRANSVERSEMERCATOR_ORDER; static const int numit_ = 5; real _a, _f, _k0, _e2, _es, _e2m, _c, _n; // _alp[0] and _bet[0] unused real _a1, _b1, _alp[maxpow_ + 1], _bet[maxpow_ + 1]; friend class Ellipsoid; // For access to taupf, tauf. public: /** * Constructor for an ellipsoid with * * @param[in] a equatorial radius (meters). * @param[in] f flattening of ellipsoid. Setting \e f = 0 gives a sphere. * Negative \e f gives a prolate ellipsoid. * @param[in] k0 central scale factor. * @exception GeographicErr if \e a, (1 − \e f) \e a, or \e k0 is * not positive. **********************************************************************/ TransverseMercator(real a, real f, real k0); /** * Forward projection, from geographic to transverse Mercator. * * @param[in] lon0 central meridian of the projection (degrees). * @param[in] lat latitude of point (degrees). * @param[in] lon longitude of point (degrees). * @param[out] x easting of point (meters). * @param[out] y northing of point (meters). * @param[out] gamma meridian convergence at point (degrees). * @param[out] k scale of projection at point. * * No false easting or northing is added. \e lat should be in the range * [−90°, 90°]. **********************************************************************/ void Forward(real lon0, real lat, real lon, real& x, real& y, real& gamma, real& k) const; /** * Reverse projection, from transverse Mercator to geographic. * * @param[in] lon0 central meridian of the projection (degrees). * @param[in] x easting of point (meters). * @param[in] y northing of point (meters). * @param[out] lat latitude of point (degrees). * @param[out] lon longitude of point (degrees). * @param[out] gamma meridian convergence at point (degrees). * @param[out] k scale of projection at point. * * No false easting or northing is added. The value of \e lon returned is * in the range [−180°, 180°]. **********************************************************************/ void Reverse(real lon0, real x, real y, real& lat, real& lon, real& gamma, real& k) const; /** * TransverseMercator::Forward without returning the convergence and scale. **********************************************************************/ void Forward(real lon0, real lat, real lon, real& x, real& y) const { real gamma, k; Forward(lon0, lat, lon, x, y, gamma, k); } /** * TransverseMercator::Reverse without returning the convergence and scale. **********************************************************************/ void Reverse(real lon0, real x, real y, real& lat, real& lon) const { real gamma, k; Reverse(lon0, x, y, lat, lon, gamma, k); } /** \name Inspector functions **********************************************************************/ ///@{ /** * @return \e a the equatorial radius of the ellipsoid (meters). This is * the value used in the constructor. **********************************************************************/ Math::real EquatorialRadius() const { return _a; } /** * @return \e f the flattening of the ellipsoid. This is the value used in * the constructor. **********************************************************************/ Math::real Flattening() const { return _f; } /** * @return \e k0 central scale for the projection. This is the value of \e * k0 used in the constructor and is the scale on the central meridian. **********************************************************************/ Math::real CentralScale() const { return _k0; } ///@} /** * A global instantiation of TransverseMercator with the WGS84 ellipsoid * and the UTM scale factor. However, unlike UTM, no false easting or * northing is added. **********************************************************************/ static const TransverseMercator& UTM(); }; } // namespace GeographicLib #endif // GEOGRAPHICLIB_TRANSVERSEMERCATOR_HPP geosphere/src/a_util.c0000644000176200001440000000116114161543551014447 0ustar liggesusers#include #ifndef M_PI #define M_PI (3.1415926535897932384626433) #endif #ifndef M_2PI #define M_2PI (3.1415926535897932384626433 * 2.0) #endif #ifndef M_PI_2 #define M_PI_2 (3.1415926535897932384626433 / 2) #endif double mod(double x, double n) { return(x - n * floor(x/n)); } double normalizeLonDeg(double lon) { return( mod( (lon + 180), 360 ) - 180 ); } double normalizeLonRad(double lon) { return( mod( (lon + M_PI), M_2PI) - M_PI); } /* Convert degrees to radians */ double toRad(double deg) { return deg * 0.0174532925199433; } double toDeg(double rad) { return rad * 57.2957795130823 ; } geosphere/src/Config.h0000644000176200001440000000063014064202407014376 0ustar liggesusers// This will be overwritten by ./configure #define GEOGRAPHICLIB_VERSION_STRING "1.52" #define GEOGRAPHICLIB_VERSION_MAJOR 1 #define GEOGRAPHICLIB_VERSION_MINOR 52 #define GEOGRAPHICLIB_VERSION_PATCH 0 // Undefine HAVE_LONG_DOUBLE if this type is unknown to the compiler #define GEOGRAPHICLIB_HAVE_LONG_DOUBLE 1 // Define WORDS_BIGENDIAN to be 1 if your machine is big endian /* #undef WORDS_BIGENDIAN */ geosphere/src/CassiniSoldner.h0000644000176200001440000002157614323377041016132 0ustar liggesusers/** * \file CassiniSoldner.hpp * \brief Header for GeographicLib::CassiniSoldner class * * Copyright (c) Charles Karney (2009-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #if !defined(GEOGRAPHICLIB_CASSINISOLDNER_HPP) #define GEOGRAPHICLIB_CASSINISOLDNER_HPP 1 #include "Geodesic.h" #include "GeodesicLine.h" #include "Constants.h" namespace GeographicLib { /** * \brief Cassini-Soldner projection * * Cassini-Soldner projection centered at an arbitrary position, \e lat0, \e * lon0, on the ellipsoid. This projection is a transverse cylindrical * equidistant projection. The projection from (\e lat, \e lon) to easting * and northing (\e x, \e y) is defined by geodesics as follows. Go north * along a geodesic a distance \e y from the central point; then turn * clockwise 90° and go a distance \e x along a geodesic. * (Although the initial heading is north, this changes to south if the pole * is crossed.) This procedure uniquely defines the reverse projection. The * forward projection is constructed as follows. Find the point (\e lat1, \e * lon1) on the meridian closest to (\e lat, \e lon). Here we consider the * full meridian so that \e lon1 may be either \e lon0 or \e lon0 + * 180°. \e x is the geodesic distance from (\e lat1, \e lon1) to * (\e lat, \e lon), appropriately signed according to which side of the * central meridian (\e lat, \e lon) lies. \e y is the shortest distance * along the meridian from (\e lat0, \e lon0) to (\e lat1, \e lon1), again, * appropriately signed according to the initial heading. [Note that, in the * case of prolate ellipsoids, the shortest meridional path from (\e lat0, \e * lon0) to (\e lat1, \e lon1) may not be the shortest path.] This procedure * uniquely defines the forward projection except for a small class of points * for which there may be two equally short routes for either leg of the * path. * * Because of the properties of geodesics, the (\e x, \e y) grid is * orthogonal. The scale in the easting direction is unity. The scale, \e * k, in the northing direction is unity on the central meridian and * increases away from the central meridian. The projection routines return * \e azi, the true bearing of the easting direction, and \e rk = 1/\e k, the * reciprocal of the scale in the northing direction. * * The conversions all take place using a Geodesic object (by default * Geodesic::WGS84()). For more information on geodesics see \ref geodesic. * The determination of (\e lat1, \e lon1) in the forward projection is by * solving the inverse geodesic problem for (\e lat, \e lon) and its twin * obtained by reflection in the meridional plane. The scale is found by * determining where two neighboring geodesics intersecting the central * meridian at \e lat1 and \e lat1 + \e dlat1 intersect and taking the ratio * of the reduced lengths for the two geodesics between that point and, * respectively, (\e lat1, \e lon1) and (\e lat, \e lon). * * Example of use: * \include example-CassiniSoldner.cpp * * GeodesicProj is a command-line utility * providing access to the functionality of AzimuthalEquidistant, Gnomonic, * and CassiniSoldner. **********************************************************************/ class GEOGRAPHICLIB_EXPORT CassiniSoldner { private: typedef Math::real real; Geodesic _earth; GeodesicLine _meridian; real _sbet0, _cbet0; static const unsigned maxit_ = 10; public: /** * Constructor for CassiniSoldner. * * @param[in] earth the Geodesic object to use for geodesic calculations. * By default this uses the WGS84 ellipsoid. * * This constructor makes an "uninitialized" object. Call Reset to set the * central latitude and longitude, prior to calling Forward and Reverse. **********************************************************************/ explicit CassiniSoldner(const Geodesic& earth = Geodesic::WGS84()); /** * Constructor for CassiniSoldner specifying a center point. * * @param[in] lat0 latitude of center point of projection (degrees). * @param[in] lon0 longitude of center point of projection (degrees). * @param[in] earth the Geodesic object to use for geodesic calculations. * By default this uses the WGS84 ellipsoid. * * \e lat0 should be in the range [−90°, 90°]. **********************************************************************/ CassiniSoldner(real lat0, real lon0, const Geodesic& earth = Geodesic::WGS84()); /** * Set the central point of the projection * * @param[in] lat0 latitude of center point of projection (degrees). * @param[in] lon0 longitude of center point of projection (degrees). * * \e lat0 should be in the range [−90°, 90°]. **********************************************************************/ void Reset(real lat0, real lon0); /** * Forward projection, from geographic to Cassini-Soldner. * * @param[in] lat latitude of point (degrees). * @param[in] lon longitude of point (degrees). * @param[out] x easting of point (meters). * @param[out] y northing of point (meters). * @param[out] azi azimuth of easting direction at point (degrees). * @param[out] rk reciprocal of azimuthal northing scale at point. * * \e lat should be in the range [−90°, 90°]. A call to * Forward followed by a call to Reverse will return the original (\e lat, * \e lon) (to within roundoff). The routine does nothing if the origin * has not been set. **********************************************************************/ void Forward(real lat, real lon, real& x, real& y, real& azi, real& rk) const; /** * Reverse projection, from Cassini-Soldner to geographic. * * @param[in] x easting of point (meters). * @param[in] y northing of point (meters). * @param[out] lat latitude of point (degrees). * @param[out] lon longitude of point (degrees). * @param[out] azi azimuth of easting direction at point (degrees). * @param[out] rk reciprocal of azimuthal northing scale at point. * * A call to Reverse followed by a call to Forward will return the original * (\e x, \e y) (to within roundoff), provided that \e x and \e y are * sufficiently small not to "wrap around" the earth. The routine does * nothing if the origin has not been set. **********************************************************************/ void Reverse(real x, real y, real& lat, real& lon, real& azi, real& rk) const; /** * CassiniSoldner::Forward without returning the azimuth and scale. **********************************************************************/ void Forward(real lat, real lon, real& x, real& y) const { real azi, rk; Forward(lat, lon, x, y, azi, rk); } /** * CassiniSoldner::Reverse without returning the azimuth and scale. **********************************************************************/ void Reverse(real x, real y, real& lat, real& lon) const { real azi, rk; Reverse(x, y, lat, lon, azi, rk); } /** \name Inspector functions **********************************************************************/ ///@{ /** * @return true if the object has been initialized. **********************************************************************/ bool Init() const { return _meridian.Init(); } /** * @return \e lat0 the latitude of origin (degrees). **********************************************************************/ Math::real LatitudeOrigin() const { return _meridian.Latitude(); } /** * @return \e lon0 the longitude of origin (degrees). **********************************************************************/ Math::real LongitudeOrigin() const { return _meridian.Longitude(); } /** * @return \e a the equatorial radius of the ellipsoid (meters). This is * the value inherited from the Geodesic object used in the constructor. **********************************************************************/ Math::real EquatorialRadius() const { return _earth.EquatorialRadius(); } /** * @return \e f the flattening of the ellipsoid. This is the value * inherited from the Geodesic object used in the constructor. **********************************************************************/ Math::real Flattening() const { return _earth.Flattening(); } ///@} }; } // namespace GeographicLib #endif // GEOGRAPHICLIB_CASSINISOLDNER_HPP geosphere/src/GeodesicExactC4.cpp0000644000176200001440000161607714323377606016461 0ustar liggesusers/** * \file GeodesicExactC4.cpp * \brief Implementation for GeographicLib::GeodesicExact::rawC4coeff * * Copyright (c) Charles Karney (2014-2020) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ * * This function is split from the rest of the implementation of * GeographicLib::GeodesicExact in order to work around a problem with the * Visual Studio 12 compiler reported on 2014-07-14 * http://connect.microsoft.com/VisualStudio/feedback/details/920594 **********************************************************************/ /* #include "GeodesicExact.h" namespace GeographicLib { using namespace std; // If the coefficient is greater or equal to 2^63, express it as a pair [a, // b] which is combined with a*2^52 + b. The largest coefficient is // 831281402884796906843926125 = 0x2af9eaf25d149c52a73ee6d // = 184581550685 * 2^52 + 0x149c52a73ee6d which is less than 2^90. Both a // and b are less that 2^52 and so are exactly representable by doubles; then // the computation of the full double coefficient involves only a single // rounding operation. (Actually integers up to and including 2^53 can be // represented exactly as doubles. Limiting b to 52 bits allows it to be // represented in 13 digits in hex.) // If the coefficient is less than 2^63, cast it to real if it isn't exactly // representable as a float. Thus 121722048 = 1901907*2^6 and 1901907 < 2^24 // so the cast is not needed; 21708121824 = 678378807*2^5 and 678378807 >= // 2^24 so the cast is needed. void GeodesicExact::C4coeff() { // Generated by Maxima on 2017-05-27 10:17:57-04:00 #if GEOGRAPHICLIB_GEODESICEXACT_ORDER == 24 static const real coeff[] = { // C4[0], coeff of eps^23, polynomial in n of order 0 2113,real(34165005), // C4[0], coeff of eps^22, polynomial in n of order 1 5189536,1279278,real(54629842995LL), // C4[0], coeff of eps^21, polynomial in n of order 2 real(19420000),-9609488,7145551,real(87882790905LL), // C4[0], coeff of eps^20, polynomial in n of order 3 real(223285780800LL),-real(146003016320LL),real(72167144896LL), real(17737080900LL),real(0x205dc0bcbd6d7LL), // C4[0], coeff of eps^19, polynomial in n of order 4 real(0x4114538e4c0LL),-real(0x2f55bac3db0LL),real(0x1ee26e63c60LL), -real(0xf3f108c690LL),real(777582423783LL),real(0x19244124e56e27LL), // C4[0], coeff of eps^18, polynomial in n of order 5 real(0x303f35e1bc93a0LL),-real(0x24e1f056b1d580LL), real(0x1ab9fe0d1d4d60LL),-real(0x1164c583e996c0LL), real(0x892da1e80cb20LL),real(0x2194519fdb596LL), reale(3071,0xfdd7cc41833d5LL), // C4[0], coeff of eps^17, polynomial in n of order 6 real(0x4aad22c875ed20LL),-real(0x3a4801a1c6bad0LL), real(0x2c487fb318d4c0LL),-real(0x1ff24d7cfd75b0LL), real(0x14ba39245f1460LL),-real(0xa32e190328e90LL), real(0x78c93074dfcffLL),reale(3071,0xfdd7cc41833d5LL), // C4[0], coeff of eps^16, polynomial in n of order 7 real(0x33d84b92096e100LL),-real(0x286d35d824ffe00LL), real(0x1f3d33e2e951300LL),-real(0x178f58435181400LL), real(0x10e7992a3756500LL),-real(0xaed7fa8609aa00LL), real(0x55d8ac87b09700LL),real(0x14e51e43945a10LL), reale(21503,0xf0e695ca96ad3LL), // C4[0], coeff of eps^15, polynomial in n of order 8 real(0x577cdb6aaee0d80LL),-real(0x4283c1e96325470LL), real(0x32feef20b794020LL),-real(0x26ea2e388de1a50LL), real(0x1d13f6131e5d6c0LL),-real(0x14b9aa66e270230LL), real(0xd5657196ac0560LL),-real(0x6880b0118a9810LL), real(0x4d0f1755168ee7LL),reale(21503,0xf0e695ca96ad3LL), // C4[0], coeff of eps^14, polynomial in n of order 9 real(0xa82410caed14920LL),-real(0x774e0539d2de300LL), real(0x57ddc01c62bc8e0LL),-real(0x41de50dfff43e40LL), real(0x31742450a1bdca0LL),-real(0x248524531975180LL), real(0x19d013c6e35ec60LL),-real(0x1084c003a0434c0LL), real(0x8103758ad86020LL),real(0x1f2409edf5e286LL), reale(21503,0xf0e695ca96ad3LL), // C4[0], coeff of eps^13, polynomial in n of order 10 real(0x1c6d2d6120015ca0LL),-real(0x104cedef383403b0LL), real(0xab9dd58c3e3d880LL),-real(0x78a4e83e5604750LL), real(0x57aa7cf5406e460LL),-real(0x4067a93ceeb2cf0LL), real(0x2ed62190d975c40LL),-real(0x20c076adcb21890LL), real(0x14cfa9cb9e01c20LL),-real(0xa1e25734956e30LL), real(0x76afbfe4ae6c4dLL),reale(21503,0xf0e695ca96ad3LL), // C4[0], coeff of eps^12, polynomial in n of order 11 real(0x500e39e18e75c40LL),-real(0xb866fe4aaa63680LL), real(0x4337db32e526ac0LL),-real(0x264cce8c21af200LL), real(0x18fb7ba247a4140LL),-real(0x115709558576d80LL), real(0xc5be96cd3dcfc0LL),-real(0x8cdca1395db900LL), real(0x611fe1a7e00640LL),-real(0x3d26e46827e480LL), real(0x1d93970a8fd4c0LL),real(0x70bf87cc17354LL), reale(3071,0xfdd7cc41833d5LL), // C4[0], coeff of eps^11, polynomial in n of order 12 -real(0x158a522ca96a9f40LL),real(0x14d4e49882e048f0LL), real(0x51a6258bc6026a0LL),-real(0xc07af3677bdc6b0LL), real(0x45ac09bc3b66080LL),-real(0x275e4ef59a8b450LL), real(0x195f928e5402a60LL),-real(0x114aa7eeb31a3f0LL), real(0xbf706c784da040LL),-real(0x817ec7d97ab990LL), real(0x508b8ca80cde20LL),-real(0x26b120ea091930LL), real(0x1c1ab3faf18ecdLL),reale(3071,0xfdd7cc41833d5LL), // C4[0], coeff of eps^10, polynomial in n of order 13 real(0x85cd94c7a43620LL),real(0x41534458719f180LL), -real(0x1688b497e3eabf20LL),real(0x15fa3ad6bcd8bd40LL), real(0x531c27984875fa0LL),-real(0xc9b33381ee39f00LL), real(0x485a2b8a7ad1a60LL),-real(0x286be979df41b40LL), real(0x199b6e19072f920LL),-real(0x10f769bc7a1af80LL), real(0xb2b30e0b2b83e0LL),-real(0x6d4c30bc0953c0LL), real(0x3405b9397b42a0LL),real(0xc1ffd0ada51beLL), reale(3071,0xfdd7cc41833d5LL), // C4[0], coeff of eps^9, polynomial in n of order 14 real(0x77c3b2fb788360LL),real(0x12370e8b6ebba50LL), real(0x3ce89570a2d35c0LL),real(0x1ddd463aa5801f30LL), -reale(2652,0xb61760f09fe0LL),reale(2613,0x24df88b461210LL), real(0x24dea39341926e80LL),-real(0x5ce704fae2f44110LL), real(0x20ecef343dc3cce0LL),-real(0x121947a4ab4bae30LL), real(0xb2a76f84c78e740LL),-real(0x70dd3a5c9a20950LL), real(0x43604f2667d29a0LL),-real(0x1fa7f2abdd82670LL), real(0x169d55eb03244c1LL),reale(21503,0xf0e695ca96ad3LL), // C4[0], coeff of eps^8, polynomial in n of order 15 real(0x21331eec152c80LL),real(0x3c94fa87392d00LL), real(0x7bff534019c580LL),real(0x12eee208e5fe200LL), real(0x3f965ae4945ee80LL),real(0x1f56cb06e4e85700LL), -reale(2802,0x46e8e19f880LL),reale(2796,0xadb20bd4ec00LL), real(0x251d0efe774e7080LL),-real(0x625b74d58e27ff00LL), real(0x224674d7e8ab8980LL),-real(0x1260f3bdc69c0a00LL), real(0xad7256a98d1b280LL),-real(0x63bd65ce944d500LL), real(0x2df89c0cd0d4b80LL),real(0xa46618fc50ff08LL), reale(21503,0xf0e695ca96ad3LL), // C4[0], coeff of eps^7, polynomial in n of order 16 real(0xcb641c2517300LL),real(0x1435342f6c1790LL), real(0x2223c168d902a0LL),real(0x3e90a70fac72b0LL), real(0x80a310c4f84640LL),real(0x13bcb7c20d40bd0LL), real(0x42a5540b0e391e0LL),real(0x210e40977bd376f0LL), -reale(2980,0x94d9def1cc680LL),reale(3022,0x503caf61c4810LL), real(0x24d397da2b859120LL),-real(0x68d822cc2f04ecd0LL), real(0x23a043b28810ecc0LL),-real(0x125159fafe6e93b0LL), real(0x9e1bc8a31f5a060LL),-real(0x46aed7b45d01890LL), real(0x30c71f0f146542fLL),reale(21503,0xf0e695ca96ad3LL), // C4[0], coeff of eps^6, polynomial in n of order 17 real(0x5c9c64c833ea0LL),real(0x87cba49bc6200LL),real(0xcee016a8ff560LL), real(0x14a860e941a1c0LL),real(0x231567934bf020LL), real(0x40a648fc642980LL),real(0x85b2123b2c36e0LL), real(0x14a4159e5b98140LL),real(0x462d226dee7d1a0LL), real(0x2316888f6f2f3100LL),-reale(3198,0x3491a799c37a0LL), reale(3311,0xbf8f265e6c0c0LL),real(0x2372de10575f2320LL), -real(0x70af5543c56e4780LL),real(0x24bbd6e6395ee9e0LL), -real(0x116009bab4325fc0LL),real(0x75b7dfa9c5a24a0LL), real(0x17de90e4beab49eLL),reale(21503,0xf0e695ca96ad3LL), // C4[0], coeff of eps^5, polynomial in n of order 18 real(0x6a525328e6e0LL),real(0x93f17033fb30LL),real(0xd36a04706f00LL), real(0x137db4aaadad0LL),real(0x1de17febed720LL),real(0x300ece09a4c70LL), real(0x5230537724340LL),real(0x98911a7bab410LL),real(0x13df6f0042d760LL), real(0x317f809c6f75b0LL),real(0xa9d28ba9acb780LL), real(0x55d121ad9d8f550LL),-real(0x1efee1555125f860LL), real(0x21073529064696f0LL),real(0x486394f46ccebc0LL), -real(0x11777145e6374170LL),real(0x54159fc268987e0LL), -real(0x1fa4dd5835d2fd0LL),real(0x13d87fc86cca643LL), reale(3071,0xfdd7cc41833d5LL), // C4[0], coeff of eps^4, polynomial in n of order 19 real(0x3804d31f10c0LL),real(0x4b2ec20ad280LL),real(0x66f0ea418040LL), real(0x903f2204b400LL),real(0xcfad72d447c0LL),real(0x134cb9fa41580LL), real(0x1dd70e331b740LL),real(0x306dd8a084700LL),real(0x53a0a0b201ec0LL), real(0x9cd7c33c89880LL),real(0x14a7b599a9ce40LL), real(0x340e256f2c5a00LL),real(0xb4e7d2cf7515c0LL), real(0x5cc8e678862db80LL),-real(0x22304c48df63bac0LL), real(0x25f7d3a888bb6d00LL),real(0x3210c8a6905acc0LL), -real(0x131873ea3222a180LL),real(0x4a33217f63b9c40LL), real(0xaa39109cb79b1cLL),reale(3071,0xfdd7cc41833d5LL), // C4[0], coeff of eps^3, polynomial in n of order 20 real(0x1d8a60744340LL),real(0x26a12f47d0f0LL),real(0x3353c9ffe420LL), real(0x4570fd193850LL),real(0x5fe8194aa900LL),real(0x87a7057de1b0LL), real(0xc54ab4558de0LL),real(0x12897a64b8910LL),real(0x1d013b7f18ec0LL), real(0x2fb033b96ea70LL),real(0x5384f3e45a7a0LL),real(0x9f10eb531c1d0LL), real(0x154d17c994d480LL),real(0x36ab828088cb30LL), real(0xc1d47f99841160LL),real(0x65b5717bb21c290LL), -real(0x269fd1ef6edfa5c0LL),real(0x2dc2d3f3f9f963f0LL), -real(0xf46c321c1b54e0LL),-real(0x14642b52c5fe94b0LL), real(0x6b46a122c3b5c05LL),reale(3071,0xfdd7cc41833d5LL), // C4[0], coeff of eps^2, polynomial in n of order 21 real(0x65e46db33460LL),real(0x82b39a7b3380LL),real(0xa9e8c6cf36a0LL), real(0xe0317d0fa0c0LL),real(0x12cd0399df4e0LL),real(0x19b576ed17600LL), real(0x23ecb07d1c720LL),real(0x33785d3e48b40LL),real(0x4bedad56b0560LL), real(0x73f4d1eccb880LL),real(0xb8a5a1bdc07a0LL),real(0x1359aad161d5c0LL), real(0x22a518d96d25e0LL),real(0x43a50f3643bb00LL), real(0x95133a4d60b820LL),real(0x18b02de0f4e4040LL), real(0x5ac287501571660LL),real(0x31a5fa2db58d3d80LL), -reale(5087,0xbd2e8f8d6760LL),reale(6752,0x2ce8487308ac0LL), -reale(2184,0x86ffdb3446920LL),-real(0x199994ff919cd3b6LL), reale(21503,0xf0e695ca96ad3LL), // C4[0], coeff of eps^1, polynomial in n of order 22 real(0xd0da1980ba0LL),real(0x10803fb20d70LL),real(0x151a70ced0c0LL), real(0x1b569dc61a10LL),real(0x23ecd2ce6de0LL),real(0x2ff80cba60b0LL), real(0x413672596700LL),real(0x5a7b8b75a550LL),real(0x8082f2984020LL), real(0xbb859b75abf0LL),real(0x11a6bf1637d40LL),real(0x1b9a143813890LL), real(0x2d2aacb8da260LL),real(0x4e2c5253a0f30LL),real(0x914a9e2ed3380LL), real(0x128a302f4ef3d0LL),real(0x2b2226f5e6b4a0LL), real(0x7a36190e0daa70LL),real(0x1e8d8643836a9c0LL), real(0x129e3dd12414f710LL),-reale(2184,0x86ffdb3446920LL), reale(3276,0xca7fc8ce69db0LL),-real(0x5999897e7da4e4fdLL), reale(7167,0xfaf78743878f1LL), // C4[0], coeff of eps^0, polynomial in n of order 23 real(0x71a68037fdf14LL),real(0x81ebac5d53b48LL),real(0x957440e8ac5fcLL), real(0xad1ce56088670LL),real(0xca0c260c189e4LL),real(0xedd10e292f598LL), real(0x11a912af9e18ccLL),real(0x1534f4af92bec0LL), real(0x19c5b078ed00b4LL),real(0x1fc05a701dd7e8LL), real(0x27bd1031afaf9cLL),real(0x32a7dc61183710LL), real(0x41fc58560eb384LL),real(0x583759590a1238LL), real(0x79bd058a3bfa6cLL),real(0xaecdc650561f60LL), real(0x108312ea2251254LL),real(0x1abbd57b12fd488LL), real(0x2fbd21c97d5693cLL),real(0x634bf45b6b1a7b0LL), real(0x11110dffb6688d24LL),real(0x666653fe46734ed8LL), -reale(5734,0x625f9f69393f4LL),reale(14335,0xf5ef0e870f1e2LL), reale(21503,0xf0e695ca96ad3LL), // C4[1], coeff of eps^23, polynomial in n of order 0 3401,real(512475075), // C4[1], coeff of eps^22, polynomial in n of order 1 -5479232,3837834,real(163889528985LL), // C4[1], coeff of eps^21, polynomial in n of order 2 -real(1286021216),real(571443856),real(142575393),real(0xef8343fb2e1LL), // C4[1], coeff of eps^20, polynomial in n of order 3 -real(237999188352LL),real(138477414656LL),-real(77042430080LL), real(53211242700LL),real(0x6119423638485LL), // C4[1], coeff of eps^19, polynomial in n of order 4 -real(0x2066cb6031fc0LL),real(0x14c85e7394470LL),-real(0xf6b8f35571e0LL), real(0x6ad3f08040d0LL),real(0x1aa3b2832565LL),real(0x230f8ed873f29c63LL), // C4[1], coeff of eps^18, polynomial in n of order 5 -real(0x33e9644cad5b40LL),real(0x22b6849ca6a500LL), -real(0x1ce364ad2a4ec0LL),real(0x104aaed8cf4680LL), -real(0x949f0f8a89e40LL),real(0x64bcf4df920c2LL), reale(9215,0xf98764c489b7fLL), // C4[1], coeff of eps^17, polynomial in n of order 6 -real(0x50a85b2e2e4060LL),real(0x36bb9aa442c6f0LL), -real(0x3029aafbbe0440LL),real(0x1dc29c0bd6ce90LL), -real(0x16a422844d9020LL),real(0x9763b8d8ca030LL), real(0x25b8d7edff7ebLL),reale(9215,0xf98764c489b7fLL), // C4[1], coeff of eps^16, polynomial in n of order 7 -real(0x3822c174e5c7e00LL),real(0x25fbaf973d78c00LL), -real(0x222a860fbdb7a00LL),real(0x15dabd7a0984800LL), -real(0x129f00215535600LL),real(0xa0e9e0ae9b8400LL), -real(0x5ee97a6d2d5200LL),real(0x3eaf5acabd0e30LL), reale(64511,0xd2b3c15fc4079LL), // C4[1], coeff of eps^15, polynomial in n of order 8 -real(0x5ec1dcd7666b480LL),real(0x3ed4935a3fd8cd0LL), -real(0x38014f5e5d79960LL),real(0x240af6a53256570LL), -real(0x2049d0fb0404a40LL),real(0x12efbc065d3f410LL), -real(0xee9d804d5d8320LL),real(0x5ed209adebbcb0LL), real(0x1798ea7fdd6773LL),reale(64511,0xd2b3c15fc4079LL), // C4[1], coeff of eps^14, polynomial in n of order 9 -real(0x19f69929deb8bc0LL),real(0x1054723730b1600LL), -real(0xdce6aeb616e040LL),real(0x8c0069813d6480LL), -real(0x7e59f70027c8c0LL),real(0x4bea01551feb00LL), -real(0x42bb28790cad40LL),real(0x21dd61f97d4180LL), -real(0x14f93d4343f5c0LL),real(0xd58968a8df35eLL), reale(9215,0xf98764c489b7fLL), // C4[1], coeff of eps^13, polynomial in n of order 10 -real(0x1ecd4a3794400de0LL),real(0x101df33ec1bb0110LL), -real(0xbc64ec7794b2980LL),real(0x71d5f4e2a637ff0LL), -real(0x625888ecafc7520LL),real(0x3aa6879742ff4d0LL), -real(0x3585f7f60d164c0LL),real(0x1d18174ef21abb0LL), -real(0x18117eb39416c60LL),real(0x8df7a42ab2f090LL), real(0x23413de9276581LL),reale(64511,0xd2b3c15fc4079LL), // C4[1], coeff of eps^12, polynomial in n of order 11 -real(0x113775cb09582880LL),real(0x5790112bb17c4700LL), -real(0x204e01ed2b929d80LL),real(0x1063af9e8d99cc00LL), -real(0xc3ef805036ada80LL),real(0x701a56aa2d31100LL), -real(0x63910631abdcf80LL),real(0x368e0c562512600LL), -real(0x31ed34307286c80LL),real(0x170e89cb9dd1b00LL), -real(0xf5f0efdd07a180LL),real(0x93fb623bde75e4LL), reale(64511,0xd2b3c15fc4079LL), // C4[1], coeff of eps^11, polynomial in n of order 12 real(0x13635f7860ae69c0LL),-real(0x169d904d9d4691d0LL), -real(0x2254277308cd9e0LL),real(0xd20446e8d8a9710LL), -real(0x4df2aedeefd1980LL),real(0x25e2aff2baec9f0LL), -real(0x1d3856fa2b08920LL),real(0xf7cadc640f92d0LL), -real(0xe3d2f6c9ad5cc0LL),real(0x6e412eaf297db0LL), -real(0x62000ef613c860LL),real(0x201266fb021690LL), real(0x7ee4c480c21e1LL),reale(9215,0xf98764c489b7fLL), // C4[1], coeff of eps^10, polynomial in n of order 13 -real(0x5fe482817c4c40LL),-real(0x3373730b4b79d00LL), real(0x140f919171472640LL),-real(0x17f10e5417ef9980LL), -real(0x1b454cf244cf340LL),real(0xdd42319af5c0200LL), -real(0x530205145e450c0LL),real(0x25eec00584a7d80LL), -real(0x1e9e562555aaa40LL),real(0xe85806d73b2100LL), -real(0xde44387c5bb7c0LL),real(0x581f06023d3480LL), -real(0x421ccd71c33140LL),real(0x245ff7208ef53aLL), reale(9215,0xf98764c489b7fLL), // C4[1], coeff of eps^9, polynomial in n of order 14 -real(0x47f3709eaa4320LL),-real(0xbb640bc2e1ae70LL), -real(0x2a7854a3ead7b40LL),-real(0x1701de8d91314210LL), reale(2329,0x5f8472b9624a0LL),-reale(2855,0xe7c1182872fb0LL), -real(0x785bf95be998780LL),real(0x66690260b30024b0LL), -real(0x272595745774a3a0LL),real(0x104f772bee315710LL), -real(0xe11ad02f34b53c0LL),real(0x5a192e055800370LL), -real(0x58d8bfb781fbbe0LL),real(0x17a156426e4c5d0LL), real(0x5c88907e67c575LL),reale(64511,0xd2b3c15fc4079LL), // C4[1], coeff of eps^8, polynomial in n of order 15 -real(0x1138d3e7324700LL),-real(0x210a1008a4f200LL), -real(0x47b7d2285e8500LL),-real(0xbbe3dba17a1400LL), -real(0x2aeb63e9e4cb300LL),-real(0x1781d8a9c80b7600LL), reale(2419,0xe4212c9be8f00LL),-reale(3063,0xd7c230ad9b800LL), -real(0x116171a56015f00LL),real(0x6cc31b4079da8600LL), -real(0x2af22cc657d11d00LL),real(0xf75e4ec12d0a400LL), -real(0xeb60cc0dd754b00LL),real(0x472a49a74880200LL), -real(0x4174f343c328900LL),real(0x1ed324af4f2fd18LL), reale(64511,0xd2b3c15fc4079LL), // C4[1], coeff of eps^7, polynomial in n of order 16 -real(0xd56426d4f700LL),-real(0x15fa65017d450LL), -real(0x26ba18ad11e20LL),-real(0x4a9605f1a58f0LL), -real(0xa2b494aee2940LL),-real(0x1ad07f38fd2390LL), -real(0x62deb836d71c60LL),-real(0x36d68c47bf27830LL), real(0x167d3fa4abc50480LL),-real(0x1d9b2fd161b99ad0LL), real(0x13a59aea9293560LL),real(0x10886ca52ccf3090LL), -real(0x6e8a4c27dbf8dc0LL),real(0x1f02cd8f1f8a5f0LL), -real(0x2216230a1ac48e0LL),real(0x5f13c815b08150LL), real(0x1666b06ca8f56dLL),reale(9215,0xf98764c489b7fLL), // C4[1], coeff of eps^6, polynomial in n of order 17 -real(0x2678d0ed9f140LL),-real(0x39d0dbe263c00LL), -real(0x5aa623a5216c0LL),-real(0x95d2f30c44880LL), -real(0x108ea4db631840LL),-real(0x2005d27e0acd00LL), -real(0x463ad5e0e22dc0LL),-real(0xba80ab02c40180LL), -real(0x2b67c47d5d48f40LL),-real(0x186d6a49f7da1e00LL), reale(2625,0x9832921f08b40LL),-reale(3627,0xa72ee4675a80LL), real(0x17be252bac67e9c0LL),real(0x7a8f5366d9ba1100LL), -real(0x38a15d77b043abc0LL),real(0x9cd4e0bf35fec80LL), -real(0xceae5004f176d40LL),real(0x479bb2ae3c01ddaLL), reale(64511,0xd2b3c15fc4079LL), // C4[1], coeff of eps^5, polynomial in n of order 18 -real(0x11dc9e54dea60LL),-real(0x193ec5647cdf0LL), -real(0x24bda460ceb00LL),-real(0x3760182d9a010LL), -real(0x5717ea0e54ba0LL),-real(0x907095ecddc30LL), -real(0x10063188dee040LL),-real(0x1f228e862f9650LL), -real(0x44adcde9a37ce0LL),-real(0xb7cbf8f2d0e270LL), -real(0x2b3f803c770f580LL),-real(0x18c05d008644d490LL), reale(2737,0x3ce4b1d74e1e0LL),-reale(4017,0xdf79eceb980b0LL), real(0x30ac41edd5123540LL),real(0x7e3ade121a8e0530LL), -real(0x45ec5d28a0fecf60LL),real(0x3577aaf625fa910LL), real(0x7292b77d2ccfc9LL),reale(64511,0xd2b3c15fc4079LL), // C4[1], coeff of eps^4, polynomial in n of order 19 -real(0x14469ef39280LL),-real(0x1b74a6d65900LL),-real(0x25fc6724f380LL), -real(0x35e25bf6c800LL),-real(0x4eb76c6a3c80LL),-real(0x771a92ddb700LL), -real(0xbc1644489d80LL),-real(0x13946cde25600LL), -real(0x22eaf36054680LL),-real(0x44349dbbbd500LL), -real(0x976a625a56780LL),-real(0x1989ef99e16400LL), -real(0x6150e2c16e3080LL),-real(0x38c68feccea3300LL), real(0x1963a1a8e71b2e80LL),-real(0x2849f713f5ed7200LL), real(0xd30bac57bb18580LL),real(0x105e1a36741daf00LL), -real(0xc8c696e03b05b80LL),real(0x1feab31d626d154LL), reale(9215,0xf98764c489b7fLL), // C4[1], coeff of eps^3, polynomial in n of order 20 -real(0xa4172dfa1c0LL),-real(0xd77fb109ed0LL),-real(0x11fc3eda7860LL), -real(0x1879b9235cf0LL),-real(0x2209eb95db00LL),-real(0x308bcfa5f110LL), -real(0x47510fa29da0LL),-real(0x6c88ffcf6f30LL),-real(0xac6dd3019440LL), -real(0x120fcca63eb50LL),-real(0x206b8121592e0LL), -real(0x3fc3a9ace7970LL),-real(0x8ea4f3b556d80LL), -real(0x18488ccc5b2d90LL),-real(0x5db9d9787df820LL), -real(0x37d6c7544511bb0LL),real(0x1a02f9f8abfbf940LL), -real(0x2d9fe91163ac57d0LL),real(0x18b01234447992a0LL), real(0x46ed1c414c80a10LL),-real(0x57c56c90ceabfa7LL), reale(9215,0xf98764c489b7fLL), // C4[1], coeff of eps^2, polynomial in n of order 21 -real(0x2271f7278cc0LL),-real(0x2c3f5c6ec900LL),-real(0x399dc5a18140LL), -real(0x4c2bebb96280LL),-real(0x6670101499c0LL),-real(0x8c75450f5400LL), -real(0xc4e9f8733e40LL),-real(0x11b3ff75a0580LL), -real(0x1a3e7cf3fd6c0LL),-real(0x2853a9e02df00LL), -real(0x40b8bca6ccb40LL),-real(0x6da2a9d234880LL), -real(0xc6fc7477c83c0LL),-real(0x18bdddb834aa00LL), -real(0x37ff6cf7616840LL),-real(0x9a5f4811c06b80LL), -real(0x25bde21729de0c0LL),-real(0x16ea24b2a28ff500LL), reale(2841,0x69c686bdbaac0LL),-reale(5560,0x9d73ff6dcae80LL), reale(4369,0xdffb6688d240LL),-real(0x4cccbefeb4d67b22LL), reale(64511,0xd2b3c15fc4079LL), // C4[1], coeff of eps^1, polynomial in n of order 22 -real(0xd0da1980ba0LL),-real(0x10803fb20d70LL),-real(0x151a70ced0c0LL), -real(0x1b569dc61a10LL),-real(0x23ecd2ce6de0LL),-real(0x2ff80cba60b0LL), -real(0x413672596700LL),-real(0x5a7b8b75a550LL),-real(0x8082f2984020LL), -real(0xbb859b75abf0LL),-real(0x11a6bf1637d40LL), -real(0x1b9a143813890LL),-real(0x2d2aacb8da260LL), -real(0x4e2c5253a0f30LL),-real(0x914a9e2ed3380LL), -real(0x128a302f4ef3d0LL),-real(0x2b2226f5e6b4a0LL), -real(0x7a36190e0daa70LL),-real(0x1e8d8643836a9c0LL), -real(0x129e3dd12414f710LL),reale(2184,0x86ffdb3446920LL), -reale(3276,0xca7fc8ce69db0LL),real(0x5999897e7da4e4fdLL), reale(64511,0xd2b3c15fc4079LL), // C4[2], coeff of eps^23, polynomial in n of order 0 10384,real(854125125), // C4[2], coeff of eps^22, polynomial in n of order 1 real(61416608),15713412,real(0x35f1be97217LL), // C4[2], coeff of eps^21, polynomial in n of order 2 real(1053643008),-real(709188480),real(436906360),real(0x18f301bf7f77LL), // C4[2], coeff of eps^20, polynomial in n of order 3 real(0x45823cb069c0LL),-real(0x3dc56cd10180LL),real(0x15b4532d4340LL), real(0x5946b207ad8LL),real(0xf72bf6e15a9abe5LL), // C4[2], coeff of eps^19, polynomial in n of order 4 real(0x1b1b08a8c6e00LL),-real(0x1a1dea5249180LL),real(0xc1b857255700LL), -real(0x8a94db95d080LL),real(0x5209b9749ec8LL), real(0x3a6f4368c13f04a5LL), // C4[2], coeff of eps^18, polynomial in n of order 5 real(0x13c972f90d64d60LL),-real(0x12d8369dbbbb080LL), real(0xa013fa80d7c1a0LL),-real(0x95d1a2bb4de840LL), real(0x30a495fb9aa5e0LL),real(0xc95efc891d64cLL), reale(107519,0xb480ecf4f161fLL), // C4[2], coeff of eps^17, polynomial in n of order 6 real(0x4b31e4eff4bc00LL),-real(0x4190c8b5d5de00LL), real(0x27770ac0842800LL),-real(0x270a0d33995200LL), real(0x10c9f01b859400LL),-real(0xd056352974600LL), real(0x74f9dc1f6f260LL),reale(15359,0xf536fd4790329LL), // C4[2], coeff of eps^16, polynomial in n of order 7 real(0x39908ef33285d00LL),-real(0x2a7d467835cbe00LL), real(0x1e0505551ade700LL),-real(0x1bf3204cf26d400LL), real(0xe195527d96f100LL),-real(0xe0af5ccd52ea00LL), real(0x41681113e87b00LL),real(0x1112b429bab2a0LL), reale(107519,0xb480ecf4f161fLL), // C4[2], coeff of eps^15, polynomial in n of order 8 real(0xf8fa0142055000LL),-real(0x8f8aa7832e8a00LL), real(0x7d6f3ddfb47c00LL),-real(0x62d1e182b7be00LL), real(0x3bb149eddea800LL),-real(0x3be3b3e26a7200LL), real(0x175d0d17dad400LL),-real(0x14371cfc4fa600LL), real(0xa8f8f5855a060LL),reale(15359,0xf536fd4790329LL), // C4[2], coeff of eps^14, polynomial in n of order 9 real(0x21490cd145715e0LL),-real(0xe087822f191900LL), real(0xf91f2bb3d29820LL),-real(0x949428c90dc2c0LL), real(0x7371ad50b34a60LL),-real(0x63c52e9a850c80LL), real(0x301579a22c8ca0LL),-real(0x33552a69ca1640LL), real(0xcc2c8c733bee0LL),real(0x35f5f30acfbecLL), reale(15359,0xf536fd4790329LL), // C4[2], coeff of eps^13, polynomial in n of order 10 real(0x29bb6acaa073ef00LL),-real(0xc930d526d728e80LL), real(0xf55c2b3103d0c00LL),-real(0x63b9281a5449980LL), real(0x6acdfd5dbb92900LL),-real(0x441c8fce3be0480LL), real(0x2be797a45cb8600LL),-real(0x2aec3395f438f80LL), real(0xec70ff5d376300LL),-real(0xedc27143c9fa80LL), real(0x7039bcd0124e68LL),reale(107519,0xb480ecf4f161fLL), // C4[2], coeff of eps^12, polynomial in n of order 11 -real(0x17ce935fc610ad40LL),-real(0x5d5bbde81a902580LL), real(0x2dcc12fb45c89240LL),-real(0xc1c61e98a479e00LL), real(0x10183633a5ddf1c0LL),-real(0x672de318faa1680LL), real(0x64ee85310393140LL),-real(0x481cf983db0cf00LL), real(0x2299f24f52810c0LL),-real(0x271fc56086d0780LL), real(0x79dac155045040LL),real(0x20c44d35dada38LL), reale(107519,0xb480ecf4f161fLL), // C4[2], coeff of eps^11, polynomial in n of order 12 -real(0x6b8bdbaa2666e600LL),reale(2706,0x6d4e4332c7e80LL), -real(0x201eb2939ffc7500LL),-real(0x605f6d97c740b880LL), real(0x32fb1ca66ccebc00LL),-real(0xb85f2dd585e0f80LL), real(0x10b7dbe9dec0ed00LL),-real(0x6e454f6a0fd4680LL), real(0x594f6f139205e00LL),-real(0x4c204810d601d80LL), real(0x16a875347934f00LL),-real(0x1be72589c185480LL), real(0xb5a396e2ccd788LL),reale(107519,0xb480ecf4f161fLL), // C4[2], coeff of eps^10, polynomial in n of order 13 real(0x332d666e095e20LL),real(0x205e97ebfb32780LL), -real(0xf80bf36cd359f20LL),real(0x19615ff8d71e0640LL), -real(0x61aef235a414c60LL),-real(0xe1fda0393083b00LL), real(0x83e2ad192fc7660LL),-real(0x18ece140ef0fc40LL), real(0x26bbb213037c920LL),-real(0x11a4c9418dd9d80LL), real(0x9ec708de66cbe0LL),-real(0xaee5994e9b7ec0LL), real(0x1626e135e59ea0LL),real(0x610ef2b6b35c4LL), reale(15359,0xf536fd4790329LL), // C4[2], coeff of eps^9, polynomial in n of order 14 real(0x1b709db1871200LL),real(0x51a2a024c26b00LL), real(0x157c554050bb400LL),real(0xddb41f944653d00LL), -real(0x6d182f563006aa00LL),reale(2991,0xf7eb0ae304f00LL), -real(0x387b65599c618800LL),-real(0x64242336a83ddf00LL), real(0x4282c6eaa3899a00LL),-real(0xa8fc3afb1e6cd00LL), real(0x1040dddbf0493c00LL),-real(0x9184bc07b2bfb00LL), real(0x281ea22622bde00LL),-real(0x3dc59bc648ee900LL), real(0x13fb78815b4ca90LL),reale(107519,0xb480ecf4f161fLL), // C4[2], coeff of eps^8, polynomial in n of order 15 real(0xacc0646b5180LL),real(0x1753663f74b00LL),real(0x3994d0061e480LL), real(0xadc1fbdd72e00LL),real(0x2e87a44adab780LL), real(0x1eaeb3451821100LL),-real(0xf937e414930b580LL), real(0x1c27d8b21df37400LL),-real(0xaa5908f76fee280LL), -real(0xe1c8d327ee92900LL),real(0xb2675f22d49b080LL), -real(0x19e66cd66684600LL),real(0x1f3a47aa5ea8380LL), -real(0x18da246c74e6300LL),real(0x10dd3b80dd1680LL), real(0x3f21f272d2a30LL),reale(15359,0xf536fd4790329LL), // C4[2], coeff of eps^7, polynomial in n of order 16 real(0x2957d7da1000LL),real(0x4c28ba8a3700LL),real(0x9714a6610e00LL), real(0x14a5ff52a4500LL),real(0x33af2f78d8c00LL),real(0x9e87298409300LL), real(0x2b4e15dbd10a00LL),real(0x1d4c6da210ea100LL), -real(0xf6c4a6847e2f800LL),real(0x1da98c51a6b5ef00LL), -real(0xe1270d810dcfa00LL),-real(0xd23a021f3080300LL), real(0xd3b280b26948400LL),-real(0x22fd890d309b500LL), real(0x119ef453c630200LL),-real(0x1959af9980da700LL), real(0x5959078fa70870LL),reale(15359,0xf536fd4790329LL), // C4[2], coeff of eps^6, polynomial in n of order 17 real(0x511612baa2a0LL),real(0x87a79de92a00LL),real(0xee2dd20af160LL), real(0x1bbcfaf32f4c0LL),real(0x37ba524fb5020LL),real(0x7b9b8f2a45f80LL), real(0x13a76fcf6fdee0LL),real(0x3d717a0fbe0a40LL), real(0x112dc752f02bda0LL),real(0xbfa002cc4689500LL), -real(0x694405622017f3a0LL),reale(3484,0x979f3cbb89fc0LL), -reale(2088,0x4fe2045ae14e0LL),-real(0x49f87439584d3580LL), real(0x6c3e90c1455479e0LL),-real(0x1afff07538f04ac0LL), -real(0x1a0f4cdf3b62760LL),-real(0x112f9b85f9ebf7cLL), reale(107519,0xb480ecf4f161fLL), // C4[2], coeff of eps^5, polynomial in n of order 18 real(0x181437e05500LL),real(0x25c7b1fe6a80LL),real(0x3d5ebd606800LL), real(0x67dd27f0e580LL),real(0xb8ac7d2a7b00LL),real(0x15ce71e5cc080LL), real(0x2c7c6a3654e00LL),real(0x6460c05d0bb80LL),real(0x1046637cd7a100LL), real(0x340d46956b9680LL),real(0xef5f1bde883400LL), real(0xacec6aed73c1180LL),-real(0x63ea680d7ea23900LL), reale(3605,0xecc3861a0ec80LL),-reale(2759,0xc804a6c40e600LL), -real(0x212a787bd0571880LL),real(0x70c6a0884332ed00LL), -real(0x31a5fa2db58d3d80LL),real(0x5033807138f7d98LL), reale(107519,0xb480ecf4f161fLL), // C4[2], coeff of eps^4, polynomial in n of order 19 real(0x6f3f0983c40LL),real(0xa6cf9192980LL),real(0x100e50e166c0LL), real(0x197f658cec00LL),real(0x29f706a6f140LL),real(0x480b7a0eae80LL), real(0x821ecd9c1bc0LL),real(0xfa1d1da0b100LL),real(0x2081a78802640LL), real(0x4aefd4add3380LL),real(0xc730805b650c0LL),real(0x28f491e04e7600LL), real(0xc2d07512dddb40LL),real(0x92e539684c6b880LL), -real(0x5a2096cfc695fa40LL),reale(3598,0x9cd1e91b83b00LL), -reale(3553,0x1d49601c5efc0LL),real(0x31a5fa2db58d3d80LL), real(0x3760835a5e313ac0LL),-real(0x1bed5cb9b61f7298LL), reale(107519,0xb480ecf4f161fLL), // C4[2], coeff of eps^3, polynomial in n of order 20 real(273006835200LL),real(395945493120LL),real(586817304320LL), real(891220401024LL),real(0x1440886f800LL),real(0x20a73015480LL), real(0x36a4a027900LL),real(0x5f8b4acad80LL),real(0xb01798c3a00LL), real(0x15a2eb8a6680LL),real(0x2e235b147b00LL),real(0x6d6a30f2bf80LL), real(0x12c54474b7c00LL),real(0x40129870df880LL),real(0x13e41ecc817d00LL), real(0xfcf67c8cf45180LL),-real(0xa65f288fe794200LL), real(0x1cea83a477ce0a80LL),-real(0x240239aaff748100LL), real(0x1547221396f36380LL),-real(0x4e04d247d427178LL), reale(15359,0xf536fd4790329LL), // C4[2], coeff of eps^2, polynomial in n of order 21 real(317370445920LL),real(448806691200LL),real(646426411680LL), real(950282020800LL),real(0x14ccaecc4e0LL),real(0x201acdf4e00LL), real(0x33093819720LL),real(0x53ed06eb440LL),real(0x8f8eb441960LL), real(0x1013bf0bfa80LL),real(0x1e750d7baba0LL),real(0x3dc4346800c0LL), real(0x88729901ade0LL),real(0x150e863aba700LL),real(0x3c89c1e8d8020LL), real(0xd9efed463cd40LL),real(0x47e39644808260LL), real(0x3d1b0c8706d5380LL),-real(0x2af704cef0cdeb60LL), real(0x7c1ef17245e119c0LL),-reale(2184,0x86ffdb3446920LL), real(0x333329ff2339a76cLL),reale(107519,0xb480ecf4f161fLL), // C4[3], coeff of eps^23, polynomial in n of order 0 70576,real(29211079275LL), // C4[3], coeff of eps^22, polynomial in n of order 1 -real(31178752),real(16812224),real(0x192c8c2464fLL), // C4[3], coeff of eps^21, polynomial in n of order 2 -real(135977211392LL),real(37023086848LL),real(9903771944LL), real(0xb98f5d0044051LL), // C4[3], coeff of eps^20, polynomial in n of order 3 -real(0x30f8b0f5c00LL),real(0x12d79f66800LL),-real(0x115c7023400LL), real(606224480400LL),real(0xa7c6f527b4f7c7LL), // C4[3], coeff of eps^19, polynomial in n of order 4 -real(0x3317d68847dc00LL),real(0x19fc69dd236700LL), -real(0x1c6d14df7ace00LL),real(0x6cfe4fac52d00LL), real(0x1d99f24357808LL),reale(30105,0x847604e86c8c1LL), // C4[3], coeff of eps^18, polynomial in n of order 5 -real(0x15b0eba45ef8000LL),real(0xf79bdd24a10000LL), -real(0xf32a8559288000LL),real(0x563281b24a8000LL), -real(0x5920796c2f8000LL),real(0x29f7b73471c480LL), reale(150527,0x964e188a1ebc5LL), // C4[3], coeff of eps^17, polynomial in n of order 6 -real(0x1c02d0336ef1800LL),real(0x1d91ba24525dc00LL), -real(0x163d203e4811000LL),real(0xb8e8b252aa8400LL), -real(0xd2485de6110800LL),real(0x2a40e341b4ac00LL), real(0xbb70f2cbcf360LL),reale(150527,0x964e188a1ebc5LL), // C4[3], coeff of eps^16, polynomial in n of order 7 -real(0x58b4aa16ae3000LL),real(0x7fa0a14380e000LL), -real(0x429ab6e3829000LL),real(0x383428ed0d4000LL), -real(0x32e93ebd99f000LL),real(0x108fe88bbda000LL), -real(0x13ba86ffa65000LL),real(0x868b4ab8e3340LL), reale(21503,0xf0e695ca96ad3LL), // C4[3], coeff of eps^15, polynomial in n of order 8 -real(0xaedfc7febee000LL),real(0xe403ca9386ec00LL), -real(0x5568aa53f7a800LL),real(0x76f3d9af940400LL), -real(0x475f28b7bb7000LL),real(0x29018461d69c00LL), -real(0x2ed89591f13800LL),real(0x74380445fb400LL), real(0x21274712bcba0LL),reale(21503,0xf0e695ca96ad3LL), // C4[3], coeff of eps^14, polynomial in n of order 9 -real(0x231ca125e5c8000LL),real(753027184687LL<<17), -real(0x97f88531f38000LL),real(0xee839ade908000LL), -real(0x572a9cdd748000LL),real(0x65a05d4f5f0000LL), -real(0x4ce11756538000LL),real(0x177f524c958000LL), -real(0x20e57338048000LL),real(0xc4518e260f380LL), reale(21503,0xf0e695ca96ad3LL), // C4[3], coeff of eps^13, polynomial in n of order 10 -real(0x44ebd4477ad4f200LL),real(0x9a6a6024b320f00LL), -real(0xe915ce102d6a800LL),real(0xb28d5273bcee100LL), -real(0x37fa968ec235e00LL),real(0x68974b850671300LL), -real(0x2a735b9bf505400LL),real(0x20513dd7a7f6500LL), -real(0x220360a9be2ca00LL),real(0x36d1c1a3f49700LL), real(0x10369a2227fd98LL),reale(150527,0x964e188a1ebc5LL), // C4[3], coeff of eps^12, polynomial in n of order 11 real(0x52462bb828351400LL),real(0x4a4d1c14e6172800LL), -real(0x4ced32c430d22400LL),real(0xb52b1b0c2492000LL), -real(0xd058359466b1c00LL),real(0xd07709dd3bd1800LL), -real(0x30072e56aae5400LL),real(0x605c027d5629000LL), -real(0x32e58b8ebb44c00LL),real(0x108221f23a90800LL), -real(0x1a7ac7295958400LL),real(0x836be4086f28d0LL), reale(150527,0x964e188a1ebc5LL), // C4[3], coeff of eps^11, polynomial in n of order 12 real(0x48f7bc8748dd3400LL),-reale(2561,0x7f9f9673a4700LL), real(0x601d0ed1c7f2b600LL),real(0x449204e4f86d4300LL), -real(0x56194f80f81a8800LL),real(0xea108cfa6f6ed00LL), -real(0xa7ad46bd016c600LL),real(0xef32c344e507700LL), -real(0x30a1762ff0e4400LL),real(0x4a78ea25c4fa100LL), -real(0x3c3cca9d1bd4200LL),real(0x22cbd76a022b00LL), real(0x9df3abb037278LL),reale(150527,0x964e188a1ebc5LL), // C4[3], coeff of eps^10, polynomial in n of order 13 -real(0x9607df2a17c000LL),-real(0x739371b7f3d8000LL), real(0x4688c366039fc000LL),-reale(2611,0x8a66cbfc04000LL), real(0x7056fbc7b1c24000LL),real(0x3af7506941670000LL), -real(0x601cadbaecf24000LL),real(0x14affbea17164000LL), -real(0x6daccbfd0bfc000LL),real(0x1036680bb42b8000LL), -real(0x42f04a7d6e84000LL),real(0x246d9b6ab84c000LL), -real(0x37cce3b53adc000LL),real(0xd43660c7def0c0LL), reale(150527,0x964e188a1ebc5LL), // C4[3], coeff of eps^9, polynomial in n of order 14 -real(0x115a7e31ff400LL),-real(0x3c90c47c29600LL), -real(0x1311ab10640800LL),-real(0xf2246746703a00LL), real(0x99b5e8c5c68e400LL),-real(0x179a6d9c8ead9e00LL), real(0x12bd250608495000LL),real(0x63777cc9563be00LL), -real(0xf1ef7972c204400LL),real(0x47367775d725a00LL), -real(0x63378c7bb15800LL),real(0x22d63078c5cb600LL), -real(0xf8707c83e76c00LL),-real(0xb0e06786eae00LL), -real(0x5e4438ea922f0LL),reale(21503,0xf0e695ca96ad3LL), // C4[3], coeff of eps^8, polynomial in n of order 15 -real(0x1fe011d85800LL),-real(0x4f422fb05000LL),-real(0xe40060fc8800LL), -real(0x32e664e9c2000LL),-real(0x1078ec0ef63800LL), -real(0xd864902b71f000LL),real(0x8fab71292d19800LL), -real(0x179bbec0170ac000LL),real(0x15c925f1e4f1e800LL), real(0x2c36e0d96c07000LL),-real(0x100d07856dfe4800LL), real(0x6d9c3efea16a000LL),-real(0x13ac4a3567f800LL), real(0x15b22a4de1ed000LL),-real(0x1452d18e2b42800LL), real(0x32eab893d697a0LL),reale(21503,0xf0e695ca96ad3LL), // C4[3], coeff of eps^7, polynomial in n of order 16 -real(0x5003ad66000LL),-real(0xa79ae296200LL),-real(0x17d9e9f5d400LL), -real(0x3c8762ad2600LL),-real(0xb232a56ac800LL),-real(0x28dbf6ee52a00LL), -real(0xda6199e36bc00LL),-real(0xba74c6aa46ee00LL), real(0x825959cb764d000LL),-real(0x17232e4c4e57f200LL), real(0x190bf0598fc65c00LL),-real(0x27c51cb844db600LL), -real(0xf8735fc98339800LL),real(0xa28217eef524600LL), -real(0xfc87c9cb4a8c00LL),-real(0x3228ffc0ed7e00LL), -real(0x387bf611406670LL),reale(21503,0xf0e695ca96ad3LL), // C4[3], coeff of eps^6, polynomial in n of order 17 -real(0x62d694dc000LL),-real(97716157LL<<17),-real(0x173b38f24000LL), -real(0x319b0ca1c000LL),-real(0x7361a893c000LL),-real(0x12be5bef38000LL), -real(0x38b3402cc4000LL),-real(0xd6a4403694000LL), -real(0x4a69cc1535c000LL),-real(0x42816c266fd0000LL), real(0x315cb6a39d95c000LL),-reale(2449,0xcf91c36a8c000LL), reale(3143,0x2391393fc4000LL),-real(0x466890d45f668000LL), -real(0x50368754849c4000LL),real(0x594b313771cfc000LL), -real(0x1cc16f4e99cdc000LL),real(0x1e8d8643836a9c0LL), reale(150527,0x964e188a1ebc5LL), // C4[3], coeff of eps^5, polynomial in n of order 18 -real(0x1136c8f5600LL),-real(0x1e3b013df00LL),-real(0x37550c23000LL), -real(0x6a508e10100LL),-real(0xd872daf0a00LL),-real(0x1d8dd6618300LL), -real(0x468422b6a400LL),-real(0xbc9d06f02500LL),-real(0x24d784d09be00LL), -real(0x90d122dffa700LL),-real(0x347ca809f91800LL), -real(0x31861ec3b2ac900LL),real(0x276d051382ba8e00LL), -reale(2163,0x55347fa444b00LL),reale(3319,0x8d7da907400LL), -reale(2191,0xdbae56666ed00LL),-real(0x47e396448082600LL), real(0x3577aaf625fa9100LL),-real(0x1449fb28d544cb98LL), reale(150527,0x964e188a1ebc5LL), // C4[3], coeff of eps^4, polynomial in n of order 19 -real(58538142720LL),-real(97662466048LL),-real(168340530176LL), -real(301206585344LL),-real(562729180160LL),-real(0x1017e988800LL), -real(0x21987b95400LL),-real(0x4b78a99d000LL),-real(0xb9ccd9f8c00LL), -real(0x202de3701800LL),-real(0x68b6655d0400LL),-real(0x1af3df037e000LL), -real(0xa515b5f563c00LL),-real(0xa65924698da800LL), real(0x8fc72c890104c00LL),-real(0x226e597c6e0df000LL), real(0x3ee7237bf0721400LL),-real(0x3d1b0c8706d53800LL), real(0x1e8d8643836a9c00LL),-real(0x634bf45b6b1a7b0LL), reale(50175,0xdcc4b2d8b4e97LL), // C4[3], coeff of eps^3, polynomial in n of order 20 -real(16545868800LL),-real(26558972160LL),-real(43799006720LL), -real(74458311424LL),-real(131016159232LL),-real(239806362880LL), -real(459418505728LL),-real(928488660736LL),-real(0x1d19ea9f400LL), -real(0x43b761f2900LL),-real(0xad7cf6b5600LL),-real(0x1f71d9841300LL), -real(0x6bcf7c0df800LL),-real(0x1d7abbebd1d00LL), -real(0xc1b8d2e919a00LL),-real(0xd3e226aef40700LL), real(0xc94a0b2634a0400LL),-real(0x3577aaf625fa9100LL), real(0x6aef55ec4bf52200LL),-real(0x634bf45b6b1a7b00LL), real(0x22221bff6cd11a48LL),reale(150527,0x964e188a1ebc5LL), // C4[4], coeff of eps^23, polynomial in n of order 0 567424,real(87633237825LL), // C4[4], coeff of eps^22, polynomial in n of order 1 real(2135226368),real(598833664),real(0x1358168b64fd9LL), // C4[4], coeff of eps^21, polynomial in n of order 2 real(23101878272LL),-real(26986989568LL),real(11760203136LL), real(0x4f869592664b5LL), // C4[4], coeff of eps^20, polynomial in n of order 3 real(0xa4d4b674a00LL),-real(0xbdc38ed8400LL),real(0x20274dfee00LL), real(635330794560LL),real(0x436914c918b5d6dLL), // C4[4], coeff of eps^19, polynomial in n of order 4 real(0x481bf9079c000LL),-real(0x3c015f7917000LL),real(0x133447522e000LL), -real(0x195b19983d000LL),real(0xa0f15f7a8700LL), reale(3518,0xd3a367a37a66dLL), // C4[4], coeff of eps^18, polynomial in n of order 5 real(0x1e9f26efa689000LL),-real(0x100c94382c2c000LL), real(0xabead3c2e1f000LL),-real(0xc04c79a6f96000LL), real(0x18fb8548735000LL),real(0x76d40a3ef6c00LL), reale(193535,0x781b441f4c16bLL), // C4[4], coeff of eps^17, polynomial in n of order 6 real(0x780536a0606000LL),-real(0x28779739e97000LL), real(0x3a9fdf130c4000LL),-real(0x2860390cb81000LL), real(0xcce73d3902000LL),-real(0x1322aa5844b000LL), real(0x6bd0a3ad69900LL),reale(27647,0xec962e4d9d27dLL), // C4[4], coeff of eps^16, polynomial in n of order 7 real(0x45af61c2ad1f800LL),-real(0x1b140a5252fd000LL), real(0x348e789bd7f6800LL),-real(0x137ac7aed3be000LL), real(0x11da35dc2ded800LL),-real(0x12097ef153ff000LL), real(0x186b19645c4800LL),real(0x7935fe20ccb00LL), reale(193535,0x781b441f4c16bLL), // C4[4], coeff of eps^15, polynomial in n of order 8 real(0x788485be348000LL),-real(0xbf417480965000LL), real(0xbdad05e3bd6000LL),-real(0x306dcc448df000LL), real(0x6c08266aea4000LL),-real(0x364dbd52879000LL), real(0x13468d692f2000LL),-real(0x1f6575294f3000LL), real(0x97982d7211100LL),reale(27647,0xec962e4d9d27dLL), // C4[4], coeff of eps^14, polynomial in n of order 9 real(0x99754be5293000LL),-real(0x273b2ae73028000LL), real(0xa610233e31d000LL),-real(0x8ee7336f99e000LL), real(0xd7a1a110827000LL),-real(0x2f0d74b9c14000LL), real(0x4f375451ab1000LL),-real(0x4002b6db48a000LL), real(0x20d804cbbb000LL),real(0xa41d3b221400LL), reale(27647,0xec962e4d9d27dLL), // C4[4], coeff of eps^13, polynomial in n of order 10 real(0x6016f6408271a000LL),-real(0x1e7546e7a0d1b000LL), real(0x18e4e98f72c8000LL),-real(0x113f96068e695000LL), real(0x6af41cd57176000LL),-real(0x2590480c1d6f000LL), real(0x61253410a664000LL),-real(0x1c92661c6269000LL), real(0xfa686d5b4d2000LL),-real(0x188238347643000LL), real(0x60544135abb900LL),reale(193535,0x781b441f4c16bLL), // C4[4], coeff of eps^12, polynomial in n of order 11 -reale(2096,0xf9dac0e4d8600LL),-real(0xa96847f4d191400LL), real(0x644f115411ee9e00LL),-real(0x2912ee32dfa61000LL), -real(0x81eeabcb01be00LL),-real(0xfba8345c9670c00LL), real(0x9bbda8340726600LL),-real(0x11537009b3f0800LL), real(0x51c2ea8aa8c0a00LL),-real(0x2bb89caf7310400LL), -real(0x162bd9b163d200LL),-real(0xac0895744a3c0LL), reale(193535,0x781b441f4c16bLL), // C4[4], coeff of eps^11, polynomial in n of order 12 -real(0x296aa6e320b86000LL),real(0x7d9f9f72af514800LL), -reale(2284,0xfefdd7e855000LL),real(0x8d22edc50949800LL), real(0x6581767b41ffc000LL),-real(0x371ad32683bb1800LL), -real(0x915b5d6cd33000LL),-real(0xbce7db3a027c800LL), real(0xd0ebaf65b57e000LL),-real(0x1274db255bb7800LL), real(0x2970a5137d6f000LL),-real(0x30b8535f9002800LL), real(0x8fa21d365c3780LL),reale(193535,0x781b441f4c16bLL), // C4[4], coeff of eps^10, polynomial in n of order 13 real(0x73aaee373e800LL),real(0x6d942f05126000LL), -real(0x55d059f7fa72800LL),real(0x114ee97e0f335000LL), -real(0x16053fa9ce763800LL),real(0x4d23952dbcc4000LL), real(0xdda0de6f17eb800LL),-real(0xa56bf33e63ad000LL), real(0x90dadc83efa800LL),-real(0xbf52dd8df9e000LL), real(0x2172ab2d7549800LL),-real(0x85ae20f708f000LL), -real(0x10c904999a7800LL),-real(0xae78582fbfa00LL), reale(27647,0xec962e4d9d27dLL), // C4[4], coeff of eps^9, polynomial in n of order 14 real(0x19fde85a2f000LL),real(0x6b4aa2bef4800LL),real(0x28c46a7eab6000LL), real(0x2827ed076a87800LL),-real(0x210a7394d5283000LL), real(0x72396f4bbfb2a800LL),-reale(2620,0x4dc0771ddc000LL), real(0x40dce91ee367d800LL),real(0x52592d2deb84b000LL), -real(0x5a9bf1fdd05df800LL),real(0x10e48562d1f92000LL), real(0x1d4b91258bb3800LL),real(0xaa81c5529799000LL), -real(0x6eadf18b1729800LL),real(0xd0db43634fa080LL), reale(193535,0x781b441f4c16bLL), // C4[4], coeff of eps^8, polynomial in n of order 15 real(0x45bda664400LL),real(0xc8c97088800LL),real(0x2a5a46b84c00LL), real(0xb467fe915000LL),real(0x471c8a3c15400LL),real(0x49361b74ae1800LL), -real(0x3fb304ab7e4a400LL),real(0xedcc81cc3d0e000LL), -real(0x1834aac92fbf9c00LL),real(0xe864613c6aba800LL), real(0x759492ec34a6c00LL),-real(0xea1e49c1b0f9000LL), real(0x5db63d617b37400LL),real(0x31083890113800LL), -real(0xa60c227ea8400LL),-real(0x3b3da9a3dab180LL), reale(27647,0xec962e4d9d27dLL), // C4[4], coeff of eps^7, polynomial in n of order 16 real(469241266176LL),real(0x10545cac800LL),real(0x2adf04bd000LL), real(0x7eec6985800LL),real(0x1ba16d402000LL),real(0x7a072d7ae800LL), real(0x322ca20e07000LL),real(0x3657aa17207800LL), -real(0x3263434d5c54000LL),real(0xcd0703e8db70800LL), -real(0x17ea571d4aa2f000LL),real(0x141161dbf7ec9800LL), -real(0x57d62fedaaa000LL),-real(0xce7cd449810d800LL), real(0x99132fccc31b000LL),-real(0x27598ad75934800LL), real(0x18a5cd1eccf980LL),reale(27647,0xec962e4d9d27dLL), // C4[4], coeff of eps^6, polynomial in n of order 17 real(341540329472LL),real(727668064256LL),real(0x180da872800LL), real(0x3b0b3acd000LL),real(0x9f94c3e7800LL),real(0x1e8177ec2000LL), real(0x6e3ee471c800LL),real(0x1fbe99a5b7000LL),real(0xdb641b5c91800LL), real(0xfc08a38932c000LL),-real(0xfb6a7929bd39800LL), real(0x466e762d282a1000LL),-reale(2430,0x8d7c552bc4800LL), reale(2721,0xe81cb8f96000LL),-real(0x4dc0eea70f08f800LL), -real(0x1b9eda123c275000LL),real(0x2eba54dfb9ee5800LL), -real(0xf46c321c1b54e00LL),reale(193535,0x781b441f4c16bLL), // C4[4], coeff of eps^5, polynomial in n of order 18 real(31160807424LL),real(61322082304LL),real(3864763LL<<15), real(276675840000LL),real(646157094912LL),real(0x17cd936d800LL), real(0x429614e2000LL),real(0xd3b41886800LL),real(0x31f7c0917000LL), real(0xf21fb6ecf800LL),real(0x6ee892beec000LL),real(0x889688d5b28800LL), -real(0x944ac482b6bf000LL),real(0x2e4469f00aa71800LL), -real(0x73c7760d5050a000LL),reale(2642,0x7d1cf3a18a800LL), -reale(2185,0x6d0b55a915000LL),real(0x3d1b0c8706d53800LL), -real(0xb7512595147fa80LL),reale(193535,0x781b441f4c16bLL), // C4[4], coeff of eps^4, polynomial in n of order 19 real(1806732800),real(3354817536LL),real(6474635776LL), real(13058088960LL),real(27705484800LL),real(62364503040LL), real(150565728768LL),real(395569133568LL),real(0x10ca075be00LL), real(0x37f6c332400LL),real(0xdf0e61c4a00LL),real(0x47dfa8095000LL), real(0x236014b495600LL),real(0x2f60ae04237c00LL), -real(0x38c125ca4a81e00LL),real(0x13dd33a066e0a800LL), -real(0x389cd322becd1200LL),real(0x5ba892ca8a3fd400LL), -real(0x4c61cfa8c88a8600LL),real(0x18d2fd16dac69ec0LL), reale(193535,0x781b441f4c16bLL), // C4[5], coeff of eps^23, polynomial in n of order 0 14777984,real(0xd190230980fLL), // C4[5], coeff of eps^22, polynomial in n of order 1 -real(104833024),real(39440128),real(0x62c2748ec71LL), // C4[5], coeff of eps^21, polynomial in n of order 2 -real(45133008896LL),real(5079242752LL),real(1557031040), real(0x4f869592664b5LL), // C4[5], coeff of eps^20, polynomial in n of order 3 -real(0xecd417f0000LL),real(40869997LL<<17),-real(0x78cb3050000LL), real(0x28d58610800LL),real(0x5263fcf5c8de3f7LL), // C4[5], coeff of eps^19, polynomial in n of order 4 -real(0xf4977948ac000LL),real(0xfebd5b2ac3000LL), -real(0xf90c852576000LL),real(0x1257a8b1e1000LL),real(0x5e1a6b95fb00LL), reale(21503,0xf0e695ca96ad3LL), // C4[5], coeff of eps^18, polynomial in n of order 5 -real(0x25dd48c154000LL),real(0x596953f850000LL), -real(0x2b40cdd44c000LL),real(8741106765LL<<15),-real(0x1ab27f0a04000LL), real(0x7e701f145600LL),reale(3071,0xfdd7cc41833d5LL), // C4[5], coeff of eps^17, polynomial in n of order 6 -real(0x4776cd8c606000LL),real(0x6d8a47bfe9f000LL), -real(0x187da0ea944000LL),real(0x2b758d37739000LL), -real(0x22fd5e6d302000LL),real(0x107133def3000LL),real(0x56ef801cd100LL), reale(33791,0xe845c6d0a3a27LL), // C4[5], coeff of eps^16, polynomial in n of order 7 -real(0x6b41dfbb0208000LL),real(0x3281e67a9bd0000LL), -real(0x11e76a3ab618000LL),real(0x2fa8791e0ae0000LL), -real(0xef00faafea8000LL),real(0x82642584ff0000LL), -real(0xce6c8b206b8000LL),real(0x33a2c6e1f0cc00LL), reale(236543,0x59e86fb479711LL), // C4[5], coeff of eps^15, polynomial in n of order 8 -real(0xd8a9f7e5e7f8000LL),real(0x75ff062faeb000LL), -real(0x57d41a79bb5a000LL),real(0x470a22b15ed1000LL), -real(0x941305430fc000LL),real(0x2571b5b524d7000LL), -real(0x15ee8622281e000LL),-real(0x810fd11a43000LL), -real(0x3b143f8fcc100LL),reale(236543,0x59e86fb479711LL), // C4[5], coeff of eps^14, polynomial in n of order 9 -real(0x11e2c065bec000LL),real(597104820847LL<<17), -real(0x2505ead2add4000LL),real(0x375d7cf9da8000LL), -real(0x7d85d31b2fc000LL),real(0xc6e2597bcf0000LL), -real(0x1c3d1fca5e4000LL),real(0x26eff911138000LL), -real(0x32d040ac10c000LL),real(0xa3358a5620200LL), reale(33791,0xe845c6d0a3a27LL), // C4[5], coeff of eps^13, polynomial in n of order 10 -real(0x4e0fa2600780a000LL),real(0x4e911c6aabd6b000LL), -real(0x693532675088000LL),real(0x218ccc46e845000LL), -real(0x117da33185e06000LL),real(0x4517905378bf000LL), -real(0x10ba1c1d3344000LL),real(0x5399b73b0419000LL), -real(0x1d57ddd62302000LL),-real(0x2b67cba006d000LL), -real(0x17851f6bed3f00LL),reale(236543,0x59e86fb479711LL), // C4[5], coeff of eps^12, polynomial in n of order 11 reale(2256,0x5da9961330000LL),-real(0x4ad304d1312a0000LL), -real(0x4061e93f2b8f0000LL),real(0xb6157e3bfe7LL<<19), -real(0x11e106d1afa10000LL),-real(0x36aeeaeb6e60000LL), -real(0xfcdce3949630000LL),real(0x8af39fd661c0000LL), real(0x3d8b99e8cb0000LL),real(0x2f252d98fde0000LL), -real(0x29a890537770000LL),real(0x62af9738c95800LL), reale(236543,0x59e86fb479711LL), // C4[5], coeff of eps^11, polynomial in n of order 12 real(0x2c14f5cef5da000LL),-real(0xb44f7f3a7637800LL), real(0x144dd8529649b000LL),-real(0xdf6b3f6a9dda800LL), -real(0x611b67a2b3c4000LL),real(0xe4e2f0fafbb2800LL), -real(0x51c03e2adea3000LL),-real(0xd7c7b9cb0f0800LL), -real(0x16096a592762000LL),real(0x1c9393e7a4dc800LL), -real(0x381de14f961000LL),-real(0xdc6f16ca46800LL), -real(0xd4311572ebf80LL),reale(33791,0xe845c6d0a3a27LL), // C4[5], coeff of eps^10, polynomial in n of order 13 -real(0x1f7df788da000LL),-real(0x249f1260a08000LL), real(0x2485dbf6336a000LL),-real(0x9fd55d1961bc000LL), real(0x13ee6db114d4e000LL),-real(0x114ab28a688b0000LL), -real(0x1759d6f434ee000LL),real(0xe5435dae775c000LL), -real(0x883ae4654d0a000LL),real(0x6d085594a8000LL), -real(0x3b594ff4c6000LL),real(0x18b250a1c574000LL), -real(0xc2af3f725e2000LL),real(0x11b5d0e5824b00LL), reale(33791,0xe845c6d0a3a27LL), // C4[5], coeff of eps^9, polynomial in n of order 14 -real(0x45be4df1f000LL),-real(0x154928d5d8800LL), -real(0x9c093f54d6000LL),-real(0xbe1dac855c3800LL), real(0xc8c35d9371b3000LL),-real(0x3b27b3be7f71e800LL), reale(2105,0xa27ce5e51c000LL),-reale(2266,0x2251e75549800LL), real(0x215c4ca42d605000LL),real(0x52b0fbc40a45b800LL), -real(0x52abb6acf6af2000LL),real(0x14cab8bdb5a70800LL), real(0x422bb90412d7000LL),real(0xaa8f3f42195800LL), -real(0x18c864fb5207380LL),reale(236543,0x59e86fb479711LL), // C4[5], coeff of eps^8, polynomial in n of order 15 -real(0x323b5354000LL),-real(0xa77c1e58000LL),-real(0x297150a3c000LL), -real(0xd25b36ef0000LL),-real(0x64c6f9d464000LL), -real(0x816d981c288000LL),real(0x91bbe6aceeb4000LL), -real(0x2ea0d03ef98a0000LL),real(0x748c356a9df8c000LL), -reale(2463,0x44f7c770b8000LL),real(0x55038197b9ea4000LL), real(0x24c2f502435b0000LL),-real(0x557a28e333384000LL), real(0x319d6c472db18000LL),-real(0xa981b88bf66c000LL), real(0x2452a78bb4ce00LL),reale(236543,0x59e86fb479711LL), // C4[5], coeff of eps^7, polynomial in n of order 16 -real(864347LL<<15),-real(77318326272LL),-real(233990443008LL), -real(807704598528LL),-real(0x306255a2000LL),-real(0x100b9fcf2800LL), -real(0x8171cf3d7000LL),-real(0xb08a440213800LL), real(0xd5be3a4ba94000LL),-real(0x4af12ff99ea4800LL), real(0xd4237986197f000LL),-real(0x15530c89262c5800LL), real(0x12c48ba350cca000LL),-real(0x590f07b7ee96800LL), -real(0x53e376c2a7ab000LL),real(0x5b3d559eedc8800LL), -real(0x1b37127cacfe280LL),reale(33791,0xe845c6d0a3a27LL), // C4[5], coeff of eps^6, polynomial in n of order 17 -real(10859667456LL),-real(199353LL<<17),-real(67565166592LL), -real(190510645248LL),-real(597656199168LL),-real(65543051LL<<15), -real(0x869fe272000LL),-real(0x2f027b014000LL),-real(0x19275e39a6000LL), -real(0x24c57351390000LL),real(0x305c8c1f55c6000LL), -real(0x12c56d86cea0c000LL),real(0x3c958c9a69892000LL), -real(0x75427b7d716c8000LL),reale(2264,0x2021045b7e000LL), -real(0x686da1b1a7d04000LL),real(0x2b2226f5e6b4a000LL), -real(0x7a36190e0daa700LL),reale(236543,0x59e86fb479711LL), // C4[5], coeff of eps^5, polynomial in n of order 18 -real(392933376),-real(865908736),-real(61523<<15),-real(5002905600LL), -real(13385551872LL),-real(39200544768LL),-real(128292691968LL), -real(483473385472LL),-real(0x1ffab8af000LL),-real(0xbdf5200f800LL), -real(0x6d0cb854c000LL),-real(0xacf22c5668800LL), real(0xfa276dd8697000LL),-real(0x6c92e41ed151800LL), real(0x18f8d3300c4da000LL),-real(0x382fdb2c1baea800LL), real(0x4f13f21826f5d000LL),-real(0x3d1b0c8706d53800LL), real(0x131873ea3222a180LL),reale(236543,0x59e86fb479711LL), // C4[6], coeff of eps^23, polynomial in n of order 0 real(20016128),real(0x45dab658805LL), // C4[6], coeff of eps^22, polynomial in n of order 1 real(12387831808LL),real(4069857792LL),real(0x1b45118f2c973bLL), // C4[6], coeff of eps^21, polynomial in n of order 2 real(828267LL<<17),-real(2724645LL<<16),real(52104335360LL), real(0x22cae1700cc0f3LL), // C4[6], coeff of eps^20, polynomial in n of order 3 real(0x94a2566a8000LL),-real(0x7736ce990000LL),real(0x345f5a38000LL), real(0x11f45dc9000LL),real(0x36c560e36413be89LL), // C4[6], coeff of eps^19, polynomial in n of order 4 real(6043548407LL<<18),-real(7867012491LL<<16),real(0xfe56696e0000LL), -real(6798211929LL<<16),real(0x66855efe5000LL), reale(3630,0x89164e7bf8313LL), // C4[6], coeff of eps^18, polynomial in n of order 5 real(0x588efe4c176000LL),-real(0xcc317e9b08000LL), real(0x2e65271667a000LL),-real(0x1cb46908f84000LL), -real(0x7bc8d2682000LL),-real(0x36524dd3a400LL), reale(39935,0xe3f55f53aa1d1LL), // C4[6], coeff of eps^17, polynomial in n of order 6 real(0x2dbd6ef2050000LL),-real(0x356ee7ee5e8000LL), real(0x65e2c9482e0000LL),-real(0x1247a684858000LL), real(84899613015LL<<16),-real(0x1b548eba6c8000LL), real(0x5c900466be800LL),reale(39935,0xe3f55f53aa1d1LL), // C4[6], coeff of eps^16, polynomial in n of order 7 -real(0x3fff5b5aa54000LL),-real(0x6a2cbaeaf348000LL), real(0x2b55e8782dc4000LL),-real(0x69f22faba30000LL), real(0x26e11f54b9dc000LL),-real(0x105d41b83118000LL), -real(0x12eb1ab4e0c000LL),-real(0x9530f9646a800LL), reale(279551,0x3bb59b49a6cb7LL), // C4[6], coeff of eps^15, polynomial in n of order 8 real(0xf488f4012440000LL),-real(0xb16a4f02dfc8000LL), -real(0x103bba4a90d0000LL),-real(0x4da08c72a3d8000LL), real(0x45a11acaf220000LL),-real(0x25f21bc63e8000LL), real(0x12fccd9d4510000LL),-real(0x13e0eb3687f8000LL), real(0x356c2e9517d800LL),reale(279551,0x3bb59b49a6cb7LL), // C4[6], coeff of eps^14, polynomial in n of order 9 real(0x28c5c3199aad2000LL),real(0x80d5fb17a810000LL), real(0x9c623a70694e000LL),-real(0xf23c0600f3f4000LL), real(0x6928769f1ca000LL),-real(0x1e8f96869bf8000LL), real(0x4f9253e0b846000LL),-real(0x11e4e806cbfc000LL), -real(0x2dad19c0f3e000LL),-real(0x1f2fac1e88dc00LL), reale(279551,0x3bb59b49a6cb7LL), // C4[6], coeff of eps^13, polynomial in n of order 10 -real(0xdb139b99ca0000LL),-real(0x5dbaf74a92790000LL), real(0x76a096067dfLL<<19),real(0x39f346109690000LL), real(964470918621LL<<17),-real(0x10aa5a9917350000LL), real(0x49bc5039b7c0000LL),real(0x92ae304aad0000LL), real(0x32f3e8ddd3e0000LL),-real(0x233311e51f10000LL), real(0x4483a6a16dd000LL),reale(279551,0x3bb59b49a6cb7LL), // C4[6], coeff of eps^12, polynomial in n of order 11 -real(0xfbf5c5edd078000LL),real(0x1202fde81d5f0000LL), -real(0x454a07e84fa8000LL),-real(0xbd470dafdb40000LL), real(0xb3ba7d182928000LL),-real(0x155dacd6cc70000LL), -real(0xdc21a82d608000LL),-real(0xe96f98256dLL<<17), real(0x167a9a9742c8000LL),-real(0x7d81f52ed0000LL), -real(0x7ffde3fc68000LL),-real(0xe287c62fa3000LL), reale(39935,0xe3f55f53aa1d1LL), // C4[6], coeff of eps^11, polynomial in n of order 12 -real(283480971297LL<<18),real(0x5885fb25bf70000LL), -real(0xe5dec7019ee0000LL),real(0x13305b31e4ed0000LL), -real(0x9278e6008580000LL),-real(0x855a0cffe9d0000LL), real(0xd3d848f453e0000LL),-real(0x4a9f485fda70000LL), -real(0xfb7b0fc02c0000LL),-real(0x691c2e87310000LL), real(806997945397LL<<17),-real(0x9585db4a3b0000LL), real(0xa77dc54c8f000LL),reale(39935,0xe3f55f53aa1d1LL), // C4[6], coeff of eps^10, polynomial in n of order 13 real(0x6d0001099000LL),real(0x9a74d7ec5c000LL),-real(0xc18676170e1000LL), real(0x45ad31c7f8a2000LL),-real(0xc7369375e55b000LL), real(0x1364b97f822e8000LL),-real(0xe19539447ad5000LL), -real(0x26bf9b041ad2000LL),real(0xce71cc8200b1000LL), -real(0x8c822446468c000LL),real(0x12e554ec5f37000LL), real(0xa6c4f3e59ba000LL),real(0x30bb36a52bd000LL), -real(0x34440d2d335600LL),reale(39935,0xe3f55f53aa1d1LL), // C4[6], coeff of eps^9, polynomial in n of order 14 real(0x8fcb3bf8000LL),real(0x33bb5d994000LL),real(7630295323LL<<16), real(0x2a77da91fcc000LL),-real(0x38ac5a4a0098000LL), real(0x160f7571fbc04000LL),-real(0x45e92df7f7ee0000LL), real(0x7f01d3c372a3c000LL),-real(0x7edcf27daed28000LL), real(0x27dfe4585e674000LL),real(0x38a548f303090000LL), -real(0x4b87231069354000LL),real(0x24d2adef05648000LL), -real(0x6a5625dbc71c000LL),-real(0x18371a5d233400LL), reale(279551,0x3bb59b49a6cb7LL), // C4[6], coeff of eps^8, polynomial in n of order 15 real(257397153792LL),real(991547604992LL),real(0x42cbc6ea000LL), real(843451707LL<<15),real(0xe8a206ec6000LL),real(0x170dd449e34000LL), -real(0x2102346c3b5e000LL),real(0xe0052eca6690000LL), -real(0x318a0eacb0b82000LL),real(0x690a1407d3eec000LL), -reale(2182,0xb601e615a6000LL),real(0x61bf435eea348000LL), -real(0xe133a8622dca000LL),-real(0x2748b26bf705c000LL), real(0x220d7d12f9812000LL),-real(0x98dbd66bee38400LL), reale(279551,0x3bb59b49a6cb7LL), // C4[6], coeff of eps^7, polynomial in n of order 16 real(9867LL<<18),real(8045019136LL),real(854413LL<<15), real(6856031LL<<14),real(8304289LL<<16),real(0x3232f0a4000LL), real(0x1ec960fb8000LL),real(0x3439f07dcc000LL),-real(0x50f0148aea0000LL), real(0x25bf6de530f4000LL),-real(0x9635a567bcf8000LL), real(0x1735ee17e1e1c000LL),-real(0x25a38fef60750000LL), real(0x2834884b55944000LL),-real(0x1b3dfda8c79a8000LL), real(0xa981b88bf66c000LL),-real(0x1cc16f4e99cdc00LL), reale(93183,0xbe91de6de243dLL), // C4[6], coeff of eps^6, polynomial in n of order 17 real(169275392),real(7007<<16),real(1348931584),real(4358086656LL), real(15819288576LL),real(66522136576LL),real(339738054656LL), real(0x214230b6000LL),real(0x15d36ff77000LL),real(0x2803a29af8000LL), -real(0x43d629aab87000LL),real(0x232131018d3a000LL), -real(0x9e155c86fb85000LL),real(0x1c3aabf38857c000LL), -real(0x361b1ee81aa83000LL),real(0x44dcb2f8dc1be000LL), -real(0x325282c98d281000LL),real(0xf46c321c1b54e00LL), reale(279551,0x3bb59b49a6cb7LL), // C4[7], coeff of eps^23, polynomial in n of order 0 real(383798272),real(0x7ee24536c1115LL), // C4[7], coeff of eps^22, polynomial in n of order 1 -real(127523LL<<20),real(34096398336LL),real(0x1f771442bd4c09LL), // C4[7], coeff of eps^21, polynomial in n of order 2 -real(197998999LL<<19),-real(4877411LL<<18),-real(541336621056LL), real(0x3b1ebd1165abdce9LL), // C4[7], coeff of eps^20, polynomial in n of order 3 -real(72076029LL<<20),real(33625235LL<<21),-real(96370351LL<<20), real(0x142b356fa000LL),real(0x3f32837c872a7963LL), // C4[7], coeff of eps^19, polynomial in n of order 4 -real(2249063181LL<<20),real(51883720989LL<<18),-real(12233087197LL<<19), -real(1430728833LL<<18),-real(0x9e5c3c48b000LL), reale(46079,0xdfa4f7d6b097bLL), // C4[7], coeff of eps^18, polynomial in n of order 5 -real(19747083035LL<<20),real(5938781185LL<<22),-real(1899464157LL<<20), real(2895955713LL<<21),-real(6730130079LL<<20),real(0x490d94cd2c000LL), reale(46079,0xdfa4f7d6b097bLL), // C4[7], coeff of eps^17, polynomial in n of order 6 -real(0xf7ed31ddbc0000LL),real(90436020675LL<<17), -real(11671406741LL<<19),real(0x58222c9a6a0000LL), -real(28407954085LL<<18),-real(6936211449LL<<17), -real(0x1e088e877c800LL),reale(46079,0xdfa4f7d6b097bLL), // C4[7], coeff of eps^16, polynomial in n of order 7 -real(688523975841LL<<19),-real(83606333811LL<<20), -real(805224840035LL<<19),real(106897379463LL<<21), real(22163836107LL<<19),real(88997602799LL<<20), -real(151227539575LL<<19),real(0x28435aa5d4b000LL), reale(322559,0x1d82c6ded425dLL), // C4[7], coeff of eps^15, polynomial in n of order 8 real(557482450381LL<<20),real(0xfbb72a664ee0000LL), -real(0xa9b81eb4ea40000LL),-real(914196917515LL<<17), -real(409568792563LL<<19),real(0x4780d431da60000LL), -real(0x94b9eca98c0000LL),-real(82946761135LL<<17), -real(0x238b221440f800LL),reale(322559,0x1d82c6ded425dLL), // C4[7], coeff of eps^14, polynomial in n of order 9 -real(0x59ec90b7ba5LL<<20),real(233491821731LL<<23), real(762388756437LL<<20),real(284558585577LL<<21), -real(0xf0573a4eb1LL<<20),real(25275836579LL<<22), real(22761999561LL<<20),real(112734627747LL<<21), -real(126941809085LL<<20),real(0x2fd680f7c84000LL), reale(322559,0x1d82c6ded425dLL), // C4[7], coeff of eps^13, polynomial in n of order 10 real(0xaca84931355LL<<19),real(0x66fb36095adLL<<18), -real(0x2e7424117bfLL<<21),real(0xcac2488dd23LL<<18), real(762738574899LL<<19),-real(579380269895LL<<18), -real(968587667327LL<<20),real(0x73cbed27abc0000LL), real(75006191505LL<<19),-real(0xdb0f0aaec0000LL), -real(0x63c3eeba719000LL),reale(322559,0x1d82c6ded425dLL), // C4[7], coeff of eps^12, polynomial in n of order 11 real(626455667783LL<<20),-real(567623567285LL<<21), real(0xf5d2e8872dLL<<20),-real(13896712169LL<<23), -real(798923144989LL<<20),real(364556664237LL<<21), -real(129034049335LL<<20),-real(20826366601LL<<22), -real(51607570881LL<<20),real(46156477135LL<<21), -real(30888509275LL<<20),real(0x6042659ec2000LL), reale(46079,0xdfa4f7d6b097bLL), // C4[7], coeff of eps^11, polynomial in n of order 12 real(20777559885LL<<20),-real(569775860071LL<<18), real(0xe9ac41f6dbLL<<19),-real(0xef8ba34c8740000LL), real(598911876783LL<<21),-real(0x7cf99a74ecc0000LL), -real(957375911139LL<<19),real(0xc30e342965c0000LL), -real(423483761553LL<<20),real(35714168193LL<<18), real(79169625311LL<<19),real(68905136075LL<<18), -real(0x2f872ef9963000LL),reale(46079,0xdfa4f7d6b097bLL), // C4[7], coeff of eps^10, polynomial in n of order 13 -real(18988489LL<<20),-real(129894471LL<<22),real(12886996881LL<<20), -real(47548938145LL<<21),real(367560238059LL<<20), -real(106884143981LL<<23),real(0x11c056e4d45LL<<20), -real(470740881351LL<<21),real(64061082015LL<<20), real(158992278163LL<<22),-real(634972709127LL<<20), real(135054066707LL<<21),-real(41343081645LL<<20), -real(0x7382e0581c000LL),reale(46079,0xdfa4f7d6b097bLL), // C4[7], coeff of eps^9, polynomial in n of order 14 -real(7074089LL<<17),-real(95481295LL<<16),-real(249804765LL<<18), -real(0x6befb7d790000LL),real(0xb301172bea0000LL), -real(0x5978c2137030000LL),real(0x2fbc3e73e21LL<<19), -real(0x3f35c80b0f2d0000LL),real(0x6ce3ff0d91260000LL), -real(0x7761d1ce42b70000LL),real(0x468057c8ed840000LL), real(0x1bcb7dfb99f0000LL),-real(0x26d98474089e0000LL), real(0x1d375a3e49150000LL),-real(0x7d9dd8c3269dc00LL), reale(322559,0x1d82c6ded425dLL), // C4[7], coeff of eps^8, polynomial in n of order 15 -real(47805LL<<18),-real(105987LL<<19),-real(1141959LL<<18), -real(2026311LL<<20),-real(89791009LL<<18),-real(1389164665LL<<19), real(79467759189LL<<18),-real(86766818957LL<<21), real(0xbfc5c91f6ec0000LL),-real(0x487b27f822fLL<<19), real(0x4a699e0854c40000LL),-real(0x69d85e75b6dLL<<20), real(0x66f7a9fb575c0000LL),-real(0x828d4038ea5LL<<19), real(0x60dc69748cdLL<<18),-real(0x3f90a5347c68800LL), reale(322559,0x1d82c6ded425dLL), // C4[7], coeff of eps^7, polynomial in n of order 16 -real(143<<20),-real(8085<<16),-real(16121<<17),-real(9810411520LL), -real(212205LL<<18),-real(6380297LL<<16),-real(37701755LL<<17), -real(0x95a9db330000LL),real(9764754545LL<<19),-real(0xaf0fe765fd0000LL), real(0x3a2548493060000LL),-real(0xc8bdaa520270000LL), real(0x7871cc979b1LL<<18),-real(0x3353672f26710000LL), real(0x3c89c1e8d8020000LL),-real(0x2a606e22fd9b0000LL), real(0xc94a0b2634a0400LL),reale(322559,0x1d82c6ded425dLL), // C4[8], coeff of eps^23, polynomial in n of order 0 real(7579<<15),real(0x4f56c0c24f87LL), // C4[8], coeff of eps^22, polynomial in n of order 1 -real(1660549LL<<21),-real(23648625LL<<16),real(0x38232f25bccb5275LL), // C4[8], coeff of eps^21, polynomial in n of order 2 real(9646043LL<<20),-real(24019457LL<<19),real(74048359LL<<15), real(0x99262e0aeeff091LL), // C4[8], coeff of eps^20, polynomial in n of order 3 real(183351957435LL<<19),-real(32827160863LL<<20), -real(6509093591LL<<19),-real(0x6677b4e9b0000LL), reale(365566,0xff4ff27401803LL), // C4[8], coeff of eps^19, polynomial in n of order 4 real(67207908275LL<<21),-real(201042891LL<<19),real(44011096899LL<<20), -real(85786308153LL<<19),real(0x195ba7c1ef8000LL), reale(365566,0xff4ff27401803LL), // C4[8], coeff of eps^18, polynomial in n of order 5 -real(13677739LL<<21),-real(1155605701LL<<23),real(11263093395LL<<21), -real(1170886701LL<<22),-real(422863935LL<<21),-real(9609473031LL<<16), reale(52223,0xdb549059b7125LL), // C4[8], coeff of eps^17, polynomial in n of order 6 -real(105328611LL<<20),-real(0xe3d4e1d7080000LL),real(9484526351LL<<21), real(4879307961LL<<19),real(13462873311LL<<20),-real(19014362253LL<<19), real(0x45bace6718000LL),reale(52223,0xdb549059b7125LL), // C4[8], coeff of eps^16, polynomial in n of order 7 real(0x4802f7e045bLL<<18),-real(787109524929LL<<19), -real(616781829503LL<<18),-real(267630157067LL<<20), real(0xf57f439a67LL<<18),-real(26811748075LL<<19), -real(29646920051LL<<18),-real(0x25c0cef2988000LL), reale(365566,0xff4ff27401803LL), // C4[8], coeff of eps^15, polynomial in n of order 8 real(61397460605LL<<22),real(0x9d011c37ef80000LL), real(907553463943LL<<20),-real(0xc0a473ee4980000LL), -real(21778698179LL<<21),-real(22179652453LL<<19), real(224024408237LL<<20),-real(212571195095LL<<19), real(0x216a7bfadc8000LL),reale(365566,0xff4ff27401803LL), // C4[8], coeff of eps^14, polynomial in n of order 9 real(304663697949LL<<21),-real(51558232553LL<<24), real(126037118963LL<<21),real(28559389965LL<<22),real(12939195833LL<<21), -real(17167224841LL<<23),real(24466781775LL<<21),real(2302458607LL<<22), real(456812693LL<<21),-real(0xde9c5a4230000LL), reale(52223,0xdb549059b7125LL), // C4[8], coeff of eps^13, polynomial in n of order 10 -real(0x71eca5b57e5LL<<20),real(0x8d98ab5c54bLL<<19), real(497026592783LL<<22),-real(0xacc7c9e1d9bLL<<19), real(0x35a7c7b51ddLL<<20),-real(81233361377LL<<19), -real(253988603057LL<<21),-real(954606696519LL<<19), real(577751554079LL<<20),-real(333997527437LL<<19), real(0x1689b847558000LL),reale(365566,0xff4ff27401803LL), // C4[8], coeff of eps^12, polynomial in n of order 11 -real(0x367f7beda59LL<<19),real(0x45996b8ba21LL<<20), -real(0xdceb5493fc3LL<<19),real(0x18843cb160dLL<<22), -real(0x21789a51fedLL<<19),-real(0x41cde5aa8b9LL<<20), real(0x95638f58ea9LL<<19),-real(984566251123LL<<21), -real(435207598721LL<<19),real(219309948781LL<<20), real(274765170197LL<<19),-real(0x12cf88fa6ff0000LL), reale(365566,0xff4ff27401803LL), // C4[8], coeff of eps^11, polynomial in n of order 12 -real(2296713447LL<<21),real(78660216877LL<<19), -real(180155131441LL<<20),real(0xeee01825bfLL<<19), -real(237440161933LL<<22),real(0x2042cbdcd31LL<<19), -real(652079196855LL<<20),-real(325903664957LL<<19), real(324695717299LL<<21),-real(0xf97e21ed4bLL<<19), real(203483994947LL<<20),-real(52367903417LL<<19), -real(0x8a9d0d3688000LL),reale(52223,0xdb549059b7125LL), // C4[8], coeff of eps^10, polynomial in n of order 13 real(1140139LL<<21),real(9315711LL<<23),-real(1126319139LL<<21), real(5199009105LL<<22),-real(52132384161LL<<21),real(20770352565LL<<24), -real(357583911087LL<<21),real(262213551639LL<<22), -real(498523677485LL<<21),real(60302341333LL<<23), real(57310064901LL<<21),-real(90954779619LL<<22), real(124029244935LL<<21),-real(0xf0a5fe0ce50000LL), reale(52223,0xdb549059b7125LL), // C4[8], coeff of eps^9, polynomial in n of order 14 real(54009LL<<20),real(849303LL<<19),real(2623117LL<<21), real(364892913LL<<19),-real(5919882885LL<<20),real(0xdd0128d3580000LL), -real(81910832913LL<<22),real(0x2229f5f9745LL<<19), -real(0x2a9587ee883LL<<20),real(0x982f47b44bfLL<<19), -real(0x30e1739ffd1LL<<21),real(0xb09887dee19LL<<19), -real(0x35101f0ee01LL<<20),real(0x25e6f19ce93LL<<19), -real(0x306e34ba4668000LL),reale(365566,0xff4ff27401803LL), // C4[8], coeff of eps^8, polynomial in n of order 15 real(2295<<17),real(5831<<18),real(72709LL<<17),real(151011LL<<19), real(7936467LL<<17),real(147906885LL<<18),-real(0x4d5c1f23e0000LL), real(14228642337LL<<20),-real(697203474513LL<<17), real(0x51fe4e56b0c0000LL),-real(0xeb59f3d2e860000LL), real(0x3e0c14100a1LL<<19),-real(0x305340db42ea0000LL), real(0xd6c75923d41LL<<18),-real(0x2452a78bb4ce0000LL), real(0xa981b88bf66c000LL),reale(365566,0xff4ff27401803LL), // C4[9], coeff of eps^23, polynomial in n of order 0 -real(45613<<15),real(0xa0b835899f381LL), // C4[9], coeff of eps^22, polynomial in n of order 1 -real(4663637LL<<21),real(25498473LL<<16),real(0x8f68f0ea15ed989LL), // C4[9], coeff of eps^21, polynomial in n of order 2 -real(313787291LL<<20),-real(89546863LL<<19),-real(880826107LL<<15), reale(5306,0x2ad1d52b570cdLL), // C4[9], coeff of eps^20, polynomial in n of order 3 real(1691751267LL<<22),real(5868457511LL<<23),-real(9710518895LL<<22), real(43389881073LL<<17),reale(408574,0xe11d1e092eda9LL), // C4[9], coeff of eps^19, polynomial in n of order 4 -real(45668361181LL<<21),real(290185772373LL<<19), -real(19310638221LL<<20),-real(10267037529LL<<19), -real(0x11435a10568000LL),reale(408574,0xe11d1e092eda9LL), // C4[9], coeff of eps^18, polynomial in n of order 5 -real(206915608111LL<<21),real(8005795847LL<<23),real(6676372983LL<<21), real(24266221119LL<<22),-real(29173391667LL<<21),real(99595856143LL<<16), reale(408574,0xe11d1e092eda9LL), // C4[9], coeff of eps^17, polynomial in n of order 6 -real(15515879355LL<<20),-real(36184750873LL<<19), -real(22177807609LL<<21),real(62194714929LL<<19),real(693176727LL<<20), -real(1189966821LL<<19),-real(0x5829503048000LL), reale(58367,0xd70428dcbd8cfLL), // C4[9], coeff of eps^16, polynomial in n of order 7 real(38512528273LL<<23),real(67772681235LL<<24),-real(74410968653LL<<23), -real(3984568679LL<<25),-real(6152374683LL<<23),real(13551170801LL<<24), -real(11115057401LL<<23),real(24916219839LL<<18), reale(408574,0xe11d1e092eda9LL), // C4[9], coeff of eps^15, polynomial in n of order 8 -real(162298412813LL<<22),real(0xff4317f5080000LL), real(119179074953LL<<20),real(0xf6d36e74980000LL), -real(63634032589LL<<21),real(61952932453LL<<19),real(10785104899LL<<20), real(4191026519LL<<19),-real(0xd59ae9d0e8000LL), reale(58367,0xd70428dcbd8cfLL), // C4[9], coeff of eps^14, polynomial in n of order 9 real(162971496591LL<<21),real(33816350309LL<<24), -real(394783736543LL<<21),real(85862751303LL<<22), real(32462900611LL<<21),-real(6369607931LL<<23),-real(39152071083LL<<21), real(18189729581LL<<22),-real(9249690569LL<<21),real(6171570141LL<<16), reale(58367,0xd70428dcbd8cfLL), // C4[9], coeff of eps^13, polynomial in n of order 10 real(0x52d38896f8bLL<<20),-real(0xd3acdf03195LL<<19), real(0x1195b2a1cffLL<<22),real(0xca9586e4a280000LL), -real(0x486f0b6e413LL<<20),real(0x7ca2ce8a83fLL<<19), -real(610236546241LL<<21),-real(717677267559LL<<19), real(159176229583LL<<20),real(291633515411LL<<19), -real(0x110150274e88000LL),reale(408574,0xe11d1e092eda9LL), // C4[9], coeff of eps^12, polynomial in n of order 11 real(143956869023LL<<22),-real(243108013001LL<<23), real(0x101d5eb1615LL<<22),-real(213537904349LL<<25), real(0x183f300cffbLL<<22),-real(350529456991LL<<23), -real(545724783247LL<<22),real(274121340227LL<<24), -real(785966166377LL<<22),real(135225754699LL<<23), -real(28607511667LL<<22),-real(0x3ee3b308260000LL), reale(408574,0xe11d1e092eda9LL), // C4[9], coeff of eps^11, polynomial in n of order 12 real(2520290511LL<<21),-real(0xc4ddd05ba80000LL), real(304931349961LL<<20),-real(0x21230116cd7LL<<19), real(735928623493LL<<22),-real(0x9d254a11d99LL<<19), real(0x6510e717cdfLL<<20),-real(0xa95d67804fbLL<<19), real(0x1055dd17e45LL<<21),real(0x239bcd685c3LL<<19), -real(0x22ba072788bLL<<20),real(0x2c142a0db61LL<<19), -real(0x59b3a2379f58000LL),reale(408574,0xe11d1e092eda9LL), // C4[9], coeff of eps^10, polynomial in n of order 13 -real(29393LL<<21),-real(283917LL<<23),real(41246777LL<<21), -real(233407875LL<<22),real(2943398547LL<<21),-real(1525553871LL<<24), real(35837133917LL<<21),-real(38620600629LL<<22), real(123783976375LL<<21),-real(36640057007LL<<23), real(124599494337LL<<21),-real(35830670759LL<<22), real(24805848987LL<<21),-real(0x1ce0b816070000LL), reale(19455,0xf256b84994845LL), // C4[9], coeff of eps^9, polynomial in n of order 14 -real(1615<<20),-real(29393LL<<19),-real(106267LL<<21), -real(17534055LL<<19),real(342711075LL<<20),-real(8430692445LL<<19), real(7306600119LL<<22),-real(270344204403LL<<19), real(450573674005LL<<20),-real(0x20c896b3e69LL<<19), real(0xfa29e850f7LL<<21),-real(0x5aaf3103bffLL<<19), real(0x3002653e387LL<<20),-real(0x3f2b92b02f5LL<<19), real(0x914a9e2ed338000LL),reale(408574,0xe11d1e092eda9LL), // C4[10], coeff of eps^23, polynomial in n of order 0 real(137<<21),real(0x8757c14b789bLL), // C4[10], coeff of eps^22, polynomial in n of order 1 -real(1152691LL<<20),-real(6743919LL<<17),real(0x9e817610332f06fLL), // C4[10], coeff of eps^21, polynomial in n of order 2 real(79722199LL<<23),-real(113766289LL<<22),real(225212673LL<<18), reale(5864,0xb6105765cc00bLL), // C4[10], coeff of eps^20, polynomial in n of order 3 real(64857768639LL<<21),-real(2220489243LL<<22),-real(2012833515LL<<21), -real(19551629405LL<<18),reale(451582,0xc2ea499e5c34fLL), // C4[10], coeff of eps^19, polynomial in n of order 4 real(656353407LL<<24),real(1031809317LL<<22),real(12215335391LL<<23), -real(12759999497LL<<22),real(18944346729LL<<18), reale(451582,0xc2ea499e5c34fLL), // C4[10], coeff of eps^18, polynomial in n of order 5 -real(62867132873LL<<20),-real(83127481829LL<<22), real(173460262689LL<<20),real(8415873627LL<<21),-real(1024568181LL<<20), -real(82657907689LL<<17),reale(451582,0xc2ea499e5c34fLL), // C4[10], coeff of eps^17, polynomial in n of order 6 real(69839518785LL<<24),-real(46975322289LL<<23),-real(5175253237LL<<25), -real(10608265143LL<<23),real(12870275691LL<<24),-real(9303053053LL<<23), real(8528136981LL<<19),reale(451582,0xc2ea499e5c34fLL), // C4[10], coeff of eps^16, polynomial in n of order 7 -real(12671764325LL<<22),real(11821938135LL<<23),real(23903917953LL<<22), -real(7023725731LL<<24),real(4254825447LL<<22),real(1372261021LL<<23), real(755775181LL<<22),-real(6809268397LL<<19), reale(64511,0xd2b3c15fc4079LL), // C4[10], coeff of eps^15, polynomial in n of order 8 real(10583074157LL<<26),-real(84530118029LL<<23),real(12150058407LL<<24), real(12380362825LL<<23),-real(838454291LL<<25),-real(10410407457LL<<23), real(3974759309LL<<24),-real(1799658059LL<<23),real(156358707LL<<19), reale(64511,0xd2b3c15fc4079LL), // C4[10], coeff of eps^14, polynomial in n of order 9 -real(922119298407LL<<20),real(52944024001LL<<23), real(329638564983LL<<20),-real(354979062141LL<<21), real(493120994773LL<<20),-real(24099541823LL<<22), -real(59503561293LL<<20),real(7459230081LL<<21),real(21243323153LL<<20), -real(75576440907LL<<17),reale(64511,0xd2b3c15fc4079LL), // C4[10], coeff of eps^13, polynomial in n of order 10 -real(328595996641LL<<23),real(0x1245cb281e3LL<<22), -real(207527442829LL<<25),real(0x13d84cf39cdLL<<22), -real(169653271431LL<<23),-real(705690429577LL<<22), real(256163704307LL<<24),-real(657414782367LL<<22), real(103463476179LL<<23),-real(17233182197LL<<22), -real(65863805931LL<<18),reale(451582,0xc2ea499e5c34fLL), // C4[10], coeff of eps^12, polynomial in n of order 11 -real(60530460661LL<<21),real(129708905557LL<<22), -real(783916037751LL<<21),real(215690023633LL<<24), -real(0x287cc397f79LL<<21),real(0x174d319d033LL<<22), -real(0x22bf2de15fbLL<<21),real(172524970961LL<<23), real(736992166659LL<<21),-real(554058611183LL<<22), real(665956259969LL<<21),-real(0x4d7d212a0a40000LL), reale(451582,0xc2ea499e5c34fLL), // C4[10], coeff of eps^11, polynomial in n of order 12 -real(31220211LL<<24),real(1576100141LL<<22),-real(5588687797LL<<23), real(52675808031LL<<22),-real(22267080913LL<<25), real(449824279121LL<<22),-real(432213499347LL<<23), real(0x1275ac4a843LL<<22),-real(351080482641LL<<24), real(0x10853170e75LL<<22),-real(314682628337LL<<23), real(212227819111LL<<22),-real(520922828727LL<<18), reale(451582,0xc2ea499e5c34fLL), // C4[10], coeff of eps^10, polynomial in n of order 13 real(46189LL<<20),real(522291LL<<22),-real(90008149LL<<20), real(613691925LL<<21),-real(9499950999LL<<20),real(6182507793LL<<23), -real(187536069721LL<<20),real(270344204403LL<<21), -real(0x11a7161219bLL<<20),real(533756506129LL<<22), -real(0x2a7db4d305dLL<<20),real(0x159e458acd1LL<<21), -real(0x1bcb7dfb99fLL<<20),real(0x7e5725605ea0000LL), reale(451582,0xc2ea499e5c34fLL), // C4[11], coeff of eps^23, polynomial in n of order 0 -real(7309LL<<21),real(0x2c95e8ad321065LL), // C4[11], coeff of eps^22, polynomial in n of order 1 -real(118877LL<<30),real(1675947LL<<23),real(0x7759dcb5574d50a7LL), // C4[11], coeff of eps^21, polynomial in n of order 2 -real(9105745LL<<24),-real(49846181LL<<23),-real(2866583251LL<<18), reale(70655,0xce6359e2ca823LL), // C4[11], coeff of eps^20, polynomial in n of order 3 -real(239228553LL<<25),real(1509768547LL<<26),-real(1393694995LL<<25), real(7195205325LL<<19),reale(494590,0xa4b77533898f5LL), // C4[11], coeff of eps^19, polynomial in n of order 4 -real(10520646403LL<<25),real(16651704531LL<<23),real(1510969677LL<<24), real(227849937LL<<23),-real(40629886913LL<<18), reale(494590,0xa4b77533898f5LL), // C4[11], coeff of eps^18, polynomial in n of order 5 -real(737236949LL<<28),-real(83959015LL<<31),-real(449296547LL<<28), real(188420603LL<<30),-real(243597193LL<<28),real(1420486123LL<<21), reale(494590,0xa4b77533898f5LL), // C4[11], coeff of eps^17, polynomial in n of order 6 real(1797306345LL<<25),real(7110272827LL<<24),-real(1494242189LL<<26), real(407981949LL<<24),real(324085539LL<<25),real(232922271LL<<24), -real(6431919403LL<<19),reale(70655,0xce6359e2ca823LL), // C4[11], coeff of eps^16, polynomial in n of order 7 -real(59422002475LL<<26),real(4462082415LL<<27),real(11958968063LL<<26), -real(116564371LL<<28),-real(9243946887LL<<26),real(3024840805LL<<27), -real(1229077213LL<<26),-real(836978961LL<<20), reale(494590,0xa4b77533898f5LL), // C4[11], coeff of eps^15, polynomial in n of order 8 real(1450234755LL<<27),real(28955596425LL<<24),-real(20916501415LL<<25), real(24148276875LL<<24),-real(639979965LL<<26),-real(3796939603LL<<24), real(257117683LL<<25),real(1321384367LL<<24),-real(17153469915LL<<19), reale(70655,0xce6359e2ca823LL), // C4[11], coeff of eps^14, polynomial in n of order 9 real(2991071409LL<<28),-real(215656441LL<<32),real(2375561279LL<<28), -real(29715609LL<<30),-real(1772722171LL<<28),real(262089343LL<<31), -real(1227751437LL<<28),real(88909853LL<<30),-real(21460999LL<<28), -real(1112906091LL<<21),reale(70655,0xce6359e2ca823LL), // C4[11], coeff of eps^13, polynomial in n of order 10 real(48251719021LL<<24),-real(247802667483LL<<23), real(59903451769LL<<26),-real(693923403733LL<<23), real(362458490331LL<<24),-real(482970502063LL<<23), real(22585671353LL<<25),real(201583163607LL<<23), -real(128100703031LL<<24),real(147544368125LL<<23), -real(0x43bae67ca340000LL),reale(494590,0xa4b77533898f5LL), // C4[11], coeff of eps^12, polynomial in n of order 11 real(488107587LL<<25),-real(1288790349LL<<26),real(9866997217LL<<25), -real(3570890001LL<<28),real(64004720367LL<<25),-real(56017267579LL<<26), real(152843494797LL<<25),-real(39981841137LL<<27), real(123894347227LL<<25),-real(33286009449LL<<26), real(21954601977LL<<25),-real(212227819111LL<<19), reale(494590,0xa4b77533898f5LL), // C4[11], coeff of eps^11, polynomial in n of order 12 real(735471LL<<25),-real(44046541LL<<23),real(188198857LL<<24), -real(2177729631LL<<23),real(1156078693LL<<26),-real(30163144081LL<<23), real(38781185247LL<<24),-real(159433761571LL<<23), real(65649195941LL<<25),-real(342066863061LL<<23), real(168318615157LL<<24),-real(212227819111LL<<23), real(0x6f2df7ee67c0000LL),reale(494590,0xa4b77533898f5LL), // C4[12], coeff of eps^23, polynomial in n of order 0 real(173LL<<24),real(0x88d5e64011771LL), // C4[12], coeff of eps^22, polynomial in n of order 1 -real(163369LL<<28),-real(266903LL<<29),reale(14529,0xb09bccfe817bfLL), // C4[12], coeff of eps^21, polynomial in n of order 2 real(26283479LL<<29),-real(21738605LL<<28),real(24285135LL<<24), reale(76799,0xca12f265d0fcdLL), // C4[12], coeff of eps^20, polynomial in n of order 3 real(6122492151LL<<24),real(880448149LL<<25),real(269123645LL<<24), -real(4943792525LL<<21),reale(537598,0x8684a0c8b6e9bLL), // C4[12], coeff of eps^19, polynomial in n of order 4 -real(616982441LL<<28),-real(2168310039LL<<26),real(1398586567LL<<27), -real(817632445LL<<26),real(450511215LL<<22), reale(537598,0x8684a0c8b6e9bLL), // C4[12], coeff of eps^18, polynomial in n of order 5 real(1912616275LL<<26),-real(308159801LL<<28),-real(17594779LL<<26), real(72918855LL<<27),real(66311031LL<<26),-real(47313631LL<<26), reale(76799,0xca12f265d0fcdLL), // C4[12], coeff of eps^17, polynomial in n of order 6 real(9134109LL<<27),real(1642561735LL<<26),real(58767343LL<<28), -real(1299624495LL<<26),real(374812639LL<<27),-real(137300677LL<<26), -real(61400001LL<<22),reale(76799,0xca12f265d0fcdLL), // C4[12], coeff of eps^16, polynomial in n of order 7 real(118127909265LL<<25),-real(66457563795LL<<26), real(64469127555LL<<25),-real(134108625LL<<27),-real(12700511691LL<<25), real(295233743LL<<26),real(4531750951LL<<25),-real(13670656363LL<<22), reale(537598,0x8684a0c8b6e9bLL), // C4[12], coeff of eps^15, polynomial in n of order 8 -real(10859744975LL<<29),real(49132517315LL<<26),real(5188275715LL<<27), -real(52074703975LL<<26),real(13295845745LL<<28), -real(28808201009LL<<26),real(3853119361LL<<27),-real(278992987LL<<26), -real(3626908831LL<<22),reale(537598,0x8684a0c8b6e9bLL), // C4[12], coeff of eps^14, polynomial in n of order 9 -real(5262740745LL<<26),real(1142543055LL<<29),-real(12070462215LL<<26), real(5779723245LL<<27),-real(6878321925LL<<26),real(125534415LL<<28), real(3745400061LL<<26),-real(2112375473LL<<27),real(2351512319LL<<26), -real(573315259LL<<26),reale(76799,0xca12f265d0fcdLL), // C4[12], coeff of eps^13, polynomial in n of order 10 -real(345262775LL<<27),real(2254590065LL<<26),-real(721021595LL<<29), real(11719656095LL<<26),-real(9489736865LL<<27),real(24346633325LL<<26), -real(6069982555LL<<28),real(18134544155LL<<26),-real(4742880779LL<<27), real(3068922857LL<<26),-real(7318200659LL<<22), reale(179199,0x822c35983cf89LL), // C4[12], coeff of eps^12, polynomial in n of order 11 -real(58429085LL<<24),real(185910725LL<<25),-real(1747560815LL<<24), real(794345825LL<<27),-real(18392161025LL<<24),real(21545102915LL<<25), -real(82378334675LL<<24),real(32084193505LL<<26), -real(160420967525LL<<24),real(76723071425LL<<25), -real(95136608567LL<<24),real(212227819111LL<<21), reale(537598,0x8684a0c8b6e9bLL), // C4[13], coeff of eps^23, polynomial in n of order 0 -real(34717LL<<24),real(0x4013d857859e5adLL), // C4[13], coeff of eps^22, polynomial in n of order 1 -real(52837LL<<30),real(101283LL<<25),real(0x39b1009e5dec691dLL), // C4[13], coeff of eps^21, polynomial in n of order 2 real(58223275LL<<29),real(25058159LL<<28),-real(597584743LL<<24), reale(580606,0x6851cc5de4441LL), // C4[13], coeff of eps^20, polynomial in n of order 3 -real(38160201LL<<32),real(20133099LL<<33),-real(10736915LL<<32), real(8118075LL<<27),reale(580606,0x6851cc5de4441LL), // C4[13], coeff of eps^19, polynomial in n of order 4 -real(246943573LL<<28),-real(102114339LL<<26),real(63266747LL<<27), real(72037887LL<<26),-real(711672919LL<<22), reale(82943,0xc5c28ae8d7777LL), // C4[13], coeff of eps^18, polynomial in n of order 5 real(362438863LL<<28),real(29917105LL<<30),-real(313139991LL<<28), real(81176473LL<<29),-real(26857069LL<<28),-real(40519029LL<<23), reale(82943,0xc5c28ae8d7777LL), // C4[13], coeff of eps^17, polynomial in n of order 6 -real(4194208665LL<<27),real(3411193933LL<<26),real(92059229LL<<28), -real(832792389LL<<26),-real(13821619LL<<27),real(313960329LL<<26), -real(1784908801LL<<22),reale(82943,0xc5c28ae8d7777LL), // C4[13], coeff of eps^16, polynomial in n of order 7 real(4206195495LL<<29),real(1286394165LL<<30),-real(6553065099LL<<29), real(1494451903LL<<31),-real(3024727629LL<<29),real(374117415LL<<30), -real(7540351LL<<29),-real(836978961LL<<24), reale(580606,0x6851cc5de4441LL), // C4[13], coeff of eps^15, polynomial in n of order 8 real(8293864515LL<<29),-real(80835230175LL<<26),real(35736027705LL<<27), -real(37780361325LL<<26),-real(587595645LL<<28),real(26485772901LL<<26), -real(13655575661LL<<27),real(14786628311LL<<26), -real(57193562335LL<<22),reale(580606,0x6851cc5de4441LL), // C4[13], coeff of eps^14, polynomial in n of order 9 real(2173316805LL<<28),-real(627936225LL<<31),real(9404910795LL<<28), -real(7129362555LL<<29),real(17350941825LL<<28),-real(4150093185LL<<30), real(12011779143LL<<28),-real(3068922857LL<<29),real(1952950909LL<<28), -real(9206768571LL<<23),reale(580606,0x6851cc5de4441LL), // C4[13], coeff of eps^13, polynomial in n of order 10 real(79676025LL<<27),-real(638856855LL<<26),real(256634805LL<<29), -real(5389330905LL<<26),real(5842215855LL<<27),-real(21011478075LL<<26), real(7804263285LL<<28),-real(37664053245LL<<26),real(17576558181LL<<27), -real(21482459999LL<<26),real(95136608567LL<<22), reale(580606,0x6851cc5de4441LL), // C4[14], coeff of eps^23, polynomial in n of order 0 real(433LL<<27),real(0x16f0fb486be35c9LL), // C4[14], coeff of eps^22, polynomial in n of order 1 real(938669LL<<29),-real(8460179LL<<26),reale(36683,0x318959e11f277LL), // C4[14], coeff of eps^21, polynomial in n of order 2 real(1085551LL<<33),-real(531601LL<<32),real(109557LL<<28), reale(36683,0x318959e11f277LL), // C4[14], coeff of eps^20, polynomial in n of order 3 -real(34899909LL<<31),real(11630633LL<<32),real(16602985LL<<31), -real(73138345LL<<28),reale(623614,0x4a1ef7f3119e7LL), // C4[14], coeff of eps^19, polynomial in n of order 4 real(2603869LL<<34),-real(18588201LL<<32),real(4394077LL<<33), -real(1312099LL<<32),-real(1449057LL<<28),reale(89087,0xc172236bddf21LL), // C4[14], coeff of eps^18, polynomial in n of order 5 real(1218191717LL<<27),real(79106081LL<<29),-real(371875421LL<<27), -real(20795103LL<<28),real(151229409LL<<27),-real(409250479LL<<24), reale(89087,0xc172236bddf21LL), // C4[14], coeff of eps^17, polynomial in n of order 6 real(249532965LL<<30),-real(917899213LL<<29),real(191097911LL<<31), -real(363925371LL<<29),real(41606327LL<<30),real(1574359LL<<29), -real(54936843LL<<25),reale(89087,0xc172236bddf21LL), // C4[14], coeff of eps^16, polynomial in n of order 7 -real(19067218845LL<<28),real(7820446095LL<<29),-real(7262714151LL<<28), -real(421931643LL<<30),real(6566089551LL<<28),-real(3155926907LL<<29), real(3340375493LL<<28),-real(6416838701LL<<25), reale(623614,0x4a1ef7f3119e7LL), // C4[14], coeff of eps^15, polynomial in n of order 8 -real(353006415LL<<32),real(4931374455LL<<29),-real(3531935085LL<<30), real(8211223125LL<<29),-real(1894184271LL<<31),real(5332188211LL<<29), -real(1334642127LL<<30),real(836978961LL<<29),-real(1952950909LL<<25), reale(623614,0x4a1ef7f3119e7LL), // C4[14], coeff of eps^14, polynomial in n of order 9 -real(436268025LL<<27),real(158349135LL<<30),-real(3064521495LL<<27), real(3110604525LL<<28),-real(10615555125LL<<27),real(3784676175LL<<29), -real(17712284499LL<<27),real(8090796623LL<<28),-real(9764754545LL<<27), real(21482459999LL<<24),reale(623614,0x4a1ef7f3119e7LL), // C4[15], coeff of eps^23, polynomial in n of order 0 -real(11003LL<<27),real(0x6a44bb11ad2310dLL), // C4[15], coeff of eps^22, polynomial in n of order 1 -real(28003LL<<36),real(3549LL<<30),reale(39213,0x11a47a8f8b3bdLL), // C4[15], coeff of eps^21, polynomial in n of order 2 real(1243LL<<38),real(2249LL<<37),-real(577583LL<<28), reale(5601,0xddf2ecefef51bLL), // C4[15], coeff of eps^20, polynomial in n of order 3 -real(28101LL<<40),real(24493LL<<39),-real(1645LL<<40), -real(318801LL<<29),reale(39213,0x11a47a8f8b3bdLL), // C4[15], coeff of eps^19, polynomial in n of order 4 real(1359187LL<<38),-real(4447191LL<<36),-real(433293LL<<37), real(1982883LL<<36),-real(164770109LL<<28), reale(666622,0x2bec23883ef8dLL), // C4[15], coeff of eps^18, polynomial in n of order 5 -real(6907451LL<<36),real(1332757LL<<38),-real(2401277LL<<36), real(253189LL<<37),real(26273LL<<36),-real(1574359LL<<30), reale(95231,0xbd21bbeee46cbLL), // C4[15], coeff of eps^17, polynomial in n of order 6 real(60642045LL<<33),-real(48519929LL<<32),-real(5596337LL<<34), real(57431697LL<<32),-real(26089089LL<<33),real(27095547LL<<32), -real(828361417LL<<25),reale(95231,0xbd21bbeee46cbLL), // C4[15], coeff of eps^16, polynomial in n of order 7 real(53036505LL<<34),-real(36153285LL<<35),real(80745483LL<<34), -real(18042031LL<<36),real(49556941LL<<34),-real(12180567LL<<35), real(7540351LL<<34),-real(278992987LL<<26), reale(222207,0x63f9612d6a52fLL), // C4[15], coeff of eps^15, polynomial in n of order 8 real(5892945LL<<35),-real(106383165LL<<32),real(102040995LL<<33), -real(332742375LL<<32),real(114463377LL<<34),-real(521444273LL<<32), real(233750881LL<<33),-real(278992987LL<<32),real(9764754545LL<<25), reale(666622,0x2bec23883ef8dLL), // C4[16], coeff of eps^23, polynomial in n of order 0 -real(1LL<<31),real(0x5f43434b6401e1LL), // C4[16], coeff of eps^22, polynomial in n of order 1 real(4571LL<<36),-real(33945LL<<32),reale(5963,0x471b5f51fec25LL), // C4[16], coeff of eps^21, polynomial in n of order 2 real(24269LL<<36),-real(5831LL<<35),-real(11703LL<<31), reale(5963,0x471b5f51fec25LL), // C4[16], coeff of eps^20, polynomial in n of order 3 -real(224895LL<<36),-real(32277LL<<37),real(111531LL<<36), -real(139825LL<<34),reale(41742,0xf1bf9b3df7503LL), // C4[16], coeff of eps^19, polynomial in n of order 4 real(978405LL<<37),-real(1674813LL<<35),real(162197LL<<36), real(29281LL<<35),-real(297087LL<<31),reale(41742,0xf1bf9b3df7503LL), // C4[16], coeff of eps^18, polynomial in n of order 5 -real(15263501LL<<36),-real(3038189LL<<38),real(24413445LL<<36), -real(10587549LL<<37),real(10822455LL<<36),-real(41181917LL<<32), reale(709630,0xdb94f1d6c533LL), // C4[16], coeff of eps^17, polynomial in n of order 6 -real(7565085LL<<36),real(16306961LL<<35),-real(3541967LL<<37), real(9518487LL<<35),-real(2301919LL<<36),real(1408637LL<<35), -real(3231579LL<<31),reale(101375,0xb8d15471eae75LL), // C4[16], coeff of eps^16, polynomial in n of order 7 -real(57998985LL<<33),real(52955595LL<<34),-real(165927531LL<<33), real(55309177LL<<35),-real(246030477LL<<33),real(108465049LL<<34), -real(128185967LL<<33),real(278992987LL<<30), reale(709630,0xdb94f1d6c533LL), // C4[17], coeff of eps^23, polynomial in n of order 0 -real(1121LL<<31),real(0x6ef59e61feaaea7LL), // C4[17], coeff of eps^22, polynomial in n of order 1 -real(59LL<<37),-real(309LL<<32),real(0x14ce0db25fc00bf5LL), // C4[17], coeff of eps^21, polynomial in n of order 2 -real(10703LL<<36),real(30413LL<<35),-real(148003LL<<31), reale(6324,0xb043d1b40e32fLL), // C4[17], coeff of eps^20, polynomial in n of order 3 -real(177777LL<<38),real(15715LL<<39),real(4277LL<<38), -real(68103LL<<33),reale(44272,0xd1dabbec63649LL), // C4[17], coeff of eps^19, polynomial in n of order 4 -real(407783LL<<37),real(2775087LL<<35),-real(1157751LL<<36), real(1167621LL<<35),-real(4428011LL<<31),reale(44272,0xd1dabbec63649LL), // C4[17], coeff of eps^18, polynomial in n of order 5 real(1580535LL<<37),-real(334719LL<<39),real(882049LL<<37), -real(210231LL<<38),real(127323LL<<37),-real(580027LL<<32), reale(44272,0xd1dabbec63649LL), // C4[17], coeff of eps^17, polynomial in n of order 6 real(801009LL<<36),-real(2422805LL<<35),real(785323LL<<37), -real(3419955LL<<35),real(1485435LL<<36),-real(1740081LL<<35), real(7540351LL<<31),reale(44272,0xd1dabbec63649LL), // C4[18], coeff of eps^23, polynomial in n of order 0 -real(89LL<<35),real(0x3351994085c8a607LL), // C4[18], coeff of eps^22, polynomial in n of order 1 real(763LL<<36),-real(1809LL<<33),real(0x15fe66403955fe03LL), // C4[18], coeff of eps^21, polynomial in n of order 2 real(91LL<<39),real(35LL<<38),-real(235LL<<34), real(0x15fe66403955fe03LL), // C4[18], coeff of eps^20, polynomial in n of order 3 real(667755LL<<37),-real(269591LL<<38),real(268793LL<<37), -real(508305LL<<34),reale(46802,0xb1f5dc9acf78fLL), // C4[18], coeff of eps^19, polynomial in n of order 4 -real(51319LL<<40),real(132867LL<<38),-real(31255LL<<39), real(18753LL<<38),-real(42441LL<<34),reale(15600,0xe5fc9ede45285LL), // C4[18], coeff of eps^18, polynomial in n of order 5 -real(1198615LL<<36),real(378917LL<<38),-real(1619009LL<<36), real(693861LL<<37),-real(806379LL<<36),real(1740081LL<<33), reale(46802,0xb1f5dc9acf78fLL), // C4[19], coeff of eps^23, polynomial in n of order 0 -real(983LL<<35),real(0x3617bd362c26857dLL), // C4[19], coeff of eps^22, polynomial in n of order 1 real(1LL<<46),-real(189LL<<37),reale(2596,0x737a284739077LL), // C4[19], coeff of eps^21, polynomial in n of order 2 -real(473LL<<40),real(467LL<<39),-real(3525LL<<34), real(0x172ebece12ebf011LL), // C4[19], coeff of eps^20, polynomial in n of order 3 real(2379LL<<41),-real(553LL<<42),real(329LL<<41),-real(2961LL<<35), reale(2596,0x737a284739077LL), // C4[19], coeff of eps^19, polynomial in n of order 4 real(2405LL<<41),-real(10101LL<<39),real(4277LL<<40),-real(4935LL<<39), real(42441LL<<34),reale(2596,0x737a284739077LL), // C4[20], coeff of eps^23, polynomial in n of order 0 -real(1LL<<38),real(0x1f5feefdb1f0c4fLL), // C4[20], coeff of eps^22, polynomial in n of order 1 real(379LL<<42),-real(357LL<<40),reale(2729,0x9a383778d2ed9LL), // C4[20], coeff of eps^21, polynomial in n of order 2 -real(249LL<<43),real(147LL<<42),-real(329LL<<38), reale(2729,0x9a383778d2ed9LL), // C4[20], coeff of eps^20, polynomial in n of order 3 -real(4797LL<<40),real(2009LL<<41),-real(2303LL<<40),real(4935LL<<37), reale(2729,0x9a383778d2ed9LL), // C4[21], coeff of eps^23, polynomial in n of order 0 -real(1327LL<<38),reale(2862,0xc0f646aa6cd3bLL), // C4[21], coeff of eps^22, polynomial in n of order 1 real(11LL<<44),-real(49LL<<39),real(0x3ba4052178e24469LL), // C4[21], coeff of eps^21, polynomial in n of order 2 real(473LL<<43),-real(539LL<<42),real(2303LL<<38), reale(2862,0xc0f646aa6cd3bLL), // C4[22], coeff of eps^23, polynomial in n of order 0 -real(1LL<<41),real(0x5ac8f5f3162ebfdLL), // C4[22], coeff of eps^22, polynomial in n of order 1 -real(23LL<<43),real(49LL<<40),real(0x1105ae1d9428c3f7LL), // C4[23], coeff of eps^23, polynomial in n of order 0 real(1LL<<41),real(0xc5e28ed2c935abLL), }; // count = 2900 #elif GEOGRAPHICLIB_GEODESICEXACT_ORDER == 27 static const real coeff[] = { // C4[0], coeff of eps^26, polynomial in n of order 0 4654,real(327806325), // C4[0], coeff of eps^25, polynomial in n of order 1 -331600,247203,real(5135632425LL), // C4[0], coeff of eps^24, polynomial in n of order 2 -real(30660788480LL),real(15209307520LL),real(3757742824LL), real(0xbd65c2e6062dLL), // C4[0], coeff of eps^23, polynomial in n of order 3 -real(0x4a56872d110LL),real(0x30d818a0d20LL),-real(0x183639ebbb0LL), real(0x1207973318dLL),real(0x472c0a3d3d1ee9LL), // C4[0], coeff of eps^22, polynomial in n of order 4 -real(0x743607eea80LL),real(0x5536ade42a0LL),-real(0x37e9933c940LL), real(0x1bb15f964e0LL),real(469120197546LL),real(0x472c0a3d3d1ee9LL), // C4[0], coeff of eps^21, polynomial in n of order 5 -real(0x1a80e82073690LL),real(0x1485d9e7af5c0LL),-real(0xf039fc9e8ff0LL), real(0x9d5f26153ce0LL),-real(0x4ddf0f750f50LL),real(0x39e793daa6ebLL), real(0xadde5e94360277dLL), // C4[0], coeff of eps^20, polynomial in n of order 6 -real(0xe72f9d31220580LL),real(0xb817a196612bc0LL), -real(0x8e0a680913c900LL),real(0x67a3067b290a40LL), -real(0x43c43707776c80LL),real(0x217ef7b84400c0LL), real(0x83b895ad56e94LL),reale(16517,0x8519000aea763LL), // C4[0], coeff of eps^19, polynomial in n of order 7 -real(0x5be35cb0a188d670LL),real(0x49fb9f6e0e1fa420LL), -real(0x3a970b1601b36050LL),real(0x2d0406e3051baec0LL), -real(0x20bde41e80026c30LL),real(0x155cea808b65d160LL), -real(0xa8bc4b2c853c610LL),real(0x7d3acd77deac86fLL), reale(1139708,0xdfbd02f131dafLL), // C4[0], coeff of eps^18, polynomial in n of order 8 -reale(2219,0x955c84d349100LL),real(0x6f523368eabed3a0LL), -real(0x58df9f4050ea48c0LL),real(0x45eb9b162449f0e0LL), -real(0x35736f4da3b86880LL),real(0x26bb8b2d01772220LL), -real(0x19350a3e2b857840LL),real(0xc6cd21a34a65f60LL), real(0x30a9f24aaae2862LL),reale(1139708,0xdfbd02f131dafLL), // C4[0], coeff of eps^17, polynomial in n of order 9 -reale(3520,0x86c418e66b430LL),reale(2768,0x78979286ec480LL), -reale(2191,0xabc9bb4d59ed0LL),real(0x6c38e96882e6a560LL), -real(0x54765a5d7300bb70LL),real(0x402d11108cfc5240LL), -real(0x2e4c264c23518e10LL),real(0x1e09e0cfb5ca8720LL), -real(0xec7bce3f9449ab0LL),real(0xaf0b9139605a58dLL), reale(1139708,0xdfbd02f131dafLL), // C4[0], coeff of eps^16, polynomial in n of order 10 -reale(6136,0x52223aecbfa00LL),reale(4597,0xf56d1171d1b00LL), -reale(3531,0xe10107f964800LL),reale(2747,0xc7a53bf3c9500LL), -reale(2142,0x9c25bfa8f9600LL),real(0x677abbdfa4dcef00LL), -real(0x4e0ad45efdfc2400LL),real(0x37ff2b5bd74de900LL), -real(0x2432b6ddc0003200LL),real(0x11c5dbb8178f4300LL), real(0x4536f43fdb6a550LL),reale(1139708,0xdfbd02f131dafLL), // C4[0], coeff of eps^15, polynomial in n of order 11 -reale(13102,0xf96f6011eba70LL),reale(8724,0xbd02d5fc04060LL), -reale(6234,0x68dfd557291d0LL),reale(4636,0xd96d16348cb80LL), -reale(3525,0x47255186b7b30LL),reale(2702,0xc781c601a46a0LL), -reale(2062,0x7b91b55fb7290LL),real(0x60521f1f549575c0LL), -real(0x44a70474ce1373f0LL),real(0x2c2e0084319d1ce0LL), -real(0x15a2a473a1b17b50LL),real(0xff41fd49dab95d3LL), reale(1139708,0xdfbd02f131dafLL), // C4[0], coeff of eps^14, polynomial in n of order 12 -reale(63391,0x70a4897dc9e80LL),reale(23343,0xc5a3f9fbbcce0LL), -reale(13453,0x278d24cdf3ac0LL),reale(8911,0x777a0315423a0LL), -reale(6323,0x2714f8a7fff00LL),reale(4656,0xe8c5e07109660LL), -reale(3491,0x6be5fd90e340LL),reale(2621,0xb84b17c4ad20LL), -real(0x78f908534453df80LL),real(0x55814182d129efe0LL), -real(0x36b7bc0c02deebc0LL),real(0x1ab5b755becbe6a0LL), real(0x672760e43e7e5beLL),reale(1139708,0xdfbd02f131dafLL), // C4[0], coeff of eps^13, polynomial in n of order 13 reale(112706,0xdfd869d806ed0LL),reale(29093,0xf8d3fc140cbc0LL), -reale(65760,0x7b52c14019950LL),reale(24105,0xa651ba0482d20LL), -reale(13822,0xd4286a2c4c370LL),reale(9095,0xad3608e2bd280LL), -reale(6394,0x2414e7ceec390LL),reale(4646,0x4bdec656d47e0LL), -reale(3413,0x76099d6b04db0LL),reale(2482,0x54f2fd0561940LL), -real(0x6c7d891fb0df15d0LL),real(0x44efe2727b65d2a0LL), -real(0x2183dc0de2efcff0LL),real(0x189262ba581c6bf1LL), reale(1139708,0xdfbd02f131dafLL), // C4[0], coeff of eps^12, polynomial in n of order 14 reale(22421,0x80a7495217980LL),-reale(122681,0x25b6cd6074ac0LL), reale(117806,0x7498b0aecaf00LL),reale(29700,0x9de1e174ab0c0LL), -reale(68413,0x428634ee0fb80LL),reale(24937,0xf2aac2170b440LL), -reale(14209,0x4f5514d0cb600LL),reale(9268,0x742c2dd2c8fc0LL), -reale(6433,0x2286f06b3b080LL),reale(4585,0x3348b70941340LL), -reale(3266,0x3bda622d31b00LL),reale(2252,0x1340649a90ec0LL), -real(0x589f5d02f1d02580LL),real(0x2adce3e44e715240LL), real(0xa36591ccc5a22bcLL),reale(1139708,0xdfbd02f131dafLL), // C4[0], coeff of eps^11, polynomial in n of order 15 real(0x3845a63e874b7f90LL),reale(2990,0x790a9d44cfaa0LL), reale(23275,0xc0709755ecab0LL),-reale(127863,0x516b98584c9c0LL), reale(123656,0x74905ab09b3d0LL),reale(30291,0xc8698ff57f9e0LL), -reale(71410,0x2ebef8806f110LL),reale(25848,0x521bca14dd980LL), -reale(14605,0xac6deef7d4ff0LL),reale(9413,0x816443bfd6920LL), -reale(6415,0x315eed8f094d0LL),reale(4438,0xfed32587f3cc0LL), -reale(3002,0xabba02cdaebb0LL),real(0x74ba3cd78aa5e860LL), -real(0x3812b2b32b2f8090LL),real(0x28bab2d4ac11f317LL), reale(1139708,0xdfbd02f131dafLL), // C4[0], coeff of eps^10, polynomial in n of order 16 real(0xbcd4fd6df5b2600LL),real(0x17fed2a1d906c020LL), real(0x3a338f7e05a82540LL),reale(3102,0x8ee9d52fa7060LL), reale(24235,0xac0c2ca98fc80LL),-reale(133761,0xdb81f4d32fb60LL), reale(130458,0x34533ae1a43c0LL),reale(30833,0xcd61b102f94e0LL), -reale(74830,0xb3a54c3df6d00LL),reale(26842,0xad19affdd3920LL), -reale(14996,0x635b9e8c37dc0LL),reale(9500,0x408e4569f0960LL), -reale(6294,0x8e3c24f515680LL),reale(4143,0x97d5a30101da0LL), -reale(2534,0x56aa081845f40LL),real(0x4b644b6e4da18de0LL), real(0x11925bb6ba64765aLL),reale(1139708,0xdfbd02f131dafLL), // C4[0], coeff of eps^9, polynomial in n of order 17 real(0x3fcae6c51cf8fd0LL),real(0x6afa1c71c2ac100LL), real(0xc2892977602fa30LL),real(0x18cb840e0ff332e0LL), real(0x3c56602ddecd9290LL),reale(3228,0x26f051b5c20c0LL), reale(25324,0xf8a24438674f0LL),-reale(140558,0x5b2d711d11960LL), reale(138496,0xa2474d581bd50LL),reale(31265,0x7dd7c9350e080LL), -reale(78781,0x407f0fc917850LL),reale(27920,0xd85d0c9896a60LL), -reale(15347,0xbd51776ab0ff0LL),reale(9468,0xaa167d507e040LL), -reale(5981,0xcd152be8bed90LL),reale(3570,0xf062f37e99e20LL), -real(0x68dc53d94dbff530LL),real(0x4ae92c9a7a683bf5LL), reale(1139708,0xdfbd02f131dafLL), // C4[0], coeff of eps^8, polynomial in n of order 18 real(0x1b54ebcbbde1f00LL),real(0x2947b9527677980LL), real(0x415d003e7b1b800LL),real(0x6df9566e0623680LL), real(0xc8ad7ddfed65100LL),real(0x19abdc3c4555e380LL), real(0x3eb74cbd79d9ca00LL),reale(3370,0x20d152b7a6080LL), reale(26575,0x8086d641a0300LL),-reale(148506,0xeae36b607280LL), reale(148190,0x3f5dc7314dc00LL),reale(31472,0x41aaeb33d4a80LL), -reale(83406,0xf30366e47cb00LL),reale(29065,0x630b32b837780LL), -reale(15585,0x2764a1e4e1200LL),reale(9192,0xabf11a369f480LL), -reale(5286,0x3613c4b401900LL),reale(2436,0x784ea73c0a180LL), real(0x2209232c3cc4cca8LL),reale(1139708,0xdfbd02f131dafLL), // C4[0], coeff of eps^7, polynomial in n of order 19 real(0xd73a52d8bd1790LL),real(0x13078939da8f2e0LL), real(0x1bc62bcb4923530LL),real(0x2a1bb9d3adccf00LL), real(0x42f03cdd160e0d0LL),real(0x711670ab4ed8b20LL), real(0xcf3f2963eb3be70LL),real(0x1aa1c278c7668b40LL), real(0x416120b2cbe67210LL),reale(3532,0x3a6649f1d3360LL), reale(28031,0x35f5ca2c79fb0LL),-reale(157970,0xd11b280f51880LL), reale(160182,0x9c904f3daeb50LL),reale(31228,0xe702b02a70ba0LL), -reale(88907,0xf3445bc050710LL),reale(30210,0xe03f62b8103c0LL), -reale(15533,0x7a0f6ace49370LL),reale(8379,0xc089c57da33e0LL), -reale(3746,0x32a85741515d0LL),reale(2585,0x396e1f38f6dbbLL), reale(1139708,0xdfbd02f131dafLL), // C4[0], coeff of eps^6, polynomial in n of order 20 real(0x73457ae9fefc80LL),real(0x9bfefa36a68d60LL), real(0xd7e57b2fb0d740LL),real(0x132c60dd72bf720LL), real(0x1c1d29144004a00LL),real(0x2ad464b0fcdcce0LL), real(0x446dc104a967cc0LL),real(0x7436e717eb8b6a0LL), real(0xd626d1c40bc9780LL),real(0x1badddc640275c60LL), real(0x445f879c8f67c240LL),reale(3719,0x5820c25fe6620LL), reale(29754,0xa45b204c52500LL),-reale(169504,0xe227b2d578420LL), reale(175522,0xa8a2f18c5e7c0LL),reale(30060,0x7f96216b245a0LL), -reale(95556,0xca707dfd4cd80LL),reale(31150,0x37da9e0a66b60LL), -reale(14734,0x203a74e6dd2c0LL),reale(6239,0x114e25ea99520LL), real(0x4f113ff5b79764b6LL),reale(1139708,0xdfbd02f131dafLL), // C4[0], coeff of eps^5, polynomial in n of order 21 real(0x40c53da188eed0LL),real(0x54ed187b34c440LL), real(0x7146df082c9bb0LL),real(0x9a154e844696a0LL), real(0xd666e59b550690LL),real(0x13262a46ef0dd00LL), real(0x1c3f2cd359b1b70LL),real(0x2b4dcc62e91c360LL), real(0x45a57497f9cc650LL),real(0x771c08f5a9775c0LL), real(0xdd1a4961392f330LL),real(0x1ccccddd60de2020LL), real(0x47bbc762b5878e10LL),reale(3937,0xc2066e54dee80LL), reale(31838,0x13ce9b56b82f0LL),-reale(183990,0x8ea49a06f320LL), reale(196055,0x20a74184cbdd0LL),reale(26856,0x50de39af9a740LL), -reale(103681,0x9284ca213d550LL),reale(31195,0x5686bd94fe9a0LL), -reale(11739,0xecc6d600c4a70LL),reale(7362,0xc12f75a94f319LL), reale(1139708,0xdfbd02f131dafLL), // C4[0], coeff of eps^4, polynomial in n of order 22 real(0x25018b34093680LL),real(0x2f66db340747c0LL), real(0x3d8eaf55c4d300LL),real(0x512efdf6054640LL), real(0x6cf4c335af0f80LL),real(0x952f237cecdcc0LL), real(0xd10b7e4cd0dc00LL),real(0x12cf85d69a3fb40LL), real(0x1bf83185acb2880LL),real(0x2b3ea99410c91c0LL), real(0x462f30f09fee500LL),real(0x7931c8e1f8c9040LL), real(0xe34caff0bb50180LL),real(0x1def0c2db115e6c0LL), real(0x4b7080401d466e00LL),reale(4194,0xbf682a6ae8540LL), reale(34423,0x2600aa7441a80LL),-reale(202943,0xe8d9bbd87a440LL), reale(225378,0x7bd3e279ef700LL),reale(18574,0x52c9633395a40LL), -reale(113350,0xffc66a8300c80LL),reale(27528,0x198b9d86370c0LL), reale(3947,0xb3131e15c994LL),reale(1139708,0xdfbd02f131dafLL), // C4[0], coeff of eps^3, polynomial in n of order 23 real(0x14ba9dec234d90LL),real(0x1a15f878f54920LL), real(0x2134b5fb572db0LL),real(0x2acf89c87d75c0LL), real(0x37fb978513cbd0LL),real(0x4a626dbdd79a60LL), real(0x64a2becb8c9bf0LL),real(0x8afd5ca732eb00LL), real(0xc4970cf56e1210LL),real(0x11deb4357fc9ba0LL), real(0x1add3c5ff77a230LL),real(0x2a08c939311e040LL), real(0x451c5af5bb5c050LL),real(0x7909ad73ef1ece0LL), real(0xe685850971be070LL),real(0x1edeb97922aff580LL), real(0x4f3a8e20463e7690LL),reale(4494,0x6f4eb7a652e20LL), reale(37733,0xf376431ecf6b0LL),-reale(229273,0xd3dfdae1d3540LL), reale(271637,0x92a93446bd4d0LL),-reale(5667,0x8cc9ebb9c00a0LL), -reale(121042,0xac8f4eff17b10LL),reale(39799,0x5b8561a065b3fLL), reale(1139708,0xdfbd02f131dafLL), // C4[0], coeff of eps^2, polynomial in n of order 24 real(0xab22c89592500LL),real(0xd46ccddd414a0LL),real(0x10a4eb8f1ddb40LL), real(0x15184ab619d7e0LL),real(0x1b0f2efb81a980LL), real(0x232d3128e64f20LL),real(0x2e6a3ee43c47c0LL), real(0x3e471bedb3b260LL),real(0x552919f15d6e00LL), real(0x7700089e6e39a0LL),real(0xaa7eb4de50d440LL), real(0xfb834e2f281ce0LL),real(0x1801af760623280LL), real(0x263a4a7c48d9420LL),real(0x401905d594140c0LL), real(0x72c2e250398d760LL),real(0xe012c263c05b700LL), real(0x1edcfb1205061ea0LL),real(0x51c797f92b334d40LL), reale(4810,0x460394707a1e0LL),reale(42101,0xccb76963dbb80LL), -reale(269613,0x72aa3b84666e0LL),reale(357865,0x4c16ffd0cb9c0LL), -reale(115779,0xf2f861d29c3a0LL),-reale(21708,0xbd8e92577d4aeLL), reale(1139708,0xdfbd02f131dafLL), // C4[0], coeff of eps^1, polynomial in n of order 25 real(0x16b98c18c43f0LL),real(0x1be76827efc80LL),real(0x2291674649910LL), real(0x2b3d2747a6820LL),real(0x36a8d2fdcc830LL),real(0x45e795ad137c0LL), real(0x5a8eeaa036550LL),real(0x77007a4bcbf60LL),real(0x9ee5aa2960470LL), real(0xd8045ac825300LL),real(0x12bb93df5b3990LL), real(0x1a9b1c398546a0LL),real(0x26d2a92f5c98b0LL), real(0x3a7858f998ee40LL),real(0x5b6e62f9c0b5d0LL), real(0x959d5c24529de0LL),real(0x102f2d0b50524f0LL), real(0x1e1472bfb1ba980LL),real(0x3d69bf9cb587a10LL), real(0x8ee1210e8c36520LL),real(0x194d332fe8d44930LL), real(0x6534ccbfa35124c0LL),reale(15788,0x2cc4c78572650LL), -reale(115779,0xf2f861d29c3a0LL),reale(173669,0xec7492bbea570LL), -reale(75980,0x9773003236861LL),reale(379902,0xf53f00fb109e5LL), // C4[0], coeff of eps^0, polynomial in n of order 26 real(0x104574695550b58LL),real(0x124efd1ef41bc1cLL), real(0x14b36c04f5f7ca0LL),real(0x1787788b9792f24LL), real(0x1ae5caaf52545e8LL),real(0x1ef111702bafd2cLL), real(0x23d6fb7cfc3d530LL),real(0x29d483e08118c34LL), real(0x313c47ee86cd878LL),real(0x3a800de5bbb223cLL), real(0x463f6a859617dc0LL),real(0x555ed8909112544LL), real(0x692d2b9362db308LL),real(0x83a245a495f5b4cLL), real(0xa7cc0a01a036650LL),real(0xda93e49d10b2a54LL), real(0x1243757f6f15c598LL),real(0x193422259e6ad85cLL), real(0x24309a0ea1d47ee0LL),real(0x36b22ea791accb64LL), real(0x588e3327aee70028LL),reale(2530,0x27feb6f2ec96cLL), reale(5262,0xb996ed2c7b770LL),reale(14472,0x7e5f0c3a53874LL), reale(86834,0xf63a495df52b8LL),-reale(303922,0x5dcc00c8da184LL), reale(759805,0xea7e01f6213caLL),reale(1139708,0xdfbd02f131dafLL), // C4[1], coeff of eps^26, polynomial in n of order 0 4654,real(327806325), // C4[1], coeff of eps^25, polynomial in n of order 1 real(22113584),5520955,real(0xf784431927LL), // C4[1], coeff of eps^24, polynomial in n of order 2 real(29556996608LL),-real(15922652416LL),real(11273228472LL), real(0x2383148b21287LL), // C4[1], coeff of eps^23, polynomial in n of order 3 real(0x165661ad6b70LL),-real(0x1009b31cabe0LL),real(0x7444963bdd0LL), real(0x1d0511c64f5LL),real(0x42b94999694cfa7LL), // C4[1], coeff of eps^22, polynomial in n of order 4 real(696434041088LL),-real(561462728640LL),real(334369174656LL), -real(182661157184LL),real(127941872058LL),real(0x13691a10b39411LL), // C4[1], coeff of eps^21, polynomial in n of order 5 real(0x2b50c847e5bec70LL),-real(0x25172ad2adc8640LL), real(0x187490c86e06510LL),-real(0x11cf5b364679120LL), real(0x7e9f37da26e7b0LL),real(0x1f979b01bfd5e3LL), reale(227941,0xc6590096a3923LL), // C4[1], coeff of eps^20, polynomial in n of order 6 real(0x84a641c077c100LL),-real(0x75601a6b667780LL), real(0x51157a29d94600LL),-real(0x4247925ad10480LL), real(0x269068d8c2ab00LL),-real(0x15748d5a64a980LL), real(0xed190d6b360a4LL),reale(29731,0x892d0013a607fLL), // C4[1], coeff of eps^19, polynomial in n of order 7 real(0x57e3d5e3e8a64d50LL),-real(0x4ee151925712ac60LL), real(0x379f60f9d8160ef0LL),-real(0x3036f6417460ec40LL), real(0x1eece80c1c746690LL),-real(0x16f21d696f523420LL), real(0x9ef6bfafd871830LL),real(0x27a3f6720674fabLL), reale(3419126,0x9f3708d39590dLL), // C4[1], coeff of eps^18, polynomial in n of order 8 reale(2128,0x469250df87e00LL),-real(0x76ff6f2ca68ee740LL), real(0x544ea56af984a280LL),-real(0x4b3b3c5b1f3b3dc0LL), real(0x324e822f05811f00LL),-real(0x29dd8ae6f4502040LL), real(0x179c3b6434632b80LL),-real(0xd7628385c5d56c0LL), real(0x91fdd6e000a7926LL),reale(3419126,0x9f3708d39590dLL), // C4[1], coeff of eps^17, polynomial in n of order 9 reale(3396,0xc29d3f547be10LL),-reale(2963,0x6657b77d7b180LL), reale(2082,0xa3af2d55cd2f0LL),-real(0x74e3fc23ed074b20LL), real(0x4f51e11c0cc64dd0LL),-real(0x45cc62cad46028c0LL), real(0x2b210825284d5ab0LL),-real(0x20cfde05bc67de60LL), real(0xdb6584e22cc2590LL),real(0x36aae0ede944991LL), reale(3419126,0x9f3708d39590dLL), // C4[1], coeff of eps^16, polynomial in n of order 10 reale(5994,0xfab7bd428a400LL),-reale(4919,0xd8955c3980a00LL), reale(3376,0x641d9d71fd000LL),-reale(2975,0x320d339261600LL), real(0x7dd1b5a4fb9ffc00LL),-real(0x712cdc1424704200LL), real(0x486493a43f86e800LL),-real(0x3daeb06e6a40ce00LL), real(0x21506b8426325400LL),-real(0x13a656589a61fa00LL), real(0xcfa4dcbf923eff0LL),reale(3419126,0x9f3708d39590dLL), // C4[1], coeff of eps^15, polynomial in n of order 11 reale(13117,0x6cbddabc52ed0LL),-reale(9318,0xa8f3ea9b44c20LL), reale(6040,0x7b2fdab4ba7f0LL),-reale(5022,0x22b8983435e80LL), reale(3330,0x281af37e2710LL),-reale(2968,0x456e895a2c0e0LL), real(0x7764510336be0030LL),-real(0x6af4843f7d4f5f40LL), real(0x3eba1ed514e18750LL),-real(0x31669b90045c25a0LL), real(0x13a17c0101ce1070LL),real(0x4e2a88c78d66acfLL), reale(3419126,0x9f3708d39590dLL), // C4[1], coeff of eps^14, polynomial in n of order 12 reale(68147,0x8cb1a33fbb300LL),-reale(25030,0x19a83b314d5c0LL), reale(13399,0xd5b954b9ffe80LL),-reale(9632,0x5ff7adc5b8740LL), reale(6058,0x6185fb910e200LL),-reale(5122,0x24f31e326fcc0LL), reale(3246,0x498e64bf8a580LL),-reale(2929,0xc60f539a7ee40LL), real(0x6e041fee5d419100LL),-real(0x60b53ba76d5f13c0LL), real(0x3113d4fc9085ec80LL),-real(0x1e6533c87b7d2540LL), real(0x1357622acbb7b13aLL),reale(3419126,0x9f3708d39590dLL), // C4[1], coeff of eps^13, polynomial in n of order 13 -reale(121532,0xe4514e2bd7670LL),-reale(15940,0x17553143d1340LL), reale(71019,0xc50f40d0125f0LL),-reale(26120,0x5d81b142df60LL), reale(13667,0x35bfe1bb73850LL),-reale(9984,0xe4f4c1c8f9780LL), reale(6033,0x4bb2ec6997cb0LL),-reale(5212,0x5459006443fa0LL), reale(3108,0x7a1250dedaf10LL),-reale(2836,0xbc55f0b59dbc0LL), real(0x605fcd3581f88b70LL),-real(0x4fb9f3b2da8b6fe0LL), real(0x1d6444fcd70bcdd0LL),real(0x74c81d1452803b5LL), reale(3419126,0x9f3708d39590dLL), // C4[1], coeff of eps^12, polynomial in n of order 14 -reale(18279,0x4105927635f00LL),reale(111436,0xf9c78acad1e80LL), -reale(127455,0xb83d096a36600LL),-reale(14599,0xb6308ef406280LL), reale(74253,0x38e0bbebab300LL),-reale(27394,0x6661a055a9b80LL), reale(13898,0x35bd350d73c00LL),-reale(10384,0x95909b51f3c80LL), reale(5941,0x73f13b5b28500LL),-reale(5277,0x6484894bf580LL), reale(2891,0x688dd5accde00LL),-reale(2646,0x1bce07b5e7680LL), real(0x4c6028727ac69700LL),-real(0x32eae1a8c2946f80LL), real(0x1ea30b56650e6834LL),reale(3419126,0x9f3708d39590dLL), // C4[1], coeff of eps^11, polynomial in n of order 15 -real(0x26534490cad1dfb0LL),-reale(2194,0x14a85ebaf95e0LL), -reale(18676,0x98f19d91af310LL),reale(115088,0x35b741cc34140LL), -reale(134245,0x8207aed455070LL),-reale(12735,0xf52bb5c1fbfa0LL), reale(77916,0x32c371fd8ec30LL),-reale(28918,0xb36d158cbf480LL), reale(14055,0x84fcc4e4ea6d0LL),-reale(10840,0xa60c8c5d6b960LL), reale(5745,0xafd650291c370LL),-reale(5282,0xabba6463d6a40LL), reale(2556,0x876a7d9212610LL),-reale(2272,0x615ae9eab6320LL), real(0x2e7aab3dc406b2b0LL),real(0xb7e588c69951913LL), reale(3419126,0x9f3708d39590dLL), // C4[1], coeff of eps^10, polynomial in n of order 16 -real(0x6ec9ec72fa83400LL),-real(0xee6121f9ed5ac40LL), -real(0x2698258da225a980LL),-reale(2223,0x82921a72280c0LL), -reale(19088,0x4fb95e6188700LL),reale(119080,0xff5c72a1c6ec0LL), -reale(142117,0x7c3deb03b7480LL),-reale(10117,0x6e8319b8485c0LL), reale(82086,0xede392256e600LL),-reale(30795,0xed5c849e10640LL), reale(14073,0x47ff3f3e080LL),-reale(11359,0x76d81b264bac0LL), reale(5387,0x791e9eab0d300LL),-reale(5153,0xcdddc38eb4b40LL), real(0x7fb4f5b53eb31580LL),-real(0x5fcfbdbbdde05fc0LL), real(0x34b713242f2d630eLL),reale(3419126,0x9f3708d39590dLL), // C4[1], coeff of eps^9, polynomial in n of order 17 -real(0x20f38bbaca812f0LL),-real(0x39b499036d51b00LL), -real(0x6e4d3364d687b10LL),-real(0xee56650d93fe5a0LL), -real(0x26cbb66f58b91d30LL),-reale(2250,0xe985ef9ea8440LL), -reale(19510,0x3134f0f32ad50LL),reale(123456,0xc66bc06159520LL), -reale(151362,0xfafa005fcdf70LL),-reale(6379,0xaa0075c90d80LL), reale(86843,0xd7e050f079870LL),-reale(33196,0x7f1161b25e020LL), reale(13831,0x3ac1850370650LL),-reale(11930,0x8d19c5e9856c0LL), reale(4775,0x36871b380b630LL),-reale(4708,0xdfb0fde91e560LL), real(0x4e466dbc0d5cf410LL),real(0x132845ea2b7be139LL), reale(3419126,0x9f3708d39590dLL), // C4[1], coeff of eps^8, polynomial in n of order 18 -real(0xcaab4ddd8d4600LL),-real(0x13c31d1cbb16d00LL), -real(0x207a98d99de3000LL),-real(0x390c3dedd68b300LL), -real(0x6d71551ca261a00LL),-real(0xed90e825b918900LL), -real(0x26e62c786e462400LL),-reale(2274,0xbbaf6c5e10f00LL), -reale(19934,0x1db266a5f6e00LL),reale(128254,0x3ade3c4739b00LL), -reale(162383,0xab3413f131800LL),-real(0x3992c873ce48ab00LL), reale(92230,0x4a4593a3dbe00LL),-reale(36418,0x345102e4b0100LL), reale(13110,0x864dfe531f400LL),-reale(12475,0xa3edd9488700LL), reale(3771,0xc13fa20286a00LL),-reale(3469,0x365d076765d00LL), real(0x661b6984b64e65f8LL),reale(3419126,0x9f3708d39590dLL), // C4[1], coeff of eps^7, polynomial in n of order 19 -real(0x5b1678b2b96e30LL),-real(0x83e7d604d6e1a0LL), -real(0xc5c1bd21f06210LL),-real(0x135402446a1f500LL), -real(0x1fd9e061288aff0LL),-real(0x381fb1c2d0ea860LL), -real(0x6c176a9d32ee3d0LL),-real(0xebcbb379725c7c0LL), -real(0x26dc285f96da89b0LL),-reale(2292,0x8c4f779be1f20LL), -reale(20344,0xed4bfa0642d90LL),reale(133496,0x33ba4ee858580LL), -reale(175742,0x64c709ffb5b70LL),reale(7288,0xff81f26b85a20LL), reale(98139,0x5735ff04360b0LL),-reale(41010,0x6c5dc3c9a6d40LL), reale(11505,0xfe66ab587ad0LL),-reale(12646,0x14c7a4cad9ca0LL), reale(2204,0x9aaf76ecb66f0LL),real(0x2076d1ad78dbacf7LL), reale(3419126,0x9f3708d39590dLL), // C4[1], coeff of eps^6, polynomial in n of order 20 -real(0x2d4d049c656700LL),-real(0x3e4af5e8d022c0LL), -real(0x57ced7fe851580LL),-real(0x7f7034131ef240LL), -real(0xbf83d85dea6c00LL),-real(0x12c465612feb5c0LL), -real(0x1f04ac518a30280LL),-real(0x36d88216b840540LL), -real(0x6a13494183c7100LL),-real(0xe8a2e478ed378c0LL), -real(0x269ca36792944f80LL),-reale(2300,0x7badf4501a840LL), -reale(20714,0x7015050283600LL),reale(139156,0x8278406ccd440LL), -reale(192233,0x29cb54965bc80LL),reale(20133,0xdb20ab18364c0LL), reale(103930,0xc444b13858500LL),-reale(48022,0x859c77e028ec0LL), reale(8312,0x1287962dbf680LL),-reale(10954,0x169105fd99e40LL), reale(3795,0x3bfe126c62e22LL),reale(3419126,0x9f3708d39590dLL), // C4[1], coeff of eps^5, polynomial in n of order 21 -real(0x1802918882e770LL),-real(0x1fcd949a6860c0LL), -real(0x2aeab9b7d2f010LL),-real(0x3b2acc792185e0LL), -real(0x539feddcdda2b0LL),-real(0x79b43080aca700LL), -real(0xb76e50170e2350LL),-real(0x1207f374f78a820LL), -real(0x1de74f0a09e95f0LL),-real(0x351484156246d40LL), -real(0x6722781c7da1e90LL),-real(0xe37fba15ed8da60LL), -real(0x260d3a8a453ee130LL),-reale(2292,0x258c84a62d380LL), -reale(20989,0x3411bcc4001d0LL),reale(145073,0x9b58d1932c360LL), -reale(212947,0x443e0cc67a470LL),reale(41274,0x9a63d1cc50640LL), reale(107042,0xff9bf7f6712f0LL),-reale(59294,0xf496954c0eee0LL), reale(2833,0xc664f5dce0050LL),real(0x17b85ffcea47049dLL), reale(3419126,0x9f3708d39590dLL), // C4[1], coeff of eps^4, polynomial in n of order 22 -real(0xd20723e198100LL),-real(0x10e999b2026480LL), -real(0x161c2993f30e00LL),-real(0x1d62585afd4f80LL), -real(0x27ca0dc8a2fb00LL),-real(0x370cc97a8ce280LL), -real(0x4e170b46a3d800LL),-real(0x7213d21df5ad80LL), -real(0xac9b82d7503500LL),-real(0x1109444f53c4080LL), -real(0x1c6019c5f02a200LL),-real(0x329a7eb49a52b80LL), -real(0x62d84097135af00LL),-real(0xdb6f2c88eb4fe80LL), -real(0x2502e63c01a3ec00LL),-reale(2256,0x8389e52b04980LL), -reale(21063,0xc2942f767e900LL),reale(150710,0x347c6ec646380LL), -reale(239155,0x111ed671c3600LL),reale(78297,0xeac3242447880LL), reale(97157,0xffcea47049d00LL),-reale(74487,0xcca6f58949a80LL), reale(11841,0x219395a415cbcLL),reale(3419126,0x9f3708d39590dLL), // C4[1], coeff of eps^3, polynomial in n of order 23 -real(0x7207334f38cb0LL),-real(0x8fe6a0f540760LL), -real(0xb7c4f4df6c510LL),-real(0xedcd97a176940LL), -real(0x1384e0d9162770LL),-real(0x1a108f169c7320LL), -real(0x2378674e3fafd0LL),-real(0x3154606a2c6100LL), -real(0x465a9ded7c5a30LL),-real(0x675a79a8aa6ee0LL), -real(0x9d4a8ab99e2290LL),-real(0xf9e328cb49d8c0LL), -real(0x1a2ce594ece04f0LL),-real(0x2efbcc23543daa0LL), -real(0x5c688ee5939fd50LL),-real(0xceb90d2fccdb080LL), -real(0x2331240c282307b0LL),-reale(2173,0x456299e8e9660LL), -reale(20716,0x42df2018b2010LL),reale(154405,0x43613e2a37c0LL), -reale(270827,0xec43372c34270LL),reale(146546,0xa61bf3c2f7de0LL), reale(26313,0x9ff2a1de69530LL),-reale(32563,0x1c55db833bf05LL), reale(3419126,0x9f3708d39590dLL), // C4[1], coeff of eps^2, polynomial in n of order 24 -real(0x39a9fc22d9600LL),-real(0x47a4ffa857140LL), -real(0x59ea353148580LL),-real(0x721982b3023c0LL), -real(0x9291e22ef9d00LL),-real(0xbeda9ea6fc240LL), -real(0xfc517cd616480LL),-real(0x1535335443d4c0LL), -real(0x1d14474c2c6400LL),-real(0x28c4706fdbe340LL), -real(0x3aa43e35a32380LL),-real(0x56eefde83775c0LL), -real(0x859522b6982b00LL),-real(0xd663f0e8861440LL), -real(0x16b2ad2884e0280LL),-real(0x2932441ccc746c0LL), -real(0x51f4ee722e73200LL),-real(0xb97e18f372a9540LL), -real(0x1ff5b9ebacd64180LL),-real(0x7d04fcecbaaf87c0LL), -reale(19431,0x998fba7cdb900LL),reale(150594,0xe619e547a59c0LL), -reale(294712,0x9903e1bb02080LL),reale(231559,0xe5f0c3a538740LL), -reale(65126,0x38abb70677e0aLL),reale(3419126,0x9f3708d39590dLL), // C4[1], coeff of eps^1, polynomial in n of order 25 -real(0x16b98c18c43f0LL),-real(0x1be76827efc80LL), -real(0x2291674649910LL),-real(0x2b3d2747a6820LL), -real(0x36a8d2fdcc830LL),-real(0x45e795ad137c0LL), -real(0x5a8eeaa036550LL),-real(0x77007a4bcbf60LL), -real(0x9ee5aa2960470LL),-real(0xd8045ac825300LL), -real(0x12bb93df5b3990LL),-real(0x1a9b1c398546a0LL), -real(0x26d2a92f5c98b0LL),-real(0x3a7858f998ee40LL), -real(0x5b6e62f9c0b5d0LL),-real(0x959d5c24529de0LL), -real(0x102f2d0b50524f0LL),-real(0x1e1472bfb1ba980LL), -real(0x3d69bf9cb587a10LL),-real(0x8ee1210e8c36520LL), -real(0x194d332fe8d44930LL),-real(0x6534ccbfa35124c0LL), -reale(15788,0x2cc4c78572650LL),reale(115779,0xf2f861d29c3a0LL), -reale(173669,0xec7492bbea570LL),reale(75980,0x9773003236861LL), reale(3419126,0x9f3708d39590dLL), // C4[2], coeff of eps^26, polynomial in n of order 0 2894476,real(0xfe89d46f33LL), // C4[2], coeff of eps^25, polynomial in n of order 1 -8609536,5603312,real(590597728875LL), // C4[2], coeff of eps^24, polynomial in n of order 2 -real(104352359168LL),real(40707880576LL),real(10376961584LL), real(0xb18f66b7a5ca3LL), // C4[2], coeff of eps^23, polynomial in n of order 3 -real(0x265f8c17d00LL),real(0x13bddd35200LL),-real(871294451456LL), real(553528081392LL),real(0xa1c12e8b2dd1e3LL), // C4[2], coeff of eps^22, polynomial in n of order 4 -real(0x46e25cf59280LL),real(0x290af5269020LL),-real(0x22f7c7b01940LL), real(0xd08f4d0d560LL),real(0x355c24081bcLL),real(0xc015674546693d9LL), // C4[2], coeff of eps^21, polynomial in n of order 5 -real(0x326f6045f923c80LL),real(0x1fb1615f9d3a600LL), -real(0x1db1797638c1780LL),real(0xe9780531c07300LL), -real(0x9d24cc38e5d280LL),real(0x60cf9034bf3868LL), reale(379902,0xf53f00fb109e5LL), // C4[2], coeff of eps^20, polynomial in n of order 6 -real(0x4837c78c0550480LL),real(0x313ba08613af040LL), -real(0x2ee33229a4bc300LL),real(0x1a152ee5f2ae9c0LL), -real(0x172de5252da0180LL),real(0x824fa762c0c340LL), real(0x2180172e018ad8LL),reale(379902,0xf53f00fb109e5LL), // C4[2], coeff of eps^19, polynomial in n of order 7 -real(0x5fc4bec46509e480LL),real(0x48096a7e75900b00LL), -real(0x41caf1fb886dd580LL),real(0x28558a32a56ef200LL), -real(0x26dce3ddd1a42680LL),real(0x120433e2d2025900LL), -real(0xce36e1803df1780LL),real(0x7a135866f905bb8LL), reale(5698544,0x5eb10eb5f946bLL), // C4[2], coeff of eps^18, polynomial in n of order 8 -reale(2176,0xe1585afea1500LL),real(0x73bced2a00a143a0LL), -real(0x5fca97395e84bfc0LL),real(0x418b4cd8fc5e04e0LL), -real(0x3e6c34ea7ddb8a80LL),real(0x212422dcacab1620LL), -real(0x1f0466b0c7211540LL),real(0xa12130d17045760LL), real(0x29b0aa486315dbcLL),reale(5698544,0x5eb10eb5f946bLL), // C4[2], coeff of eps^17, polynomial in n of order 9 -reale(3194,0x3409f96190200LL),reale(3129,0x198ba10e3f000LL), -reale(2211,0xeca78927c1e00LL),real(0x6cf94ec7bfac7400LL), -real(0x5f04d2df84f0ba00LL),real(0x39318494ff85f800LL), -real(0x38939121c731d600LL),real(0x1854a6f7e2957c00LL), -real(0x12decef0b13a7200LL),real(0xa9861a018e14120LL), reale(5698544,0x5eb10eb5f946bLL), // C4[2], coeff of eps^16, polynomial in n of order 10 -reale(5172,0xb8c4b33583a00LL),reale(5700,0x1d26bd0962f00LL), -reale(3248,0x8acf908fbc800LL),reale(3050,0xed985975b4100LL), -reale(2251,0xef96e32335600LL),real(0x6370a1a9e900d300LL), -real(0x5c955afee309e400LL),real(0x2eb3ea14003fe500LL), -real(0x2e844e36822a7200LL),real(0xd8a8b891f217700LL), real(0x388df4ca3a6fb20LL),reale(5698544,0x5eb10eb5f946bLL), // C4[2], coeff of eps^15, polynomial in n of order 11 -reale(11115,0xb2ff91ec6c600LL),reale(11728,0x761e1ef822c00LL), -reale(5178,0x9a27d63f52200LL),reale(5773,0x24fd2adb2f000LL), -reale(3328,0x5f0c31c71fe00LL),reale(2908,0x836ab328fb400LL), -reale(2291,0x629d070485a00LL),real(0x5681ee23b9ad7800LL), -real(0x56cafdb120433600LL),real(0x21dbd9f992213c00LL), -real(0x1d4bdf01a76d9200LL),real(0xf4e0cbd04176b20LL), reale(5698544,0x5eb10eb5f946bLL), // C4[2], coeff of eps^14, polynomial in n of order 12 -reale(73826,0x9e48c9be75880LL),reale(32637,0x887aa6de960e0LL), -reale(10940,0x9647b1447b9c0LL),reale(12348,0xdd9347a34b3a0LL), -reale(5206,0x461aa415f3b00LL),reale(5776,0x82c559a327660LL), -reale(3445,0x2b71b5ef13c40LL),reale(2676,0xdbe2bf3d4c920LL), -reale(2313,0x6c289eed11d80LL),real(0x45af1f46068fcbe0LL), -real(0x4a646c774fde3ec0LL),real(0x127e48f8affd9ea0LL), real(0x4e336f38ab11704LL),reale(5698544,0x5eb10eb5f946bLL), // C4[2], coeff of eps^13, polynomial in n of order 13 reale(130976,0x1a84c1eb6d80LL),-reale(14597,0x4f1d8a91fc600LL), -reale(76483,0x6c58cf65980LL),reale(35388,0xd1bf338007b00LL), -reale(10663,0x1c210a8b78080LL),reale(13004,0x14f125ca37c00LL), -reale(5285,0x554d73733c780LL),reale(5660,0xa57467d557d00LL), -reale(3609,0xe9c5b2656ee80LL),reale(2326,0xf26507322be00LL), -reale(2274,0xe6ae0b8fcb580LL),real(0x30f364de4c777f00LL), -real(0x3139417308d0dc80LL),real(0x173bf41713ca3b88LL), reale(5698544,0x5eb10eb5f946bLL), // C4[2], coeff of eps^12, polynomial in n of order 14 reale(12302,0xe52cc8d8c2180LL),-reale(90162,0x247de245423c0LL), reale(136898,0x7ace803b76f00LL),-reale(20188,0x482d40173de40LL), -reale(79167,0xe510d7fd7c380LL),reale(38835,0xfee0572864740LL), -reale(10270,0x4559a0d3b600LL),reale(13648,0x338b156f30cc0LL), -reale(5468,0x80042be36a880LL),reale(5349,0x619325bd73240LL), -reale(3821,0xffa84c59adb00LL),real(0x729df2a6c14b77c0LL), -reale(2073,0x93dcfbe928d80LL),real(0x193a4a0699e49d40LL), real(0x6c8a3fc264f2d98LL),reale(5698544,0x5eb10eb5f946bLL), // C4[2], coeff of eps^11, polynomial in n of order 15 real(0x12b65c49560e1680LL),real(0x4c91348dd4c57d00LL), reale(12186,0xb870c2ef8b380LL),-reale(91199,0x47a39f34d9e00LL), reale(143440,0xa133e98363080LL),-reale(27237,0xaf8901f443900LL), -reale(81724,0x1b06c40663280LL),reale(43231,0xcee7486ccec00LL), -reale(9771,0xb47d34b793580LL),reale(14177,0x876b1df11100LL), -reale(5844,0x5970f546f9880LL),reale(4733,0x71ff0d3b37600LL), -reale(4034,0xaeeb7c4e61b80LL),real(0x4b0e043dd17f5b00LL), -real(0x5c6dac5851097e80LL),real(0x259ade3cf4689f28LL), reale(5698544,0x5eb10eb5f946bLL), // C4[2], coeff of eps^10, polynomial in n of order 16 real(0x285b74a086cfe00LL),real(0x61629f583f6fc20LL), real(0x11e1f0840e822e40LL),real(0x4a2acb7177936860LL), reale(12009,0x162afd0a23e80LL),-reale(92025,0x51c6b64b59b60LL), reale(150657,0xe159fc0830ec0LL),-reale(36240,0x8903bcca1af20LL), -reale(83842,0x8f32e14ed8100LL),reale(48929,0x80db803df8d20LL), -reale(9247,0x4a711a73d90c0LL),reale(14370,0x3118e0d87960LL), -reale(6545,0xcfaa0092b4080LL),reale(3681,0xa71da4ef975a0LL), -reale(4055,0x6bd2ceb58b040LL),real(0x201a58611bc4e1e0LL), real(0x8ca8a9bec5eeb0cLL),reale(5698544,0x5eb10eb5f946bLL), // C4[2], coeff of eps^9, polynomial in n of order 17 real(0x8f791b0d72f300LL),real(0x116eee5fb7db000LL), real(0x2544a69b0af6d00LL),real(0x5ae50a5c0f6ba00LL), real(0x10e6ab279c402700LL),real(0x472bda650b6c4400LL), reale(11750,0x4a89b28f5a100LL),-reale(92512,0x1ccd7f1613200LL), reale(158574,0x53a9410005b00LL),-reale(47896,0xbfb8d60312800LL), -reale(84919,0xb4a50d4cf2b00LL),reale(56401,0x32e93db7ce200LL), -reale(8956,0x3835fd4c87100LL),reale(13782,0xdee88bf296c00LL), -reale(7712,0x7aed9801af700LL),reale(2126,0x5791e5314f600LL), -reale(3273,0xe9400d1963d00LL),real(0x4230ff2c7e6defd0LL), reale(5698544,0x5eb10eb5f946bLL), // C4[2], coeff of eps^8, polynomial in n of order 18 real(0x289b91a48ebf00LL),real(0x45ee5b14465380LL), real(0x7f92734c023800LL),real(0xfa5ad187871c80LL), real(0x21cddd2df61b100LL),real(0x5372a978dde2580LL), real(0xfbd02001ed7aa00LL),real(0x436e93187af7ee80LL), reale(11383,0x2dcd21f7ea300LL),-reale(92459,0xff89d11970880LL), reale(167131,0xf0a2167d11c00LL),-reale(63199,0x7fe973623f80LL), -reale(83766,0xa02debe66b00LL),reale(66187,0xcedf7a1cac980LL), -reale(9608,0xefbab691d7200LL),reale(11585,0x75dbe72dc9280LL), -reale(9220,0x22c92d6997900LL),real(0x18709d3bc0679b80LL), real(0x5b7e325c6742390LL),reale(5698544,0x5eb10eb5f946bLL), // C4[2], coeff of eps^7, polynomial in n of order 19 real(0xd108e5f6f6100LL),real(0x14cfb44a7f1600LL), real(0x227bc5972bab00LL),real(0x3bea4dd1053000LL), real(0x6e5f06564db500LL),real(0xdaf2ed1ea74a00LL), real(0x1dec9104c41ff00LL),real(0x4ae6e1cc221e400LL), real(0xe5bde12a5950900LL),real(0x3ec229ad8ff17e00LL), reale(10869,0xc2e1de8335300LL),-reale(91550,0xfd5202ded6800LL), reale(176075,0x65a5499a95d00LL),-reale(83531,0x98920703e4e00LL), -reale(77994,0x11133349c5900LL),reale(78539,0xb0828e93b4c00LL), -reale(12981,0x6d9e1d7114f00LL),reale(6537,0x5c156837be600LL), -reale(9404,0xf97b75bc90500LL),reale(2071,0xc05f52f113a50LL), reale(5698544,0x5eb10eb5f946bLL), // C4[2], coeff of eps^6, polynomial in n of order 20 real(0x4748ad3ff9e80LL),real(0x6b926f7e60d60LL),real(0xa71fa4085b840LL), real(0x10c991e0a3ab20LL),real(0x1c15b3b145b200LL), real(0x314f7c7c43f8e0LL),real(0x5be1ff458cabc0LL), real(0xb89930a80796a0LL),real(0x199734a3c07c580LL), real(0x411aa25f2292460LL),real(0xcb87e4542581f40LL), real(0x38e7a442bb914220LL),reale(10156,0x20944a9a6d900LL), -reale(89265,0x51d50a4f57020LL),reale(184683,0x63f792d3912c0LL), -reale(110680,0x89cae6d0a5260LL),-reale(62727,0xfdf47fc1380LL), reale(91791,0x3f8035a7d3b60LL),-reale(22895,0xcc844c9bf79c0LL), -real(0x5652aea374b626e0LL),-real(0x38edb32bcbdda4acLL), reale(5698544,0x5eb10eb5f946bLL), // C4[2], coeff of eps^5, polynomial in n of order 21 real(0x185346b40be80LL),real(0x234a30239ea00LL),real(0x345f5bcfbb580LL), real(0x4fc2f91719900LL),real(0x7d257d9ac0c80LL),real(0xcb49d34f58800LL), real(0x1580c944df8380LL),real(0x263bb5e9cb7700LL), real(0x483bd94933da80LL),real(0x935c1fd3f92600LL), real(0x14c807d3436d180LL),real(0x35e9298d8a45500LL), real(0xac6bf9cef462880LL),real(0x318eb0c51232c400LL), reale(9164,0xf22328f6f9f80LL),-reale(84728,0x78acb3795cd00LL), reale(191114,0x47ac3650f680LL),-reale(146268,0x68f68696f9e00LL), -reale(28124,0xaf1a222081280LL),reale(95633,0xf3c35e98b1100LL), -reale(42101,0xccb76963dbb80LL),reale(4250,0xa99770cb50078LL), reale(5698544,0x5eb10eb5f946bLL), // C4[2], coeff of eps^4, polynomial in n of order 22 real(0x7c86a4240e80LL),real(0xaf5db2064cc0LL),real(0xfb958bed1300LL), real(0x17080cf847940LL),real(0x2288f92359780LL),real(0x352f6beaa45c0LL), real(0x54760062cdc00LL),real(0x8b024608ff240LL),real(0xeea60450a2080LL), real(0x1af0609151bec0LL),real(0x33c8072244a500LL), real(0x6bad7af287eb40LL),real(0xf83a707fcba980LL), real(0x293d0a92ebeb7c0LL),real(0x87aa233703e6e00LL), real(0x2855283ce7ee6440LL),reale(7785,0x74e297d243280LL), -reale(76427,0xf39041d0ccf40LL),reale(190726,0x777542b243700LL), -reale(188315,0x1030e5dfaa2c0LL),reale(42101,0xccb76963dbb80LL), reale(46959,0xb31b5803129c0LL),-reale(23682,0x43272b482b978LL), reale(5698544,0x5eb10eb5f946bLL), // C4[2], coeff of eps^3, polynomial in n of order 23 real(0x21a7e921c980LL),real(0x2e51be6e8f00LL),real(0x40c19fbec480LL), real(0x5c1e6062c200LL),real(0x8599d6a9df80LL),real(0xc60160b77500LL), real(0x12cb7c4c7da80LL),real(0x1d5985b996800LL),real(0x2f524aaed7580LL), real(0x4f30941955b00LL),real(0x8a76dd63f7080LL),real(0xff32326380e00LL), real(0x1f5b1b59928b80LL),real(0x42dd3cfeae4100LL), real(0x9e90e4efcb8680LL),real(0x1b33e235264b400LL), real(0x5cdaf2eb93f2180LL),real(0x1cd398a25fa82700LL), reale(5865,0x9368046121c80LL),-reale(61723,0xe7c88c9baa600LL), reale(171645,0xcc7599f993780LL),-reale(213747,0x992d035d6f300LL), reale(126305,0x66263c2b93280LL),-reale(28944,0xfcbe1874a70e8LL), reale(5698544,0x5eb10eb5f946bLL), // C4[2], coeff of eps^2, polynomial in n of order 24 real(0x5f08c3cb900LL),real(0x807038c0ca0LL),real(0xaffaed32440LL), real(0xf4c5be483e0LL),real(0x15a2490f6f80LL),real(0x1f28eae1cb20LL), real(0x2dce80c7fac0LL),real(0x44e60304c260LL),real(0x6a58ca3b2600LL), real(0xa90e89d449a0LL),real(0x1160126eb5140LL),real(0x1db88b51940e0LL), real(0x354168d7adc80LL),real(0x64e3bca9a8820LL),real(0xcc99ed98827c0LL), real(0x1c3fb9ad58ff60LL),real(0x45c01ca2899300LL), real(0xc88852534b86a0LL),real(0x2d1eac1f8a97e40LL), real(0xee21e1c2e9afde0LL),reale(3238,0x9997f46a24980LL), -reale(36434,0x3fed7daa1bae0LL),reale(105254,0x7fca8779a54c0LL), -reale(115779,0xf2f861d29c3a0LL),reale(43417,0x7b1d24aefa95cLL), reale(5698544,0x5eb10eb5f946bLL), // C4[3], coeff of eps^26, polynomial in n of order 0 433472,real(72882272925LL), // C4[3], coeff of eps^25, polynomial in n of order 1 real(76231168),real(19985680),real(0x958a9334879LL), // C4[3], coeff of eps^24, polynomial in n of order 2 real(969805824),-real(756467712),real(427576864),real(0x33a763b318f5LL), // C4[3], coeff of eps^23, polynomial in n of order 3 real(0xe7cfd39aa00LL),-real(0xe6239d55400LL),real(0x44ffe5cce00LL), real(0x123fa804df0LL),real(0x73400ac32a3f24fLL), // C4[3], coeff of eps^22, polynomial in n of order 4 real(633551529LL<<15),-real(0x130f2c71c000LL),real(0x7e08a8b4000LL), -real(0x69e0a004000LL),real(0x39175efa340LL),real(0x59a39697cb86721LL), // C4[3], coeff of eps^21, polynomial in n of order 5 real(0xe1a59555817c700LL),-real(0xce92ef160470400LL), real(0x6a50b28bc94d100LL),-real(0x6ec5ce0328fa200LL), real(0x1e2919432b73b00LL),real(0x81169f96b647f8LL), reale(2659320,0xb4b906dd74543LL), // C4[3], coeff of eps^20, polynomial in n of order 6 real(0x4a951ec0f743800LL),-real(0x39128060ba74400LL), real(0x258d1de3ebd5000LL),-real(0x25e6a8ece22dc00LL), real(0xe953314d336800LL),-real(0xd6fbba5b80b400LL), real(0x6d3d6d3e79ea90LL),reale(531864,0x2425015f7daa7LL), // C4[3], coeff of eps^19, polynomial in n of order 7 real(0x7366685d2da15300LL),-real(0x46390dd9eadeba00LL), real(0x3de3739917104900LL),-real(0x34e3ad131262bc00LL), real(0x1ae64995e9a59f00LL),-real(0x1d6cea9b561f3e00LL), real(0x70d3407961b9500LL),real(0x1ea45bc7b594048LL), reale(7977962,0x1e2b14985cfc9LL), // C4[3], coeff of eps^18, polynomial in n of order 8 reale(2991,8707772229LL<<17),-real(0x5c0b6a6cd5328000LL), real(0x6cf3b04ea6358000LL),-real(0x47da0c907a958000LL), real(0x334344c895550000LL),-real(0x3257cd9b75628000LL), real(0x11d874d9e96c8000LL),-real(0x1273b92365d58000LL), real(0x8b048eddb8dae80LL),reale(7977962,0x1e2b14985cfc9LL), // C4[3], coeff of eps^17, polynomial in n of order 9 reale(4599,0x20675bc677c00LL),-reale(2190,0x6a6db0c48a000LL), reale(3019,0xad2c946b04400LL),-real(0x5cc951aa5f7ff800LL), real(0x61f2b89850d68c00LL),-real(0x49aa7ace4eb85000LL), real(0x26482ceb1d4d5400LL),-real(0x2b88fb70a186a800LL), real(0x8bf6f0c9a679c00LL),real(0x26ce624431e62e0LL), reale(7977962,0x1e2b14985cfc9LL), // C4[3], coeff of eps^16, polynomial in n of order 10 real(0x383bee2531d2a000LL),-real(0x2821094d061d1000LL), real(0x2c347b321d4c8000LL),-real(0x125d6736b20ff000LL), real(0x1a6c4162f9ae6000LL),-real(0xdca07dd1a07d000LL), real(0xba2cc7913be4000LL),-real(0xa8a49fd40deb000LL), real(0x36dcb24ee422000LL),-real(0x4159df2ed6e9000LL), real(0x1bdad6784709c40LL),reale(1139708,0xdfbd02f131dafLL), // C4[3], coeff of eps^15, polynomial in n of order 11 reale(7381,0x14c34c0c1f400LL),-reale(13257,0xf5b9dadc0c800LL), reale(7086,0x404eb1053bc00LL),-reale(4054,0xe4ed62e9ea000LL), reale(5287,0x17e93cc880400LL),-real(0x7bc6aed7afe87800LL), reale(2758,0x364797381cc00LL),-real(0x676ee80244a35000LL), real(0x3b6d32d9ca041400LL),-real(0x43e3e0c280942800LL), real(0xa86d2e316b1dc00LL),real(0x300bec0027818e0LL), reale(7977962,0x1e2b14985cfc9LL), // C4[3], coeff of eps^14, polynomial in n of order 12 reale(66948,0x4f30b3f870000LL),-reale(52646,0x686a3833a8000LL), reale(7561,0xd0b8bda7a8000LL),-reale(13026,0x7d89ec00d8000LL), reale(8130,0xd3b0b583a0000LL),-reale(3523,0xd290763e28000LL), reale(5530,0x8b9708b698000LL),-real(0x7e52c154efd58000LL), reale(2356,0x7673a06ad0000LL),-real(0x6f6a34d21b028000LL), real(0x220d8444fca88000LL),-real(0x2fac85fa2e858000LL), real(0x11c823101280e280LL),reale(7977962,0x1e2b14985cfc9LL), // C4[3], coeff of eps^13, polynomial in n of order 13 -reale(129173,0x58489bc283900LL),reale(59789,0xf9dc41e63d400LL), reale(65695,0x9083acc5cc100LL),-reale(58445,0x2f2cc6e161a00LL), reale(8184,0x5e79915d1b00LL),-reale(12353,0x83a959670c800LL), reale(9463,0x4211f61d49500LL),-reale(2966,0xe12b8e3527600LL), reale(5543,0x52a28a556ef00LL),-reale(2249,0xe1f749ba16400LL), real(0x6b0d1cda5c5fe900LL),-real(0x70ab303245f3d200LL), real(0xb596d16f1a34300LL),real(0x35b4de912478078LL), reale(7977962,0x1e2b14985cfc9LL), // C4[3], coeff of eps^12, polynomial in n of order 14 -reale(6933,0xfc2bb7bd6800LL),reale(63382,0x668969a617c00LL), -reale(132589,0xf0bdf2e789000LL),reale(69768,0x70d2052fd2400LL), reale(63007,0x6d053a2cb4800LL),-reale(65233,0xb829e1b817400LL), reale(9601,0xec9983923a000LL),-reale(11042,0x4317b942ccc00LL), reale(11048,0xa50acd625f800LL),-reale(2545,0x7c97f16176400LL), reale(5107,0xc83f2d67d000LL),-reale(2697,0x85e48cc53bc00LL), real(0x36af107261fea800LL),-real(0x57b6b3b8f7f45400LL), real(0x1b355635bf037310LL),reale(7977962,0x1e2b14985cfc9LL), // C4[3], coeff of eps^11, polynomial in n of order 15 -real(0x718d19ce618f700LL),-real(0x22292bb4d2a0a600LL), -reale(6561,0x7bb8e05b06500LL),reale(61876,0xa080215cbc400LL), -reale(135759,0x6c0a25f10b300LL),reale(81504,0x4116e653fae00LL), reale(58147,0xb03676e9edf00LL),-reale(73011,0xd75b35d7e2800LL), reale(12405,0x6d2fd911f1100LL),-reale(8886,0xdfa5214b6fe00LL), reale(12677,0x826d436a8a300LL),-reale(2577,0x6d77ecdf41400LL), reale(3947,0x879d1c7c5500LL),-reale(3192,0x95f286c2eaa00LL), real(0x7343398f272e700LL),real(0x20b3728b7b6b2d8LL), reale(7977962,0x1e2b14985cfc9LL), // C4[3], coeff of eps^10, polynomial in n of order 16 -real(0xaaaed768da0000LL),-real(0x1d8d58546174000LL), -real(0x650ff776c6dc000LL),-real(0x1f0fa133b6eac000LL), -reale(6125,0x868b157bb8000LL),reale(59813,0x741ec012c000LL), -reale(138411,0xa7483b2cd4000LL),reale(95264,0x22057cd374000LL), reale(50003,0x3a5ca8a530000LL),-reale(81502,0xff7b30e274000LL), reale(17542,0xf2776c79b4000LL),-reale(5812,0xc63b637b2c000LL), reale(13748,0x38a6c4d018000LL),-reale(3547,0xbf6bf7e154000LL), real(0x78ab12d1827bc000LL),-reale(2957,0x6b24852f8c000LL), real(0x2bef42096127d7c0LL),reale(7977962,0x1e2b14985cfc9LL), // C4[3], coeff of eps^9, polynomial in n of order 17 -real(0x3cadc0edd6600LL),-real(0x8587ee4c4e000LL), -real(0x14633459f95a00LL),-real(0x397bc2059d8400LL), -real(0xc89f8adb490e00LL),-real(0x3f2a86a64b5a800LL), -real(0x32218961953c0200LL),reale(8146,0xa930f21b73400LL), -reale(20015,0x8b16989f1b600LL),reale(15890,0x8aa3fb72d9000LL), reale(5271,0xbcd5aeda65600LL),-reale(12822,0x9424c22ae1400LL), reale(3774,0x46bb658aca200LL),-real(0x148a80159bb73800LL), real(0x736580900f31ae00LL),-real(0x336f49c74ee95c00LL), -real(0x249e756eeea0600LL),-real(0x13841fc89043bb0LL), reale(1139708,0xdfbd02f131dafLL), // C4[3], coeff of eps^8, polynomial in n of order 18 -real(0x5318540751000LL),-real(0xa0702ad537800LL), -real(0x14a9549a688000LL),-real(0x2e31b9dc878800LL), -real(0x72dceb1c83f000LL),-real(0x14a6c8c8df91800LL), -real(0x49c3e43ec426000LL),-real(0x17df3e19aed32800LL), -reale(5017,0x9bceef61ed000LL),reale(53301,0x74feac5bf4800LL), -reale(140139,0x5706164944000LL),reale(129320,0x1fd8eca933800LL), reale(16403,0x87db178e25000LL),-reale(95278,0x1e65e67825800LL), reale(40665,0x6f4b03ec9e000LL),-real(0x1c82af8b65ac6800LL), reale(8049,0x334ede6a77000LL),-reale(7540,0x5b108b15f800LL), real(0x49ca297e3ffdbce0LL),reale(7977962,0x1e2b14985cfc9LL), // C4[3], coeff of eps^7, polynomial in n of order 19 -real(0x11fa490472e00LL),-real(0x1fe0e98340400LL), -real(0x3b2a552443a00LL),-real(0x73f5544ad2000LL), -real(0xf2e5765f90600LL),-real(0x2290ce0f423c00LL), -real(0x57b83400ee1200LL),-real(0x1023f65b9bfd800LL), -real(0x3b36c6db61bde00LL),-real(0x13c7b72049527400LL), -reale(4323,0x73be8c4caea00LL),reale(48359,0x7d21dc7197000LL), -reale(137343,0xc18958973b600LL),reale(148676,0xd51cb5c775400LL), -reale(14754,0xa89f0bc9ec200LL),-reale(92175,0x33d1092c54800LL), reale(60290,0x88af4d43b7200LL),-reale(5855,0x8c9719d08e400LL), -real(0x48b16aa4982d9a00LL),-real(0x51dba59b00547450LL), reale(7977962,0x1e2b14985cfc9LL), // C4[3], coeff of eps^6, polynomial in n of order 20 -real(0x3f0527da8000LL),-real(0x69410a894000LL),-real(0xb5f68cf74000LL), -real(0x14766cd18c000LL),-real(5178956321LL<<17), -real(0x4cf42ca274000LL),-real(0xa45199d7cc000LL), -real(0x17e337e696c000LL),-real(0x3e169088698000LL), -real(0xbbd1c494494000LL),-real(0x2c70014b4ca4000LL), -real(0xf67e7406420c000LL),-reale(3524,0xcb63f52610000LL), reale(41859,0x1cfdfa000c000LL),-reale(129839,0xf92d750efc000LL), reale(166586,0x5d10da3394000LL),-reale(59706,0x5fbf7c0388000LL), -reale(68020,0xa047f74594000LL),reale(75721,0x1307a9002c000LL), -reale(24384,0xc0b45d798c000LL),real(0x6534ccbfa35124c0LL), reale(7977962,0x1e2b14985cfc9LL), // C4[3], coeff of eps^5, polynomial in n of order 21 -real(0xcd30266b700LL),-real(0x147d4e1fec00LL),-real(0x21a6b4a64100LL), -real(0x390579acce00LL),-real(0x6423741d2b00LL),-real(0xb749b833f000LL), -real(0x1602ad6953500LL),-real(0x2ccfc753d1200LL), -real(0x61e5d62301f00LL),-real(0xe995b2fcff400LL), -real(0x270c826fb7a900LL),-real(0x7a09e7f3045600LL), -real(0x1dfb4c385ed9300LL),-real(0xaddceca1091f800LL), -reale(2624,0xc45e83fdb9d00LL),reale(33433,0x20d0a109f6600LL), -reale(114656,0xa3de6d0238700LL),reale(175907,0x1d4b03fe80400LL), -reale(116168,0x7b17e334f1100LL),-reale(3810,0x1e1c2e9afde00LL), reale(45340,0x664f5dce00500LL),-reale(17205,0xff74273e2678LL), reale(7977962,0x1e2b14985cfc9LL), // C4[3], coeff of eps^4, polynomial in n of order 22 -real(784468838400LL),-real(0x11a0a388400LL),-real(0x1bda05d7000LL), -real(0x2d25cb21c00LL),-real(0x4b5283d5800LL),-real(0x81d5381f400LL), -real(0xe84e582c000LL),-real(0x1b2017768c00LL),-real(0x354f35942800LL), -real(0x6f49195e6400LL),-real(0xf9ffb1d81000LL),-real(0x267769207fc00LL), -real(0x6a9801634f800LL),-real(0x15adc2fc41d400LL), -real(0x5947d2bb916000LL),-real(0x222d7eabcda6c00LL), -real(0x22707489da53c800LL),reale(7620,0x3c385d35fbc00LL), -reale(29197,0x886c2c8e2b000LL),reale(53341,0xa58a8c79e2400LL), -reale(51817,0x997f46a249800LL),reale(25908,0xccbfa35124c00LL), -reale(5262,0xb996ed2c7b770LL),reale(2659320,0xb4b906dd74543LL), // C4[3], coeff of eps^3, polynomial in n of order 23 -real(242883621120LL),-real(365079728640LL),-real(559688344320LL), -real(876931046400LL),-real(0x147bd04f500LL),-real(0x21c7b15a600LL), -real(0x396d13e6700LL),-real(0x650be18b000LL),-real(0xb8f375f7900LL), -real(0x16253c45ba00LL),-real(0x2cc1928ceb00LL),-real(0x6065d92f8400LL), -real(0xe04f74737d00LL),-real(0x23eadf138ce00LL), -real(0x682920857ef00LL),-real(0x1651f4aee45800LL), -real(0x61a68e7d270100LL),-real(0x281b43aa424e200LL), -real(0x2bddd20238857300LL),reale(10668,0x544ee8e52d400LL), -reale(45340,0x664f5dce00500LL),reale(90680,0xcc9ebb9c00a00LL), -reale(84203,0x996ed2c7b7700LL),reale(28944,0xfcbe1874a70e8LL), reale(7977962,0x1e2b14985cfc9LL), // C4[4], coeff of eps^26, polynomial in n of order 0 real(74207744),real(0x377b3e1aa351LL), // C4[4], coeff of eps^25, polynomial in n of order 1 -real(85649408),real(42776448),real(0x7a5a1b59863LL), // C4[4], coeff of eps^24, polynomial in n of order 2 -real(0x5d090f66800LL),real(0x15cb8432c00LL),real(412184096896LL), real(0x3e897844a5071ebLL), // C4[4], coeff of eps^23, polynomial in n of order 3 -real(0xbff3f70d800LL),real(0x44c7b31b000LL),-real(0x48108b34800LL), real(0x21db9c9a980LL),real(0x4fc9e010f5dcf23LL), // C4[4], coeff of eps^22, polynomial in n of order 4 -real(0xd6b769b7e000LL),real(0x72b1142e1800LL),-real(0x82aa7be7f000LL), real(0x1aa8532e0800LL),real(0x779e97cc600LL),real(0x40d4060dc7c384c7LL), // C4[4], coeff of eps^21, polynomial in n of order 5 -real(0x474af3a87693800LL),real(0x3c389a0df442000LL), -real(0x37e1a3d92db8800LL),real(0x12d1db00bd71000LL), -real(0x15fc16a85bcd800LL),real(0x99491c279c9880LL), reale(1139708,0xdfbd02f131dafLL), // C4[4], coeff of eps^20, polynomial in n of order 6 -real(0x303d69b47fe22400LL),real(0x3f4d2c93a259b200LL), -real(0x29be542895db1800LL),real(0x17eb54d9d2a59e00LL), -real(0x1b89924120220c00LL),real(0x4aa7a22c8d50a00LL), real(0x157745851f3d4c0LL),reale(10257379,0xdda51a7ac0b27LL), // C4[4], coeff of eps^19, polynomial in n of order 7 -real(0x44c3305a70de1000LL),real(0x6d1c9adfcac5e000LL), -real(0x312f88327b293000LL),real(0x3351684a1a554000LL), -real(0x2ab43a21fd0e5000LL),real(0xdaac481cc1ca000LL), -real(0x120b854707e97000LL),real(0x7289c72302f3500LL), reale(10257379,0xdda51a7ac0b27LL), // C4[4], coeff of eps^18, polynomial in n of order 8 -reale(2256,0x7b501df238000LL),reale(2620,0x5abb698ccf000LL), -real(0x3cfd86157c22a000LL),real(0x656f30f9d7a5d000LL), -real(0x3529aafa1251c000LL),real(0x23979dd758c6b000LL), -real(0x27cfd52f91a0e000LL),real(0x52c1297ffdf9000LL), real(0x1899e61f0915c00LL),reale(10257379,0xdda51a7ac0b27LL), // C4[4], coeff of eps^17, polynomial in n of order 9 -reale(5647,0x92962c0679000LL),reale(3064,0xd620df9a18000LL), -real(0x73b5708edb717000LL),reale(2782,0xf8e2a6bab2000LL), -real(0x3aa55028ed4d5000LL),real(0x54f5b0489ac0c000LL), -real(0x3a8372ad6ebf3000LL),real(0x128f31db99de6000LL), -real(0x1bbb3cddeb8b1000LL),real(0x9c3f5d344ffbb00LL), reale(10257379,0xdda51a7ac0b27LL), // C4[4], coeff of eps^16, polynomial in n of order 10 -reale(12546,0xd0659481f7000LL),reale(2321,0x6f75c5bce2800LL), -reale(5209,0xc9bfbad2ac000LL),reale(3693,0x4f3d4dd785800LL), -real(0x59b26230b2e61000LL),reale(2785,0x7ef843b608800LL), -real(0x4086b5731d656000LL),real(0x3b22d2695822b800LL), -real(0x3bbf747f663cb000LL),real(0x50e2c41c71ae800LL), real(0x19182d9cca60700LL),reale(10257379,0xdda51a7ac0b27LL), // C4[4], coeff of eps^15, polynomial in n of order 11 -reale(14655,0xa7ccf7b3e3000LL),reale(5703,0xb41e60048e000LL), -reale(13723,0x6fa2143b1000LL),reale(2794,0x80dd2a6158000LL), -reale(4434,0xbdbd659d5f000LL),reale(4398,0x1bf890b722000LL), -real(0x462f1f0759b2d000LL),reale(2504,0xfcfacf17ac000LL), -real(0x4eb2a95e9a75b000LL),real(0x1bef3eef6f4b6000LL), -real(0x2d8008caddc29000LL),real(0xdbb189dc4eba300LL), reale(10257379,0xdda51a7ac0b27LL), // C4[4], coeff of eps^14, polynomial in n of order 12 -reale(31110,0xd0a51132f4000LL),reale(76716,0x887753c58b000LL), -reale(19285,0xcfd85f57f6000LL),reale(3558,0x4fcfd1ab09000LL), -reale(14554,0xbf2d0ac9f8000LL),reale(3850,0x9631322307000LL), -reale(3313,0x90f8abbffa000LL),reale(4999,0xf3c6aed085000LL), -real(0x44308029330fc000LL),real(0x72cd2f325ae83000LL), -real(0x5cc3eeffca3fe000LL),real(0x2f990ef34001000LL), real(0xedd65cb262fc00LL),reale(10257379,0xdda51a7ac0b27LL), // C4[4], coeff of eps^13, polynomial in n of order 13 reale(109832,0xfe67f2664d000LL),-reale(101414,0x365d952fe4000LL), -reale(21578,0x2c7dffdd75000LL),reale(81484,0xfb5b01862000LL), -reale(25828,0x7adf44b697000LL),real(0x527645ab2c368000LL), -reale(14626,0xa0f5b7bcd9000LL),reale(5668,0x89f8307d6e000LL), -real(0x7c6deea8217fb000LL),reale(5148,0xb3c77272b4000LL), -real(0x5ea4f23e05fbd000LL),real(0x33d79ea3e6f7a000LL), -real(0x512f5a2dc7bdf000LL),real(0x13f171801c8d4d00LL), reale(10257379,0xdda51a7ac0b27LL), // C4[4], coeff of eps^12, polynomial in n of order 14 reale(3290,0xf070eb97f3400LL),-reale(37925,0x14cc0872bb200LL), reale(108756,0x262a302ba0800LL),-reale(111139,0xba49ef60cbe00LL), -reale(8978,0x96e5af6312400LL),reale(85061,0xe9667b666b600LL), -reale(34830,0xb50884d615000LL),-real(0x1ae66991075c5600LL), -reale(13337,0xd2d72b2557c00LL),reale(8254,0x43d2c57af1e00LL), -real(0x39646320240ca800LL),reale(4333,0x5a8eb4efe1200LL), -reale(2317,0x387052d25d400LL),-real(0x4971411b9aa7a00LL), -real(0x239dc6f1135e6c0LL),reale(10257379,0xdda51a7ac0b27LL), // C4[4], coeff of eps^11, polynomial in n of order 15 real(0x22fb18f3d6fc800LL),real(0xc812a63656dd000LL), reale(2929,0x54e6120875800LL),-reale(35121,0x48d05c62be000LL), reale(106528,0xc02be4bd3e800LL),-reale(121104,0xca8db31999000LL), reale(7480,0x3b39caec37800LL),reale(86076,0xd8784a9f2c000LL), -reale(46728,0xdb6f945bbf800LL),-real(0x1e17ea5787b8f000LL), -reale(10012,0x630283c6800LL),reale(11072,0xcb500e9316000LL), -real(0x3d2315ebbfcfd800LL),reale(2196,0x522d08f7fb000LL), -reale(2582,0x2942c8d084800LL),real(0x1dbc900c41177d80LL), reale(10257379,0xdda51a7ac0b27LL), // C4[4], coeff of eps^10, polynomial in n of order 16 real(0x2367980c018000LL),real(0x717a5d0aad6800LL), real(0x1c7a6b9a7155000LL),real(0xa7a0b73a0f93800LL), reale(2540,0xdc02459a12000LL),-reale(31836,0xf2625ff3ef800LL), reale(102741,0xc61b0075cf000LL),-reale(130713,0xb431635532800LL), reale(28618,0x913148900c000LL),reale(82224,0x225affaa4a800LL), -reale(61371,0x71836a73b7000LL),reale(3358,0xd2d9334507800LL), -reale(4436,0x51714c11fa000LL),reale(12409,0x2e12e0f984800LL), -reale(3099,0xb59c601f3d000LL),-real(0x185351aa9adbe800LL), -real(0xfcd867cd32b4e00LL),reale(10257379,0xdda51a7ac0b27LL), // C4[4], coeff of eps^9, polynomial in n of order 17 real(0x3b98569230800LL),real(0x954e9f9ae8000LL),real(0x1a387f0ed5f800LL), real(0x561911aabbb000LL),real(0x163673b1889e800LL), real(0x870aa0c397ae000LL),reale(2128,0x4412890e0d800LL), -reale(28018,0x9edd02151f000LL),reale(96862,0x40aaeaffcc800LL), -reale(138876,0x18d8a92e8c000LL),reale(55003,0xc4365147fb800LL), reale(69831,0x65a81c2787000LL),-reale(76836,0x9198c23745800LL), reale(14324,0xf9d757893a000LL),real(0x610a50cc5ec29800LL), reale(9036,0xddda1962ad000LL),-reale(5866,0x301cbcb97800LL), real(0x2b3d64f38f7c3a80LL),reale(10257379,0xdda51a7ac0b27LL), // C4[4], coeff of eps^8, polynomial in n of order 18 real(0x7c44a1c56800LL),real(0x10e1a40b9f400LL),real(0x2778995e94000LL), real(0x6511d82348c00LL),real(0x122fbee15d1800LL), real(0x3d60d47d162400LL),real(0x10572b5ec96f000LL), real(0x670e5c5512cbc00LL),real(0x6a1969ca184cc800LL), -reale(23632,0x6fc488059ac00LL),reale(88223,0x601afc7b4a000LL), -reale(143685,0x3819032af1400LL),reale(86217,0x78ea8eac47800LL), reale(43622,0x50ec504da8400LL),-reale(86857,0xe4e3b378db000LL), reale(34767,0x1af4459111c00LL),real(0x470ee9f8c8f42800LL), -real(0xf0a395fd8dd4c00LL),-real(0x55da5cd875ef3c80LL), reale(10257379,0xdda51a7ac0b27LL), // C4[4], coeff of eps^7, polynomial in n of order 19 real(0x114b06357800LL),real(0x2239f3629000LL),real(0x475e8ebd2800LL), real(0x9e5523c88000LL),real(0x17aa424dfd800LL),real(0x3e2133dde7000LL), real(0xb7f09cec78800LL),real(0x280af153ee6000LL), real(0xb0d866e91e3800LL),real(0x48b6aeda5425000LL), real(0x4ec10b7f840de800LL),-reale(18693,0xda891ccdbc000LL), reale(76065,0x2aaa760409800LL),-reale(141961,0xc3f732a21d000LL), reale(119123,0xd1c84be04800LL),-real(0x7f4b67756e45e000LL), -reale(76606,0xe7a6860690800LL),reale(56790,0xce45bec021000LL), -reale(14598,0xc436164715800LL),real(0x23b84843a30d9480LL), reale(10257379,0xdda51a7ac0b27LL), // C4[4], coeff of eps^6, polynomial in n of order 20 real(0x2492f246000LL),real(0x43b68382800LL),real(0x827fc7ff000LL), real(0x10769dabb800LL),real(0x231371038000LL),real(0x4fad3dfb4800LL), real(0xc39532c71000LL),real(0x2109cc8eed800LL),real(0x650cdd3e2a000LL), real(0x16d3054b8e6800LL),real(0x69275cf4ee3000LL), real(0x2d6bb9aa2a1f800LL),real(0x342dc9db6781c000LL), -reale(13325,0xb15a42ce7800LL),reale(59725,0xe775950b55000LL), -reale(128819,0x4abda20fae800LL),reale(144216,0xdf24ba0e000LL), -reale(65935,0x168961cdb5800LL),-reale(23422,0x325c674239000LL), reale(39625,0x392517e583800LL),-reale(12954,0x665fd1a892600LL), reale(10257379,0xdda51a7ac0b27LL), // C4[4], coeff of eps^5, polynomial in n of order 21 real(273177999360LL),real(481049600000LL),real(875104847872LL), real(0x180866df000LL),real(0x2f4b74a1800LL),real(0x61abf5b8000LL), real(0xd562fc0e800LL),real(0x1f2598191000LL),real(0x4ed8f85ab800LL), real(0xdc91252ca000LL),real(0x2bd44913d8800LL),real(0xa584ade1c3000LL), real(0x322090df0f5800LL),real(0x16f6266186dc000LL), real(0x1c472a543df62800LL),-reale(7859,0x7aaf0fd58b000LL), reale(39234,0x9eeb23497f800LL),-reale(98180,0xb70c1a0b12000LL), reale(140051,0xe6fe7071ac800LL),-reale(115827,0x9358bc0159000LL), reale(51817,0x997f46a249800LL),-reale(9715,0xccc7dd3e6dc80LL), reale(10257379,0xdda51a7ac0b27LL), // C4[4], coeff of eps^4, polynomial in n of order 22 real(18103127040LL),real(30658521600LL),real(53362944000LL), real(95756838400LL),real(177805329408LL),real(343155696128LL), real(692078714880LL),real(0x155e2e7de00LL),real(0x30194583c00LL), real(0x741fc16da00LL),real(0x131155285800LL),real(0x379d38605600LL), real(0xb96166967400LL),real(0x2e2dfa3db5200LL),real(0xee14dc9ed9000LL), real(0x752e44962ece00LL),real(0x9cf0406db58ac00LL), -reale(3007,0xfcd2e16ce3600LL),reale(16844,0xbb0354c82c800LL), -reale(48007,0x7b6318074ba00LL),reale(77726,0x663ee9f36e400LL), -reale(64771,0xffdf184adbe00LL),reale(21050,0xe65bb4b1eddc0LL), reale(10257379,0xdda51a7ac0b27LL), // C4[5], coeff of eps^26, polynomial in n of order 0 356096,real(98232628725LL), // C4[5], coeff of eps^25, polynomial in n of order 1 real(19006687232LL),real(5473719680LL),real(0x1580fd4afdbe65LL), // C4[5], coeff of eps^24, polynomial in n of order 2 real(91538057LL<<15),-real(0x378568c4000LL),real(0x16cc31e2a00LL), real(0x4c6f2137745e091LL), // C4[5], coeff of eps^23, polynomial in n of order 3 real(0xef2f223e3800LL),-real(0x110fb2e7bf000LL),real(0x282bb4606800LL), real(0xbe30d7a6780LL),reale(2828,0xfcd03d1974f5LL), // C4[5], coeff of eps^22, polynomial in n of order 4 real(0x5e4a1598000LL),-real(0x48b6e92a000LL),real(97904939LL<<14), -real(0x20e8326e000LL),real(850763001088LL),real(0x2081a7235aaf593LL), // C4[5], coeff of eps^21, polynomial in n of order 5 real(0x40db2f49b455f800LL),-real(0x1e99bb32c4c22000LL), real(0x173ba0294630c800LL),-real(0x194707e3169c1000LL), real(0x2d83efe695c9800LL),real(0xdf3e0617af3080LL), reale(12536797,0x9d1f205d24685LL), // C4[5], coeff of eps^20, polynomial in n of order 6 real(0x216feaa994ce0000LL),-real(0xab5f967e8690000LL), real(0x47922226ed5LL<<18),-real(0xb74a91dab5f0000LL), real(0x3c54ceff81a0000LL),-real(0x5d7cb98f1a50000LL), real(0x1f9a69370b20800LL),reale(4178932,0x89b50ac9b6cd7LL), // C4[5], coeff of eps^19, polynomial in n of order 7 real(0x737c719d74a11000LL),-real(0x33cb00709b02e000LL), real(0x64aa4f647e063000LL),-real(0x22d04f5347fb4000LL), real(0x244213a9e6215000LL),-real(0x2372b83384fba000LL), real(0x29c5a12d1767000LL),real(0xd64e2b028e9d00LL), reale(12536797,0x9d1f205d24685LL), // C4[5], coeff of eps^18, polynomial in n of order 8 real(0x4d6c482dac2a0000LL),-reale(2329,0xb1fe2723dc000LL), reale(2244,0xda129de1b8000LL),-real(0x25b9c94d1ec14000LL), real(0x5915813997350000LL),-real(0x2b18411354f8c000LL), real(0x1038d20e1fbe8000LL),-real(0x1a9977b2ea9c4000LL), real(0x7df995f732ef600LL),reale(12536797,0x9d1f205d24685LL), // C4[5], coeff of eps^17, polynomial in n of order 9 real(0x514388ef27d31000LL),-reale(6020,0x2be450c918000LL), real(0x6fa66bdc836df000LL),-real(0x67912be26fab2000LL), reale(2539,0xf65fb2006d000LL),-real(0x237e1033f4d8c000LL), real(0x3efb5ba75c79b000LL),-real(0x32b52fd83cbe6000LL), real(0x17d40e2c1a29000LL),real(0x7dfd16a9c2e300LL), reale(12536797,0x9d1f205d24685LL), // C4[5], coeff of eps^16, polynomial in n of order 10 reale(12470,0xf777d5cb70000LL),-reale(8994,0x34ff96fbd8000LL), real(0x8b5e07446e3LL<<18),-reale(5684,0xa351b76ba8000LL), reale(2676,0xe4b7624210000LL),-real(0x3b4e8fe27b2f8000LL), reale(2525,0xe113384060000LL),-real(0x317b33e66b8c8000LL), real(0x1afebbc488cb0000LL),-real(0x2abc78cdb6418000LL), real(0xab0b32cc6da3c00LL),reale(12536797,0x9d1f205d24685LL), // C4[5], coeff of eps^15, polynomial in n of order 11 reale(45753,0x27312c684b000LL),real(0x6b25908081df2000LL), reale(10080,0x3e3c4e94e9000LL),-reale(11483,0x3052990658000LL), real(0x186dcc47df2a7000LL),-reale(4654,0xe97b33c9a2000LL), reale(3765,0x192eb8a145000LL),-real(0x1ea7f016e242c000LL), real(0x7c08a9e80a083000LL),-real(0x48a61c5124e36000LL), -real(0x1ab8464a6fdf000LL),-real(0xc3b3128c53f500LL), reale(12536797,0x9d1f205d24685LL), // C4[5], coeff of eps^14, polynomial in n of order 12 -reale(29853,0xf97fbea090000LL),-reale(72661,0xb2e53c820c000LL), reale(55735,0xd505afdac8000LL),-real(0x19eb9cd373704000LL), reale(6447,8655275741LL<<17),-reale(13735,0x934f51ea3c000LL), real(0x503c7c1e17a78000LL),-reale(2910,0x8f0f066334000LL), reale(4611,0xa07ae6cfd0000LL),-real(0x28ec95124696c000LL), real(0x386dc5f3bf428000LL),-real(0x49a3cdb95c464000LL), real(0xec86977ad08e600LL),reale(12536797,0x9d1f205d24685LL), // C4[5], coeff of eps^13, polynomial in n of order 13 -reale(77964,0x27205a1bd000LL),reale(116550,0x911cc360c4000LL), -reale(45605,0xab8dec641b000LL),-reale(66195,0xc9de18da12000LL), reale(66624,0xae21593727000LL),-reale(5576,0x36f63ac28000LL), real(0x6f2264aae1649000LL),-reale(14832,0x2c940b773e000LL), reale(3661,0xe0e147ff8b000LL),-real(0x37687d20b9d14000LL), reale(4430,0xd2ef37d92d000LL),-real(0x61330ed553f6a000LL), -real(0x8fc7d2821691000LL),-real(0x4de8f81581e0b00LL), reale(12536797,0x9d1f205d24685LL), // C4[5], coeff of eps^12, polynomial in n of order 14 -real(0x520b481798460000LL),reale(18997,713316873LL<<16), -reale(73060,0xebcc7589c0000LL),reale(119587,0x641c11f8f0000LL), -reale(63450,0xfff4f2db20000LL),-reale(54596,0x54a14049b0000LL), reale(77203,5136366291LL<<19),-reale(15161,0x669695c550000LL), -reale(2898,7333080783LL<<17),-reale(13401,0xbb1dc317f0000LL), reale(7364,7522322675LL<<18),real(0xcbde6dd32070000LL), reale(2498,0xb270ac8f60000LL),-reale(2207,0xe5e147ba30000LL), real(0x146e5a4ec1af3800LL),reale(12536797,0x9d1f205d24685LL), // C4[5], coeff of eps^11, polynomial in n of order 15 -real(0x8e2d12e55cc800LL),-real(0x3c744345ee05000LL), -real(0x436e3347c2885800LL),reale(16354,0x603aee4aee000LL), -reale(66895,0x3561b9526e800LL),reale(120525,0x7fafccca1000LL), -reale(82888,0x6ce782c3a7800LL),-reale(36026,0xb730ca850c000LL), reale(84916,0xe33bbac3af800LL),-reale(30329,0x9a1820a639000LL), -reale(5003,0x6724146c89800LL),-reale(8175,0xa51f341306000LL), reale(10601,0xdf58b3eb8d800LL),-real(0x51534d8656793000LL), -real(0x13f74fe07242b800LL),-real(0x1338322158bf8680LL), reale(12536797,0x9d1f205d24685LL), // C4[5], coeff of eps^10, polynomial in n of order 16 -real(0x5e9d97de20000LL),-real(0x15f51b48a5a000LL), -real(0x679f3a6a83c000LL),-real(0x2da38dbb53ee000LL), -real(0x351287a208998000LL),reale(13549,0xfdc5cc829e000LL), -reale(59298,0x35ebc8a374000LL),reale(118312,0x8f7a13080a000LL), -reale(102644,0xbe9581710000LL),-reale(8663,0x3283e8b4ea000LL), reale(85056,0xa0c3d6fa54000LL),-reale(50541,0x58fecea57e000LL), real(0x9e0314066f78000LL),-real(0x56026edfbaf2000LL), reale(9162,0x6ada71271c000LL),-reale(4514,0x3f8f2be686000LL), real(0x19aa7dbc9bd2b100LL),reale(12536797,0x9d1f205d24685LL), // C4[5], coeff of eps^9, polynomial in n of order 17 -real(0x689b7f794800LL),-real(0x12aa316a68000LL), -real(0x3c5fe03b7b800LL),-real(0xe70662316b000LL), -real(0x468257445d2800LL),-real(0x204dea1c904e000LL), -real(0x275c24b79c179800LL),reale(10640,0x725f868a0f000LL), -reale(50163,0x8367062950800LL),reale(111598,0xa3db986ecc000LL), -reale(120105,0x1af4e4a837800LL),reale(28289,0xbddfd64f09000LL), reale(70122,0x41f96206f1800LL),-reale(70104,0xcd1cf1241a000LL), reale(17631,0x83f469b94a800LL),reale(3507,0xd4dd7e683000LL), real(0x234fa818af3f3800LL),-real(0x5217ce807fb7e980LL), reale(12536797,0x9d1f205d24685LL), // C4[5], coeff of eps^8, polynomial in n of order 18 -real(0x8baa3048000LL),-real(0x155e3991c000LL),-real(237891401LL<<18), -real(0xa66484064000LL),-real(0x22acb24838000LL), -real(0x89475b1e6c000LL),-real(0x2b8ce25f7b0000LL), -real(0x14dd31b8f8b4000LL),-real(0x1acbb07dd4628000LL), reale(7723,0xe6c1cd6b44000LL),-reale(39540,0xb1d09a9920000LL), reale(98832,0x70f12b47fc000LL),-reale(130553,0x474c4a5618000LL), reale(72091,0x9d4697d7f4000LL),reale(31173,0xcb977f1d70000LL), -reale(72484,0xa77099aa54000LL),reale(42073,0x76abc75bf8000LL), -reale(8983,0xdb34fa045c000LL),real(0x7851cafec6ea600LL), reale(12536797,0x9d1f205d24685LL), // C4[5], coeff of eps^7, polynomial in n of order 19 -real(808445556736LL),-real(0x19fd8659000LL),-real(0x3ce45316800LL), -real(0x98e89f08000LL),-real(0x1a16c5239800LL),-real(0x4ef4224b7000LL), -real(0x11089a8d8c800LL),-real(0x461e8219c6000LL), -real(0x1740d89936f800LL),-real(0xbb97ef56095000LL), -real(0xffd8608f0242800LL),reale(4956,0x2ae7ba647c000LL), -reale(27803,0x8886c0e865800LL),reale(78703,0x691d56f30d000LL), -reale(126581,0xb2ac252438800LL),reale(111405,0x65dae188be000LL), -reale(33040,0xc82f8ec41b800LL),-reale(31122,0xa51c18fcd1000LL), reale(33849,0xe315529991800LL),-reale(10096,0xcfcaaeb453f80LL), reale(12536797,0x9d1f205d24685LL), // C4[5], coeff of eps^6, polynomial in n of order 20 -real(57693732864LL),-real(118378242048LL),-real(254261280768LL), -real(575562375168LL),-real(10565709LL<<17),-real(0x341c17b2000LL), -real(0x92ee7ecc000LL),-real(0x1ccf17876000LL),-real(0x6786d9e38000LL), -real(0x1bdf19e19a000LL),-real(0x9bb8377424000LL), -real(0x5352681ef5e000LL),-real(0x79ce0dfd0cd0000LL), reale(2563,0x29027cc1fe000LL),-reale(15917,0xface8c747c000LL), reale(51375,0x61bf7d963a000LL),-reale(99436,0x390f87b768000LL), reale(119998,0xa6d5e6f116000LL),-reale(88555,0x279c7be1d4000LL), reale(36577,0x210e8c3652000LL),-reale(6477,0x332fe8d449300LL), reale(12536797,0x9d1f205d24685LL), // C4[5], coeff of eps^5, polynomial in n of order 21 -real(2537256960LL),-real(4922368000LL),-real(9913649152LL), -real(20825468928LL),-real(45893163008LL),-real(3260719LL<<15), -real(265153996800LL),-real(709434249216LL),-real(0x1e3bc54b800LL), -real(0x62f2289a000LL),-real(0x174e12bf8800LL),-real(0x69ee83c3b000LL), -real(0x2753bfa335800LL),-real(0x1693a2298bc000LL), -real(0x23ce232de3a2800LL),real(0x33ca29bdcdd43000LL), -reale(5754,0x693a6155df800LL),reale(21176,0x3b8f28c122000LL), -reale(47646,0x86021bb28c800LL),reale(67058,0x11f0010e41000LL), -reale(51817,0x997f46a249800LL),reale(16192,0xfff7c612b6f80LL), reale(12536797,0x9d1f205d24685LL), // C4[6], coeff of eps^26, polynomial in n of order 0 real(71266816),real(0x75209f8d91abLL), // C4[6], coeff of eps^25, polynomial in n of order 1 -real(61697<<14),real(365122560),real(0x64173937d043LL), // C4[6], coeff of eps^24, polynomial in n of order 2 -real(0x10389da9c000LL),real(0x19e75ef2000LL),real(558875851776LL), real(0xd767bab38dc330dLL), // C4[6], coeff of eps^23, polynomial in n of order 3 -real(0x142d81502c000LL),real(0x6dee9f4b8000LL),-real(0xae181cf64000LL), real(0x39153b46b400LL),reale(3342,0x41381bc9272f3LL), // C4[6], coeff of eps^22, polynomial in n of order 4 -real(0x13480fca8c000LL),real(0x16106a2c37000LL), -real(0x1502d2e846000LL),real(0x16180c1bd000LL),real(0x74238242a00LL), reale(3342,0x41381bc9272f3LL), // C4[6], coeff of eps^21, polynomial in n of order 5 -real(0x1c0b06f2aed0000LL),real(0x44926ab731c0000LL), -real(0x2031c71e85b0000LL),real(0xca25cdaf0e0000LL), -real(0x14c7d62b6490000LL),real(0x61052e04125000LL), reale(1139708,0xdfbd02f131dafLL), // C4[6], coeff of eps^20, polynomial in n of order 6 -real(0x3c147e5183b90000LL),real(0x5c8a793ab7a08000LL), -real(0xa71b84c4013LL<<17),real(0x26583d412b938000LL), -real(0x1ec1409e52930000LL),real(0xd82d55b5068000LL), real(0x4a1c5add9a3000LL),reale(14816215,0x5c99263f881e3LL), // C4[6], coeff of eps^19, polynomial in n of order 7 -reale(2884,0x97776797f0000LL),real(0x5dcb94a5bbaa0000LL), -real(0x2147754a866d0000LL),real(0x59b9e153ee1c0000LL), -real(0x1d3317b06cdb0000LL),real(0xfd67f86b28e0000LL), -real(0x193b89a255c90000LL),real(0x662541f54195000LL), reale(14816215,0x5c99263f881e3LL), // C4[6], coeff of eps^18, polynomial in n of order 8 -reale(5404,0x5e66e1f930000LL),real(0x194c5bcfa9f36000LL), -reale(2201,0x4f230944e4000LL),reale(2053,0x73a8845e02000LL), -real(0x127ebba7aac98000LL),real(0x433c97a5782ce000LL), -real(0x29997437ffc4c000LL),-real(0xb36408ece66000LL), -real(0x4eb946c9b6ac00LL),reale(14816215,0x5c99263f881e3LL), // C4[6], coeff of eps^17, polynomial in n of order 9 -reale(2829,0x5744c85a98000LL),real(0x53fda6bff9540000LL), -reale(5946,0xc179df32e8000LL),real(0x424987c8bd3f0000LL), -real(0x4d6fba1e72f38000LL),reale(2362,0x7a9b39aaa0000LL), -real(0x1a7dd6520d788000LL),real(0x1ca5a49549150000LL), -real(0x279b8ad82b3d8000LL),real(0x8624b660e613800LL), reale(14816215,0x5c99263f881e3LL), // C4[6], coeff of eps^16, polynomial in n of order 10 reale(3052,0x1cc54fce28000LL),reale(15175,0x33b0e2aba4000LL), -reale(5744,0xc5440d7e0000LL),-real(0xd3fdde9c4364000LL), -reale(5627,0x42b2a45de8000LL),reale(2296,0xc920e17994000LL), -real(0x15ef23de88bf0000LL),reale(2060,0x9b7c8a7a8c000LL), -real(0x3634e9b2229f8000LL),-real(0x3eaac877287c000LL), -real(0x1ee323a1ca0c800LL),reale(14816215,0x5c99263f881e3LL), // C4[6], coeff of eps^15, polynomial in n of order 11 -reale(77304,0xeb4d9089c8000LL),reale(21636,0x8867f71d90000LL), reale(6061,8670344157LL<<15),reale(12960,6074462725LL<<18), -reale(9403,0x25b985468000LL),-real(0x35c5d916ffb10000LL), -reale(4114,0x3d13bbebb8000LL),reale(3690,0x5a8c0420a0000LL), -real(0x7db1fc00af08000LL),real(0x3ee56918f4c50000LL), -real(0x41d90b24a2658000LL),real(0xb0f65a4ddefb800LL), reale(14816215,0x5c99263f881e3LL), // C4[6], coeff of eps^14, polynomial in n of order 12 reale(84445,0xef949ea0f8000LL),reale(19627,0xf0e541fbce000LL), -reale(80833,0x5f741237dc000LL),reale(34575,0x1644d05d7a000LL), reale(6828,0x4cfbe5cb50000LL),reale(8288,0x561945cd26000LL), -reale(12838,0x6d3e328184000LL),real(0x15c5608ef0ed2000LL), -real(0x653ba29de4a58000LL),reale(4217,0x4b5d86267e000LL), -real(0x3b46409683b2c000LL),-real(0x974d654f27d6000LL), -real(0x674dea252558c00LL),reale(14816215,0x5c99263f881e3LL), // C4[6], coeff of eps^13, polynomial in n of order 13 reale(45373,0x376f121df0000LL),-reale(98871,0xe30dbcdfc0000LL), reale(96522,0x4174515a90000LL),-real(0x2d5b0f36d6d20000LL), -reale(79483,0x53270530d0000LL),reale(50297,8337588523LL<<19), reale(3071,0x5d816f2bd0000LL),real(0x5cfb30543d820000LL), -reale(14132,0x4c1b1cdf90000LL),reale(3907,0xfc9bf30ac0000LL), real(0x1e5e0fff75d10000LL),reale(2700,0x7f35ecdd60000LL), -real(0x74992b46f6e50000LL),real(0xe2f417f6bbc1000LL), reale(14816215,0x5c99263f881e3LL), // C4[6], coeff of eps^12, polynomial in n of order 14 real(0x1b3ddeae39bf0000LL),-reale(7839,0x62697a1358000LL), reale(39400,0x7dae3b2360000LL),-reale(93477,0x2dd7a51de8000LL), reale(106917,0x5f76290ad0000LL),-reale(25706,0x4975ab7078000LL), -reale(70221,0xf8d5dabdc0000LL),reale(66679,0x434a03a4f8000LL), -reale(7926,0xc17b4a4650000LL),-reale(5104,0x4c6b9c2d98000LL), -reale(10825,0x972fc79ee0000LL),reale(8339,0xae0935c7d8000LL), -real(0xb5e35652d770000LL),-real(0xb97cf166cab8000LL), -real(0x1484ac4370939000LL),reale(14816215,0x5c99263f881e3LL), // C4[6], coeff of eps^11, polynomial in n of order 15 real(0x1da928c9710000LL),real(0xef3463c3520000LL), real(0x1433e03669f30000LL),-reale(6121,0xc895edf4c0000LL), reale(32842,0x2af7b46f50000LL),-reale(85281,0xda67593ea0000LL), reale(113905,0x4294ec3770000LL),-reale(54341,1789231857LL<<19), -reale(49473,0x80d6dfd870000LL),reale(78594,0x71ba158da0000LL), -reale(27684,0xd5e2e99050000LL),-reale(5831,3589595121LL<<18), -reale(2437,0x3d76dec030000LL),reale(8713,0x93ccba19e0000LL), -reale(3467,0xfccc93810000LL),real(0xf2bb44edf33d000LL), reale(14816215,0x5c99263f881e3LL), // C4[6], coeff of eps^10, polynomial in n of order 16 real(0xcab3dac70000LL),real(0x3665759289000LL),real(0x12ce11eabe2000LL), real(0x9df70180dbb000LL),real(0xdfd754eb8954000LL), -reale(4487,0x5dd2369613000LL),reale(25849,0xff24cd52c6000LL), -reale(73908,0x17b3db62e1000LL),reale(115119,0x8d3c9a9638000LL), -reale(83691,0x41fe3e02af000LL),-reale(14375,0xada6f2de56000LL), reale(76590,0xeb60670083000LL),-reale(52128,0x9a91d83ce4000LL), reale(7010,0x5a128dfcb5000LL),reale(3866,0xf6d75c088e000LL), real(0x469f50315e7e7000LL),-real(0x4bbe9f188165a200LL), reale(14816215,0x5c99263f881e3LL), // C4[6], coeff of eps^9, polynomial in n of order 17 real(0x8ddfb274000LL),real(120826333LL<<18),real(0x6b145a40c000LL), real(0x1dc5136a58000LL),real(0xab5ca60ba4000LL),real(0x5e28748a970000LL), real(0x8cad0403953c000LL),-reale(3003,0xaeb1521f78000LL), reale(18707,0x350991ecd4000LL),-reale(59284,0x6845654460000LL), reale(107702,0xd776bbe6c000LL),-reale(107579,0xe340531948000LL), reale(33813,0xa464b8b604000LL),reale(48035,0x81a4fa0dd0000LL), -reale(64047,0xa4265c8064000LL),reale(31225,0xe027c1dce8000LL), -reale(5635,0xd5d68038cc000LL),-real(0x50368754849c400LL), reale(14816215,0x5c99263f881e3LL), // C4[6], coeff of eps^8, polynomial in n of order 18 real(490704814080LL),real(0x13aa0f5a000LL),real(31022013LL<<17), real(0xc68497e6000LL),real(0x2fcbb8aac000LL),real(0xdd4302e72000LL), real(0x534405e9b8000LL),real(0x30298b6eefe000LL), real(0x4c5dcf34c0c4000LL),-real(0x6d574da684a76000LL), reale(11873,5016286141LL<<16),-reale(42009,0x509c0961ea000LL), reale(89073,0x6259ee06dc000LL),-reale(115683,0xae64a27b5e000LL), reale(82889,0x8f2a67cde8000LL),-reale(11935,0xb1dc537ad2000LL), -reale(33312,0xcf05a2430c000LL),reale(28876,0xae4eda7bba000LL), -reale(8101,0x83645851a5400LL),reale(14816215,0x5c99263f881e3LL), // C4[6], coeff of eps^7, polynomial in n of order 19 real(7458340864LL),real(560703LL<<15),real(48303816704LL), real(522951LL<<18),real(426386014208LL),real(45283889LL<<15), real(0x56a252ac000LL),real(440127317LL<<16),real(0xa648bd1f4000LL), real(0x65fb114118000LL),real(0xacffeca0b3c000LL), -real(0x860da206139LL<<17),real(0x7d0a1c0732284000LL), -reale(7961,0x1b3e7a1f58000LL),reale(19682,0xa4af1c3bcc000LL), -reale(31917,0xccc8ef8390000LL),reale(34094,0x3798b7b14000LL), -reale(23101,0x583f152fc8000LL),reale(8983,0xdb34fa045c000LL), -real(0x5f40c0b45d798c00LL),reale(4938738,0x74330cbfd80a1LL), // C4[6], coeff of eps^6, polynomial in n of order 20 real(651542528),real(1480134656),real(3538968576LL),real(8971595776LL), real(371371LL<<16),real(71493373952LL),real(230978592768LL), real(838422294528LL),real(0x334e2804000LL),real(0x106060339000LL), real(0x6e2b415ae000LL),real(0x484c62e3a3000LL),real(0x848c0aa1558000LL), -real(0xe0b56a0582f3000LL),real(0x745df25523d02000LL), -reale(8378,0x6c27f21289000LL),reale(23938,0x5996b3a2ac000LL), -reale(45881,0xd660d84d1f000LL),reale(58395,0x10d8591c56000LL), -reale(42673,0x513ba394b5000LL),reale(12954,0x665fd1a892600LL), reale(14816215,0x5c99263f881e3LL), // C4[7], coeff of eps^26, polynomial in n of order 0 real(9763<<15),real(0x75209f8d91abLL), // C4[7], coeff of eps^25, polynomial in n of order 1 real(239317LL<<16),real(5250319360LL),real(0x4082f7e0f93b2fLL), // C4[7], coeff of eps^24, polynomial in n of order 2 real(179518703LL<<19),-real(591371495LL<<18),real(0x28b139bd9800LL), reale(3231,0x13f0854e6fdc3LL), // C4[7], coeff of eps^23, polynomial in n of order 3 real(0x2cef3d4baf0000LL),-real(77130417375LL<<17),real(0xef66e7c50000LL), real(0x5431e6572400LL),reale(119549,0xe1c344562ad2fLL), // C4[7], coeff of eps^22, polynomial in n of order 4 real(217227301LL<<22),-real(289844049LL<<20),real(78161061LL<<21), -real(250072603LL<<20),real(0x3ccfc393c000LL), reale(3856,0x72a333c0b70f1LL), // C4[7], coeff of eps^21, polynomial in n of order 5 real(0x4e0ae513ee240000LL),-real(827903427791LL<<20), real(0xa247f543e5fLL<<18),-real(0x3412b66b53fLL<<19), -real(88149449003LL<<18),-real(0x22c21c78f4d000LL), reale(17095633,0x1c132c21ebd41LL), // C4[7], coeff of eps^20, polynomial in n of order 6 real(0x17d653fb3b3LL<<21),-real(0x28623ac8329LL<<20), real(0x157258d15a9LL<<22),-real(0x11bb996f2dfLL<<20), real(568501848145LL<<21),-real(0x17b5bd88f85LL<<20), real(0x53401a2130be000LL),reale(17095633,0x1c132c21ebd41LL), // C4[7], coeff of eps^19, polynomial in n of order 7 -real(0x83a0cdc49940000LL),-reale(2692,4590415189LL<<19), real(0x5a9e6c539a840000LL),-real(834402440151LL<<20), real(0x4606e5f7741c0000LL),-real(0x420b2360847LL<<19), -real(530800397043LL<<18),-real(0xe57fab5d571000LL), reale(17095633,0x1c132c21ebd41LL), // C4[7], coeff of eps^18, polynomial in n of order 8 reale(3472,126556531LL<<23),-reale(5076,3517313787LL<<20), -real(76794078375LL<<21),-real(0x6a9c1a13021LL<<20), reale(2051,1043338611LL<<22),-real(704701202247LL<<20), real(0xfa27346673LL<<21),-real(0x245598aac6dLL<<20), real(0x69deaea556c4000LL),reale(17095633,0x1c132c21ebd41LL), // C4[7], coeff of eps^17, polynomial in n of order 9 reale(15000,0xe6601a91a0000LL),-real(0x261369ca72fLL<<20), real(0x42e9870754860000LL),-reale(5748,0xcbf4457740000LL), real(0x3d07c1e90b320000LL),-real(0x3f02d96efefLL<<19), real(0x7fb986a3c79e0000LL),-real(0x995e2453d1fLL<<18), -real(0x4ae4d5f0bb60000LL),-real(0x2b86668e596d800LL), reale(17095633,0x1c132c21ebd41LL), // C4[7], coeff of eps^16, polynomial in n of order 10 -real(0x73f9d78b0d9LL<<20),real(0x9cf538ea065LL<<19), reale(15740,149203411LL<<22),-reale(4248,1728572757LL<<19), -real(0x407b444d4cfLL<<20),-reale(4968,2121468799LL<<19), reale(2638,499248115LL<<21),real(0x88c04a730380000LL), real(0x44a3b895a7bLL<<20),-real(0x74a26c7b8a3LL<<19), real(0x855f1c455087000LL),reale(17095633,0x1c132c21ebd41LL), // C4[7], coeff of eps^15, polynomial in n of order 11 reale(61154,0xdd701642e0000LL),-reale(66911,9396541691LL<<18), reale(7800,0xcd3506c5a0000LL),reale(6879,1489841009LL<<20), reale(13340,0xebc72e5460000LL),-reale(8995,2037240317LL<<18), -real(0x58226c8c268e0000LL),-reale(2527,381291855LL<<19), reale(3789,0xabee5235e0000LL),-real(0x7b29f7fc67fLL<<18), -real(0x7ff214bf2760000LL),-real(0x75bce0e31735800LL), reale(17095633,0x1c132c21ebd41LL), // C4[7], coeff of eps^14, polynomial in n of order 12 -reale(101656,596927171LL<<22),reale(53043,574431381LL<<20), reale(45405,240861115LL<<21),-reale(76255,2673908009LL<<20), reale(23050,192030143LL<<23),reale(9407,3846737689LL<<20), reale(7022,1974859325LL<<21),-reale(12738,252856997LL<<20), real(0x137e788e9bfLL<<22),real(0x118e235259dLL<<20), reale(2782,635761855LL<<21),-real(0x61e77094421LL<<20), real(0x9e768b34c754000LL),reale(17095633,0x1c132c21ebd41LL), // C4[7], coeff of eps^13, polynomial in n of order 13 -reale(21345,0xc6c0a8cac0000LL),reale(63537,3528773151LL<<20), -reale(101990,1331648317LL<<18),reale(73206,6215106713LL<<19), reale(21832,587136209LL<<18),-reale(78785,930736779LL<<21), reale(42984,0xe415720fc0000LL),reale(4706,912279695LL<<19), -real(0x6fb64418f6cc0000LL),-reale(11952,1697246539LL<<20), reale(6137,3764705851LL<<18),real(0x39d9405b105LL<<19), -real(779141568695LL<<18),-real(0x14a7906c9982d000LL), reale(17095633,0x1c132c21ebd41LL), // C4[7], coeff of eps^12, polynomial in n of order 14 -real(254469508501LL<<21),reale(2615,141135587LL<<20), -reale(16754,480949921LL<<22),reale(54113,1487459045LL<<20), -reale(98062,1801972559LL<<21),reale(91200,2801526327LL<<20), -reale(9603,108846763LL<<23),-reale(69011,498726663LL<<20), reale(62980,2002280887LL<<21),-reale(11145,4221789365LL<<20), -reale(7195,1009585291LL<<22),-reale(4457,3739558579LL<<20), reale(7974,18407933LL<<21),-reale(2668,664195297LL<<20), real(0x8b8039451326000LL),reale(17095633,0x1c132c21ebd41LL), // C4[7], coeff of eps^11, polynomial in n of order 15 -real(5353180065LL<<18),-real(25442595013LL<<19), -real(0x4cec268118c0000LL),real(0x702c4e5b497LL<<20), -reale(12304,5733646405LL<<18),reale(43346,2744696673LL<<19), -reale(88871,6285139975LL<<18),reale(103468,468195229LL<<21), -reale(46365,0xbad7731a40000LL),-reale(41349,1257587961LL<<19), reale(72365,0x9597fe7540000LL),-reale(36580,2571848483LL<<20), real(0xc0cfef1c9f3LL<<18),reale(3419,2944620333LL<<19), real(0x5d00262e0cc40000LL),-real(0x44e0e913b4a79000LL), reale(17095633,0x1c132c21ebd41LL), // C4[7], coeff of eps^10, polynomial in n of order 16 -real(1386231LL<<24),-real(109742265LL<<20),-real(354075457LL<<21), -real(7044729419LL<<20),-real(48190848741LL<<22), real(0x4592e53c723LL<<20),-reale(8214,1225367123LL<<21), reale(31749,3931639185LL<<20),-reale(73861,194985719LL<<23), reale(105371,3738827519LL<<20),-reale(81325,759307621LL<<21), reale(5533,2607378797LL<<20),reale(54935,128097033LL<<22), -reale(54849,213867813LL<<20),reale(23331,2117756809LL<<21), -reale(3571,955076279LL<<20),-real(0xa766ab1fb094000LL), reale(17095633,0x1c132c21ebd41LL), // C4[7], coeff of eps^9, polynomial in n of order 17 -real(9271959LL<<16),-real(2137131LL<<20),-real(0x8adb5490000LL), -real(374926717LL<<17),-real(5060508635LL<<16),-real(0xc549443040000LL), -real(0x1658a10fa0d0000LL),real(0x250f39cc17720000LL), -reale(4742,48259999LL<<16),reale(20239,6692003029LL<<19), -reale(53602,0x26a4a24510000LL),reale(92339,8168900207LL<<17), -reale(101236,0x6fb3cfe30000LL),reale(59785,2334542613LL<<18), real(0x5c1211516deb0000LL),-reale(32944,0x86c05c8b60000LL), reale(24775,0x5aee521590000LL),-reale(6657,0xade066fea8c00LL), reale(17095633,0x1c132c21ebd41LL), // C4[7], coeff of eps^8, polynomial in n of order 18 -real(31473LL<<19),-real(194623LL<<18),-real(41393LL<<22), -real(2533665LL<<18),-real(5617311LL<<19),-real(60523827LL<<18), -real(107394483LL<<20),-real(4758923477LL<<18),-real(73625727245LL<<19), real(0xf5289483e640000LL),-reale(2141,878914353LL<<21), reale(10163,0xf2a381edc0000LL),-reale(30731,8395289531LL<<19), reale(63101,0xdb7b98c940000LL),-reale(89756,3102076305LL<<20), reale(87316,6648120707LL<<18),-reale(55353,8132528169LL<<19), reale(20534,9081852529LL<<18),-reale(3368,0xf233ddc1a2800LL), reale(17095633,0x1c132c21ebd41LL), // C4[7], coeff of eps^7, polynomial in n of order 19 -real(4693<<16),-real(6435<<17),-real(37895LL<<16),-real(7579LL<<20), -real(428505LL<<16),-real(854413LL<<17),-real(7933835LL<<16), -real(11246865LL<<18),-real(338155741LL<<16),-real(0xee3402ee0000LL), -real(0x1efc2a618f0000LL),real(517531990885LL<<19), -real(0x243e4ae81d610000LL),reale(3081,0xb7f72703e0000LL), -reale(10639,0x4442fa8130000LL),reale(25534,4122358181LL<<18), -reale(43524,0x45cc2f5650000LL),reale(51336,0x52534b86a0000LL), -reale(35935,0x6cd3e81170000LL),reale(10668,0x544ee8e52d400LL), reale(17095633,0x1c132c21ebd41LL), // C4[8], coeff of eps^26, polynomial in n of order 0 real(1703<<17),real(0x7c72a9866ac5bLL), // C4[8], coeff of eps^25, polynomial in n of order 1 -real(177229LL<<20),real(727155LL<<16),real(0x491cf6cbc520f1LL), // C4[8], coeff of eps^24, polynomial in n of order 2 -real(9929683361LL<<18),-real(175790329LL<<17),-real(0x88fc23ec000LL), reale(40280,0xc561288d94a7fLL), // C4[8], coeff of eps^23, polynomial in n of order 3 -real(11862711753LL<<19),real(5010641713LL<<20),-real(14709027619LL<<19), real(0x62bf29e3e8000LL),reale(135489,0xddbb2b5096ef1LL), // C4[8], coeff of eps^22, polynomial in n of order 4 -real(6145646087LL<<23),real(131879372361LL<<21), -real(33613471903LL<<22),-real(3256336589LL<<21), -real(0xacc29a2990000LL),reale(1761368,0x42813317aa23dLL), // C4[8], coeff of eps^21, polynomial in n of order 5 -real(0x6a942373c4bLL<<19),real(0x26ec3bfe245LL<<21), -real(0x8f791d3a3680000LL),real(0x11c215e6335LL<<20), -real(0x2c38227cc2fLL<<19),real(0x4429220c0f48000LL), reale(19375050,0xdb8d32044f89fLL), // C4[8], coeff of eps^20, polynomial in n of order 6 -reale(2934,444315969LL<<20),real(0x6a3b64139b1LL<<19), -real(467101336651LL<<21),real(0x8d6914ca9b7LL<<19), -real(0x1951684536bLL<<20),-real(344981960323LL<<19), -real(0x1536c8746170000LL),reale(19375050,0xdb8d32044f89fLL), // C4[8], coeff of eps^19, polynomial in n of order 7 -reale(3511,3705843547LL<<19),-real(0x204aea957e3LL<<20), -reale(2145,1225061153LL<<19),real(0x33d58e2ac0fLL<<21), -real(10655273223LL<<19),real(0x21f191654dfLL<<20), -real(0x4229ae891cdLL<<19),real(0x53ff9bb26958000LL), reale(19375050,0xdb8d32044f89fLL), // C4[8], coeff of eps^18, polynomial in n of order 8 reale(2327,223378273LL<<24),reale(3002,681494021LL<<21), -reale(5098,180818405LL<<22),-real(5074441169LL<<21), -real(428729715071LL<<23),real(0x3cce86cb309LL<<21), -real(434398966071LL<<22),-real(156882519885LL<<21), -real(0x33e11620e250000LL),reale(19375050,0xdb8d32044f89fLL), // C4[8], coeff of eps^17, polynomial in n of order 9 -reale(6703,1474120015LL<<19),reale(14458,426935549LL<<22), -real(511886207649LL<<19),-real(39076914681LL<<20), -reale(5282,7254660115LL<<19),real(0x33346658ebdLL<<21), real(0xd2bcdb640d80000LL),real(0x48aecde6f2dLL<<20), -real(0x66a76bcf857LL<<19),real(0x650db91f67c8000LL), reale(19375050,0xdb8d32044f89fLL), // C4[8], coeff of eps^16, polynomial in n of order 10 -reale(41674,2212282947LL<<19),-reale(7593,6666692295LL<<18), real(0x22d5b967639LL<<21),reale(15266,7870015191LL<<18), -reale(4856,4082442485LL<<19),-real(0x76ec691ccd2c0000LL), -reale(3302,2416313159LL<<20),reale(3252,0xd63fbdd4c0000LL), -real(0xa56dc66b5380000LL),-real(0x5b75ff5133c0000LL), -real(0x7d0ead839928000LL),reale(19375050,0xdb8d32044f89fLL), // C4[8], coeff of eps^15, polynomial in n of order 11 reale(6774,8529353663LL<<19),reale(68916,757502869LL<<20), -reale(58358,4821135835LL<<19),reale(3030,627685345LL<<22), reale(8321,1974413611LL<<19),reale(11199,994841075LL<<20), -reale(10210,402696815LL<<19),-real(0x10cbfe9c35fLL<<21), -real(0x88d945e9f480000LL),reale(2764,2004030417LL<<20), -real(0xa3f22386a83LL<<19),real(0x6eb0baaefa68000LL), reale(19375050,0xdb8d32044f89fLL), // C4[8], coeff of eps^14, polynomial in n of order 12 reale(80789,157273055LL<<23),-reale(92413,883895019LL<<21), reale(33037,752031121LL<<22),reale(52633,1725093895LL<<21), -reale(71257,198988971LL<<24),reale(21774,462183721LL<<21), reale(9867,923099607LL<<22),reale(2235,815700763LL<<21), -reale(11863,140786955LL<<23),reale(4226,1910142077LL<<21), real(854212143197LL<<22),real(169477509103LL<<21), -real(0x1429c96cdeb90000LL),reale(19375050,0xdb8d32044f89fLL), // C4[8], coeff of eps^13, polynomial in n of order 13 reale(7986,2577537059LL<<19),-reale(31049,1388317679LL<<21), reale(71398,6484881669LL<<19),-reale(96607,3840488041LL<<20), reale(60036,7375804551LL<<19),reale(24533,301249307LL<<22), -reale(73258,7729848599LL<<19),reale(45499,3314021057LL<<20), -real(0x3ea6bf07b95LL<<19),-reale(6268,968456357LL<<21), -reale(5889,8030103219LL<<19),reale(7129,2010513003LL<<20), -reale(2060,6603694641LL<<19),real(0x4aa8326c4b38000LL), reale(19375050,0xdb8d32044f89fLL), // C4[8], coeff of eps^12, polynomial in n of order 14 real(110457315575LL<<20),-real(0x55e7441aebbLL<<19), reale(5489,1587292819LL<<21),-reale(23107,1250112621LL<<19), reale(59020,876513493LL<<20),-reale(93669,6579434335LL<<19), reale(83160,151752881LL<<22),-reale(14191,6428793873LL<<19), -reale(55802,147123789LL<<20),reale(63340,7698024701LL<<19), -reale(24299,306146767LL<<21),-reale(2685,2028352693LL<<19), reale(2706,1245782417LL<<20),real(0xd3e9bdc0259LL<<19), -real(0x3e4f75bd92cb0000LL),reale(19375050,0xdb8d32044f89fLL), // C4[8], coeff of eps^11, polynomial in n of order 15 real(349722603LL<<19),real(1945948591LL<<20),real(0xe000999c080000LL), -real(852080688837LL<<21),reale(3397,2932652343LL<<19), -reale(15561,3567671555LL<<20),reale(44311,3271472077LL<<19), -reale(82040,520836183LL<<22),reale(95750,3608174083LL<<19), -reale(56326,3054118709LL<<20),-reale(14075,6930316647LL<<19), reale(56094,1163367017LL<<21),-reale(46280,7703552945LL<<19), reale(17576,4216930841LL<<20),-reale(2261,6650055195LL<<19), -real(0xc8e19a260718000LL),reale(19375050,0xdb8d32044f89fLL), // C4[8], coeff of eps^10, polynomial in n of order 16 real(53199LL<<25),real(4832235LL<<21),real(18086833LL<<22), real(422991569LL<<21),real(3456128781LL<<23),-real(417864400569LL<<21), real(0x1c1175e6463LL<<22),-reale(9006,876789843LL<<21), reale(28706,92601679LL<<24),-reale(61776,681174429LL<<21), reale(90600,218403669LL<<22),-reale(86125,255162935LL<<21), reale(41671,220860591LL<<23),reale(9900,1945963071LL<<21), -reale(31426,812677625LL<<22),reale(21427,717745189LL<<21), -reale(5580,0x8f2cafdf0000LL),reale(19375050,0xdb8d32044f89fLL), // C4[8], coeff of eps^9, polynomial in n of order 17 real(47583LL<<19),real(12411LL<<23),real(964865LL<<19), real(2862477LL<<20),real(45013059LL<<19),real(139025201LL<<21), real(19339324389LL<<19),-real(313753792905LL<<20), real(0x5b827ae7827LL<<19),-reale(4043,135949957LL<<22), reale(14485,4274671945LL<<19),-reale(36111,1380328223LL<<20), reale(64526,2642754443LL<<19),-reale(82901,1325528645LL<<21), reale(74876,5403462445LL<<19),-reale(44997,1726039605LL<<20), reale(16070,4300719215LL<<19),-reale(2566,0xd0ea909388000LL), reale(19375050,0xdb8d32044f89fLL), // C4[8], coeff of eps^8, polynomial in n of order 18 real(1053<<18),real(7293<<17),real(1749LL<<21),real(121635LL<<17), real(309043LL<<18),real(3853577LL<<17),real(8003583LL<<19), real(420632751LL<<17),real(7839064905LL<<18),-real(550302356331LL<<17), real(754118043861LL<<20),-real(0x433703efa18a0000LL), reale(4345,0xa637f297c0000LL),-reale(12473,0x9f7aaa1be0000LL), reale(26308,41230677LL<<19),-reale(40979,0xc6d64da720000LL), reale(45533,1464249973LL<<18),-reale(30801,0xcafec6ea60000LL), reale(8983,0xdb34fa045c000LL),reale(19375050,0xdb8d32044f89fLL), // C4[9], coeff of eps^26, polynomial in n of order 0 real(3679<<17),real(0xf744df0e6c69LL), // C4[9], coeff of eps^25, polynomial in n of order 1 -real(48841LL<<20),-real(336765LL<<16),real(0x19892cc90d5217fLL), // C4[9], coeff of eps^24, polynomial in n of order 2 real(24659297LL<<26),-real(64440233LL<<25),real(414215087LL<<20), reale(45019,0xaf6c96bc5ad9dLL), // C4[9], coeff of eps^23, polynomial in n of order 3 real(0x55f7a92f661LL<<19),-real(0x115bb8ed6d9LL<<20), -real(198450589909LL<<19),-real(0xb7278b5afc8000LL), reale(21654468,0x9b0737e6b33fdLL), // C4[9], coeff of eps^22, polynomial in n of order 4 real(52440485279LL<<23),-real(8663417169LL<<21),real(29836121623LL<<22), -real(64017745099LL<<21),real(0x517eabcb370000LL), reale(1968588,0xe17edcf27917LL), // C4[9], coeff of eps^21, polynomial in n of order 5 real(0x29ddd14eea5LL<<19),-real(683397694747LL<<21), real(0x8a9d0ded323LL<<19),-real(0x12a27ad79ebLL<<20), -real(365440747903LL<<19),-real(0x1a278f54ba58000LL), reale(21654468,0x9b0737e6b33fdLL), // C4[9], coeff of eps^20, polynomial in n of order 6 -real(258517517319LL<<23),-reale(2449,779805879LL<<22), real(333316352075LL<<24),real(89662817151LL<<22), real(311028248083LL<<23),-real(514657501435LL<<22), real(0x42edd4687ca0000LL),reale(21654468,0x9b0737e6b33fdLL), // C4[9], coeff of eps^19, polynomial in n of order 7 reale(4708,5969586757LL<<19),-reale(3967,769306643LL<<20), -real(0x4aa5ebcacc1LL<<19),-real(0x2338c762cc1LL<<21), real(0xdfce640f299LL<<19),-real(0xee4b32a131LL<<20), -real(544152989037LL<<19),-real(0x392f1a561e88000LL), reale(21654468,0x9b0737e6b33fdLL), // C4[9], coeff of eps^18, polynomial in n of order 8 reale(10651,141986579LL<<24),reale(2483,579021431LL<<21), real(0x171656e9461LL<<22),-reale(5106,1475723195LL<<21), real(424307179891LL<<23),real(353847768099LL<<21), real(0x12b721ceb0bLL<<22),-real(0x16800175f8fLL<<21), real(0x4cd03e8801b0000LL),reale(21654468,0x9b0737e6b33fdLL), // C4[9], coeff of eps^17, polynomial in n of order 9 -reale(12598,568269079LL<<19),-reale(5705,584195995LL<<22), reale(14434,7986153127LL<<19),-real(0x53c43a7b401LL<<20), -real(0xc35a517653bLL<<19),-reale(3831,956767451LL<<21), reale(2686,1674924547LL<<19),real(257168565717LL<<20), -real(441477690591LL<<19),-real(0x7fc3df35f858000LL), reale(21654468,0x9b0737e6b33fdLL), // C4[9], coeff of eps^16, polynomial in n of order 10 reale(73082,82142393LL<<24),-reale(36372,269994261LL<<23), -reale(8446,14363443LL<<26),reale(3801,517661957LL<<23), reale(13381,17268719LL<<24),-reale(7345,464489969LL<<23), -real(211182139987LL<<25),-real(326075858199LL<<23), reale(2675,147207653LL<<24),-real(589098042253LL<<23), real(0x4cdddf4aa2c0000LL),reale(21654468,0x9b0737e6b33fdLL), // C4[9], coeff of eps^15, polynomial in n of order 11 -reale(70228,3204573753LL<<19),-reale(3665,997072835LL<<20), reale(67162,8124243837LL<<19),-reale(56077,490889175LL<<22), reale(5918,7641432915LL<<19),reale(10294,3043462539LL<<20), reale(5723,2367840009LL<<19),-reale(10993,938348055LL<<21), reale(2675,6462906463LL<<19),real(0x3a39e82b059LL<<20), real(0xb502c3128a80000LL),-real(0x1358f80d9c038000LL), reale(21654468,0x9b0737e6b33fdLL), // C4[9], coeff of eps^14, polynomial in n of order 12 -reale(45939,459571779LL<<23),reale(81202,1438384695LL<<21), -reale(84011,799287213LL<<22),reale(28155,23125821LL<<21), reale(46736,266493023LL<<24),-reale(68202,2086496557LL<<21), reale(29667,382040805LL<<22),reale(5608,647828697LL<<21), -reale(4401,355658689LL<<23),-reale(6763,1986460369LL<<21), reale(6284,996052535LL<<22),-real(0x31efd65ac4bLL<<21), real(0x21519ecdd470000LL),reale(21654468,0x9b0737e6b33fdLL), // C4[9], coeff of eps^13, polynomial in n of order 13 -reale(2321,7142809405LL<<19),reale(11407,565078561LL<<21), -reale(34996,6437021595LL<<19),reale(70236,3027507143LL<<20), -reale(89750,2730116057LL<<19),reale(59647,532152523LL<<22), reale(10736,8218389321LL<<19),-reale(61423,3588044783LL<<20), reale(52845,5572842763LL<<19),-reale(15060,1433211893LL<<21), -reale(4428,664807251LL<<19),real(0x7ac3d0f14dbLL<<20), real(0xe0ec3bda56fLL<<19),-real(0x3854598234228000LL), reale(21654468,0x9b0737e6b33fdLL), // C4[9], coeff of eps^12, polynomial in n of order 14 -real(2301546703LL<<23),real(147057720589LL<<22), -real(359161692259LL<<24),reale(7105,778398699LL<<22), -reale(23999,359671965LL<<23),reale(54661,162239065LL<<22), -reale(84322,1670081LL<<25),reale(82245,254480119LL<<22), -reale(34604,180181675LL<<23),-reale(26937,29999003LL<<22), reale(54122,167282399LL<<24),-reale(38795,392755901LL<<22), reale(13349,275194759LL<<23),-real(0x161047343cfLL<<22), -real(0xd052410afde0000LL),reale(21654468,0x9b0737e6b33fdLL), // C4[9], coeff of eps^11, polynomial in n of order 15 -real(33392709LL<<19),-real(215980657LL<<20),-real(15729792143LL<<19), real(133575397083LL<<21),-real(0x5183d845f39LL<<19), reale(3762,3694580381LL<<20),-reale(14049,8382023811LL<<19), reale(36325,545288329LL<<22),-reale(66629,6532309165LL<<19), reale(85703,4252949035LL<<20),-reale(71810,6020466679LL<<19), reale(27704,1818174537LL<<21),reale(15098,409579871LL<<19), -reale(29448,934474951LL<<20),reale(18689,3410848533LL<<19), -reale(4754,0x309583fd38000LL),reale(21654468,0x9b0737e6b33fdLL), // C4[9], coeff of eps^10, polynomial in n of order 16 -real(893LL<<25),-real(92625LL<<21),-real(399779LL<<22), -real(10904803LL<<21),-real(105333207LL<<23),real(15302554267LL<<21), -real(86594321625LL<<22),real(0xfe4052cb09LL<<21), -reale(2108,118544893LL<<24),reale(6191,505418439LL<<21), -reale(13344,231933903LL<<22),reale(21384,2064906293LL<<21), -reale(25319,426528669LL<<23),reale(21525,1826875827LL<<21), -reale(12380,255070469LL<<22),reale(4285,1002542497LL<<21), -real(0x29d9aac7ec250000LL),reale(7218156,0x33ad12a23bbffLL), // C4[9], coeff of eps^9, polynomial in n of order 17 -real(969<<19),-real(285LL<<23),-real(25175LL<<19),-real(85595LL<<20), -real(1557829LL<<19),-real(5632151LL<<21),-real(929304915LL<<19), real(18163686975LL<<20),-real(446826699585LL<<19), real(387249806307LL<<22),-real(0xd080dd307cfLL<<19), reale(5560,386556505LL<<20),-reale(13900,1932782525LL<<19), reale(26517,756597539LL<<21),-reale(38450,1381788619LL<<19), reale(40711,4015921907LL<<20),-reale(26784,1441242297LL<<19), reale(7700,0x72bfb1ba98000LL),reale(21654468,0x9b0737e6b33fdLL), // C4[10], coeff of eps^26, polynomial in n of order 0 -real(5057<<18),real(0x10edb70f760db7LL), // C4[10], coeff of eps^25, polynomial in n of order 1 -real(4901LL<<25),real(14157LL<<21),real(0x4082f7e0f93b2fLL), // C4[10], coeff of eps^24, polynomial in n of order 2 -real(8688787LL<<25),-real(2064227LL<<24),-real(9250461LL<<21), reale(7108,0x5f112546294adLL), // C4[10], coeff of eps^23, polynomial in n of order 3 real(363248763LL<<25),real(3123548769LL<<26),-real(5801671447LL<<25), real(14176223919LL<<21),reale(3419126,0x9f3708d39590dLL), // C4[10], coeff of eps^22, polynomial in n of order 4 -real(490568702783LL<<22),real(0x422ec2346b3LL<<20), -real(446296001151LL<<21),-real(174052882927LL<<20), -real(0xed1818f25bLL<<17),reale(23933886,0x5a813dc916f5bLL), // C4[10], coeff of eps^21, polynomial in n of order 5 -reale(2585,173491781LL<<22),real(226504425479LL<<24), real(118144668093LL<<22),real(325346294119LL<<23), -real(464280225409LL<<22),real(919092918513LL<<18), reale(23933886,0x5a813dc916f5bLL), // C4[10], coeff of eps^20, polynomial in n of order 6 -reale(2656,138725573LL<<22),-real(0x1a9c614c5c3LL<<21), -real(765139808215LL<<23),real(0x32058af918bLL<<21), -real(117685929879LL<<22),-real(106680176295LL<<21), -real(0xf144800341LL<<18),reale(23933886,0x5a813dc916f5bLL), // C4[10], coeff of eps^19, polynomial in n of order 7 reale(3432,329072245LL<<22),reale(2930,283183745LL<<23), -reale(4577,1044295185LL<<22),real(34786730571LL<<24), real(54685893801LL<<22),real(647412775723LL<<23), -real(676279973341LL<<22),real(0xe9c610e7bdLL<<18), reale(23933886,0x5a813dc916f5bLL), // C4[10], coeff of eps^18, polynomial in n of order 8 -reale(11084,235058537LL<<23),reale(11858,1143524977LL<<20), real(0x2545fd77485LL<<21),-real(0x307c82cee9dLL<<20), -reale(4103,193833065LL<<22),reale(2140,2163909077LL<<20), real(446041302231LL<<21),-real(54302113593LL<<20), -real(0x7f8004b3e7a0000LL),reale(23933886,0x5a813dc916f5bLL), // C4[10], coeff of eps^17, polynomial in n of order 9 -reale(16525,309616105LL<<23),-reale(12873,31213113LL<<26), -real(811482588455LL<<23),reale(13789,37992821LL<<24), -reale(4637,221662373LL<<23),-real(274288421561LL<<25), -real(562238052579LL<<23),reale(2541,30117927LL<<24), -real(493061811809LL<<23),real(451991259993LL<<19), reale(23933886,0x5a813dc916f5bLL), // C4[10], coeff of eps^16, polynomial in n of order 10 -reale(4541,277413243LL<<23),reale(9880,364937465LL<<22), -reale(5569,118974143LL<<25),-real(671603509225LL<<22), real(626562721155LL<<23),real(0x126f9949db5LL<<22), -real(372257463743LL<<24),real(225505748691LL<<22), real(72729834113LL<<23),real(40056084593LL<<22), -real(360891225041LL<<19),reale(3419126,0x9f3708d39590dLL), // C4[10], coeff of eps^15, polynomial in n of order 11 reale(82722,490551845LL<<23),-reale(64701,63547469LL<<24), real(116234844999LL<<23),reale(58506,49315063LL<<26), -reale(58413,433206103LL<<23),reale(16792,103491845LL<<24), reale(8555,183955915LL<<23),-reale(2317,84066185LL<<25), -reale(7194,11825619LL<<23),reale(5493,119743831LL<<24), -real(667673139889LL<<23),real(58009080297LL<<19), reale(23933886,0x5a813dc916f5bLL), // C4[10], coeff of eps^14, polynomial in n of order 12 reale(18981,396462873LL<<22),-reale(46078,2701457279LL<<20), reale(76015,1126083519LL<<21),-reale(79652,3524648005LL<<20), reale(36586,273717939LL<<23),reale(28474,1008822389LL<<20), -reale(61326,649857063LL<<21),reale(42595,3757087663LL<<20), -reale(8326,955589709LL<<22),-reale(5139,3984305559LL<<20), real(0x284545d9df3LL<<21),real(0x72b007891a3LL<<20), -real(0x33009c87a9620000LL),reale(23933886,0x5a813dc916f5bLL), // C4[10], coeff of eps^13, polynomial in n of order 13 real(543312976219LL<<22),-reale(3062,112501267LL<<24), reale(11988,59347917LL<<22),-reale(32439,32307605LL<<23), reale(61980,821355519LL<<22),-reale(81948,80095793LL<<25), reale(67313,1055324017LL<<22),-reale(16748,109351667LL<<23), -reale(34832,1017554013LL<<22),reale(50577,16270159LL<<24), -reale(32450,61276651LL<<22),reale(10213,501613231LL<<23), -real(913358656441LL<<22),-real(0xcb30b375e9c0000LL), reale(23933886,0x5a813dc916f5bLL), // C4[10], coeff of eps^12, polynomial in n of order 14 real(553451171LL<<22),-real(41782403663LL<<21),real(122732484303LL<<23), -real(0x2eaf28525b9LL<<21),reale(6402,476837273LL<<22), -reale(19347,183862947LL<<21),reale(42585,247358789LL<<24), -reale(68666,1206346765LL<<21),reale(79038,878189199LL<<22), -reale(58930,1207602423LL<<21),reale(17031,374958661LL<<23), reale(18189,4759455LL<<21),-reale(27348,414989947LL<<22), reale(16435,1788023477LL<<21),-reale(4106,0xe7ddb41f40000LL), reale(23933886,0x5a813dc916f5bLL), // C4[10], coeff of eps^11, polynomial in n of order 15 real(259293LL<<22),real(1935549LL<<23),real(164593143LL<<22), -real(1654671183LL<<24),real(83533307473LL<<22), -real(296200453241LL<<23),reale(2600,89083243LL<<22), -reale(8792,113023813LL<<25),reale(22203,397075141LL<<22), -reale(42668,107392175LL<<23),reale(62615,179754463LL<<22), -reale(69317,125076421LL<<24),reale(56036,868613689LL<<22), -reale(31065,284420581LL<<23),reale(10475,628806483LL<<22), -real(0x6470cd13038c0000LL),reale(23933886,0x5a813dc916f5bLL), // C4[10], coeff of eps^10, polynomial in n of order 16 real(133LL<<24),real(15675LL<<20),real(77539LL<<21),real(2448017LL<<20), real(27681423LL<<22),-real(4770431897LL<<20),real(32525672025LL<<21), -real(503497402947LL<<20),real(327672913029LL<<23), -reale(2314,857372269LL<<20),reale(6672,231933903LL<<21), -reale(14969,2031875351LL<<20),reale(26346,292729733LL<<22), -reale(36032,1727726401LL<<20),reale(36664,1180419909LL<<21), -reale(23570,290549227LL<<20),reale(6696,0xabcf39720000LL), reale(23933886,0x5a813dc916f5bLL), // C4[11], coeff of eps^26, polynomial in n of order 0 real(611LL<<23),real(0xe6baee73ea363LL), // C4[11], coeff of eps^25, polynomial in n of order 1 -real(76597LL<<26),-real(1573935LL<<21),real(0x477bca00497fe9bfLL), // C4[11], coeff of eps^24, polynomial in n of order 2 real(5977365LL<<29),-real(9705069LL<<28),real(85309807LL<<22), reale(54497,0x83837319e73d9LL), // C4[11], coeff of eps^23, polynomial in n of order 3 real(66340583679LL<<26),-real(4467880351LL<<27),-real(2404066379LL<<26), -real(68755156353LL<<21),reale(26213304,0x19fb43ab7aab9LL), // C4[11], coeff of eps^22, polynomial in n of order 4 real(257415529LL<<33),real(402685503LL<<30),real(652792679LL<<32), -real(1631824579LL<<30),real(23005724469LL<<23), reale(26213304,0x19fb43ab7aab9LL), // C4[11], coeff of eps^21, polynomial in n of order 5 -real(453253333179LL<<23),-real(222902987187LL<<25), real(749255628291LL<<23),-real(3378231395LL<<24), -real(18492933151LL<<23),-real(0xf79dae93c9LL<<18), reale(26213304,0x19fb43ab7aab9LL), // C4[11], coeff of eps^20, polynomial in n of order 6 reale(4082,27256381LL<<26),-reale(3843,110832251LL<<25), -real(11608614857LL<<27),-real(12679113309LL<<25), real(80017732991LL<<26),-real(73865834735LL<<25), real(381345882225LL<<19),reale(26213304,0x19fb43ab7aab9LL), // C4[11], coeff of eps^19, polynomial in n of order 7 reale(8515,117356323LL<<23),reale(2727,54002259LL<<24), real(95356337593LL<<23),-reale(4154,53817247LL<<25), real(882540340143LL<<23),real(80081392881LL<<24),real(12076046661LL<<23), -real(0x7d57ec14bd40000LL),reale(26213304,0x19fb43ab7aab9LL), // C4[11], coeff of eps^18, polynomial in n of order 8 -reale(12505,951035LL<<32),-reale(6194,13758139LL<<28), reale(12920,711829LL<<30),-reale(2328,16199449LL<<28), -reale(2121,1768403LL<<31),-real(23812716991LL<<28), reale(2380,3848439LL<<30),-real(12910651229LL<<28), real(75285764519LL<<21),reale(26213304,0x19fb43ab7aab9LL), // C4[11], coeff of eps^17, polynomial in n of order 9 reale(63004,136371221LL<<24),-reale(23253,27876759LL<<27), -reale(10033,153577157LL<<24),reale(4968,6981291LL<<25), reale(9826,264428161LL<<24),-reale(8260,44635479LL<<26), real(151361303079LL<<24),real(120235734969LL<<25), real(86414162541LL<<24),-real(0x22b971cd551LL<<19), reale(26213304,0x19fb43ab7aab9LL), // C4[11], coeff of eps^16, polynomial in n of order 10 -reale(42751,388403LL<<27),-reale(21692,36263017LL<<26), reale(62310,8348465LL<<29),-reale(46929,14252519LL<<26), reale(7047,32285691LL<<27),reale(9444,49195723LL<<26), -real(6177911663LL<<28),-reale(7300,34477811LL<<26), reale(4777,27041001LL<<27),-real(65141092289LL<<26), -real(44359884933LL<<20),reale(26213304,0x19fb43ab7aab9LL), // C4[11], coeff of eps^15, polynomial in n of order 11 -reale(54975,7679265LL<<24),reale(76586,39901517LL<<25), -reale(65943,41351227LL<<24),reale(16034,25331417LL<<27), reale(40019,7760011LL<<24),-reale(57816,89862917LL<<25), reale(33374,245812081LL<<24),-reale(3538,1406183LL<<26), -reale(5247,183755081LL<<24),real(95390660393LL<<25), real(490233600157LL<<24),-real(0x5c9b8397461LL<<19), reale(26213304,0x19fb43ab7aab9LL), // C4[11], coeff of eps^14, polynomial in n of order 12 -reale(5607,843033LL<<31),reale(17587,15869457LL<<28), -reale(40024,1555693LL<<30),reale(66142,8872067LL<<28), -reale(76302,93659LL<<32),reale(52531,9300813LL<<28), -reale(2628,1860027LL<<30),-reale(39200,13058241LL<<28), reale(46365,693773LL<<31),-reale(27149,11145943LL<<28), reale(7864,1548807LL<<30),-real(7962030629LL<<28), -real(412888159761LL<<21),reale(26213304,0x19fb43ab7aab9LL), // C4[11], coeff of eps^13, polynomial in n of order 13 -real(41790907379LL<<23),real(76324858599LL<<25), -reale(2753,104130613LL<<23),reale(9526,224954257LL<<24), -reale(24463,68256343LL<<23),reale(47309,29696781LL<<26), -reale(68504,135442201LL<<23),reale(71563,253449815LL<<24), -reale(47678,505267003LL<<23),reale(8918,86883405LL<<25), reale(19900,176522371LL<<23),-reale(25292,67707491LL<<24), reale(14565,326677345LL<<23),-reale(3589,0xb1b7cdcc40000LL), reale(26213304,0x19fb43ab7aab9LL), // C4[11], coeff of eps^12, polynomial in n of order 14 -real(2670507LL<<26),real(235653561LL<<25),-real(820617391LL<<27), real(25869702111LL<<25),-real(68305888497LL<<26), reale(3896,38584213LL<<25),-reale(11280,10173573LL<<28), reale(25274,31321979LL<<25),-reale(44240,19038327LL<<26), reale(60354,128468529LL<<25),-reale(63152,8090597LL<<27), reale(48923,66496087LL<<25),-reale(26288,683965LL<<26), reale(8669,60420749LL<<25),-real(0xa3ae57ad353LL<<19), reale(26213304,0x19fb43ab7aab9LL), // C4[11], coeff of eps^11, polynomial in n of order 15 -real(3933LL<<23),-real(33649LL<<24),-real(3312023LL<<23), real(38979963LL<<25),-real(2334466673LL<<23),real(9974539421LL<<24), -real(115419670443LL<<23),real(61272170729LL<<26), -reale(2977,381931269LL<<23),reale(7656,260966955LL<<24), -reale(15739,178079295LL<<23),reale(25923,81221929LL<<25), -reale(33768,486785817LL<<23),reale(33232,239529529LL<<24), -reale(20951,91935571LL<<23),reale(5892,8880483819LL<<18), reale(26213304,0x19fb43ab7aab9LL), // C4[12], coeff of eps^26, polynomial in n of order 0 -real(1LL<<33),real(0x2f0618f20f09a7LL), // C4[12], coeff of eps^25, polynomial in n of order 1 -real(62273LL<<28),real(123651LL<<24),real(0x19e65bbd524850fbLL), // C4[12], coeff of eps^24, polynomial in n of order 2 -real(93684917LL<<28),-real(76423549LL<<27),-real(693037063LL<<24), reale(2191747,0xd5a68f81111b3LL), // C4[12], coeff of eps^23, polynomial in n of order 3 real(311968535LL<<28),real(1760740793LL<<29),-real(1954369859LL<<28), real(3073971433LL<<24),reale(9497573,0xf32718849f75dLL), // C4[12], coeff of eps^22, polynomial in n of order 4 -real(7646768769LL<<30),real(19951096269LL<<28),real(491010815LL<<29), -real(320366609LL<<28),-real(523396783LL<<29), reale(28492721,0xd975498dde617LL), // C4[12], coeff of eps^21, polynomial in n of order 5 -reale(3026,1811699LL<<28),-real(2760169147LL<<30), -real(4156137093LL<<28),real(9751170709LL<<29),-real(8065022455LL<<28), real(9009785085LL<<24),reale(28492721,0xd975498dde617LL), // C4[12], coeff of eps^20, polynomial in n of order 6 reale(3415,105419659LL<<25),real(300203870565LL<<24), -reale(4036,50457863LL<<26),real(324492084003LL<<24), real(46663751897LL<<25),real(14263553185LL<<24), -real(262021003825LL<<21),reale(28492721,0xd975498dde617LL), // C4[12], coeff of eps^19, polynomial in n of order 7 -reale(9657,23913255LL<<26),reale(11274,14202393LL<<27), -real(33749559685LL<<26),-real(32700069373LL<<28), -real(114920432067LL<<26),reale(2209,3347763LL<<27), -real(43334519585LL<<26),real(23877094395LL<<22), reale(28492721,0xd975498dde617LL), // C4[12], coeff of eps^18, polynomial in n of order 8 -reale(10357,4316059LL<<29),-reale(12252,51976653LL<<26), real(53111513007LL<<27),reale(10573,38618953LL<<26), -reale(6814,7336347LL<<28),-real(6527663009LL<<26), real(27052895205LL<<27),real(24601392501LL<<26),-real(17553357101LL<<26), reale(28492721,0xd975498dde617LL), // C4[12], coeff of eps^17, polynomial in n of order 9 -reale(37197,16059447LL<<26),reale(60620,6214685LL<<29), -reale(35564,62593849LL<<26),real(3388754439LL<<27), reale(9080,41918565LL<<26),real(21802684253LL<<28), -reale(7184,50608669LL<<26),reale(4144,5922861LL<<27), -real(50938551167LL<<26),-real(22779400371LL<<22), reale(28492721,0xd975498dde617LL), // C4[12], coeff of eps^16, polynomial in n of order 10 reale(72847,10250567LL<<26),-reale(50730,68954325LL<<25), -real(18441684165LL<<28),reale(46646,59050757LL<<25), -reale(52485,42154095LL<<26),reale(25457,83058719LL<<25), -real(7107757125LL<<27),-reale(5015,25213703LL<<25), real(15647388379LL<<26),real(240182800403LL<<25), -real(724544787239LL<<22),reale(28492721,0xd975498dde617LL), // C4[12], coeff of eps^15, polynomial in n of order 11 reale(23399,60546659LL<<26),-reale(46215,22779895LL<<27), reale(67437,13577137LL<<26),-reale(68612,7311579LL<<29), reale(38802,65276767LL<<26),reale(8195,42655LL<<27), -reale(41126,40169811LL<<26),reale(42002,3198053LL<<28), -reale(22751,40888613LL<<26),reale(6086,3052981LL<<27), -real(14786628311LL<<26),-real(192226168043LL<<22), reale(28492721,0xd975498dde617LL), // C4[12], coeff of eps^14, polynomial in n of order 12 real(18933494775LL<<28),-reale(4401,33536241LL<<26), reale(12915,15192945LL<<27),-reale(29094,11527179LL<<26), reale(50530,7111165LL<<29),-reale(66729,34095909LL<<26), reale(63904,14901367LL<<27),-reale(38025,42880575LL<<26), reale(2775,16493565LL<<28),reale(20705,54393511LL<<26), -reale(23355,27541123LL<<27),reale(12999,62947213LL<<26), -reale(3169,31971073LL<<26),reale(28492721,0xd975498dde617LL), // C4[12], coeff of eps^13, polynomial in n of order 13 real(168754105LL<<26),-real(365884805LL<<28),real(8561579455LL<<26), -real(18298927075LL<<27),real(119493273445LL<<26), -reale(4555,4035095LL<<29),reale(9255,49236715LL<<26), -reale(14989,8672597LL<<27),reale(19228,2329233LL<<26), -reale(19175,5958615LL<<28),reale(14321,64798871LL<<26), -reale(7491,16431175LL<<27),reale(2423,48133949LL<<26), -real(387864634927LL<<22),reale(9497573,0xf32718849f75dLL), // C4[12], coeff of eps^12, polynomial in n of order 14 real(198835LL<<25),-real(20309575LL<<24),real(82800575LL<<26), -real(3096741505LL<<24),real(9853268425LL<<25),-real(92620723195LL<<24), real(42100328725LL<<27),-reale(3631,95393589LL<<24), reale(8507,100242399LL<<25),-reale(16264,217481391LL<<24), reale(25338,57859733LL<<26),-reale(31673,155080937LL<<24), reale(30296,62498037LL<<25),-reale(18783,217084003LL<<24), reale(5237,1702548307LL<<21),reale(28492721,0xd975498dde617LL), // C4[13], coeff of eps^26, polynomial in n of order 0 real(83LL<<25),real(0xb952c68e4fbe9LL), // C4[13], coeff of eps^25, polynomial in n of order 1 -real(71903LL<<28),-real(1749945LL<<24),reale(5818,0x23b391cd899edLL), // C4[13], coeff of eps^24, polynomial in n of order 2 real(16903565LL<<32),-real(16862357LL<<31),real(47373573LL<<26), reale(789029,0x386f296be7703LL), // C4[13], coeff of eps^23, polynomial in n of order 3 real(16624462311LL<<28),real(913717761LL<<29),-real(74700691LL<<28), -real(16672249061LL<<24),reale(30772139,0x98ef4f7042175LL), // C4[13], coeff of eps^22, polynomial in n of order 4 -real(876500127LL<<32),-real(1654287687LL<<30),real(2350551113LL<<31), -real(1761427069LL<<30),real(3376471371LL<<25), reale(30772139,0x98ef4f7042175LL), // C4[13], coeff of eps^21, polynomial in n of order 5 real(32655563463LL<<28),-reale(3801,39657LL<<30),real(14063722833LL<<28), real(3085833575LL<<29),real(1328082427LL<<28),-real(31671991379LL<<24), reale(30772139,0x98ef4f7042175LL), // C4[13], coeff of eps^20, polynomial in n of order 6 reale(9254,348341LL<<33),real(891770565LL<<32),-real(427379969LL<<34), -real(2022490653LL<<32),real(1067054247LL<<33),-real(569056495LL<<32), real(430257975LL<<27),reale(30772139,0x98ef4f7042175LL), // C4[13], coeff of eps^19, polynomial in n of order 7 -reale(12155,12992869LL<<26),-real(50480950653LL<<27), reale(10690,33612001LL<<26),-reale(5460,12466223LL<<28), -real(37884419769LL<<26),real(23471963137LL<<27),real(26726056077LL<<26), -real(264030652949LL<<22),reale(30772139,0x98ef4f7042175LL), // C4[13], coeff of eps^18, polynomial in n of order 8 reale(55507,1702051LL<<31),-reale(25284,15301089LL<<28), -reale(4552,6848911LL<<29),reale(8014,12209149LL<<28), reale(2646,1117571LL<<30),-reale(6924,9493077LL<<28), reale(3590,1368763LL<<29),-real(9963972599LL<<28), -real(15032559759LL<<23),reale(30772139,0x98ef4f7042175LL), // C4[13], coeff of eps^17, polynomial in n of order 9 -reale(35540,37090525LL<<26),-reale(14632,1678969LL<<29), reale(49583,4861453LL<<26),-reale(46373,31739579LL<<27), reale(18858,13991831LL<<26),real(34153973959LL<<28), -reale(4603,63875327LL<<26),-real(5127820649LL<<27), real(116479282059LL<<26),-real(662201165171LL<<22), reale(30772139,0x98ef4f7042175LL), // C4[13], coeff of eps^16, polynomial in n of order 10 -reale(50761,3025121LL<<30),reale(66355,4425085LL<<29), -reale(59858,324757LL<<32),reale(26575,1103635LL<<29), reale(16255,479225LL<<30),-reale(41402,7301831LL<<29), reale(37768,714123LL<<31),-reale(19110,4265457LL<<29), reale(4727,1747987LL<<30),-real(399638603LL<<29), -real(44359884933LL<<24),reale(30772139,0x98ef4f7042175LL), // C4[13], coeff of eps^15, polynomial in n of order 11 -reale(6366,57157311LL<<26),reale(16360,10192555LL<<27), -reale(33060,46450725LL<<26),reale(52401,3371487LL<<29), -reale(63840,37321515LL<<26),reale(56445,29554125LL<<27), -reale(29837,31975057LL<<26),-real(31142569185LL<<28), reale(20917,29855465LL<<26),-reale(21569,9966225LL<<27), reale(11677,61095555LL<<26),-reale(2823,85634603LL<<22), reale(30772139,0x98ef4f7042175LL), // C4[13], coeff of eps^14, polynomial in n of order 12 -real(583637535LL<<30),real(11022475035LL<<28), -reale(2387,6604529LL<<29),reale(6865,10202825LL<<28), -reale(15869,914837LL<<31),reale(29710,9184775LL<<28), -reale(45043,8145271LL<<29),reale(54812,7153333LL<<28), -reale(52441,1442741LL<<30),reale(37945,12833459LL<<28), -reale(19389,6190909LL<<29),reale(6169,7752673LL<<28), -real(487958734263LL<<23),reale(30772139,0x98ef4f7042175LL), // C4[13], coeff of eps^13, polynomial in n of order 13 -real(23263695LL<<26),real(59053995LL<<28),-real(1639451385LL<<26), real(4222829325LL<<27),-real(33859413315LL<<26),real(13601644665LL<<29), -reale(4256,19212781LL<<26),reale(9227,30696251LL<<27), -reale(16594,3848759LL<<26),reale(24654,470841LL<<28), -reale(29745,41662305LL<<26),reale(27762,19442409LL<<27), -reale(16966,1393323LL<<26),reale(4695,1022390371LL<<22), reale(30772139,0x98ef4f7042175LL), // C4[14], coeff of eps^26, polynomial in n of order 0 -real(6781LL<<26),real(0x5fa345ccc643905LL), // C4[14], coeff of eps^25, polynomial in n of order 1 -real(5869LL<<31),real(7353LL<<27),real(0x148e6926290dbdd9LL), // C4[14], coeff of eps^24, polynomial in n of order 2 real(299903009LL<<31),real(37927009LL<<30),-real(2056312073LL<<27), reale(33051557,0x58695552a5cd3LL), // C4[14], coeff of eps^23, polynomial in n of order 3 -real(368055047LL<<31),real(374500339LL<<32),-real(256592557LL<<31), real(207940889LL<<27),reale(11017185,0xc8231c70e1ef1LL), // C4[14], coeff of eps^22, polynomial in n of order 4 -reale(3490,1015519LL<<31),real(4441335459LL<<29),real(1543166497LL<<30), real(845740769LL<<29),-real(7622621279LL<<26), reale(33051557,0x58695552a5cd3LL), // C4[14], coeff of eps^21, polynomial in n of order 5 real(1872610391LL<<32),-real(324912469LL<<34),-reale(2076,886527LL<<32), real(978081451LL<<33),-real(478972501LL<<32),real(98710857LL<<28), reale(33051557,0x58695552a5cd3LL), // C4[14], coeff of eps^20, polynomial in n of order 6 -reale(4075,185993LL<<32),reale(10359,933297LL<<31), -reale(4245,239235LL<<33),-real(1849695177LL<<31),real(616423549LL<<32), real(879958205LL<<31),-real(3876332285LL<<28), reale(33051557,0x58695552a5cd3LL), // C4[14], coeff of eps^19, polynomial in n of order 7 -reale(16507,1038671LL<<32),-reale(7426,284587LL<<33), reale(6609,461219LL<<32),reale(3685,34759LL<<34), -reale(6576,786795LL<<32),reale(3109,191175LL<<33), -real(486788729LL<<32),-real(537600147LL<<28), reale(33051557,0x58695552a5cd3LL), // C4[14], coeff of eps^18, polynomial in n of order 8 -reale(24788,2034733LL<<30),reale(49876,16016773LL<<27), -reale(40130,10305415LL<<28),reale(13469,4482399LL<<27), reale(3498,5005267LL<<29),-reale(4111,23511239LL<<27), -real(7714983213LL<<28),real(56106110739LL<<27), -real(151831927709LL<<24),reale(33051557,0x58695552a5cd3LL), // C4[14], coeff of eps^17, polynomial in n of order 9 reale(63443,3600701LL<<29),-reale(50757,496203LL<<32), reale(16003,4273171LL<<29),reale(22072,52127LL<<30), -reale(40595,5066263LL<<29),reale(33806,1004469LL<<31), -reale(16095,1666881LL<<29),reale(3680,908597LL<<30), real(584087189LL<<29),-real(20381568753LL<<25), reale(33051557,0x58695552a5cd3LL), // C4[14], coeff of eps^16, polynomial in n of order 10 reale(19689,3969453LL<<29),-reale(36282,12968943LL<<28), reale(53123,80009LL<<31),-reale(60234,3770241LL<<28), reale(49410,2521755LL<<29),-reale(22943,4183315LL<<28), -reale(5331,2542455LL<<30),reale(20742,9731931LL<<28), -reale(19939,3671159LL<<29),reale(10552,6717897LL<<28), -reale(2533,118946129LL<<25),reale(33051557,0x58695552a5cd3LL), // C4[14], coeff of eps^15, polynomial in n of order 11 real(8533174455LL<<29),-reale(3246,843591LL<<30), reale(8406,531117LL<<29),-reale(17842,647003LL<<32), reale(31156,7375267LL<<29),-reale(44630,771985LL<<30), reale(51879,2231193LL<<29),-reale(47870,1100123LL<<31), reale(33689,2160271LL<<29),-reale(16864,3290075LL<<30), reale(5288,925829LL<<29),-real(103506398177LL<<25), reale(33051557,0x58695552a5cd3LL), // C4[14], coeff of eps^14, polynomial in n of order 12 real(66723345LL<<29),-real(1495097175LL<<27),real(3274386375LL<<28), -real(23122205325LL<<27),real(8392504155LL<<30), -reale(4840,16188355LL<<27),reale(9826,9115409LL<<28), -reale(16767,17260281LL<<27),reale(23911,7831387LL<<29), -reale(27976,32288815LL<<27),reale(25559,3357275LL<<28), -reale(15423,21986149LL<<27),reale(4241,135611051LL<<24), reale(33051557,0x58695552a5cd3LL), // C4[15], coeff of eps^26, polynomial in n of order 0 real(71LL<<30),real(0x2213ecbbb96785dLL), // C4[15], coeff of eps^25, polynomial in n of order 1 real(6799LL<<34),-real(2467695LL<<27),reale(43244,0xc47e8e0e2a501LL), // C4[15], coeff of eps^24, polynomial in n of order 2 real(1754601LL<<37),-real(1107369LL<<36),real(11866753LL<<28), reale(1859525,0x141dc611b72bLL), // C4[15], coeff of eps^23, polynomial in n of order 3 real(72562737LL<<34),real(46462031LL<<35),real(31074907LL<<34), -real(3658156407LL<<27),reale(35330975,0x17e35b3509831LL), // C4[15], coeff of eps^22, polynomial in n of order 4 -real(13531387LL<<38),-reale(2167,14381LL<<36),real(55828981LL<<37), -real(25230703LL<<36),real(3197649LL<<30), reale(35330975,0x17e35b3509831LL), // C4[15], coeff of eps^21, polynomial in n of order 5 reale(9732,8631LL<<37),-reale(3185,3623LL<<39),-real(35580543LL<<37), real(7839601LL<<38),real(14184443LL<<37),-real(3642815981LL<<28), reale(35330975,0x17e35b3509831LL), // C4[15], coeff of eps^20, polynomial in n of order 6 -reale(8973,2493LL<<39),reale(5093,1677LL<<40),reale(4452,53LL<<40), -reale(6181,1625LL<<40),reale(2693,7137LL<<39),-real(1482145LL<<40), -real(287239701LL<<29),reale(35330975,0x17e35b3509831LL), // C4[15], coeff of eps^19, polynomial in n of order 7 reale(48363,42681LL<<36),-reale(34138,1171LL<<37), reale(9135,63227LL<<36),reale(4396,12847LL<<38),-reale(3596,33667LL<<36), -real(22964529LL<<37),real(105092799LL<<36),-real(8732815777LL<<28), reale(35330975,0x17e35b3509831LL), // C4[15], coeff of eps^18, polynomial in n of order 8 -reale(41806,3793LL<<39),reale(7070,18565LL<<36), reale(26107,27709LL<<37),-reale(39103,10113LL<<36), reale(30179,111LL<<38),-reale(13593,42919LL<<36),reale(2866,20031LL<<37), real(9747283LL<<36),-real(584087189LL<<30), reale(35330975,0x17e35b3509831LL), // C4[15], coeff of eps^17, polynomial in n of order 9 -reale(38751,968439LL<<32),reale(52907,129341LL<<35), -reale(56213,262777LL<<32),reale(42911,476327LL<<33), -reale(17166,1038043LL<<32),-reale(7920,60547LL<<34), reale(20320,95267LL<<32),-reale(18461,171251LL<<33), reale(9586,798401LL<<32),-reale(2289,97706315LL<<25), reale(35330975,0x17e35b3509831LL), // C4[15], coeff of eps^16, polynomial in n of order 10 -real(182681295LL<<35),reale(3304,139139LL<<34),-reale(6521,16667LL<<37), reale(10722,226797LL<<34),-reale(14618,113609LL<<35), reale(16325,9799LL<<34),-reale(14590,57403LL<<36), reale(10019,97137LL<<34),-reale(4925,40451LL<<35),real(399638603LL<<34), -real(14786628311LL<<26),reale(11776991,0xb2a11e67032bbLL), // C4[15], coeff of eps^15, polynomial in n of order 11 -real(76608285LL<<32),real(147323625LL<<33),-real(936978255LL<<32), reale(2382,112581LL<<35),-reale(5377,114593LL<<32), reale(10315,142015LL<<33),-reale(16818,394707LL<<32), reale(23142,22533LL<<34),-reale(26356,277413LL<<32), reale(23629,395541LL<<33),-reale(14101,658135LL<<32), reale(3855,122649445LL<<25),reale(35330975,0x17e35b3509831LL), // C4[16], coeff of eps^26, polynomial in n of order 0 -real(22951LL<<32),reale(14038,0xf79362a6f2da9LL), // C4[16], coeff of eps^25, polynomial in n of order 1 -real(9017LL<<35),real(4815LL<<31),reale(9206,0xf354c01a236f3LL), // C4[16], coeff of eps^24, polynomial in n of order 2 real(1146319LL<<36),real(916151LL<<35),-real(5763591LL<<32), reale(1979494,0x5c2d55f3c2615LL), // C4[16], coeff of eps^23, polynomial in n of order 3 -real(15250071LL<<35),real(5353311LL<<36),-real(2240893LL<<35), -real(332469LL<<31),reale(1979494,0x5c2d55f3c2615LL), // C4[16], coeff of eps^22, polynomial in n of order 4 -reale(2280,6539LL<<38),-real(78951693LL<<36),real(12301989LL<<37), real(28829297LL<<36),-real(214091115LL<<32), reale(37610392,0xd75d61176d38fLL), // C4[16], coeff of eps^21, polynomial in n of order 5 reale(3604,40151LL<<35),reale(4989,25591LL<<37),-reale(5766,5439LL<<35), reale(2335,38023LL<<36),-real(36776117LL<<35),-real(73810821LL<<31), reale(37610392,0xd75d61176d38fLL), // C4[16], coeff of eps^20, polynomial in n of order 6 -reale(28603,8635LL<<37),reale(5695,63155LL<<36),reale(4892,14039LL<<38), -reale(3091,58619LL<<36),-real(29081577LL<<37),real(100489431LL<<36), -real(125982325LL<<34),reale(37610392,0xd75d61176d38fLL), // C4[16], coeff of eps^19, polynomial in n of order 7 -real(44186749LL<<35),reale(28752,63675LL<<36),-reale(37202,72039LL<<35), reale(26902,18169LL<<37),-reale(11512,105649LL<<35), reale(2229,59753LL<<36),real(26382181LL<<35),-real(267675387LL<<31), reale(37610392,0xd75d61176d38fLL), // C4[16], coeff of eps^18, polynomial in n of order 8 reale(51956,3503LL<<39),-reale(52000,65291LL<<36), reale(36995,30461LL<<37),-reale(12343,54705LL<<36), -reale(9828,2065LL<<38),reale(19743,35337LL<<36), -reale(17124,20865LL<<37),reale(8752,19043LL<<36), -reale(2081,554945LL<<32),reale(37610392,0xd75d61176d38fLL), // C4[16], coeff of eps^17, polynomial in n of order 9 reale(11351,15263LL<<35),-reale(21031,10301LL<<38), reale(32809,38737LL<<35),-reale(42826,1799LL<<36), reale(46156,123299LL<<35),-reale(40102,7421LL<<37), reale(26942,16853LL<<35),-reale(13031,12333LL<<36), reale(3987,20263LL<<35),-real(1198915809LL<<31), reale(37610392,0xd75d61176d38fLL), // C4[16], coeff of eps^16, polynomial in n of order 10 real(100180065LL<<34),-real(583401555LL<<33),reale(2759,6541LL<<36), -reale(5863,45661LL<<33),reale(10706,132871LL<<34), -reale(16773,276519LL<<33),reale(22364,92173LL<<35), -reale(24871,48433LL<<33),reale(21929,91821LL<<34), -reale(12958,132347LL<<33),reale(3525,1706711LL<<30), reale(37610392,0xd75d61176d38fLL), // C4[17], coeff of eps^26, polynomial in n of order 0 real(1LL<<32),real(0x62a61c3e4dd975LL), // C4[17], coeff of eps^25, polynomial in n of order 1 real(4057LL<<35),-real(45015LL<<31),reale(8569,0x3d59f665e75a3LL), // C4[17], coeff of eps^24, polynomial in n of order 2 real(43463LL<<40),-real(16895LL<<39),-real(11395LL<<34), reale(299923,0x634cafeea1549LL), // C4[17], coeff of eps^23, polynomial in n of order 3 -real(1242717LL<<35),real(138325LL<<36),real(435713LL<<35), -real(3030063LL<<31),reale(299923,0x634cafeea1549LL), // C4[17], coeff of eps^22, polynomial in n of order 4 real(2302621LL<<39),-real(9225219LL<<37),real(1747781LL<<38), -real(372113LL<<37),-real(1948863LL<<32), reale(2099463,0xb718cf86694ffLL), // C4[17], coeff of eps^21, polynomial in n of order 5 reale(2996,69763LL<<35),reale(5105,30307LL<<37),-reale(2616,23051LL<<35), -real(67503821LL<<36),real(191814791LL<<35),-real(933454921LL<<31), reale(39889810,0x96d766f9d0eedLL), // C4[17], coeff of eps^20, polynomial in n of order 6 reale(30327,1293LL<<39),-reale(35084,3299LL<<38),reale(23968,2311LL<<40), -reale(9776,7093LL<<38),real(14159215LL<<39),real(3853577LL<<38), -real(61360803LL<<33),reale(39889810,0x96d766f9d0eedLL), // C4[17], coeff of eps^19, polynomial in n of order 7 -reale(47757,47889LL<<35),reale(31664,61447LL<<36), -reale(8326,73443LL<<35),-reale(11212,17667LL<<37), reale(19076,23915LL<<35),-reale(15916,62675LL<<36), reale(8026,42649LL<<35),-real(3989637911LL<<31), reale(39889810,0x96d766f9d0eedLL), // C4[17], coeff of eps^18, polynomial in n of order 8 -reale(22252,923LL<<40),reale(33139,2449LL<<37),-reale(41618,6905LL<<38), reale(43458,30291LL<<37),-reale(36814,1531LL<<39), reale(24253,3845LL<<37),-reale(11561,2707LL<<38),reale(3500,30023LL<<37), -real(522604327LL<<32),reale(39889810,0x96d766f9d0eedLL), // C4[17], coeff of eps^17, polynomial in n of order 9 -real(175857885LL<<35),reale(3123,8343LL<<38),-reale(6297,123891LL<<35), reale(11012,26677LL<<36),-reale(16654,74217LL<<35), reale(21593,16599LL<<37),-reale(23509,7807LL<<35),reale(20422,743LL<<36), -reale(11961,60789LL<<35),reale(3239,1180923LL<<31), reale(39889810,0x96d766f9d0eedLL), // C4[18], coeff of eps^26, polynomial in n of order 0 -real(56087LL<<33),reale(47221,0xfaefc0318df67LL), // C4[18], coeff of eps^25, polynomial in n of order 1 -real(19981LL<<39),-real(10755LL<<35),reale(443886,0x9d340e9e9cd95LL), // C4[18], coeff of eps^24, polynomial in n of order 2 real(84155LL<<39),real(380011LL<<38),-real(1249051LL<<35), reale(2219433,0x12044919103e9LL), // C4[18], coeff of eps^23, polynomial in n of order 3 -real(2130987LL<<39),real(379583LL<<40),-real(70649LL<<39), -real(240567LL<<35),reale(2219433,0x12044919103e9LL), // C4[18], coeff of eps^22, polynomial in n of order 4 real(4417441LL<<38),-real(7513869LL<<36),-real(1960735LL<<37), real(4812241LL<<36),-real(11409363LL<<33), reale(2219433,0x12044919103e9LL), // C4[18], coeff of eps^21, polynomial in n of order 5 -real(28350547LL<<38),real(4603793LL<<40),-real(7176677LL<<38), real(573937LL<<39),real(220745LL<<38),-real(1482145LL<<34), reale(2219433,0x12044919103e9LL), // C4[18], coeff of eps^20, polynomial in n of order 6 reale(26896,5159LL<<38),-reale(4987,8879LL<<37),-reale(12193,6323LL<<39), reale(18360,26775LL<<37),-reale(14825,8691LL<<38), reale(7390,26973LL<<37),-real(457982805LL<<34), reale(42169228,0x56516cdc34a4bLL), // C4[18], coeff of eps^19, polynomial in n of order 7 reale(11070,12259LL<<38),-reale(13431,6105LL<<39), reale(13633,4633LL<<38),-reale(11288,2771LL<<40),reale(7306,11663LL<<38), -reale(3437,4851LL<<39),real(16896453LL<<38),-real(38239341LL<<34), reale(14056409,0x721b244966e19LL), // C4[18], coeff of eps^18, polynomial in n of order 8 reale(3471,5433LL<<39),-reale(6682,62369LL<<36),reale(11244,10859LL<<37), -reale(16478,49907LL<<36),reale(20837,10809LL<<38), -reale(22258,26821LL<<36),reale(19078,20857LL<<37), -reale(11086,15383LL<<36),reale(2990,191861LL<<33), reale(42169228,0x56516cdc34a4bLL), // C4[19], coeff of eps^26, polynomial in n of order 0 -real(113LL<<37),reale(16591,0x81ae2ec54d8dfLL), // C4[19], coeff of eps^25, polynomial in n of order 1 real(94099LL<<40),-real(1178305LL<<35),reale(2339402,0x6cefc2abb72d3LL), // C4[19], coeff of eps^24, polynomial in n of order 2 real(41263LL<<43),-real(6583LL<<42),-real(117501LL<<36), reale(2339402,0x6cefc2abb72d3LL), // C4[19], coeff of eps^23, polynomial in n of order 3 -real(384159LL<<40),-real(130977LL<<41),real(286571LL<<40), -real(2657049LL<<35),reale(2339402,0x6cefc2abb72d3LL), // C4[19], coeff of eps^22, polynomial in n of order 4 real(64121LL<<46),-real(23919LL<<46),real(6837LL<<45),real(901LL<<46), -real(170289LL<<37),reale(2339402,0x6cefc2abb72d3LL), // C4[19], coeff of eps^21, polynomial in n of order 5 -real(955747LL<<39),-real(1386619LL<<41),real(7599723LL<<39), -real(2983211LL<<40),real(2945369LL<<39),-real(22232175LL<<34), reale(2339402,0x6cefc2abb72d3LL), // C4[19], coeff of eps^20, polynomial in n of order 6 -real(2096679LL<<42),real(4148625LL<<41),-real(841269LL<<43), real(2143479LL<<41),-real(498253LL<<42),real(296429LL<<41), -real(2667861LL<<35),reale(2339402,0x6cefc2abb72d3LL), // C4[19], coeff of eps^19, polynomial in n of order 7 -real(3026933LL<<39),real(2460315LL<<40),-real(7010575LL<<39), real(2166905LL<<41),-real(9101001LL<<39),real(3853577LL<<40), -real(4446435LL<<39),real(38239341LL<<34), reale(2339402,0x6cefc2abb72d3LL), // C4[20], coeff of eps^26, polynomial in n of order 0 -real(34781LL<<40),reale(2459371,0xc7db3c3e5e1bdLL), // C4[20], coeff of eps^25, polynomial in n of order 1 -real(4771LL<<42),-real(28479LL<<38),reale(2459371,0xc7db3c3e5e1bdLL), // C4[20], coeff of eps^24, polynomial in n of order 2 -real(68467LL<<42),real(136501LL<<41),-real(310209LL<<38), reale(2459371,0xc7db3c3e5e1bdLL), // C4[20], coeff of eps^23, polynomial in n of order 3 -real(327189LL<<42),real(20533LL<<43),real(14681LL<<42), -real(78387LL<<38),reale(2459371,0xc7db3c3e5e1bdLL), // C4[20], coeff of eps^22, polynomial in n of order 4 -real(179129LL<<44),real(910389LL<<42),-real(348793LL<<43), real(341479LL<<42),-real(321657LL<<40),reale(2459371,0xc7db3c3e5e1bdLL), // C4[20], coeff of eps^21, polynomial in n of order 5 real(1952379LL<<42),-real(388557LL<<44),real(975677LL<<42), -real(224349LL<<43),real(132447LL<<42),-real(296429LL<<38), reale(2459371,0xc7db3c3e5e1bdLL), // C4[20], coeff of eps^20, polynomial in n of order 6 real(1242423LL<<41),-real(3451175LL<<40),real(1045213LL<<42), -real(4322097LL<<40),real(1810109LL<<41),-real(2075003LL<<40), real(4446435LL<<37),reale(2459371,0xc7db3c3e5e1bdLL), // C4[21], coeff of eps^26, polynomial in n of order 0 -real(199LL<<39),reale(37381,0xc16e795c129fbLL), // C4[21], coeff of eps^25, polynomial in n of order 1 real(65027LL<<42),-real(290455LL<<38),reale(2579341,0x22c6b5d1050a7LL), // C4[21], coeff of eps^24, polynomial in n of order 2 real(1883LL<<46),real(1837LL<<45),-real(18073LL<<40), reale(2579341,0x22c6b5d1050a7LL), // C4[21], coeff of eps^23, polynomial in n of order 3 real(871509LL<<42),-real(326909LL<<43),real(317735LL<<42), -real(1195627LL<<38),reale(2579341,0x22c6b5d1050a7LL), // C4[21], coeff of eps^22, polynomial in n of order 4 -real(29971LL<<46),real(74261LL<<44),-real(16907LL<<45),real(9911LL<<44), -real(44149LL<<39),reale(859780,0x60ece745ac58dLL), // C4[21], coeff of eps^21, polynomial in n of order 5 -real(848003LL<<42),real(252109LL<<44),-real(1027829LL<<42), real(426173LL<<43),-real(485639LL<<42),real(2075003LL<<38), reale(2579341,0x22c6b5d1050a7LL), // C4[22], coeff of eps^26, polynomial in n of order 0 -real(2963LL<<40),reale(117361,0x5360ca6881e97LL), // C4[22], coeff of eps^25, polynomial in n of order 1 real(79LL<<45),-real(363LL<<41),reale(117361,0x5360ca6881e97LL), // C4[22], coeff of eps^24, polynomial in n of order 2 -real(76751LL<<45),real(74129LL<<44),-real(139337LL<<41), reale(2699310,0x7db22f63abf91LL), // C4[22], coeff of eps^23, polynomial in n of order 3 real(102051LL<<45),-real(23023LL<<46),real(13409LL<<45), -real(29733LL<<41),reale(2699310,0x7db22f63abf91LL), // C4[22], coeff of eps^22, polynomial in n of order 4 real(121647LL<<45),-real(489555LL<<43),real(201135LL<<44), -real(227953LL<<43),real(485639LL<<40),reale(2699310,0x7db22f63abf91LL), // C4[23], coeff of eps^26, polynomial in n of order 0 -real(1LL<<45),reale(5837,0x4b04b152e489LL), // C4[23], coeff of eps^25, polynomial in n of order 1 real(377LL<<47),-real(5665LL<<41),reale(122577,0x627628bccbf3dLL), // C4[23], coeff of eps^24, polynomial in n of order 2 -real(57LL<<50),real(33LL<<49),-real(583LL<<42), reale(122577,0x627628bccbf3dLL), // C4[23], coeff of eps^23, polynomial in n of order 3 -real(1269LL<<47),real(517LL<<48),-real(583LL<<47),real(9911LL<<41), reale(122577,0x627628bccbf3dLL), // C4[24], coeff of eps^26, polynomial in n of order 0 -real(83LL<<47),reale(127793,0x718b871115fe3LL), // C4[24], coeff of eps^25, polynomial in n of order 1 real(5LL<<50),-real(11LL<<46),reale(42597,0xd083d7b05caa1LL), // C4[24], coeff of eps^24, polynomial in n of order 2 real(245LL<<49),-real(275LL<<48),real(583LL<<45), reale(127793,0x718b871115fe3LL), // C4[25], coeff of eps^26, polynomial in n of order 0 -real(1LL<<47),reale(8867,0x4cd786c27dde7LL), // C4[25], coeff of eps^25, polynomial in n of order 1 -real(13LL<<50),real(55LL<<46),reale(26601,0xe6869447799b5LL), // C4[26], coeff of eps^26, polynomial in n of order 0 real(1LL<<48),reale(2126,0x8c0e9e949456fLL), }; // count = 4032 #elif GEOGRAPHICLIB_GEODESICEXACT_ORDER == 30 static const real coeff[] = { // C4[0], coeff of eps^29, polynomial in n of order 0 3361,real(109067695), // C4[0], coeff of eps^28, polynomial in n of order 1 real(121722048),real(30168404),real(0x269c465a0c9LL), // C4[0], coeff of eps^27, polynomial in n of order 2 real(21708121824LL),-real(10786479696LL),real(8048130587LL), real(0xbfa33c13e963LL), // C4[0], coeff of eps^26, polynomial in n of order 3 real(0x738319564e0LL),-real(0x4c2475635c0LL),real(0x25d0be52da0LL), real(643173496654LL),real(0xa0f21774b90225LL), // C4[0], coeff of eps^25, polynomial in n of order 4 real(0x7a99ea0a52f40LL),-real(0x5a5f53e2c3b50LL),real(0x3b83d2c0c8da0LL), -real(0x1d8a81cb5cc70LL),real(0x1605bd50459c1LL), real(0x6fb2ae4757107d03LL), // C4[0], coeff of eps^24, polynomial in n of order 5 real(0x2507d929b7f89580LL),-real(0x1ce7bf02c3715a00LL), real(0x15463c23456c8680LL),-real(0xdfecff0050dfd00LL), real(0x6f141ba97196780LL),real(0x1b71ab9c78b8b48LL), reale(1520879,0x957266bcf90f9LL), // C4[0], coeff of eps^23, polynomial in n of order 6 reale(5214,0xb54b8c26f5620LL),-reale(4202,0x4ae5f5bcbf950LL), reale(3272,0xab988a50dfac0LL),-reale(2404,0x84ae60c9e7b30LL), real(0x62be65b26227b760LL),-real(0x30f2645200be8b10LL), real(0x2472ebc3f09ad327LL),reale(9429453,0x6b5ee3606e93bLL), // C4[0], coeff of eps^22, polynomial in n of order 7 reale(213221,0x21fe88963f0e0LL),-reale(174746,0x12fe03af82e40LL), reale(140344,0xd3dfad978d4a0LL),-reale(109009,0x13ee03d15f180LL), reale(79932,0x9fff01479b460LL),-reale(52447,0x53ea945b584c0LL), reale(25976,0xa5a6ee990f820LL),reale(6403,0x87dc4a069efc6LL), reale(273454149,0x29bfc1ec86bafLL), // C4[0], coeff of eps^21, polynomial in n of order 8 reale(1513769,0x9572babb99080LL),-reale(1247902,0x66609b16e1250LL), reale(1017692,0x228016ac84e60LL),-reale(814136,0x86ec313455df0LL), reale(630421,0xa88f591713840LL),-reale(461205,0x487f023b60f90LL), reale(302134,0x36942691aea20LL),-reale(149503,0x5a1d9af94cb30LL), reale(111169,0xb14ab93d4ba6dLL),reale(1367270745,0xd0bec99ea1a6bLL), // C4[0], coeff of eps^20, polynomial in n of order 9 reale(2196138,0xe1b60fe1808c0LL),-reale(1802572,0x3b4b1c2a34200LL), reale(1475191,0x47b8ccbe8340LL),-reale(1196055,0x2e2a401c46980LL), reale(952413,0x117e9e1fb75c0LL),-reale(734856,0x2e19f1e7be100LL), reale(536171,0x8daa599335040LL),-reale(350594,0xa58d466a3880LL), reale(173293,0x7b19cdc9682c0LL),reale(42591,0xb005bdeb82d74LL), reale(1367270745,0xd0bec99ea1a6bLL), // C4[0], coeff of eps^19, polynomial in n of order 10 reale(9954363,0x5ecc5371ca720LL),-reale(8035921,0x7cc90565e0670LL), reale(6522783,0x32e1ec30d1a80LL),-reale(5291286,0x4172ef2beb090LL), reale(4260231,0x65c388ed45de0LL),-reale(3373847,0x4da61e8c704b0LL), reale(2592185,0xcd194d02dbd40LL),-reale(1885401,0xa08c9a20ef6d0LL), reale(1230164,0x4c527bc6a84a0LL),-reale(607279,0x24d6e51bd7af0LL), reale(450701,0xae98337b7d081LL),reale(4101812237LL,0x723c5cdbe4f41LL), // C4[0], coeff of eps^18, polynomial in n of order 11 reale(16160603,0x85a3ec5761ce0LL),-reale(12587219,0x97b7f7c505ac0LL), reale(9979192,0xa0e43863a93a0LL),-reale(7988280,0xcfaf566027f00LL), reale(6410314,0xbffc30c12660LL),-reale(5117692,0xfd9318db4c340LL), reale(4026292,0x94c482b815d20LL),-reale(3077917,0x9c480ad851f80LL), reale(2230377,0x99db799d8bfe0LL),-reale(1451530,0xb0005d9658bc0LL), reale(715485,0xdbe6a2ef6d6a0LL),reale(175141,0x3547b8669b9beLL), reale(4101812237LL,0x723c5cdbe4f41LL), // C4[0], coeff of eps^17, polynomial in n of order 12 reale(30091817,0x8745c27487540LL),-reale(21716256,0x7a4bb1495e170LL), reale(16366670,0xd4e8bc19a0660LL),-reale(12670374,0x9eda0f5df2ed0LL), reale(9963727,0x5ae4f6d3c8380LL),-reale(7887824,0x191034733ae30LL), reale(6231873,0x96448488ef0a0LL),-reale(4863678,0x67c3c74b1b90LL), reale(3695513,0x2e7ae0f4851c0LL),-reale(2665992,0xe6864878c32f0LL), reale(1729741,0xf881cba41aae0LL),-reale(851104,0x888fd5b7ab050LL), reale(629987,0x9ea5a19626943LL),reale(4101812237LL,0x723c5cdbe4f41LL), // C4[0], coeff of eps^16, polynomial in n of order 13 reale(79181861,0x46beef62ca900LL),-reale(45969492,0x85a19d8425400LL), reale(30736937,0x10d9a95bb4f00LL),-reale(22084618,0xaf3a6659fa600LL), reale(16548053,0x58583f22e9500LL),-reale(12711232,0x3d7f1b1be3800LL), reale(9889259,0xbbf5d84b2bb00LL),-reale(7711253,0x36b17889dca00LL), reale(5958759,0x73d1ebe040100LL),-reale(4493987,0xfa374abbe1c00LL), reale(3224517,0x29027e04ea700LL),-reale(2084431,0x8d77e42beee00LL), reale(1023433,0xbf113370eed00LL),reale(249103,0x93cdbdabe0fb0LL), reale(4101812237LL,0x723c5cdbe4f41LL), // C4[0], coeff of eps^15, polynomial in n of order 14 reale(100415733,0x1c7e0d98777e0LL),-reale(220472579,0x196c2a7ff77f0LL), reale(81497972,0xcf48e14d7b2c0LL),-reale(47157604,0xb4c79beff0c90LL), reale(31400333,0x3ade51fc905a0LL),-reale(22437640,0x62c8445afeb30LL), reale(16688020,0xb49b2cc64ec80LL),-reale(12687475,0x35a524f08d7d0LL), reale(9727302,0xc96eb1166e360LL),-reale(7422875,0x3574dc9ff9670LL), reale(5546536,0x3897621326640LL),-reale(3953280,0x7a61d237aeb10LL), reale(2544043,0x942757fc8f120LL),-reale(1245848,0x5f59e2e2499b0LL), reale(918672,0xb7e149f3f515dLL),reale(4101812237LL,0x723c5cdbe4f41LL), // C4[0], coeff of eps^14, polynomial in n of order 15 -reale(410150575,0x33edeefdadd60LL),reale(389451478,0x4a8eb37cf8e40LL), reale(102537774,0xdf54e754057e0LL),-reale(228145792,0x9928ef6984980LL), reale(84014235,0x8c476a1354120LL),-reale(48417903,0x9486b64af140LL), reale(32072368,0xac5157de0d660LL),-reale(22757026,0x6fd3c1d71f100LL), reale(16760216,0x75de552320fa0LL),-reale(12564203,0xce657c7ead0c0LL), reale(9433140,0xee7b325fde4e0LL),-reale(6966096,0xc0a9d97231880LL), reale(4923714,0x7fe1a8c934e20LL),-reale(3150864,0xcacdc5bf45040LL), reale(1538058,0xc6e75548f4360LL),reale(371250,0x9b28ca926da22LL), reale(4101812237LL,0x723c5cdbe4f41LL), // C4[0], coeff of eps^13, polynomial in n of order 16 reale(10071346,0xbead2787bab00LL),reale(77935892,0xc8037e807a610LL), -reale(424974584,0x95c58aa2abc60LL),reale(405632040,0xf37804095de30LL), reale(104709205,0x2c34dddf07040LL),-reale(236671973,0xc06ad427a5bb0LL), reale(86756233,0x36f6256b264e0LL),-reale(49748360,0xa42ca4c379390LL), reale(32735340,0x1aa6eba145580LL),-reale(23012513,0x41e6e60af5570LL), reale(16722020,0xa0e65eb557620LL),-reale(12285046,0x712c138942d50LL), reale(8933912,0x44131ea6cfac0LL),-reale(6247309,0xac4879043a730LL), reale(3969671,0x8774cc7c1760LL),-reale(1929932,0x2a739696c4f10LL), reale(1414943,0x9f9bcb791811fLL),reale(4101812237LL,0x723c5cdbe4f41LL), // C4[0], coeff of eps^12, polynomial in n of order 17 reale(1301009,0x7885767b34dc0LL),reale(3139452,0x6299dbe8eac00LL), reale(10399899,0xe9c2f692aa40LL),reale(80694987,0xafcfc919b1e80LL), -reale(441529449,0x34f14f083e140LL),reale(423985433,0x2e9be95704100LL), reale(106892519,0x9a909730adb40LL),-reale(246219322,0x3cc21ecefbc80LL), reale(89751674,0x8e9ea1f760fc0LL),-reale(51139306,0x4d1fa35b2aa00LL), reale(33357165,0x391836578ec40LL),-reale(23152852,0x670df382e5780LL), reale(16502135,0xfb453b1baa0c0LL),-reale(11755175,0x732a395d89500LL), reale(8105218,0xa64658fb65d40LL),-reale(5103238,0xc9c658d3f3280LL), reale(2468214,0x7d6aacb2351c0LL),reale(588064,0xecbdce72e5104LL), reale(4101812237LL,0x723c5cdbe4f41LL), // C4[0], coeff of eps^11, polynomial in n of order 18 reale(365173,0x141eb92882aa0LL),reale(660579,0x721db1cc80890LL), reale(1339643,0x6f3cff39e7d00LL),reale(3240370,0xc29100e665970LL), reale(10762711,0xac38fa6376f60LL),reale(83769430,0x6edf90fa38050LL), -reale(460180081,0xa7a2c15d05240LL),reale(445039582,0xb96af8d66e930LL), reale(109020126,0x840edc5d1e420LL),-reale(257005247,0x2ec795996fff0LL), reale(93028106,0x54adfb574be80LL),-reale(52565819,0x1d828e2b6cf10LL), reale(33879206,0x109475f98e8e0LL),-reale(23088279,0x158dbde3c1830LL), reale(15975944,0x7a6ca24c70f40LL),-reale(10806612,0x3c0d699b76f50LL), reale(6721635,0xd5a36326ddda0LL),-reale(3228909,0xe44dc20d06870LL), reale(2345355,0x81bdf10588059LL),reale(4101812237LL,0x723c5cdbe4f41LL), // C4[0], coeff of eps^10, polynomial in n of order 19 reale(142358,0x43f28ef2bce60LL),reale(224104,0xc49bf70fb8540LL), reale(374789,0x29edb81ed2220LL),reale(679606,0x56dce126b3a00LL), reale(1381751,0x3315a15e701e0LL),reale(3351469,0xe4cb186e3aec0LL), reale(11166107,0x295c18ed1d5a0LL),reale(87224183,0xbf27e3cc5cb80LL), -reale(481408924,0xf800e4fbbfaa0LL),reale(469519077,0x9e18ca33e7840LL), reale(110970854,0x606788cedf920LL),-reale(269315695,0x90dadb20d6300LL), reale(96606791,0x8c213171618e0LL),-reale(53972000,0xd509f5454de40LL), reale(34191407,0x9021dc5d4cca0LL),-reale(22654105,0x9f8b9187f1180LL), reale(14912791,0x946e9b2907c60LL),-reale(9121084,0x6067cd3f714c0LL), reale(4341360,0x73b562399020LL),reale(1011849,0x75de66a5bdb46LL), reale(4101812237LL,0x723c5cdbe4f41LL), // C4[0], coeff of eps^9, polynomial in n of order 20 reale(66631,0x784cbdfb1b2c0LL),reale(96606,0x3419bb8e05f90LL), reale(145459,0xb79bffbfb42e0LL),reale(229589,0x824d22506cd30LL), reale(385010,0x35e34fd0f4f00LL),reale(700134,0x4df5413db48d0LL), reale(1427794,0x581b23c083b20LL),reale(3474469,0x224df4c0f7670LL), reale(11618119,0x6c8cba4306b40LL),reale(91144571,0x713d14f45fa10LL), -reale(505869523,0xd3d937aa3bca0LL),reale(498449385,0x686859af477b0LL), reale(112524504,0x2ca5b0e042780LL),-reale(283533725,0xba4eec11a6cb0LL), reale(100487121,0xc424152de7ba0LL),-reale(55236514,0x8c4dd4ee50f10LL), reale(34077723,0x322bbe9b9a3c0LL),-reale(21528502,0x2ca44d130cb70LL), reale(12851809,0x7f1d30d5603e0LL),-reale(6038295,0xecbfc0da7fdd0LL), reale(4313665,0xa0fbedf62e95bLL),reale(4101812237LL,0x723c5cdbe4f41LL), // C4[0], coeff of eps^8, polynomial in n of order 21 reale(34939,0x4781a8598a880LL),reale(47986,0x870a153a0ba00LL), reale(67643,0xf93c5a3d5fb80LL),reale(98366,0xdef5527b5d100LL), reale(148567,0x565e4f7b51e80LL),reale(235242,0x766e64b79c800LL), reale(395796,0x5614c84bc3180LL),reale(722239,0xc9f1a6fcbf00LL), reale(1478257,0xd3352c2795480LL),reale(3611438,0xfdbc40cced600LL), reale(12129091,0x5ec9e3d72a780LL),reale(95645231,0xe79e249b02d00LL), -reale(534473300,0x6333290e9b580LL),reale(533336700,0xd7635e240e400LL), reale(113268651,0x31e09daaa5d80LL),-reale(300181610,0x6cd38634ee500LL), reale(104606327,0x6a6e0bd3d0080LL),-reale(56090968,0xcfc000b8f0e00LL), reale(33084425,0x428f85e945380LL),-reale(19025074,0x3fea5ea1f7700LL), reale(8768855,0x59c11511e7680LL),reale(1959911,0x57aea52b92dd8LL), reale(4101812237LL,0x723c5cdbe4f41LL), // C4[0], coeff of eps^7, polynomial in n of order 22 reale(19712,0xac93bc6991f60LL),reale(26064,0x47e63bb6f7b10LL), reale(35129,0x85349dd791940LL),reale(48412,0xcf2b50a5e4170LL), reale(68486,0xf23457a2e7b20LL),reale(99959,0x1aee9379bdd0LL), reale(151547,0xc976e86422100LL),reale(240911,0x67a8290f88c30LL), reale(407002,0x79f859786e6e0LL),reale(745880,0xf6e3b80f24890LL), reale(1533569,0xcfffb4a9fa8c0LL),reale(3764807,0xab1a08cbd8ef0LL), reale(12712489,0x4098eb8542a0LL),reale(100884327,0x9a754746dfb50LL), -reale(568536969,0xbcc82f5b36f80LL),reale(576497219,0x10ca042b229b0LL), reale(112392819,0xaecaa4a6c6e60LL),-reale(319979712,0xfe05e4aae49f0LL), reale(108728942,0x9b1cd9ac3b840LL),-reale(55904982,0xfebe8a174c390LL), reale(30158727,0xd0df7149f4a20LL),-reale(13482566,0x2ca2af46da730LL), reale(9304222,0x6328f1d67a7f5LL),reale(4101812237LL,0x723c5cdbe4f41LL), // C4[0], coeff of eps^6, polynomial in n of order 23 reale(11639,0x4298ebe4bc020LL),reale(14966,0xe9089607c0a40LL), reale(19534,0x1996a62965260LL),reale(25928,0xdcaffa7bfcb80LL), reale(35089,0x59fa64f7d88a0LL),reale(48563,0x32ed377221cc0LL), reale(69004,0xe5c9403173ae0LL),reale(101181,0xf483b00105600LL), reale(154143,0xf39432e434120LL),reale(246274,0xfc90899a3cf40LL), reale(418255,0xdad9486cf7360LL),reale(770731,0xbf0321b55e080LL), reale(1593877,0xd61fe95ba9a0LL),reale(3937200,0x3820413b3e1c0LL), reale(13385919,0xf48ca237dbbe0LL),reale(107086956,0x9d1b10f932b00LL), -reale(610048075,0x6c1b2715a7de0LL),reale(631706048,0xcac1d46451440LL), reale(108187733,0xaf9fd1440d460LL),-reale(343908890,0x37b3c0b50a80LL), reale(112109635,0x3a73d439f8aa0LL),-reale(53028119,0x15d1799f5d940LL), reale(22454404,0x49a70d2177ce0LL),reale(4553016,0x22f700960daaaLL), reale(4101812237LL,0x723c5cdbe4f41LL), // C4[0], coeff of eps^5, polynomial in n of order 24 reale(7030,0x634f92bbfec80LL),reale(8852,0x183ea9c784b10LL), reale(11280,0x864427e0ea420LL),reale(14569,0x4ed71f4155e30LL), reale(19103,0x13b2c1ad2ffc0LL),reale(25480,0x35983eb20bf50LL), reale(34659,0x18ad59c5f9360LL),reale(48227,0x95f2c0574270LL), reale(68917,0x8c5b3ac32f300LL),reale(101660,0x272f49f96bb90LL), reale(155850,0xbc628b339b2a0LL),reale(250657,0x122490d07feb0LL), reale(428675,0x21f5a97506640LL),reale(795748,0x8d9dd2ee8dfd0LL), reale(1658420,0x22b44d2c5a1e0LL),reale(4130702,0x814b60cb632f0LL), reale(14171990,0xb8691b29bf980LL),reale(114585240,0x7599d8275cc10LL), -reale(662180135,0x55c1167b3fee0LL),reale(705602404,0xf6219ee07f30LL), reale(96655880,0xe42cfbbc64cc0LL),-reale(373149978,0xd8d5a94d3dfb0LL), reale(112272021,0x704341a757060LL),-reale(42251989,0xbf5a94cca7c90LL), reale(26498553,0xea37274059c77LL),reale(4101812237LL,0x723c5cdbe4f41LL), // C4[0], coeff of eps^4, polynomial in n of order 25 reale(4244,0x3972351df5940LL),reale(5257,0xaa8f87b5d5600LL), reale(6578,0xed6cb3b3fa2c0LL),reale(8324,0xb4008d853180LL), reale(10662,0x703b07259b440LL),reale(13846,0x8f2f6ca125d00LL), reale(18261,0x3a455b4269dc0LL),reale(24508,0x5045fb81ae880LL), reale(33557,0x1b3e945f36f40LL),reale(47022,0x9499ec44e400LL), reale(67699,0x7a940285938c0LL),reale(100662,0x403646e1e5f80LL), reale(155637,0xf20897fb50a40LL),reale(252593,0x7106d86756b00LL), reale(436178,0xe720d891ff3c0LL),reale(818051,0x1d79595b01680LL), reale(1723706,0xc365c92e70540LL),reale(4344105,0xb055b91247200LL), reale(15096896,0xe96c54f834ec0LL),reale(123888911,0x435c586708d80LL), -reale(730395130,0x8d07d85ee1fc0LL),reale(811137162,0xd7ccf03d27900LL), reale(66848989,0xdd39a234bc9c0LL),-reale(407950245,0xd67367b7fbb80LL), reale(99073631,0x21cb91dfe1b40LL),reale(14205410,0x589c3f44ce7acLL), reale(4101812237LL,0x723c5cdbe4f41LL), // C4[0], coeff of eps^3, polynomial in n of order 26 reale(2481,0x8d2c27b46b620LL),reale(3034,0xe44720f3fdf90LL), reale(3743,0xf82fc54a92780LL),reale(4662,0xb922ac44f6b70LL), reale(5867,0xae02c805f08e0LL),reale(7469,0x40a687e9b4d50LL), reale(9629,0xbb2099bca6640LL),reale(12592,0xa0727e14e5130LL), reale(16731,0xdc4cfea134ba0LL),reale(22636,0xbf84f9dc44310LL), reale(31263,0xfe99294d5c500LL),reale(44220,0x78f2e666feef0LL), reale(64313,0xe77c1f84fde60LL),reale(96684,0x43c9282e120d0LL), reale(151281,0x84eb0984fa3c0LL),reale(248729,0xa2c4a502aa4b0LL), reale(435615,0xd80deb212120LL),reale(829647,0x194fc60e84690LL), reale(1777619,0x17dfea7bc6280LL),reale(4562307,0x417bb8824d270LL), reale(16175470,0xd3a7db47373e0LL),reale(135804489,0xbb999e2601450LL), -reale(825156505,0xa8162cc9f9ec0LL),reale(977623624,0xd8c5ee7f4d830LL), -reale(20397512,0x4ab8f862cc960LL),-reale(435632583,0xf2b7943e115f0LL), reale(143237887,0xa8277df5ccab1LL),reale(4101812237LL,0x723c5cdbe4f41LL), // C4[0], coeff of eps^2, polynomial in n of order 27 real(0x52cac993243497e0LL),real(0x6437dfaee57b9d40LL), real(0x7a3f9cad4d2f48a0LL),reale(2405,0xee01eec3f2b00LL), reale(2986,0x65a22988df560LL),reale(3743,0xe8ba104bd58c0LL), reale(4745,0x82561551e620LL),reale(6086,0xa7581d3ddee80LL), reale(7912,0x8561dfdd262e0LL),reale(10440,0x7aa2aab74b440LL), reale(14008,0x9b1a2c148b3a0LL),reale(19155,0xcd3b8407d7200LL), reale(26767,0x9792b4f9c2060LL),reale(38350,0xb50c17257efc0LL), reale(56574,0xaf828f4edf120LL),reale(86399,0xb1bc40483f580LL), reale(137581,0x7d29442656de0LL),reale(230687,0xc9059cc5d4b40LL), reale(413025,0xcba5d91bbdea0LL),reale(806439,0xbad85d457b900LL), reale(1777226,0xdb254a1088b60LL),reale(4709200,0x187f6563b06c0LL), reale(17312174,0x4c53d944cbc20LL),reale(151524377,0x682a2ddefc80LL), -reale(970338799,0x73aba5c04720LL),reale(1287957204,0xb756685e76240LL), -reale(416692036,0xd1e73fe253660LL),-reale(78129756,0xe75b5bfa6fa32LL), reale(4101812237LL,0x723c5cdbe4f41LL), // C4[0], coeff of eps^1, polynomial in n of order 28 real(0xb4c355cd41c92c0LL),real(0xd8fea3a41cc7830LL), real(0x1064f0c6b9a6ad20LL),real(0x13f7a88902ef1b10LL), real(0x1884a414973fcb80LL),real(0x1e5fa2ae5243d7f0LL), real(0x25fe0bb384ddd9e0LL),real(0x3006f6e3e0e25ad0LL), real(0x3d6c2c13c34ec440LL),real(0x4f91f34825bd4fb0LL), real(0x688ffb74f98676a0LL),reale(2233,0xdec33bb086290LL), reale(3036,0xe53843c2cdd00LL),reale(4213,0xb13e1137e3f70LL), reale(5984,0xaa1cca8abe360LL),reale(8732,0xb9880d6c69250LL), reale(13152,0x1eadcfcfd75c0LL),reale(20566,0x4e1752c3c0730LL), reale(33653,0xf4262a5798020LL),reale(58247,0x3a420e3524a10LL), reale(108257,0x7934f39e3ee80LL),reale(221025,0xaccc1c0dc06f0LL), reale(514222,0xffbb852faace0LL),reale(1456965,0x29e8a4070e9d0LL), reale(5827860,0xa7a2901c3a740LL),reale(56821641,0x6270fd1339eb0LL), -reale(416692036,0xd1e73fe253660LL),reale(625038055,0x3adadfd37d190LL), -reale(273454149,0x29bfc1ec86bafLL),reale(1367270745,0xd0bec99ea1a6bLL), // C4[0], coeff of eps^0, polynomial in n of order 29 reale(42171,0xbca3d5a569b4LL),reale(46862,0xd0a41cdef9cf0LL), reale(52277,0xa2d5316ac1b2cLL),reale(58560,0x6f94d669a7a28LL), reale(65892,0x788629d238da4LL),reale(74502,0x6b99bdf690d60LL), reale(84681,0x87b277eadbb1cLL),reale(96804,0x8c76c6701c898LL), reale(111359,0x1427f62cd3d94LL),reale(128987,0x59921e2221dd0LL), reale(150546,0xaa0136eb20f0cLL),reale(177198,0x7742592373f08LL), reale(210542,0x4360b9bd64984LL),reale(252821,0x8a8c09196de40LL), reale(307248,0x66986780ae6fcLL),reale(378530,0x79d0ac77ed78LL), reale(473750,0x5114d83948174LL),reale(603901,0x80acdb5cb5eb0LL), reale(786661,0x2afc1dbf812ecLL),reale(1051686,0xda8ab314e3e8LL), reale(1451326,0xc0ede2017b564LL),reale(2083956,0x5d3b51a63af20LL), reale(3149615,0xde5c8fc3f62dcLL),reale(5099378,0x12ae3e18b3258LL), reale(9106032,0x45ee012c1b554LL),reale(18940547,0x20d0545bbdf90LL), reale(52086504,0x9a3ce7fc4a6ccLL),reale(312519027,0x9d6d6fe9be8c8LL), -reale(1093816596,0xa6ff07b21aebcLL), reale(2734541491LL,0xa17d933d434d6LL), reale(4101812237LL,0x723c5cdbe4f41LL), // C4[1], coeff of eps^29, polynomial in n of order 0 917561,real(273868982145LL), // C4[1], coeff of eps^28, polynomial in n of order 1 -real(125915776),real(90505212),real(0x73d4d30e25bLL), // C4[1], coeff of eps^27, polynomial in n of order 2 -real(0x2f7e4f2fca0LL),real(0x161b06db8f0LL),real(379339642199LL), real(0x145a25f15d59339LL), // C4[1], coeff of eps^26, polynomial in n of order 3 -real(0x780f9f651c0LL),real(0x49cd6538080LL),-real(0x275396e6f40LL), real(0x1c1406225eaLL),real(0x1e2d6465e2b066fLL), // C4[1], coeff of eps^25, polynomial in n of order 4 -real(0x226e68a74f6c2c0LL),real(0x178fbd94c6e4130LL), -real(0x10bafa7048ffb60LL),real(0x7b204e43552d10LL), real(0x1ebd785c76c649LL),reale(369943,0xaebaf6655156dLL), // C4[1], coeff of eps^24, polynomial in n of order 5 -real(0x26adfa4c2bcf8500LL),real(0x1be7e116f09bc400LL), -real(0x1641521374362300LL),real(0xd7dd4a2b1831200LL), -real(0x7449d087ac65100LL),real(0x525502d56a2a1d8LL), reale(4562638,0xc0573436eb2ebLL), // C4[1], coeff of eps^23, polynomial in n of order 6 -reale(27299,0x1e7fae46f2ae0LL),reale(20250,0xb050f61211530LL), -reale(17170,0x1ccacfb407b40LL),reale(11560,0x5557506ac7a50LL), -reale(8300,0x1ee1dfec0f3a0LL),reale(3760,0xc5da39149a170LL), real(0x3aaaad07e2dbe15fLL),reale(141441801,0x4a8f52a67aa75LL), // C4[1], coeff of eps^22, polynomial in n of order 7 -reale(223720,0xada70de871dc0LL),reale(168212,0x95f7a36b8e780LL), -reale(147708,0x4639d71413140LL),reale(104570,0x398040c96dd00LL), -reale(84304,0x27ca2fe2f28c0LL),reale(50205,0xd862a9f308280LL), -reale(27426,0xbe7e08935dc40LL),reale(19210,0x9794de13dcf52LL), reale(820362447,0x7d3f45c59430dLL), // C4[1], coeff of eps^21, polynomial in n of order 8 -reale(1591044,0x45108afb80980LL),reale(1200725,0xfaaefe8d2aff0LL), -reale(1074110,0x244b18cc1fd20LL),reale(779463,0x6e55e2794e4d0LL), -reale(667443,0x7f273db50d4c0LL),reale(440073,0xbd38cdf5ffbb0LL), -reale(320490,0xb0902bc064460LL),reale(142410,0x1eb038cc00090LL), reale(35531,0x5cce3f7afbb81LL),reale(4101812237LL,0x723c5cdbe4f41LL), // C4[1], coeff of eps^20, polynomial in n of order 9 -reale(6932123,0xff59c6bb56f80LL),reale(5207764,0x9d4c81592dc00LL), -reale(4682178,0xdef9cf054a880LL),reale(3431350,0xdcd7f0ab97d00LL), -reale(3036244,0xeb9781cfe3980LL),reale(2097463,0x35c6f48ae00LL), -reale(1714507,0xab45478b85280LL),reale(997568,0xe75b4df283f00LL), -reale(555001,0x356f72a492380LL),reale(383325,0x3033ad4799914LL), reale(12305436712LL,0x56b51693aedc3LL), // C4[1], coeff of eps^19, polynomial in n of order 10 -reale(10475274,0x80e3f984eb560LL),reale(7761418,0x6cb2d37d31d50LL), -reale(6912729,0x2574b8548f80LL),reale(5061056,0xbff13b9f8e7b0LL), -reale(4542234,0x9c8561f8559a0LL),reale(3202970,0x45874de1c0010LL), -reale(2776395,0x2331e9957c0LL),reale(1780809,0x24244086de270LL), -reale(1321308,0xb7d4404aacde0LL),reale(572110,0xf0d923e3d0ad0LL), reale(142666,0x15ad08c690505LL),reale(12305436712LL,0x56b51693aedc3LL), // C4[1], coeff of eps^18, polynomial in n of order 11 -reale(16991539,0x3bfa3a952a5c0LL),reale(12232630,0xc216625651e80LL), -reale(10582386,0xca84c044c7740LL),reale(7659664,0x22fef68736200LL), -reale(6852368,0xbf4b993050cc0LL),reale(4854746,0x78ae9dfa88580LL), -reale(4332124,0x5850c11d91e40LL),reale(2896859,0x8330e6242d100LL), -reale(2410777,0x3c4e4b27563c0LL),reale(1359574,0x6f5bc7e308c80LL), -reale(775169,0xf705a84369540LL),reale(525423,0x9fd72933d2d3aLL), reale(12305436712LL,0x56b51693aedc3LL), // C4[1], coeff of eps^17, polynomial in n of order 12 -reale(31605635,0x9b2a6245129c0LL),reale(21349095,0xec111ef51efd0LL), -reale(17343382,0xc6b59d854f620LL),reale(12224940,0xad54b9902f0LL), -reale(10665275,0xcb2c9d1586680LL),reale(7495419,0x2bbe593f97c10LL), -reale(6731026,0x5bd11498926e0LL),reale(4567553,0xbb95797dfef30LL), -reale(4019270,0xe17fb3dce340LL),reale(2483542,0x18261977df050LL), -reale(1889445,0x252a3b83f47a0LL),reale(789608,0x3727b34041370LL), reale(196748,0x5030b26b63d7fLL),reale(12305436712LL,0x56b51693aedc3LL), // C4[1], coeff of eps^16, polynomial in n of order 13 -reale(83651327,0x7df35b769ce00LL),reale(46183264,0x6a662d0fec800LL), -reale(32523895,0xbf44a3e60200LL),reale(21575930,0xbd1dba7599c00LL), -reale(17706525,0xdbcb8c6749600LL),reale(12151631,0x7c587583d3000LL), -reale(10707728,0xa79806e6f4a00LL),reale(7245171,0x8aa6d7e27c400LL), -reale(6517082,0x9ff2c462fde00LL),reale(4168671,0x7a21919979800LL), -reale(3551918,0x26047c5101200LL),reale(1918361,0x786d4fd8aec00LL), -reale(1131511,0x7e7a26769a600LL),reale(747310,0xbb693903a2f10LL), reale(12305436712LL,0x56b51693aedc3LL), // C4[1], coeff of eps^15, polynomial in n of order 14 -reale(63372442,0x2cb5338504ea0LL),reale(236021120,0xed659df2db350LL), -reale(86667901,0x5273be9be40LL),reale(47209611,0xc1161d91d1e30LL), -reale(33537857,0x3d1f3cdba35e0LL),reale(21739691,0xd5c3b2c9df710LL), -reale(18074666,0x2123c601d8980LL),reale(11984705,0x3d2e52a8729f0LL), -reale(10682808,0x1cfcfab158d20LL),reale(6875060,0xeec2e9924a2d0LL), -reale(6158904,0xf3892aedc14c0LL),reale(3612073,0x775a08e9d4db0LL), -reale(2844696,0x4fdad4b74f460LL),reale(1130419,0xe52285ff91690LL), reale(281319,0xf8ed6ce679421LL),reale(12305436712LL,0x56b51693aedc3LL), // C4[1], coeff of eps^14, polynomial in n of order 15 reale(377918798,0xab0ca9f0672c0LL),-reale(418618018,0x8099eba53f80LL), -reale(60854873,0x3eafa33f453c0LL),reale(245263030,0xf5560cf897d00LL), -reale(90083330,0xb4182a1e90640LL),reale(48226005,0xa87e22e4ae980LL), -reale(34666917,0x2b03feac26cc0LL),reale(21804113,0xa9bac4593e00LL), -reale(18434597,0x75e58711b4f40LL),reale(11683388,0x18da60c9eb280LL), -reale(10544255,0x717858fde75c0LL),reale(6335167,0xce8110cc57f00LL), -reale(5568830,0x1a6ca9ba6a840LL),reale(2826076,0xf4ab3cac7db80LL), -reale(1750284,0x2ff80145eaec0LL),reale(1113751,0xd17a5fb748e66LL), reale(12305436712LL,0x56b51693aedc3LL), // C4[1], coeff of eps^13, polynomial in n of order 16 -reale(7676111,0x5b2a6c5f6c100LL),-reale(64415807,0x4cf1fd08a9430LL), reale(389009273,0x614b445047d20LL),-reale(437396877,0xd309fa5941090LL), -reale(57368388,0x6af986a1a0c0LL),reale(255600151,0x61702d3245910LL), -reale(94005962,0x2924b0b2256a0LL),reale(49188288,0xa4967a4d0acb0LL), -reale(35935634,0xccf0586b2e080LL),reale(21713831,0x3869a07cfee50LL), -reale(18759173,0xcf3c8197a7a60LL),reale(11187408,0x277eed08021f0LL), -reale(10209411,0xbc33094486040LL),reale(5549613,0x5f33e35304b90LL), -reale(4590963,0x90f6e6e49ce20LL),reale(1692490,0x5de933ef26f30LL), reale(420297,0x50d0b3d8c1d9bLL),reale(12305436712LL,0x56b51693aedc3LL), // C4[1], coeff of eps^12, polynomial in n of order 17 -reale(852919,0x6a82cfa963080LL),-reale(2188759,0x20ca5d762f800LL), -reale(7786929,0x3421dcca91f80LL),-reale(65787035,0x1d560be049100LL), reale(401061675,0x8c48395cfc980LL),-reale(458713135,0x22175c326fa00LL), -reale(52544362,0x54a9b8a28c580LL),reale(267237346,0x9f71e62ba7d00LL), -reale(98592445,0x567d144d01c80LL),reale(50019657,0x7efcd81e48400LL), -reale(37374118,0xabf7952238b80LL),reale(21383288,0xfc61768bbcb00LL), -reale(18992011,0x5234632e06280LL),reale(10406178,0xe1fef86250200LL), -reale(9523344,0xe57e66503f180LL),reale(4398013,0x8a16c0de4d900LL), -reale(2932033,0xa738784cb8880LL),reale(1764194,0xc6396b58af30cLL), reale(12305436712LL,0x56b51693aedc3LL), // C4[1], coeff of eps^11, polynomial in n of order 18 -reale(210362,0x76b369d3025e0LL),-reale(399459,0x1eaf9acef0ab0LL), -reale(856141,0xe229f972ba700LL),-reale(2206922,0xef935c87bb50LL), -reale(7896496,0x6b0bc697c0820LL),-reale(67217074,0x2cc6331df1df0LL), reale(414202467,0x2b5605d0252c0LL),-reale(483149583,0xa02db175d690LL), -reale(45836711,0xc18042256fa60LL),reale(280420397,0xa9af8baa076d0LL), -reale(104078404,0x7a91f5b525380LL),reale(50585814,0x9d940e3bb2630LL), -reale(39015494,0x6a69555b81ca0LL),reale(20678727,0x5f0f1f3a9390LL), -reale(19012332,0x416957968b9c0LL),reale(9200947,0xc21b589061af0LL), -reale(8178296,0xad1e8ab768ee0LL),reale(2676456,0xd6956da2a1850LL), reale(661843,0xede00571b821dLL),reale(12305436712LL,0x56b51693aedc3LL), // C4[1], coeff of eps^10, polynomial in n of order 19 -reale(73282,0x88acf774cdcc0LL),-reale(119856,0xfafc4232d6980LL), -reale(209310,0xc95dad3d9d040LL),-reale(398728,0xc3246fdb30c00LL), -reale(857927,0x8ca89fdf097c0LL),-reale(2222415,0x7f22a8f79ee80LL), -reale(8002412,0xa401cae100b40LL),-reale(68698832,0xcf05dd2d1e900LL), reale(428572510,0x4af905b8fd40LL),-reale(511480829,0xaa7af93dad380LL), -reale(36412636,0xa51695c145640LL),reale(295430858,0x62539c3ab7a00LL), -reale(110834541,0xf7ac6a286ddc0LL),reale(50648730,0xf42d6a1912780LL), -reale(40882711,0xc825af61d7140LL),reale(19389515,0xc578a6be65d00LL), -reale(18548541,0x30b0433e6e8c0LL),reale(7353872,0xa4f0c77ab4280LL), -reale(5517208,0xc642445621c40LL),reale(3035548,0x619b33f1391d2LL), reale(12305436712LL,0x56b51693aedc3LL), // C4[1], coeff of eps^9, polynomial in n of order 20 -reale(31116,0x5ced59f2a6a40LL),-reale(46466,0x39ef1648a3c30LL), -reale(72339,0x13bec712995a0LL),-reale(118591,0xe96704ee23c10LL), -reale(207681,0xf3272ddf69500LL),-reale(396975,0x5586a3fda15f0LL), -reale(857776,0x96a9e394d3460LL),-reale(2234014,0x9c760527155d0LL), -reale(8101033,0x1f3b77f93fc0LL),-reale(70217181,0xc7476a97287b0LL), reale(444320933,0x84d59896b7ce0LL),-reale(544755366,0x60ab42e093790LL), -reale(22958170,0x5fc77e584ca80LL),reale(312550991,0xea91e4bc80e90LL), -reale(119474190,0x655c7a979e1e0LL),reale(49778595,0x69cfb591beb0LL), -reale(42938053,0xad555dfab9540LL),reale(17185991,0x9567a8e814cd0LL), -reale(16947236,0xc941a0517b0a0LL),reale(4507394,0xb6bfddcb2cf0LL), reale(1103154,0xee71952935057LL),reale(12305436712LL,0x56b51693aedc3LL), // C4[1], coeff of eps^8, polynomial in n of order 21 -reale(15013,0x669ca85dbff00LL),-reale(21081,0x7f4d799198400LL), -reale(30470,0xbdb587d74d900LL),-reale(45587,0xe4badb51b1a00LL), -reale(71124,0x646ea35b6300LL),-reale(116891,0x8adb62aa4d000LL), -reale(205315,0x1aa2ab2ec7d00LL),-reale(393884,0x4b8d8eda78600LL), -reale(855000,0x2faa553050700LL),-reale(2239966,0xb31164c141c00LL), -reale(8186764,0x97347e701e100LL),-reale(71742883,0x7f111739b7200LL), reale(461586973,0x9a516d5401500LL),-reale(584418823,0xe1245bd6e6800LL), -reale(3315305,0x14110f9c0500LL),reale(331936814,0x28269ca022200LL), -reale(131069117,0x7ee7ad0730f00LL),reale(47184778,0x227a729454c00LL), -reale(44897669,0x9cd1b2a1e900LL),reale(13574545,0xcd96a182a3600LL), -reale(12485695,0x45db16a057300LL),reale(5879734,0x70bef82b8988LL), reale(12305436712LL,0x56b51693aedc3LL), // C4[1], coeff of eps^7, polynomial in n of order 22 -reale(7900,0x638c66d8a8320LL),-reale(10613,0xf2ac3092c9cb0LL), -reale(14565,0xe107ae27501c0LL),-reale(20489,0xead89ce414d0LL), -reale(29670,0x849ce08edf860LL),-reale(44482,0xeb1f022729ef0LL), -reale(69562,0xbdfcfee35b00LL),-reale(114632,0x975e8fa16f10LL), -reale(201989,0x9411d71111da0LL),-reale(389021,0x33d7ff034b930LL), -reale(848628,0xc0285ec233440LL),-reale(2237713,0xb97d9ca55b150LL), -reale(8250880,0x9132887d792e0LL),-reale(73221392,0xf1ffe05c8b70LL), reale(480452831,0x383b5471fd280LL),-reale(632496874,0xca3591eba7b90LL), reale(26233104,0x13df159bb07e0LL),reale(353203487,0x101c2c33c4a50LL), -reale(147596513,0x7a337ff05e6c0LL),reale(41406718,0x88562e0e69230LL), -reale(45513246,0x22b5bfcbced60LL),reale(7934370,0xa8c8e9d8c2810LL), reale(1869414,0xdc5c61854a479LL),reale(12305436712LL,0x56b51693aedc3LL), // C4[1], coeff of eps^6, polynomial in n of order 23 -reale(4406,0xf939ae5c97c40LL),-reale(5729,0xf863eba5bf80LL), -reale(7570,0xa927e082c4c0LL),-reale(10189,0xdc3d2b5930900LL), -reale(14011,0xfd72406188940LL),-reale(19751,0x4ee9330f94280LL), -reale(28665,0xa6c18d00fb1c0LL),-reale(43078,0xe8ed052a45400LL), -reale(67543,0xd4150add2640LL),-reale(111634,0xb28e55bb02580LL), -reale(197389,0xccdd68505cec0LL),-reale(381765,0x22e00b9b89f00LL), -reale(837258,0xa000eefe9340LL),-reale(2223425,0xd3d15b309a880LL), -reale(8279438,0xc28db224c5bc0LL),-reale(74551261,0xb7816e54f2a00LL), reale(500824278,0x3891b999befc0LL),-reale(691847154,0x918a2dd450b80LL), reale(72461747,0xa045596356740LL),reale(374046829,0x41b777218cb00LL), -reale(172833056,0x62b9485f4dd40LL),reale(29915148,0x80284d25e7180LL), -reale(39423763,0x40d338467c5c0LL),reale(13659048,0x68e501c228ffeLL), reale(12305436712LL,0x56b51693aedc3LL), // C4[1], coeff of eps^5, polynomial in n of order 24 -reale(2545,0x1363104362d80LL),-reale(3226,0xe67b1424a4830LL), -reale(4144,0x8c711302fa660LL),-reale(5400,0xc1bfe2853af90LL), -reale(7153,0xb2c26c1682b40LL),-reale(9653,0x9e8ef4e7cf0f0LL), -reale(13308,0xeb09aee491820LL),-reale(18810,0x561040fe22850LL), -reale(27375,0xc35e0fb3fc900LL),-reale(41260,0x7d7f41fc271b0LL), -reale(64893,0xc7a96414399e0LL),-reale(107622,0xe02e2157de910LL), -reale(191035,0x6ce8a0a1be6c0LL),-reale(371181,0x96988a373aa70LL), -reale(818768,0xa91a46aa60ba0LL),-reale(2191167,0x9fde37effd1d0LL), -reale(8249435,0xe27cdc35b6480LL),-reale(75540143,0x55cc77d97b30LL), reale(522119910,0xf5aa540a8b2a0LL),-reale(766397212,0x64559a510c290LL), reale(148547296,0x8152775e2ddc0LL),reale(385247751,0x81b301a133c10LL), -reale(213402544,0x90fce845e3f20LL),reale(10198756,0x255c7c31664b0LL), reale(1365904,0xd74a19c69db33LL),reale(12305436712LL,0x56b51693aedc3LL), // C4[1], coeff of eps^4, polynomial in n of order 25 -real(0x5cd20bbc3c672180LL),-real(0x73720b2d98187c00LL), -reale(2321,0xc4eb857568680LL),-reale(2952,0xb2617088c8f00LL), -reale(3804,0x417bd8fa2e380LL),-reale(4973,0x5ec86f601d200LL), -reale(6609,0x998272f30a880LL),-reale(8950,0x197c7ab46b500LL), -reale(12382,0xcc481e2a44580LL),-reale(17565,0x5f7861969a800LL), -reale(25660,0x4a6f330e22a80LL),-reale(38825,0xe447100991b00LL), -reale(61313,0x47573aa0ec780LL),-reale(102123,0xa55bb6037e00LL), -reale(182121,0xfb4d0590e8c80LL),-reale(355742,0x340be91b74100LL), -reale(789743,0xf318e4285e980LL),-reale(2131260,0x2c59b0f82d400LL), -reale(8121193,0x3f9cc7c594e80LL),-reale(75808472,0x814742dd4a700LL), reale(542406027,0xe15955752d480LL),-reale(860719085,0xb088c959b2a00LL), reale(281794203,0x6d691a09a0f80LL),reale(349671639,0x4a19c69db3300LL), -reale(268081590,0x1f35e51280d80LL),reale(42616231,0x9d4bdce6b704LL), reale(12305436712LL,0x56b51693aedc3LL), // C4[1], coeff of eps^3, polynomial in n of order 26 -real(0x34f88b61ee2c2e60LL),-real(0x40e8b73250ad02b0LL), -real(0x50402824a1190680LL),-real(0x643133a56bf6de50LL), -real(0x7e70b50d7e53aea0LL),-reale(2583,0x89ee9103c6bf0LL), -reale(3343,0x2d56b6f20aac0LL),-reale(4390,0x9150bee746f90LL), -reale(5862,0xecb9ee1767ee0LL),-reale(7978,0x9b4551158ad30LL), -reale(11096,0x13774a5e7af00LL),-reale(15825,0x3f23db737e8d0LL), -reale(23248,0xf45a340cbf20LL),-reale(35380,0xaf4478627e670LL), -reale(56209,0x8a81f32e3340LL),-reale(94205,0x2f98ae2576a10LL), -reale(169093,0xeae4ad4ee8f60LL),-reale(332577,0xf0ed8664037b0LL), -reale(743995,0x906300fb45780LL),-reale(2026493,0x9c6e844791350LL), -reale(7821602,0x7531c16940fa0LL),-reale(74557824,0x1ed43b2e7c0f0LL), reale(555703654,0x34418f385c440LL),-reale(974709694,0x84f4a67130490LL), reale(527421389,0x42f7f1faaa020LL),reale(94702735,0xa411a5cab5dd0LL), -reale(117194635,0x5b0909f7a774bLL), reale(12305436712LL,0x56b51693aedc3LL), // C4[1], coeff of eps^2, polynomial in n of order 27 -real(0x1bd57a8f504dd3c0LL),-real(0x21b6ff10b9172180LL), -real(0x292825cda3a88940LL),-real(0x32aacbfadedfca00LL), -real(0x3ef38a62fa0322c0LL),-real(0x4f013a1cfd80d280LL), -real(0x64414a4729c69840LL),-reale(2060,0x90ead26a03300LL), -reale(2683,0x237c6d92be1c0LL),-reale(3547,0x3d9a05c33e380LL), -reale(4770,0x6ec9da59bf740LL),-reale(6541,0x1657e411dc00LL), -reale(9170,0x1a8b4944fd0c0LL),-reale(13190,0xb069410801480LL), -reale(19554,0x9e393a3b06640LL),-reale(30047,0xba30505448500LL), -reale(48224,0x707d4f4f6afc0LL),-reale(81689,0xf05ca40b52580LL), -reale(148265,0xab90de58ba540LL),-reale(294962,0x64373b047ee00LL), -reale(667587,0xc0c688fa83ec0LL),-reale(1840377,0xc842d822d680LL), -reale(7199121,0xfc41489b57440LL),-reale(69934327,0xdb9ec152bd700LL), reale(541991040,0xe60e5a413c240LL),-reale(1060670639,0x2d9274118e780LL), reale(833384073,0xa3ce7fc4a6cc0LL),-reale(234389270,0xb61213ef4ee96LL), reale(12305436712LL,0x56b51693aedc3LL), // C4[1], coeff of eps^1, polynomial in n of order 28 -real(0xb4c355cd41c92c0LL),-real(0xd8fea3a41cc7830LL), -real(0x1064f0c6b9a6ad20LL),-real(0x13f7a88902ef1b10LL), -real(0x1884a414973fcb80LL),-real(0x1e5fa2ae5243d7f0LL), -real(0x25fe0bb384ddd9e0LL),-real(0x3006f6e3e0e25ad0LL), -real(0x3d6c2c13c34ec440LL),-real(0x4f91f34825bd4fb0LL), -real(0x688ffb74f98676a0LL),-reale(2233,0xdec33bb086290LL), -reale(3036,0xe53843c2cdd00LL),-reale(4213,0xb13e1137e3f70LL), -reale(5984,0xaa1cca8abe360LL),-reale(8732,0xb9880d6c69250LL), -reale(13152,0x1eadcfcfd75c0LL),-reale(20566,0x4e1752c3c0730LL), -reale(33653,0xf4262a5798020LL),-reale(58247,0x3a420e3524a10LL), -reale(108257,0x7934f39e3ee80LL),-reale(221025,0xaccc1c0dc06f0LL), -reale(514222,0xffbb852faace0LL),-reale(1456965,0x29e8a4070e9d0LL), -reale(5827860,0xa7a2901c3a740LL),-reale(56821641,0x6270fd1339eb0LL), reale(416692036,0xd1e73fe253660LL),-reale(625038055,0x3adadfd37d190LL), reale(273454149,0x29bfc1ec86bafLL), reale(12305436712LL,0x56b51693aedc3LL), // C4[2], coeff of eps^29, polynomial in n of order 0 185528,real(30429886905LL), // C4[2], coeff of eps^28, polynomial in n of order 1 real(17366491968LL),real(4404238552LL),real(0x74e318fa9c07fLL), // C4[2], coeff of eps^27, polynomial in n of order 2 real(412763643136LL),-real(248137794944LL),real(164642704408LL), real(0x4d882f0532d9e9LL), // C4[2], coeff of eps^26, polynomial in n of order 3 real(0x11462b92d913a0LL),-real(0xdd4620ebadc40LL), real(0x5974730e46be0LL),real(0x16bcec57851ccLL), reale(33547,0x1cf91962af003LL), // C4[2], coeff of eps^25, polynomial in n of order 4 real(0xc83679b433c00LL),-real(0xb29b6d58dfb00LL),real(0x5f4e3bdd4de00LL), -real(0x3affd9960e900LL),real(0x2665fb625f490LL), reale(15809,0x8f200ee7e2a7dLL), // C4[2], coeff of eps^24, polynomial in n of order 5 real(0x67b92a8524a18e80LL),-real(0x609d7d3ca356ae00LL), real(0x39db180d1b52d580LL),-real(0x2fa1e9183dec9700LL), real(0x1294d8f2627edc80LL),real(0x4bc94ddbc9bad70LL), reale(22813193,0xc1b4051297e97LL), // C4[2], coeff of eps^23, polynomial in n of order 6 reale(24830,0x3d0fb879bb600LL),-reale(23212,0xa100635ccdb00LL), reale(14957,0x147cd156ba400LL),-reale(13653,0x51ea4b9c89d00LL), reale(7024,0x2535370909200LL),-reale(4511,0x3af63b60c9f00LL), reale(2865,0xf50f5adcce1f0LL),reale(235736335,0x7c44346acc6c3LL), // C4[2], coeff of eps^22, polynomial in n of order 7 reale(1046092,0x25a6222f26060LL),-reale(949436,0x14a3a722f1840LL), reale(652845,0xb96689ab42720LL),-reale(615919,0x6f1345ab50580LL), reale(356624,0x982d38f2a9de0LL),-reale(303839,0x22c37d5c832c0LL), reale(113262,0x286189b57e4a0LL),reale(28978,0x12ae8b059bc84LL), reale(6836353729LL,0x13b9f01928417LL), // C4[2], coeff of eps^21, polynomial in n of order 8 reale(4643688,0x71b79cbf7cc00LL),-reale(3959056,0x83e38a4f9d180LL), reale(2926140,0x6f81ce5fc3900LL),-reale(2722736,0xdd03df5282c80LL), reale(1710940,0xc70403130e600LL),-reale(1602990,0x9ebb76967a780LL), reale(787738,0x6bf60987b1300LL),-reale(530212,0xcde2a88ab0280LL), reale(326645,0xab9033855e368LL),reale(20509061187LL,0x3b2dd04b78c45LL), // C4[2], coeff of eps^20, polynomial in n of order 9 reale(2366152,0x4fc26559c91c0LL),-reale(1830925,0x4d73259824200LL), reale(1477489,0x62c9a90a52a40LL),-reale(1299560,0xe7bf798235180LL), reale(885946,0x5cb0a99f5e2c0LL),-reale(843740,0x47153eb842100LL), reale(469359,0x79db9d7cfb40LL),-reale(417111,0x1a4c5e2477080LL), reale(146559,0x51b0aa3dcb3c0LL),reale(37677,0x6dd5ee66abd48LL), reale(6836353729LL,0x13b9f01928417LL), // C4[2], coeff of eps^19, polynomial in n of order 10 reale(11390177,0xa8f910291300LL),-reale(7729638,0x6f23cf47c2480LL), reale(6929266,0x5fb765e065c00LL),-reale(5514735,0x5eb0876136380LL), reale(4148166,0x27d6c40aa500LL),-reale(3788609,0xfef33001c8280LL), reale(2322601,0x1de03c2bc2e00LL),-reale(2237878,0x77b7642b94180LL), reale(1037457,0x571c66f013700LL),-reale(742165,0x8c39e6d5b6080LL), reale(439349,0xf7cfa6e796fc8LL),reale(20509061187LL,0x3b2dd04b78c45LL), // C4[2], coeff of eps^18, polynomial in n of order 11 reale(19643005,0x3eb0d373a0e0LL),-reale(11359402,0x98e8f09139c0LL), reale(11381255,0xacc1b03fd73a0LL),-reale(7834592,0x92741bdd3b00LL), reale(6664656,0xa317edb25b660LL),-reale(5516050,0x3ff87cc43bc40LL), reale(3774293,0xd5e83edc68920LL),-reale(3594547,0xbec9f61701d80LL), reale(1908400,0x61c5f793c0be0LL),-reale(1786093,0xfaf3f7a19bec0LL), reale(579905,0x9d50696085ea0LL),reale(150042,0xa9efa9004c604LL), reale(20509061187LL,0x3b2dd04b78c45LL), // C4[2], coeff of eps^17, polynomial in n of order 12 reale(38321815,0x1e48683dc9800LL),-reale(18616913,0x727791f8dfa00LL), reale(20113440,0xb841223d75400LL),-reale(11495937,0x9838f29931e00LL), reale(11261630,0x21fd3747b1000LL),-reale(7960716,0x75135ee9c200LL), reale(6275150,0xa8a2fa972cc00LL),-reale(5471565,0x945df446e600LL), reale(3293426,0x6eab44c698800LL),-reale(3257897,0x559df659f8a00LL), reale(1401057,0x756ea738a4400LL),-reale(1086629,0xf49cb94a8ae00LL), reale(610116,0x479bdc6c290e0LL),reale(20509061187LL,0x3b2dd04b78c45LL), // C4[2], coeff of eps^16, polynomial in n of order 13 reale(102781113,0x98fe5a9192500LL),-reale(40336104,0xccc089a851400LL), reale(40165652,0x6e617f3b73300LL),-reale(18616625,0x95536d5576600LL), reale(20514709,0xd39b96f5ec100LL),-reale(11691503,0x7c1154bb0b800LL), reale(10980290,0x40d1adbe6cf00LL),-reale(8104717,0x4a433bfb60a00LL), reale(5726151,0xc3b2b2965d00LL),-reale(5331323,0xa4559d80c5c00LL), reale(2689333,0x7cf2f82446b00LL),-reale(2678624,0x7904ff2b8ae00LL), reale(779755,0xfacbca777f900LL),reale(203539,0xb4670b88476e0LL), reale(20509061187LL,0x3b2dd04b78c45LL), // C4[2], coeff of eps^15, polynomial in n of order 14 -reale(23295494,0x8be82e34e6400LL),-reale(256522224,0x1264f586eb600LL), reale(109420782,0x9692235ce1800LL),-reale(40005401,0x76f47ac799a00LL), reale(42210732,0x9175627089400LL),-reale(18637789,0x360d04338fe00LL), reale(20777547,0x32d7f69c1000LL),-reale(11978808,0x3c6fce691e200LL), reale(10467739,0x890cbd2438c00LL),-reale(8246695,0x5d95a89294600LL), reale(4981450,0x2e83f5dba0800LL),-reale(4997884,0x48d2490e42a00LL), reale(1949724,0xd6b9d613a8400LL),-reale(1687002,0x42840cd678e00LL), reale(881316,0x5154c853b06e0LL),reale(20509061187LL,0x3b2dd04b78c45LL), // C4[2], coeff of eps^14, polynomial in n of order 15 -reale(315852553,0x127aa1fb9560LL),reale(452067016,0x32f06289dc340LL), -reale(36389203,0xc905d2dd0bc20LL),-reale(265701999,0x414c3c9652f80LL), reale(117462481,0xb44ff33f8ed20LL),-reale(39375172,0xb9e521c5c6240LL), reale(44443567,0x98c20ae94660LL),-reale(18737379,0x9088d09ce7500LL), reale(20789662,0x74772cb6e2fa0LL),-reale(12399165,0xc39cbc16e07c0LL), reale(9634015,0x48be8ec7788e0LL),-reale(8326007,0x8f1246dddba80LL), reale(4012687,0x8a9763f933220LL),-reale(4283805,0xe15bd5742d40LL), reale(1064918,0x3e0322e890b60LL),reale(281445,0x189dacfa2913cLL), reale(20509061187LL,0x3b2dd04b78c45LL), // C4[2], coeff of eps^13, polynomial in n of order 16 reale(4607575,0xc9d7900c88800LL),reale(44527228,0x61b96ac1eb380LL), -reale(320302478,0xa276d3450e900LL),reale(471382647,0x4d0623cc86a80LL), -reale(52535715,0x404f1a5b09a00LL),-reale(275262322,0xf3348bb543e80LL), reale(127364360,0xbf0504ec13500LL),-reale(38376532,0x74833ebc78780LL), reale(46801690,0x6a3245e5c4400LL),-reale(19021914,0x3bda110f1b080LL), reale(20372666,0xf7fc04d85300LL),-reale(12992077,0x825700022f980LL), reale(8374681,0xba502a56d2200LL),-reale(8187369,0x8d48a8bba280LL), reale(2818780,0x7113503f27100LL),-reale(2834494,0xf2038f04beb80LL), reale(1337917,0xc906f381aecf8LL),reale(20509061187LL,0x3b2dd04b78c45LL), // C4[2], coeff of eps^12, polynomial in n of order 17 reale(388658,0x19c7c6f8ea2c0LL),reale(1117971,0xaadcbdb38ac00LL), reale(4519560,0xaee28ee393540LL),reale(44278119,0xe09b9f50af680LL), -reale(324493551,0x5c00bae29840LL),reale(492697628,0x7d1cc3fd18100LL), -reale(72657626,0xb42806bf185c0LL),-reale(284925253,0x57cc84a557480LL), reale(139770748,0x33e950dc3acc0LL),-reale(36961790,0xef70c005baa00LL), reale(49119876,0xa052562f03f40LL),-reale(19681131,0xbaa50226adf80LL), reale(19252422,0xc3af9265b71c0LL),-reale(13755373,0x2f0960c0cd500LL), reale(6600104,0x6565773f88440LL),-reale(7462805,0xbfb982e534a80LL), reale(1452711,0x6b2cd84feb6c0LL),reale(390635,0x965de9321fbe8LL), reale(20509061187LL,0x3b2dd04b78c45LL), // C4[2], coeff of eps^11, polynomial in n of order 18 reale(73868,0xf53613318fd00LL),reale(155158,0x6bea1fc037e80LL), reale(370865,0xe686995a3a800LL),reale(1077531,0xb6b00d00e5180LL), reale(4409046,0x1d5f244685300LL),reale(43860006,0xf94485a638480LL), -reale(328226208,0x254b380304200LL),reale(516242826,0x48cfde1d3d780LL), -reale(98028430,0xc7227901d5700LL),-reale(294125055,0xf41dd5cbff580LL), reale(155591277,0xc58331ae9d400LL),-reale(35168366,0x6c3820d072280LL), reale(51023141,0xfcae9f00dff00LL),-reale(21033813,0x6b0840ce0ef80LL), reale(17035669,0xa0ab037f7ea00LL),-reale(14520825,0x209891efc9c80LL), reale(4321952,0xda1143d705500LL),-reale(5322397,0x9ed9b44796980LL), reale(2165443,0xa5af00ad58358LL),reale(20509061187LL,0x3b2dd04b78c45LL), // C4[2], coeff of eps^10, polynomial in n of order 19 reale(19809,0x63304b335a660LL),reale(35566,0xcb4164f348e40LL), reale(68577,0xe86c972757e20LL),reale(145245,0xbc9cc7446e200LL), reale(350489,0x7e29a3d4285e0LL),reale(1029750,0x45087f82835c0LL), reale(4270842,0x2203011585da0LL),reale(43220702,0xa65b618eca980LL), -reale(331199124,0xa89ccd5235aa0LL),reale(542217711,0x200e3727c5d40LL), -reale(130429686,0x3b8b1d50d02e0LL),-reale(301749371,0x2c4d836f88f00LL), reale(176097282,0x8ddfe73d104e0LL),-reale(33280999,0x8c12e2a85fb40LL), reale(51717673,0x23cc103525ca0LL),-reale(23558374,0x76fe0e70fc780LL), reale(13250268,0x69c1c450ca460LL),-reale(14595460,0xd8a80a3d5d3c0LL), reale(1848614,0x7d3564e37c20LL),reale(506231,0x2a6100a6a6db4LL), reale(20509061187LL,0x3b2dd04b78c45LL), // C4[2], coeff of eps^9, polynomial in n of order 20 reale(6397,0xfcd62c9faa400LL),reale(10440,0x3fc8ff8e75700LL), reale(17841,0xb7bede1dba00LL),reale(32272,0x7935213063d00LL), reale(62742,0x8933a9bfd5000LL),reale(134128,0x223daf23d6300LL), reale(327129,0xfca43cca0e600LL),reale(973230,0x31dda9e44900LL), reale(4098328,0x3528b970ffc00LL),reale(42289297,0xe5d54d5326f00LL), -reale(332951092,0xecfda756dee00LL),reale(570709002,0x2878cf4ff5500LL), -reale(172380399,0x5788b53115800LL),-reale(305626020,0x9c65fcc7d8500LL), reale(202987914,0xbd0aab0ad3e00LL),-reale(32233434,0x3f0406dec9f00LL), reale(49604551,0xc747777555400LL),-reale(27757216,0x323bffb167900LL), reale(7652705,0x1c15203ae6a00LL),-reale(11782806,0x2b7827f239300LL), reale(3811565,0x362856b8e6d30LL),reale(20509061187LL,0x3b2dd04b78c45LL), // C4[2], coeff of eps^8, polynomial in n of order 21 reale(2297,0xe5959dcaf9680LL),reale(3515,0xaf44e93439a00LL), reale(5557,0xf844363205d80LL),reale(9134,0x3148872cf3100LL), reale(15730,0x1f27208afe480LL),reale(28695,0xbe2e993314800LL), reale(56314,0x2c7b05479ab80LL),reale(121661,0x287926e675f00LL), reale(300328,0xfc8a376113280LL),reale(906274,0xf1fb199eef600LL), reale(3883000,0x5f528c391f980LL),reale(40968060,0xe6e08c5558d00LL), -reale(332763533,0x8282a4a507f80LL),reale(601507851,0xf6ba284c8a400LL), -reale(227453313,0x642fd223ab880LL),-reale(301473974,0xbe5976c5a4500LL), reale(238209921,0x57c5b91e6ce80LL),-reale(34582562,0x41ecac4f5ae00LL), reale(41696071,0xee870caef9580LL),-reale(33183269,0xa456f79c1700LL), reale(1407347,0x27b05f0931c80LL),reale(329283,0x26010fabff570LL), reale(20509061187LL,0x3b2dd04b78c45LL), // C4[2], coeff of eps^7, polynomial in n of order 22 real(0x367dbe5da7953e00LL),real(0x4f9a921ac6fb1900LL), real(0x773454548df74400LL),reale(2938,0xbc18faed4af00LL), reale(4681,0x407a350a64a00LL),reale(7756,0xa0ed83ee90500LL), reale(13477,0x2fbfd87edd000LL),reale(24826,0x9ea174e739b00LL), reale(49249,0xd3391f1d95600LL),reale(107696,0xcac2013cff100LL), reale(269571,0xe064d3a745c00LL),reale(826840,0x70825da398700LL), reale(3613882,0x7ef0aa40a6200LL),reale(39120270,0xc5673698bdd00LL), -reale(329492011,0x53f65ac991800LL),reale(633695353,0xfeb5c44027300LL), -reale(300630213,0xecf09fbea9200LL),-reale(280700646,0xcee0a2073700LL), reale(282664342,0x7b726e8a17400LL),-reale(46720160,0x11dfe8c55a100LL), reale(23527957,0x90f427ad67a00LL),-reale(33848503,0x5eac35f0d4b00LL), reale(7456233,0x7c1f0b332cab0LL),reale(20509061187LL,0x3b2dd04b78c45LL), // C4[2], coeff of eps^6, polynomial in n of order 23 real(0x14f52a063dc5fc20LL),real(0x1d93a1e9ceb48740LL), real(0x2a911c303b723a60LL),real(0x3ea26bba66a54980LL), real(0x5e84fad71b3608a0LL),reale(2349,0x85d3117e94bc0LL), reale(3776,0x1c9d51cf2c6e0LL),reale(6317,0x5193932d16e00LL), reale(11091,0xc7716ff97d520LL),reale(20667,0xe33c2c4a29040LL), reale(41523,0x1a30a42ae9360LL),reale(92100,0xbd0a1f1419280LL), reale(234309,0x70b77706661a0LL),reale(732507,0x72fafb4df54c0LL), reale(3276808,0xe462aef209fe0LL),reale(36551902,0x4c4d10a4b700LL), -reale(321265885,0x720bf168351e0LL),reale(664675522,0x65892c55e9940LL), -reale(398339257,0x2b82ef41c13a0LL),-reale(225754486,0xf240500d62480LL), reale(330356701,0xbb7252695baa0LL),-reale(82401980,0x37f104ae0a240LL), -reale(4970822,0x52bf5cccc8720LL),-reale(3278171,0x9e4b710fe0e14LL), reale(20509061187LL,0x3b2dd04b78c45LL), // C4[2], coeff of eps^5, polynomial in n of order 24 real(0x7d5242068d47400LL),real(0xac3832c9e621080LL), real(0xf0840d5e59cf500LL),real(0x155fabefd3362980LL), real(0x1f01ffac4c30b600LL),real(0x2e0489bbd6aca280LL), real(0x461560bdbc05f700LL),real(0x6df6210d29c3bb80LL), reale(2857,0xf2e1b87d2f800LL),reale(4836,0xd8d8f4249b480LL), reale(8600,0x17271d36df900LL),reale(16248,0x163bc1ffccd80LL), reale(33146,0xc23750bad3a00LL),reale(74792,0x260310eab4680LL), reale(194024,0xef2cdae46fb00LL),reale(620545,0xfcf47db535f80LL), reale(2853712,0x7228ad7b17c00LL),reale(32984640,0x1c4ce82435880LL), -reale(304937768,0x83ef272fd0300LL),reale(687819348,0xf9e0f9c397180LL), -reale(526420007,0xa1ce2482e4200LL),-reale(101220737,0xb065c6f7c1580LL), reale(344186593,0xf79ee4a13ff00LL),-reale(151524377,0x682a2ddefc80LL), reale(15298134,0x380aba4a19708LL),reale(20509061187LL,0x3b2dd04b78c45LL), // C4[2], coeff of eps^4, polynomial in n of order 25 real(0x2b077c634ede840LL),real(0x39e80232e455600LL), real(0x4f004399e9803c0LL),real(0x6d6a8dd96e7d980LL), real(0x9a16639c690ff40LL),real(0xdd0eb6a29ee1d00LL), real(0x143ca2e567649ac0LL),real(0x1e583a687f6ce080LL), real(0x2ebb5ae27bca9640LL),real(0x4a366ef6d0a8e400LL), real(0x7a244f6987aeb1c0LL),reale(3355,0xff6a995ee780LL), reale(6059,0x95d9afc38ad40LL),reale(11647,0x91c4ac30bab00LL), reale(24220,0xbe377a4d448c0LL),reale(55835,0xd9394a033ee80LL), reale(148417,0x27a782b394440LL),reale(488256,0xe5126fdac7200LL), reale(2322515,0xb040a0735fc0LL),reale(28019858,0x3d9464fe1f580LL), -reale(275064197,0x290d46715a4c0LL),reale(686424553,0x6984a82213900LL), -reale(677745912,0x9f6fb36960940LL),reale(151524377,0x682a2ddefc80LL), reale(169007958,0xfd6a53329f240LL),-reale(85232462,0x13a97b9cd6e08LL), reale(20509061187LL,0x3b2dd04b78c45LL), // C4[2], coeff of eps^3, polynomial in n of order 26 real(0xc4c78b5f73e700LL),real(0x1046756e5efb980LL), real(0x15cbc98d9fba400LL),real(0x1d9279681ffce80LL), real(0x28b2f34344c6100LL),real(0x38e6214caec8380LL), real(0x50f0f0d0c655e00LL),real(0x7563dc0de2d1880LL), real(0xadfad5eb325db00LL),real(0x1083ab8775a8cd80LL), real(0x19c9d8efc1ad1800LL),real(0x29945e7f0056e280LL), real(0x4594bf2102ba5500LL),real(0x79a9d12705de9780LL), reale(3587,0xb2b264e0cd200LL),reale(7053,0x1d58043372c80LL), reale(15040,0x44c8073c3cf00LL),reale(35667,0x702872e47e180LL), reale(97902,0x6929355be8c00LL),reale(334186,0x1d1de4e87f680LL), reale(1659947,0xed2beccfc4900LL),reale(21110207,0x53559189eab80LL), -reale(222144335,0x8c70c0703ba00LL),reale(617753229,0x694fabb034080LL), -reale(769277606,0x6fd24e8e23d00LL),reale(454573131,0x1387e899cf580LL), -reale(104173009,0x3479cff894d98LL), reale(20509061187LL,0x3b2dd04b78c45LL), // C4[2], coeff of eps^2, polynomial in n of order 27 real(0x24546bc28a93e0LL),real(0x2f6c4d745b8e40LL), real(0x3e90f252c210a0LL),real(0x5380c389acd700LL), real(0x70da9adde57d60LL),real(0x9aa08aca5a9fc0LL), real(0xd7127fe199fa20LL),real(0x130248120008880LL), real(0x1b6103e1c56a6e0LL),real(0x283fa247b6e3140LL), real(0x3c89da46fe8a3a0LL),real(0x5d71643158b3a00LL), real(0x948b363af771060LL),real(0xf445a32263b42c0LL), real(0x1a1d56e9fe070d20LL),real(0x2ecb290f0241eb80LL), real(0x58a5da95527fb9e0LL),reale(2876,0x680343126d440LL), reale(6354,0x3e35c062e36a0LL),reale(15689,0x7d2910c199d00LL), reale(45107,0x47d6102c9a360LL),reale(162386,0x35cf6d6d5e5c0LL), reale(857038,0x54e3334f72020LL),reale(11655721,0x4f45203874e80LL), -reale(131126864,0xbbc9aa7b23320LL),reale(378810942,0x9046972ad7740LL), -reale(416692036,0xd1e73fe253660LL),reale(156259513,0xceb6b7f4df464LL), reale(20509061187LL,0x3b2dd04b78c45LL), // C4[3], coeff of eps^29, polynomial in n of order 0 594728,real(456448303575LL), // C4[3], coeff of eps^28, polynomial in n of order 1 -real(3245452288LL),real(1965206256),real(0x17609e98859b3LL), // C4[3], coeff of eps^27, polynomial in n of order 2 -real(0x15f49b7dd3600LL),real(0x7876e24c6900LL),real(0x1f5dd75c0b28LL), reale(4837,0x68f14547adebLL), // C4[3], coeff of eps^26, polynomial in n of order 3 -real(0x33418e8004000LL),real(0x17b00d59dc000LL), -real(0x11669ade1c000LL),real(0xa37322475bc0LL), reale(6709,0x6c31d1e089667LL), // C4[3], coeff of eps^25, polynomial in n of order 4 -real(0xc3e38d2fc36800LL),real(0x6a604d6faf7a00LL), -real(0x650b3de948f400LL),real(0x20a6596010be00LL), real(0x88f534a1fae70LL),reale(275086,0x53fa9cf60167fLL), // C4[3], coeff of eps^24, polynomial in n of order 5 -real(0xdd5f9d233a5800LL),real(0x8b724926c9e000LL), -real(0x8af41510346800LL),real(0x3d05686ce77000LL), -real(0x2f9901c72df800LL),real(0x1ae74f29ea4ce0LL), reale(223345,0xf3eec944ed143LL), // C4[3], coeff of eps^23, polynomial in n of order 6 -reale(81630,0xcf55ff9c68c00LL),reale(60811,0x59dd5ef6a6e00LL), -reale(57592,0x6457f059a8800LL),reale(30387,0x2572e53b9c200LL), -reale(30167,0xe11b4690d8400LL),reale(9044,0xd72699d03d600LL), reale(2392,0x21f43a8f7f830LL),reale(990092609,0x9eb428d5a933LL), // C4[3], coeff of eps^22, polynomial in n of order 7 -reale(3070961,0xf14af9164000LL),reale(2767073,0x4d2d51bbc4000LL), -reale(2322170,0xf623e90f3c000LL),reale(1476552,0x4ed8bf53f8000LL), -reale(1490469,0x7e13eaba44000LL),reale(616004,0x8b84c9ea6c000LL), -reale(517487,0xf3178ed39c000LL),reale(279040,0x23dc4dd774ec0LL), reale(28712685662LL,0x1fa68a0342ac7LL), // C4[3], coeff of eps^21, polynomial in n of order 8 -reale(3998482,0x374a7520d6800LL),reale(4351696,0x89a9dbf785900LL), -reale(3077852,0x4b8dc9fbd6e00LL),reale(2436308,0x9b47462d3fb00LL), -reale(2230379,0xda399323b400LL),reale(1147885,0x7a5199072bd00LL), -reale(1196012,0x91bb473d37a00LL),reale(325643,0x5e75ef9e35f00LL), reale(87110,0x728c765d95698LL),reale(28712685662LL,0x1fa68a0342ac7LL), // C4[3], coeff of eps^20, polynomial in n of order 9 -reale(5536106,0x41a6dc97e5400LL),reale(6819318,0x7020ae33aa000LL), -reale(3996497,0x7d04a5d65ec00LL),reale(4026336,0x4a526eb153800LL), -reale(3081046,0x922df73cac400LL),reale(2027203,0x8c3cc70035000LL), -reale(2046086,0x4cc9bc51b5c00LL),reale(787253,0x8fa9057e6800LL), -reale(725367,0x21dd9ffc63400LL),reale(368582,0x69a43eb914890LL), reale(28712685662LL,0x1fa68a0342ac7LL), // C4[3], coeff of eps^19, polynomial in n of order 10 -reale(8942538,0x3b8622ae62a00LL),reale(10481872,0x1e7c948175300LL), -reale(5381394,0x830498d800800LL),reale(6645195,0x535f47efddd00LL), -reale(4043713,0x9ba9cf138e600LL),reale(3563786,0x6253b3df24700LL), -reale(3045580,0xe2f1f7a110400LL),reale(1548984,0x4828fbf665100LL), -reale(1694435,0x63dcfc138a200LL),reale(406057,0xe76a74dc3bb00LL), reale(110280,0xa64ca1bbeb438LL),reale(28712685662LL,0x1fa68a0342ac7LL), // C4[3], coeff of eps^18, polynomial in n of order 11 -reale(18204995,0x3f490d6ed8000LL),reale(15367333,0xa666c37198000LL), -reale(8424707,0xb9613a5da8000LL),reale(10765521,3190860555LL<<17), -reale(5300295,0xd300940f58000LL),reale(6273886,0xba1b2aa228000LL), -reale(4137511,0x6a32b5bc28000LL),reale(2951915,0x3ffeb65fb0000LL), -reale(2898950,0x38c8743c58000LL),reale(1027617,0x2c3889c5b8000LL), -reale(1062542,0x7c8a4a4828000LL),reale(500325,0x147f19cd83980LL), reale(28712685662LL,0x1fa68a0342ac7LL), // C4[3], coeff of eps^17, polynomial in n of order 12 -reale(46659673,0x7940546261000LL),reale(20576887,0xb72d09f420c00LL), -reale(17371112,0xc460beb873800LL),reale(16552256,0x8d133b2d84400LL), -reale(7883306,0x3c181b1016000LL),reale(10867815,0x95ba8c80bfc00LL), -reale(5343012,0x31a34980f8800LL),reale(5640245,0x12558783a3400LL), -reale(4241979,0x47a64b12cb000LL),reale(2204426,0xf7d60f21fec00LL), -reale(2506924,0x6e46ed413d800LL),reale(503732,0xa322eb69a2400LL), reale(139663,0x777cb98300b20LL),reale(28712685662LL,0x1fa68a0342ac7LL), // C4[3], coeff of eps^16, polynomial in n of order 13 -reale(156865464,0x9b4a437ced000LL),reale(26751997,0x84cabd1d8c000LL), -reale(47510066,0xf418e3e50b000LL),reale(22667291,0xeea5410a3a000LL), -reale(16175537,0xc4ceea20b9000LL),reale(17818506,0xfb6c54d608000LL), -reale(7402653,0x2459922697000LL),reale(10650742,0xeb52d29456000LL), -reale(5558253,0xfdda6aad45000LL),reale(4690304,0xc3737ed884000LL), -reale(4248624,0xb4bb4dab63000LL),reale(1382140,0xc755b095f2000LL), -reale(1646389,0x4c787b5791000LL),reale(701746,0xdc0286e009640LL), reale(28712685662LL,0x1fa68a0342ac7LL), // C4[3], coeff of eps^15, polynomial in n of order 14 reale(158569992,0x763cf17d39800LL),reale(242045827,0xf358b9d531400LL), -reale(171801710,0xfbdaa54751000LL),reale(26564510,0xe59a1e6b54c00LL), -reale(47715397,0x8fdbdb93bb800LL),reale(25503418,0x124aa89300400LL), -reale(14593564,0x65519680b6000LL),reale(19028249,0x27fd86c303c00LL), -reale(7127523,0x40a42052f0800LL),reale(9926805,0x1876eddc2f400LL), -reale(5956098,0xfb7e2f3f1b000LL),reale(3422018,0xde3cf0f552c00LL), -reale(3909386,0x4ce6da2de5800LL),reale(606166,0xec68c0e73e400LL), reale(172919,0x9ad62b665b520LL),reale(28712685662LL,0x1fa68a0342ac7LL), // C4[3], coeff of eps^14, polynomial in n of order 15 reale(234628808,0x48818da828000LL),-reale(452308383,0x26baa88038000LL), reale(184630907,0xde7b734758000LL),reale(240946965,0x4db221ae90000LL), -reale(189474421,0xed4c1e36d8000LL),reale(27214973,0x55324802d8000LL), -reale(46882338,0xe5fcdfdca8000LL),reale(29262846,2319362995LL<<17), -reale(12682237,0x3cee53d458000LL),reale(19904432,0x70537f02e8000LL), -reale(7274198,0xbf917ba828000LL),reale(8480909,0x438c3da230000LL), -reale(6415713,0xc95c9b8258000LL),reale(1960896,0x685dc04df8000LL), -reale(2745254,0xf883406d28000LL),reale(1023946,0x4eef421f04580LL), reale(28712685662LL,0x1fa68a0342ac7LL), // C4[3], coeff of eps^13, polynomial in n of order 16 -reale(2272755,0x57fd708a77000LL),-reale(26091168,0x1366cec7d9d00LL), reale(231976719,0xafe6927fcde00LL),-reale(464894868,0x24c5c39795700LL), reale(215184123,0xaf8273d716c00LL),reale(236438336,0xab29f0bfd4f00LL), -reale(210344218,0x367ffa8b78600LL),reale(29454299,0x2f129bee9500LL), -reale(44460297,0xf9cfdfb8bb800LL),reale(34058265,0xda8305b9abb00LL), -reale(10677799,0x93543d448ea00LL),reale(19950418,0xbb16c712a0100LL), -reale(8097327,0xc3857f1ecdc00LL),reale(6164437,0x8a1d8a85ca700LL), -reale(6487914,0xa92c56ec54e00LL),reale(653539,0x4a58f163aed00LL), reale(193289,0xc4fa7fb371708LL),reale(28712685662LL,0x1fa68a0342ac7LL), // C4[3], coeff of eps^12, polynomial in n of order 17 -reale(136365,0x73a1fcfe6ac00LL),-reale(450638,0xd074750f34000LL), -reale(2128024,0x54e7feac4d400LL),-reale(24952088,0x92a9c1fc91800LL), reale(228113259,0x85d44607e4400LL),-reale(477191195,0x7e69e50f07000LL), reale(251096618,0x1896eb4cd1c00LL),reale(226763725,0xac7cda7d93800LL), -reale(234776156,0x14cc4b0edcc00LL),reale(34557325,0x4230b4bd66000LL), -reale(39741101,0x3a85821c7f400LL),reale(39764072,0x42dd69fc98800LL), -reale(9161206,0x9c1a792d6dc00LL),reale(18380268,0xf302f56753000LL), -reale(9708385,0x581708d300400LL),reale(3148914,0x8380fab1bd800LL), -reale(5050904,0x8a565e3e8ec00LL),reale(1566765,0x6fd98617e9df0LL), reale(28712685662LL,0x1fa68a0342ac7LL), // C4[3], coeff of eps^11, polynomial in n of order 18 -reale(18810,0x4977f6cdda600LL),-reale(44617,0xf507aa2256700LL), -reale(121680,0x26c8d0378b000LL),-reale(408670,0xadcc6d8f87900LL), -reale(1967116,0xd731d207dba00LL),-reale(23614778,0x5c1a1fadbeb00LL), reale(222693980,0x695506ba87c00LL),-reale(488598159,0xe2ab67bc47d00LL), reale(293333811,0x10f016a3f3200LL),reale(209273530,0x4db1c2b811100LL), -reale(262769616,0x9b49f60945800LL),reale(44647130,0x3acb33bfff00LL), -reale(31983858,0x227f1389ce200LL),reale(45626356,0x9e16c6ccb8d00LL), -reale(9276161,0xf8fb16a652c00LL),reale(14205372,0x289c377eefb00LL), -reale(11490116,0xc948e407f600LL),reale(414830,0x163387d5d8900LL), reale(117690,0xc756ec17c4aa8LL),reale(28712685662LL,0x1fa68a0342ac7LL), // C4[3], coeff of eps^10, polynomial in n of order 19 -reale(3667,0x8ba48fb7ec000LL),-reale(7355,0xde5d961edc000LL), -reale(15963,0x138d280434000LL),-reale(38393,53315683LL<<17), -reale(106358,0x1cca460dcc000LL),-reale(363723,0x77fed5aee4000LL), -reale(1788619,0xb46088e414000LL),-reale(22045766,0x7d53064fc8000LL), reale(215267089,0x7c4e47994000LL),-reale(498143540,0xc077eb386c000LL), reale(342855614,0x4b25e0bbcc000LL),reale(179961617,0x7ca6ea4dd0000LL), -reale(293329289,0xb4e43f9ccc000LL),reale(63137066,0xbcee02f98c000LL), -reale(20920174,0xdceb909f94000LL),reale(49479848,0x7088e98168000LL), -reale(12768344,0x1ee1d8cbec000LL),reale(6948560,0xd8f6969c04000LL), -reale(10643749,0x466c677134000LL),reale(2529930,0x161dcdf222440LL), reale(28712685662LL,0x1fa68a0342ac7LL), // C4[3], coeff of eps^9, polynomial in n of order 20 -real(0x354d49acec3dd800LL),-real(0x606a7d34c50a0200LL), -reale(2939,0xdc47a7c209c00LL),-reale(5971,0x671f2d9dad600LL), -reale(13140,0xcdf9f327fe000LL),-reale(32101,0x6baea5bb9ea00LL), -reale(90511,0x408ba9a232400LL),-reale(315893,0xc97e5e852be00LL), -reale(1591343,0xfce30d8d1e800LL),-reale(20207205,0x8b4272e60d200LL), reale(205238828,0x21c1cf60c5400LL),-reale(504251582,0xb2b181bcfa600LL), reale(400330413,0xa384192d01000LL),reale(132810886,0x4094526254600LL), -reale(323039224,0xd5680dd0e3400LL),reale(95085342,0xbfbbc74d27200LL), -reale(8279837,0x6ce790195f800LL),reale(46514941,0x8e0e73ffc5e00LL), -reale(20732718,0x38ef4b2eebc00LL),-reale(922541,0xf2a1d94487600LL), -reale(491669,0x5bd07d195db30LL),reale(28712685662LL,0x1fa68a0342ac7LL), // C4[3], coeff of eps^8, polynomial in n of order 21 -real(0xd828cefda55a800LL),-real(0x16c6eac98e7b6000LL), -real(0x27e1e798049c9800LL),-real(0x490330552dbbf000LL), -reale(2255,0x88ea2b8740800LL),-reale(4647,0x88c66c31f8000LL), -reale(10390,0xd13f35560f800LL),-reale(25836,0xfcd55e2db1000LL), -reale(74324,0xc0bfff0e86800LL),-reale(265480,0xf5ce67923a000LL), -reale(1374647,0xa0b10ca8f5800LL),-reale(18058373,0x723761b2e3000LL), reale(191831943,0xc85920c253800LL),-reale(504361484,0x6e935002fc000LL), reale(465423127,0xbaa71ebb04800LL),reale(59036306,0xf120275a2b000LL), -reale(342905949,0x5a93131732800LL),reale(146354899,0x9f9c2b8142000LL), -reale(1641748,0x1e8ba62ca1800LL),reale(28969072,0x51c8dabef9000LL), -reale(27136540,0x3d9359d98800LL),reale(4249105,0xd55e5a0325120LL), reale(28712685662LL,0x1fa68a0342ac7LL), // C4[3], coeff of eps^7, polynomial in n of order 22 -real(0x38123cee860f400LL),-real(0x59d375c04e8be00LL), -real(0x942bf86bd4c1800LL),-real(0xfcbda8858afb200LL), -real(0x1c02af2dc3443c00LL),-real(0x33fc822f8d2b6600LL), -real(0x65e35fc07de4e000LL),-reale(3414,0xc7eb297eb5a00LL), -reale(7775,0x1c0e884298400LL),-reale(19731,0x6a31912ef0e00LL), -reale(58089,0x9471e600da800LL),-reale(213111,0x15a6331c60200LL), -reale(1139019,0x77ee6ce2ccc00LL),-reale(15560104,0x33d66a0afb600LL), reale(174045800,0x2f0a20e9d9000LL),-reale(494300177,0xd9e4761bbaa00LL), reale(535087920,0xe9f8f195ec00LL),-reale(53102016,0x93f6bbbe95e00LL), -reale(331738553,0x77bff637f3800LL),reale(216985631,0x987f3afb7ae00LL), -reale(21074121,0x8043eaffd5c00LL),-reale(4185955,0xa3ff769180600LL), -reale(4713710,0xd2e19a34f30b0LL),reale(28712685662LL,0x1fa68a0342ac7LL), // C4[3], coeff of eps^6, polynomial in n of order 23 -real(0xe0ca252d14c000LL),-real(0x15a70af15f24000LL), -real(0x222b3f817554000LL),-real(0x375f97b48cd8000LL), -real(0x5c7b9631f8ac000LL),-real(0x9fe2527c7fcc000LL), -real(0x11face3d5ef34000LL),-real(0x21e77d8dabde0000LL), -real(0x439dcbf7fdccc000LL),-reale(2310,0x1731d0ccf4000LL), -reale(5373,0x35ee2c1554000LL),-reale(13965,0xf39edc32e8000LL), -reale(42247,0xa0aa0b1cac000LL),-reale(159930,0xa2319a759c000LL), -reale(887131,0xc123fa86b4000LL),-reale(12685735,0x6243721af0000LL), reale(150650948,0x968da6a8b4000LL),-reale(467294064,0x1610ada8c4000LL), reale(599544322,0x5feb9b1dac000LL),-reale(214883240,0x150075a4f8000LL), -reale(244806233,0x53bd4b2bac000LL),reale(272520146,0x88b0e96a94000LL), -reale(87760725,0x27ae1fc734000LL),reale(5827860,0xa7a2901c3a740LL), reale(28712685662LL,0x1fa68a0342ac7LL), // C4[3], coeff of eps^5, polynomial in n of order 24 -real(0x32b69e04189800LL),-real(0x4bd39320660300LL), -real(0x73a508e7ef1600LL),-real(0xb44a7ec206b900LL), -real(0x1200d9d52c6d400LL),-real(0x1d916a5ad4bcf00LL), -real(0x321a3f994641200LL),-real(0x57fce6d660f8500LL), -real(0xa10c564a22b1000LL),-real(0x1356fa3ebba41b00LL), -real(0x275fd13435900e00LL),-real(0x5604e2d76283d100LL), -reale(3283,0xdf8f52c874c00LL),-reale(8783,0x8ddc09700e700LL), -reale(27451,0x143e179f50a00LL),-reale(107903,0xe48c7d6f59d00LL), -reale(625732,0xe2abef41d8800LL),-reale(9446536,0xacc19c0743300LL), reale(120325828,0x5507fb0eafa00LL),-reale(412649247,0xc3fe82376e900LL), reale(633089704,0xd19d26ed03c00LL),-reale(418090362,0x84d33548fff00LL), -reale(13712613,0x4e3334f720200LL),reale(163180098,0x55c7c31664b00LL), -reale(61921019,0x751f3b2bed108LL), reale(28712685662LL,0x1fa68a0342ac7LL), // C4[3], coeff of eps^4, polynomial in n of order 25 -real(0x30fab48eb2c00LL),-real(0x4779db0cde000LL), -real(0x6a1a5308c1400LL),-real(0xa07c7893bf800LL), -real(0xf7d15b087bc00LL),-real(0x1878e181999000LL), -real(0x27ab652bf7a400LL),-real(0x422ed0b6682800LL), -real(0x721448fff54c00LL),-real(0xcc1e5699294000LL), -real(0x17d5829db9a3400LL),-real(0x2ed74923dde5800LL), -real(0x61c84aba5ffdc00LL),-real(0xdbaa1b53c88f000LL), -real(0x21cc8beefe3fc400LL),-real(0x5da8efb832aa8800LL), -reale(4876,0x5d83861736c00LL),-reale(20082,0x8bb9af0c4a000LL), -reale(123005,0x97d1502b45400LL),-reale(1983151,0x65e045fd8b800LL), reale(27425226,0x9c6669ee40400LL),-reale(105081920,0xe8c662ae85000LL), reale(191976586,0x46cce583c1c00LL),-reale(186491540,0xf45203874e800LL), reale(93245770,0x7a2901c3a7400LL),-reale(18940547,0x20d0545bbdf90LL), reale(9570895220LL,0xb53783566b8edLL), // C4[3], coeff of eps^3, polynomial in n of order 26 -real(0x10330cb256200LL),-real(0x172cb16211100LL), -real(0x21a8187537800LL),-real(0x31b06260f1f00LL), -real(0x4ab014ab28e00LL),-real(0x7280309c9cd00LL), -real(0xb366eef7be400LL),-real(0x11ff8a58b05b00LL), -real(0x1dae666558ba00LL),-real(0x327547ac4a0900LL), -real(0x58c9207d125000LL),-real(0xa2826b77361700LL), -real(0x137557a5841e600LL),-real(0x275355b4b1bc500LL), -real(0x54b37d85300bc00LL),-real(0xc517d06239a5300LL), -real(0x1f8f2f623d981200LL),-real(0x5b85a3034c390100LL), -reale(5020,0xa2ee6bc312800LL),-reale(21965,0x48d3177570f00LL), -reale(144343,0x4c469a2853e00LL),-reale(2526007,0xb6d389c1bbd00LL), reale(38395317,0x415c2de726c00LL),-reale(163180098,0x55c7c31664b00LL), reale(326360196,0xab8f862cc9600LL),-reale(303048754,0xd0545bbdf900LL), reale(104173009,0x3479cff894d98LL), reale(28712685662LL,0x1fa68a0342ac7LL), // C4[4], coeff of eps^29, polynomial in n of order 0 4519424,real(0x13ed3512585LL), // C4[4], coeff of eps^28, polynomial in n of order 1 real(322327509504LL),real(86419033792LL),real(0x12e7203d54087bdLL), // C4[4], coeff of eps^27, polynomial in n of order 2 real(0xdf868e997000LL),-real(0xc54488fde800LL),real(0x67996a8dfb80LL), reale(6219,0x86ed0fee71e5LL), // C4[4], coeff of eps^26, polynomial in n of order 3 real(0x1e30d5f17398800LL),-real(0x20335f44c005000LL), real(0x8656a9da59d800LL),real(0x246f3281df3200LL), reale(1871928,0xea4bbbb5bea41LL), // C4[4], coeff of eps^25, polynomial in n of order 4 real(0x640278dc982000LL),-real(0x64de2b5e388800LL), real(0x266cf1cb211000LL),-real(0x24af02897bd800LL), real(0x125236c4932c80LL),reale(225070,0xa1cd0c0f186c5LL), // C4[4], coeff of eps^24, polynomial in n of order 5 real(0x183393315f62f400LL),-real(0x147c8a635ba4f000LL), real(0xaadb07a361e2c00LL),-real(0xbd0a07cdca37800LL), real(0x2c490db64a86400LL),real(0xc3000bbe3e2580LL), reale(8327613,0x62a2be2e87a79LL), // C4[4], coeff of eps^23, polynomial in n of order 6 reale(7399,0xe4703b1ceb000LL),-reale(4925,0x718bf750ef800LL), reale(3656,0xc01290e152000LL),-reale(3594,0x9ae0aefbbc800LL), real(0x5080258211e79000LL),-real(0x5458466826cf9800LL), real(0x27a09e95cf36b080LL),reale(97921247,0xc3bd6c206251LL), // C4[4], coeff of eps^22, polynomial in n of order 7 reale(4319137,0xe5044c1364800LL),-reale(2259378,0xc043aee633000LL), reale(2431286,0xcceb783bf5800LL),-reale(1865690,0x884902c9a2000LL), reale(996566,0x94ae3b7946800LL),-reale(1135368,0x2cb1c30811000LL), reale(231629,0x92b25177d7800LL),reale(64961,0x89605803fda00LL), reale(36916310137LL,0x41f43bb0c949LL), // C4[4], coeff of eps^21, polynomial in n of order 8 reale(6174501,0x53f34a829c000LL),-reale(2885765,0xddf01a0f35800LL), reale(4089976,0x588848e445000LL),-reale(2309244,0x73683320c8800LL), reale(1950621,0xac1b944ace000LL),-reale(1810054,0xa24c07eb4b800LL), reale(609590,0x74daa18497000LL),-reale(712107,0x16cff78e5e800LL), reale(310317,0x16957f6a36b80LL),reale(36916310137LL,0x41f43bb0c949LL), // C4[4], coeff of eps^20, polynomial in n of order 9 reale(7763095,0xd98a0c3214600LL),-reale(4551997,0xf65d38a54d000LL), reale(6348004,0x7dcc619ba1a00LL),-reale(2777846,0x11091dc381c00LL), reale(3645151,0x5af876afd6e00LL),-reale(2403756,0x12692c3266800LL), reale(1377366,0xde24866584200LL),-reale(1585712,0xf2192bea6b400LL), reale(268682,0xb0f056b079600LL),reale(77255,0xca5a822ebf740LL), reale(36916310137LL,0x41f43bb0c949LL), // C4[4], coeff of eps^19, polynomial in n of order 10 reale(8073134,0x8bff962f2e000LL),-reale(9331256,0xe8e10405e1000LL), reale(8608510,0x42ad0321d8000LL),-reale(3959617,0x4c778c1e2f000LL), reale(6283090,0x55033b3d82000LL),-reale(2832307,0xbbdb17809d000LL), reale(2955095,0x929c8347ec000LL),-reale(2459067,0xd43d49c36b000LL), reale(787004,0x9cc4866d6000LL),-reale(1039103,0x6b1983acd9000LL), reale(412222,0xf695367aa1b00LL),reale(36916310137LL,0x41f43bb0c949LL), // C4[4], coeff of eps^18, polynomial in n of order 11 reale(8586281,0xffd2991fd000LL),-reale(20926106,0xdd733d721a000LL), reale(9282973,0x193483c94f000LL),-reale(8121077,0x9b55004148000LL), reale(9430655,0x90c0e29221000LL),-reale(3512067,0x80c2ac76000LL), reale(5840995,0x1886eb4173000LL),-reale(3061324,0xab1a78b4a4000LL), reale(2049544,0x4067911445000LL),-reale(2292525,0x617c054ad2000LL), reale(297833,0x966e637f97000LL),reale(88539,0x9a2e50b8c6400LL), reale(36916310137LL,0x41f43bb0c949LL), // C4[4], coeff of eps^17, polynomial in n of order 12 reale(32196457,0xd679f8ae1c000LL),-reale(40594018,0x37167c5ef5000LL), reale(8052650,0x2eda271162000LL),-reale(20325613,0xcd34eeff17000LL), reale(11030346,0x5827875768000LL),-reale(6662972,0x9685f0fc59000LL), reale(10015916,0xfa65faac6e000LL),-reale(3377057,0x1ef6021e7b000LL), reale(4892320,0x94cb79bcb4000LL),-reale(3369439,0x93437f1d3d000LL), reale(1068721,0xdee482d47a000LL),-reale(1596884,0xcb3e26805f000LL), reale(562334,0xcf5270735f500LL),reale(36916310137LL,0x41f43bb0c949LL), // C4[4], coeff of eps^16, polynomial in n of order 13 reale(239019678,0x7928c61a8b800LL),-reale(41200119,0x147c0b11e000LL), reale(27063572,0xac3757be98800LL),-reale(45155983,0xc412cf1f79000LL), reale(8354845,0xf8b6ea7445800LL),-reale(18750027,0x4e7377c014000LL), reale(13292220,0xfed958edd2800LL),-reale(5165101,0x26aa3105af000LL), reale(10025000,0x43fec217f800LL),-reale(3715677,0xed5a4430a000LL), reale(3405288,0xc16fe1018c800LL),-reale(3440521,0x6cb0e4f2e5000LL), reale(291108,0x30be23439800LL),reale(90314,0xe93f4121c6900LL), reale(36916310137LL,0x41f43bb0c949LL), // C4[4], coeff of eps^15, polynomial in n of order 14 -reale(301344600,0x1f7a69f35a000LL),-reale(137666269,0x81776c9d9b000LL), reale(257500426,0xa27a71193c000LL),-reale(52745704,0xa8e59f44d000LL), reale(20527629,0x3707e00852000LL),-reale(49389175,0x1679a6a55f000LL), reale(10057417,0xa546ce8428000LL),-reale(15960633,0x79a78f6a91000LL), reale(15828795,0x3b7a7e96fe000LL),-reale(4041479,0x5385608da3000LL), reale(9015452,0x8a056dcb14000LL),-reale(4531739,0xb18fd7c855000LL), reale(1608583,0x5c81da4aaa000LL),-reale(2620079,0xb9c03a2467000LL), reale(790676,0xf12036cb88d00LL),reale(36916310137LL,0x41f43bb0c949LL), // C4[4], coeff of eps^14, polynomial in n of order 15 -reale(152316078,0x9ee9710b1f000LL),reale(396132268,0xf6300698d2000LL), -reale(331944543,0x2a26efc8bd000LL),-reale(111967823,0x409ccb544c000LL), reale(276102802,0x8592b62d25000LL),-reale(69409637,0x2e4659b6a000LL), reale(12806364,0xaa4a38387000LL),-reale(52382533,0xaa3aad6588000LL), reale(13858261,0x7d9fda6f69000LL),-reale(11925525,0x17f68feba6000LL), reale(17994828,0x2633a57dcb000LL),-reale(3926621,0x9c334da6c4000LL), reale(6610729,0xa84ec063ad000LL),-reale(5341800,0xcfe0c57fe2000LL), reale(171304,0xc92dc0ce0f000LL),reale(53498,0x8a12fdd94c400LL), reale(36916310137LL,0x41f43bb0c949LL), // C4[4], coeff of eps^13, polynomial in n of order 16 reale(945329,0x3e694a5630000LL),reale(13046260,0xd11553dc81000LL), -reale(145063327,0x6c5bbd04f6000LL),reale(395288944,0x9758cc3483000LL), -reale(364989750,0x4da45c465c000LL),-reale(77659847,0x7f601a5fdb000LL), reale(293261136,0xdb46a6c9be000LL),-reale(92956699,0x68d702f4d9000LL), reale(4748491,0xd717292318000LL),-reale(52641236,0xde7217eeb7000LL), reale(20401071,0xa831b35d72000LL),-reale(7165143,0xe2daef21b5000LL), reale(18530179,0x70f1fa908c000LL),-reale(5449998,0x995f61f213000LL), reale(2985284,0xf423c13426000LL),-reale(4674955,0x4c99b17411000LL), reale(1148405,0xaa811667d8300LL),reale(36916310137LL,0x41f43bb0c949LL), // C4[4], coeff of eps^12, polynomial in n of order 17 reale(39064,0xc457745427a00LL),reale(149707,0xe179ab818a000LL), reale(834482,0xb3de3faf4c600LL),reale(11844090,0x43801d34c0c00LL), -reale(136492367,0x606ac4f4b6e00LL),reale(391413380,0x8b1b355567800LL), -reale(399991879,0xf56c51d232200LL),-reale(32313943,0x670cb1cd91c00LL), reale(306137820,0x47c0d4df8aa00LL),-reale(125355715,0x12c37db13b000LL), -reale(1549012,0x61de67b1d0a00LL),-reale(48002827,0x1ef791fca4400LL), reale(29707099,0x80264b6e6c200LL),-reale(3304868,0xd90dacdedd800LL), reale(15595740,0x1c41b85df0e00LL),-reale(8339676,0x731c5b6cf6c00LL), -reale(264319,0x3253133a92600LL),-reale(128183,0x1fd72f4c70540LL), reale(36916310137LL,0x41f43bb0c949LL), // C4[4], coeff of eps^11, polynomial in n of order 18 reale(3796,0xb8b80a685d000LL),reale(10243,0xe5415b1644800LL), reale(32134,0x75fe9c2f28000LL),reale(125896,0x13cc0b67cb800LL), reale(720062,0x2eb5ef2cf3000LL),reale(10542664,0x8e7784ebe2800LL), -reale(126401502,0xa942d02d22000LL),reale(383396973,0xa914c081a9800LL), -reale(435856143,0x9e18e4ddf7000LL),reale(26921352,0xa17bcee040800LL), reale(309790567,0x432113bb94000LL),-reale(168177156,0xf5a6b5d938800LL), -reale(1732899,0x7848d10f61000LL),-reale(36033193,0x6ff05a93a1800LL), reale(39850986,0x4a7ce5d24a000LL),-reale(3520516,0x12d4d9afda800LL), reale(7904559,0x47211641b5000LL),-reale(9293198,0x11e52b76c3800LL), reale(1712350,0xd1c47193d5a80LL),reale(36916310137LL,0x41f43bb0c949LL), // C4[4], coeff of eps^10, polynomial in n of order 19 real(0x20b0c3dbe662b800LL),real(0x49a4ee6b654d5000LL), reale(2895,0xbb9a481b3e800LL),reale(7963,0xd6290c9168000LL), reale(25525,0x742091bd91800LL),reale(102493,0xec03f49fb000LL), reale(603292,0x6fe940faa4800LL),reale(9144553,0x3f081030e000LL), -reale(114581171,0x9502f66408800LL),reale(369767644,0x159b783921000LL), -reale(470438620,0x42537ac0f5800LL),reale(102998223,0x33db2118b4000LL), reale(295924658,0xfd504b0d5d800LL),-reale(220875824,0xd68590c9b9000LL), reale(12088406,0x3b87c77470800LL),-reale(15966308,0xf7cc70b9a6000LL), reale(44660638,0xbb68d3ddc3800LL),-reale(11155854,0x316b572a93000LL), -reale(1400757,0x91d7719929800LL),-reale(909990,0x5b4dcbdcd9200LL), reale(36916310137LL,0x41f43bb0c949LL), // C4[4], coeff of eps^9, polynomial in n of order 20 real(0x55091490e3fe000LL),real(0xab3101736f26800LL), real(0x16d77945c4e3b000LL),real(0x345d2a91137d7800LL), reale(2099,0xc55d2c398000LL),reale(5898,0x424192198800LL), reale(19366,0xa6f5f449f5000LL),reale(79943,0x847cdfac49800LL), reale(486014,0x6a1dc16732000LL),reale(7659629,0x94cc8fca800LL), -reale(100839015,0x651046eed1000LL),reale(348607247,0x22ddc22bfb800LL), -reale(499815073,0x4df2756234000LL),reale(197958555,0x77a0b2f8bc800LL), reale(251323198,0x2663cfb2e9000LL),-reale(276534810,0xe292670a12800LL), reale(51555588,0x6a67a23666000LL),reale(5587968,0x5e92831b6e800LL), reale(32523682,0xed2ae23e23000LL),-reale(21111776,0x46401336e0800LL), reale(2489921,0xe3c1e337a6d80LL),reale(36916310137LL,0x41f43bb0c949LL), // C4[4], coeff of eps^8, polynomial in n of order 21 real(0xeb8379f6b27c00LL),real(0x1b6c4de1f1d7000LL), real(0x355a1dadc956400LL),real(0x6d308de46411800LL), real(0xed54313f63d4c00LL),real(0x22ae87428a2ac000LL), real(0x58ce5dd980bc3400LL),reale(4090,0xd3c824bc46800LL), reale(13806,0x44b4a8a441c00LL),reale(58809,0x7ab991df81000LL), reale(370898,0xe410033e70400LL),reale(6109620,0x6402b9f6fb800LL), -reale(85053139,0x4bf446ca91400LL),reale(317515928,0x1b63894556000LL), -reale(517123103,0xa7a388b5a2c00LL),reale(310296682,0xe98bc80130800LL), reale(156996715,0xaa3cf3c05bc00LL),-reale(312601560,0xdd28200ed5000LL), reale(125126811,0xf01e02788a400LL),reale(4091818,0xb5091207e5800LL), -reale(866059,0xc9a79cf1f7400LL),-reale(4943757,0xf4721fe538b80LL), reale(36916310137LL,0x41f43bb0c949LL), // C4[4], coeff of eps^7, polynomial in n of order 22 real(0x2814d49c0c5000LL),real(0x468b0d3a3db800LL), real(0x80724d98876000LL),real(0xf31dbc49b20800LL), real(0x1e12cb4a6a67000LL),real(0x3eb5a58b5455800LL), real(0x8b1eef20fbf8000LL),real(0x14cb29a266eda800LL), real(0x36974c82ca289000LL),reale(2585,0xefae20720f800LL), reale(9007,0x1d6baf437a000LL),reale(39779,0x24ec74fd54800LL), reale(261696,0x442f64f42b000LL),reale(4534975,0xa5b17f809800LL), -reale(67279179,0x4d9bf05604000LL),reale(273758534,0xd27122c18e800LL), -reale(510920394,0x40d515b3000LL),reale(428723861,0x53ee2b6143800LL), -reale(7330129,0x37be948582000LL),-reale(275708250,0xae16364977800LL), reale(204390109,0xe684af0fef000LL),-reale(52540960,0x7463315742800LL), reale(2056891,0xfeee14beab380LL),reale(36916310137LL,0x41f43bb0c949LL), // C4[4], coeff of eps^6, polynomial in n of order 23 real(0x628e4f4bb7800LL),real(0xa60e374943000LL),real(0x11fae77940e800LL), real(0x2022ddc061a000LL),real(0x3b7f2e2d7a5800LL), real(0x72aa26ca9f1000LL),real(0xe77392a11fc800LL), real(0x1ed1e51d0348000LL),real(0x460248a5fa93800LL), real(0xabd9e84dc89f000LL),real(0x1d078c2cd5cea800LL), real(0x58c9fda5cf076000LL),reale(5134,0xa77137081800LL), reale(23653,0x63d76094d000LL),reale(163469,0x772f4630d8800LL), reale(3004667,0x8d384291a4000LL),-reale(47956830,0xd53f134a90800LL), reale(214953528,0xfe0a5a4ffb000LL),-reale(463620631,0xbff95a7639800LL), reale(519033396,0x411553aad2000LL),-reale(237300381,0xd565fafaa2800LL), -reale(84296486,0x10fabff57000LL),reale(142611178,0x607af3a3b4800LL), -reale(46622885,0x3d1480e1d3a00LL),reale(36916310137LL,0x41f43bb0c949LL), // C4[4], coeff of eps^5, polynomial in n of order 24 real(0xc0b5b2cac000LL),real(0x139ac5d2ed800LL),real(0x20abe97223000LL), real(0x37e2f8cba0800LL),real(0x6269b1d1ba000LL),real(0xb3074a8a43800LL), real(0x151de1e3911000LL),real(0x298e5ccaa76800LL), real(0x55d208375c8000LL),real(0xbb7ea958fd9800LL), real(0x1b5e1854857f000LL),real(0x4547c4b8360c800LL), real(0xc1cdc899e5d6000LL),real(0x2682d6f5e00af800LL), reale(2326,0xf44888e46d000LL),reale(11275,0x7d4afe8b62800LL), reale(82638,0x859516eee4000LL),reale(1628359,0xc1653179c5800LL), -reale(28286265,0xc31f9b1d25000LL),reale(141205400,0x2bb5164778800LL), -reale(353352393,0x632221a20e000LL),reale(504046796,0x730ece181b800LL), -reale(416863444,0x7c7b16f237000LL),reale(186491540,0xf45203874e800LL), -reale(34967163,0xedcf60a95eb80LL),reale(36916310137LL,0x41f43bb0c949LL), // C4[4], coeff of eps^4, polynomial in n of order 25 real(0xe07098dae00LL),real(0x16338b625000LL),real(0x23dda179f200LL), real(0x3b41a69cf400LL),real(0x645a89a6b600LL),real(0xaeabe0e09800LL), real(0x1397028dcfa00LL),real(0x246014e923c00LL),real(0x4633de275be00LL), real(0x8d95c8a56e000LL),real(0x12c670f9ba0200LL), real(0x2a433484738400LL),real(0x6608a70542c600LL), real(0x10c10ac322d2800LL),real(0x30ddb4b92590a00LL), real(0xa2e30513d28cc00LL),real(0x289386109855ce00LL), reale(3347,0x17499d2cb7000LL),reale(26358,0x5763b5c021200LL), reale(564821,0x99c65b39a1400LL),-reale(10825747,0x58af29d092a00LL), reale(60624185,0x23d4ea299b800LL),-reale(172778927,0xa61ece902e600LL), reale(279737311,0x6e7b054af5c00LL),-reale(233114426,0x3166846922200LL), reale(75762188,0x8341516ef7e40LL),reale(36916310137LL,0x41f43bb0c949LL), // C4[5], coeff of eps^29, polynomial in n of order 0 3108352,real(0x4338129a0b3LL), // C4[5], coeff of eps^28, polynomial in n of order 1 -real(4961047LL<<17),real(304969986048LL),real(0x171a7cbcbc0a5e7LL), // C4[5], coeff of eps^27, polynomial in n of order 2 -real(0xb7a8cf8589000LL),real(0x25cdf8a9f5800LL),real(0xaa8ee05df480LL), reale(53207,0x4825dfa147919LL), // C4[5], coeff of eps^26, polynomial in n of order 3 -real(0x4519d2e6066000LL),real(0x17b1d503134000LL), -real(0x1b53dc2d3c2000LL),real(0xc104a529c3b00LL), reale(207992,0x1a086a30a3679LL), // C4[5], coeff of eps^25, polynomial in n of order 4 -real(0xe48436400f9e000LL),real(0x825cbe3b5113800LL), -real(0x9657faac8f9f000LL),real(0x1ac735d19d16800LL), real(0x7b639e59c13780LL),reale(8527676,0x2b5901ca2b961LL), // C4[5], coeff of eps^24, polynomial in n of order 5 -real(0x13b86e0d5c5dc000LL),real(0x135f9b0385fb0000LL), -real(0x10df1064c3304000LL),real(0x58b0ae17a818000LL), -real(0x70d05036b8ec000LL),real(0x2e5299a0b610e00LL), reale(10178194,0x2338af8e3405bLL), // C4[5], coeff of eps^23, polynomial in n of order 6 -reale(126383,0x5f6b81564f000LL),reale(192332,0x2215a4d90d800LL), -reale(113392,0x893928fcaa000LL),reale(71665,0x3fb557978e800LL), -reale(81791,0xa6f9503f45000LL),reale(12036,0x1a6fad5adf800LL), reale(3561,0x9aef6f2cefa80LL),reale(3470764200LL,0xea81d86b4b937LL), // C4[5], coeff of eps^22, polynomial in n of order 7 -reale(191647,0x188f775ada000LL),reale(308186,0x45ee8f2434000LL), -reale(124928,0xd21a49314e000LL),reale(153616,0xaed0e35eb8000LL), -reale(118466,0xc4b6a2a9a2000LL),reale(38029,0x77ad4b77bc000LL), -reale(53612,0x41f60b8316000LL),reale(20169,0xecfa5f7fa8900LL), reale(3470764200LL,0xea81d86b4b937LL), // C4[5], coeff of eps^21, polynomial in n of order 8 -reale(5169843,0xc81db86efc000LL),reale(5341939,0xe957aa505800LL), -reale(2049228,0x2e9753666d000LL),reale(3734678,0xdcd2e44998800LL), -reale(1762099,0xebebc251fe000LL),reale(1337844,0xa441c7cbb800LL), -reale(1455577,0x7e18adc04f000LL),reale(163809,0xd9aab3cbce800LL), reale(50215,0x8f7a6f7ead780LL),reale(45119934611LL,0xe897fd72d67cbLL), // C4[5], coeff of eps^20, polynomial in n of order 9 -reale(11201228,0x9af12fea90000LL),reale(5330620,7096189457LL<<19), -reale(4084126,0xa473ecba70000LL),reale(5776338,0xc1238f4360000LL), -reale(1850318,0x7e36514750000LL),reale(3091001,2788978033LL<<18), -reale(1978996,0x9854b5b30000LL),reale(651396,0xde4e2e0920000LL), -reale(1009381,0x5e1878c010000LL),reale(341219,0x67868049b6800LL), reale(45119934611LL,0xe897fd72d67cbLL), // C4[5], coeff of eps^19, polynomial in n of order 10 -reale(19364139,0xf3aad6c27e000LL),reale(3661269,0x231a8ee911000LL), -reale(10171658,0x9bc1444518000LL),reale(6650152,0x1449aa44ff000LL), -reale(2982446,0xb2f133d6b2000LL),reale(5796709,0x225c7b8fcd000LL), -reale(2004712,0xb33d0f538c000LL),reale(2087887,0x2718a4e53b000LL), -reale(2041244,0xb9c4a8d7e6000LL),reale(150337,0x64e8ec0109000LL), reale(48205,0x4eea8f2f13300LL),reale(45119934611LL,0xe897fd72d67cbLL), // C4[5], coeff of eps^18, polynomial in n of order 11 -reale(17821498,0x43ce2fe394000LL),reale(8113989,0x34042cf6f8000LL), -reale(21055211,0x1d823792dc000LL),reale(4458324,0xaba1762760000LL), -reale(8384573,0x54084121e4000LL),reale(8079221,0xcbb99849c8000LL), -reale(2172398,0x503335ed2c000LL),reale(5129813,0x3b8a4c21b0000LL), -reale(2481567,0xadec795134000LL),reale(934125,9279934035LL<<15), -reale(1531704,0x9cc504aa7c000LL),reale(453383,0xd34e451346a00LL), reale(45119934611LL,0xe897fd72d67cbLL), // C4[5], coeff of eps^17, polynomial in n of order 12 reale(4095301,0x789aeb9e64000LL),reale(49542396,0x46ab457e8d000LL), -reale(24303219,0x1ccf0dd62000LL),reale(4679495,0x21a30e03df000LL), -reale(21666597,0xecbbb1868000LL),reale(6429258,0x6611bb6911000LL), -reale(5963806,0x7f45fe6c6e000LL),reale(9141324,0xab5773fc63000LL), -reale(2043796,0x5ca6f33334000LL),reale(3626747,0xd85dd12c15000LL), -reale(2919955,0xba0fdf867a000LL),reale(85758,0x333e03c667000LL), reale(28339,0x9119c9ad54d00LL),reale(45119934611LL,0xe897fd72d67cbLL), // C4[5], coeff of eps^16, polynomial in n of order 13 -reale(273240474,0x43c43c74c8000LL),reale(133674826,0x952bfc30e0000LL), reale(7048142,0x68e4684408000LL),reale(44883009,0xdb6a70b90000LL), -reale(32370151,0x153b9e91a8000LL),reale(2006331,0xa0ac245340000LL), -reale(20459012,0x9d1a27ed8000LL),reale(9634139,0x6e1e5ebef0000LL), -reale(3415127,0x8d101d0c88000LL),reale(9090639,8214448173LL<<17), -reale(2849328,0xea461fc3b8000LL),reale(1554483,7516134885LL<<16), -reale(2460922,0x6540542d68000LL),reale(615586,0x6f27f96118400LL), reale(45119934611LL,0xe897fd72d67cbLL), // C4[5], coeff of eps^15, polynomial in n of order 14 reale(385255297,0xc522d651da000LL),-reale(58599463,0x810289e63d000LL), -reale(271784816,0x96bdc01bbc000LL),reale(164665597,0xfc4f4e3665000LL), reale(6169937,0xa7ea1cfd2e000LL),reale(36278794,0xf1d4bf77a7000LL), -reale(41327996,0x5935502f28000LL),reale(1406713,0xae66a659c9000LL), -reale(16753028,0x6b0d0fac7e000LL),reale(13550589,0x7d5a3390b000LL), -reale(1765295,0x851b6e8694000LL),reale(7142364,0xca525091ad000LL), -reale(4183412,0x818c59892a000LL),-reale(96164,0xa4307ac011000LL), -reale(44020,0x281c2d0515b00LL),reale(45119934611LL,0xe897fd72d67cbLL), // C4[5], coeff of eps^14, polynomial in n of order 15 reale(85300002,0xc7e70a9f1c000LL),-reale(294351273,0xafb8edef98000LL), reale(403760509,0xda2cbc2e94000LL),-reale(107444454,0x9ae8f34870000LL), -reale(261509454,0x4bda846b4000LL),reale(200593259,0xcaf344c1b8000LL), -reale(1492598,0x1c0b3e713c000LL),reale(23203659,0x98196f9e60000LL), -reale(49434335,0xf8209c0184000LL),reale(4620325,0x4eb0e8bd08000LL), -reale(10475101,0x343acca80c000LL),reale(16597245,8542632147LL<<16), -reale(2356576,0x3bbee61554000LL),reale(3249396,0x1edbdd7e58000LL), -reale(4240477,0x930e83f9dc000LL),reale(851256,0x2b979a0197a00LL), reale(45119934611LL,0xe897fd72d67cbLL), // C4[5], coeff of eps^13, polynomial in n of order 16 -reale(334885,0xc6bdc7fcb0000LL),-reale(5563880,0xa3a405a9f1000LL), reale(77196254,0x955c2ca786000LL),-reale(280592470,0x60fd2cd013000LL), reale(419465490,0x135ebd637c000LL),-reale(164134806,0xd03e535795000LL), -reale(238238642,0xf95f61c30e000LL),reale(239782224,0x6d53e5d49000LL), -reale(20068072,0x4afa414658000LL),reale(6399560,0x53e56b4c47000LL), -reale(53380994,0xb54d3160a2000LL),reale(13179100,0x7f23319325000LL), -reale(3190623,0x71f1454c2c000LL),reale(15946535,0x7112262fa3000LL), -reale(5597132,0xd891768336000LL),-reale(517466,0x3872db407f000LL), -reale(280398,0x37b65ce5ca500LL),reale(45119934611LL,0xe897fd72d67cbLL), // C4[5], coeff of eps^12, polynomial in n of order 17 -reale(9362,0x69735ac9d0000LL),-reale(41698,3327447843LL<<20), -reale(274851,0x56e2bdf830000LL),-reale(4724425,0xa83b5c01a0000LL), reale(68370240,0x5baadc4870000LL),-reale(262946254,0xff686b9240000LL), reale(430395020,0x66a0aab610000LL),-reale(228360148,0x64a23696e0000LL), -reale(196492193,0xc6f6cbf150000LL),reale(277855749,243039325LL<<19), -reale(54565881,0x3f0390efb0000LL),-reale(10430670,3478671393LL<<17), -reale(48232829,0x9769bd8710000LL),reale(26504611,0xd8be140f40000LL), reale(733724,0x9fb250690000LL),reale(8992810,0x9e09f3a6a0000LL), -reale(7946224,0xca1f6288d0000LL),reale(1176502,0x79934ee544800LL), reale(45119934611LL,0xe897fd72d67cbLL), // C4[5], coeff of eps^11, polynomial in n of order 18 -real(0x274a66713f785000LL),-real(0x78cbe0a9df914800LL), -reale(6986,0x5cd0ed6f68000LL),-reale(31980,0xbaca6835fb800LL), -reale(217574,0x7dc41d384b000LL),-reale(3882916,0x2edd7dacd2800LL), reale(58859398,0xdc7c0f67f2000LL),-reale(240755855,0x78dc5ddf79800LL), reale(433769587,0x318800cb6f000LL),-reale(298315443,0xab75c9fd0800LL), -reale(129660149,0x66ef2473b4000LL),reale(305615878,0x94b6a51048800LL), -reale(109156237,0x593300db57000LL),-reale(18007247,0x43b21e10e800LL), -reale(29424146,0x61ad17715a000LL),reale(38156138,0xf0096c8a4a800LL), -reale(4683041,0xee399b1b9d000LL),-reale(1149725,0xbf46657f8c800LL), -reale(1106736,0x8c2ceac93e180LL),reale(45119934611LL,0xe897fd72d67cbLL), // C4[5], coeff of eps^10, polynomial in n of order 19 -real(0x3bd4906e474e000LL),-real(0x97941b80ce3c000LL), -real(0x1a66716bc5afa000LL),-real(0x532298a0bc3e0000LL), -reale(4939,0xda9250746000LL),-reale(23308,0x7863f72384000LL), -reale(164254,0x558c90eef2000LL),-reale(3056120,0xcef6e5fe8000LL), reale(48766418,0xafc6204b42000LL),-reale(213414260,0xdc9b1ebcc000LL), reale(425806905,0x15318e0496000LL),-reale(369415923,0x757d6c39f0000LL), -reale(31178847,0x2c748765b6000LL),reale(306118804,0x213b4942ec000LL), -reale(181898310,0x263b289662000LL),reale(568685,0x4686791808000LL), -reale(309548,0x34bb55302e000LL),reale(32975540,0x34fcc4d2a4000LL), -reale(16246779,0x8dca2dd5da000LL),reale(1477949,0xdae92a7065f00LL), reale(45119934611LL,0xe897fd72d67cbLL), // C4[5], coeff of eps^9, polynomial in n of order 20 -real(0x69d018a3b9e000LL),-real(0xed437c3919a800LL), -real(0x237e48279feb000LL),-real(0x5bea2151a0b3800LL), -real(0x10666acb6ec18000LL),-real(0x350c7e1643d3c800LL), -reale(3247,0xe2be74bf45000LL),-reale(15860,0x268da19a55800LL), -reale(116263,0x5e4790b892000LL),-reale(2266502,0x8314b6fb1e800LL), reale(38294967,0xecf46ee8e1000LL),-reale(180538484,0x555f9ed2b7800LL), reale(401643505,0x9c33fda5f4000LL),-reale(432258273,0xf8da98e440800LL), reale(101814780,0x5dd5e11f87000LL),reale(252370005,0x80f91f9d26800LL), -reale(252307179,0x99e21a8986000LL),reale(63455824,0x191a53ee5d800LL), reale(12621880,0x95e41abad000LL),reale(2033357,0xc3307b9c44800LL), -reale(4727243,0x20838a8bae80LL),reale(45119934611LL,0xe897fd72d67cbLL), // C4[5], coeff of eps^8, polynomial in n of order 21 -real(0xc09a6adbf4000LL),-real(0x18cab6e3030000LL), -real(0x359d0ace62c000LL),-real(0x7ab7d9cc438000LL), -real(0x12c67ab580a4000LL),-real(856171152199LL<<18), -real(0x9233f1c13ddc000LL),-real(0x1e779de654b48000LL), -real(0x789f22a00b054000LL),-reale(9796,7021023797LL<<16), -reale(75089,0xae07706a8c000LL),-reale(1543001,0x638fcd4c58000LL), reale(27798321,0x1e96e700fc000LL),-reale(142306959,0xd3ad6eb8e0000LL), reale(355697955,0xce7f78ffc4000LL),-reale(469861249,0x5989105b68000LL), reale(259457720,0x1370b4ff4c000LL),reale(112194489,0x36d40ed990000LL), -reale(260872269,0xf8005192ec000LL),reale(151422395,0x58f7b5f388000LL), -reale(32332898,0xbdc6e34964000LL),reale(433029,0xe4d3ce78fba00LL), reale(45119934611LL,0xe897fd72d67cbLL), // C4[5], coeff of eps^7, polynomial in n of order 22 -real(0x1441fa2f35000LL),-real(0x272c726527800LL), -real(0x4ebdd7b856000LL),-real(0xa564301b74800LL), -real(0x16d6333bd37000LL),-real(0x3580dec1951800LL), -real(0x865ae53c178000LL),-real(0x16ec61d7f65e800LL), -real(0x455fa2e228b9000LL),-real(0xef77f4cbfa3b800LL), -real(0x3d9c6e708569a000LL),-reale(5230,0x8a511fbc88800LL), -reale(42196,0xcfdba8cebb000LL),-reale(920786,0xf57a80c4e5800LL), reale(17837247,0x2fc56aab44000LL),-reale(100064916,0x5e72032af2800LL), reale(283253574,0xc37962f3c3000LL),-reale(455567530,0xe21e28364f800LL), reale(400948026,0xf028b16722000LL),-reale(118913774,0x549816fe9c800LL), -reale(112010399,0x36034a3e3f000LL),reale(121825743,0x78c43cf486800LL), -reale(36338425,0x426e19287b880LL), reale(45119934611LL,0xe897fd72d67cbLL), // C4[5], coeff of eps^6, polynomial in n of order 23 -real(0x1b5badebe000LL),-real(0x326332ca4000LL),-real(0x5fd1bd93a000LL), -real(0xbcd8e5378000LL),-real(0x1837bef256000LL), -real(0x3404424ccc000LL),-real(0x75bf8cd1d2000LL), -real(38025986691LL<<17),-real(0x2dc96f11f6e000LL), -real(0x811a6e895f4000LL),-real(0x195036bc82ea000LL), -real(0x5af70d135548000LL),-real(0x187d57cdaa406000LL), -reale(2189,0x32d399c61c000LL),-reale(18742,0x385cb42a82000LL), -reale(438375,0xd6a8872030000LL),reale(9224813,0x89f7eb41e2000LL), -reale(57288808,0xfdc8999b44000LL),reale(184899999,0x331692f966000LL), -reale(357870966,0x3154fb6f18000LL),reale(431875147,0x7929b7544a000LL), -reale(318710001,0xe0f19bd36c000LL),reale(131641087,0xbb852faace000LL), -reale(23311442,0x9e8a4070e9d00LL), reale(45119934611LL,0xe897fd72d67cbLL), // C4[5], coeff of eps^5, polynomial in n of order 24 -real(92116035LL<<14),-real(0x26e7bc2d800LL),-real(0x46d3779b000LL), -real(0x84e1d0c0800LL),-real(0x101cbc30a000LL),-real(0x2073376e3800LL), -real(0x442adb8b9000LL),-real(0x963884ff6800LL),-real(0x15dbd71e08000LL), -real(0x363ebc6d59800LL),-real(0x9122bbd857000LL), -real(0x1a90a4ab06c800LL),-real(0x56f0a68cd06000LL), -real(0x147a29992a8f800LL),-real(0x5d1402e6c175000LL), -real(0x228e263277d22800LL),-reale(5078,0x584c613b04000LL), -reale(128863,0x92233985800LL),reale(2982258,0xd360aa0ed000LL), -reale(20710125,0x5bbe664118800LL),reale(76213261,0x519df32cfe000LL), -reale(171479837,0xf7a363253b800LL),reale(241341994,0x2d1ed763cf000LL), -reale(186491540,0xf45203874e800LL),reale(58278606,0x8c59a11a48880LL), reale(45119934611LL,0xe897fd72d67cbLL), // C4[6], coeff of eps^29, polynomial in n of order 0 139264,real(63626127165LL), // C4[6], coeff of eps^28, polynomial in n of order 1 real(247833LL<<16),real(4782743552LL),real(0x219ae3fb400f15LL), // C4[6], coeff of eps^27, polynomial in n of order 2 real(420150473LL<<18),-real(0x876551ce0000LL),real(0x350bfa156000LL), reale(4837,0x68f14547adebLL), // C4[6], coeff of eps^26, polynomial in n of order 3 real(0x297e6b0e9e1000LL),-real(0x2e90de909aa000LL), real(0x6148b0a84b000LL),real(0x1d77336bca600LL), reale(207992,0x1a086a30a3679LL), // C4[6], coeff of eps^25, polynomial in n of order 4 real(0x10bc6a9e4ee30000LL),-real(0xc179e3d40c9c000LL), real(0x3edf483df118000LL),-real(0x5c91fff78634000LL), real(0x216fdab58654400LL),reale(10078162,0xbedd8dc0620e7LL), // C4[6], coeff of eps^24, polynomial in n of order 5 reale(17715,0xdb1cfba26000LL),-reale(7689,0x9976d7f948000LL), reale(6474,0xb1047d5d4a000LL),-reale(6855,0xa6eeabbaa4000LL), real(0x2ac3e335ea26e000LL),real(0xd6d2e7c22e28400LL), reale(372892021,0x96057cce2c163LL), // C4[6], coeff of eps^23, polynomial in n of order 6 reale(279883,0xa92c150938000LL),-reale(86797,0xd10c69f53c000LL), reale(160072,0xfd9d58a4d0000LL),-reale(96731,0xc2b3d16724000LL), reale(32938,0x46d62be868000LL),-reale(52162,0xc27e2d9b0c000LL), reale(17103,0x67a9fde667c00LL),reale(4101812237LL,0x723c5cdbe4f41LL), // C4[6], coeff of eps^22, polynomial in n of order 7 reale(293467,0x7db7c77729000LL),-reale(146628,0x46fd92fe6000LL), reale(282074,0xcdca0f3f8b000LL),-reale(92435,0x174eb2c344000LL), reale(105774,0xf5edeb18ed000LL),-reale(100726,0x78839052a2000LL), reale(6619,0xde4489894f000LL),reale(2174,0xdeb0a21cf2e00LL), reale(4101812237LL,0x723c5cdbe4f41LL), // C4[6], coeff of eps^21, polynomial in n of order 8 reale(183603,8337878185LL<<19),-reale(387951,0x8934978f10000LL), reale(363243,0x9b8677d760000LL),-reale(100927,0x6adc79e30000LL), reale(246790,7131746729LL<<18),-reale(115867,0xce56197550000LL), reale(45470,0x976a005d20000LL),-reale(74789,0x6bec0ac470000LL), reale(21823,0x7d1eb3d72b000LL),reale(4101812237LL,0x723c5cdbe4f41LL), // C4[6], coeff of eps^20, polynomial in n of order 9 reale(2390210,0x71ea4526d8000LL),-reale(11473167,6397281565LL<<18), reale(3566140,0xe9fdb6daa8000LL),-reale(3459649,0xbdbfad5d70000LL), reale(5328875,0xe507b89678000LL),-reale(1202839,0xbeff1963a0000LL), reale(2208040,0x527339ea48000LL),-reale(1770989,0xb71cae09d0000LL), reale(48626,0x557ebf6618000LL),reale(16670,0x4a1716aa8d000LL), reale(53323559086LL,0xcd10b72aa064dLL), // C4[6], coeff of eps^19, polynomial in n of order 10 reale(16170911,0xf66942f9a0000LL),-reale(15946100,0x87937e1ff0000LL), reale(1191966,5683381737LL<<19),-reale(10381645,0x67a9610710000LL), reale(5401104,0xec5f94af60000LL),-reale(1916345,0x9f2b7d6630000LL), reale(5166787,7293640425LL<<18),-reale(1681428,0xa094a5ad50000LL), reale(912008,0xad6a83a520000LL),-reale(1452992,0x3f13404c70000LL), reale(367621,0xca46f4fdbb000LL),reale(53323559086LL,0xcd10b72aa064dLL), // C4[6], coeff of eps^18, polynomial in n of order 11 reale(51879505,0x1c6021da42000LL),-reale(3388727,0x452f2e2244000LL), reale(10993546,0x58785d1036000LL),-reale(19450323,0x2862de39d0000LL), reale(1456775,0xebc764482a000LL),-reale(7922511,0x8d8f4f815c000LL), reale(7390372,0xfe1ce59e1e000LL),-reale(1065019,0x2a2a06ce8000LL), reale(3871757,0x7ef447ee12000LL),-reale(2395461,0x8df44bf074000LL), -reale(40351,0xb597a7abfa000LL),-reale(17707,0xeba2dcf1c1400LL), reale(53323559086LL,0xcd10b72aa064dLL), // C4[6], coeff of eps^17, polynomial in n of order 12 reale(18941665,0xd940803e20000LL),-reale(2462456,0xc647b5b638000LL), reale(55543449,0x9a9f25d270000LL),-reale(10182797,0xdffcb19ee8000LL), reale(4836527,0xb44e233ec0000LL),-reale(21402374,0x58dcab98000LL), reale(3817083,0xbef1c88b10000LL),-reale(4459099,0x992120d448000LL), reale(8502561,0xac3fb5bf60000LL),-reale(1525489,0x80b8b610f8000LL), reale(1649611,0x4cebe6e3b0000LL),-reale(2280763,0x4f507e59a8000LL), reale(482782,0x1ffc428c24800LL),reale(53323559086LL,0xcd10b72aa064dLL), // C4[6], coeff of eps^16, polynomial in n of order 13 reale(169672066,0xfc4e53058c000LL),-reale(255936417,0xcd4166f930000LL), reale(43044311,0x58bada2414000LL),reale(10984552,0x79ecf34458000LL), reale(54615551,0xb3c2ab069c000LL),-reale(20672829,0x547b9ae620000LL), -reale(762958,0xc96d76adc000LL),-reale(20252510,0xad74c43098000LL), reale(8266131,0x9541dc37ac000LL),-reale(1263055,0x9458475310000LL), reale(7416125,0xebded0d634000LL),-reale(3121438,0x16f54c0588000LL), -reale(225538,0xf843322744000LL),-reale(111163,0x41ef8785bb800LL), reale(53323559086LL,0xcd10b72aa064dLL), // C4[6], coeff of eps^15, polynomial in n of order 14 -reale(371272727,0xe93844d330000LL),reale(258600199,0x3ab9b44ef8000LL), reale(127447726,0xd7dad2fc20000LL),-reale(278220404,0x7730102b8000LL), reale(77869881,0xad9b189b70000LL),reale(21813766,0xb09d2ff98000LL), reale(46644312,9197745227LL<<18),-reale(33841430,0x25b28aa218000LL), -reale(3096455,0x6fa54a95f0000LL),-reale(14807144,0xa86ee6dfc8000LL), reale(13281582,0xf66e06a960000LL),-reale(452377,0x35cd9cb178000LL), reale(3621811,0x85d91d8b0000LL),-reale(3791781,0x3a80710f28000LL), reale(636887,0x5f8cc1d1bc800LL),reale(53323559086LL,0xcd10b72aa064dLL), // C4[6], coeff of eps^14, polynomial in n of order 15 -reale(40751652,0x879256f716000LL),reale(182461023,0x62c00442f4000LL), -reale(366891419,0xe235688602000LL),reale(303920923,0x2a6218fe88000LL), reale(70640959,0xa70aa30512000LL),-reale(290919308,0xf0cc1f4de4000LL), reale(124435738,0x116d522626000LL),reale(24575054,0x49539549b0000LL), reale(29829722,0x6d4c4f193a000LL),-reale(46205497,0xcd680acebc000LL), reale(1253661,0x8798d15a4e000LL),-reale(5829398,0x329c172b28000LL), reale(15178042,0x87d0f72562000LL),-reale(3413258,0x604057df94000LL), -reale(544537,0x1343d1098a000LL),-reale(371792,0x5ec0380ab3400LL), reale(53323559086LL,0xcd10b72aa064dLL), // C4[6], coeff of eps^13, polynomial in n of order 16 reale(100946,21976965LL<<20),reale(2010862,0x3c46708bb0000LL), -reale(34502092,0x6e09dbf3a0000LL),reale(163298206,0x527fb2e110000LL), -reale(355839921,948516465LL<<18),reale(347383598,0x3243b82e70000LL), -reale(2611762,0xae3f6124e0000LL),-reale(286060486,421499843LL<<16), reale(181022396,2339564421LL<<19),reale(11053843,0x8ea9e8f130000LL), reale(5354229,0xc704cb69e0000LL),-reale(50862137,0xf12aeaf970000LL), reale(14064844,5665935493LL<<18),reale(1748678,0x2e869553f0000LL), reale(9719088,0x671cfc38a0000LL),-reale(6714197,0x76aa8fd6b0000LL), reale(816805,0x9ce5b98e4f000LL),reale(53323559086LL,0xcd10b72aa064dLL), // C4[6], coeff of eps^12, polynomial in n of order 17 real(0x75cff722d22b8000LL),reale(9742,5260669319LL<<19), reale(75734,0x79163f0448000LL),reale(1568684,0xd935dd4310000LL), -reale(28213944,0x88db35f228000LL),reale(141802366,0xe4716652a0000LL), -reale(336424367,0x7aaa4f7098000LL),reale(384795625,0xe2aff0230000LL), -reale(92516926,0xbd45322708000LL),-reale(252728877,4730701433LL<<18), reale(239978666,0xfd893c3a88000LL),-reale(28528394,5445461995LL<<16), -reale(18370370,0x5cd8a4fbe8000LL),-reale(38961300,0x78b7628f20000LL), reale(30014507,0xb37b1485a8000LL),-reale(654615,0xa96a2bf90000LL), -reale(667571,0x85c41bf0c8000LL),-reale(1181523,0x1c81baa857000LL), reale(53323559086LL,0xcd10b72aa064dLL), // C4[6], coeff of eps^11, polynomial in n of order 18 real(0x55d873de6520000LL),real(0x12c7cfeef6810000LL), real(0x4e200e3f1e1LL<<20),reale(6671,0xd2467fb9f0000LL), reale(53806,3275978471LL<<17),reale(1163348,0xd1cfb7f3d0000LL), -reale(22032298,0xf3cc53d740000LL),reale(118198962,4397370971LL<<16), -reale(306929389,0x72efa76b60000LL),reale(409945031,0xba4df5f90000LL), -reale(195574008,5584443935LL<<19),-reale(178055138,0x4cd4f3ce90000LL), reale(282861404,0xd715020c60000LL),-reale(99637722,0xf11193d4b0000LL), -reale(20986520,0xfb661347c0000LL),-reale(8771627,7018708525LL<<16), reale(31360164,0xdb2c51c420000LL),-reale(12477955,8590832271LL<<16), reale(873590,0xbe0d3e9693000LL),reale(53323559086LL,0xcd10b72aa064dLL), // C4[6], coeff of eps^10, polynomial in n of order 19 real(0x5808512b12b000LL),real(0xfaa729276e2000LL), real(0x3175560e4519000LL),real(0xb21b680b3a90000LL), real(0x2fcbc5fe71407000LL),reale(4229,0xf0de326e3e000LL), reale(35532,0x38e22907f5000LL),reale(805604,0x42db4fa3ec000LL), -reale(16150031,0xfe4d67d51d000LL),reale(93034137,0xf6628ead9a000LL), -reale(265995225,0x398943192f000LL),reale(414315266,0x970145dd48000LL), -reale(301204836,0xc549c7ba41000LL),-reale(51738066,0x4e1063bb0a000LL), reale(275650719,0x10481031ad000LL),-reale(187610845,0x85f00095c000LL), reale(25230256,0x4ada23b49b000LL),reale(13917204,0x3da6dc4452000LL), reale(4066715,0x8660f73889000LL),-reale(4361677,0xea98323d07e00LL), reale(53323559086LL,0xcd10b72aa064dLL), // C4[6], coeff of eps^9, polynomial in n of order 20 real(0x65fa8c6bf0000LL),real(0xfe88642ae4000LL),real(0x2aa82304e58000LL), real(0x7ca8bddcccc000LL),real(434853972467LL<<18), real(0x5e16320d44b4000LL),real(0x1a2859bf40b28000LL), reale(2409,0x1b825da69c000LL),reale(21179,0xabe6860d90000LL), reale(506292,0x5b6e5f0684000LL),-reale(10810252,0xeee1886808000LL), reale(67327238,0xa18a80786c000LL),-reale(213364581,0xe79aac41a0000LL), reale(387619687,0x51e3ba1054000LL),-reale(387180015,0xd550406b38000LL), reale(121695298,0x2400c6e23c000LL),reale(172879787,0x9e57682f30000LL), -reale(230507460,0xb74e70fddc000LL),reale(112381926,0x4eee70a198000LL), -reale(20283371,0x42949e7bf4000LL),-reale(288686,0x988d3450a7c00LL), reale(53323559086LL,0xcd10b72aa064dLL), // C4[6], coeff of eps^8, polynomial in n of order 21 real(0x72e86a7de000LL),real(8772831327LL<<15),real(0x273ffc1812000LL), real(0x64635c5cac000LL),real(0x11473cdd246000LL), real(0x33fd816c260000LL),real(0xae6e2137a7a000LL), real(0x29ff10928814000LL),real(0xc26a115cf4ae000LL), real(0x492994f20c1c8000LL),reale(10833,0x80f3c9e4e2000LL), reale(274842,0xd406a2037c000LL),-reale(6296293,0xca802ed0ea000LL), reale(42731189,0xb6f3d1e130000LL),-reale(151191524,0x41a7e788b6000LL), reale(320575109,0xae49526ee4000LL),-reale(416345568,0xb8c8445e82000LL), reale(298319523,0xb52957c098000LL),-reale(42956565,0x78799bae4e000LL), -reale(119892798,0x70342c95b4000LL),reale(103927174,0x8691916be6000LL), -reale(29157346,0x2fb5a3d22ec00LL), reale(53323559086LL,0xcd10b72aa064dLL), // C4[6], coeff of eps^7, polynomial in n of order 22 real(74709635LL<<15),real(0x4ba47734000LL),real(0xa7b994d0000LL), real(0x1869c5c6c000LL),real(0x3c23e3d88000LL),real(0x9e1c8b7a4000LL), real(1882100649LL<<18),real(0x573ad5a4dc000LL),real(0x12f915ab6f8000LL), real(0x4c1f4084014000LL),real(0x170ced7cbfb0000LL), real(0x921b89aca54c000LL),real(0x599b4a7922068000LL), reale(38914,0x1efa73f084000LL),-reale(964915,0x51a6da0ae0000LL), reale(7200274,0x92a23dbc000LL),-reale(28652022,0x356dea628000LL), reale(70837833,0x39cdeca8f4000LL),-reale(114872161,0xfcdf3a9570000LL), reale(122704354,0xd9bfe74e2c000LL),-reale(83141739,0x9edadabcb8000LL), reale(32332898,0xbdc6e34964000LL),-reale(5485045,0x527ae1fc73400LL), reale(17774519695LL,0x99b03d0e3576fLL), // C4[6], coeff of eps^6, polynomial in n of order 23 real(257316433920LL),real(517719121920LL),real(0xfb6e649000LL), real(0x221f7064000LL),real(0x4d84a37f000LL),real(0xb958155a000LL), real(0x1d5dd0db5000LL),real(0x4faa5a050000LL),real(0xea04686eb000LL), real(0x2f40e3db46000LL),real(0xab8623d121000LL),real(0x2d147c4903c000LL), real(0xe63ae874e57000LL),real(0x60cd21bcc932000LL), real(0x3f869e23e408d000LL),reale(29814,0xcc97221028000LL), -reale(808726,0x6d837bf63d000LL),reale(6700876,0x1daf27af1e000LL), -reale(30153942,0x8594329407000LL),reale(86154121,0x7da76bf014000LL), -reale(165128732,0xdb80e436d1000LL),reale(210163841,0xd18cc55d0a000LL), -reale(153581269,0x570b79c9b000LL),reale(46622885,0x3d1480e1d3a00LL), reale(53323559086LL,0xcd10b72aa064dLL), // C4[7], coeff of eps^29, polynomial in n of order 0 real(13087612928LL),real(0x90e6983c364f3dLL), // C4[7], coeff of eps^28, polynomial in n of order 1 -real(161707LL<<21),real(7239297LL<<14),real(0xcf8f801ee602cdLL), // C4[7], coeff of eps^27, polynomial in n of order 2 -real(3500022825LL<<20),real(630513507LL<<19),real(0x6038c37fa000LL), reale(72555,0x626230f3330c5LL), // C4[7], coeff of eps^26, polynomial in n of order 3 -real(92252949633LL<<21),real(16187170389LL<<22), -real(51975912235LL<<21),real(0x7c00d0f2b78000LL), reale(3119881,0x867e38d993117LL), // C4[7], coeff of eps^25, polynomial in n of order 4 -real(0x64d0a86bae7c0000LL),real(0x7c07ce24c65f0000LL), -real(0x739ece76489e0000LL),real(0x6e7bce15f550000LL), real(0x24fc420030b8400LL),reale(127915142,0x8a371ad88dcafLL), // C4[7], coeff of eps^24, polynomial in n of order 5 -reale(5990,0xbd2326cc40000LL),reale(14992,4018200301LL<<20), -reale(6873,8929851351LL<<18),reale(2782,8051012645LL<<19), -reale(4583,0xc89924b340000LL),real(0x52aed30dcf988800LL), reale(430260024,0xe82db7640b7c1LL), // C4[7], coeff of eps^23, polynomial in n of order 6 -reale(169326,4206873009LL<<17),reale(261065,0x25b4e353d0000LL), -reale(59142,0xf0c50992c0000LL),reale(111182,4597550539LL<<16), -reale(88869,504433083LL<<17),reale(2313,0xe34bfe3f90000LL), real(0x32dc48b9e1d23400LL),reale(4732860273LL,0xf9f6e14c7e54bLL), // C4[7], coeff of eps^22, polynomial in n of order 7 -reale(467157,1100000847LL<<20),reale(258178,755278933LL<<21), -reale(91474,559664221LL<<20),reale(248285,171426119LL<<22), -reale(82821,231309675LL<<20),reale(44668,65972935LL<<21), -reale(71456,2669582201LL<<20),reale(18220,0x9846e079d4000LL), reale(4732860273LL,0xf9f6e14c7e54bLL), // C4[7], coeff of eps^21, polynomial in n of order 8 -reale(10858183,1145150433LL<<21),reale(1155453,0xa514064740000LL), -reale(4408275,1110140307LL<<19),reale(4494002,0xa8330ec1c0000LL), -reale(693747,3759921697LL<<20),reale(2336198,8880970129LL<<18), -reale(1499288,4981657777LL<<19),-reale(18466,6402610053LL<<18), -reale(7818,0x6ee4879b83000LL),reale(61527183561LL,0xb18970e26a4cfLL), // C4[7], coeff of eps^20, polynomial in n of order 9 -reale(7907170,4058896835LL<<20),reale(1601483,335338375LL<<23), -reale(11238504,3427529005LL<<20),reale(2745284,1787777405LL<<21), -reale(2325455,2252860775LL<<20),reale(4939939,712213223LL<<22), -reale(1021126,555773201LL<<20),reale(952760,1631005375LL<<21), -reale(1365312,965324491LL<<20),reale(299618,0x2f589c3f22000LL), reale(61527183561LL,0xb18970e26a4cfLL), // C4[7], coeff of eps^19, polynomial in n of order 10 reale(5811147,7891888051LL<<19),reale(19155879,6260648859LL<<18), -reale(13234724,832589145LL<<21),-reale(473729,0xaccee67ac0000LL), -reale(9690431,2460044795LL<<19),reale(5218195,5282091375LL<<18), -reale(699193,3313511321LL<<20),reale(4032431,0xb01d955a40000LL), -reale(1901524,5999844905LL<<19),-reale(111197,715304509LL<<18), -reale(51622,0xdda253af9f000LL),reale(61527183561LL,0xb18970e26a4cfLL), // C4[7], coeff of eps^18, polynomial in n of order 11 -reale(34477536,1085877825LL<<20),reale(44845230,817114545LL<<21), reale(4606432,1572161669LL<<20),reale(12496576,210421693LL<<23), -reale(18271471,1543698101LL<<20),-reale(128700,742574025LL<<21), -reale(6139017,689151983LL<<20),reale(7385046,100502461LL<<22), -reale(590509,2783893289LL<<20),reale(1800602,699157181LL<<21), -reale(2092277,3566080099LL<<20),reale(381025,0x99466ecd7c000LL), reale(61527183561LL,0xb18970e26a4cfLL), // C4[7], coeff of eps^17, polynomial in n of order 12 -reale(152644671,981125379LL<<19),-reale(24136152,0xd3514f38e0000LL), -reale(16909786,8097141141LL<<18),reale(53988238,0xc115854860000LL), -reale(2192558,3293732289LL<<20),reale(3853073,2819007469LL<<17), -reale(20689919,5309095411LL<<18),reale(3514368,0xf1b4463ee0000LL), -reale(1814216,3975618817LL<<19),reale(7354899,0xbd88356420000LL), -reale(2207882,191252177LL<<18),-reale(269543,3717910997LL<<17), -reale(156646,0x7bcb3b3a6a800LL),reale(61527183561LL,0xb18970e26a4cfLL), // C4[7], coeff of eps^16, polynomial in n of order 13 reale(52565396,753292423LL<<19),reale(252855342,568744119LL<<21), -reale(197183211,7281644191LL<<19),-reale(6678358,3552459447LL<<20), reale(4519131,7283469291LL<<19),reale(56648760,112164189LL<<22), -reale(15289276,2020707835LL<<19),-reale(3713103,1403767329LL<<20), -reale(17880720,7304289905LL<<19),reale(9494998,1497636157LL<<21), reale(492167,2907561065LL<<19),reale(3952538,4294903605LL<<20), -reale(3358139,5130468237LL<<19),reale(480004,0x1e727719e9000LL), reale(61527183561LL,0xb18970e26a4cfLL), // C4[7], coeff of eps^15, polynomial in n of order 14 reale(279617399,0xd9972cba40000LL),-reale(353187715,0x687b832220000LL), reale(118965967,4456434973LL<<19),reale(220096359,3595022681LL<<17), -reale(240814657,8170991797LL<<18),reale(28075084,0xec7a345460000LL), reale(24758769,1818605983LL<<20),reale(48013974,0xb5345431a0000LL), -reale(32373431,0xc7bac8f4c0000LL),-reale(5075135,8642954025LL<<17), -reale(9094832,6469786017LL<<19),reale(13639028,3685620545LL<<17), -reale(1773068,1431802737LL<<18),-reale(460476,0x51ab5a8ea0000LL), -reale(423738,0x5d98934922800LL),reale(61527183561LL,0xb18970e26a4cfLL), // C4[7], coeff of eps^14, polynomial in n of order 15 reale(16417106,2408387839LL<<20),-reale(93245803,1562234793LL<<21), reale(256985456,250552029LL<<20),-reale(365861944,857240429LL<<22), reale(190902238,1499270843LL<<20),reale(163412998,1423242741LL<<21), -reale(274443985,2668181351LL<<20),reale(82958237,163620913LL<<23), reale(33859016,1729347703LL<<20),reale(25275487,1495319443LL<<21), -reale(45844273,3794232747LL<<20),reale(4490176,231613489LL<<22), reale(1010900,690735667LL<<20),reale(10013483,1036831025LL<<21), -reale(5637707,2068106223LL<<20),reale(570308,0x8f0afe45ec000LL), reale(61527183561LL,0xb18970e26a4cfLL), // C4[7], coeff of eps^13, polynomial in n of order 16 -reale(25657,393048869LL<<22),-reale(608651,0xacbc40d5c0000LL), reale(12764052,2144856077LL<<19),-reale(76823449,3121867141LL<<18), reale(228672619,4131243473LL<<20),-reale(367062288,0xf756dca4c0000LL), reale(263470997,8569317111LL<<19),reale(78573490,0xffb10f8fc0000LL), -reale(283548774,1794660389LL<<21),reale(154702622,9227087281LL<<18), reale(16937276,1939608161LL<<19),-reale(6432822,7897704317LL<<18), -reale(43016670,946798949LL<<20),reale(22087851,0xaa7600dd40000LL), reale(1665577,8523064651LL<<19),-reale(163221,0xe0acad2e40000LL), -reale(1189371,0x766c2260a3000LL),reale(61527183561LL,0xb18970e26a4cfLL), // C4[7], coeff of eps^12, polynomial in n of order 17 -real(0x13bc5107d5fLL<<20),-real(506650109317LL<<24), -reale(17217,2185571073LL<<20),-reale(426469,557216187LL<<21), reale(9411503,1140836685LL<<20),-reale(60299258,66945391LL<<22), reale(194753933,1835852139LL<<20),-reale(352928157,2046106529LL<<21), reale(328231147,2405007161LL<<20),-reale(34561926,360605189LL<<23), -reale(248371006,3915897705LL<<20),reale(226668375,1401273273LL<<21), -reale(40114392,2920598683LL<<20),-reale(25898188,1028871717LL<<22), -reale(16043876,2538787453LL<<20),reale(28698456,1825641427LL<<21), -reale(9602688,2437057327LL<<20),reale(502063,0xa52218333a000LL), reale(61527183561LL,0xb18970e26a4cfLL), // C4[7], coeff of eps^11, polynomial in n of order 18 -real(81880241733LL<<19),-real(651169421489LL<<18), -real(194261131981LL<<22),-real(0x4616f301f1bc0000LL), -reale(10659,7786635659LL<<19),-reale(276843,0xf150eaf340000LL), reale(6459374,425055961LL<<20),-reale(44283297,2370521611LL<<18), reale(156003403,8328479919LL<<19),-reale(319848045,0xab86b09a40000LL), reale(372382116,1407449139LL<<21),-reale(166870261,0xbaeb2e09c0000LL), -reale(148815577,7753476247LL<<19),reale(260443738,1330203003LL<<18), -reale(131653575,428167437LL<<20),reale(2775725,691412797LL<<18), reale(12306214,6299226531LL<<19),reale(5355345,9401097695LL<<18), -reale(3966302,0xcbc08bfb17000LL),reale(61527183561LL,0xb18970e26a4cfLL), // C4[7], coeff of eps^10, polynomial in n of order 19 -real(1704454843LL<<20),-real(2722537665LL<<21),-real(19434970697LL<<20), -real(4989045369LL<<24),-real(394962411735LL<<20), -real(0x128b33efecfLL<<21),-reale(5903,789230693LL<<20), -reale(161527,569013611LL<<22),reale(4006338,1271698701LL<<20), -reale(29564239,1312346333LL<<21),reale(114267945,2347153791LL<<20), -reale(265827046,63320697LL<<23),reale(379233361,4202669809LL<<20), -reale(292689947,1148927723LL<<21),reale(19915451,3747715939LL<<20), reale(197711494,385979271LL<<22),-reale(197401730,911113003LL<<20), reale(83971818,387288839LL<<21),-reale(12852829,1345691321LL<<20), -reale(602476,0x5fc28370ac000LL),reale(61527183561LL,0xb18970e26a4cfLL), // C4[7], coeff of eps^9, polynomial in n of order 20 -real(304621785LL<<18),-real(0xc9814e4b0000LL),-real(5069418237LL<<17), -real(0x7c4fe70d90000LL),-real(7691534469LL<<20), -real(0x7a02179d470000LL),-real(0x274586580a60000LL), -real(0x10907db87bd50000LL),-reale(2773,9732262223LL<<18), -reale(80424,78339267LL<<16),reale(2134032,0xd8c3d9bae0000LL), -reale(17066460,0x8709888510000LL),reale(72842964,6932239995LL<<19), -reale(192914141,0x448548ebf0000LL),reale(332328916,0xa61d5e5020000LL), -reale(364348462,0x260e7984d0000LL),reale(215166704,0xfd6630ec0000LL), reale(5301792,6304582341LL<<16),-reale(118567350,0x6a550b6aa0000LL), reale(89166503,0x5c73fd2370000LL),-reale(23960987,0x75c7f62663400LL), reale(61527183561LL,0xb18970e26a4cfLL), // C4[7], coeff of eps^8, polynomial in n of order 21 -real(11869221LL<<18),-real(7450235LL<<20),-real(79397539LL<<18), -real(113271327LL<<19),-real(700448177LL<<18),-real(148973407LL<<22), -real(9118660335LL<<18),-real(20216702289LL<<19), -real(0xcadd965ff40000LL),-real(386512744317LL<<20), -real(0xf93c68aca7bLL<<18),-reale(30847,5279995331LL<<19), reale(882325,8584251383LL<<18),-reale(7706931,2116826591LL<<21), reale(36580048,2730390969LL<<18),-reale(110604386,3847062005LL<<19), reale(227103584,0x9e98f54ac0000LL),-reale(323034443,1752619391LL<<20), reale(314251676,0xb5ebcf2b40000LL),-reale(199218854,3061725287LL<<19), reale(73903768,9476063903LL<<18),-reale(12124837,0x72a953b85800LL), reale(61527183561LL,0xb18970e26a4cfLL), // C4[7], coeff of eps^7, polynomial in n of order 22 -real(575575LL<<17),-real(2681133LL<<16),-real(1637545LL<<18), -real(16890107LL<<16),-real(23159565LL<<17),-real(0x8210e690000LL), -real(27276821LL<<20),-real(0x5bebf1b70000LL),-real(3075032387LL<<17), -real(0x6a5f183250000LL),-real(40477467135LL<<18), -real(0x11b5c31caf30000LL),-real(0xd14cd352ff20000LL), -reale(6969,0xb17d189610000LL),reale(216834,7757873387LL<<19), -reale(2087035,0xf153506af0000LL),reale(11091105,0x4b9d7f7a20000LL), -reale(38290720,0xa99fbe31d0000LL),reale(91897729,0x9718fbaac0000LL), -reale(156643857,0x418d7e6eb0000LL),reale(184759421,0x6102c9a360000LL), -reale(129331594,0xf71b8d2590000LL),reale(38395317,0x415c2de726c00LL), reale(61527183561LL,0xb18970e26a4cfLL), // C4[8], coeff of eps^29, polynomial in n of order 0 real(7241<<16),real(0x112c657acf71bLL), // C4[8], coeff of eps^28, polynomial in n of order 1 real(1165359LL<<20),real(3168035LL<<17),real(0x21ffb4a731cf423fLL), // C4[8], coeff of eps^27, polynomial in n of order 2 real(41827383LL<<21),-real(137865429LL<<20),real(631109843LL<<16), reale(4837,0x68f14547adebLL), // C4[8], coeff of eps^26, polynomial in n of order 3 real(54350489115LL<<22),-real(21656377197LL<<23),real(1080358617LL<<22), real(0x5c4a2579a0000LL),reale(3535865,0xba8f0d3ad9e09LL), // C4[8], coeff of eps^25, polynomial in n of order 4 reale(4480,63845967LL<<22),-real(0x5f0bc8cec07LL<<20), real(0x198015cca1fLL<<21),-real(0x51d1e6f78cdLL<<20), real(0x14fb331d33f30000LL),reale(144970494,0xe0e91e6ce4f71LL), // C4[8], coeff of eps^24, polynomial in n of order 5 reale(226427,7535956641LL<<17),-reale(36730,6647829291LL<<19), reale(116830,5936429895LL<<17),-reale(76966,613785099LL<<18), -real(0x2a948e8d73a60000LL),-real(0x116572b5168a4000LL), reale(5363908310LL,0x81b165bd17b55LL), // C4[8], coeff of eps^23, polynomial in n of order 6 reale(151394,3866446399LL<<20),-reale(105723,1435687723LL<<19), reale(240417,2090106533LL<<21),-reale(54672,3991575693LL<<19), reale(46185,3230210197LL<<20),-reale(67790,4028416911LL<<19), reale(15270,0xa469197488000LL),reale(5363908310LL,0x81b165bd17b55LL), // C4[8], coeff of eps^22, polynomial in n of order 7 -reale(105618,1394014919LL<<21),-reale(5351753,377020849LL<<22), reale(3446650,1690522763LL<<21),-reale(453181,286167171LL<<23), reale(2431204,1637447437LL<<21),-reale(1239333,63204475LL<<22), -reale(60030,1665832481LL<<21),-reale(26716,0x6a2a5d69d0000LL), reale(69730808036LL,0x96022a9a34351LL), // C4[8], coeff of eps^21, polynomial in n of order 8 reale(4362900,465328075LL<<22),-reale(10560212,802403079LL<<19), reale(656010,2976408017LL<<20),-reale(3068612,8162681445LL<<19), reale(4482659,1990068235LL<<21),-reale(516359,5969201251LL<<19), reale(1022585,502576667LL<<20),-reale(1273161,3447687361LL<<19), reale(245310,0x45a78ad538000LL),reale(69730808036LL,0x96022a9a34351LL), // C4[8], coeff of eps^20, polynomial in n of order 9 reale(23624906,1629010283LL<<19),-reale(5851601,324958949LL<<22), reale(255419,6850290885LL<<19),-reale(10559838,1365338319LL<<20), reale(3058631,5351542623LL<<19),-reale(782822,266312293LL<<21), reale(4071490,3032871865LL<<19),-reale(1457911,2387656005LL<<20), -reale(144540,929274797LL<<19),-reale(76349,0x2c1c25d590000LL), reale(69730808036LL,0x96022a9a34351LL), // C4[8], coeff of eps^19, polynomial in n of order 10 reale(23056909,2395766741LL<<20),reale(8427619,3212023717LL<<19), reale(19522568,367619617LL<<22),-reale(12637641,5752438869LL<<19), -reale(1859539,2126155853LL<<20),-reale(7720368,2358643951LL<<19), reale(5969641,447801057LL<<21),-reale(4464,2860310889LL<<19), reale(1954609,2968726289LL<<20),-reale(1904959,7710818563LL<<19), reale(302310,0x7de136fc28000LL),reale(69730808036LL,0x96022a9a34351LL), // C4[8], coeff of eps^18, polynomial in n of order 11 -reale(34760584,1377594673LL<<21),-reale(45089279,700199389LL<<22), reale(38964787,642296389LL<<21),reale(8377867,242649263LL<<24), reale(10805340,270655563LL<<21),-reale(18348308,77894251LL<<22), -reale(8504,712824639LL<<21),-reale(2874058,104939633LL<<23), reale(7002991,271121287LL<<21),-reale(1456031,497148985LL<<22), -reale(262921,1640850307LL<<21),-reale(186713,0x66184da2b0000LL), reale(69730808036LL,0x96022a9a34351LL), // C4[8], coeff of eps^17, polynomial in n of order 12 reale(266733950,1060079417LL<<21),-reale(92315127,311764467LL<<19), -reale(39784767,2743383633LL<<20),-reale(24124714,5368290721LL<<19), reale(52035773,16490707LL<<22),-reale(214469,3779317103LL<<19), -reale(32744,3406796695LL<<20),-reale(19012957,4710528797LL<<19), reale(5897141,767669011LL<<21),reale(758445,547828629LL<<19), reale(4185368,186448291LL<<20),-reale(2955613,5547446041LL<<19), reale(363691,0xed908404b8000LL),reale(69730808036LL,0x96022a9a34351LL), // C4[8], coeff of eps^16, polynomial in n of order 13 -reale(254507630,0xe2b8b6bb40000LL),-reale(58148124,1471923579LL<<20), reale(270522720,3187458133LL<<18),-reale(149985652,7726894061LL<<19), -reale(27328603,0x99e6e9ea40000LL),reale(4011861,407374679LL<<21), reale(54943982,0xaf3dd22640000LL),-reale(17478454,3922351195LL<<19), -reale(6848089,0x9bbe86d940000LL),-reale(11885922,3297252137LL<<20), reale(11706960,678889437LL<<18),-reale(595378,2432546249LL<<19), -reale(329167,0xe066968840000LL),-reale(450081,0x595d162958000LL), reale(69730808036LL,0x96022a9a34351LL), // C4[8], coeff of eps^15, polynomial in n of order 14 -reale(166710239,3480741959LL<<20),reale(313421255,2329933911LL<<19), -reale(299209385,1287661491LL<<21),reale(24383199,5307535921LL<<19), reale(248029318,3243559867LL<<20),-reale(210032461,8189928917LL<<19), reale(10907073,960500783LL<<22),reale(29948106,2038678405LL<<19), reale(40306034,2725271357LL<<20),-reale(36745958,6196825729LL<<19), -reale(1934460,123839633LL<<21),-reale(492518,4761069735LL<<19), reale(9949315,1255380799LL<<20),-reale(4720329,388065197LL<<19), reale(398374,0x9081f25c18000LL),reale(69730808036LL,0x96022a9a34351LL), // C4[8], coeff of eps^14, polynomial in n of order 15 -reale(5499415,942753073LL<<21),reale(38811064,349279653LL<<22), -reale(140017234,1709558915LL<<21),reale(290760665,163783697LL<<23), -reale(332595868,714890693LL<<21),reale(118902683,730607999LL<<22), reale(189429058,237701737LL<<21),-reale(256456610,243945477LL<<24), reale(78365400,1246868327LL<<21),reale(35514427,78282137LL<<22), reale(8045132,96899221LL<<21),-reale(42695880,422981029LL<<23), reale(15212575,506177875LL<<21),reale(2863173,903918451LL<<22), reale(284029,1922203905LL<<21),-reale(1161079,0x6c18f2ad70000LL), reale(69730808036LL,0x96022a9a34351LL), // C4[8], coeff of eps^13, polynomial in n of order 16 reale(5407,439728533LL<<23),reale(151556,693836399LL<<19), -reale(3836797,3870271773LL<<20),reale(28742693,8016450573LL<<19), -reale(111747677,1508361473LL<<21),reale(256964119,236840267LL<<19), -reale(347691811,711701031LL<<20),reale(216072654,2622689769LL<<19), reale(88295276,790755477LL<<22),-reale(263658780,5516898905LL<<19), reale(163753678,37603151LL<<20),-reale(1803857,6339257275LL<<19), -reale(22560155,108468139LL<<21),-reale(21197875,3801517693LL<<19), reale(25658955,3111371333LL<<20),-reale(7416706,6937931487LL<<19), reale(268690,0x9ce0757848000LL),reale(69730808036LL,0x96022a9a34351LL), // C4[8], coeff of eps^12, polynomial in n of order 17 real(369814360487LL<<19),real(159053188703LL<<23), reale(3152,1136779065LL<<19),reale(92558,2295771257LL<<20), -reale(2473330,1734833909LL<<19),reale(19757571,360351901LL<<21), -reale(83162616,6619531363LL<<19),reale(212413714,2066066043LL<<20), -reale(337117487,5524436113LL<<19),reale(299293348,697772127LL<<22), -reale(51076102,4535292671LL<<19),-reale(200831521,1217539203LL<<20), reale(227963885,2651839699LL<<19),-reale(87452614,163103009LL<<21), -reale(9664164,7186873499LL<<19),reale(9739937,3920029055LL<<20), reale(6101400,4999938359LL<<19),-reale(3588081,0x84422b3e50000LL), reale(69730808036LL,0x96022a9a34351LL), // C4[8], coeff of eps^11, polynomial in n of order 18 real(3576016431LL<<20),real(32208729499LL<<19),real(10983028711LL<<23), real(0x9286be006280000LL),real(0x65e9f47db41LL<<20), reale(50386,4528870031LL<<19),-reale(1428014,1685009291LL<<21), reale(12227031,6176103481LL<<19),-reale(56007028,2392678701LL<<20), reale(159476659,5817614083LL<<19),-reale(295263705,809939737LL<<22), reale(344605761,6427356205LL<<19),-reale(202719833,951923227LL<<20), -reale(50658828,5629491977LL<<19),reale(201884255,1512264231LL<<21), -reale(166564947,5368120671LL<<19),reale(63259557,2614639991LL<<20), -reale(8140125,1990873493LL<<19),-reale(722971,0xa61c9dba68000LL), reale(69730808036LL,0x96022a9a34351LL), // C4[8], coeff of eps^10, polynomial in n of order 19 real(45596577LL<<21),real(81531441LL<<22),real(656187675LL<<21), real(191463201LL<<25),real(17391213765LL<<21),real(65094511967LL<<22), real(0x16272ee843fLL<<21),reale(23168,382193603LL<<23), -reale(700305,441535191LL<<21),reale(6465118,134564813LL<<22), -reale(32414063,913166045LL<<21),reale(103314135,145041825LL<<24), -reale(222332965,1267927603LL<<21),reale(326070132,55789563LL<<22), -reale(309964302,1355885369LL<<21),reale(149975409,308317249LL<<23), reale(35633361,576916401LL<<21),-reale(113104897,1027785623LL<<22), reale(77116975,1889590315LL<<21),-reale(20082545,0xcd53c80110000LL), reale(69730808036LL,0x96022a9a34351LL), // C4[8], coeff of eps^9, polynomial in n of order 20 real(1123785LL<<21),real(13838643LL<<19),real(23159565LL<<20), real(171251217LL<<19),real(44667189LL<<23),real(3472549135LL<<19), real(10302054723LL<<20),real(162001999341LL<<19), real(500351698399LL<<21),reale(8102,6578411627LL<<19), -reale(262912,1458939143LL<<20),reale(2634746,8016047177LL<<19), -reale(14551212,731365323LL<<22),reale(52133305,8561410375LL<<19), -reale(129964645,2819080401LL<<20),reale(232230181,2215647013LL<<19), -reale(298362920,1016411147LL<<21),reale(269480987,8039357859LL<<19), -reale(161945649,1493828379LL<<20),reale(57837731,7816254593LL<<19), -reale(9237971,9476063903LL<<15),reale(69730808036LL,0x96022a9a34351LL), // C4[8], coeff of eps^8, polynomial in n of order 21 real(292383LL<<17),real(202215LL<<19),real(2386137LL<<17), real(3789747LL<<18),real(26247507LL<<17),real(6294651LL<<21), real(437764365LL<<17),real(1112245757LL<<18),real(0x67551030e0000LL), real(28804895217LL<<19),real(0x2c0f1d988820000LL), real(0x66a336663d1c0000LL),-reale(57641,8501165381LL<<17), reale(631918,3696102011LL<<20),-reale(3870503,720372107LL<<17), reale(15639991,0xcc8b836440000LL),-reale(44892569,0xd7d7de220000LL), reale(94682509,2360318459LL<<19),-reale(147486216,0x5ecdb08ae0000LL), reale(163873573,0xbeaba7b6c0000LL),-reale(110855652,0xd3ce78fba0000LL), reale(32332898,0xbdc6e34964000LL),reale(69730808036LL,0x96022a9a34351LL), // C4[9], coeff of eps^29, polynomial in n of order 0 real(16847<<16),real(0x3d2e2985830503LL), // C4[9], coeff of eps^28, polynomial in n of order 1 -real(207753LL<<23),real(1712087LL<<18),real(0x438da32e1600335LL), // C4[9], coeff of eps^27, polynomial in n of order 2 -real(3127493161LL<<21),-real(38277317LL<<20),-real(0xe4960490000LL), reale(161925,0x30e683ffe0741LL), // C4[9], coeff of eps^26, polynomial in n of order 3 -real(9299582409LL<<22),real(3656674463LL<<23),-real(10918261107LL<<22), real(80278491423LL<<17),reale(1317283,0x4f8aa089603a9LL), // C4[9], coeff of eps^25, polynomial in n of order 4 -real(711479186953LL<<22),reale(3279,1361598081LL<<20), -real(0x3749d192179LL<<21),-real(309897952117LL<<20), -real(0x1f18264b9990000LL),reale(162025847,0x379b22013c233LL), // C4[9], coeff of eps^24, polynomial in n of order 5 -reale(133856,15001023LL<<25),reale(223946,23087107LL<<27), -reale(32028,12079289LL<<25),reale(48931,2142027LL<<26), -reale(63933,112742755LL<<25),reale(12842,2153614949LL<<20), reale(5994956347LL,0x96bea2db115fLL), // C4[9], coeff of eps^23, polynomial in n of order 6 -reale(5988742,4056322469LL<<20),reale(2349145,7648181561LL<<19), -reale(426462,344885543LL<<21),reale(2475174,940948911LL<<19), -reale(999559,3441325239LL<<20),-reale(83146,4971496059LL<<19), -reale(41198,0x4f02423cb8000LL),reale(77934432511LL,0x7a7ae451fe1d3LL), // C4[9], coeff of eps^22, polynomial in n of order 7 -reale(8631189,1052889985LL<<21),-reale(629492,634245703LL<<22), -reale(3874477,505696163LL<<21),reale(3866974,513650043LL<<23), -reale(159710,1408881461LL<<21),reale(1100061,714281683LL<<22), -reale(1180171,586380503LL<<21),reale(201643,0x9fcf910730000LL), reale(77934432511LL,0x7a7ae451fe1d3LL), // C4[9], coeff of eps^21, polynomial in n of order 8 reale(341632,721850923LL<<22),reale(2597220,4632100393LL<<19), -reale(10372056,1528523471LL<<20),reale(1205419,4719051179LL<<19), -reale(1145316,921601685LL<<21),reale(3990959,6117017869LL<<19), -reale(1073059,3486842565LL<<20),-reale(153111,7776387185LL<<19), -reale(94130,0x280827bb28000LL),reale(77934432511LL,0x7a7ae451fe1d3LL), // C4[9], coeff of eps^20, polynomial in n of order 9 reale(3783713,134627971LL<<22),reale(23115315,66415493LL<<25), -reale(6392067,518305043LL<<22),-reale(1733013,275013225LL<<23), -reale(8816564,833972409LL<<22),reale(4468878,247379557LL<<24), reale(300534,553592433LL<<22),reale(2085027,317816093LL<<23), -reale(1725044,456624309LL<<22),reale(240877,0x8d28f00d60000LL), reale(77934432511LL,0x7a7ae451fe1d3LL), // C4[9], coeff of eps^19, polynomial in n of order 10 -reale(58776429,1067354331LL<<20),reale(18829393,7579267909LL<<19), reale(10681211,592856305LL<<22),reale(16946593,1116323851LL<<19), -reale(14277877,2775669533LL<<20),-reale(2149268,8027942223LL<<19), -reale(4056423,828321103LL<<21),reale(6443828,4480734455LL<<19), -reale(857619,751312863LL<<20),-reale(227988,4599783267LL<<19), -reale(205805,0x3340b739f8000LL),reale(77934432511LL,0x7a7ae451fe1d3LL), // C4[9], coeff of eps^18, polynomial in n of order 11 -reale(8326980,196156635LL<<21),-reale(34821146,552451591LL<<22), -reale(46791029,557069513LL<<21),reale(38334852,177025053LL<<24), reale(8937287,838991609LL<<21),reale(5317827,1033371567LL<<22), -reale(18378967,400717301LL<<21),reale(2844411,12754877LL<<23), reale(593018,1659418637LL<<21),reale(4310821,76308389LL<<22), -reale(2591282,1217948513LL<<21),reale(276451,0x9f1a0fb950000LL), reale(77934432511LL,0x7a7ae451fe1d3LL), // C4[9], coeff of eps^17, polynomial in n of order 12 -reale(182057178,279202431LL<<21),reale(246730983,7282837989LL<<19), -reale(61609386,3656132889LL<<20),-reale(45340440,795982425LL<<19), -reale(20534253,134894613LL<<22),reale(51951312,243959241LL<<19), -reale(4823611,581671439LL<<20),-reale(5624597,8387045493LL<<19), -reale(13789372,989768405LL<<21),reale(9667615,6509295661LL<<19), reale(215496,1395596667LL<<20),-reale(184969,6596889361LL<<19), -reale(459826,0xaf07be5d28000LL),reale(77934432511LL,0x7a7ae451fe1d3LL), // C4[9], coeff of eps^16, polynomial in n of order 13 reale(316814308,524172905LL<<23),-reale(186563878,63588247LL<<25), -reale(110274143,526845649LL<<23),reale(263023219,83035351LL<<24), -reale(130904637,509865531LL<<23),-reale(30397924,20206077LL<<26), reale(13683269,123318603LL<<23),reale(48158450,141529345LL<<24), -reale(26437768,420249375LL<<23),-reale(5662772,129791197LL<<25), -reale(2185901,350246489LL<<23),reale(9629298,177188459LL<<24), -reale(3949112,493038403LL<<23),reale(276643,3634960421LL<<18), reale(77934432511LL,0x7a7ae451fe1d3LL), // C4[9], coeff of eps^15, polynomial in n of order 14 reale(78761274,365004673LL<<20),-reale(201515576,8484307809LL<<19), reale(313194006,1602645493LL<<21),-reale(252751914,5568714583LL<<19), -reale(13191170,2167441005LL<<20),reale(241719441,7606152787LL<<19), -reale(201822768,404840345LL<<22),reale(21302083,5136432093LL<<19), reale(37050656,1255073061LL<<20),reale(20598069,641077127LL<<19), -reale(39565379,1270355289LL<<21),reale(9630032,7047419793LL<<19), reale(3352897,1867330359LL<<20),reale(651457,7128437307LL<<19), -reale(1114108,0x7475455348000LL),reale(77934432511LL,0x7a7ae451fe1d3LL), // C4[9], coeff of eps^14, polynomial in n of order 15 reale(1503684,1762694997LL<<21),-reale(12945810,457623793LL<<22), reale(59109631,1997027375LL<<21),-reale(165337541,436423661LL<<23), reale(292248408,1310925625LL<<21),-reale(302358268,80333091LL<<22), reale(101329883,1625451155LL<<21),reale(168206436,256940945LL<<24), -reale(245462494,1698275235LL<<21),reale(106772813,575322475LL<<22), reale(20184277,1515722423LL<<21),-reale(15841583,115367503LL<<23), -reale(24343366,297803839LL<<21),reale(22619454,642864953LL<<22), -reale(5751128,1751200357LL<<21),reale(119914,0x778fad9290000LL), reale(77934432511LL,0x7a7ae451fe1d3LL), // C4[9], coeff of eps^13, polynomial in n of order 16 -real(494538685723LL<<23),-reale(30244,7532247025LL<<19), reale(913230,2357276371LL<<20),-reale(8356271,5886749331LL<<19), reale(41054740,50726383LL<<21),-reale(125953300,8377060373LL<<19), reale(252781900,3961145001LL<<20),-reale(323011393,7392450487LL<<19), reale(214671336,735258085LL<<22),reale(38642307,2838366023LL<<19), -reale(221064383,2701482241LL<<20),reale(190191489,7753766309LL<<19), -reale(54203341,2021364059LL<<21),-reale(15936650,4639479773LL<<19), reale(7069294,1728459477LL<<20),reale(6475976,7904740225LL<<19), -reale(3243677,0x65d7af1058000LL),reale(77934432511LL,0x7a7ae451fe1d3LL), // C4[9], coeff of eps^12, polynomial in n of order 17 -real(4941153649LL<<22),-real(2434362319LL<<26), -real(480183190319LL<<22),-reale(15428,422153761LL<<23), reale(492912,506448323LL<<22),-reale(4815395,177795021LL<<24), reale(25573504,64498885LL<<22),-reale(86374812,63633203LL<<23), reale(196725482,856584503LL<<22),-reale(303474922,105041487LL<<25), reale(296000607,1045914233LL<<22),-reale(124541003,470657541LL<<23), -reale(96946363,592229397LL<<22),reale(194787320,217061649LL<<24), -reale(139624521,484247315LL<<22),reale(48044895,435975913LL<<23), -reale(5082038,276187937LL<<22),-reale(749748,0x6069872020000LL), reale(77934432511LL,0x7a7ae451fe1d3LL), // C4[9], coeff of eps^11, polynomial in n of order 18 -real(231323121LL<<20),-real(2351460757LL<<19),-real(912558841LL<<23), -real(0xdfda7610580000LL),-real(777314384543LL<<20), -reale(6590,3852961377LL<<19),reale(223861,17176789LL<<21), -reale(2346980,3623268951LL<<19),reale(13542533,3871010099LL<<20), -reale(50565862,7643343277LL<<19),reale(130735502,766383623LL<<22), -reale(239800507,7719641123LL<<19),reale(308448660,3395101317LL<<20), -reale(258446712,3844536697LL<<19),reale(99709743,227483207LL<<21), reale(54337873,5199140497LL<<19),-reale(105984135,215955881LL<<20), reale(67263140,627338299LL<<19),-reale(17110329,0x5fa94e648000LL), reale(77934432511LL,0x7a7ae451fe1d3LL), // C4[9], coeff of eps^10, polynomial in n of order 19 -real(538707LL<<21),-real(1075491LL<<22),-real(9728097LL<<21), -real(3213907LL<<25),-real(333357375LL<<21),-real(1438804621LL<<22), -real(39246385997LL<<21),-real(379094211993LL<<23), reale(25645,1674653973LL<<21),-reale(290249,472854199LL<<22), reale(1830100,1274307463LL<<21),-reale(7588281,99130323LL<<24), reale(22282256,82312105LL<<21),-reale(48025833,432719649LL<<22), reale(76964476,1304326427LL<<21),-reale(91125940,162742323LL<<23), reale(77471536,1478654845LL<<21),-reale(44556474,1023100235LL<<22), reale(15423395,377918063LL<<21),-reale(2409905,0x7f0a0dc2b0000LL), reale(25978144170LL,0x7e28f6c5ff5f1LL), // C4[9], coeff of eps^9, polynomial in n of order 20 -real(16575LL<<21),-real(226005LL<<19),-real(421083LL<<20), -real(3487431LL<<19),-real(1025715LL<<23),-real(90604825LL<<19), -real(308056405LL<<20),-real(5606626571LL<<19),-real(20270111449LL<<21), -real(0x30ab7cf8dddLL<<19),reale(15220,1707177905LL<<20), -reale(187210,7636838095LL<<19),reale(1297995,534056013LL<<22), -reale(6003229,1506461473LL<<19),reale(20010763,3942424887LL<<20), -reale(50026909,6827222547LL<<19),reale(95435950,2132760845LL<<21), -reale(138382128,8075045605LL<<19),reale(146522254,737992253LL<<20), -reale(96396219,7300467927LL<<19),reale(27713913,0x34f39e3ee8000LL), reale(77934432511LL,0x7a7ae451fe1d3LL), // C4[10], coeff of eps^29, polynomial in n of order 0 real(14059LL<<19),real(0x168a4531304537LL), // C4[10], coeff of eps^28, polynomial in n of order 1 -real(1004279LL<<22),-real(3373361LL<<19),reale(3807,0xdf0925caacfb9LL), // C4[10], coeff of eps^27, polynomial in n of order 2 real(78580619LL<<24),-real(212705597LL<<23),real(705875469LL<<19), reale(59656,0xa639fabc960fdLL), // C4[10], coeff of eps^26, polynomial in n of order 3 real(927832218729LL<<21),-real(204500125453LL<<22), -real(29157611613LL<<21),-real(0x66c4e2e4040000LL), reale(23087123,0x49a60b16d9e77LL), // C4[10], coeff of eps^25, polynomial in n of order 4 real(26024288967LL<<27),-real(7678900515LL<<25),real(13514191015LL<<26), -real(31097026337LL<<25),real(89826688809LL<<21), reale(25583028,0x820b055e82c23LL), // C4[10], coeff of eps^24, polynomial in n of order 5 reale(1328855,126349401LL<<24),-reale(550962,13774891LL<<26), reale(2464835,125518543LL<<24),-reale(784466,25625323LL<<25), -reale(93184,68528187LL<<24),-reale(52198,1190112709LL<<21), reale(86138056986LL,0x5ef39e09c8055LL), // C4[10], coeff of eps^23, polynomial in n of order 6 -reale(1114607,27405733LL<<26),-reale(4563722,53821803LL<<25), reale(3169393,348585LL<<27),reale(68182,92955763LL<<25), reale(1172595,45755337LL<<26),-reale(1088988,13585007LL<<25), reale(166307,46143431LL<<21),reale(86138056986LL,0x5ef39e09c8055LL), // C4[10], coeff of eps^22, polynomial in n of order 7 reale(5480278,504127481LL<<20),-reale(9293162,155326547LL<<21), -reale(197247,3072475525LL<<20),-reale(1644302,932629169LL<<22), reale(3811061,3287215741LL<<20),-reale(747954,323686257LL<<21), -reale(145848,3935467265LL<<20),-reale(106662,0xb8d6e5aaa0000LL), reale(86138056986LL,0x5ef39e09c8055LL), // C4[10], coeff of eps^21, polynomial in n of order 8 reale(22796753,23076841LL<<25),-reale(927290,180149865LL<<22), -reale(369606,74581989LL<<23),-reale(9303996,552920075LL<<22), reale(3036817,71115369LL<<24),reale(396000,898162707LL<<22), reale(2181010,484753161LL<<23),-reale(1556188,389640079LL<<22), reale(192540,3401040927LL<<18),reale(86138056986LL,0x5ef39e09c8055LL), // C4[10], coeff of eps^20, polynomial in n of order 9 reale(862955,1266777839LL<<21),reale(7027949,96012647LL<<24), reale(20762590,1932890753LL<<21),-reale(9559408,1057130891LL<<22), -reale(3064719,1040728173LL<<21),-reale(5129237,23711641LL<<23), reale(5760893,1279205669LL<<21),-reale(394463,240514009LL<<22), -reale(178786,1942994377LL<<21),-reale(217080,8651652815LL<<18), reale(86138056986LL,0x5ef39e09c8055LL), // C4[10], coeff of eps^19, polynomial in n of order 10 -reale(10913096,468931943LL<<23),-reale(57356320,139563275LL<<22), reale(21632622,17971173LL<<25),reale(12352870,1067519707LL<<22), reale(10546968,197307279LL<<23),-reale(16476123,321986815LL<<22), reale(466396,220388453LL<<24),reale(183297,876676071LL<<22), reale(4340035,31265157LL<<23),-reale(2266775,500956659LL<<22), reale(210337,0xe1ea7a84c0000LL),reale(86138056986LL,0x5ef39e09c8055LL), // C4[10], coeff of eps^18, polynomial in n of order 11 reale(183220667,2590575043LL<<20),reale(3573393,1902991101LL<<21), -reale(38433982,657724943LL<<20),-reale(39892891,403988263LL<<23), reale(42677900,967722655LL<<20),reale(4292702,1711217099LL<<21), -reale(2792039,799969587LL<<20),-reale(14767346,746757159LL<<22), reale(7703673,1133060475LL<<20),reale(747527,637790873LL<<21), -reale(45502,3704918615LL<<20),-reale(458872,0xc21d355260000LL), reale(86138056986LL,0x5ef39e09c8055LL), // C4[10], coeff of eps^17, polynomial in n of order 12 -reale(61780842,49135749LL<<25),-reale(196091506,391376453LL<<23), reale(232013693,187926637LL<<24),-reale(59475550,301219495LL<<23), -reale(46331600,62864215LL<<26),-reale(5439903,151048009LL<<23), reale(49627120,102515675LL<<24),-reale(16690048,509576107LL<<23), -reale(7354945,21733079LL<<25),-reale(3769052,366616397LL<<23), reale(9145462,214930505LL<<24),-reale(3305318,371590575LL<<23), reale(189374,6271289399LL<<19),reale(86138056986LL,0x5ef39e09c8055LL), // C4[10], coeff of eps^16, polynomial in n of order 13 -reale(246951312,552772347LL<<22),reale(295555190,29721595LL<<24), -reale(151972143,664869293LL<<22),-reale(114414430,423169395LL<<23), reale(248915402,492058657LL<<22),-reale(140322148,99500631LL<<25), -reale(15757705,299151505LL<<22),reale(29401843,368167099LL<<23), reale(29725213,39057725LL<<22),-reale(34936824,2445655LL<<24), reale(5290998,483472011LL<<22),reale(3412892,270211305LL<<23), reale(939828,308185177LL<<22),-reale(1058440,2262901433LL<<19), reale(86138056986LL,0x5ef39e09c8055LL), // C4[10], coeff of eps^15, polynomial in n of order 14 -reale(29237793,21929809LL<<24),reale(96597143,85827693LL<<23), -reale(210653294,75090197LL<<25),reale(297719766,264531499LL<<23), -reale(232859751,332419LL<<24),reale(779198,466262825LL<<23), reale(210565738,49075321LL<<26),-reale(210231291,35636249LL<<23), reale(60435795,147172683LL<<24),reale(30790678,95503589LL<<23), -reale(8341137,27440903LL<<25),-reale(25891285,147600733LL<<23), reale(19770912,119140889LL<<24),-reale(4475853,348372575LL<<23), reale(24304,4909664935LL<<19),reale(86138056986LL,0x5ef39e09c8055LL), // C4[10], coeff of eps^14, polynomial in n of order 15 -reale(326980,1465789373LL<<20),reale(3379554,1566468779LL<<21), -reale(19029758,226591575LL<<20),reale(68313947,940737655LL<<22), -reale(165836985,3033756273LL<<20),reale(273579872,472941105LL<<21), -reale(286670501,2169744907LL<<20),reale(131674848,489609853LL<<23), reale(102478771,1504412891LL<<20),-reale(220713363,225877065LL<<21), reale(153302553,1201451329LL<<20),-reale(29968476,1046042243LL<<22), -reale(18498599,2914872793LL<<20),reale(4637884,270502717LL<<21), reale(6604171,2668065421LL<<20),-reale(2936921,0x8973648be0000LL), reale(86138056986LL,0x5ef39e09c8055LL), // C4[10], coeff of eps^13, polynomial in n of order 16 real(8181919521LL<<26),reale(4651,463423847LL<<22), -reale(165627,528682553LL<<23),reale(1821092,755660373LL<<22), -reale(11021646,91392285LL<<24),reale(43145010,992272131LL<<22), -reale(116748177,310953403LL<<23),reale(223068773,47271409LL<<22), -reale(294932999,99296991LL<<25),reale(242263024,286305695LL<<22), -reale(60276785,30271037LL<<23),-reale(125363778,717272947LL<<22), reale(182026841,37372833LL<<24),-reale(116787755,417593029LL<<22), reale(36759949,346012225LL<<23),-reale(3061422,962217431LL<<22), -reale(731281,0xaaf6b13240000LL),reale(86138056986LL,0x5ef39e09c8055LL), // C4[10], coeff of eps^12, polynomial in n of order 17 real(777809483LL<<21),real(436668683LL<<25),real(99139014933LL<<21), real(0x1cfc4bfd58dLL<<22),-reale(70023,1623299233LL<<21), reale(822756,446933025LL<<23),-reale(5376526,2111656919LL<<21), reale(23042396,297910775LL<<22),-reale(69630161,297782669LL<<21), reale(153266731,112309515LL<<24),-reale(247130955,1577554627LL<<21), reale(284460705,580739169LL<<22),-reale(212091093,1801700473LL<<21), reale(61297082,319619083LL<<23),reale(65462218,2096893009LL<<21), -reale(98426842,1047683893LL<<22),reale(59152561,1235484315LL<<21), -reale(14780753,0xb5d74354c0000LL), reale(86138056986LL,0x5ef39e09c8055LL), // C4[10], coeff of eps^11, polynomial in n of order 18 real(1233981LL<<23),real(14104237LL<<22),real(6201077LL<<26), real(933195507LL<<22),real(6966040851LL<<23),real(592370721657LL<<22), -reale(22184,189431713LL<<24),reale(279989,474035391LL<<22), -reale(1985627,52832535LL<<23),reale(9357698,635528005LL<<22), -reale(31645438,92987147LL<<25),reale(79909927,996806539LL<<22), -reale(153562851,494252097LL<<23),reale(225351987,543734289LL<<22), -reale(249473559,252214923LL<<24),reale(201676475,478217047LL<<22), -reale(111804841,353712747LL<<23),reale(37701632,700509149LL<<22), -reale(5783773,3281237837LL<<18),reale(86138056986LL,0x5ef39e09c8055LL), // C4[10], coeff of eps^10, polynomial in n of order 19 real(57057LL<<20),real(126819LL<<21),real(1284843LL<<20), real(478667LL<<24),real(56414325LL<<20),real(279062861LL<<21), real(8810413183LL<<20),real(99625441377LL<<22), -reale(3997,1800115191LL<<20),reale(54510,559965495LL<<21), -reale(421909,1796318189LL<<20),reale(2196607,410595787LL<<23), -reale(8328804,1896277603LL<<20),reale(24012916,1506461473LL<<21), -reale(53875133,2685050457LL<<20),reale(94820235,193579723LL<<22), -reale(129680615,3269639887LL<<20),reale(131955714,608596747LL<<21), -reale(84828673,2009615045LL<<20),reale(24099054,0xf664899ae0000LL), reale(86138056986LL,0x5ef39e09c8055LL), // C4[11], coeff of eps^29, polynomial in n of order 0 -real(255169LL<<19),real(0xbdc79d6e266b55fLL), // C4[11], coeff of eps^28, polynomial in n of order 1 -real(535829LL<<26),real(6461547LL<<20),real(0x56e2cdab4666fea1LL), // C4[11], coeff of eps^27, polynomial in n of order 2 -real(54075943LL<<25),-real(11012147LL<<24),-real(184884229LL<<19), reale(65338,0x3c271ece8bf8fLL), // C4[11], coeff of eps^26, polynomial in n of order 3 -real(29189823LL<<30),real(157366885LL<<32),-real(637753597LL<<30), real(13332470307LL<<23),reale(19666808,0xb9ff38da93b23LL), // C4[11], coeff of eps^25, polynomial in n of order 4 -reale(768828,16543417LL<<28),reale(2405043,41201001LL<<26), -reale(595679,17511625LL<<27),-reale(94147,42169149LL<<26), -reale(60455,661597895LL<<21),reale(94341681461LL,0x436c57c191ed7LL), // C4[11], coeff of eps^24, polynomial in n of order 5 -reale(5042070,2793567LL<<28),reale(2454743,3154771LL<<30), reale(191058,8757223LL<<28),reale(1233521,5992667LL<<29), -reale(1001395,9125891LL<<28),reale(137539,51052897LL<<22), reale(94341681461LL,0x436c57c191ed7LL), // C4[11], coeff of eps^23, polynomial in n of order 6 -reale(7620321,6390387LL<<27),-reale(1118882,49853273LL<<26), -reale(2175696,13938625LL<<28),reale(3557797,45648113LL<<26), -reale(479218,13589073LL<<27),-reale(128928,23280229LL<<26), -reale(115227,1709406351LL<<21),reale(94341681461LL,0x436c57c191ed7LL), // C4[11], coeff of eps^22, polynomial in n of order 7 reale(3030693,3978133LL<<30),reale(1618004,874507LL<<32), -reale(9217736,134985LL<<30),reale(1767041,97063LL<<33), reale(345531,3069873LL<<30),reale(2240563,263433LL<<32), -reale(1400217,895853LL<<30),reale(154222,296573467LL<<23), reale(94341681461LL,0x436c57c191ed7LL), // C4[11], coeff of eps^21, polynomial in n of order 8 reale(304504,49998275LL<<26),reale(21950325,110791689LL<<23), -reale(5005332,65785063LL<<24),-reale(3038456,102319349LL<<23), -reale(5977063,34913149LL<<25),reale(5022754,485487661LL<<23), -reale(45293,7681997LL<<24),-reale(123970,179449809LL<<23), -reale(222792,7672407751LL<<18),reale(94341681461LL,0x436c57c191ed7LL), // C4[11], coeff of eps^20, polynomial in n of order 9 -reale(56432361,120691497LL<<25),reale(6246807,9955417LL<<28), reale(11410351,83254233LL<<25),reale(14692579,49664915LL<<26), -reale(13833928,124401461LL<<25),-reale(1245123,9835207LL<<27), -reale(339985,114545011LL<<25),reale(4291293,22713457LL<<26), -reale(1980685,98627585LL<<25),reale(159775,7030690975LL<<19), reale(94341681461LL,0x436c57c191ed7LL), // C4[11], coeff of eps^19, polynomial in n of order 10 reale(40826627,234278683LL<<24),-reale(19124677,161584861LL<<23), -reale(51024100,50981393LL<<26),reale(30646271,384869645LL<<23), reale(9815197,6859997LL<<24),reale(639236,244693975LL<<23), -reale(14951689,12090449LL<<25),reale(5916250,151054657LL<<23), reale(1073676,226322463LL<<24),reale(80953,380993803LL<<23), -reale(451111,0xff79096c0000LL),reale(94341681461LL,0x436c57c191ed7LL), // C4[11], coeff of eps^18, polynomial in n of order 11 -reale(233788807,3535193LL<<28),reale(177892093,3762413LL<<30), -reale(5486729,8981851LL<<28),-reale(45008759,222901LL<<32), -reale(22295157,5977845LL<<28),reale(46499690,3347131LL<<30), -reale(8381947,991351LL<<28),-reale(7636513,1723229LL<<31), -reale(5108235,6476849LL<<28),reale(8568922,940153LL<<30), -reale(2769555,11314291LL<<28),reale(126172,1159668425LL<<21), reale(94341681461LL,0x436c57c191ed7LL), // C4[11], coeff of eps^17, polynomial in n of order 12 reale(246666787,23370677LL<<26),-reale(50685638,204720607LL<<24), -reale(179803952,51059789LL<<25),reale(226753224,100010811LL<<24), -reale(83690537,703961LL<<27),-reale(36110826,15584139LL<<24), reale(17880019,26951173LL<<25),reale(35367319,73259919LL<<24), -reale(29730133,51577369LL<<26),reale(2029349,105583177LL<<24), reale(3224077,120316375LL<<25),reale(1158582,83501667LL<<24), -reale(999784,6146420159LL<<19),reale(94341681461LL,0x436c57c191ed7LL), // C4[11], coeff of eps^16, polynomial in n of order 13 reale(135472555,2919565LL<<26),-reale(240891001,9823619LL<<28), reale(277187915,48314475LL<<26),-reale(153860890,22130685LL<<27), -reale(78071452,50966567LL<<26),reale(224257271,6520287LL<<29), -reale(168898235,23643785LL<<26),reale(25365615,30758325LL<<27), reale(33991594,22223845LL<<26),-reale(1325267,13358465LL<<28), -reale(26274549,1352253LL<<26),reale(17195323,12709799LL<<27), -reale(3493469,55138895LL<<26),-reale(37171,2996514251LL<<20), reale(94341681461LL,0x436c57c191ed7LL), // C4[11], coeff of eps^15, polynomial in n of order 14 reale(8369149,65829073LL<<25),-reale(34468304,77612041LL<<24), reale(98238486,50466661LL<<26),-reale(197855127,257258223LL<<24), reale(275634083,126808451LL<<25),-reale(237329411,109823349LL<<24), reale(57709083,378039LL<<27),reale(144028485,10992165LL<<24), -reale(208082193,86131531LL<<25),reale(120116321,182851999LL<<24), -reale(12733337,27687817LL<<26),-reale(18886416,178008391LL<<24), reale(2557866,23705959LL<<25),reale(6572718,173475635LL<<24), -reale(2666354,4022017967LL<<19),reale(94341681461LL,0x436c57c191ed7LL), // C4[11], coeff of eps^14, polynomial in n of order 15 reale(54399,8224347LL<<28),-reale(665621,1410497LL<<30), reale(4527846,10561865LL<<28),-reale(20181039,1593975LL<<31), reale(63299017,4532479LL<<28),-reale(144047710,3737571LL<<30), reale(238046961,3527085LL<<28),-reale(274611219,485845LL<<32), reale(189061064,3080067LL<<28),-reale(9459768,127989LL<<30), -reale(141083601,3627343LL<<28),reale(166868825,1278147LL<<31), -reale(97711641,16702617LL<<28),reale(28303864,4120681LL<<30), -reale(1707991,14300715LL<<28),-reale(691965,964491519LL<<21), reale(94341681461LL,0x436c57c191ed7LL), // C4[11], coeff of eps^13, polynomial in n of order 16 -real(394848061LL<<27),-real(277855615551LL<<23), reale(21507,221049445LL<<24),-reale(280152,15918397LL<<23), reale(2046623,76965257LL<<25),-reale(9908745,30179611LL<<23), reale(34287090,9035647LL<<24),-reale(88042794,304571673LL<<23), reale(170266683,41403331LL<<26),-reale(246546803,514564215LL<<23), reale(257558635,22204697LL<<24),-reale(171596509,74164853LL<<23), reale(32098211,100286083LL<<25),reale(71621283,185724333LL<<23), -reale(91026815,208301517LL<<24),reale(52421624,501338287LL<<23), -reale(12919309,7987587551LL<<18),reale(94341681461LL,0x436c57c191ed7LL), // C4[11], coeff of eps^12, polynomial in n of order 17 -real(2506701LL<<25),-real(1595211LL<<29),-real(414133331LL<<25), -real(9611154693LL<<26),reale(6318,129560535LL<<25), -reale(88018,7994433LL<<27),reale(693686,99032081LL<<25), -reale(3663195,37640223LL<<26),reale(14022738,83451835LL<<25), -reale(40598902,6803915LL<<28),reale(90961965,119128629LL<<25), -reale(159220781,788729LL<<26),reale(217217490,112380639LL<<25), -reale(227284915,26366059LL<<27),reale(176075660,9208089LL<<25), -reale(94610548,45670931LL<<26),reale(31201351,21556291LL<<25), -reale(4712704,700509149LL<<19),reale(94341681461LL,0x436c57c191ed7LL), // C4[11], coeff of eps^11, polynomial in n of order 18 -real(13041LL<<24),-real(166957LL<<23),-real(82777LL<<27), -real(14154867LL<<23),-real(121102751LL<<24),-real(11919970777LL<<23), real(140288886837LL<<25),-reale(15649,252654239LL<<23), reale(133731,225409843LL<<24),-reale(773734,115698949LL<<23), reale(3285982,23309223LL<<26),-reale(10716783,181102411LL<<23), reale(27557442,232845957LL<<24),-reale(56645854,420384689LL<<23), reale(93299054,125728615LL<<25),-reale(121534295,132369527LL<<23), reale(119605179,120525655LL<<24),-reale(75403265,163638237LL<<23), reale(21207168,6304582341LL<<18),reale(94341681461LL,0x436c57c191ed7LL), // C4[12], coeff of eps^29, polynomial in n of order 0 real(2113LL<<23),real(0x495846bc80a035LL), // C4[12], coeff of eps^28, polynomial in n of order 1 -real(5059597LL<<25),-real(23775299LL<<22), reale(61953,0x75e619a89ce07LL), // C4[12], coeff of eps^27, polynomial in n of order 2 real(30823201LL<<29),-real(55301563LL<<28),real(131431881LL<<24), reale(497138,0xbe8dd4238d2e7LL), // C4[12], coeff of eps^26, polynomial in n of order 3 real(8059635627LL<<28),-real(757042391LL<<29),-real(311216327LL<<28), -real(7273579LL<<33),reale(21376966,0x1d2a1f8b6ccdLL), // C4[12], coeff of eps^25, polynomial in n of order 4 reale(590308,751003LL<<30),reale(77521,16047653LL<<28), reale(426657,125003LL<<29),-reale(306166,5244457LL<<28), reale(37995,207060411LL<<24),reale(34181768645LL,0x62a1b07dc9473LL), // C4[12], coeff of eps^24, polynomial in n of order 5 -reale(1599658,2394579LL<<27),-reale(2671318,5123391LL<<29), reale(3256460,16377243LL<<27),-reale(261261,3982303LL<<28), -reale(106562,1204279LL<<27),-reale(120793,1029973LL<<24), reale(102545305936LL,0x27e511795bd59LL), // C4[12], coeff of eps^23, polynomial in n of order 6 reale(1248773,4542469LL<<29),-reale(2889741,9813249LL<<28), reale(234885,3135591LL<<30),reale(66922,9908313LL<<28), reale(755418,635863LL<<29),-reale(419245,13200621LL<<28), reale(41213,192739239LL<<24),reale(34181768645LL,0x62a1b07dc9473LL), // C4[12], coeff of eps^22, polynomial in n of order 7 reale(20885911,4938503LL<<28),-reale(1107830,1234733LL<<29), -reale(2370377,3771643LL<<28),-reale(6561451,624527LL<<30), reale(4279851,10797315LL<<28),reale(210660,3761905LL<<29), -reale(68724,2033407LL<<28),-reale(224555,1152577LL<<29), reale(102545305936LL,0x27e511795bd59LL), // C4[12], coeff of eps^21, polynomial in n of order 8 -reale(5562062,38325LL<<31),reale(7741765,4470897LL<<28), reale(17399328,6149297LL<<29),-reale(10890962,10744893LL<<28), -reale(2368414,446197LL<<30),-reale(891562,9146315LL<<28), reale(4183586,393403LL<<29),-reale(1730085,6072185LL<<28), reale(120797,18742483LL<<24),reale(102545305936LL,0x27e511795bd59LL), // C4[12], coeff of eps^20, polynomial in n of order 9 reale(3332722,179104103LL<<24),-reale(54245156,21887465LL<<27), reale(18428910,34326153LL<<24),reale(12293411,106053413LL<<25), reale(4024929,78680811LL<<24),-reale(14528270,1262953LL<<26), reale(4350569,36952333LL<<24),reale(1251271,92345015LL<<25), reale(191236,5049199LL<<24),-reale(439124,1983321823LL<<21), reale(102545305936LL,0x27e511795bd59LL), // C4[12], coeff of eps^19, polynomial in n of order 10 reale(117817828,9756529LL<<27),reale(29304818,21859033LL<<26), -reale(33857646,3348243LL<<29),-reale(34756825,30241097LL<<26), reale(40576649,11012471LL<<27),-reale(1809964,37385419LL<<26), -reale(7014724,9945043LL<<28),-reale(6163099,62399597LL<<26), reale(7950550,2557949LL<<27),-reale(2323999,3159279LL<<26), reale(80031,1030811061LL<<22),reale(102545305936LL,0x27e511795bd59LL), // C4[12], coeff of eps^18, polynomial in n of order 11 reale(37677439,43610729LL<<26),-reale(212417438,31724009LL<<27), reale(188774384,60946099LL<<26),-reale(37276694,6182933LL<<29), -reale(44097735,31570179LL<<26),reale(5696664,10497345LL<<27), reale(38054298,7154503LL<<26),-reale(24525159,12952085LL<<28), -reale(350073,57822319LL<<26),reale(2901654,18012267LL<<27), reale(1319354,63457243LL<<26),-reale(941373,59576227LL<<26), reale(102545305936LL,0x27e511795bd59LL), // C4[12], coeff of eps^17, polynomial in n of order 12 -reale(253394431,1462439LL<<28),reale(237669216,409221LL<<26), -reale(76296320,28335185LL<<27),-reale(133872864,17217849LL<<26), reale(218174046,2622387LL<<29),-reale(127998192,57914967LL<<26), reale(363472,30718057LL<<27),reale(32681168,4189163LL<<26), reale(4677048,16088179LL<<28),-reale(25857930,7142835LL<<26), reale(14914891,9312419LL<<27),-reale(2731797,52301425LL<<26), -reale(76352,726189181LL<<22),reale(102545305936LL,0x27e511795bd59LL), // C4[12], coeff of eps^16, polynomial in n of order 13 -reale(53643409,97684423LL<<25),reale(127408278,3174879LL<<27), -reale(219370358,126672641LL<<25),reale(262176902,49024297LL<<26), -reale(182579118,132254331LL<<25),-reale(3956056,15289739LL<<28), reale(167880537,57011019LL<<25),-reale(188895775,46555265LL<<26), reale(91621970,25449425LL<<25),-reale(762367,26232331LL<<27), -reale(18049661,12932969LL<<25),reale(839158,10679509LL<<26), reale(6440415,29973277LL<<25),-reale(2428550,982597961LL<<22), reale(102545305936LL,0x27e511795bd59LL), // C4[12], coeff of eps^15, polynomial in n of order 14 -reale(1786573,13634499LL<<27),reale(8939902,21088027LL<<26), -reale(31907799,6174271LL<<28),reale(84216248,4944333LL<<26), -reale(166330228,11364729LL<<27),reale(242706491,8863071LL<<26), -reale(246937724,7698133LL<<29),reale(139651898,50060433LL<<26), reale(29493809,19297617LL<<27),-reale(148014628,18656733LL<<26), reale(151165884,622571LL<<28),-reale(81883041,55488299LL<<26), reale(21903841,15379355LL<<27),-reale(792996,14574745LL<<26), -reale(644309,457907141LL<<22),reale(102545305936LL,0x27e511795bd59LL), // C4[12], coeff of eps^14, polynomial in n of order 15 -reale(6504,28793619LL<<26),reale(93075,33271365LL<<27), -reale(752118,6462873LL<<26),reale(4061558,11832697LL<<28), -reale(15840997,35193887LL<<26),reale(46482714,19239327LL<<27), -reale(104709924,13039269LL<<26),reale(181860520,7828435LL<<29), -reale(240159499,36173099LL<<26),reale(229992094,10037497LL<<27), -reale(136854274,43911089LL<<26),reale(9990763,2550227LL<<28), reale(74520212,5689801LL<<26),-reale(84057599,709549LL<<27), reale(46786776,54603587LL<<26),-reale(11406945,39298831LL<<26), reale(102545305936LL,0x27e511795bd59LL), // C4[12], coeff of eps^13, polynomial in n of order 16 real(1030055LL<<30),real(829418525LL<<26),-real(19924010015LL<<27), reale(9050,10804695LL<<26),-reale(78488,9283787LL<<28), reale(459151,22444081LL<<26),-reale(1962716,17985613LL<<27), reale(6408338,7820523LL<<26),-reale(16395176,1626457LL<<29), reale(33311385,35536325LL<<26),-reale(53946341,7054843LL<<27), reale(69201696,61410431LL<<26),-reale(69012103,3773337LL<<28), reale(51544754,7834329LL<<26),-reale(26961871,12889641LL<<27), reale(8722958,26104467LL<<26),-reale(1300056,320360129LL<<22), reale(34181768645LL,0x62a1b07dc9473LL), // C4[12], coeff of eps^12, polynomial in n of order 17 real(127075LL<<24),real(91195LL<<28),real(26902525LL<<24), real(715607165LL<<25),-real(73094160425LL<<24), reale(4440,35913265LL<<26),-reale(41519,978831LL<<24), reale(264211,112928967LL<<25),-reale(1241795,175695285LL<<24), reale(4515620,18853435LL<<27),-reale(13069247,261014043LL<<24), reale(30619380,129358865LL<<25),-reale(58537051,226171969LL<<24), reale(91194564,65482939LL<<26),-reale(113993206,58979239LL<<24), reale(109036979,115740763LL<<25),-reale(67602927,138149837LL<<24), reale(18850816,700509149LL<<21),reale(102545305936LL,0x27e511795bd59LL), // C4[13], coeff of eps^29, polynomial in n of order 0 -real(634219LL<<23),reale(3193,0x402148867236bLL), // C4[13], coeff of eps^28, polynomial in n of order 1 -real(400561LL<<32),real(1739049LL<<27),reale(66909,0xbcc54ee94d445LL), // C4[13], coeff of eps^27, polynomial in n of order 2 -real(6387996953LL<<29),-real(3461245957LL<<28),-real(49206438547LL<<24), reale(286172946,0xcc6f5fc7e64c9LL), // C4[13], coeff of eps^26, polynomial in n of order 3 real(7296571113LL<<30),reale(10661,1488313LL<<31), -reale(6836,2507629LL<<30),real(103233906747LL<<25), reale(900397808,0x384bb07b32421LL), // C4[13], coeff of eps^25, polynomial in n of order 4 -reale(1030602,1434287LL<<30),reale(976249,6303335LL<<28), -reale(29214,7243007LL<<29),-reale(27193,4360723LL<<28), -reale(41363,170006437LL<<24),reale(36916310137LL,0x41f43bb0c949LL), // C4[13], coeff of eps^24, polynomial in n of order 5 -reale(2597630,109963LL<<31),-reale(46366,88065LL<<33), real(835763379LL<<31),reale(754229,667751LL<<32), -reale(376195,1000319LL<<31),reale(33027,62908623LL<<26), reale(36916310137LL,0x41f43bb0c949LL), // C4[13], coeff of eps^23, polynomial in n of order 6 reale(1907767,7512493LL<<29),-reale(1322539,10099505LL<<28), -reale(6889396,2784065LL<<30),reale(3566231,12064393LL<<28), reale(392016,1668111LL<<29),-reale(16024,9677725LL<<28), -reale(223530,46890859LL<<24),reale(110748930411LL,0xc5dcb3125bdbLL), // C4[13], coeff of eps^22, polynomial in n of order 7 reale(2768819,1533979LL<<30),reale(18682895,1051157LL<<31), -reale(7962826,2061455LL<<30),-reale(3008388,501585LL<<32), -reale(1419492,411945LL<<30),reale(4033867,1208903LL<<31), -reale(1511425,98131LL<<30),reale(90538,115806565LL<<25), reale(110748930411LL,0xc5dcb3125bdbLL), // C4[13], coeff of eps^21, polynomial in n of order 8 -reale(51332124,214119LL<<31),reale(7579765,3153587LL<<28), reale(12475441,1655707LL<<29),reale(7005177,5256105LL<<28), -reale(13679833,119207LL<<30),reale(3016909,4530623LL<<28), reale(1323928,2024201LL<<29),reale(284896,6925237LL<<28), -reale(424636,138679005LL<<24),reale(110748930411LL,0xc5dcb3125bdbLL), // C4[13], coeff of eps^20, polynomial in n of order 9 reale(47250711,14679LL<<32),-reale(18472981,62575LL<<35), -reale(42459575,893863LL<<32),reale(33307537,106651LL<<33), reale(3060800,842635LL<<32),-reale(5867540,102671LL<<34), -reale(6941741,849331LL<<32),reale(7324844,423881LL<<33), -reale(1953157,771073LL<<32),reale(46148,28524089LL<<27), reale(110748930411LL,0xc5dcb3125bdbLL), // C4[13], coeff of eps^19, polynomial in n of order 10 -reale(218954922,27801141LL<<27),reale(144947317,36456347LL<<26), -reale(2491117,129025LL<<29),-reale(43746541,53566187LL<<26), -reale(5414513,33128531LL<<27),reale(38475112,39418671LL<<26), -reale(19653214,3660993LL<<28),-reale(2031714,8235735LL<<26), reale(2517568,31068687LL<<27),reale(1433299,8158787LL<<26), -reale(884985,911850811LL<<22),reale(110748930411LL,0xc5dcb3125bdbLL), // C4[13], coeff of eps^18, polynomial in n of order 11 reale(186784429,10521821LL<<28),-reale(7066121,6171767LL<<29), -reale(168709085,159265LL<<28),reale(199772613,1997709LL<<31), -reale(91000398,5796399LL<<28),-reale(16385586,3500385LL<<29), reale(28845005,1198547LL<<28),reale(9523912,3994797LL<<30), -reale(24921512,7172347LL<<28),reale(12920997,2065141LL<<29), -reale(2137442,11262329LL<<28),-reale(100773,90157665LL<<23), reale(110748930411LL,0xc5dcb3125bdbLL), // C4[13], coeff of eps^17, polynomial in n of order 12 reale(153014747,10291963LL<<28),-reale(229746959,27043849LL<<26), reale(237324258,14238909LL<<27),-reale(127910449,9268979LL<<26), -reale(52661288,2811671LL<<29),reale(178449477,48064707LL<<26), -reale(166899831,11458293LL<<27),reale(67870692,24951769LL<<26), reale(7326612,206249LL<<28),-reale(16569622,39442673LL<<26), -reale(550002,21806887LL<<27),reale(6246699,62490405LL<<26), -reale(2219585,747027389LL<<22),reale(110748930411LL,0xc5dcb3125bdbLL), // C4[13], coeff of eps^16, polynomial in n of order 13 reale(15145062,3114639LL<<29),-reale(45473383,71569LL<<31), reale(104280194,4043033LL<<29),-reale(182691434,3191599LL<<30), reale(238813543,4302931LL<<29),-reale(215430056,686779LL<<32), reale(95643898,4170781LL<<29),reale(58502156,871831LL<<30), -reale(149008930,6169513LL<<29),reale(135928257,1117477LL<<31), -reale(68778720,227103LL<<29),reale(17013972,3743517LL<<30), -reale(171458,5381733LL<<29),-reale(594747,43724235LL<<24), reale(110748930411LL,0xc5dcb3125bdbLL), // C4[13], coeff of eps^15, polynomial in n of order 14 reale(268265,12727175LL<<27),-reale(1599130,17232215LL<<26), reale(6942204,4883571LL<<28),-reale(22914299,20494129LL<<26), reale(58880733,8011269LL<<27),-reale(118985431,7979051LL<<26), reale(188592645,4054545LL<<29),-reale(229762161,35295621LL<<26), reale(203148724,31300867LL<<27),-reale(107385077,53637247LL<<26), -reale(6680614,2406191LL<<28),reale(75281884,8527271LL<<26), -reale(77627899,32310399LL<<27),reale(42028799,34263981LL<<26), -reale(10160264,35032709LL<<22),reale(110748930411LL,0xc5dcb3125bdbLL), // C4[13], coeff of eps^14, polynomial in n of order 15 real(8350913025LL<<28),-reale(8241,2495877LL<<29), reale(78008,13111987LL<<28),-reale(500800,4045265LL<<30), reale(2364509,9424021LL<<28),-reale(8593646,4773407LL<<29), reale(24709323,11418567LL<<28),-reale(57114100,2066875LL<<31), reale(106928260,4889705LL<<28),-reale(162113251,5033977LL<<29), reale(197269922,8596123LL<<28),-reale(188736396,4070811LL<<30), reale(136566807,16720509LL<<28),-reale(69783667,938643LL<<29), reale(22203894,1359919LL<<28),-reale(3271109,212531129LL<<23), reale(110748930411LL,0xc5dcb3125bdbLL), // C4[13], coeff of eps^13, polynomial in n of order 16 -real(94185LL<<30),-real(86179275LL<<26),real(2372802705LL<<27), -real(83726038305LL<<26),reale(12668,1555717LL<<28), -reale(87922,39994007LL<<26),reale(452934,19637187LL<<27), -reale(1815855,62281965LL<<26),reale(5835571,1574167LL<<29), -reale(15318374,24668899LL<<26),reale(33211265,14617205LL<<27), -reale(59722012,27257657LL<<26),reale(88729847,57943LL<<28), -reale(107054489,21433519LL<<26),reale(99917523,12239271LL<<27), -reale(61060708,48513541LL<<26),reale(16900731,943456205LL<<22), reale(110748930411LL,0xc5dcb3125bdbLL), // C4[14], coeff of eps^29, polynomial in n of order 0 real(41LL<<28),real(0x3fbc634a12a6b1LL), // C4[14], coeff of eps^28, polynomial in n of order 1 -real(6907093LL<<31),-real(59887787LL<<28), reale(5739014,0x909af11944e4bLL), // C4[14], coeff of eps^27, polynomial in n of order 2 reale(3432,499601LL<<33),-real(2083199471LL<<32),real(3406572267LL<<28), reale(307370942,0xdb94118adae9fLL), // C4[14], coeff of eps^26, polynomial in n of order 3 reale(287986,4314073LL<<29),reale(5344,3636147LL<<30), -reale(6205,2906637LL<<29),-reale(13964,12467885LL<<26), reale(13216950542LL,0xe1def252c54b5LL), // C4[14], coeff of eps^25, polynomial in n of order 4 -reale(258061,515595LL<<33),-reale(74790,1657665LL<<31), reale(745027,493173LL<<32),-reale(337382,84843LL<<31), reale(26418,5099583LL<<27),reale(39650851628LL,0xa59cd6f84fe1fLL), // C4[14], coeff of eps^24, polynomial in n of order 5 -reale(100052,3082133LL<<30),-reale(6991386,428305LL<<32), reale(2902871,3549453LL<<30),reale(514674,1320943LL<<31), reale(32543,4070319LL<<30),-reale(220557,2292103LL<<27), reale(118952554885LL,0xf0d684e8efa5dLL), // C4[14], coeff of eps^23, polynomial in n of order 6 reale(6249633,975799LL<<32),-reale(1750517,1286063LL<<31), -reale(1090661,209219LL<<33),-reale(631632,1802089LL<<31), reale(1285387,761149LL<<32),-reale(440347,2020899LL<<31), reale(22303,14762615LL<<27),reale(39650851628LL,0xa59cd6f84fe1fLL), // C4[14], coeff of eps^22, polynomial in n of order 7 -reale(1155507,7367607LL<<29),reale(11090657,3295693LL<<30), reale(9416360,3921899LL<<29),-reale(12562252,1614097LL<<31), reale(1905484,7990669LL<<29),reale(1324142,2135535LL<<30), reale(362851,6226223LL<<29),-reale(408795,45924241LL<<26), reale(118952554885LL,0xf0d684e8efa5dLL), // C4[14], coeff of eps^21, polynomial in n of order 8 -reale(2556392,83451LL<<35),-reale(45924405,628445LL<<32), reale(25722566,76303LL<<33),reale(6427311,738073LL<<32), -reale(4460754,79355LL<<34),-reale(7474566,842481LL<<32), reale(6714086,421381LL<<33),-reale(1643964,835835LL<<32), reale(21175,2825543LL<<28),reale(118952554885LL,0xf0d684e8efa5dLL), // C4[14], coeff of eps^20, polynomial in n of order 9 reale(101794762,1213867LL<<31),reale(21384252,53331LL<<34), -reale(38294895,814203LL<<31),-reale(14666563,397319LL<<32), reale(37283642,1395551LL<<31),-reale(15279397,125869LL<<33), -reale(3174330,433863LL<<31),reale(2115734,458067LL<<32), reale(1510128,1624339LL<<31),-reale(831539,10478291LL<<28), reale(118952554885LL,0xf0d684e8efa5dLL), // C4[14], coeff of eps^19, polynomial in n of order 10 reale(50295468,469581LL<<33),-reale(186185623,531407LL<<32), reale(174713425,41641LL<<35),-reale(59412258,3489LL<<32), -reale(26728127,294149LL<<33),reale(23787374,31373LL<<32), reale(13262792,54953LL<<34),-reale(23669724,520005LL<<32), reale(11190603,172969LL<<33),-reale(1670792,243479LL<<32), -reale(115324,7271069LL<<28),reale(118952554885LL,0xf0d684e8efa5dLL), // C4[14], coeff of eps^18, polynomial in n of order 11 -reale(229751836,26450113LL<<27),reale(205122059,12799441LL<<28), -reale(76881886,7573243LL<<27),-reale(89213757,3943587LL<<30), reale(179505441,31406283LL<<27),-reale(144430080,11541225LL<<28), reale(48475411,26026641LL<<27),reale(12591449,3614557LL<<29), -reale(14798010,26226089LL<<27),-reale(1654995,15989667LL<<28), reale(6017860,18394141LL<<27),-reale(2035659,55899187LL<<24), reale(118952554885LL,0xf0d684e8efa5dLL), // C4[14], coeff of eps^17, polynomial in n of order 12 -reale(60003627,419631LL<<31),reale(122260158,890121LL<<29), -reale(193015194,2586489LL<<30),reale(228332901,6912147LL<<29), -reale(182676146,109669LL<<32),reale(57596630,2823965LL<<29), reale(79437172,3055697LL<<30),-reale(146103578,5035353LL<<29), reale(121669517,1691035LL<<31),-reale(57926620,1249999LL<<29), reale(13245099,2677787LL<<30),reale(250593,3348667LL<<29), -reale(546524,56364575LL<<25),reale(118952554885LL,0xf0d684e8efa5dLL), // C4[14], coeff of eps^16, polynomial in n of order 13 -reale(2910026,15317989LL<<28),reale(10671028,169493LL<<30), -reale(30788418,3245427LL<<28),reale(70862414,261923LL<<29), -reale(130581700,1010945LL<<28),reale(191189814,642567LL<<31), -reale(216782974,13106831LL<<28),reale(177827671,7710997LL<<29), -reale(82572754,6587933LL<<28),-reale(19188450,2518521LL<<30), reale(74652545,11169877LL<<28),-reale(71762036,443641LL<<29), reale(37978089,1743047LL<<28),-reale(9119456,66783679LL<<25), reale(118952554885LL,0xf0d684e8efa5dLL), // C4[14], coeff of eps^15, polynomial in n of order 14 -reale(25313,471763LL<<30),reale(176943,4508751LL<<29), -reale(914488,1483519LL<<31),reale(3661023,8037561LL<<29), -reale(11683077,3602217LL<<30),reale(30253421,7276067LL<<29), -reale(64215578,725077LL<<32),reale(112133608,2030221LL<<29), -reale(160624032,1744767LL<<30),reale(186713478,2165751LL<<29), -reale(172286017,2016853LL<<31),reale(121247637,6964321LL<<29), -reale(60696359,459733LL<<30),reale(19031909,1781195LL<<29), -reale(2775486,102023215LL<<25),reale(118952554885LL,0xf0d684e8efa5dLL), // C4[14], coeff of eps^14, polynomial in n of order 15 -real(614557125LL<<27),real(5831464275LL<<28), -reale(3808,17097199LL<<27),reale(28626,5026047LL<<29), -reale(160361,32462873LL<<27),reale(702411,15495849LL<<28), -reale(2480054,13665347LL<<27),reale(7201343,703573LL<<30), -reale(17420896,11395693LL<<27),reale(35365729,6899711LL<<28), -reale(60346284,10497687LL<<27),reale(86059048,7827541LL<<29), -reale(100689087,8447169LL<<27),reale(91987561,3237205LL<<28), -reale(55509735,6799595LL<<27),reale(15265177,48513541LL<<24), reale(118952554885LL,0xf0d684e8efa5dLL), // C4[15], coeff of eps^29, polynomial in n of order 0 -real(204761LL<<28),reale(20426,0xaa7b82b97d24fLL), // C4[15], coeff of eps^28, polynomial in n of order 1 -real(34699LL<<42),real(26415501LL<<29),reale(6134808,0xac3bb24726559LL), // C4[15], coeff of eps^27, polynomial in n of order 2 reale(16894,439LL<<40),-reale(3396,5539LL<<38), -reale(13997,7293149LL<<28),reale(14128464373LL,0x6d08ce11dbba7LL), // C4[15], coeff of eps^26, polynomial in n of order 3 -reale(50643,63489LL<<36),reale(243167,8553LL<<37), -reale(100839,3467LL<<36),reale(7018,548741LL<<30), reale(14128464373LL,0x6d08ce11dbba7LL), // C4[15], coeff of eps^25, polynomial in n of order 4 -reale(6907413,21379LL<<36),reale(2301071,198931LL<<34), reale(591806,32973LL<<35),reale(76262,38289LL<<34), -reale(216244,23833777LL<<27),reale(127156179360LL,0xd54f3ea0b98dfLL), // C4[15], coeff of eps^24, polynomial in n of order 5 -reale(2869395,52521LL<<36),-reale(3255913,8819LL<<38), -reale(2304160,33823LL<<36),reale(3661540,28261LL<<37), -reale(1155441,18213LL<<36),reale(48366,13607837LL<<28), reale(127156179360LL,0xd54f3ea0b98dfLL), // C4[15], coeff of eps^23, polynomial in n of order 6 reale(8754539,110435LL<<35),reale(11218727,249609LL<<34), -reale(11298141,31087LL<<36),reale(996220,194783LL<<34), reale(1275763,41633LL<<35),reale(426630,95573LL<<34), -reale(392368,19533817LL<<27),reale(127156179360LL,0xd54f3ea0b98dfLL), // C4[15], coeff of eps^22, polynomial in n of order 7 -reale(46020147,1607LL<<36),reale(18483914,31121LL<<37), reale(8546239,40923LL<<36),-reale(2972379,4277LL<<38), -reale(7799822,49315LL<<36),reale(6131851,9051LL<<37), -reale(1385578,60289LL<<36),reale(2743,3362879LL<<30), reale(127156179360LL,0xd54f3ea0b98dfLL), // C4[15], coeff of eps^21, polynomial in n of order 8 reale(36025526,1303LL<<40),-reale(30131090,26093LL<<37), -reale(21835156,15459LL<<38),reale(35026415,31673LL<<37), -reale(11464406,5705LL<<39),-reale(3907909,12145LL<<37), reale(1722090,1439LL<<38),reale(1557916,18869LL<<37), -reale(781446,6381283LL<<28),reale(127156179360LL,0xd54f3ea0b98dfLL), // C4[15], coeff of eps^20, polynomial in n of order 9 -reale(190262221,2387LL<<40),reale(146996287,1227LL<<41), -reale(33573688,3541LL<<40),-reale(32294922,2067LL<<39), reale(18331180,2115LL<<40),reale(16022794,2331LL<<40), -reale(22246846,3383LL<<40),reale(9695242,4143LL<<39), -reale(1302304,2671LL<<40),-reale(123235,5577019LL<<29), reale(127156179360LL,0xd54f3ea0b98dfLL), // C4[15], coeff of eps^19, polynomial in n of order 10 reale(169057636,9637LL<<37),-reale(31515275,17095LL<<36), -reale(115123722,7359LL<<39),reale(174060780,58071LL<<36), -reale(122862790,20125LL<<37),reale(32880337,12981LL<<36), reale(15824026,705LL<<38),-reale(12943852,57005LL<<36), -reale(2522257,22495LL<<37),reale(5771316,18225LL<<36), -reale(1873338,7714415LL<<28),reale(127156179360LL,0xd54f3ea0b98dfLL), // C4[15], coeff of eps^18, polynomial in n of order 11 reale(137352006,26079LL<<36),-reale(197705648,26891LL<<37), reale(213128803,51077LL<<36),-reale(150461460,3135LL<<39), reale(25445949,34251LL<<36),reale(93962136,11667LL<<37), -reale(140732252,24207LL<<36),reale(108614245,6273LL<<38), -reale(48923563,62665LL<<36),reale(10316934,1969LL<<37), reale(535285,33757LL<<36),-reale(501186,3348667LL<<30), reale(127156179360LL,0xd54f3ea0b98dfLL), // C4[15], coeff of eps^17, polynomial in n of order 12 reale(15155809,205049LL<<34),-reale(39104030,957115LL<<32), reale(81967212,139599LL<<33),-reale(139468172,993913LL<<32), reale(190415844,61587LL<<35),-reale(202311488,967447LL<<32), reale(154439958,403401LL<<33),-reale(61783996,889045LL<<32), -reale(28504911,66989LL<<34),reale(73132006,1030157LL<<32), -reale(66442314,293949LL<<33),reale(34502754,346959LL<<32), -reale(8240730,128798053LL<<25),reale(127156179360LL,0xd54f3ea0b98dfLL), // C4[15], coeff of eps^16, polynomial in n of order 13 reale(114172,142577LL<<34),-reale(499141,33119LL<<36), reale(1750098,174183LL<<34),-reale(5016097,114721LL<<35), reale(11893006,66221LL<<34),-reale(23470909,19093LL<<37), reale(38591591,188131LL<<34),-reale(52613301,65223LL<<35), reale(58753809,139305LL<<34),-reale(52512562,23925LL<<36), reale(36059714,158111LL<<34),-reale(17726185,93229LL<<35), reale(5486676,138853LL<<34),-reale(792996,14574745LL<<26), reale(42385393120LL,0x471a6a35932f5LL), // C4[15], coeff of eps^15, polynomial in n of order 14 real(592706205LL<<33),-reale(9147,839013LL<<32), reale(55355,240865LL<<34),-reale(262940,644275LL<<32), reale(1011310,29095LL<<33),-reale(3215965,1023905LL<<32), reale(8575909,35467LL<<35),-reale(19352216,329839LL<<32), reale(37124659,455473LL<<33),-reale(60529336,778589LL<<32), reale(83288367,93771LL<<34),-reale(94856196,165035LL<<32), reale(85043486,110139LL<<33),-reale(50751757,943257LL<<32), reale(13877433,107462891LL<<25),reale(127156179360LL,0xd54f3ea0b98dfLL), // C4[16], coeff of eps^29, polynomial in n of order 0 real(553LL<<31),real(0x292ecb9a960d27d1LL), // C4[16], coeff of eps^28, polynomial in n of order 1 -real(61453LL<<36),-real(4754645LL<<34), reale(19591808,0x57955a5f17535LL), // C4[16], coeff of eps^27, polynomial in n of order 2 reale(33770,14237LL<<36),-reale(12917,115767LL<<35), real(1665987897LL<<31),reale(2148568314LL,0xda506166fe05fLL), // C4[16], coeff of eps^26, polynomial in n of order 3 reale(1765351,9719LL<<36),reale(634098,16193LL<<37), reale(114937,5021LL<<36),-reale(211035,902511LL<<32), reale(135359803835LL,0xb9c7f85883761LL), // C4[16], coeff of eps^25, polynomial in n of order 4 -reale(3041817,11535LL<<37),-reale(2643315,63657LL<<35), reale(3458443,225LL<<36),-reale(1011407,29251LL<<35), reale(33755,354965LL<<31),reale(135359803835LL,0xb9c7f85883761LL), // C4[16], coeff of eps^24, polynomial in n of order 5 reale(12443946,111847LL<<35),-reale(9978547,23661LL<<37), reale(264818,24689LL<<35),reale(1196082,9587LL<<36), reale(477961,17339LL<<35),-reale(375862,243659LL<<32), reale(135359803835LL,0xb9c7f85883761LL), // C4[16], coeff of eps^23, polynomial in n of order 6 reale(11971225,59849LL<<36),reale(9677599,56595LL<<35), -reale(1515717,2317LL<<37),-reale(7956047,112667LL<<35), reale(5585704,62147LL<<36),-reale(1169086,64041LL<<35), -reale(10840,1435009LL<<31),reale(135359803835LL,0xb9c7f85883761LL), // C4[16], coeff of eps^22, polynomial in n of order 7 -reale(20905609,47207LL<<36),-reale(27003899,18815LL<<37), reale(32128586,62715LL<<36),-reale(8207156,6437LL<<38), -reale(4335741,20931LL<<36),reale(1351161,14763LL<<37), reale(1583200,44703LL<<36),-reale(734819,355141LL<<32), reale(135359803835LL,0xb9c7f85883761LL), // C4[16], coeff of eps^21, polynomial in n of order 8 reale(119271221,13241LL<<38),-reale(13185134,117885LL<<35), -reale(34424757,12741LL<<36),reale(12971898,62105LL<<35), reale(17958221,23929LL<<37),-reale(20751983,45233LL<<35), reale(8405753,5609LL<<36),-reale(1009805,84123LL<<35), -reale(126669,998091LL<<31),reale(135359803835LL,0xb9c7f85883761LL), // C4[16], coeff of eps^20, polynomial in n of order 9 reale(7281953,46177LL<<36),-reale(132136826,3687LL<<39), reale(164419146,28463LL<<36),-reale(102943145,13301LL<<37), reale(20499773,15997LL<<36),reale(17609391,14489LL<<38), -reale(11127728,9397LL<<36),-reale(3194109,31911LL<<37), reale(5518515,63129LL<<36),-reale(1729623,95963LL<<34), reale(135359803835LL,0xb9c7f85883761LL), // C4[16], coeff of eps^19, polynomial in n of order 10 -reale(197461925,11965LL<<36),reale(194820269,1667LL<<35), -reale(119937281,937LL<<38),-reale(1213288,24915LL<<35), reale(103481944,52469LL<<36),-reale(133891976,7945LL<<35), reale(96822293,18071LL<<37),-reale(41434588,121951LL<<35), reale(8025452,27431LL<<36),reale(724406,126187LL<<35), -reale(459367,1295029LL<<31),reale(135359803835LL,0xb9c7f85883761LL), // C4[16], coeff of eps^18, polynomial in n of order 11 -reale(47525285,62545LL<<36),reale(91887649,22453LL<<37), -reale(145781941,19979LL<<36),reale(186991182,8001LL<<39), -reale(187151585,35749LL<<36),reale(133148350,20179LL<<37), -reale(44425461,13151LL<<36),-reale(35371425,9983LL<<38), reale(71056997,38023LL<<36),-reale(61631567,21647LL<<37), reale(31499493,50637LL<<36),-reale(7491423,758351LL<<32), reale(135359803835LL,0xb9c7f85883761LL), // C4[16], coeff of eps^17, polynomial in n of order 12 -reale(2259631,24697LL<<37),reale(7098981,78723LL<<35), -reale(18582556,8879LL<<36),reale(40852668,12369LL<<35), -reale(75692831,12691LL<<38),reale(118080654,84927LL<<35), -reale(154130872,52073LL<<36),reale(166118829,74381LL<<35), -reale(144327913,2259LL<<37),reale(96964720,98683LL<<35), -reale(46899246,18595LL<<36),reale(14349769,50505LL<<35), -reale(2057503,1465135LL<<31),reale(135359803835LL,0xb9c7f85883761LL), // C4[16], coeff of eps^16, polynomial in n of order 13 -reale(18695,264305LL<<33),reale(95700,8265LL<<35), -reale(398136,419847LL<<33),reale(1375381,177071LL<<34), -reale(4004787,429789LL<<33),reale(9930000,13635LL<<36), -reale(21101250,231795LL<<33),reale(38532718,52073LL<<34), -reale(60367925,93257LL<<33),reale(80490566,118467LL<<35), -reale(89511061,246751LL<<33),reale(78923731,162339LL<<34), -reale(46636750,263349LL<<33),reale(12687939,1991833LL<<30), reale(135359803835LL,0xb9c7f85883761LL), // C4[17], coeff of eps^29, polynomial in n of order 0 -real(280331LL<<31),reale(154847,0x4e6e7be138cdbLL), // C4[17], coeff of eps^28, polynomial in n of order 1 -real(82431LL<<38),real(142069LL<<33),reale(989485,0x4511e2f2b39a3LL), // C4[17], coeff of eps^27, polynomial in n of order 2 reale(30957,2723LL<<36),reale(7080,38071LL<<35), -reale(9773,1986585LL<<31),reale(6836353729LL,0x13b9f01928417LL), // C4[17], coeff of eps^26, polynomial in n of order 3 -reale(138771,28785LL<<37),reale(154910,14439LL<<38), -reale(42193,29611LL<<37),real(1108797915LL<<32), reale(6836353729LL,0x13b9f01928417LL), // C4[17], coeff of eps^25, polynomial in n of order 4 -reale(1238256,21701LL<<37),-reale(44811,81027LL<<35), reale(156785,14859LL<<36),reale(74079,77407LL<<35), -reale(51372,1082481LL<<31),reale(20509061187LL,0x3b2dd04b78c45LL), // C4[17], coeff of eps^24, polynomial in n of order 5 reale(10057115,7495LL<<39),-reale(158283,1579LL<<41), -reale(7978477,2703LL<<39),reale(5079175,3021LL<<40), -reale(987192,2101LL<<39),-reale(20806,242401LL<<34), reale(143563428310LL,0x9e40b2104d5e3LL), // C4[17], coeff of eps^23, polynomial in n of order 6 -reale(30405369,16203LL<<36),reale(28904813,10839LL<<35), -reale(5472666,28841LL<<37),-reale(4538327,21695LL<<35), reale(1010309,2151LL<<36),reale(1591197,61387LL<<35), -reale(691600,842821LL<<31),reale(143563428310LL,0x9e40b2104d5e3LL), // C4[17], coeff of eps^22, polynomial in n of order 7 reale(2360974,20517LL<<37),-reale(34168343,7885LL<<38), reale(7988557,399LL<<37),reale(19220645,2761LL<<39), -reale(19251394,21847LL<<37),reale(7294617,7633LL<<38), -reale(776533,25709LL<<37),-reale(127091,628387LL<<32), reale(143563428310LL,0x9e40b2104d5e3LL), // C4[17], coeff of eps^21, polynomial in n of order 8 -reale(141970389,5875LL<<38),reale(152285106,31LL<<35), -reale(85013706,54665LL<<36),reale(10784519,74157LL<<35), reale(18376223,22989LL<<37),-reale(9415616,123045LL<<35), -reale(3707065,39939LL<<36),reale(5266887,19945LL<<35), -reale(1601936,974407LL<<31),reale(143563428310LL,0x9e40b2104d5e3LL), // C4[17], coeff of eps^20, polynomial in n of order 9 reale(174732199,7199LL<<38),-reale(91781661,1783LL<<41), -reale(22947906,1007LL<<38),reale(109147441,451LL<<39), -reale(126268040,11085LL<<38),reale(86262862,2409LL<<40), -reale(35185382,1435LL<<38),reale(6220582,7041LL<<39), reale(846498,391LL<<38),-reale(421214,84365LL<<33), reale(143563428310LL,0x9e40b2104d5e3LL), // C4[17], coeff of eps^19, polynomial in n of order 10 reale(100447726,5039LL<<36),-reale(149758021,121873LL<<35), reale(181554380,1939LL<<38),-reale(171878757,123903LL<<35), reale(113962110,29289LL<<36),-reale(29967290,80205LL<<35), -reale(40353928,13613LL<<37),reale(68655180,86853LL<<35), -reale(57285125,57949LL<<36),reale(28886745,8439LL<<35), -reale(6846764,2025561LL<<31),reale(143563428310LL,0x9e40b2104d5e3LL), // C4[17], coeff of eps^18, polynomial in n of order 11 reale(9163438,32371LL<<37),-reale(22188557,9937LL<<38), reale(45681407,15569LL<<37),-reale(80085759,21LL<<40), reale(119267529,32127LL<<37),-reale(149784698,12951LL<<38), reale(156408668,30941LL<<37),-reale(132494258,5045LL<<39), reale(87286969,10059LL<<37),-reale(41608633,10397LL<<38), reale(12599797,16681LL<<37),-reale(1793721,181577LL<<32), reale(143563428310LL,0x9e40b2104d5e3LL), // C4[17], coeff of eps^17, polynomial in n of order 12 reale(152058,3531LL<<37),-reale(566838,109449LL<<35), reale(1788421,65069LL<<36),-reale(4828739,49907LL<<35), reale(11241509,10969LL<<38),-reale(22666304,107837LL<<35), reale(39633653,283LL<<36),-reale(59939783,113319LL<<35), reale(77715030,3737LL<<37),-reale(84609105,47985LL<<35), reale(73498818,52617LL<<36),-reale(43049308,20443LL<<35), reale(11659187,1311925LL<<31),reale(143563428310LL,0x9e40b2104d5e3LL), // C4[18], coeff of eps^29, polynomial in n of order 0 real(35LL<<34),real(0x29845c2bcb5c10d7LL), // C4[18], coeff of eps^28, polynomial in n of order 1 reale(3628,18373LL<<37),-reale(4063,232509LL<<34), reale(3097286791LL,0x8a812bfedbe75LL), // C4[18], coeff of eps^27, polynomial in n of order 2 reale(435730,613LL<<39),-reale(110987,3811LL<<38),real(489021323LL<<34), reale(21681007540LL,0xc98833f803533LL), // C4[18], coeff of eps^26, polynomial in n of order 3 -reale(762945,31179LL<<36),reale(988791,87LL<<37), reale(550009,38375LL<<36),-reale(343815,323189LL<<33), reale(151767052785LL,0x82b96bc817465LL), // C4[18], coeff of eps^25, polynomial in n of order 4 reale(1063744,27LL<<41),-reale(7897635,7767LL<<39), reale(4613149,699LL<<40),-reale(833936,93LL<<39), -reale(28054,94387LL<<35),reale(151767052785LL,0x82b96bc817465LL), // C4[18], coeff of eps^24, polynomial in n of order 5 reale(25578507,4379LL<<38),-reale(3209600,1553LL<<40), -reale(4577572,5923LL<<38),reale(702466,1583LL<<39), reale(1586031,287LL<<38),-reale(651636,122639LL<<35), reale(151767052785LL,0x82b96bc817465LL), // C4[18], coeff of eps^23, polynomial in n of order 6 -reale(32324739,1815LL<<40),reale(3520775,1207LL<<39), reale(19946468,259LL<<41),-reale(17787966,4575LL<<39), reale(6336978,3235LL<<40),-reale(589727,5685LL<<39), -reale(125505,20667LL<<35),reale(151767052785LL,0x82b96bc817465LL), // C4[18], coeff of eps^22, polynomial in n of order 7 reale(138884729,22203LL<<36),-reale(69168625,14473LL<<37), reale(3249237,4577LL<<36),reale(18436830,10301LL<<38), -reale(7840055,31609LL<<36),-reale(4091705,30595LL<<37), reale(5021146,27565LL<<36),-reale(1488082,115687LL<<33), reale(151767052785LL,0x82b96bc817465LL), // C4[18], coeff of eps^21, polynomial in n of order 8 -reale(66334778,1299LL<<41),-reale(40377625,16285LL<<38), reale(111882749,4839LL<<39),-reale(118325119,4711LL<<38), reale(76858390,3693LL<<40),-reale(29952902,3569LL<<38), reale(4790818,4941LL<<39),reale(921311,4421LL<<38), -reale(386621,181821LL<<34),reale(151767052785LL,0x82b96bc817465LL), // C4[18], coeff of eps^20, polynomial in n of order 9 -reale(151679112,16629LL<<37),reale(174648786,1667LL<<40), -reale(156892091,15835LL<<37),reale(96799837,4169LL<<38), -reale(17949188,6721LL<<37),-reale(43885384,7293LL<<39), reale(66080580,25305LL<<37),-reale(53357084,1853LL<<38), reale(26599572,17011LL<<37),-reale(6287689,169979LL<<34), reale(151767052785LL,0x82b96bc817465LL), // C4[18], coeff of eps^19, polynomial in n of order 10 -reale(8594193,5169LL<<39),reale(16702080,5475LL<<38), -reale(27882498,1245LL<<41),reale(39843622,14413LL<<38), -reale(48340851,951LL<<39),reale(49066184,11639LL<<38), -reale(40627946,3165LL<<40),reale(26296855,15713LL<<38), -reale(12371894,1597LL<<39),reale(3711568,4235LL<<38), -reale(524991,147555LL<<34),reale(50589017595LL,0x2b9323ed5d177LL), // C4[18], coeff of eps^18, polynomial in n of order 11 -reale(768539,29011LL<<36),reale(2243105,18035LL<<37), -reale(5671852,39713LL<<36),reale(12494515,7255LL<<39), -reale(24051943,5231LL<<36),reale(40468348,22085LL<<37), -reale(59307062,46653LL<<36),reale(74994737,5975LL<<38), -reale(80108014,59787LL<<36),reale(68664012,25623LL<<37), -reale(39899358,51033LL<<36),reale(10762327,20443LL<<33), reale(151767052785LL,0x82b96bc817465LL), // C4[19], coeff of eps^29, polynomial in n of order 0 -real(69697LL<<34),reale(220556,0x6c98ea537e51fLL), // C4[19], coeff of eps^28, polynomial in n of order 1 -real(1238839LL<<41),real(675087LL<<35), reale(141943813,0x222cc7846d81LL), // C4[19], coeff of eps^27, polynomial in n of order 2 reale(876102,3999LL<<40),reale(573743,1451LL<<39), -reale(328615,14973LL<<34),reale(159970677260LL,0x6732257fe12e7LL), // C4[19], coeff of eps^26, polynomial in n of order 3 -reale(7739083,17LL<<46),reale(4186838,53LL<<45),-reale(704448,1LL<<46), -reale(33249,11241LL<<37),reale(159970677260LL,0x6732257fe12e7LL), // C4[19], coeff of eps^25, polynomial in n of order 4 -reale(1360864,133LL<<42),-reale(4500609,2667LL<<40), reale(427896,299LL<<41),reale(1570943,1191LL<<40), -reale(614728,45789LL<<35),reale(159970677260LL,0x6732257fe12e7LL), // C4[19], coeff of eps^24, polynomial in n of order 5 -reale(379105,631LL<<42),reale(20252634,139LL<<44), -reale(16388211,705LL<<42),reale(5510947,339LL<<43), -reale(439601,699LL<<42),-reale(122601,56745LL<<36), reale(159970677260LL,0x6732257fe12e7LL), // C4[19], coeff of eps^23, polynomial in n of order 6 -reale(55355388,567LL<<41),-reale(2520461,2117LL<<40), reale(18017708,147LL<<42),-reale(6413373,771LL<<40), -reale(4373212,61LL<<41),reale(4784182,2079LL<<40), -reale(1386197,54485LL<<35),reale(159970677260LL,0x6732257fe12e7LL), // C4[19], coeff of eps^22, polynomial in n of order 7 -reale(54112477,29LL<<46),reale(112419812,35LL<<45), -reale(110372726,9LL<<46),reale(68510282,53LL<<46), -reale(25556330,19LL<<46),reale(3652507,1LL<<45),reale(962676,17LL<<46), -reale(355362,30093LL<<37),reale(159970677260LL,0x6732257fe12e7LL), // C4[19], coeff of eps^21, polynomial in n of order 8 reale(166723371,209LL<<42),-reale(142457721,7469LL<<39), reale(81530379,2787LL<<40),-reale(7977897,3383LL<<39), -reale(46298043,1775LL<<41),reale(63437092,799LL<<39), -reale(49803454,3807LL<<40),reale(24585849,2581LL<<39), -reale(5799325,105875LL<<34),reale(159970677260LL,0x6732257fe12e7LL), // C4[19], coeff of eps^20, polynomial in n of order 9 reale(54095236,1729LL<<41),-reale(86448328,33LL<<44), reale(119042325,527LL<<41),-reale(140012701,875LL<<42), reale(138519104,1133LL<<41),-reale(112357061,257LL<<43), reale(71568963,1275LL<<41),-reale(33272498,441LL<<42), reale(9897515,729LL<<41),-reale(1391838,12705LL<<35), reale(159970677260LL,0x6732257fe12e7LL), // C4[19], coeff of eps^19, polynomial in n of order 10 reale(2731650,3225LL<<40),-reale(6520331,5423LL<<39), reale(13678206,885LL<<42),-reale(25266687,5569LL<<39), reale(41073925,3215LL<<40),-reale(58519302,7091LL<<39), reale(72351138,181LL<<41),-reale(75968694,8133LL<<39), reale(64333849,3333LL<<40),-reale(37115682,4791LL<<39), reale(9974839,182105LL<<34),reale(159970677260LL,0x6732257fe12e7LL), // C4[20], coeff of eps^29, polynomial in n of order 0 real(1LL<<39),reale(386445,0x44b61aebc827LL), // C4[20], coeff of eps^28, polynomial in n of order 1 reale(3670,3431LL<<40),-real(63923791LL<<37), reale(1044560880,0x57ec63f8653c9LL), // C4[20], coeff of eps^27, polynomial in n of order 2 reale(165149,453LL<<43),-reale(25858,471LL<<42),-real(26276299LL<<38), reale(7311926162LL,0x6776bbcac4a7fLL), // C4[20], coeff of eps^26, polynomial in n of order 3 -reale(4343033,595LL<<42),reale(185313,303LL<<43), reale(1548473,271LL<<42),-reale(580654,777LL<<40), reale(168174301735LL,0x4baadf37ab169LL), // C4[20], coeff of eps^25, polynomial in n of order 4 reale(20236427,149LL<<44),-reale(15067334,133LL<<42), reale(4797544,165LL<<43),-reale(318599,375LL<<42), -reale(118861,3875LL<<38),reale(168174301735LL,0x4baadf37ab169LL), // C4[20], coeff of eps^24, polynomial in n of order 5 -reale(6870833,1979LL<<41),reale(17282399,281LL<<43), -reale(5135975,189LL<<41),-reale(4572111,263LL<<42), reale(4557653,1537LL<<41),-reale(1294702,4061LL<<38), reale(168174301735LL,0x4baadf37ab169LL), // C4[20], coeff of eps^23, polynomial in n of order 6 reale(111332564,131LL<<43),-reale(102611836,439LL<<42), reale(61113705,49LL<<44),-reale(21849131,865LL<<42), reale(2742318,257LL<<43),reale(980372,533LL<<42), -reale(327159,8391LL<<38),reale(168174301735LL,0x4baadf37ab169LL), // C4[20], coeff of eps^22, polynomial in n of order 7 -reale(128743521,979LL<<42),reale(67998970,481LL<<43), reale(279122,855LL<<42),-reale(47847734,245LL<<44), reale(60794248,257LL<<42),-reale(46583621,181LL<<43), reale(22803394,43LL<<42),-reale(5369928,2229LL<<40), reale(168174301735LL,0x4baadf37ab169LL), // C4[20], coeff of eps^21, polynomial in n of order 8 -reale(88564699,121LL<<45),reale(117949702,533LL<<42), -reale(134881895,27LL<<43),reale(130376590,239LL<<42), -reale(103788735,57LL<<44),reale(65154071,233LL<<42), -reale(29963298,393LL<<43),reale(8844588,195LL<<42), -reale(1237189,6873LL<<38),reale(168174301735LL,0x4baadf37ab169LL), // C4[20], coeff of eps^20, polynomial in n of order 9 -reale(7362630,999LL<<40),reale(14785858,137LL<<43), -reale(26321377,9LL<<40),reale(41483460,1083LL<<41), -reale(57615917,1643LL<<40),reale(69797568,521LL<<42), -reale(72155594,1933LL<<40),reale(60438019,617LL<<41), -reale(34641303,3055LL<<40),reale(9278920,21175LL<<37), reale(168174301735LL,0x4baadf37ab169LL), // C4[21], coeff of eps^29, polynomial in n of order 0 -real(2017699LL<<39),reale(144690669,0x92d5d14b2b5b9LL), // C4[21], coeff of eps^28, polynomial in n of order 1 -reale(21806,31LL<<47),-real(1751493LL<<42), reale(7668605487LL,0x6644548ff9f4dLL), // C4[21], coeff of eps^27, polynomial in n of order 2 -real(610053LL<<43),reale(66113,223LL<<42),-reale(23877,14131LL<<38), reale(7668605487LL,0x6644548ff9f4dLL), // C4[21], coeff of eps^26, polynomial in n of order 3 -reale(601427,223LL<<44),reale(181759,65LL<<45),-reale(9602,5LL<<44), -reale(4983,2721LL<<39),reale(7668605487LL,0x6644548ff9f4dLL), // C4[21], coeff of eps^25, polynomial in n of order 4 reale(16348405,227LL<<44),-reale(4001511,795LL<<42), -reale(4705038,397LL<<43),reale(4342393,855LL<<42), -reale(1212256,1051LL<<38),reale(176377926210LL,0x302398ef74febLL), // C4[21], coeff of eps^24, polynomial in n of order 5 -reale(95167920,19LL<<45),reale(54565817,7LL<<47), -reale(18712410,5LL<<45),reale(2011897,15LL<<46),reale(981374,25LL<<45), -reale(301721,597LL<<40),reale(176377926210LL,0x302398ef74febLL), // C4[21], coeff of eps^23, polynomial in n of order 6 reale(56043535,133LL<<43),reale(7101303,759LL<<42), -reale(48732132,249LL<<44),reale(58197907,161LL<<42), -reale(43660867,425LL<<43),reale(21217809,619LL<<42), -reale(4990122,11039LL<<38),reale(176377926210LL,0x302398ef74febLL), // C4[21], coeff of eps^22, polynomial in n of order 7 reale(38792824,189LL<<44),-reale(43241527,125LL<<45), reale(40920531,151LL<<44),-reale(32022608,39LL<<46), reale(19836099,97LL<<44),-reale(9032168,63LL<<45), reale(2647359,187LL<<44),-reale(368524,4161LL<<39), reale(58792642070LL,0x100bdda526ff9LL), // C4[21], coeff of eps^21, polynomial in n of order 8 reale(15813930,121LL<<45),-reale(27228018,205LL<<42), reale(41726053,443LL<<43),-reale(56628215,983LL<<42), reale(67341662,57LL<<44),-reale(68636694,193LL<<42), reale(56918234,105LL<<43),-reale(32430156,715LL<<42), reale(8660325,15343LL<<38),reale(176377926210LL,0x302398ef74febLL), // C4[22], coeff of eps^29, polynomial in n of order 0 -real(229LL<<43),reale(2018939,0x935060fc493cdLL), // C4[22], coeff of eps^28, polynomial in n of order 1 reale(64733,61LL<<46),-reale(22613,493LL<<43), reale(8025284812LL,0x6511ed552f41bLL), // C4[22], coeff of eps^27, polynomial in n of order 2 reale(158513,3LL<<48),-reale(6162,29LL<<47),-reale(4786,487LL<<43), reale(8025284812LL,0x6511ed552f41bLL), // C4[22], coeff of eps^26, polynomial in n of order 3 -reale(130438,301LL<<43),-reale(208062,47LL<<44),reale(179942,497LL<<43), -reale(49466,167LL<<40),reale(8025284812LL,0x6511ed552f41bLL), // C4[22], coeff of eps^25, polynomial in n of order 4 reale(2120438,3LL<<47),-reale(697803,39LL<<45),reale(61914,3LL<<46), reale(42203,115LL<<45),-reale(12120,543LL<<41), reale(8025284812LL,0x6511ed552f41bLL), // C4[22], coeff of eps^24, polynomial in n of order 5 reale(12722577,33LL<<44),-reale(49104495,51LL<<46), reale(55677556,71LL<<44),-reale(41002422,115LL<<45), reale(19800840,109LL<<44),-reale(4652345,837LL<<41), reale(184581550685LL,0x149c52a73ee6dLL), // C4[22], coeff of eps^23, polynomial in n of order 6 -reale(124610244,57LL<<46),reale(115654934,113LL<<45), -reale(89096506,19LL<<47),reale(54518354,119LL<<45), -reale(24598996,19LL<<46),reale(7163443,125LL<<45), -reale(992759,1841LL<<41),reale(184581550685LL,0x149c52a73ee6dLL), // C4[22], coeff of eps^22, polynomial in n of order 7 -reale(27999005,155LL<<43),reale(41827085,121LL<<44), -reale(55581037,1LL<<43),reale(64987058,83LL<<45), -reale(65383321,103LL<<43),reale(53725829,211LL<<44), -reale(30444636,461LL<<43),reale(8107539,715LL<<40), reale(184581550685LL,0x149c52a73ee6dLL), // C4[23], coeff of eps^29, polynomial in n of order 0 -reale(4289,21LL<<43),reale(1676392827,0x7a5fe79ee0e95LL), // C4[23], coeff of eps^28, polynomial in n of order 1 -real(1351LL<<51),-real(234789LL<<44), reale(1676392827,0x7a5fe79ee0e95LL), // C4[23], coeff of eps^27, polynomial in n of order 2 -reale(209744,1LL<<50),reale(171585,3LL<<49),-reale(46526,469LL<<43), reale(8381964137LL,0x63df861a648e9LL), // C4[23], coeff of eps^26, polynomial in n of order 3 -reale(599194,1LL<<51),reale(41297,0),reale(41388,1LL<<51), -reale(11218,97LL<<45),reale(8381964137LL,0x63df861a648e9LL), // C4[23], coeff of eps^25, polynomial in n of order 4 -reale(2134087,7LL<<49),reale(2315275,31LL<<47),-reale(1677358,15LL<<48), reale(805613,21LL<<47),-reale(189149,1213LL<<41), reale(8381964137LL,0x63df861a648e9LL), // C4[23], coeff of eps^24, polynomial in n of order 5 reale(4740508,1LL<<49),-reale(3599518,1LL<<51),reale(2177844,7LL<<49), -reale(974429,1LL<<50),reale(282071,5LL<<49),-reale(38931,779LL<<42), reale(8381964137LL,0x63df861a648e9LL), // C4[23], coeff of eps^23, polynomial in n of order 6 reale(1817763,3LL<<48),-reale(2369306,23LL<<47),reale(2727592,1LL<<49), -reale(2711734,1LL<<47),reale(2209561,1LL<<48),-reale(1245816,11LL<<47), reale(330919,1979LL<<41),reale(8381964137LL,0x63df861a648e9LL), // C4[24], coeff of eps^29, polynomial in n of order 0 -real(1439LL<<46),reale(44813556,0x37a4fd885dffdLL), // C4[24], coeff of eps^28, polynomial in n of order 1 reale(32742,3LL<<50),-reale(8770,21LL<<47), reale(1747728692,0x7a229fc651f8bLL), // C4[24], coeff of eps^27, polynomial in n of order 2 reale(4928,1LL<<51),reale(8067,1LL<<50),-reale(2080,43LL<<46), reale(1747728692,0x7a229fc651f8bLL), // C4[24], coeff of eps^26, polynomial in n of order 3 reale(2214330,0),-reale(1581120,0),reale(755790,0), -reale(177363,7LL<<47),reale(8738643462LL,0x62ad1edf99db7LL), // C4[24], coeff of eps^25, polynomial in n of order 4 -reale(1116955,0),reale(668788,3LL<<50),-reale(296917,1LL<<51), reale(85476,1LL<<50),-reale(11752,63LL<<46), reale(2912881154LL,0x20e45f9fddf3dLL), // C4[24], coeff of eps^24, polynomial in n of order 5 -reale(2320992,3LL<<48),reale(2634056,1LL<<50),-reale(2590155,5LL<<48), reale(2094168,1LL<<49),-reale(1175298,7LL<<48),reale(311454,11LL<<45), reale(8738643462LL,0x62ad1edf99db7LL), // C4[25], coeff of eps^29, polynomial in n of order 0 -real(3707LL<<46),reale(12720731,0x2bd144a4925efLL), // C4[25], coeff of eps^28, polynomial in n of order 1 real(301LL<<53),-real(2379LL<<48),reale(139928042,0xe1fdf3124a145LL), // C4[25], coeff of eps^27, polynomial in n of order 2 -reale(298603,1LL<<51),reale(142145,1LL<<50),-reale(33346,63LL<<46), reale(1819064557,0x79e557edc3081LL), // C4[25], coeff of eps^26, polynomial in n of order 3 reale(370617,0),-reale(163358,0),reale(46787,0),-reale(6410,23LL<<47), reale(1819064557,0x79e557edc3081LL), // C4[25], coeff of eps^25, polynomial in n of order 4 reale(508963,0),-reale(495426,3LL<<50),reale(397689,1LL<<51), -reale(222238,1LL<<50),reale(58764,59LL<<46), reale(1819064557,0x79e557edc3081LL), // C4[26], coeff of eps^29, polynomial in n of order 0 -real(1LL<<49),reale(131359,0xe834f81ee20c1LL), // C4[26], coeff of eps^28, polynomial in n of order 1 reale(10305,0),-reale(2417,1LL<<49),reale(145415417,0x1d0ced8b7a293LL), // C4[26], coeff of eps^27, polynomial in n of order 2 -reale(11556,0),reale(3294,0),-real(3599LL<<49), reale(145415417,0x1d0ced8b7a293LL), // C4[26], coeff of eps^26, polynomial in n of order 3 -reale(36490,1LL<<51),reale(29097,0),-reale(16195,1LL<<51), reale(4273,13LL<<48),reale(145415417,0x1d0ced8b7a293LL), // C4[27], coeff of eps^29, polynomial in n of order 0 -real(2029LL<<49),reale(16766976,0xd0e6a80084b19LL), // C4[27], coeff of eps^28, polynomial in n of order 1 real(7LL<<56),-real(61LL<<50),reale(5588992,0x45a238002c3b3LL), // C4[27], coeff of eps^27, polynomial in n of order 2 reale(3080,0),-real(427LL<<54),real(3599LL<<49), reale(16766976,0xd0e6a80084b19LL), // C4[28], coeff of eps^29, polynomial in n of order 0 -real(1LL<<53),reale(827461,0x318a62b8e0a5bLL), // C4[28], coeff of eps^28, polynomial in n of order 1 -real(29LL<<55),real(61LL<<52),reale(2482383,0x949f282aa1f11LL), // C4[29], coeff of eps^29, polynomial in n of order 0 real(1LL<<53),reale(88602,0xec373d36a45dfLL), }; // count = 5425 #else #error "Bad value for GEOGRAPHICLIB_GEODESICEXACT_ORDER" #endif static_assert(sizeof(coeff) / sizeof(real) == (nC4_ * (nC4_ + 1) * (nC4_ + 5)) / 6, "Coefficient array size mismatch in C4coeff"); int o = 0, k = 0; for (int l = 0; l < nC4_; ++l) { // l is index of C4[l] for (int j = nC4_ - 1; j >= l; --j) { // coeff of eps^j int m = nC4_ - j - 1; // order of polynomial in n _C4x[k++] = Math::polyval(m, coeff + o, _n) / coeff[o + m + 1]; o += m + 2; } } // Post condition: o == sizeof(coeff) / sizeof(real) && k == nC4x_ if (!(o == sizeof(coeff) / sizeof(real) && k == nC4x_)) throw GeographicErr("C4 misalignment"); } } // namespace GeographicLib */ geosphere/src/PolarStereographic.h0000644000176200001440000001401114323377037016776 0ustar liggesusers/** * \file PolarStereographic.hpp * \brief Header for GeographicLib::PolarStereographic class * * Copyright (c) Charles Karney (2008-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #if !defined(GEOGRAPHICLIB_POLARSTEREOGRAPHIC_HPP) #define GEOGRAPHICLIB_POLARSTEREOGRAPHIC_HPP 1 #include "Constants.h" namespace GeographicLib { /** * \brief Polar stereographic projection * * Implementation taken from the report, * - J. P. Snyder, * Map Projections: A * Working Manual, USGS Professional Paper 1395 (1987), * pp. 160--163. * * This is a straightforward implementation of the equations in Snyder except * that Newton's method is used to invert the projection. * * This class also returns the meridian convergence \e gamma and scale \e k. * The meridian convergence is the bearing of grid north (the \e y axis) * measured clockwise from true north. * * Example of use: * \include example-PolarStereographic.cpp **********************************************************************/ class GEOGRAPHICLIB_EXPORT PolarStereographic { private: typedef Math::real real; real _a, _f, _e2, _es, _e2m, _c; real _k0; public: /** * Constructor for an ellipsoid with * * @param[in] a equatorial radius (meters). * @param[in] f flattening of ellipsoid. Setting \e f = 0 gives a sphere. * Negative \e f gives a prolate ellipsoid. * @param[in] k0 central scale factor. * @exception GeographicErr if \e a, (1 − \e f) \e a, or \e k0 is * not positive. **********************************************************************/ PolarStereographic(real a, real f, real k0); /** * Set the scale for the projection. * * @param[in] lat (degrees) assuming \e northp = true. * @param[in] k scale at latitude \e lat (default 1). * @exception GeographicErr \e k is not positive. * @exception GeographicErr if \e lat is not in (−90°, * 90°]. **********************************************************************/ void SetScale(real lat, real k = real(1)); /** * Forward projection, from geographic to polar stereographic. * * @param[in] northp the pole which is the center of projection (true means * north, false means south). * @param[in] lat latitude of point (degrees). * @param[in] lon longitude of point (degrees). * @param[out] x easting of point (meters). * @param[out] y northing of point (meters). * @param[out] gamma meridian convergence at point (degrees). * @param[out] k scale of projection at point. * * No false easting or northing is added. \e lat should be in the range * (−90°, 90°] for \e northp = true and in the range * [−90°, 90°) for \e northp = false. **********************************************************************/ void Forward(bool northp, real lat, real lon, real& x, real& y, real& gamma, real& k) const; /** * Reverse projection, from polar stereographic to geographic. * * @param[in] northp the pole which is the center of projection (true means * north, false means south). * @param[in] x easting of point (meters). * @param[in] y northing of point (meters). * @param[out] lat latitude of point (degrees). * @param[out] lon longitude of point (degrees). * @param[out] gamma meridian convergence at point (degrees). * @param[out] k scale of projection at point. * * No false easting or northing is added. The value of \e lon returned is * in the range [−180°, 180°]. **********************************************************************/ void Reverse(bool northp, real x, real y, real& lat, real& lon, real& gamma, real& k) const; /** * PolarStereographic::Forward without returning the convergence and scale. **********************************************************************/ void Forward(bool northp, real lat, real lon, real& x, real& y) const { real gamma, k; Forward(northp, lat, lon, x, y, gamma, k); } /** * PolarStereographic::Reverse without returning the convergence and scale. **********************************************************************/ void Reverse(bool northp, real x, real y, real& lat, real& lon) const { real gamma, k; Reverse(northp, x, y, lat, lon, gamma, k); } /** \name Inspector functions **********************************************************************/ ///@{ /** * @return \e a the equatorial radius of the ellipsoid (meters). This is * the value used in the constructor. **********************************************************************/ Math::real EquatorialRadius() const { return _a; } /** * @return \e f the flattening of the ellipsoid. This is the value used in * the constructor. **********************************************************************/ Math::real Flattening() const { return _f; } /** * The central scale for the projection. This is the value of \e k0 used * in the constructor and is the scale at the pole unless overridden by * PolarStereographic::SetScale. **********************************************************************/ Math::real CentralScale() const { return _k0; } ///@} /** * A global instantiation of PolarStereographic with the WGS84 ellipsoid * and the UPS scale factor. However, unlike UPS, no false easting or * northing is added. **********************************************************************/ static const PolarStereographic& UPS(); }; } // namespace GeographicLib #endif // GEOGRAPHICLIB_POLARSTEREOGRAPHIC_HPP geosphere/src/GARS.cpp0000644000176200001440000001054014323376011014262 0ustar liggesusers/** * \file GARS.cpp * \brief Implementation for GeographicLib::GARS class * * Copyright (c) Charles Karney (2015-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #include "GARS.h" #include "Utility.h" #if defined(_MSC_VER) // Squelch warnings about enum-float expressions # pragma warning (disable: 5055) #endif namespace GeographicLib { using namespace std; const char* const GARS::digits_ = "0123456789"; const char* const GARS::letters_ = "ABCDEFGHJKLMNPQRSTUVWXYZ"; void GARS::Forward(real lat, real lon, int prec, string& gars) { using std::isnan; // Needed for Centos 7, ubuntu 14 if (fabs(lat) > Math::qd) throw GeographicErr("Latitude " + Utility::str(lat) + "d not in [-" + to_string(Math::qd) + "d, " + to_string(Math::qd) + "d]"); if (isnan(lat) || isnan(lon)) { gars = "INVALID"; return; } lon = Math::AngNormalize(lon); if (lon == Math::hd) lon = -Math::hd; // lon now in [-180,180) if (lat == Math::qd) lat *= (1 - numeric_limits::epsilon() / 2); prec = max(0, min(int(maxprec_), prec)); int x = int(floor(lon * m_)) - lonorig_ * m_, y = int(floor(lat * m_)) - latorig_ * m_, ilon = x * mult1_ / m_, ilat = y * mult1_ / m_; x -= ilon * m_ / mult1_; y -= ilat * m_ / mult1_; char gars1[maxlen_]; ++ilon; for (int c = lonlen_; c--;) { gars1[c] = digits_[ ilon % baselon_]; ilon /= baselon_; } for (int c = latlen_; c--;) { gars1[lonlen_ + c] = letters_[ilat % baselat_]; ilat /= baselat_; } if (prec > 0) { ilon = x / mult3_; ilat = y / mult3_; gars1[baselen_] = digits_[mult2_ * (mult2_ - 1 - ilat) + ilon + 1]; if (prec > 1) { ilon = x % mult3_; ilat = y % mult3_; gars1[baselen_ + 1] = digits_[mult3_ * (mult3_ - 1 - ilat) + ilon + 1]; } } gars.resize(baselen_ + prec); copy(gars1, gars1 + baselen_ + prec, gars.begin()); } void GARS::Reverse(const string& gars, real& lat, real& lon, int& prec, bool centerp) { int len = int(gars.length()); if (len >= 3 && toupper(gars[0]) == 'I' && toupper(gars[1]) == 'N' && toupper(gars[2]) == 'V') { lat = lon = Math::NaN(); return; } if (len < baselen_) throw GeographicErr("GARS must have at least 5 characters " + gars); if (len > maxlen_) throw GeographicErr("GARS can have at most 7 characters " + gars); int prec1 = len - baselen_; int ilon = 0; for (int c = 0; c < lonlen_; ++c) { int k = Utility::lookup(digits_, gars[c]); if (k < 0) throw GeographicErr("GARS must start with 3 digits " + gars); ilon = ilon * baselon_ + k; } if (!(ilon >= 1 && ilon <= 2 * Math::td)) throw GeographicErr("Initial digits in GARS must lie in [1, 720] " + gars); --ilon; int ilat = 0; for (int c = 0; c < latlen_; ++c) { int k = Utility::lookup(letters_, gars[lonlen_ + c]); if (k < 0) throw GeographicErr("Illegal letters in GARS " + gars.substr(3,2)); ilat = ilat * baselat_ + k; } if (!(ilat < Math::td)) throw GeographicErr("GARS letters must lie in [AA, QZ] " + gars); real unit = mult1_, lat1 = ilat + latorig_ * unit, lon1 = ilon + lonorig_ * unit; if (prec1 > 0) { int k = Utility::lookup(digits_, gars[baselen_]); if (!(k >= 1 && k <= mult2_ * mult2_)) throw GeographicErr("6th character in GARS must [1, 4] " + gars); --k; unit *= mult2_; lat1 = mult2_ * lat1 + (mult2_ - 1 - k / mult2_); lon1 = mult2_ * lon1 + (k % mult2_); if (prec1 > 1) { k = Utility::lookup(digits_, gars[baselen_ + 1]); if (!(k >= 1 /* && k <= mult3_ * mult3_ */)) throw GeographicErr("7th character in GARS must [1, 9] " + gars); --k; unit *= mult3_; lat1 = mult3_ * lat1 + (mult3_ - 1 - k / mult3_); lon1 = mult3_ * lon1 + (k % mult3_); } } if (centerp) { unit *= 2; lat1 = 2 * lat1 + 1; lon1 = 2 * lon1 + 1; } lat = lat1 / unit; lon = lon1 / unit; prec = prec1; } } // namespace GeographicLib geosphere/src/CircularEngine.h0000644000176200001440000001545414323377037016107 0ustar liggesusers/** * \file CircularEngine.hpp * \brief Header for GeographicLib::CircularEngine class * * Copyright (c) Charles Karney (2011-2015) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #if !defined(GEOGRAPHICLIB_CIRCULARENGINE_HPP) #define GEOGRAPHICLIB_CIRCULARENGINE_HPP 1 #include #include "Constants.h" #include "SphericalEngine.h" #if defined(_MSC_VER) // Squelch warnings about dll vs vector # pragma warning (push) # pragma warning (disable: 4251) #endif namespace GeographicLib { /** * \brief Spherical harmonic sums for a circle * * The class is a companion to SphericalEngine. If the results of a * spherical harmonic sum are needed for several points on a circle of * constant latitude \e lat and height \e h, then SphericalEngine::Circle can * compute the inner sum, which is independent of longitude \e lon, and * produce a CircularEngine object. CircularEngine::operator()() can * then be used to perform the outer sum for particular vales of \e lon. * This can lead to substantial improvements in computational speed for high * degree sum (approximately by a factor of \e N / 2 where \e N is the * maximum degree). * * CircularEngine is tightly linked to the internals of SphericalEngine. For * that reason, the constructor for this class is private. Use * SphericalHarmonic::Circle, SphericalHarmonic1::Circle, and * SphericalHarmonic2::Circle to create instances of this class. * * CircularEngine stores the coefficients needed to allow the summation over * order to be performed in 2 or 6 vectors of length \e M + 1 (depending on * whether gradients are to be calculated). For this reason the constructor * may throw a std::bad_alloc exception. * * Example of use: * \include example-CircularEngine.cpp **********************************************************************/ class GEOGRAPHICLIB_EXPORT CircularEngine { private: typedef Math::real real; enum normalization { FULL = SphericalEngine::FULL, SCHMIDT = SphericalEngine::SCHMIDT, }; int _mM; bool _gradp; unsigned _norm; real _a, _r, _u, _t; std::vector _wc, _ws, _wrc, _wrs, _wtc, _wts; real _q, _uq, _uq2; Math::real Value(bool gradp, real sl, real cl, real& gradx, real& grady, real& gradz) const; friend class SphericalEngine; CircularEngine(int M, bool gradp, unsigned norm, real a, real r, real u, real t) : _mM(M) , _gradp(gradp) , _norm(norm) , _a(a) , _r(r) , _u(u) , _t(t) , _wc(std::vector(_mM + 1, 0)) , _ws(std::vector(_mM + 1, 0)) , _wrc(std::vector(_gradp ? _mM + 1 : 0, 0)) , _wrs(std::vector(_gradp ? _mM + 1 : 0, 0)) , _wtc(std::vector(_gradp ? _mM + 1 : 0, 0)) , _wts(std::vector(_gradp ? _mM + 1 : 0, 0)) { _q = _a / _r; _uq = _u * _q; _uq2 = Math::sq(_uq); } void SetCoeff(int m, real wc, real ws) { _wc[m] = wc; _ws[m] = ws; } void SetCoeff(int m, real wc, real ws, real wrc, real wrs, real wtc, real wts) { _wc[m] = wc; _ws[m] = ws; if (_gradp) { _wrc[m] = wrc; _wrs[m] = wrs; _wtc[m] = wtc; _wts[m] = wts; } } public: /** * A default constructor. CircularEngine::operator()() on the resulting * object returns zero. The resulting object can be assigned to the result * of SphericalHarmonic::Circle. **********************************************************************/ CircularEngine() : _mM(-1) , _gradp(true) , _u(0) , _t(1) {} /** * Evaluate the sum for a particular longitude given in terms of its * sine and cosine. * * @param[in] sinlon the sine of the longitude. * @param[in] coslon the cosine of the longitude. * @return \e V the value of the sum. * * The arguments must satisfy sinlon2 + * coslon2 = 1. **********************************************************************/ Math::real operator()(real sinlon, real coslon) const { real dummy; return Value(false, sinlon, coslon, dummy, dummy, dummy); } /** * Evaluate the sum for a particular longitude. * * @param[in] lon the longitude (degrees). * @return \e V the value of the sum. **********************************************************************/ Math::real operator()(real lon) const { real sinlon, coslon; Math::sincosd(lon, sinlon, coslon); return (*this)(sinlon, coslon); } /** * Evaluate the sum and its gradient for a particular longitude given in * terms of its sine and cosine. * * @param[in] sinlon the sine of the longitude. * @param[in] coslon the cosine of the longitude. * @param[out] gradx \e x component of the gradient. * @param[out] grady \e y component of the gradient. * @param[out] gradz \e z component of the gradient. * @return \e V the value of the sum. * * The gradients will only be computed if the CircularEngine object was * created with this capability (e.g., via \e gradp = true in * SphericalHarmonic::Circle). If not, \e gradx, etc., will not be * touched. The arguments must satisfy sinlon2 + * coslon2 = 1. **********************************************************************/ Math::real operator()(real sinlon, real coslon, real& gradx, real& grady, real& gradz) const { return Value(true, sinlon, coslon, gradx, grady, gradz); } /** * Evaluate the sum and its gradient for a particular longitude. * * @param[in] lon the longitude (degrees). * @param[out] gradx \e x component of the gradient. * @param[out] grady \e y component of the gradient. * @param[out] gradz \e z component of the gradient. * @return \e V the value of the sum. * * The gradients will only be computed if the CircularEngine object was * created with this capability (e.g., via \e gradp = true in * SphericalHarmonic::Circle). If not, \e gradx, etc., will not be * touched. **********************************************************************/ Math::real operator()(real lon, real& gradx, real& grady, real& gradz) const { real sinlon, coslon; Math::sincosd(lon, sinlon, coslon); return (*this)(sinlon, coslon, gradx, grady, gradz); } }; } // namespace GeographicLib #if defined(_MSC_VER) # pragma warning (pop) #endif #endif // GEOGRAPHICLIB_CIRCULARENGINE_HPP geosphere/src/GravityModel.h0000644000176200001440000005677014323400044015612 0ustar liggesusers/** * \file GravityModel.hpp * \brief Header for GeographicLib::GravityModel class * * Copyright (c) Charles Karney (2011-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #if !defined(GEOGRAPHICLIB_GRAVITYMODEL_HPP) #define GEOGRAPHICLIB_GRAVITYMODEL_HPP 1 #include "Constants.h" #include "NormalGravity.h" #include "SphericalHarmonic.h" #include "SphericalHarmonic1.h" #if defined(_MSC_VER) // Squelch warnings about dll vs vector # pragma warning (push) # pragma warning (disable: 4251) #endif namespace GeographicLib { class GravityCircle; /** * \brief Model of the earth's gravity field * * Evaluate the earth's gravity field according to a model. The supported * models treat only the gravitational field exterior to the mass of the * earth. When computing the field at points near (but above) the surface of * the earth a small correction can be applied to account for the mass of the * atmosphere above the point in question; see \ref gravityatmos. * Determining the height of the geoid above the ellipsoid entails correcting * for the mass of the earth above the geoid. The egm96 and egm2008 include * separate correction terms to account for this mass. * * Definitions and terminology (from Heiskanen and Moritz, Sec 2-13): * - \e V = gravitational potential; * - Φ = rotational potential; * - \e W = \e V + Φ = \e T + \e U = total potential; * - V0 = normal gravitation potential; * - \e U = V0 + Φ = total normal potential; * - \e T = \e W − \e U = \e V − V0 = anomalous * or disturbing potential; * - g = ∇\e W = γ + δ; * - f = ∇Φ; * - Γ = ∇V0; * - γ = ∇\e U; * - δ = ∇\e T = gravity disturbance vector * = gPγP; * - δ\e g = gravity disturbance = gP − * γP; * - Δg = gravity anomaly vector = gP * − γQ; here the line \e PQ is * perpendicular to ellipsoid and the potential at \e P equals the normal * potential at \e Q; * - Δ\e g = gravity anomaly = gP − * γQ; * - (ξ, η) deflection of the vertical, the difference in * directions of gP and * γQ, ξ = NS, η = EW. * - \e X, \e Y, \e Z, geocentric coordinates; * - \e x, \e y, \e z, local cartesian coordinates used to denote the east, * north and up directions. * * See \ref gravity for details of how to install the gravity models and the * data format. * * References: * - W. A. Heiskanen and H. Moritz, Physical Geodesy (Freeman, San * Francisco, 1967). * * Example of use: * \include example-GravityModel.cpp * * Gravity is a command-line utility providing * access to the functionality of GravityModel and GravityCircle. **********************************************************************/ class GEOGRAPHICLIB_EXPORT GravityModel { private: typedef Math::real real; friend class GravityCircle; static const int idlength_ = 8; std::string _name, _dir, _description, _date, _filename, _id; real _amodel, _gGMmodel, _zeta0, _corrmult; int _nmx, _mmx; SphericalHarmonic::normalization _norm; NormalGravity _earth; std::vector _cCx, _sSx, _cCC, _cCS, _zonal; real _dzonal0; // A left over contribution to _zonal. SphericalHarmonic _gravitational; SphericalHarmonic1 _disturbing; SphericalHarmonic _correction; void ReadMetadata(const std::string& name); Math::real InternalT(real X, real Y, real Z, real& deltaX, real& deltaY, real& deltaZ, bool gradp, bool correct) const; GravityModel(const GravityModel&) = delete; // copy constructor not allowed // nor copy assignment GravityModel& operator=(const GravityModel&) = delete; enum captype { CAP_NONE = 0U, CAP_G = 1U<<0, // implies potentials W and V CAP_T = 1U<<1, CAP_DELTA = 1U<<2 | CAP_T, // delta implies T? CAP_C = 1U<<3, CAP_GAMMA0 = 1U<<4, CAP_GAMMA = 1U<<5, CAP_ALL = 0x3FU, }; public: /** * Bit masks for the capabilities to be given to the GravityCircle object * produced by Circle. **********************************************************************/ enum mask { /** * No capabilities. * @hideinitializer **********************************************************************/ NONE = 0U, /** * Allow calls to GravityCircle::Gravity, GravityCircle::W, and * GravityCircle::V. * @hideinitializer **********************************************************************/ GRAVITY = CAP_G, /** * Allow calls to GravityCircle::Disturbance and GravityCircle::T. * @hideinitializer **********************************************************************/ DISTURBANCE = CAP_DELTA, /** * Allow calls to GravityCircle::T(real lon) (i.e., computing the * disturbing potential and not the gravity disturbance vector). * @hideinitializer **********************************************************************/ DISTURBING_POTENTIAL = CAP_T, /** * Allow calls to GravityCircle::SphericalAnomaly. * @hideinitializer **********************************************************************/ SPHERICAL_ANOMALY = CAP_DELTA | CAP_GAMMA, /** * Allow calls to GravityCircle::GeoidHeight. * @hideinitializer **********************************************************************/ GEOID_HEIGHT = CAP_T | CAP_C | CAP_GAMMA0, /** * All capabilities. * @hideinitializer **********************************************************************/ ALL = CAP_ALL, }; /** \name Setting up the gravity model **********************************************************************/ ///@{ /** * Construct a gravity model. * * @param[in] name the name of the model. * @param[in] path (optional) directory for data file. * @param[in] Nmax (optional) if non-negative, truncate the degree of the * model this value. * @param[in] Mmax (optional) if non-negative, truncate the order of the * model this value. * @exception GeographicErr if the data file cannot be found, is * unreadable, or is corrupt, or if \e Mmax > \e Nmax. * @exception std::bad_alloc if the memory necessary for storing the model * can't be allocated. * * A filename is formed by appending ".egm" (World Gravity Model) to the * name. If \e path is specified (and is non-empty), then the file is * loaded from directory, \e path. Otherwise the path is given by * DefaultGravityPath(). * * This file contains the metadata which specifies the properties of the * model. The coefficients for the spherical harmonic sums are obtained * from a file obtained by appending ".cof" to metadata file (so the * filename ends in ".egm.cof"). * * If \e Nmax ≥ 0 and \e Mmax < 0, then \e Mmax is set to \e Nmax. * After the model is loaded, the maximum degree and order of the model can * be found by the Degree() and Order() methods. **********************************************************************/ explicit GravityModel(const std::string& name, const std::string& path = "", int Nmax = -1, int Mmax = -1); ///@} /** \name Compute gravity in geodetic coordinates **********************************************************************/ ///@{ /** * Evaluate the gravity at an arbitrary point above (or below) the * ellipsoid. * * @param[in] lat the geographic latitude (degrees). * @param[in] lon the geographic longitude (degrees). * @param[in] h the height above the ellipsoid (meters). * @param[out] gx the easterly component of the acceleration * (m s−2). * @param[out] gy the northerly component of the acceleration * (m s−2). * @param[out] gz the upward component of the acceleration * (m s−2); this is usually negative. * @return \e W the sum of the gravitational and centrifugal potentials * (m2 s−2). * * The function includes the effects of the earth's rotation. **********************************************************************/ Math::real Gravity(real lat, real lon, real h, real& gx, real& gy, real& gz) const; /** * Evaluate the gravity disturbance vector at an arbitrary point above (or * below) the ellipsoid. * * @param[in] lat the geographic latitude (degrees). * @param[in] lon the geographic longitude (degrees). * @param[in] h the height above the ellipsoid (meters). * @param[out] deltax the easterly component of the disturbance vector * (m s−2). * @param[out] deltay the northerly component of the disturbance vector * (m s−2). * @param[out] deltaz the upward component of the disturbance vector * (m s−2). * @return \e T the corresponding disturbing potential * (m2 s−2). **********************************************************************/ Math::real Disturbance(real lat, real lon, real h, real& deltax, real& deltay, real& deltaz) const; /** * Evaluate the geoid height. * * @param[in] lat the geographic latitude (degrees). * @param[in] lon the geographic longitude (degrees). * @return \e N the height of the geoid above the ReferenceEllipsoid() * (meters). * * This calls NormalGravity::U for ReferenceEllipsoid(). Some * approximations are made in computing the geoid height so that the * results of the NGA codes are reproduced accurately. Details are given * in \ref gravitygeoid. **********************************************************************/ Math::real GeoidHeight(real lat, real lon) const; /** * Evaluate the components of the gravity anomaly vector using the * spherical approximation. * * @param[in] lat the geographic latitude (degrees). * @param[in] lon the geographic longitude (degrees). * @param[in] h the height above the ellipsoid (meters). * @param[out] Dg01 the gravity anomaly (m s−2). * @param[out] xi the northerly component of the deflection of the vertical * (degrees). * @param[out] eta the easterly component of the deflection of the vertical * (degrees). * * The spherical approximation (see Heiskanen and Moritz, Sec 2-14) is used * so that the results of the NGA codes are reproduced accurately. * approximations used here. Details are given in \ref gravitygeoid. **********************************************************************/ void SphericalAnomaly(real lat, real lon, real h, real& Dg01, real& xi, real& eta) const; ///@} /** \name Compute gravity in geocentric coordinates **********************************************************************/ ///@{ /** * Evaluate the components of the acceleration due to gravity and the * centrifugal acceleration in geocentric coordinates. * * @param[in] X geocentric coordinate of point (meters). * @param[in] Y geocentric coordinate of point (meters). * @param[in] Z geocentric coordinate of point (meters). * @param[out] gX the \e X component of the acceleration * (m s−2). * @param[out] gY the \e Y component of the acceleration * (m s−2). * @param[out] gZ the \e Z component of the acceleration * (m s−2). * @return \e W = \e V + Φ the sum of the gravitational and * centrifugal potentials (m2 s−2). * * This calls NormalGravity::U for ReferenceEllipsoid(). **********************************************************************/ Math::real W(real X, real Y, real Z, real& gX, real& gY, real& gZ) const; /** * Evaluate the components of the acceleration due to gravity in geocentric * coordinates. * * @param[in] X geocentric coordinate of point (meters). * @param[in] Y geocentric coordinate of point (meters). * @param[in] Z geocentric coordinate of point (meters). * @param[out] GX the \e X component of the acceleration * (m s−2). * @param[out] GY the \e Y component of the acceleration * (m s−2). * @param[out] GZ the \e Z component of the acceleration * (m s−2). * @return \e V = \e W - Φ the gravitational potential * (m2 s−2). **********************************************************************/ Math::real V(real X, real Y, real Z, real& GX, real& GY, real& GZ) const; /** * Evaluate the components of the gravity disturbance in geocentric * coordinates. * * @param[in] X geocentric coordinate of point (meters). * @param[in] Y geocentric coordinate of point (meters). * @param[in] Z geocentric coordinate of point (meters). * @param[out] deltaX the \e X component of the gravity disturbance * (m s−2). * @param[out] deltaY the \e Y component of the gravity disturbance * (m s−2). * @param[out] deltaZ the \e Z component of the gravity disturbance * (m s−2). * @return \e T = \e W - \e U the disturbing potential (also called the * anomalous potential) (m2 s−2). **********************************************************************/ Math::real T(real X, real Y, real Z, real& deltaX, real& deltaY, real& deltaZ) const { return InternalT(X, Y, Z, deltaX, deltaY, deltaZ, true, true); } /** * Evaluate disturbing potential in geocentric coordinates. * * @param[in] X geocentric coordinate of point (meters). * @param[in] Y geocentric coordinate of point (meters). * @param[in] Z geocentric coordinate of point (meters). * @return \e T = \e W - \e U the disturbing potential (also called the * anomalous potential) (m2 s−2). **********************************************************************/ Math::real T(real X, real Y, real Z) const { real dummy; return InternalT(X, Y, Z, dummy, dummy, dummy, false, true); } /** * Evaluate the components of the acceleration due to normal gravity and * the centrifugal acceleration in geocentric coordinates. * * @param[in] X geocentric coordinate of point (meters). * @param[in] Y geocentric coordinate of point (meters). * @param[in] Z geocentric coordinate of point (meters). * @param[out] gammaX the \e X component of the normal acceleration * (m s−2). * @param[out] gammaY the \e Y component of the normal acceleration * (m s−2). * @param[out] gammaZ the \e Z component of the normal acceleration * (m s−2). * @return \e U = V0 + Φ the sum of the * normal gravitational and centrifugal potentials * (m2 s−2). * * This calls NormalGravity::U for ReferenceEllipsoid(). **********************************************************************/ Math::real U(real X, real Y, real Z, real& gammaX, real& gammaY, real& gammaZ) const { return _earth.U(X, Y, Z, gammaX, gammaY, gammaZ); } /** * Evaluate the centrifugal acceleration in geocentric coordinates. * * @param[in] X geocentric coordinate of point (meters). * @param[in] Y geocentric coordinate of point (meters). * @param[out] fX the \e X component of the centrifugal acceleration * (m s−2). * @param[out] fY the \e Y component of the centrifugal acceleration * (m s−2). * @return Φ the centrifugal potential (m2 * s−2). * * This calls NormalGravity::Phi for ReferenceEllipsoid(). **********************************************************************/ Math::real Phi(real X, real Y, real& fX, real& fY) const { return _earth.Phi(X, Y, fX, fY); } ///@} /** \name Compute gravity on a circle of constant latitude **********************************************************************/ ///@{ /** * Create a GravityCircle object to allow the gravity field at many points * with constant \e lat and \e h and varying \e lon to be computed * efficiently. * * @param[in] lat latitude of the point (degrees). * @param[in] h the height of the point above the ellipsoid (meters). * @param[in] caps bitor'ed combination of GravityModel::mask values * specifying the capabilities of the resulting GravityCircle object. * @exception std::bad_alloc if the memory necessary for creating a * GravityCircle can't be allocated. * @return a GravityCircle object whose member functions computes the * gravitational field at a particular values of \e lon. * * The GravityModel::mask values are * - \e caps |= GravityModel::GRAVITY * - \e caps |= GravityModel::DISTURBANCE * - \e caps |= GravityModel::DISTURBING_POTENTIAL * - \e caps |= GravityModel::SPHERICAL_ANOMALY * - \e caps |= GravityModel::GEOID_HEIGHT * . * The default value of \e caps is GravityModel::ALL which turns on all the * capabilities. If an unsupported function is invoked, it will return * NaNs. Note that GravityModel::GEOID_HEIGHT will only be honored if \e h * = 0. * * If the field at several points on a circle of latitude need to be * calculated then creating a GravityCircle object and using its member * functions will be substantially faster, especially for high-degree * models. See \ref gravityparallel for an example of using GravityCircle * (together with OpenMP) to speed up the computation of geoid heights. **********************************************************************/ GravityCircle Circle(real lat, real h, unsigned caps = ALL) const; ///@} /** \name Inspector functions **********************************************************************/ ///@{ /** * @return the NormalGravity object for the reference ellipsoid. **********************************************************************/ const NormalGravity& ReferenceEllipsoid() const { return _earth; } /** * @return the description of the gravity model, if available, in the data * file; if absent, return "NONE". **********************************************************************/ const std::string& Description() const { return _description; } /** * @return date of the model; if absent, return "UNKNOWN". **********************************************************************/ const std::string& DateTime() const { return _date; } /** * @return full file name used to load the gravity model. **********************************************************************/ const std::string& GravityFile() const { return _filename; } /** * @return "name" used to load the gravity model (from the first argument * of the constructor, but this may be overridden by the model file). **********************************************************************/ const std::string& GravityModelName() const { return _name; } /** * @return directory used to load the gravity model. **********************************************************************/ const std::string& GravityModelDirectory() const { return _dir; } /** * @return \e a the equatorial radius of the ellipsoid (meters). **********************************************************************/ Math::real EquatorialRadius() const { return _earth.EquatorialRadius(); } /** * @return \e GM the mass constant of the model (m3 * s−2); this is the product of \e G the gravitational * constant and \e M the mass of the earth (usually including the mass of * the earth's atmosphere). **********************************************************************/ Math::real MassConstant() const { return _gGMmodel; } /** * @return \e GM the mass constant of the ReferenceEllipsoid() * (m3 s−2). **********************************************************************/ Math::real ReferenceMassConstant() const { return _earth.MassConstant(); } /** * @return ω the angular velocity of the model and the * ReferenceEllipsoid() (rad s−1). **********************************************************************/ Math::real AngularVelocity() const { return _earth.AngularVelocity(); } /** * @return \e f the flattening of the ellipsoid. **********************************************************************/ Math::real Flattening() const { return _earth.Flattening(); } /** * @return \e Nmax the maximum degree of the components of the model. **********************************************************************/ int Degree() const { return _nmx; } /** * @return \e Mmax the maximum order of the components of the model. **********************************************************************/ int Order() const { return _mmx; } ///@} /** * @return the default path for gravity model data files. * * This is the value of the environment variable * GEOGRAPHICLIB_GRAVITY_PATH, if set; otherwise, it is * $GEOGRAPHICLIB_DATA/gravity if the environment variable * GEOGRAPHICLIB_DATA is set; otherwise, it is a compile-time default * (/usr/local/share/GeographicLib/gravity on non-Windows systems and * C:/ProgramData/GeographicLib/gravity on Windows systems). **********************************************************************/ static std::string DefaultGravityPath(); /** * @return the default name for the gravity model. * * This is the value of the environment variable * GEOGRAPHICLIB_GRAVITY_NAME, if set; otherwise, it is "egm96". The * GravityModel class does not use this function; it is just provided as a * convenience for a calling program when constructing a GravityModel * object. **********************************************************************/ static std::string DefaultGravityName(); }; } // namespace GeographicLib #if defined(_MSC_VER) # pragma warning (pop) #endif #endif // GEOGRAPHICLIB_GRAVITYMODEL_HPP geosphere/src/kissfft.h0000644000176200001440000003545714323374252014667 0ustar liggesusers/* * Copyright (c) 2003-2010, Mark Borgerding. All rights reserved. * This file is part of KISS FFT - https://github.com/mborgerding/kissfft * * SPDX-License-Identifier: BSD-3-Clause * See COPYING file for more information. */ #ifndef KISSFFT_CLASS_HH #define KISSFFT_CLASS_HH #include #include #include template class kissfft { public: typedef std::complex cpx_t; kissfft( const std::size_t nfft, const bool inverse ) :_nfft(nfft) ,_inverse(inverse) { using std::acos; using std::cos; using std::sin; if (_nfft == 0) return; // fill twiddle factors _twiddles.resize(_nfft); { const scalar_t s = _inverse ? 1 : -1; const scalar_t d = acos( (scalar_t) -1) / (2 * _nfft); int i = 0, N = int(_nfft); // signed ints needed for subtractions // enforce trigonometric symmetries by evaluating sin and cos // with arguments in the range [-pi/4, pi/4] for (; 8*i < N; ++i) _twiddles[i] = cpx_t(+ cos((4*i )*d), +s*sin((4*i )*d)); // pi/4*[0, 1) for (; 8*i < 3*N; ++i) _twiddles[i] = cpx_t(- sin((4*i- N)*d), +s*cos((4*i- N)*d)); // pi/4*[1, 3) for (; 8*i < 5*N; ++i) _twiddles[i] = cpx_t(- cos((4*i-2*N)*d), -s*sin((4*i-2*N)*d)); // pi/4*[3, 5) for (; 8*i < 7*N; ++i) _twiddles[i] = cpx_t(+ sin((4*i-3*N)*d), -s*cos((4*i-3*N)*d)); // pi/4*[5, 7) for (; i < N; ++i) _twiddles[i] = cpx_t(+ cos((4*i-4*N)*d), +s*sin((4*i-4*N)*d)); // pi/4*[5, 8) } //factorize //start factoring out 4's, then 2's, then 3,5,7,9,... std::size_t n= _nfft; std::size_t p=4; do { while (n % p) { switch (p) { case 4: p = 2; break; case 2: p = 3; break; default: p += 2; break; } if (p*p>n) p = n;// no more factors } n /= p; _stageRadix.push_back(p); _stageRemainder.push_back(n); }while(n>1); } /// Changes the FFT-length and/or the transform direction. /// /// @post The @c kissfft object will be in the same state as if it /// had been newly constructed with the passed arguments. /// However, the implementation may be faster than constructing a /// new fft object. void assign( const std::size_t nfft, const bool inverse ) { if ( nfft != _nfft ) { kissfft tmp( nfft, inverse ); // O(n) time. std::swap( tmp, *this ); // this is O(1) in C++11, O(n) otherwise. } else if ( inverse != _inverse ) { // conjugate the twiddle factors. for ( typename std::vector::iterator it = _twiddles.begin(); it != _twiddles.end(); ++it ) it->imag( -it->imag() ); } } /// Calculates the complex Discrete Fourier Transform. /// /// The size of the passed arrays must be passed in the constructor. /// The sum of the squares of the absolute values in the @c dst /// array will be @c N times the sum of the squares of the absolute /// values in the @c src array, where @c N is the size of the array. /// In other words, the l_2 norm of the resulting array will be /// @c sqrt(N) times as big as the l_2 norm of the input array. /// This is also the case when the inverse flag is set in the /// constructor. Hence when applying the same transform twice, but with /// the inverse flag changed the second time, then the result will /// be equal to the original input times @c N. void transform(const cpx_t * fft_in, cpx_t * fft_out, const std::size_t stage = 0, const std::size_t fstride = 1, const std::size_t in_stride = 1) const { if (_nfft == 0) return; const std::size_t p = _stageRadix[stage]; const std::size_t m = _stageRemainder[stage]; cpx_t * const Fout_beg = fft_out; cpx_t * const Fout_end = fft_out + p*m; if (m==1) { do{ *fft_out = *fft_in; fft_in += fstride*in_stride; }while(++fft_out != Fout_end ); }else{ do{ // recursive call: // DFT of size m*p performed by doing // p instances of smaller DFTs of size m, // each one takes a decimated version of the input transform(fft_in, fft_out, stage+1, fstride*p,in_stride); fft_in += fstride*in_stride; }while( (fft_out += m) != Fout_end ); } fft_out=Fout_beg; // recombine the p smaller DFTs switch (p) { case 2: kf_bfly2(fft_out,fstride,m); break; case 3: kf_bfly3(fft_out,fstride,m); break; case 4: kf_bfly4(fft_out,fstride,m); break; case 5: kf_bfly5(fft_out,fstride,m); break; default: kf_bfly_generic(fft_out,fstride,m,p); break; } } /// Calculates the Discrete Fourier Transform (DFT) of a real input /// of size @c 2*N. /// /// The 0-th and N-th value of the DFT are real numbers. These are /// stored in @c dst[0].real() and @c dst[0].imag() respectively. /// The remaining DFT values up to the index N-1 are stored in /// @c dst[1] to @c dst[N-1]. /// The other half of the DFT values can be calculated from the /// symmetry relation /// @code /// DFT(src)[2*N-k] == conj( DFT(src)[k] ); /// @endcode /// The same scaling factors as in @c transform() apply. /// /// @note For this to work, the types @c scalar_t and @c cpx_t /// must fulfill the following requirements: /// /// For any object @c z of type @c cpx_t, /// @c reinterpret_cast(z)[0] is the real part of @c z and /// @c reinterpret_cast(z)[1] is the imaginary part of @c z. /// For any pointer to an element of an array of @c cpx_t named @c p /// and any valid array index @c i, @c reinterpret_cast(p)[2*i] /// is the real part of the complex number @c p[i], and /// @c reinterpret_cast(p)[2*i+1] is the imaginary part of the /// complex number @c p[i]. /// /// Since C++11, these requirements are guaranteed to be satisfied for /// @c scalar_ts being @c float, @c double or @c long @c double /// together with @c cpx_t being @c std::complex. void transform_real( const scalar_t * const src, cpx_t * const dst ) const { using std::acos; using std::exp; const std::size_t N = _nfft; if ( N == 0 ) return; // perform complex FFT transform( reinterpret_cast(src), dst ); // post processing for k = 0 and k = N dst[0] = cpx_t( dst[0].real() + dst[0].imag(), dst[0].real() - dst[0].imag() ); // post processing for all the other k = 1, 2, ..., N-1 const scalar_t pi = acos( (scalar_t) -1); const scalar_t half_phi_inc = ( _inverse ? pi : -pi ) / N; const cpx_t twiddle_mul = exp( cpx_t(0, half_phi_inc) ); for ( std::size_t k = 1; 2*k < N; ++k ) { const cpx_t w = (scalar_t)0.5 * cpx_t( dst[k].real() + dst[N-k].real(), dst[k].imag() - dst[N-k].imag() ); const cpx_t z = (scalar_t)0.5 * cpx_t( dst[k].imag() + dst[N-k].imag(), -dst[k].real() + dst[N-k].real() ); const cpx_t twiddle = k % 2 == 0 ? _twiddles[k/2] : _twiddles[k/2] * twiddle_mul; dst[ k] = w + twiddle * z; dst[N-k] = std::conj( w - twiddle * z ); } if ( N % 2 == 0 ) dst[N/2] = std::conj( dst[N/2] ); } private: void kf_bfly2( cpx_t * Fout, const size_t fstride, const std::size_t m) const { for (std::size_t k=0;k _scratchbuf.size()) _scratchbuf.resize(p); for ( std::size_t u=0; u=_nfft) twidx-=_nfft; Fout[ k ] += _scratchbuf[q] * twiddles[twidx]; } k += m; } } } std::size_t _nfft; bool _inverse; std::vector _twiddles; std::vector _stageRadix; std::vector _stageRemainder; mutable std::vector _scratchbuf; }; #endif geosphere/src/GeoCoords.h0000644000176200001440000005344214323377037015100 0ustar liggesusers/** * \file GeoCoords.hpp * \brief Header for GeographicLib::GeoCoords class * * Copyright (c) Charles Karney (2008-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ #if !defined(GEOGRAPHICLIB_GEOCOORDS_HPP) #define GEOGRAPHICLIB_GEOCOORDS_HPP 1 #include "UTMUPS.h" #include "Constants.h" namespace GeographicLib { /** * \brief Conversion between geographic coordinates * * This class stores a geographic position which may be set via the * constructors or Reset via * - latitude and longitude * - UTM or UPS coordinates * - a string representation of these or an MGRS coordinate string * * The state consists of the latitude and longitude and the supplied UTM or * UPS coordinates (possibly derived from the MGRS coordinates). If latitude * and longitude were given then the UTM/UPS coordinates follows the standard * conventions. * * The mutable state consists of the UTM or UPS coordinates for a alternate * zone. A method SetAltZone is provided to set the alternate UPS/UTM zone. * * Methods are provided to return the geographic coordinates, the input UTM * or UPS coordinates (and associated meridian convergence and scale), or * alternate UTM or UPS coordinates (and their associated meridian * convergence and scale). * * Once the input string has been parsed, you can print the result out in any * of the formats, decimal degrees, degrees minutes seconds, MGRS, UTM/UPS. * * Example of use: * \include example-GeoCoords.cpp * * GeoConvert is a command-line utility * providing access to the functionality of GeoCoords. **********************************************************************/ class GEOGRAPHICLIB_EXPORT GeoCoords { private: typedef Math::real real; real _lat, _long, _easting, _northing, _gamma, _k; bool _northp; int _zone; // See UTMUPS::zonespec mutable real _alt_easting, _alt_northing, _alt_gamma, _alt_k; mutable int _alt_zone; void CopyToAlt() const { _alt_easting = _easting; _alt_northing = _northing; _alt_gamma = _gamma; _alt_k = _k; _alt_zone = _zone; } static void UTMUPSString(int zone, bool northp, real easting, real northing, int prec, bool abbrev, std::string& utm); void FixHemisphere(); public: /** \name Initializing the GeoCoords object **********************************************************************/ ///@{ /** * The default constructor sets the coordinate as undefined. **********************************************************************/ GeoCoords() : _lat(Math::NaN()) , _long(Math::NaN()) , _easting(Math::NaN()) , _northing(Math::NaN()) , _gamma(Math::NaN()) , _k(Math::NaN()) , _northp(false) , _zone(UTMUPS::INVALID) { CopyToAlt(); } /** * Construct from a string. * * @param[in] s 1-element, 2-element, or 3-element string representation of * the position. * @param[in] centerp governs the interpretation of MGRS coordinates (see * below). * @param[in] longfirst governs the interpretation of geographic * coordinates (see below). * @exception GeographicErr if the \e s is malformed (see below). * * Parse as a string and interpret it as a geographic position. The input * string is broken into space (or comma) separated pieces and Basic * decision on which format is based on number of components * -# MGRS * -# "Lat Long" or "Long Lat" * -# "Zone Easting Northing" or "Easting Northing Zone" * * The following inputs are approximately the same (Ar Ramadi Bridge, Iraq) * - Latitude and Longitude * - 33.44 43.27 * - N33d26.4' E43d16.2' * - 43d16'12"E 33d26'24"N * - 43:16:12E 33:26:24 * - MGRS * - 38SLC30 * - 38SLC391014 * - 38SLC3918701405 * - 37SHT9708 * - UTM * - 38n 339188 3701405 * - 897039 3708229 37n * * Latitude and Longitude parsing: Latitude precedes longitude, * unless a N, S, E, W hemisphere designator is used on one or both * coordinates. If \e longfirst = true (default is false), then * longitude precedes latitude in the absence of a hemisphere designator. * Thus (with \e longfirst = false) * - 40 -75 * - N40 W75 * - -75 N40 * - 75W 40N * - E-75 -40S * . * are all the same position. The coordinates may be given in * decimal degrees, degrees and decimal minutes, degrees, minutes, * seconds, etc. Use d, ', and " to mark off the degrees, * minutes and seconds. Various alternative symbols for degrees, minutes, * and seconds are allowed. Alternatively, use : to separate these * components. A single addition or subtraction is allowed. (See * DMS::Decode for details.) Thus * - 40d30'30" * - 40d30'30 * - 40°30'30 * - 40d30.5' * - 40d30.5 * - 40:30:30 * - 40:30.5 * - 40.508333333 * - 40:30+0:0:30 * - 40:31-0:0.5 * . * all specify the same angle. The leading sign applies to the following * components so -1d30 is -(1+30/60) = −1.5. However, note * that -1:30-0:0:15 is parsed as (-1:30) + (-0:0:15) = −(1+30/60) * − (15/3600). Latitudes must be in the range [−90°, * 90°]. Internally longitudes are reduced to the range * [−180°, 180°]. * * UTM/UPS parsing: For UTM zones (−80° ≤ Lat < * 84°), the zone designator is made up of a zone number (for 1 to 60) * and a hemisphere letter (n or s), e.g., 38n (38north can also be used). * The latitude band designer ([C--M] in the southern hemisphere and [N--X] * in the northern) should NOT be used. (This is part of the MGRS * coordinate.) The zone designator for the poles (where UPS is employed) * is a hemisphere letter by itself, i.e., n or s (north or south can also * be used). * * MGRS parsing interprets the grid references as square area at the * specified precision (1m, 10m, 100m, etc.). If \e centerp = true (the * default), the center of this square is then taken to be the precise * position; thus: * - 38SMB = 38n 450000 3650000 * - 38SMB4484 = 38n 444500 3684500 * - 38SMB44148470 = 38n 444145 3684705 * . * Otherwise, the "south-west" corner of the square is used, i.e., * - 38SMB = 38n 400000 3600000 * - 38SMB4484 = 38n 444000 3684000 * - 38SMB44148470 = 38n 444140 3684700 **********************************************************************/ explicit GeoCoords(const std::string& s, bool centerp = true, bool longfirst = false) { Reset(s, centerp, longfirst); } /** * Construct from geographic coordinates. * * @param[in] latitude (degrees). * @param[in] longitude (degrees). * @param[in] zone if specified, force the UTM/UPS representation to use a * specified zone using the rules given in UTMUPS::zonespec. * @exception GeographicErr if \e latitude is not in [−90°, * 90°]. * @exception GeographicErr if \e zone cannot be used for this location. **********************************************************************/ GeoCoords(real latitude, real longitude, int zone = UTMUPS::STANDARD) { Reset(latitude, longitude, zone); } /** * Construct from UTM/UPS coordinates. * * @param[in] zone UTM zone (zero means UPS). * @param[in] northp hemisphere (true means north, false means south). * @param[in] easting (meters). * @param[in] northing (meters). * @exception GeographicErr if \e zone, \e easting, or \e northing is * outside its allowed range. **********************************************************************/ GeoCoords(int zone, bool northp, real easting, real northing) { Reset(zone, northp, easting, northing); } /** * Reset the location from a string. See * GeoCoords(const std::string& s, bool centerp, bool longfirst). * * @param[in] s 1-element, 2-element, or 3-element string representation of * the position. * @param[in] centerp governs the interpretation of MGRS coordinates. * @param[in] longfirst governs the interpretation of geographic * coordinates. * @exception GeographicErr if the \e s is malformed. **********************************************************************/ void Reset(const std::string& s, bool centerp = true, bool longfirst = false); /** * Reset the location in terms of geographic coordinates. See * GeoCoords(real latitude, real longitude, int zone). * * @param[in] latitude (degrees). * @param[in] longitude (degrees). * @param[in] zone if specified, force the UTM/UPS representation to use a * specified zone using the rules given in UTMUPS::zonespec. * @exception GeographicErr if \e latitude is not in [−90°, * 90°]. * @exception GeographicErr if \e zone cannot be used for this location. **********************************************************************/ void Reset(real latitude, real longitude, int zone = UTMUPS::STANDARD) { UTMUPS::Forward(latitude, longitude, _zone, _northp, _easting, _northing, _gamma, _k, zone); _lat = latitude; _long = Math::AngNormalize(longitude); CopyToAlt(); } /** * Reset the location in terms of UPS/UPS coordinates. See * GeoCoords(int zone, bool northp, real easting, real northing). * * @param[in] zone UTM zone (zero means UPS). * @param[in] northp hemisphere (true means north, false means south). * @param[in] easting (meters). * @param[in] northing (meters). * @exception GeographicErr if \e zone, \e easting, or \e northing is * outside its allowed range. **********************************************************************/ void Reset(int zone, bool northp, real easting, real northing) { UTMUPS::Reverse(zone, northp, easting, northing, _lat, _long, _gamma, _k); _zone = zone; _northp = northp; _easting = easting; _northing = northing; FixHemisphere(); CopyToAlt(); } ///@} /** \name Querying the GeoCoords object **********************************************************************/ ///@{ /** * @return latitude (degrees) **********************************************************************/ Math::real Latitude() const { return _lat; } /** * @return longitude (degrees) **********************************************************************/ Math::real Longitude() const { return _long; } /** * @return easting (meters) **********************************************************************/ Math::real Easting() const { return _easting; } /** * @return northing (meters) **********************************************************************/ Math::real Northing() const { return _northing; } /** * @return meridian convergence (degrees) for the UTM/UPS projection. **********************************************************************/ Math::real Convergence() const { return _gamma; } /** * @return scale for the UTM/UPS projection. **********************************************************************/ Math::real Scale() const { return _k; } /** * @return hemisphere (false means south, true means north). **********************************************************************/ bool Northp() const { return _northp; } /** * @return hemisphere letter n or s. **********************************************************************/ char Hemisphere() const { return _northp ? 'n' : 's'; } /** * @return the zone corresponding to the input (return 0 for UPS). **********************************************************************/ int Zone() const { return _zone; } ///@} /** \name Setting and querying the alternate zone **********************************************************************/ ///@{ /** * Specify alternate zone number. * * @param[in] zone zone number for the alternate representation. * @exception GeographicErr if \e zone cannot be used for this location. * * See UTMUPS::zonespec for more information on the interpretation of \e * zone. Note that \e zone == UTMUPS::STANDARD (the default) use the * standard UPS or UTM zone, UTMUPS::MATCH does nothing retaining the * existing alternate representation. Before this is called the alternate * zone is the input zone. **********************************************************************/ void SetAltZone(int zone = UTMUPS::STANDARD) const { if (zone == UTMUPS::MATCH) return; zone = UTMUPS::StandardZone(_lat, _long, zone); if (zone == _zone) CopyToAlt(); else { bool northp; UTMUPS::Forward(_lat, _long, _alt_zone, northp, _alt_easting, _alt_northing, _alt_gamma, _alt_k, zone); } } /** * @return current alternate zone (return 0 for UPS). **********************************************************************/ int AltZone() const { return _alt_zone; } /** * @return easting (meters) for alternate zone. **********************************************************************/ Math::real AltEasting() const { return _alt_easting; } /** * @return northing (meters) for alternate zone. **********************************************************************/ Math::real AltNorthing() const { return _alt_northing; } /** * @return meridian convergence (degrees) for alternate zone. **********************************************************************/ Math::real AltConvergence() const { return _alt_gamma; } /** * @return scale for alternate zone. **********************************************************************/ Math::real AltScale() const { return _alt_k; } ///@} /** \name String representations of the GeoCoords object **********************************************************************/ ///@{ /** * String representation with latitude and longitude as signed decimal * degrees. * * @param[in] prec precision (relative to about 1m). * @param[in] longfirst if true give longitude first (default = false) * @exception std::bad_alloc if memory for the string can't be allocated. * @return decimal latitude/longitude string representation. * * Precision specifies accuracy of representation as follows: * - prec = −5 (min), 1° * - prec = 0, 10−5° (about 1m) * - prec = 3, 10−8° * - prec = 9 (max), 10−14° **********************************************************************/ std::string GeoRepresentation(int prec = 0, bool longfirst = false) const; /** * String representation with latitude and longitude as degrees, minutes, * seconds, and hemisphere. * * @param[in] prec precision (relative to about 1m) * @param[in] longfirst if true give longitude first (default = false) * @param[in] dmssep if non-null, use as the DMS separator character * (instead of d, ', " delimiters). * @exception std::bad_alloc if memory for the string can't be allocated. * @return DMS latitude/longitude string representation. * * Precision specifies accuracy of representation as follows: * - prec = −5 (min), 1° * - prec = −4, 0.1° * - prec = −3, 1' * - prec = −2, 0.1' * - prec = −1, 1" * - prec = 0, 0.1" (about 3m) * - prec = 1, 0.01" * - prec = 10 (max), 10−11" **********************************************************************/ std::string DMSRepresentation(int prec = 0, bool longfirst = false, char dmssep = char(0)) const; /** * MGRS string. * * @param[in] prec precision (relative to about 1m). * @exception std::bad_alloc if memory for the string can't be allocated. * @return MGRS string. * * This gives the coordinates of the enclosing grid square with size given * by the precision. Thus 38n 444180 3684790 converted to a MGRS * coordinate at precision −2 (100m) is 38SMB441847 and not * 38SMB442848. \e prec specifies the precision of the MGRS string as * follows: * - prec = −6 (min), only the grid zone is returned, e.g., 38S * - prec = −5, 100km, e.g., 38SMB * - prec = −4, 10km * - prec = −3, 1km * - prec = −2, 100m * - prec = −1, 10m * - prec = 0, 1m * - prec = 1, 0.1m * - prec = 6 (max), 1μm **********************************************************************/ std::string MGRSRepresentation(int prec = 0) const; /** * UTM/UPS string. * * @param[in] prec precision (relative to about 1m) * @param[in] abbrev if true (the default) use abbreviated (n/s) notation * for hemisphere; otherwise spell out the hemisphere (north/south) * @exception std::bad_alloc if memory for the string can't be allocated. * @return UTM/UPS string representation: zone designator, easting, and * northing. * * Precision specifies accuracy of representation as follows: * - prec = −5 (min), 100km * - prec = −3, 1km * - prec = 0, 1m * - prec = 3, 1mm * - prec = 6, 1μm * - prec = 9 (max), 1nm **********************************************************************/ std::string UTMUPSRepresentation(int prec = 0, bool abbrev = true) const; /** * UTM/UPS string with hemisphere override. * * @param[in] northp hemisphere override * @param[in] prec precision (relative to about 1m) * @param[in] abbrev if true (the default) use abbreviated (n/s) notation * for hemisphere; otherwise spell out the hemisphere (north/south) * @exception GeographicErr if the hemisphere override attempts to change * UPS N to UPS S or vice versa. * @exception std::bad_alloc if memory for the string can't be allocated. * @return UTM/UPS string representation: zone designator, easting, and * northing. **********************************************************************/ std::string UTMUPSRepresentation(bool northp, int prec = 0, bool abbrev = true) const; /** * MGRS string for the alternate zone. See GeoCoords::MGRSRepresentation. * * @param[in] prec precision (relative to about 1m). * @exception std::bad_alloc if memory for the string can't be allocated. * @return MGRS string. **********************************************************************/ std::string AltMGRSRepresentation(int prec = 0) const; /** * UTM/UPS string for the alternate zone. See * GeoCoords::UTMUPSRepresentation. * * @param[in] prec precision (relative to about 1m) * @param[in] abbrev if true (the default) use abbreviated (n/s) notation * for hemisphere; otherwise spell out the hemisphere (north/south) * @exception std::bad_alloc if memory for the string can't be allocated. * @return UTM/UPS string representation: zone designator, easting, and * northing. **********************************************************************/ std::string AltUTMUPSRepresentation(int prec = 0, bool abbrev = true) const; /** * UTM/UPS string for the alternate zone, with hemisphere override. * * @param[in] northp hemisphere override * @param[in] prec precision (relative to about 1m) * @param[in] abbrev if true (the default) use abbreviated (n/s) notation * for hemisphere; otherwise spell out the hemisphere (north/south) * @exception GeographicErr if the hemisphere override attempts to change * UPS n to UPS s or vice verse. * @exception std::bad_alloc if memory for the string can't be allocated. * @return UTM/UPS string representation: zone designator, easting, and * northing. **********************************************************************/ std::string AltUTMUPSRepresentation(bool northp, int prec = 0, bool abbrev = true) const; ///@} /** \name Inspector functions **********************************************************************/ ///@{ /** * @return \e a the equatorial radius of the WGS84 ellipsoid (meters). * * (The WGS84 value is returned because the UTM and UPS projections are * based on this ellipsoid.) **********************************************************************/ Math::real EquatorialRadius() const { return UTMUPS::EquatorialRadius(); } /** * @return \e f the flattening of the WGS84 ellipsoid. * * (The WGS84 value is returned because the UTM and UPS projections are * based on this ellipsoid.) **********************************************************************/ Math::real Flattening() const { return UTMUPS::Flattening(); } ///@} }; } // namespace GeographicLib #endif // GEOGRAPHICLIB_GEOCOORDS_HPP geosphere/src/GeodesicLineExact.cpp0000644000176200001440000002622214323376011017051 0ustar liggesusers/** * \file GeodesicLineExact.cpp * \brief Implementation for GeographicLib::GeodesicLineExact class * * Copyright (c) Charles Karney (2012-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ * * This is a reformulation of the geodesic problem. The notation is as * follows: * - at a general point (no suffix or 1 or 2 as suffix) * - phi = latitude * - beta = latitude on auxiliary sphere * - omega = longitude on auxiliary sphere * - lambda = longitude * - alpha = azimuth of great circle * - sigma = arc length along great circle * - s = distance * - tau = scaled distance (= sigma at multiples of pi/2) * - at northwards equator crossing * - beta = phi = 0 * - omega = lambda = 0 * - alpha = alpha0 * - sigma = s = 0 * - a 12 suffix means a difference, e.g., s12 = s2 - s1. * - s and c prefixes mean sin and cos **********************************************************************/ #include "GeodesicLineExact.h" #if defined(_MSC_VER) // Squelch warnings about mixing enums # pragma warning (disable: 5054) #endif namespace GeographicLib { using namespace std; void GeodesicLineExact::LineInit(const GeodesicExact& g, real lat1, real lon1, real azi1, real salp1, real calp1, unsigned caps) { tiny_ = g.tiny_; _lat1 = Math::LatFix(lat1); _lon1 = lon1; _azi1 = azi1; _salp1 = salp1; _calp1 = calp1; _a = g._a; _f = g._f; _b = g._b; _c2 = g._c2; _f1 = g._f1; _e2 = g._e2; _nC4 = g._nC4; // Always allow latitude and azimuth and unrolling of longitude _caps = caps | LATITUDE | AZIMUTH | LONG_UNROLL; real cbet1, sbet1; Math::sincosd(Math::AngRound(_lat1), sbet1, cbet1); sbet1 *= _f1; // Ensure cbet1 = +epsilon at poles Math::norm(sbet1, cbet1); cbet1 = fmax(tiny_, cbet1); _dn1 = (_f >= 0 ? sqrt(1 + g._ep2 * Math::sq(sbet1)) : sqrt(1 - _e2 * Math::sq(cbet1)) / _f1); // Evaluate alp0 from sin(alp1) * cos(bet1) = sin(alp0), _salp0 = _salp1 * cbet1; // alp0 in [0, pi/2 - |bet1|] // Alt: calp0 = hypot(sbet1, calp1 * cbet1). The following // is slightly better (consider the case salp1 = 0). _calp0 = hypot(_calp1, _salp1 * sbet1); // Evaluate sig with tan(bet1) = tan(sig1) * cos(alp1). // sig = 0 is nearest northward crossing of equator. // With bet1 = 0, alp1 = pi/2, we have sig1 = 0 (equatorial line). // With bet1 = pi/2, alp1 = -pi, sig1 = pi/2 // With bet1 = -pi/2, alp1 = 0 , sig1 = -pi/2 // Evaluate omg1 with tan(omg1) = sin(alp0) * tan(sig1). // With alp0 in (0, pi/2], quadrants for sig and omg coincide. // No atan2(0,0) ambiguity at poles since cbet1 = +epsilon. // With alp0 = 0, omg1 = 0 for alp1 = 0, omg1 = pi for alp1 = pi. _ssig1 = sbet1; _somg1 = _salp0 * sbet1; _csig1 = _comg1 = sbet1 != 0 || _calp1 != 0 ? cbet1 * _calp1 : 1; // Without normalization we have schi1 = somg1. _cchi1 = _f1 * _dn1 * _comg1; Math::norm(_ssig1, _csig1); // sig1 in (-pi, pi] // Math::norm(_somg1, _comg1); -- don't need to normalize! // Math::norm(_schi1, _cchi1); -- don't need to normalize! _k2 = Math::sq(_calp0) * g._ep2; _eE.Reset(-_k2, -g._ep2, 1 + _k2, 1 + g._ep2); if (_caps & CAP_E) { _eE0 = _eE.E() / (Math::pi() / 2); _eE1 = _eE.deltaE(_ssig1, _csig1, _dn1); real s = sin(_eE1), c = cos(_eE1); // tau1 = sig1 + B11 _stau1 = _ssig1 * c + _csig1 * s; _ctau1 = _csig1 * c - _ssig1 * s; // Not necessary because Einv inverts E // _eE1 = -_eE.deltaEinv(_stau1, _ctau1); } if (_caps & CAP_D) { _dD0 = _eE.D() / (Math::pi() / 2); _dD1 = _eE.deltaD(_ssig1, _csig1, _dn1); } if (_caps & CAP_H) { _hH0 = _eE.H() / (Math::pi() / 2); _hH1 = _eE.deltaH(_ssig1, _csig1, _dn1); } if (_caps & CAP_C4) { // Multiplier = a^2 * e^2 * cos(alpha0) * sin(alpha0) _aA4 = Math::sq(_a) * _calp0 * _salp0 * _e2; if (_aA4 == 0) _bB41 = 0; else { GeodesicExact::I4Integrand i4(g._ep2, _k2); _cC4a.resize(_nC4); g._fft.transform(i4, _cC4a.data()); _bB41 = DST::integral(_ssig1, _csig1, _cC4a.data(), _nC4); } } _a13 = _s13 = Math::NaN(); } GeodesicLineExact::GeodesicLineExact(const GeodesicExact& g, real lat1, real lon1, real azi1, unsigned caps) { azi1 = Math::AngNormalize(azi1); real salp1, calp1; // Guard against underflow in salp0. Also -0 is converted to +0. Math::sincosd(Math::AngRound(azi1), salp1, calp1); LineInit(g, lat1, lon1, azi1, salp1, calp1, caps); } GeodesicLineExact::GeodesicLineExact(const GeodesicExact& g, real lat1, real lon1, real azi1, real salp1, real calp1, unsigned caps, bool arcmode, real s13_a13) { LineInit(g, lat1, lon1, azi1, salp1, calp1, caps); GenSetDistance(arcmode, s13_a13); } Math::real GeodesicLineExact::GenPosition(bool arcmode, real s12_a12, unsigned outmask, real& lat2, real& lon2, real& azi2, real& s12, real& m12, real& M12, real& M21, real& S12) const { outmask &= _caps & OUT_MASK; if (!( Init() && (arcmode || (_caps & (OUT_MASK & DISTANCE_IN))) )) // Uninitialized or impossible distance calculation requested return Math::NaN(); // Avoid warning about uninitialized B12. real sig12, ssig12, csig12, E2 = 0, AB1 = 0; if (arcmode) { // Interpret s12_a12 as spherical arc length sig12 = s12_a12 * Math::degree(); Math::sincosd(s12_a12, ssig12, csig12); } else { // Interpret s12_a12 as distance real tau12 = s12_a12 / (_b * _eE0), s = sin(tau12), c = cos(tau12); // tau2 = tau1 + tau12 E2 = - _eE.deltaEinv(_stau1 * c + _ctau1 * s, _ctau1 * c - _stau1 * s); sig12 = tau12 - (E2 - _eE1); ssig12 = sin(sig12); csig12 = cos(sig12); } real ssig2, csig2, sbet2, cbet2, salp2, calp2; // sig2 = sig1 + sig12 ssig2 = _ssig1 * csig12 + _csig1 * ssig12; csig2 = _csig1 * csig12 - _ssig1 * ssig12; real dn2 = _eE.Delta(ssig2, csig2); if (outmask & (DISTANCE | REDUCEDLENGTH | GEODESICSCALE)) { if (arcmode) { E2 = _eE.deltaE(ssig2, csig2, dn2); } AB1 = _eE0 * (E2 - _eE1); } // sin(bet2) = cos(alp0) * sin(sig2) sbet2 = _calp0 * ssig2; // Alt: cbet2 = hypot(csig2, salp0 * ssig2); cbet2 = hypot(_salp0, _calp0 * csig2); if (cbet2 == 0) // I.e., salp0 = 0, csig2 = 0. Break the degeneracy in this case cbet2 = csig2 = tiny_; // tan(alp0) = cos(sig2)*tan(alp2) salp2 = _salp0; calp2 = _calp0 * csig2; // No need to normalize if (outmask & DISTANCE) s12 = arcmode ? _b * (_eE0 * sig12 + AB1) : s12_a12; if (outmask & LONGITUDE) { real somg2 = _salp0 * ssig2, comg2 = csig2, // No need to normalize E = copysign(real(1), _salp0); // east-going? // Without normalization we have schi2 = somg2. real cchi2 = _f1 * dn2 * comg2; real chi12 = outmask & LONG_UNROLL ? E * (sig12 - (atan2( ssig2, csig2) - atan2( _ssig1, _csig1)) + (atan2(E * somg2, cchi2) - atan2(E * _somg1, _cchi1))) : atan2(somg2 * _cchi1 - cchi2 * _somg1, cchi2 * _cchi1 + somg2 * _somg1); real lam12 = chi12 - _e2/_f1 * _salp0 * _hH0 * (sig12 + (_eE.deltaH(ssig2, csig2, dn2) - _hH1)); real lon12 = lam12 / Math::degree(); lon2 = outmask & LONG_UNROLL ? _lon1 + lon12 : Math::AngNormalize(Math::AngNormalize(_lon1) + Math::AngNormalize(lon12)); } if (outmask & LATITUDE) lat2 = Math::atan2d(sbet2, _f1 * cbet2); if (outmask & AZIMUTH) azi2 = Math::atan2d(salp2, calp2); if (outmask & (REDUCEDLENGTH | GEODESICSCALE)) { real J12 = _k2 * _dD0 * (sig12 + (_eE.deltaD(ssig2, csig2, dn2) - _dD1)); if (outmask & REDUCEDLENGTH) // Add parens around (_csig1 * ssig2) and (_ssig1 * csig2) to ensure // accurate cancellation in the case of coincident points. m12 = _b * ((dn2 * (_csig1 * ssig2) - _dn1 * (_ssig1 * csig2)) - _csig1 * csig2 * J12); if (outmask & GEODESICSCALE) { real t = _k2 * (ssig2 - _ssig1) * (ssig2 + _ssig1) / (_dn1 + dn2); M12 = csig12 + (t * ssig2 - csig2 * J12) * _ssig1 / _dn1; M21 = csig12 - (t * _ssig1 - _csig1 * J12) * ssig2 / dn2; } } if (outmask & AREA) { real B42 = _aA4 == 0 ? 0 : DST::integral(ssig2, csig2, _cC4a.data(), _nC4); real salp12, calp12; if (_calp0 == 0 || _salp0 == 0) { // alp12 = alp2 - alp1, used in atan2 so no need to normalize salp12 = salp2 * _calp1 - calp2 * _salp1; calp12 = calp2 * _calp1 + salp2 * _salp1; // We used to include here some patch up code that purported to deal // with nearly meridional geodesics properly. However, this turned out // to be wrong once _salp1 = -0 was allowed (via // GeodesicExact::InverseLine). In fact, the calculation of {s,c}alp12 // was already correct (following the IEEE rules for handling signed // zeros). So the patch up code was unnecessary (as well as // dangerous). } else { // tan(alp) = tan(alp0) * sec(sig) // tan(alp2-alp1) = (tan(alp2) -tan(alp1)) / (tan(alp2)*tan(alp1)+1) // = calp0 * salp0 * (csig1-csig2) / (salp0^2 + calp0^2 * csig1*csig2) // If csig12 > 0, write // csig1 - csig2 = ssig12 * (csig1 * ssig12 / (1 + csig12) + ssig1) // else // csig1 - csig2 = csig1 * (1 - csig12) + ssig12 * ssig1 // No need to normalize salp12 = _calp0 * _salp0 * (csig12 <= 0 ? _csig1 * (1 - csig12) + ssig12 * _ssig1 : ssig12 * (_csig1 * ssig12 / (1 + csig12) + _ssig1)); calp12 = Math::sq(_salp0) + Math::sq(_calp0) * _csig1 * csig2; } S12 = _c2 * atan2(salp12, calp12) + _aA4 * (B42 - _bB41); } return arcmode ? s12_a12 : sig12 / Math::degree(); } void GeodesicLineExact::SetDistance(real s13) { _s13 = s13; real t; // This will set _a13 to NaN if the GeodesicLineExact doesn't have the // DISTANCE_IN capability. _a13 = GenPosition(false, _s13, 0u, t, t, t, t, t, t, t, t); } void GeodesicLineExact::SetArc(real a13) { _a13 = a13; // In case the GeodesicLineExact doesn't have the DISTANCE capability. _s13 = Math::NaN(); real t; GenPosition(true, _a13, DISTANCE, t, t, t, _s13, t, t, t, t); } void GeodesicLineExact::GenSetDistance(bool arcmode, real s13_a13) { arcmode ? SetArc(s13_a13) : SetDistance(s13_a13); } } // namespace GeographicLib geosphere/src/SphericalEngine.cpp0000644000176200001440000005051314323376012016573 0ustar liggesusers/** * \file SphericalEngine.cpp * \brief Implementation for GeographicLib::SphericalEngine class * * Copyright (c) Charles Karney (2011-2022) and licensed * under the MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ * * The general sum is\verbatim V(r, theta, lambda) = sum(n = 0..N) sum(m = 0..n) q^(n+1) * (C[n,m] * cos(m*lambda) + S[n,m] * sin(m*lambda)) * P[n,m](t) \endverbatim * where t = cos(theta), q = a/r. In addition write u = * sin(theta). * * P[n,m] is a normalized associated Legendre function of degree * n and order m. Here the formulas are given for full * normalized functions (usually denoted Pbar). * * Rewrite outer sum\verbatim V(r, theta, lambda) = sum(m = 0..N) * P[m,m](t) * q^(m+1) * [Sc[m] * cos(m*lambda) + Ss[m] * sin(m*lambda)] \endverbatim * where the inner sums are\verbatim Sc[m] = sum(n = m..N) q^(n-m) * C[n,m] * P[n,m](t)/P[m,m](t) Ss[m] = sum(n = m..N) q^(n-m) * S[n,m] * P[n,m](t)/P[m,m](t) \endverbatim * Evaluate sums via Clenshaw method. The overall framework is similar to * Deakin with the following changes: * - Clenshaw summation is used to roll the computation of * cos(m*lambda) and sin(m*lambda) into the evaluation of * the outer sum (rather than independently computing an array of these * trigonometric terms). * - Scale the coefficients to guard against overflow when N is large. * . * For the general framework of Clenshaw, see * http://mathworld.wolfram.com/ClenshawRecurrenceFormula.html * * Let\verbatim S = sum(k = 0..N) c[k] * F[k](x) F[n+1](x) = alpha[n](x) * F[n](x) + beta[n](x) * F[n-1](x) \endverbatim * Evaluate S with\verbatim y[N+2] = y[N+1] = 0 y[k] = alpha[k] * y[k+1] + beta[k+1] * y[k+2] + c[k] S = c[0] * F[0] + y[1] * F[1] + beta[1] * F[0] * y[2] \endverbatim * \e IF F[0](x) = 1 and beta(0,x) = 0, then F[1](x) = * alpha(0,x) and we can continue the recursion for y[k] until * y[0], giving\verbatim S = y[0] \endverbatim * * Evaluating the inner sum\verbatim l = n-m; n = l+m Sc[m] = sum(l = 0..N-m) C[l+m,m] * q^l * P[l+m,m](t)/P[m,m](t) F[l] = q^l * P[l+m,m](t)/P[m,m](t) \endverbatim * Holmes + Featherstone, Eq. (11), give\verbatim P[n,m] = sqrt((2*n-1)*(2*n+1)/((n-m)*(n+m))) * t * P[n-1,m] - sqrt((2*n+1)*(n+m-1)*(n-m-1)/((n-m)*(n+m)*(2*n-3))) * P[n-2,m] \endverbatim * thus\verbatim alpha[l] = t * q * sqrt(((2*n+1)*(2*n+3))/ ((n-m+1)*(n+m+1))) beta[l+1] = - q^2 * sqrt(((n-m+1)*(n+m+1)*(2*n+5))/ ((n-m+2)*(n+m+2)*(2*n+1))) \endverbatim * In this case, F[0] = 1 and beta[0] = 0, so the Sc[m] * = y[0]. * * Evaluating the outer sum\verbatim V = sum(m = 0..N) Sc[m] * q^(m+1) * cos(m*lambda) * P[m,m](t) + sum(m = 0..N) Ss[m] * q^(m+1) * cos(m*lambda) * P[m,m](t) F[m] = q^(m+1) * cos(m*lambda) * P[m,m](t) [or sin(m*lambda)] \endverbatim * Holmes + Featherstone, Eq. (13), give\verbatim P[m,m] = u * sqrt((2*m+1)/((m>1?2:1)*m)) * P[m-1,m-1] \endverbatim * also, we have\verbatim cos((m+1)*lambda) = 2*cos(lambda)*cos(m*lambda) - cos((m-1)*lambda) \endverbatim * thus\verbatim alpha[m] = 2*cos(lambda) * sqrt((2*m+3)/(2*(m+1))) * u * q = cos(lambda) * sqrt( 2*(2*m+3)/(m+1) ) * u * q beta[m+1] = -sqrt((2*m+3)*(2*m+5)/(4*(m+1)*(m+2))) * u^2 * q^2 * (m == 0 ? sqrt(2) : 1) \endverbatim * Thus\verbatim F[0] = q [or 0] F[1] = cos(lambda) * sqrt(3) * u * q^2 [or sin(lambda)] beta[1] = - sqrt(15/4) * u^2 * q^2 \endverbatim * * Here is how the various components of the gradient are computed * * Differentiate wrt r\verbatim d q^(n+1) / dr = (-1/r) * (n+1) * q^(n+1) \endverbatim * so multiply C[n,m] by n+1 in inner sum and multiply the * sum by -1/r. * * Differentiate wrt lambda\verbatim d cos(m*lambda) = -m * sin(m*lambda) d sin(m*lambda) = m * cos(m*lambda) \endverbatim * so multiply terms by m in outer sum and swap sine and cosine * variables. * * Differentiate wrt theta\verbatim dV/dtheta = V' = -u * dV/dt = -u * V' \endverbatim * here ' denotes differentiation wrt theta.\verbatim d/dtheta (Sc[m] * P[m,m](t)) = Sc'[m] * P[m,m](t) + Sc[m] * P'[m,m](t) \endverbatim * Now P[m,m](t) = const * u^m, so P'[m,m](t) = m * t/u * * P[m,m](t), thus\verbatim d/dtheta (Sc[m] * P[m,m](t)) = (Sc'[m] + m * t/u * Sc[m]) * P[m,m](t) \endverbatim * Clenshaw recursion for Sc[m] reads\verbatim y[k] = alpha[k] * y[k+1] + beta[k+1] * y[k+2] + c[k] \endverbatim * Substituting alpha[k] = const * t, alpha'[k] = -u/t * * alpha[k], beta'[k] = c'[k] = 0 gives\verbatim y'[k] = alpha[k] * y'[k+1] + beta[k+1] * y'[k+2] - u/t * alpha[k] * y[k+1] \endverbatim * * Finally, given the derivatives of V, we can compute the components * of the gradient in spherical coordinates and transform the result into * cartesian coordinates. **********************************************************************/ #include "SphericalEngine.h" #include "CircularEngine.h" #include "Utility.h" #if defined(_MSC_VER) // Squelch warnings about constant conditional expressions and potentially // uninitialized local variables # pragma warning (disable: 4127 4701) #endif namespace GeographicLib { using namespace std; vector& SphericalEngine::sqrttable() { static vector sqrttable(0); return sqrttable; } template Math::real SphericalEngine::Value(const coeff c[], const real f[], real x, real y, real z, real a, real& gradx, real& grady, real& gradz) { static_assert(L > 0, "L must be positive"); static_assert(norm == FULL || norm == SCHMIDT, "Unknown normalization"); int N = c[0].nmx(), M = c[0].mmx(); real p = hypot(x, y), cl = p != 0 ? x / p : 1, // cos(lambda); at pole, pick lambda = 0 sl = p != 0 ? y / p : 0, // sin(lambda) r = hypot(z, p), t = r != 0 ? z / r : 0, // cos(theta); at origin, pick theta = pi/2 u = r != 0 ? fmax(p / r, eps()) : 1, // sin(theta); but avoid the pole q = a / r; real q2 = Math::sq(q), uq = u * q, uq2 = Math::sq(uq), tu = t / u; // Initialize outer sum real vc = 0, vc2 = 0, vs = 0, vs2 = 0; // v [N + 1], v [N + 2] // vr, vt, vl and similar w variable accumulate the sums for the // derivatives wrt r, theta, and lambda, respectively. real vrc = 0, vrc2 = 0, vrs = 0, vrs2 = 0; // vr[N + 1], vr[N + 2] real vtc = 0, vtc2 = 0, vts = 0, vts2 = 0; // vt[N + 1], vt[N + 2] real vlc = 0, vlc2 = 0, vls = 0, vls2 = 0; // vl[N + 1], vl[N + 2] int k[L]; const vector& root( sqrttable() ); for (int m = M; m >= 0; --m) { // m = M .. 0 // Initialize inner sum real wc = 0, wc2 = 0, ws = 0, ws2 = 0, // w [N - m + 1], w [N - m + 2] wrc = 0, wrc2 = 0, wrs = 0, wrs2 = 0, // wr[N - m + 1], wr[N - m + 2] wtc = 0, wtc2 = 0, wts = 0, wts2 = 0; // wt[N - m + 1], wt[N - m + 2] for (int l = 0; l < L; ++l) k[l] = c[l].index(N, m) + 1; for (int n = N; n >= m; --n) { // n = N .. m; l = N - m .. 0 real w, A, Ax, B, R; // alpha[l], beta[l + 1] switch (norm) { case FULL: w = root[2 * n + 1] / (root[n - m + 1] * root[n + m + 1]); Ax = q * w * root[2 * n + 3]; A = t * Ax; B = - q2 * root[2 * n + 5] / (w * root[n - m + 2] * root[n + m + 2]); break; case SCHMIDT: w = root[n - m + 1] * root[n + m + 1]; Ax = q * (2 * n + 1) / w; A = t * Ax; B = - q2 * w / (root[n - m + 2] * root[n + m + 2]); break; default: break; // To suppress warning message from Visual Studio } R = c[0].Cv(--k[0]); for (int l = 1; l < L; ++l) R += c[l].Cv(--k[l], n, m, f[l]); R *= scale(); w = A * wc + B * wc2 + R; wc2 = wc; wc = w; if (gradp) { w = A * wrc + B * wrc2 + (n + 1) * R; wrc2 = wrc; wrc = w; w = A * wtc + B * wtc2 - u*Ax * wc2; wtc2 = wtc; wtc = w; } if (m) { R = c[0].Sv(k[0]); for (int l = 1; l < L; ++l) R += c[l].Sv(k[l], n, m, f[l]); R *= scale(); w = A * ws + B * ws2 + R; ws2 = ws; ws = w; if (gradp) { w = A * wrs + B * wrs2 + (n + 1) * R; wrs2 = wrs; wrs = w; w = A * wts + B * wts2 - u*Ax * ws2; wts2 = wts; wts = w; } } } // Now Sc[m] = wc, Ss[m] = ws // Sc'[m] = wtc, Ss'[m] = wtc if (m) { real v, A, B; // alpha[m], beta[m + 1] switch (norm) { case FULL: v = root[2] * root[2 * m + 3] / root[m + 1]; A = cl * v * uq; B = - v * root[2 * m + 5] / (root[8] * root[m + 2]) * uq2; break; case SCHMIDT: v = root[2] * root[2 * m + 1] / root[m + 1]; A = cl * v * uq; B = - v * root[2 * m + 3] / (root[8] * root[m + 2]) * uq2; break; default: break; // To suppress warning message from Visual Studio } v = A * vc + B * vc2 + wc ; vc2 = vc ; vc = v; v = A * vs + B * vs2 + ws ; vs2 = vs ; vs = v; if (gradp) { // Include the terms Sc[m] * P'[m,m](t) and Ss[m] * P'[m,m](t) wtc += m * tu * wc; wts += m * tu * ws; v = A * vrc + B * vrc2 + wrc; vrc2 = vrc; vrc = v; v = A * vrs + B * vrs2 + wrs; vrs2 = vrs; vrs = v; v = A * vtc + B * vtc2 + wtc; vtc2 = vtc; vtc = v; v = A * vts + B * vts2 + wts; vts2 = vts; vts = v; v = A * vlc + B * vlc2 + m*ws; vlc2 = vlc; vlc = v; v = A * vls + B * vls2 - m*wc; vls2 = vls; vls = v; } } else { real A, B, qs; switch (norm) { case FULL: A = root[3] * uq; // F[1]/(q*cl) or F[1]/(q*sl) B = - root[15]/2 * uq2; // beta[1]/q break; case SCHMIDT: A = uq; B = - root[3]/2 * uq2; break; default: break; // To suppress warning message from Visual Studio } qs = q / scale(); vc = qs * (wc + A * (cl * vc + sl * vs ) + B * vc2); if (gradp) { qs /= r; // The components of the gradient in spherical coordinates are // r: dV/dr // theta: 1/r * dV/dtheta // lambda: 1/(r*u) * dV/dlambda vrc = - qs * (wrc + A * (cl * vrc + sl * vrs) + B * vrc2); vtc = qs * (wtc + A * (cl * vtc + sl * vts) + B * vtc2); vlc = qs / u * ( A * (cl * vlc + sl * vls) + B * vlc2); } } } if (gradp) { // Rotate into cartesian (geocentric) coordinates gradx = cl * (u * vrc + t * vtc) - sl * vlc; grady = sl * (u * vrc + t * vtc) + cl * vlc; gradz = t * vrc - u * vtc ; } return vc; } template CircularEngine SphericalEngine::Circle(const coeff c[], const real f[], real p, real z, real a) { static_assert(L > 0, "L must be positive"); static_assert(norm == FULL || norm == SCHMIDT, "Unknown normalization"); int N = c[0].nmx(), M = c[0].mmx(); real r = hypot(z, p), t = r != 0 ? z / r : 0, // cos(theta); at origin, pick theta = pi/2 u = r != 0 ? fmax(p / r, eps()) : 1, // sin(theta); but avoid the pole q = a / r; real q2 = Math::sq(q), tu = t / u; CircularEngine circ(M, gradp, norm, a, r, u, t); int k[L]; const vector& root( sqrttable() ); for (int m = M; m >= 0; --m) { // m = M .. 0 // Initialize inner sum real wc = 0, wc2 = 0, ws = 0, ws2 = 0, // w [N - m + 1], w [N - m + 2] wrc = 0, wrc2 = 0, wrs = 0, wrs2 = 0, // wr[N - m + 1], wr[N - m + 2] wtc = 0, wtc2 = 0, wts = 0, wts2 = 0; // wt[N - m + 1], wt[N - m + 2] for (int l = 0; l < L; ++l) k[l] = c[l].index(N, m) + 1; for (int n = N; n >= m; --n) { // n = N .. m; l = N - m .. 0 real w, A, Ax, B, R; // alpha[l], beta[l + 1] switch (norm) { case FULL: w = root[2 * n + 1] / (root[n - m + 1] * root[n + m + 1]); Ax = q * w * root[2 * n + 3]; A = t * Ax; B = - q2 * root[2 * n + 5] / (w * root[n - m + 2] * root[n + m + 2]); break; case SCHMIDT: w = root[n - m + 1] * root[n + m + 1]; Ax = q * (2 * n + 1) / w; A = t * Ax; B = - q2 * w / (root[n - m + 2] * root[n + m + 2]); break; default: break; // To suppress warning message from Visual Studio } R = c[0].Cv(--k[0]); for (int l = 1; l < L; ++l) R += c[l].Cv(--k[l], n, m, f[l]); R *= scale(); w = A * wc + B * wc2 + R; wc2 = wc; wc = w; if (gradp) { w = A * wrc + B * wrc2 + (n + 1) * R; wrc2 = wrc; wrc = w; w = A * wtc + B * wtc2 - u*Ax * wc2; wtc2 = wtc; wtc = w; } if (m) { R = c[0].Sv(k[0]); for (int l = 1; l < L; ++l) R += c[l].Sv(k[l], n, m, f[l]); R *= scale(); w = A * ws + B * ws2 + R; ws2 = ws; ws = w; if (gradp) { w = A * wrs + B * wrs2 + (n + 1) * R; wrs2 = wrs; wrs = w; w = A * wts + B * wts2 - u*Ax * ws2; wts2 = wts; wts = w; } } } if (!gradp) circ.SetCoeff(m, wc, ws); else { // Include the terms Sc[m] * P'[m,m](t) and Ss[m] * P'[m,m](t) wtc += m * tu * wc; wts += m * tu * ws; circ.SetCoeff(m, wc, ws, wrc, wrs, wtc, wts); } } return circ; } void SphericalEngine::RootTable(int N) { // Need square roots up to max(2 * N + 5, 15). vector& root( sqrttable() ); int L = max(2 * N + 5, 15) + 1, oldL = int(root.size()); if (oldL >= L) return; root.resize(L); for (int l = oldL; l < L; ++l) root[l] = sqrt(real(l)); } void SphericalEngine::coeff::readcoeffs(istream& stream, int& N, int& M, vector& C, vector& S, bool truncate) { if (truncate) { if (!((N >= M && M >= 0) || (N == -1 && M == -1))) // The last condition is that M = -1 implies N = -1. throw GeographicErr("Bad requested degree and order " + Utility::str(N) + " " + Utility::str(M)); } int nm[2]; Utility::readarray(stream, nm, 2); int N0 = nm[0], M0 = nm[1]; if (!((N0 >= M0 && M0 >= 0) || (N0 == -1 && M0 == -1))) // The last condition is that M0 = -1 implies N0 = -1. throw GeographicErr("Bad degree and order " + Utility::str(N0) + " " + Utility::str(M0)); N = truncate ? min(N, N0) : N0; M = truncate ? min(M, M0) : M0; C.resize(SphericalEngine::coeff::Csize(N, M)); S.resize(SphericalEngine::coeff::Ssize(N, M)); int skip = (SphericalEngine::coeff::Csize(N0, M0) - SphericalEngine::coeff::Csize(N0, M )) * sizeof(double); if (N == N0) { Utility::readarray(stream, C); if (skip) stream.seekg(streamoff(skip), ios::cur); Utility::readarray(stream, S); if (skip) stream.seekg(streamoff(skip), ios::cur); } else { for (int m = 0, k = 0; m <= M; ++m) { Utility::readarray(stream, &C[k], N + 1 - m); stream.seekg((N0 - N) * sizeof(double), ios::cur); k += N + 1 - m; } if (skip) stream.seekg(streamoff(skip), ios::cur); for (int m = 1, k = 0; m <= M; ++m) { Utility::readarray(stream, &S[k], N + 1 - m); stream.seekg((N0 - N) * sizeof(double), ios::cur); k += N + 1 - m; } if (skip) stream.seekg(streamoff(skip), ios::cur); } return; } /// \cond SKIP template Math::real GEOGRAPHICLIB_EXPORT SphericalEngine::Value (const coeff[], const real[], real, real, real, real, real&, real&, real&); template Math::real GEOGRAPHICLIB_EXPORT SphericalEngine::Value (const coeff[], const real[], real, real, real, real, real&, real&, real&); template Math::real GEOGRAPHICLIB_EXPORT SphericalEngine::Value (const coeff[], const real[], real, real, real, real, real&, real&, real&); template Math::real GEOGRAPHICLIB_EXPORT SphericalEngine::Value (const coeff[], const real[], real, real, real, real, real&, real&, real&); template Math::real GEOGRAPHICLIB_EXPORT SphericalEngine::Value (const coeff[], const real[], real, real, real, real, real&, real&, real&); template Math::real GEOGRAPHICLIB_EXPORT SphericalEngine::Value (const coeff[], const real[], real, real, real, real, real&, real&, real&); template Math::real GEOGRAPHICLIB_EXPORT SphericalEngine::Value (const coeff[], const real[], real, real, real, real, real&, real&, real&); template Math::real GEOGRAPHICLIB_EXPORT SphericalEngine::Value (const coeff[], const real[], real, real, real, real, real&, real&, real&); template Math::real GEOGRAPHICLIB_EXPORT SphericalEngine::Value (const coeff[], const real[], real, real, real, real, real&, real&, real&); template Math::real GEOGRAPHICLIB_EXPORT SphericalEngine::Value (const coeff[], const real[], real, real, real, real, real&, real&, real&); template Math::real GEOGRAPHICLIB_EXPORT SphericalEngine::Value (const coeff[], const real[], real, real, real, real, real&, real&, real&); template Math::real GEOGRAPHICLIB_EXPORT SphericalEngine::Value (const coeff[], const real[], real, real, real, real, real&, real&, real&); template CircularEngine GEOGRAPHICLIB_EXPORT SphericalEngine::Circle (const coeff[], const real[], real, real, real); template CircularEngine GEOGRAPHICLIB_EXPORT SphericalEngine::Circle (const coeff[], const real[], real, real, real); template CircularEngine GEOGRAPHICLIB_EXPORT SphericalEngine::Circle (const coeff[], const real[], real, real, real); template CircularEngine GEOGRAPHICLIB_EXPORT SphericalEngine::Circle (const coeff[], const real[], real, real, real); template CircularEngine GEOGRAPHICLIB_EXPORT SphericalEngine::Circle (const coeff[], const real[], real, real, real); template CircularEngine GEOGRAPHICLIB_EXPORT SphericalEngine::Circle (const coeff[], const real[], real, real, real); template CircularEngine GEOGRAPHICLIB_EXPORT SphericalEngine::Circle (const coeff[], const real[], real, real, real); template CircularEngine GEOGRAPHICLIB_EXPORT SphericalEngine::Circle (const coeff[], const real[], real, real, real); template CircularEngine GEOGRAPHICLIB_EXPORT SphericalEngine::Circle (const coeff[], const real[], real, real, real); template CircularEngine GEOGRAPHICLIB_EXPORT SphericalEngine::Circle (const coeff[], const real[], real, real, real); template CircularEngine GEOGRAPHICLIB_EXPORT SphericalEngine::Circle (const coeff[], const real[], real, real, real); template CircularEngine GEOGRAPHICLIB_EXPORT SphericalEngine::Circle (const coeff[], const real[], real, real, real); /// \endcond } // namespace GeographicLib geosphere/ChangeLog0000644000176200001440000000607014677364024014025 0ustar liggesusers-- to do inconsistency reported by Ryan Case: bearing is expressed as -180 to 180 whereas bearingRhum is from 0 to 360 -- 13 October 2021, version 1.5.14 dist* functions threw an error when using a two row matrix for p1, and missing p2. Fixed by setting "drop=FALSE". Bug report and fix by Miles Wood. -- 2 November 2018, version 1.5.7 distHaversine bugged in some cases for antipodes: https://stackoverflow.com/questions/45889616/why-does-disthaversine-return-nan-for-some-pairs-of-coordinates# dist2gc always returned a positive value (the manual said it should be negative if it was at the left of the circle); in contrast with what the manual stated. Getting the sign is now an option. Reported by Charles Mohan, Hughan Ross and David Cooley dist2gc used the bearing for an ellipsoid, not for a spheroid. Reported by Greg Whittier -- 15 June 2016, version 1.5-5 Fixed error in gcMaxLat (reported by William Smith) Bug fix in antipodal (reported by Gareth Davies) Bug fix in gcIntermediate when crossing the date line -- 7 July 2015, version 1.4-3 Included C-version of GeographicLib by C.F.F. Karney. areaPolygon and perimeter are now using that to compute these on a (WGS84) ellipsoid. New function distGeo (distance on an ellipsoid) also uses this. -- 17 January 2014, version 1.3-8 Fixed bug in destPointRhumb. Reported by Bart Kranstauber Fixed bug in bearingRhumb when using multiple points (incorrect results were returned). Reported by Bart Kranstauber Added 'ID' output to dist2Line distVincentyEllipsoid returned a distance of 0 between NA and NA; now it returns NA as intended (reported by Sebastian Luque) Fixed minor bug in distMeeus (using 'isTRUE' where 'which' is appropriate) (reported by Tyler Smith) -- 4 March 2012, version 1.2-27 Bug fix in antipodal; reported by Bart Kranstauber Fixed bug in distMeeus. It returned NaN when the distance between two points was 0. Reportedby Daniel Reidpath New function geomean to compute the mean of a set of coordinates (optionally with weights) -- 28 August 2011, version 1.2-25 Correction to gcIntermediate. Points were not exactly equidistant. Error spotted by Jason Davies. -- 18 May 2011, version 1.2-21 Normalizing longitude to -180..180 in midPoint. Suggested by Aaron Hardin -- 13 Jan 2011, version 1.2-18 New argument sepNA in gcIntermediate, suggested by Lee Butterman -- 1 Jan 2011, version 1.2-17 Merged functions distm and distm2 into distm Function with new distance algorithm "distMeeus" -- 4 Nov 2010 Additional options to gcIntermediate and greatCircle to return SpatialLines (that are cut in two when crossing the date line) -- 8 Sept 2010 bug fix in .pointsToMatrix (reported by Joe) -- 26 August 2010 New functions: dist2Line computes the (spherical) distance between points and polylines (and polygons borders). makeLine (like makePoly), adds intermediate great circle points to line segments, for better plotting onGreatCircle tests if points are on a specified great circle -- 25 August 2010 distVincentyEllipsoid now handles NA values. Bug fix suggested by George Wang. geosphere/NAMESPACE0000644000176200001440000000014314472423062013454 0ustar liggesusersuseDynLib(geosphere, .registration = TRUE) import(Rcpp) import(sp) exportPattern("^[^\\.\\_]") geosphere/inst/0000755000176200001440000000000014677403144013222 5ustar liggesusersgeosphere/inst/doc/0000755000176200001440000000000014677403144013767 5ustar liggesusersgeosphere/inst/doc/geosphere.R0000644000176200001440000002031314677403144016072 0ustar liggesusers### R code from vignette source 'geosphere.Rnw' ################################################### ### code chunk number 1: foo ################################################### options(keep.source = TRUE, width = 60) foo <- packageDescription("geosphere") ################################################### ### code chunk number 2: geosphere.Rnw:58-71 ################################################### library(geosphere) Lon <- c(1:9/1000, 1:9/100, 1:9/10, 1:90*2) Lat <- c(1:9/1000, 1:9/100, 1:9/10, 1:90) dcos <- distCosine(c(0,0), cbind(Lon, Lat)) dhav <- distHaversine(c(0,0), cbind(Lon, Lat)) dvsp <- distVincentySphere(c(0,0), cbind(Lon, Lat)) par(mfrow=(c(1,2))) plot(log(dcos), dcos-dhav, col='red', ylim=c(-1e-05, 1e-05), xlab="Log 'Law of Cosines' distance (m)", ylab="Law of Cosines minus Haversine distance") plot(log(dhav), dhav-dvsp, col='blue', xlab="Log 'Haversine' distance (m)", ylab="Vincenty Sphere minus Haversine distance") ################################################### ### code chunk number 3: geosphere.Rnw:76-79 ################################################### dvse <- distVincentyEllipsoid(c(0,0), cbind(Lon, Lat)) plot(dvsp/1000, (dvsp-dvse)/1000, col='blue', xlab='Vincenty Sphere Distance (km)', ylab="Difference between 'Vincenty Sphere' and 'Vincenty Ellipsoid' methods (km)") ################################################### ### code chunk number 4: geosphere.Rnw:89-102 ################################################### LA <- c(-118.40, 33.95) NY <- c(-73.78, 40.63) data(wrld) plot(wrld, type='l') gc <- greatCircle(LA, NY) lines(gc, lwd=2, col='blue') gci <- gcIntermediate(LA, NY) lines(gci, lwd=4, col='green') points(rbind(LA, NY), col='red', pch=20, cex=2) mp <- midPoint(LA, NY) onGreatCircle(LA,NY, rbind(mp,c(0,0))) points(mp, pch='*', cex=3, col='orange') greatCircleBearing(LA, brng=270, n=10) ################################################### ### code chunk number 5: geosphere.Rnw:109-117 ################################################### destPoint(LA, b=65, d=100000) circle=destPoint(c(0,80), b=1:365, d=1000000) circle2=destPoint(c(0,80), b=1:365, d=500000) circle3=destPoint(c(0,80), b=1:365, d=100000) plot(circle, type='l') polygon(circle, col='blue', border='black', lwd=4) polygon(circle2, col='red', lwd=4, border='orange') polygon(circle3, col='white', lwd=4, border='black') ################################################### ### code chunk number 6: geosphere.Rnw:125-139 ################################################### ml <- gcMaxLat(LA, NY) lat0 <- gcLat(LA, NY, lon=0) lon0 <- gcLon(LA, NY, lat=0) plot(wrld, type='l') lines(gc, lwd=2, col='blue') points(ml, col='red', pch=20, cex=2) points(cbind(0, lat0), pch=20, cex=2, col='yellow') points(t(rbind(lon0, 0)), pch=20, cex=2, col='green' ) f <- function(lon){gcLat(LA, NY, lon)} opt <- optimize(f, interval=c(-180, 180), maximum=TRUE) points(opt$maximum, opt$objective, pch=20, cex=2, col='dark green' ) anti <- antipode(c(opt$maximum, opt$objective)) points(anti, pch=20, cex=2, col='dark blue' ) ################################################### ### code chunk number 7: geosphere.Rnw:146-161 ################################################### SF <- c(-122.44, 37.74) AM <- c(4.75, 52.31) gc2 <- greatCircle(AM, SF) plot(wrld, type='l') lines(gc, lwd=2, col='blue') lines(gc2, lwd=2, col='green') int <- gcIntersect(LA, NY, SF, AM) int antipodal(int[,1:2], int[,3:4]) points(rbind(int[,1:2], int[,3:4]), col='red', pch=20, cex=2) bearing1 <- bearing(LA, NY) bearing2 <- bearing(SF, AM) bearing1 bearing2 gcIntersectBearing(LA, bearing1, SF, bearing2) ################################################### ### code chunk number 8: geosphere.Rnw:169-189 ################################################### MS <- c(-93.26, 44.98) gc1 <- greatCircleBearing(NY, 281) gc2 <- greatCircleBearing(MS, 195) gc3 <- greatCircleBearing(LA, 55) plot(wrld, type='l', xlim=c(-125, -70), ylim=c(20, 60)) lines(gc1, col='green') lines(gc2, col='blue') lines(gc3, col='red') int <- gcIntersectBearing(rbind(NY, NY, MS), c(281, 281, 195), rbind(MS, LA, LA), c(195, 55, 55)) int distm(rbind(int[,1:2], int[,3:4])) int <- int[,1:2] points(int) poly <- rbind(int, int[1,]) centr <- centroid(poly) poly2 <- makePoly(int) polygon(poly2, col='yellow') points(centr, pch='*', col='dark red', cex=2) ################################################### ### code chunk number 9: geo5 ################################################### d <- distCosine(LA, NY) d b <- bearing(LA, NY) b destPoint(LA, b, d) NY finalBearing(LA, NY) ################################################### ### code chunk number 10: geosphere.Rnw:213-224 ################################################### atd <- alongTrackDistance(LA, NY, MS) p <- destPoint(LA, b, atd) plot(wrld, type='l', xlim=c(-130,-60), ylim=c(22,52)) lines(gci, col='blue', lwd=2) points(rbind(LA, NY), col='red', pch=20, cex=2) points(MS[1], MS[2], pch=20, col='blue', cex=2) lines(gcIntermediate(LA, p), col='green', lwd=3) lines(gcIntermediate(MS, p), col='dark green', lwd=3) points(p, pch=20, col='red', cex=2) dist2gc(LA, NY, MS) distCosine(p, MS) ################################################### ### code chunk number 11: geosphere.Rnw:232-241 ################################################### line <- rbind(c(-180,-20), c(-150,-10), c(-140,55), c(10, 0), c(-140,-60)) pnts <- rbind(c(-170,0), c(-75,0), c(-70,-10), c(-80,20), c(-100,-50), c(-100,-60), c(-100,-40), c(-100,-20), c(-100,-10), c(-100,0)) d = dist2Line(pnts, line) plot( makeLine(line), type='l') points(line) points(pnts, col='blue', pch=20) points(d[,2], d[,3], col='red', pch='x', cex=2) for (i in 1:nrow(d)) lines(gcIntermediate(pnts[i,], d[i,2:3], 10), lwd=2, col='green') ################################################### ### code chunk number 12: geosphere.Rnw:249-269 ################################################### NP <- c(0, 85) bearing(SF, NP) b <- bearingRhumb(SF, NP) b dc <- distCosine(SF, NP) dr <- distRhumb(SF, NP) dc / dr pr <- destPointRhumb(SF, b, d=round(dr/100) * 1:100) pc <- rbind(SF, gcIntermediate(SF, NP), NP) par(mfrow=c(1,2)) data(wrld) plot(wrld, type='l', xlim=c(-140,10), ylim=c(15,90), main='Equirectangular') lines(pr, col='blue') lines(pc, col='red') data(merc) plot(merc, type='l', xlim=c(-15584729, 1113195), ylim=c(2500000, 22500000), main='Mercator') lines(mercator(pr), col='blue') lines(mercator(pc), col='red') ################################################### ### code chunk number 13: geosphere.Rnw:277-291 ################################################### pol <- rbind(c(-120,-20), c(-80,5), c(0, -20), c(-40,-60), c(-120,-20)) areaPolygon(pol) perimeter(pol) centroid(pol) span(pol, fun=max) nicepoly = makePoly(pol) plot(pol, xlab='longitude', ylab='latitude', cex=2, lwd=3, xlim=c(-140, 0)) lines(wrld, col='grey') lines(pol, col='red', lwd=2) lines(nicepoly, col='blue', lwd=2) points(centroid(pol), pch='*', cex=3, col='dark green') text(centroid(pol)-c(0,2.5), 'centroid') legend(-140, -48, c('planar','spherical'), lty=1, lwd=2, col=c('red', 'blue'), title='polygon type') ################################################### ### code chunk number 14: geosphere.Rnw:299-304 ################################################### plot(wrld, type='l', col='grey') a = randomCoordinates(500) points(a, col='blue', pch=20, cex=0.5) b = regularCoordinates(3) points(b, col='red', pch='x') ################################################### ### code chunk number 15: geosphere.Rnw:313-321 ################################################### as.Date(80, origin='2009-12-31') as.Date(172, origin='2009-12-31') plot(0:90, daylength(lat=0:90, doy=1), ylim=c(0,24), type='l', xlab='Latitude', ylab='Daylength', main='Daylength by latitude and day of year', lwd=2) lines(0:90, daylength(lat=0:90, doy=80), col='green', lwd=2) lines(0:90, daylength(lat=0:90, doy=172), col='blue', lwd=2) legend(0,24, c('1','80','172'), lty=1, lwd=2, col=c('black', 'green', 'blue'), title='Day of year') geosphere/inst/doc/geosphere.Rnw0000644000176200001440000004033113472155746016445 0ustar liggesusers\documentclass{article} \usepackage{natbib} \usepackage{graphics} \usepackage{amsmath} \usepackage{indentfirst} \usepackage[utf8]{inputenc} \usepackage{hyperref} \usepackage{hanging} %\VignetteIndexEntry{Introduction to the geosphere package} \SweaveOpts{keep.source=TRUE} \SweaveOpts{png=TRUE, pdf=FALSE} \SweaveOpts{resolution=100} \begin{document} <>= options(keep.source = TRUE, width = 60) foo <- packageDescription("geosphere") @ \title{Introduction to the "geosphere" package \\ (Version \Sexpr{foo$Version})} \author{Robert J. Hijmans} \maketitle \section{Introduction} This vignette describes the R package '\verb@geosphere@'. The package implements spherical trigonometry functions for geographic applications. Many of the functions have applications in navigation, but others are more general, or have no relation to navigation at all. There is a number of functions to compute distance and direction (= bearing, azimuth, course) along great circles (= shortest distance on a sphere, or "as the crow flies") and along rhumb lines (lines of constant bearing). There are also functions that compute distances on a spheroid. Other functions include the computation of the location of an object at a given direction and distance; and the area, perimeter, and centroid of a spherical polygon. Geographic locations must be specified in longitude and latitude (and in that order!) in degrees (i.e., NOT in radians). Degrees are (obviously) in decimal notation. Thus 12 degrees, 10 minutes, 30 seconds = 12 + 10/60 + 30/3600 = 12.175 degrees. The southern and western hemispheres have a negative sign. The default unit of distance is meter; but this can be adjusted by supplying a different radius 'r' to functions. Directions are expressed in degrees (N = 0 and 360, E = 90, S = 180, and W = 270 degrees). If arguments of functions that take several arguments (e.g. points, bearings, radius of the earth), do not have the same length (for vectors) or number of rows (for matrices) the shorter arguments are re-cycled. Many functions in this package are based on formulae provided by Ed Williams (\url{http://www.edwilliams.org/ftp/avsig/avform.txt}, and partly on javascript implementations of these formulae by Chris Veness (\url{http://www.movable-type.co.uk/scripts/latlong.html} ) Most geodesic computations (for a spheroid rather than a sphere) use the GeographicLib by C.F.F. Karney (\url{http://geographiclib.sourceforge.net/}. \section{Great circle distance} There are four different functions to compute distance between two points. These are, in order of increasing complexity of the algorithm, the 'Spherical law of cosines', 'Haversine' (Sinnott, 1984), 'Vincenty Sphere' and 'Vincenty Ellipsoid' (Vincenty, 1975) methods. The first three assume the earth to be a sphere, while the 'Vincenty Ellipsoid' assumes it is an ellipsoid (which is closer to the truth). The results from the first three functions are identical for practical purposes. The Haversine ('half-versed-sine') formula was published by R.W. Sinnott in 1984, although it has been known for much longer. At that time computational precision was lower than today (15 digits precision). With current precision, the spherical law of cosines formula appears to give equally good results down to very small distances. If you want greater accuracy, you could use the distVincentyEllipsoid method. Below the differences between the three spherical methods are illustrated. At very short distances, there are small differences between the 'law of the Cosine' and the other two methods. There are even smaller differences between the 'Haversine' and 'Vincenty Sphere' methods at larger distances. <>= library(geosphere) Lon <- c(1:9/1000, 1:9/100, 1:9/10, 1:90*2) Lat <- c(1:9/1000, 1:9/100, 1:9/10, 1:90) dcos <- distCosine(c(0,0), cbind(Lon, Lat)) dhav <- distHaversine(c(0,0), cbind(Lon, Lat)) dvsp <- distVincentySphere(c(0,0), cbind(Lon, Lat)) par(mfrow=(c(1,2))) plot(log(dcos), dcos-dhav, col='red', ylim=c(-1e-05, 1e-05), xlab="Log 'Law of Cosines' distance (m)", ylab="Law of Cosines minus Haversine distance") plot(log(dhav), dhav-dvsp, col='blue', xlab="Log 'Haversine' distance (m)", ylab="Vincenty Sphere minus Haversine distance") @ The difference with the 'Vincenty Ellipsoid' method is more pronounced. In the example below (using the default WGS83 ellipsoid), the difference is about 0.3% at very small distances, and 0.15% at larger distances. <>= dvse <- distVincentyEllipsoid(c(0,0), cbind(Lon, Lat)) plot(dvsp/1000, (dvsp-dvse)/1000, col='blue', xlab='Vincenty Sphere Distance (km)', ylab="Difference between 'Vincenty Sphere' and 'Vincenty Ellipsoid' methods (km)") @ For the most precise distance computation use the 'distGeo' function. \section{Points on great circles} Points on a great circle are returned by the function 'greatCircle', using two points on the great circle to define it, and an additional argument to indicate how many points should be returned. You can also use greatCircleBearing, and provide starting points and bearing as arguments. gcIntermediate only returns points on the great circle that are on the track of shortest distance between the two points defining the great circle; and midPoint computes the point half-way between the two points. You can use onGreatCircle to test whether a point is on a great circle between two other points. <>= LA <- c(-118.40, 33.95) NY <- c(-73.78, 40.63) data(wrld) plot(wrld, type='l') gc <- greatCircle(LA, NY) lines(gc, lwd=2, col='blue') gci <- gcIntermediate(LA, NY) lines(gci, lwd=4, col='green') points(rbind(LA, NY), col='red', pch=20, cex=2) mp <- midPoint(LA, NY) onGreatCircle(LA,NY, rbind(mp,c(0,0))) points(mp, pch='*', cex=3, col='orange') greatCircleBearing(LA, brng=270, n=10) @ \section{Point at distance and bearing} Function destPoint returns the location of point given a point of origin, and a distance and bearing. Its perhaps obvious use in georeferencing locations of distant sitings. It can also be used to make circular polygons (with a fixed radius, but in longitude/latitude coordinates) <>= destPoint(LA, b=65, d=100000) circle=destPoint(c(0,80), b=1:365, d=1000000) circle2=destPoint(c(0,80), b=1:365, d=500000) circle3=destPoint(c(0,80), b=1:365, d=100000) plot(circle, type='l') polygon(circle, col='blue', border='black', lwd=4) polygon(circle2, col='red', lwd=4, border='orange') polygon(circle3, col='white', lwd=4, border='black') @ \section{Maximum latitude on a great circle} You can use the functions illustrated below to find out what the maximum latitude is that a great circle will reach; at what latitude it crosses a specified longitude; or at what longitude it crosses a specified latitude. From the map below it appears that Clairaut's formula, used in gcMaxLat is not very accurate. Through optimization with function greatCircle, a more accurate value was found. The southern-most point is the antipode (a point at the opposite end of the world) of the northern-most point. <>= ml <- gcMaxLat(LA, NY) lat0 <- gcLat(LA, NY, lon=0) lon0 <- gcLon(LA, NY, lat=0) plot(wrld, type='l') lines(gc, lwd=2, col='blue') points(ml, col='red', pch=20, cex=2) points(cbind(0, lat0), pch=20, cex=2, col='yellow') points(t(rbind(lon0, 0)), pch=20, cex=2, col='green' ) f <- function(lon){gcLat(LA, NY, lon)} opt <- optimize(f, interval=c(-180, 180), maximum=TRUE) points(opt$maximum, opt$objective, pch=20, cex=2, col='dark green' ) anti <- antipode(c(opt$maximum, opt$objective)) points(anti, pch=20, cex=2, col='dark blue' ) @ \section{Great circle intersections} Points of intersection of two great circles can be computed in two ways. We use a second great circle that connects San Francisco with Amsterdam. We first compute where they cross by defining the great circles using two points on it (gcIntersect). After that, we compute the same points using a start point and initial bearing (gcIntersectBearing). The two points where the great circles cross are antipodes. Antipodes are connected with an infinite number of great circles. <>= SF <- c(-122.44, 37.74) AM <- c(4.75, 52.31) gc2 <- greatCircle(AM, SF) plot(wrld, type='l') lines(gc, lwd=2, col='blue') lines(gc2, lwd=2, col='green') int <- gcIntersect(LA, NY, SF, AM) int antipodal(int[,1:2], int[,3:4]) points(rbind(int[,1:2], int[,3:4]), col='red', pch=20, cex=2) bearing1 <- bearing(LA, NY) bearing2 <- bearing(SF, AM) bearing1 bearing2 gcIntersectBearing(LA, bearing1, SF, bearing2) @ \section{Triangulation} Below is triangulation example. We have three locations (NY, LA, MS) and three directions (281, 60, 195) towards a target. Because we are on a sphere, there are two (antipodal) results. We only show one here (by only using int[,1:2]). We compute the centroid from the polygon defined with the three points. To accurately draw a spherical polygon, we can use makePoly. This function inserts intermediate points along the paths between the vertices provided (default is one point every 10 km). <>= MS <- c(-93.26, 44.98) gc1 <- greatCircleBearing(NY, 281) gc2 <- greatCircleBearing(MS, 195) gc3 <- greatCircleBearing(LA, 55) plot(wrld, type='l', xlim=c(-125, -70), ylim=c(20, 60)) lines(gc1, col='green') lines(gc2, col='blue') lines(gc3, col='red') int <- gcIntersectBearing(rbind(NY, NY, MS), c(281, 281, 195), rbind(MS, LA, LA), c(195, 55, 55)) int distm(rbind(int[,1:2], int[,3:4])) int <- int[,1:2] points(int) poly <- rbind(int, int[1,]) centr <- centroid(poly) poly2 <- makePoly(int) polygon(poly2, col='yellow') points(centr, pch='*', col='dark red', cex=2) @ \section{Bearing} Below we first compute the distance and bearing from Los Angeles (LA) to New York (NY). These are then used to compute the point from LA at that distance in that (initial) bearing (direction). Bearing changes continuously when traveling along a Great Circle. The final bearing, when approaching NY, is also given. <>= d <- distCosine(LA, NY) d b <- bearing(LA, NY) b destPoint(LA, b, d) NY finalBearing(LA, NY) @ \section{Getting off-track} What if we went off-course and were flying over Minneapolis (MS)? The closest point on the planned route (p) can be computed with the alongTrackDistance and destPoint functions. The distance from 'p' to MS can be computed with the dist2gc (distance to great circle, or cross-track distance) function. The light green line represents the along-track distance, and the dark green line represents the cross-track distance. <>= atd <- alongTrackDistance(LA, NY, MS) p <- destPoint(LA, b, atd) plot(wrld, type='l', xlim=c(-130,-60), ylim=c(22,52)) lines(gci, col='blue', lwd=2) points(rbind(LA, NY), col='red', pch=20, cex=2) points(MS[1], MS[2], pch=20, col='blue', cex=2) lines(gcIntermediate(LA, p), col='green', lwd=3) lines(gcIntermediate(MS, p), col='dark green', lwd=3) points(p, pch=20, col='red', cex=2) dist2gc(LA, NY, MS) distCosine(p, MS) @ \section{Distance to a polyline} The two function describe above are used in the dist2Line function that computes the shortest distance between a set of points and a set of spherical poly-lines (or polygons). <>= line <- rbind(c(-180,-20), c(-150,-10), c(-140,55), c(10, 0), c(-140,-60)) pnts <- rbind(c(-170,0), c(-75,0), c(-70,-10), c(-80,20), c(-100,-50), c(-100,-60), c(-100,-40), c(-100,-20), c(-100,-10), c(-100,0)) d = dist2Line(pnts, line) plot( makeLine(line), type='l') points(line) points(pnts, col='blue', pch=20) points(d[,2], d[,3], col='red', pch='x', cex=2) for (i in 1:nrow(d)) lines(gcIntermediate(pnts[i,], d[i,2:3], 10), lwd=2, col='green') @ \section{Rhumb lines} Rhumb (from the Spanish word for course, 'rumbo') lines are straight lines on a Mercator projection map (and at most latitudes pretty straight on an equirectangular projection (=unprojected lon/lat) map). They were used in navigation because it is easier to follow a constant compass bearing than to continually adjust direction as is needed to follow a great circle, even though rhumb lines are normally longer than great-circle (orthodrome) routes. Most rhumb lines will gradually spiral towards one of the poles. <>= NP <- c(0, 85) bearing(SF, NP) b <- bearingRhumb(SF, NP) b dc <- distCosine(SF, NP) dr <- distRhumb(SF, NP) dc / dr pr <- destPointRhumb(SF, b, d=round(dr/100) * 1:100) pc <- rbind(SF, gcIntermediate(SF, NP), NP) par(mfrow=c(1,2)) data(wrld) plot(wrld, type='l', xlim=c(-140,10), ylim=c(15,90), main='Equirectangular') lines(pr, col='blue') lines(pc, col='red') data(merc) plot(merc, type='l', xlim=c(-15584729, 1113195), ylim=c(2500000, 22500000), main='Mercator') lines(mercator(pr), col='blue') lines(mercator(pc), col='red') @ \section{Characterizing polygons} The package has functions to compute the area, perimeter, centroid, and 'span' of a spherical polygon. One approach to compute these measures is to project the polygons first. Here we directly compute them based on spherical coordinates (longitude / latitude), except for centroid, which is computed by projecting the data to the Mercator projection (and inversely projecting the result). The function makePoly inserts additional vertices into a spherical polygon such that it can be plotted (perhaps after first projecting it) more correctly in a plane. Vertices are inserted, where necessary, at a specified distance. The function is only beneficial for polygons with large inter-vertex distances (in terms of longitude), particularly at high latitudes. <>= pol <- rbind(c(-120,-20), c(-80,5), c(0, -20), c(-40,-60), c(-120,-20)) areaPolygon(pol) perimeter(pol) centroid(pol) span(pol, fun=max) nicepoly = makePoly(pol) plot(pol, xlab='longitude', ylab='latitude', cex=2, lwd=3, xlim=c(-140, 0)) lines(wrld, col='grey') lines(pol, col='red', lwd=2) lines(nicepoly, col='blue', lwd=2) points(centroid(pol), pch='*', cex=3, col='dark green') text(centroid(pol)-c(0,2.5), 'centroid') legend(-140, -48, c('planar','spherical'), lty=1, lwd=2, col=c('red', 'blue'), title='polygon type') @ \section{Sampling} Random or regular sampling of longitude/latitude values on the globe needs to consider that the globe is spherical. That is, if you would take random points for latitude between -90 and 90 and for longitude between -180 and 180, the density of points would be higher near the poles than near the equator. In contrast, functions 'randomCoordinates' and 'randomCoordinates' return samples that are spatially balanced. <>= plot(wrld, type='l', col='grey') a = randomCoordinates(500) points(a, col='blue', pch=20, cex=0.5) b = regularCoordinates(3) points(b, col='red', pch='x') @ \section{Daylength} You can compute daylenght according to the formula by Forsythe et al. (1995). For any day of the year (an integer between 1 and 365; or a 'Date' object. <>= as.Date(80, origin='2009-12-31') as.Date(172, origin='2009-12-31') plot(0:90, daylength(lat=0:90, doy=1), ylim=c(0,24), type='l', xlab='Latitude', ylab='Daylength', main='Daylength by latitude and day of year', lwd=2) lines(0:90, daylength(lat=0:90, doy=80), col='green', lwd=2) lines(0:90, daylength(lat=0:90, doy=172), col='blue', lwd=2) legend(0,24, c('1','80','172'), lty=1, lwd=2, col=c('black', 'green', 'blue'), title='Day of year') @ \section{References} \begin{hangparas}{3em}{1} \noindent Forsythe, W.C., E.J. Rykiel Jr., R.S. Stahl, H. Wu and R.M. Schoolfield, 1995. A model comparison for daylength as a function of latitude and day of the year. Ecological Modeling 80:87-95. \noindent Sinnott, R.W, 1984. Virtues of the Haversine. Sky and Telescope 68(2): 159 \noindent Vincenty, T. 1975. Direct and inverse solutions of geodesics on the ellipsoid with application of nested equations. Survey Review 23(176): 88-93. Available here: \url{http://www.ngs.noaa.gov/PUBS_LIB/inverse.pdf} \end{hangparas} \end{document} geosphere/inst/doc/geosphere.pdf0000644000176200001440000067657414677706706016506 0ustar liggesusers%PDF-1.5 %¿÷¢þ 1 0 obj << /Type /ObjStm /Length 4418 /Filter /FlateDecode /N 84 /First 673 >> stream xœÝ\moG’þ¾¿¢¿­õAÃ~ï™ÅbØYãŒ8#vp¹óZ¢eÞÊ¢@RqößßótO× )R¢h912z†3ýRÕÝUOUu­ÒÊ)ã´òÊÙ¤‚ ¶SQ%“TR­iþ¢UêtRF+c< 4Ihg•‰:â‡2­ë”ñÊꄇAYË÷QYÑ.)ë®­²! q§ljYY9ÍÊF9ãPÙ‚Ðbr.:4RŽílP.tx•‹l—”kA§m•ëP·^¼& S£<DgÊ;ÊNyï1ˆWèåcìЙò)àš”ož·¸vøÝ© ÙH«`0šÒå­ Äx§‚G;ïUª=~GR‹v˜È6±35ëcJ ˜iÑvª¢Óœk=q*…®bl1HP1%tUì0˜‚¤;tÞª”Ûw¸&t¦qmq5*qõ°PÉL]j1YÑ«–ýÇ :ñcT]‹Eá’hNLl±–:a8,ž ÕµVs`Y±zŠëé"Få‚z ²0ƒÆG”hh|§Aö@°èo ¦$`|Ü´XЄž£é‚&°Ü¢çˆGªåöIè§åViÑ?Ö7nÐsÒÚýé¯U“o®®ë•z‹ªÕØ©,M¹„\þ¢&ÏWëÙªµ1?š|?;ŸOŸ.~C;­8G¤Å²ê«é5¹KsÅg«ÅÍòl¶R}Ë7ÿ¾ž±ÖÅLýío…Åòµšüôã‹úþ›³õ|qU=ù°^_ÿe2ùôéS3;ÿ4¿¼œO?®šÅòbò~}=™þºš_ |¿X~lÖ¿­OЯš<],ÏgËž<“yÈ?Lùñjò‚Ä­ñ+ÐD¬¬Õ¾Ñئ.uÁd[lXT}ónéz9¿ú—ÐÈ™;†‰‹_§ï.g§ì²9[47ÿš¬Î–óëõjr9]_.®.šë—gÄßxÈ‘él£±|jŸ*cáq9¹˜-.–Óëó³Ëù»¦¬2ÖàbÖ\ÍÖ“‡Yk,õ\ˆ…Rƒòh ˜Ü³XÃhŽ}šÉÅ‚=™wÜsh°®¿…ž1º¿‡‚®íïõ,ïIö«åâìõŒDM^}û#Í~[ƒ€~oIli÷óý7¹Iõ¤CѾº¹¼¼£®ËucLéÚ­ÊÏ>L—zE¹Îmþ~u¶8Ÿ_]Pâ ¡óåjÍzT·™Ý§E :…:Án…Æá\ñÕ÷ÓõržE´Ñº.¯Âøõ^Nûþ æxòéÇY™°‘à’´íyñü4“>Z®ˆ« “×bòŸóóõ‡UW™ÜmFã6£a›Q¿ÉèiP§Ð¶˜¡¤w1j´ö•Q¹ßd4 £ØͨßèÛfÔn3 ŒÙZQ ›|CqïZÑÖEYÑz¿Á(¢2ÊI|dFÍFõ£±»‡ÑSN q*Ú+jG+jw­èˆQÈý#3Û݌ƴÍh¼GFO±¤@f4푌šaEã3ÆŒ~€–u+m$`ƒÁ¶]ÖÀHëî0Lx¶¸“ùïæç+QǦ¬ž-»Øé´elªvOoÌ´zÛvYÝ8ÐÒÒ4ïï;šç‡ÁÌ`s¥£m.³×èíc¿½Ý}ûØæ} kóè}†}üøk÷¬ÙfTßb´Û`Ôo(ûÇðÉî*›©¡³¹g>lïžõ×äåçÞý/e‘]¿ø-]µáímÚ½Mí-ùúbâu/‹pÇõ>;s<‹ö,ŠAúø,:ÕÙ½,ºãYôŸ±Š_]ÿ|/»áxv÷êÖßÓÕŽ, Nßb±Ý Û Z8p…YWæÛš\yçÍ£¢êñæ6ÂvíÑSäÌ׳ ²ÿ·gÀ:žG÷»é®Ûkcô¡JwáaáôËûíy¿ìn<~%BÜ«¢>TG½ý;‹œÑþh&üWd. ;ö¯Ô¡áRïo1¹×`ØÖ½¾Ü–±|á.”9 ¥—࿼î=~KÐj煮wÌá^ùÿc-õèýªÚªªwpœþHUmUÕ;ï¾™æ œÙ¯~Í¡ê÷6—ás¬…/¹!-Ï÷s|¨•¼ƒã½¶ÃCLW«æj16‹_'¯~zúú^¾x:™_ý:[®fÍõùû#Žœn”¬¶ àÝãÚò¸4¹&ºÏ:oxàÁÂý«ãrÐzsuäÜ.Ü>¥3æP›?´·lÈ(ãŽÜ †ÉˆPMèÔ/Åòš¿?CuŽõ6GH¦.Ÿ±•VœéåK##}i¹j¹ÿ=Ë]cOÉî–úޱv·¾}ýcfçØÙܹC<7AN+˜@¬Ïgïi¹ãYdj<ƒQ8™–°°, vÀhùÔ³EË‚{/°E`‹À-[¶lØ‚e´Èf¥`Ûh5Þ²m)ØAd‘CF™Ø,±YâÉñÐHÚ&¶(›¥–G]ò¶e[­=c/¥ õ-©o9x;êqð–É&óŽd €Rž±݈ªŽ´”‚|tìŠ.%K“K›K—KŸË˘˔Ë6—¹­ÉmMnkr[“ÛšÜÖä¶&·5¹­ÉmMnks[›ÛÚÜÖ2]fDn0OYîW,$ßôÈYØ05™Ù1ýÙ@aËÔ^fÏô…MS#_™]ÓŸ"¶M eöM´P¦ÁÔøJžc…–œ$´œÐB0pB ¦Ë8¡Ål„ÃÜ!¡ÓhœÐ‚é4NhÁ,'´`ŒZxÚâ…Ì‚ñB §Ý -<­ô•Ç4–J Æ5Õ§Œ_ ñì½ÒÁÌ_Éðì»RAD •Bj5¤(Ó&T<d*´‘B¥€FR¨ 'Sa޲oB¥ 0½ªR€žL¨&ÏT Г©§ Ô&V ˜‡UÏO¨3L=]¡²0±Rs–Ný‘3uêv])ˆìºRS½*Ì-J•æÕãdjS›©eLªð­¯Së˜zøNucR¥€YF5Ý€êÇÔdêS1ž Ç´•浕浕浕($ÓV  ‰LM'¢ 2õœ‹ºÇ´•‚Ž™m•(ÓU ˜ìÐÉ)ôÛ Ìþ¾ŠVßVm­»K¡eu6(+Ó«…¬Ù†ÇAݬ͆—Ý¥–=‚»ÕÙ]Z ;;nh›8h~·=Žx91h³~I㈗Kã£#—ÆGG.ŽÜ`Õ²¢Xµ|3Š49±j© Ī¥ü‹UK»M¬ZšjbÕÒìŽ XMdŒ_¡‹Œaœá¨€mäs·*¦fl Ûä/Êoª ø¼{QÃæêC¡ë£Ã$2ÍÞ·X§FïÈ~ ưa³ÙÁÛþEyRI„X›^ÀóóQáÏÑf)÷åÍÁQ÷ñ9ùF´¡7^öÊë`ÁlH©+>ø» êÃO¤«ôu#Ï6Å–a±%|îp#[ƒØéÏ14î±"ÚA"!gí ‘q¯²ÝÐ Žwàÿ± ¿°ç‡x8ewˆ‡Sv‡x8mƒ!NIâá”ä!NIâáÔêâhñ?lG ;‹£Å!ŽíYq´¸5ÄÑ¢G‹ÿCƒ8Z½àߎãp¾èM-ÆÚÄÑb¨Qò¦ÆÙG¤õÞVoZõJø¿ìÌl}9ÿ8Ï)SO¾]œ¾^O—ëõäUãN؈kmW(=öÕNTÿÔ'Êm<@ßë°þ‰å“0~âø$ötö¤õ<õZÒ÷ëîû÷ýZû~•}'lîæi5ˉtMw2ú}¶âWZÇ~«þázvÕgàùªý¸Y_ίr‚f_‹Súýâ“ûÓj&¯û™ÞL{6]O/"'ßܬ?,–êÉ Þ,gSôít=é±Úb[hkº u{ªÓŸµþs­Ç6/§of?«Oóõõ}/—³÷xýÝìߟKLûQ÷u÷êÍßnžß\^¾›^]ÍÐí›ó•¿ïçß¡ÿÓëó÷Æ7±ÑêŸOà ÂÏ´ÿ<9É©{ç7glSêªR÷´¯s’ÓsÒiy3__ÎÊÝrz}=;W“çÓËUÎ¥û?§´7vendstream endobj 86 0 obj << /Filter /FlateDecode /Length 1930 >> stream xÚ}XK“Û¸¾ûW(¾˜ªŒ ‚à3[¾$k'»É®«6ªÝC6 …aS¤  fvòëÓ€’Æ×T €F£»ñõMýu÷fû1kV²™,òÕîa%ËLäM±*e!TS­vûÕ’†uV&“×÷çv²ã°Þ(©’i cgxòö`FêŒ3o™pÒ-žþ².²DÌú¿»Wu)¥V›LŠFÖ¬ä÷´H]WubœŸÅKQl²¶$žÛ~TéJ™¢ÈÐØZTi¾Ú¨\Ô¹b)¿Œ÷`dB&z8VÉ?ìç£<©/EÙ v%TUð¹Oí4ŸäƒÙz#“»0O³œ Èó•Ì…ÊK2`#•iQ­6y&š4È’pR¦)¦$Ãc„ÄdõªM™•„y.‹hÔ]g=˜S¨äÑ3MWY²7¾u- <Ó{dý…B¼FÄKBœˆï‚ýŵâ²g«UÊ:gÏ-ؘW"…;Îwj.+°Ò¼TYD•Yb§ÞÍ€;#¿É²T6€º±dq¤Õ¶º‡s "fk™ŒÃx4“{fâÃy ü|XŽ')}púÔÙ–7ôéÔƒ(bE+Ušü¤É„ h|àƒŒZ¼!ëÒ`VðcP§ª2é4JxĆ)×z˜bæµÚĪ«äþ<ñîz]8¡ +’ãè‚ØƒŒÓ}8…—\V?ŒK;Óë›*ä&ŒhP5Ä4=…±ïIŠAx-nGÁyÒ$0jÐóå^²7]¯ÝK4Çv<žÎS¹·~ÒCVzØG²3¡ÂàëÂ{ž†°×·;ާ%³õÿì‘ì›:Ä1ÍAíÙyCe\À÷ãpÀi•œA,ÚZ×ö”T°ˆjÅw£›Œ\WVÃY‰+åiU ‡h•¼ÕA&†Ü‚×Z¨`î{ä÷TÖø·l­R9#ÃÎ"³qêº ©·Ï2Šôj‰NÁ±L˜ UÜ(*\ˆ…ò&ÈŒyÒû‘M¼r7E^ãkv8."tžͱÈa7Ú½XÂè¦ ¤sZ\ëÂ¥Úþ¼7¼ ¤Æ ë Äà†£)pÛ×ÔÐÏŽa#ޝßÁršb\éM0Ã’ƒ¼3ߡՅjyŠ ë;|oËäÄNrÊ¡qDœO¤I ,BÇÊA¥yy©® ¸²ì±>ŒÃë…àï×E$ß`ç™Æ)GY«X¼ðáPÔ[ ñ›p[;DyÃÁNäE2<Þ «Ù…ŒQ=R¨½êÑíû§R™7t*O~yoÒ¬Lz3¦Ž©h4õÏJƼ‚¯çCÇ!Cß ãÜæÕñaƒSîÁ‹_|„hÓ%3&xk®ä_ ìpŒY?qþ/Ö ì±-ºÔ n‰Ì¦}†nÿz¸úȲ›5Sü¢d1§qöõW )mpr¯)ep:†£py~{˜Nˆ>ûÈ{eÁ‡=«þÍöp™Þꣽ º qJÔU?̺i:ýe»}zz„ÌþÉö$VŒî°}˜N[ôG(”[ýˆæŠéiá{/ËSQ¨&ÊŦ#(] ¥Ì˜Ðúg¾J„âsˆJ„?YOá•1"—êöj7_ŠsS‘qIfŸ}¸‰˜p_ƒû·ÎEGþº®´dPäxý ”|—Õ×X¢"qõ}o6ÐÂÇãóɈøEK‡nJJ;Šó—-^›žµÉo¡“Á&GtÓ±_ú @5úÀ¨:þàR³\(õ®ŸFO¨Â¯_Ê˽ñØ›a×rÕùzfšÓš‡ØlóÊéØ^Sï>|Íjb/£ '1‘Ó¼­—–ñ_ôs;§š#>‡Ì?µÌó7=#óJäeýÂ5øí³žÞÞ è:\kà²D7b0Óv îF‰üw𤬤(ªfµ©RÀ¼Ž?æÀÞ›»7ÿ ëendstream endobj 87 0 obj << /Filter /FlateDecode /Length 1618 >> stream xÚ½XKsÛ6¾çWhrÕš ðÙ©;Ód’¦ŸjOrhz HXÄ”"U>ìèßw%Yt”Ìdz1±‹Å>¿]@~}÷âÕ»0\¡'ÃX,îî”^§‹8JS÷Hi ¡‡ 3ËÐù˜ èRÕõÐ3qßµ[^ vJ»€bP.9õHu1ŠÒÀ….MÅ Û¬¹íx±ëòbâûÎŽGÅŽ ^èVl霡žÙ˜¼e•×÷®ÝR¥KMÁ(Cðc‹›#´1hpä=»q]ë¾R%“ë©­¥ó§÷Ñã•é+$‹™ÞÅfC ùt?ÀzÜ`1}É0€o…qaÆÍ2 ÿiZêzCRÖp±E°,€S·ÍFuèüW;Z}DMw`€è¥Ö6ÖËõdÞ˜ìî:Uè¶Á£8ü$”$êö0v;…*7’?Ø(s“-ÜÅRï—z££h2ÂètC![Ocw¸&NįЄ T>×´Œ©.¸irÊ,ãÉ L39™8E0ò#æ†Á¨ð»Ñ &¦dô_DìÆ`4ì§À$‚ O…åTV£{& Zœ&±túm^׸ÓEØãH”óû=ó÷X¢vd‚ql†q6xÏc¹È Hn^Lã’»§+sdsE;Ö%‹Ž½âÏØ,H4”‡¸lÜ9ÿOÆüÛã¹" 3=ÌŒ~4½Vn®ÍT¡8zHXGd=y$T쥓ƒæ²@ÞRpÇÞ9)Ý9Èá’º®Ç~è ƒ%â4˜šì|<Ågõé¾j;,D õÃÄ):F/&Øâ§Š›r“øIœÈz6N<Êe©%?!à…À?Ù~Óòa¦t|͇™}›@Û “†7Ym™q|SCn’LØ× îæv¡8! S Uù$DdÍ¿ï¬O3>Ͼ}k އ˳·±§Î<0{£e`é:ï6ÔDR7"=’ÃãG²Oïã̾^‘Sëu—w{œ‡Õ¢~aÐ4•9vƒc?»ü-h¢þ”½‚¼Å< Q!² „ÿƒ¸dãü†.˜)aüžÚÁ\2"Q5%Ëþ•o^©äÌZ7%²oè 0£À%{Uþpnï}þ :šc`ö›M?ƒ¹ ßš}èwçf q|îomõ¿l›Þ¬ßò.ïðèÞp׸B\Í+aÏ_ÒQ·hÊ¯Û ~Ê‚üè\ÄBº˜]ër[_›fÈŽ1&‹âÌp¯ÎôKä ‘Yž\3Z"/N“¯Vb\Ú×z{M»r1?²HU®q4<ƳÔKüø4?®Ü8…wÉçÏæëë—7ífÎ;ya–}µ{7ù#{“¿oÌ“ä\u"=á§_Òø^M‡ŸÊ¨—`€Q¾4a ü×@·¹?„ùœƒDlu3š%÷µ.cœæyðòB‡×&ž‹ï†“ M=Ç/à„çÙ°g-<Ñf1B?íŽqò#OÿÍgžŒ1­),ÒÌþÛ $_¼½{ñÁFÙ•endstream endobj 88 0 obj << /BitsPerComponent 8 /ColorSpace [ /Indexed /DeviceRGB 42 499 0 R ] /Filter /FlateDecode /Height 600 /Subtype /Image /Type /XObject /Width 600 /Length 6672 >> stream xÚí {£8–…ÊxHÕŽ]»³vÏŽ™³U1¶ùÿ?pħm$Fðž~’®bäã£Ë¹BºÊ2f„Ûq#q€ à—ï§,K·_Yüí6€³h%ãT¼Ë²$‚à×½ÔU’¬”€\ǫǫ*ZŸ¥ÂU›.Á\úqî\5é*tWÄ+§tE’§®LþÊ8÷®šþjsÈuÕ9ØWÍG?÷®è*û"\…wY¸‚+¸ «wßæÙ„-kª…Ÿ QÂBW¯Îqr5]>¢%èJIJ}gîÇku¥ê]÷K¿z®ˆW©à!+„…®Ð•ãx%GñWäƒný•ê…›ðŸãL2÷ÃåœÛ‘çƒl1÷ƒØîÃ60÷]ù¸ 2÷]ùˆWÌý@W^Ü(s?ЕŸ|¹è ®à ®à ®à ®à ®æÛèrv»fÅ3\¡«þè|ÔWèjœ°"¸BWî‘¶Á†+tWpWpWpWpWpWpWpWpWpWpWpWpWpWpWpWpWpWpWpWpµ®ôUÀà ] j´¡ \¡«!6Uƒ+t5¤Ñ¦*`p…g¯ôUÀà Ï0Œ+}0¸Â3 Žíš*`p…gÀ‹âОaÙº½/Gž®î¡Ì9±Ý¹•òÂ3 +º"ÇÁ38ÎqJÆà Ïà0Ç,‘ãà|ä8£î‚x¸Â‹âО!X®nGmµq¸Â3 jt<’&b;\i¼(\¡+t…g%ÇAWxÇ9ήˆíî¹ÚÛÑ^Ï€®ð ë媼rÄ38Íq¶_I”]¾ŸèƒÄv·^4k—"¸BWnuuùñ)¿à Ïà.ÇÙeן't…gpÛh1I-Þ1Ïà¸Ñy'Ìãû¸'x¸Â‹âfÒèò9þÏ€g°Œí?Oe]FU‹ÎçùxtÕ[W·£ŒSyGít¬Ävtõäþ&°ÓØU©+ýÓõ¡+tõ<^iÕ§âU«Ö­+Ï€®úÙUi²:' ¡+tõ¢,Ùl´)Nªª>¥7KŸ—­«<Ç»|D#§¬áš±]æÏ…{è¸ì¹øZ,Wb¬OLW#¶;ÌqbÙGÓŽ[À¦’ÔyÉ}PÔøÍc¶VWÆõMx††®njã]޳]‰áNÝrU Ó`­g—É3Ô£|ëŽWY¼ýµ´KMnõƉ†«åëÊÆ3\÷Û/IXÚeÜ×á¯Ä=îÛ§¶ 㢦ؾßnãdòœ#ÊÖÚuSâ•¥g DZGR†ôÎÊš«™/jò èª_GU±½³Ÿ®§î‡Á3;&ókâÜÆvrçð/‹]À|ù8 +ó€Ü¹±0Üæ>¸r]ÙyâU-—]3å륫Z•Ä+rç»f[“œû ¹sl÷PXý}°‡g Çaž®Ê=L\åÝuûûÔ|Ñ÷÷÷ê;žarÏ ¼‰©ôí”ç7AyQ)ªâ;ža–^T¦Ï"o(w~øþÚxEîÜÑS¥®Âëó +[Ï@¼êÓS…®âUÇ+KÏ€®úôÔC®«ÎÒÖá¯æý…ÙhÙS kâ–žöà*´Üy¦®ÂÎѹs(\é£6ºZAîìƒ+CÔFW+È=peŠÚ™ÕWtvîìž+SÔVÚ3=¸À3ž;{ˆWú¨]„®ð £vu\Ùxteµáª—gPSRëçµÐžñ«×z©+YO¦±2gÈegV]½Ö3]ŠJÇŒ3Ì­Ñ µáÌÙvæä:j¿¯QëÃ×U8²Àöºt…gè•ãÀ±Ý=W¬áEWsmôºÖ†ÃºÂ3 +<ÃB¸¢¾(}®à ®àjí\Ùìk Wx†¾`_K╇F³¯%ºò“;ÛìQWx†þºb*<ƒ{®Ø£ Ïà%¶›÷¨‚+<^Ï0‹Ø~@Wx/}]á|xQt…gpÞèbµ\áÜÞyæ…g ¶ãОaͺ¢n-žÁC£©AGl÷ä¨A‡®|ä8¦ºµaqÕ½q žaÊxeQ·6$®4-á¦ôW6ukÃáJ·1žaâ|pAuk}êjyž/:xµ0Ï€®f⯖åÐÕŒòAjÝ[25nu }®:{àèò;è ®žÙ†ÍÈEqè ®:Rrg<ƒãF'eÍq¸Â3¸äêíWxǺ¢+ž/Šg„«r$}Ïà²Ññö+‰ÆÎÜÆ3ÀÕ=W;¹£YBlÇ38ÖÕåǧü‚+<ƒ«F‹¹jן't…gpÛh1I-Þ1rΞáõ{htÞ óø>ng=<ƒO®f°w*^tyža{=£«åy†ðtU- _XŽc7e4Ïh¼º|^qYŸ²Ê¬¦¸ÛÃôW‹Ó•í’œp¢ uWpW¯m4ã¢påË2ÖWäÎþ¸’ÅXµ¥,઻g¬O!þöyùˆt›ËÂñjÐZ€4¿Ïij’ÃUÏÀX_Œv’ ]­{¸²ö Œõ5t•ß õkLàÊÖ3¼,eŸWÛ_ûhìÖÅpUΩ².ÏþÏ0%W³Þý̓Û7ß>GvÁ tõ~÷5WÏ0W«tÎJZçYè*ŒË–sÖ{ló"Ï î_þ¸*„s~ˆOê×g¥­÷Lýë|šž?` ®ê[”ú—üþ~‡ìá”÷ŽS/b£«òj­:àÙ3øÔÕ¹þ:+•rQ¿=?(M44Øøës%ÀâÂò·¶™«æç_j@}¼J>…ˆ²ûSšgÿÝ¿H©°Bï]7ÊÖݲzáaùó þtU«†Ž²J(òçR[ê¤s[RÍÀVœpÎÌkh£S£e0rõž=ŠK~°Y%)%®ì^õ aµ_$+tÙ”æã²|íæ¥»#–ß9E÷uHëY6#4u®ä”•ŠiÈå\þr>ºÊâh,WÞtÕZEü™³®¼Å«s­…Rç;¹œKß4]%£ïƒ¾uÕ8õEºrè†úªê¿s3T5+ƒœ›ŽéuþÊ®¼ù«J‰:]M⯜y†ºjXô:Í»s˜O>h.!ýÂ|°¡°Zv¤äƒ6žÁטL=ŠÐ¼ú<&cxD3‡ñ«û|0s2@ê/¶{¹l=êYû§å PÎå²H½é*ï«ÛßÇëË–J:—þ¼€ØW!êÊäÒ·S²ýò7÷£VÕyƺ2Î]Ÿ„« teçÄÓiñ¤ÇÛ\µsöÌaÍMW±YðÎÕ0a½È_™ÔWpåmnmõüfƺ²› 㟫¡fþYføZ]ÉÉ9W±¿>xž:\ùÒÕ\M¹¼y†Í!ç*éÚ°×W3Ï-g^MÃÕ´NË“g0íS¸’ù¢©ÝFØóåj:]œT»*]Y?óš-Wèj–ñ*äËN쯬<5úÕ×r5Y>há¨9`¸²ö ¬áUDmÁ•KPs®¨ÏWáxjÀ•{Ï@Í{àjÙ—¸Ñ·ã¸™¢è ®ž‡"ÆçpÙ×o]é:^¡+§žaØeg°Õ®c®.ßOèêÕž¡µ5øù<¿à5§>ˆg¤«ªÄ}pEµX½ëªUσ>¸ åÏ3´ª,,AWøöyx†Æ’øEèÊɶáøv‡—]†¿ ¾èâ<Ã2òÁ/‹g@W‹ðíxt…g@WpWpWpWpWKâJ_1 ®ÐÕ F*¦ÁºÊŽõé*¦ÁºÊ†î}¦©˜W­NhÞ/®jª4ÓàªöKíá¯ôÓàªí¦Û/uVŸ‡åƒšŠièêÎ3Lµ_ê¼VRàEK´¶5q§+«ýRpÕZIdl?,RW­m˜œù«éöX]W ßÞÚ6Îa>8ÙëáÇ+t5Ë(tµÌu©áë*ð|p©sÕ¼ø+ž¥’zÈy–Š®|yQž¥Û}äÎ8Õ³ÔÙ•Ã"¶ûö Sh·_*\¡+¸òØhy3¹‘º‚«;¤ò‘s2îÁ3uŠàêž*•2ÿÊ6uŠÄŒ£Ë‡f†ÈJÆú~ª÷Ï|Q›>h®S$ŽÉ¥¾…/Öµç ñÊÆ‰ë]÷¹šbÏÒFWõÌ‹ù¢–º2Ô)º*ºjÚ¡¾•=ó5,³e®SçÇâ¹s?Ó`¬StÝo¿dÀJ»Œ»þ²óÛz]ͣѩ þÑ ËÎnbû@®ò´Y2Áº‰Y\v~ q†q%—Ï ç®Ÿ±VÎU>¬]Wb`Êg\Š®ä肜‰kLƒ6´sÎòjrç1w6®X®¤ÁT>T3&SŒðÕ™ÎZuU:vÝX_%:¥Áuú+™1«´Ù4Ö—ÉQ›µÉ(©hû`¥¦dÐ8Ã"òAI”š0ªéƒe¼ŠÖ>Ög¯Š>(ÖŠ¹Z‘S®{¿’ýS˜¬ÎAü•«xµ ®Ò·Ó혿ÿÛQ;Öžª,¨Ó2Ö}°<ÚY©n\¥r6Qº‰&ÿˆ‚Ô••·Pù`ç½®ÐÕÄ—©i÷ÆÕ¨1™ÅèJÙö‘•Xu—ë ƒ¯xä˜ÌBt%ž(7ÿ¯÷a‡þ—í ¨§˜§=º`Qz]YuTÆd¬zºZO¼jîdòÞÞÖdãºwÔÕúüU¸c2Í—Ô†9ÃuU÷.OºZR>(v1ù²8)Ì1™÷æ÷ÆÞqƒüUôà´z}2Ö;ËloôrçU誊AÆ <ú‡V4Ö7ZZkÐU9Ê’l é aÇ¡U!ǺÙ£<ÃRüUVGƳô;­GW‰œblzH¤®Ü僽 ¾nÇ¡ÕÔë+» !Í SWÓß¼M;­ed5í]¹aÇ!¸BWCï„›ÕדwµµÉ|٩uŠ“AWtŘLžæ•\’A5o{ÍsÕÊùz;ý‰«“é¡+¹Ê²ñœzÍñÊL×ÚÇd›‚N‚¨BQÔ)² lŒÉXõA¡+Yv`ík--÷dLÆún™Ýþ8¯l÷dL&³¦ieÙÚ×ð²O\ØÔ)Ê¥%jÛv.ŠFWèêÁ ˜ëÁUåÈÑU?®¨InÕÙ°gl÷6¿}Q\YŒÉGnˆWèª? ÕfðWèj¨°"te›¢«ê6§™©`gÂèƒèê^2ú™ øö…\vr/ªŸ©Wèjh©Wèjh©€g@WsgíLt…®²áûÑ“;£+rç—yÑÍ(Š®ÐÕSÄ£7–]‘®bYÀý@´[èÊ 5ÀÀ¸¨uÔ»áÊæ~0.:…¨2æÁ•ãસbd/²6ã3BæÁÕsi«ÆºªqÑ‘½|®tÙÉýãWèÊ‹®Fgƒ¬£‡+úàˆFÇäνo„ôA ªXïlß·_ITÖ‹+tåŽ+Q%&‰àÊl¯XGßGW—Ÿò ® `}>¸“µÕЕ½Å‹Z@ ZÉ8—3‹à ]9Ìq„%DZŒðte¯"rgtå4Çj&‹¹èÊ%Ä:€<î|4 WïÐ^Ô©¬ê/t…®œÊªÖ´®w@Wµs_ÄÜ©tuÝo¶¿¡{† |ûBæ~L¤«ôí”l¿xŽcŽVKy–:‰¿t žxîl ë‹™û1E>(c¤®ë[K¼š¤Ñ·c$yŠáÊ䯘ûÑË_m¹®:zÁU3ÁaîGOºÊ¾Wá]®à ®àê)x6®ÐºBW âÊbwq¸BWýq;š¶Ÿ…+t5HXº{5æ~<"í^‡®žæ~8îŒ!Á¦¹påSãÞŽn^ÜñLs?à ] » êç~À•}ŽWí$G7÷®ÐÕÐ$G7÷®ÐÕà|P3÷®Ð^]¡+¸Z0WIYS|]9”U®¦ËG„®€ÛA†ƒ4î}ǯЧ‚‡¬ºŽã•EWÀ­¿RÙó]w(ë}˜'C Eïg +€®º]°ˆm¢AG/?>Í/ ýÓ½&—ÃU8TåmUÓEžSuÈ®ûçG¯{9N­;¥ ÅŸÊ¿†«%r¥6êzòz;Šw’<žªÚ"jå~Úk’xZ•% Žáj\éߤ†«ËÇNíˆ%W w®~î•w凓lÿWKä*ùöç^sËW»ãí\ª®Üç²’«Ë÷S W‹äJ,sÒT¡¹|l:÷Q“oXékWb!;\-”«.ÂÇ’ÉG1š«Þ‹á*®$K]Õ”è Ücc»Ü®ÉUªåJý¾+ô·¼è¡?W‰*¬Óo½1\õV»v²èƒCrçf²P„«ž­¾u–¬3{†Ac}pµx®ä£…Æ«vo S¼á!Ï&àjñ\3†a ¿¨<Ñg™\$¸î;ëh_±]Ø'¾«–ô+UlŸ[¡» ‡7þT!Ñ¢žèˆ]/}tÕ¨Õ$«ÕÝŽý+0=ò×â£×û¤ëžÐYêj¼äºè¡«ºVSQÅ·³0«ÍkŒç/}¼zâ¶ÈŠ™?gº ”—¤,ª“ß˶ÿ*~-6/¨O‰åM–û’»ÒVGŠ¿ë;_\TËùÿ¯ÆK‹²;â÷±x‘]\œ|w´±_B~Â?Šx¯ŠR¯ù)ÅuÚ¯¡hOš¥$Û—ÿÍïȇ´8£oYÅÑüµt¥Z®$"‚{ùGñ_yó´üÊ‹(ó%ƒŒPDÒ4Fõ)²Í‘¬°”l¢:šV[õ©Vœ* "%½’·²fXr´ú³²!ùéåAùîËv´_CÕ?,[Rwñˇd\\R¾¸ÛªPfþšº*Z®j¥å ®šKåhù “uÑüòÒ"µ?ßꔃbCÞÿž¿©ï§öß6u5LWq¸*‰—oF2SìÊp_0Q]®ð§iµ‰Â®nGõòjêPk‹Ùr%xaNŠJÁN‹nšùË?e¥¥'YÉ/ª›+ûžŸ0y©B³zùøY¼R}ûÌ[zýùÏ•ê°þTWÕáØhyë½Ç•èºù ˜—\³ÝñJZue®¶ÿÞþ>þíØê BïuÎRúödshÕ›–÷þÇþXÇÃçý²<(ø«ÚÑÕ/ÛŸè”ýò ]5üö§x'5]åùz~ÂãÅÂ_É6È ¾—ïÿµË’¿öꙿ*M¢x¡úpVGýÆ{oîÊÐè4-QþæZ~¢ÕkÈ»®ø©ýbJÜ÷üMï¯j]Õ ~ü½rÒí±=?ÁñRä3‘&”G‘Ï^÷"6ÕçTÛxûqÑò°zŠÅê½Ë£‚€êh3L‹¼§<¨LhÑŽú5*M—/ÖÊ{ÚüyÍ#m>X3(±FsåËèù ŒuãÝÝ¿4·«Nc%Û7•’ÝÝ4ã­S)è-'Å-Þäo£ÆÑæ…¿ý_Ñ/˃‚·²íרÇi¢»qšŽ–Íü5ýUÍ ºiUÍ«‘ªn~‚⥋®([žlöLRÔ|æü½€ißÜz¸×Áÿs°0ù{/·£áý¹} ü½€€™â? Bg›endstream endobj 89 0 obj << /Filter /FlateDecode /Length 591 >> stream xÚ¥TKÓ0¾çWD{i"6®Ç<$à€ÚE‹ö‚¶‚Ë!m\‘MJ·ÿ~Çv²Û–€ (JÏ|þæ›ÛàR|ÀÎIÆ.Oa ÝUéüpHÈC) âè׸gf2ŒhœÞ–àÎjç#>ÐÓopDünáLoXì&$ Yè.Ö.ˆ˜DÀ\S¢-™ûÅ[l”p*¼, œ«­ªVÆÂ½}Þm¬¯@“O9º+ŸÅ^§?kžEÞ´užMìÊRu›ÚY@ÞÚ±¬·=y³­«z‡dñÁ¥w[ù_0A!p’HiEÚøœyê1-›ÂLÀ[šª¨µ’½‹¼÷÷1·S5¨ÇÅpmñýB8/ ºL.èImüz×áôT2%\›§7â¸b‚Ø‚ÞúdÒË~¶Êþ½zKÞv}©Ìâ0?’HWúC¯i/WãWËÜ ÿ®®zó]Úi~Ç4öᛢÖ0Š2š)hŠôÖ7Ø­QóLáŹª‹7}’ÉQ’Œ&B‰ÑL”ÉH$a,Ëb§Fi°PáÅ,½¦Ç"]މâ! ©¸˜Í¿;XÒûFoð¶¦MÂ›é ¶(5›b¨Ó÷r(ôYl@B!þ"sOò´g¯ð´D(á ó¼šåëµÚj5êYÊRu{¥ª11'’ÿ/¯ÔQLþÄ ”ˆ´Ê~×òèõÙ3¢â9!O&.—h.±¬=ïïÕK“O.×€ñ˜HŠíbxÄAF–ÅÜÎ|á<«x‚endstream endobj 90 0 obj << /BitsPerComponent 8 /ColorSpace [ /Indexed /DeviceRGB 40 500 0 R ] /Filter /FlateDecode /Height 600 /Subtype /Image /Type /XObject /Width 600 /Length 5824 >> stream xÚí‹zâ¼µ†À6Óšù» =íÐÆ{&|ÿWXK²°µËÒû=¿É„‘Áz³Ö§eÊ!„B!„B!„Bb*£·Ié´MRóÕyŸ¼rCV|~‡B!„òjH¨Åh ê¼_q|¸Ê¸ ÈA¼‚+ä@ÇÜ„oGøv„oGߎ|÷íf^!g¶ߎB(Ê<ø¯Ú¿ÿ<ˆ$ý•æø+$ª"ÉÔšœ”;„Áb0ˆE,„ ùnÚ“V¤B„B!Åþ È‘qg?äBì…B!„B!„|ÖyŸ–y’°š‰êðþyܤŠ.„ÕšÞ¾+sžâ A©õ8ùÛ\!q®ªTXæ,$ê¯Ö¿¶)Û!qƒ•¼bÛBEiÚYç…Üè¸QŽ]•´íi=,¤Î€$S¡)0PEÄ+ä½Ì¦ø+äbPH´B!©Ž›*b¯ßÎ:z$)ê ÈÍhº("^!üb<Èx!„P¤Æù¢H^  ¸Æ!³p0á÷3lÁò‚+™©pW7:nvp…D;Xlý \ÁU@—Ep…âþ4Osò ‚+ä3WÍ3¥¬„+$¯ðWߎüïàÓ6YÿÞgpˆV«•\oùúËì‚W`Uÿ™™+u.€ÚcÛnŸm¸ò +`MšÏ ¹¢ÎW¢ñ*Õ\ˆWp%ꯒ]Å•å:/¸Â_õŒ­×yÁãA‚«ÀW®ÐRráønæŒRgÀ»‹Ö$6’«Àk ¬óB^puÞÃ\9èàã¸Â_áÛÑƃøv„oG3Å,|;rá±ØŸ¹NȃìÏW¾v0\Á\á¯à -s<W®\¡€r!\!Þ}Âþ¢;¸ +!°ˆW®P˜\±Ï6þÊU›Šr»ÏpÅxðZ2ç;ÃUàš<¯}ŠZÄ+ôÍ&kÊ>Eø+…:X E+“*‹GcF¸‚« àU\å©þjWp%ÈUMT1×à 5‰«zUt1 áŠñà1ë_Ï×M(®Îû ^E,7ñJq—–±Â\MDëí£Þ4®Ï…:ø¸a?d¼»x×uÑIÓû.³!躰k <ÇA^pÅsg¸š)^½0û®ðWãýÕyÿ,˜ÁãÁ ãÁ&¨ÁU¬rÔÁÅ“á"\³Xƒ\x¬ñ¬¶|< ®¢ŽïàÃûçq“>uPpWãÂU¦Ýõ+¸’ì`}n¸z¦ Wø+a®ªT¨Ï‡+ƃrþjýk›ÚWkÊx0yÿ´´ípzÈ¢~…\X,¸B.†„.Ö¥Â\M˜Ï 9³Ž®D;ø¼ßÕÃBê ø+¹>ý4Šº(ãAÙx•¯`Ë¿ÒS«r»í¶á*ð\8ýüA«­ká*pïNý Á‚+¸Â_½n®^Ù§®¯P@ WÇ,¸B.<ç.!cBâ‚+Wp…¿Â_!ƃÈ´à ¹H…có`»•ù¢XwY® \pWp…à Åé¯àŠñ \¡YØ‚+ä"ÂráÝyŽƒæçJLpWp…û+¸Š~<øâ®‹WÈ…Å‚+W(X®N[Û=ká Õ§Ü~;d¸ZòÐ][£W£5µƒY)\‘ %;X…«]YX€W[÷ñ¬Ž£7@åì/ WrãÁö¤ ¸‚+Ï:®ðWp…nǃO‡„œc‚\„,¸B.,Ö¸>ï/ó9ß®Ä+ü\áÛ‘4XOœû¤óèYÃpõ8`ïàƒPpG&œPoÏJ¸‚+¸BKàê¼Oá =«ŒN=‡®pÓÏáe¡Î•Wú\Å>$ X“ꢚ+ƃ¬áL8©.ª¸:¯àJ+U­¸Êíª£pW=ãÁ$y³›ÝW;wêWÈ…s‡+ä"Nè`åØm>Ã\ÝȨ‹"Q®šy}ÔE‘BjÀ¸O犺(2Î]$^5óE©‹¢‰pJ]TçE]‰reꢖ‹½à*®zõ+diÜË>‡WÈÚ¸÷dBÖÑ#‹uôÈ ®XïŒnÖJÀ_ÁºwXöñŠuôè…DÈ:zäW¬£G·\õìÔ@ý Yû+ó®°o¿Ÿ WÈ…Á×Á§íúþ ÝpÕSi ^!‰€eç¯Nù‚+$¯T‘á•rûÓgÓp…¿º#橳j'“CÂñêVê Þì1{í‡VíÀþªGÅàuÚ¶OzŠ—Áñj × ƒE¼‚+ñªÌ›ÝfWEÃU@\­Êû9.üÕåáôàC¸‚«ñãÁç‚+òàM²™.z9ŗW|ʼ¸¢ÎàBpE¼ºõã»—^õxÖ\…äÛ¿kþÕyÿÌÚÃUhið[æÉ<]´W!¥ÁïóWÏíÀUPiuè[Ò \!i®u¸ê;è®|•aRýŠõ8¨ËUϪÔ)læ¾äv/ÁUУAöÙFöѪ,÷¿â\Ô‰WÈi—<…VE†rú¹k»…ÏpD,¢õ+d“9‡¹ðì½p&v0ç ²Ùy5€ç é–}0 ²;š^_ŽVp…¦Z«Á¡à´æ\‚Õª.\Mî`Î X=´ìSó ódâŽUåË>gÃÕRÍz=|¬à È-Sςդn!y0¶ü×0U> V“:ø°þÊÓòøƒù Qæ¿W‚U9±~U¬¿Ê<…«xJ £bÕd®ŽúÔà*x¤Êëü÷R¬šÔÁjSÚÓÏ¸Š©±ùoz«‰í‡lp§c¸Zº=¿BêòŸ•뮌{5&´›ÕWÞ©¤šPµZDÕGÕƒ« Õ U·Ë\‘ðî‚T‡®‰HÁU¬Á©ÃRO²E ®¢ª¼]FÚÿßUi‹\ET‹OQ"A ®¢ª«nD ®Â䩨ëuÅ’0QS:øµýÛáj&¬ÊÎæ.·@]'7,¯‚-ôd¾k”œW&¾²(ÿ;¸J†ëßû ®üL|å¼@Mîàâí#_ ž„ Ws%¾îãÕÜopÒ<5—ù ³ª[®|àir«y}š+æ·Ïf¨†ŸGš´ÞYqÅ>³*¯Ÿ½¿JvW¹] ®,â”—‰Od<˜$vۋ•Uœò1ñùÑÁpe§<TÓýÏqˆSnƃpEœ’WpEœrÐÁ–+èáê5¬§,ò û_}Wþ[`œb<¸„ü·¼8Wç¿Ç)‹fžŒ£ôBœšÞÁÌ“q•þ®VÈ”‘qÅ<wé/€üg1džŒ«á_ùÏ"^1OÆÙð/1O†áŸ?ãAæÉûªU`XQ¿ò¢¬žàj¾²Bˆùozs^ªXú 0ÿMï`ÎK•ã*\1¯ïÛ}\Á•_µ +ÎK¥¬à‰¿:n8/_%ÛÁídQƃ£m\…{ÙYmU¾ ®fHø*‹ÖÉÐj6C¬\E¤IóE«ÿæoœ—ú𝂫ë f8Èü«W}Õ*B¬&ÔEš@Å|Ñ—ó_D¶Ê&^eÄ+|•¥gŠ2_ô‰­‚« £AëÒhÀ\EY®ò¥ƒ“ ±Š¯\WØ*/;ø¸I•ÅbÝ\Iv°^>¯œ{oï·ëqÛª©¬« z&ò!…«^»µ­šØÁºxeföQ%ý‰u°ž„lf"Ã\Ére&ŒRo‡+A•ÖSN[üv]¬ƒ‹·ó¾ŠTç½Ý*Â`¸Â®Ëtp¡§ôIú½—%ýÎÕ²/ WpWpWØu¸Â®Ãé®à Á\yÝÁꓯع®;èàÜ~¹ób¹j]:vÝE[£µP®S®;øP‘•ÆÆ¶Êm«pµ³zHWpu£ã¦‰TylëáÊåx°]ŠW<µYH/‹+žÚÀéo¡y0¾}Šàʮ̂âÑÆ pW5g.)eåC®òTµ Ë_!×ñêá1kˆ*ªòËàŠ§6^ÅÕñ‡Æ¯¸Î„—hG˜‚«þ\øØ_ÿö±ôx…­úV®žŸ?h¶ôKˇÁ\õ öž¿Jí5¼ )\ÁÕ®æ°uø«%sÁùƒ çè`ËúüçŠ05O üüAlÕ<ñjÉ—…+¸‚«È¸R+½~ï³P¹Â_ÍäÛß>òõ—Þp;ôñ úÎ:CVV\é?aqNóŽk®B’þfŽW©æ*´ý±ësû«dWqÜùƒpåÁx0Às—àjn®|Yü\}û0ñà¼|иïáŠ0å W¦ÀJ][å Wͼ¾@ê¢påWaÔEáÊ®šù¢¡ÔEñWžø«B¯t§.Ê0Гñ ®‹Ú7?WÐäW ¾,Ù®pëqqõ|=\!ëèá EºÞWŒcàjÙëèÁÉ[µäuô¤?óàr×Ñc×=ŽW ¾,\Á\Áþ Yuði»þµè}НÀ)žxõ—¯%rEúó>>:¿ÄW®°ëþ'$5›AàÁ3\ÁÕ­ÔA¼\!ù.lƒþ ®úµ¨u^Œ‰WЄ¿òš+²ãAÜzÔ\-©~W âêÏ9. WñŒñWH4JLCf<W‹»,8Áé®–qYì:\Á\ÁÂ_ѱpÅx®J÷¿§esåéþW¤¿esåé>EØu¸‚+¸ê±W)\!ùötÿ+üÕÒó`ÂxÍÐÁ_ÁQ*2®ªL¸þ½Ï¼à WŽoûÈ×_~œ—Ê(0 :C¦ÏJõâ¼T¸ hÕEQ8þjƺ(a*ìñàLuQlUÈ\ÍvY†pWp56 εÏ6\…¯ó­ÇÁ_ŸOÛ9êWŒƒæJdb7 ¤~WâP½,Q* ßþÝû᪢ˆW"'/%ã°¬(ü•BËêñ \ÁÕÜãA¸ŠÄ_}wý  WÖ£Aƃp5ßeÁ)ªxõÓD+çóEIpåà²Øõˆ¸jÎPr¼®âŒW®/ Wøv©Ë^9uüUd\9[ï¼Z]ƒÅx0&®œ­wÖTÁR¤\¹[ïlQ*Rßîj½óªW€e¼r´Þ¹Æ »«¿r´Þyµj};\E:t°ÞyW‘så䲫W`Wr\µÿ«ˆó Ý4ä»Ëv³ ŠÔ·«ŠhþÐ`==³®àê¾Î ô¨ÎЋ¡YIO«˜¹jÎ P=_Uåï¸2`ÑÄ«áxuÚ¶µ­âš¾Ëì-â\]Ëb­WÖ¥rÓùˆ£U¯£—6îÜôØ?¢®‹ gAn:!„¢§{!4A€BòjêWÁòß^¥Ü$/ù© ]¶À¾#„Š5Z¯£GèÖ·K¬£GèZ2ëèïÆ˜IbQ¾È›^ ñºÌÌ2¦ Á·%ÕÖñOŸbÍÕmÉÜ}™uô÷¥‹Ó6ŽUV5‘vÚ¹ÿbÌ›Q\ 4UTí72oëA£Ú:mu·‰4W·%t÷eÖÑß5©óëT¿§þyÅyÛÎýãÜãW)Дy0!ó¶Î{u·ó¾&FµU˜òЃV^o®nKì£¿Ž§Ú«MvlÇz+ÕMoÛ¹ÿbDð[ÿCÇ릊ëMì­Új¹²k«z•N3Zy¹¹K[Rw_b}–ïŸm;÷_¼þ^~|4WÖMåïÿÞjw!ñ¶LFQÃ%˶:,ô¶2¦¹ŽºûÂ#Ìdצ3;U·sÿŘQÉeÝ­US¹úÝS©@ -…B¢ÖX·¥YxÐʘæ.\ Üýó~ç!W­q´…¡vŽ"\e&JpuÐŒ¾úÉ•ÄÝwÖìã¥éCûH\eASgȃÚ*T÷V -ãQ¬—£<(r÷Ï{\]Þ×4oeŽÏlÛ¹ÿbD!L›Gû¦jß®¹²oKÿæWIÕº­+ßnùÖj®„î¾þ.µZÕÚµŒ"u¯š2wµ©3´ñʺ­\¬ÎÐp%t÷]Ì“±«‹^²"uQS™hJÝvÝÚjü•u[¹\]´ûäî¾°s·xŽÓ&/Ÿãd¥L[ysêže[uîyŽ£Û’¾ûÉŠy2ÈEÎbž ’—“y2ˆ,è`ž BæÉ äbž B¥ƒy2!äÄ´Ÿ~©\¡%(¿ØDI†,âB…à !|;·#„BÅ5\ÿb?d„BQ§Â¤Y"‰”fþ±ÙB!u67d~;’Rç0¯CºàOQeÕÇyu]Qžõ[‚«añ‹‡̈Z·Ø½~>. œ¶»Þ_ïóâ£wöÈZòúÁæH²A·gw°Bƒqè® y•+}ïôÜO®ñø×#øpp5ËÇH;ý;•+i®öáÅÕ݉{#¹*Ú}ïƒëÂÆUpU¿yýi*:ª_üC=ÄÍ›l¹ÉSÍÔ¶±ïÿÔ?j@2{_×·å¯Ûúåÿ³¿´dâYõ7Õ¿k¾ír¥[0»™ª|ª¯ñ©“¤ÞÙmðMuúBsuH²ãF½ƒ]Q¿ri‡Ú†Â•ù5׃ÍU³ÿ—ÚÔìêT}¡¶6i¤>y½_“øŠ¶ÚR­ÝõËÛê]Ûo¯â¤úÿƒÙ<[1Öp®ÃÞƒ7ÕB©Zè‹k"ÕgÑoja«ÑCáÊä+}óM_TǦe‡ }ˆBû£ìòZƒÕ†‡ôæåm†¡Ë·}\õ·æÊ»»+ß¾©NÖ»xîê è¼Zoθ¬uÃí&K>¨î¾q·š«š²Ö­˜˜T}ÛþHseö5Ü]ßê¥æïÚ5*Mõ®’í·ýñÊ­ú·¶ŠTI³+iï›ê¤a•ÿÒæoõ .=¢9~AvuôrÕL‹½áJïyróû¤Š5W—· ®.ßöq¥IÒÈê¼YA•÷qu݈ùy•ÿþÙäÃ.W”gÒaýÛŒÝÄ«nÂlNQúO[j^\½v(^µéêfOàš+á괪씺†)^äÃñ곉W™:Þ„xåM ëíÿÌ~á]®tG«ïZ‡~ÃÕqó¿í.ã͸0Wñê†Æâ×6èÊñwë ]«ÈÐ\©×¨øàMu¹øök®röe™Ë¹×£¹.Wº;Ì(Q»¦ô6^é!×¥.j6äΪWª—dñ@Ó@ÍMûm‡+}úGÜrö2S,Í»þêþMÝŒ…·\±;Ùlν®]qu]*J»Ç<¹œ,ÓŨ—Ÿ¶ÞhßsÝR’^z8ïî8}è%Ó¶iG]C 2×ÿ߉”÷oê¶~U±xÃÕâ îѧÏÞQð> stream xÚVMoã6½ûWèf ˆñC_hS`·m[,ŠÈeÑÝ-1¶PYr%ºiþ}‡Ò–µÊÆ(tàp8||ó8‰ <4 œ“<+^2ÂhTûÕß+’ñ,6bbÚ%Á™øœ·÷,ø¥_ýu°±Ç'ÀïW·÷¬JRf, Ÿ* ’Sð"!ÆS†÷QÁÃ~ˆbÎy¨w }?jc‰ð0¨*¢a3*œ×ͨeW¹¸ªßŽZê¦ïÐqÕ jmv|Pý÷?»Ê„“èëão·÷B+ÂEÆ Áì\1g02dÈ£˜Ò$ "Nþé"ž„z´, í±Yn%5šU3T­~–>‚3J Z"øCÄ ƒMRMD(qðذR5 …Ç©† J‡NÕ8Û° A’sÞ8[[П-Õõ øhÒ5Ý—µAxŽXö&³.”’2M‘ú!ŠgÜ ŠÜaÄsÁðìÁDeÜzc­¾$\tÎÛhÃ¥ä¡ìjôH‡'ëº1ôeëæÃö¸Wxô%bÓÕM%µ²Ä“KÊ»³ÒìewJ,d!ã®?¶5ÚÈC§¼œD±€¢úl‹øè.IÂ%uî†Ú±G|,LpM”¯äš;ýMÎ œƒ%ýOSÛ‚.B¨ÿAãUñ|78Q>ˆu¤í1è‘>d"àhÒH¡Šxõ±3÷®Õ°Wµ)7#¥ÝÙwí îÅìÇE¶ßÊX¸‚Î}1ž_X;…]÷^WÙ¹ÛZœ·êAVû/ý„n¸©A«ÑmŸ4 XÛXNÊ5˜j‚:MÂõ¤iùC+H²b™/]TæH Ÿ˜˜ÝfR¸[ᄅ,zc+ÅÈíÂm;Sã ð`oÑ ÝÁ›@çØÒ”XÈ ÷ñJî™oÆ8­õè˜e Å‘B=×xÆ Æ –5}÷á\ؤž»°žw Žp"ϧ]$;›ÅÚò=^b'7Õ PÞIS¥è<•ĹÜaUìIúœÏî½cÆÀOÅ´—'¶—´@j?FP'ŸÞáøcŒcõ%IÈ¡ "¹A|(ËÔ°†%º”¥ƒúýóTŸÙ(LB‘Àçú ˜Zjiv>mýFè¡íµudõËA®wNr¢@)eæWÁb¬4J c¥h .^Aà~ýÄ’/áÊ“ØV—²Mº­ÉÍ$óéÝ—øE² °¶éÔh¶m+·¥}®ï˜±s(7c÷í’>”ÁON~µ>›ö¨P¤¤ÙÕ(‘RJ²ù'û$R3S º¾ïø±mù&ëï •¾&T3QÊ` 7¯^S)%¢,¯NîÞà2BÅÿÒ)c„&|ù€ m^ÚdS/èòF‚"#~ˆ¯e6¨z %%YQ\ â(ªÝó§RÿÞ1Ÿ÷ìÏ4æ„–) ‚…û3&nõëãê? D „endstream endobj 92 0 obj << /BitsPerComponent 8 /ColorSpace [ /Indexed /DeviceRGB 63 501 0 R ] /Filter /FlateDecode /Height 600 /Subtype /Image /Type /XObject /Width 600 /Length 12046 >> stream xÚí ›¹m†¿Ý–ìµ£(J¢\Rg'ÇZ‰åTGâÿÿW™é£Š Á›¬fUx˳3]]ß@Œ¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P(Êþ”ƒË¸â«upÅA®(äŠB®È¹"WrE!WäŠ\‘+ ¹¢+rE®È…\Qȹ"WäŠB®(äj÷\ÁÉ#EäJ½˜Ü¼4çs¤²‘«é¸:³`aqAãBˆƒIŠ;ÜŽ£<6W J!4$t€3Dëѹ’Hlzn0!p¬ß»ŽÕ°äj:®|l\cwþ{ú+¯ÿ.¤x^³Ëáïžêóá¸ÂÏÌ¹Ú Å_,4XáaÉIEj–àüÆ~-ÈÕ¦n•2J 6 5‡û”èÓSnaï‹ÕCqu{ë]ÂÜ14ÕþQæ®ò±]=ÿé,1eXÝ5þñ \Ù auÇ×!uG v0òŽ»¶~ÖJ5‹WÍ]Øz®nÃ0-¶¦aÈÕWWª¼w~Ä7fïÖ±¹šIØÈ);Ö´;oùVÊØºsh\bk²ŽÌ•£ƒ¬q«1–eBŒ Ü32Öå½\äªT7Ãv¦¬HÃÂ’øk½s…R²–‰ä@rs¦ŽÊ•§ ଻Ü|uã*ŒÖ)TÁ¡‹®ì¨¯¬ûÏÎSxðñ¸ºh#g¦åÅ«­pƒkhã¹f‡® {¡-RV8Pxl}eG¦¯þ¸Ñ¦~Áèõú™Ñ\ÙŧAf¨Þ›”]"æS÷8­›e Is³´—Ø>¼êmf¸êÕy«Q”ÄÆŸ×Àu@;h~°Æ·ãµ#ñÜÊ—ú†c».h6%Q„­±úcÎ×`”ü´KRËþeFcpœ(•%ÕïŠÿg4R?‘<ž”Ž’¦æ½Ü€L纷UjbâÆyœa©Ñ!¡{j½–*e¡è+þ¸>0{Ú“˜²g<ã-RRÔ͌ģOÄJЂš\ råÛ,©r”“é6bõ¦Aam‚•Ñ“aÖÌ­8XP<1? »Ú¢˜+¹Î*2ÄdÉþ/#¢ÒÕ^Óø”…+ˆ¸J[„ÄÑ–Üx<® ÌxV7õ²¾c»¦ÈZâH&:,±Ñ5¬`ì¨@CXÆQVƆgã =¢ŠÂüɧï:îŽáŒ¼ŸY“,36g@›Ã¾å&ë{Quuéó=xLÍ:Làõ´^ȉºîT%öϧ¬ vÚ²l¬2°`Å£–èÞÈÀÑÆ";3½\žXB-#:PVŸm@܃õñÍSX!ÿ'ÛéO4!Ù‚ VQL¤tH`oDÞ¡“s%^ÒuŸ¨2ßÖ··{OÇÞõx aîAˆG"jÝvkÊŠÌ B,Ô48{Ï]Ÿß­ßŽˆ©[£Rb‘9°¿ĘÝlۧУD©Øiå˜jé;y>¶dµÝ¨9¡‰Èï+Û×ôvÒHÔÖoq´‚™—ÏGßKœabP­¬–+ cíLoì¸Õ¦»m,‹hÓ[óøí…κHGGÈ#‚¶–þZ".…3‡ò¡…å9Zq ì éÞkƒ ¾ÅsÏ‹ ©ñ†ÔÕvÂŒYrŒ™º!ï7ÜZÃö•6eq ¾;½äl vW;ƒ©õU[˜¾p/sT+BêÅõu ˜šD– „6£]¨UÿnqepÇ: {àªë„ÃMW2ÙÿñêÜÈVËB‡ŸÒ (†>ã»­ÀÙ¹2î†ÌxU|üÿ)– SpÃÝKÑ›+h\É/ëNYráJ¬S%Ó#Kƒ.Þš«²+ÆÛnW¦®2wÒ+ ÆÝ£ˆ s`eæ÷ÛEìèÀ•AžÒpòG͆¤cådÓ¨+‘à øŒØÆ!÷0̬”ÐváËÀ¹R*øÅÝu‘ë•aœj… ³Ÿ2÷“¯;ûÆFqåÑehTs܃\(¾}X2¬ÏÅÜUaåùý+#²4zøWqÞwCøé‘VÀÙ VsŒ«+ã”éË´³ ¥¿³­ã8¥ Ì8®d†ƒ£½ÂИp,Ë$^냒+9w¹O‰½:ª·;Ýú 2?‰æ‡a—sq—«£\™HŒ4gæ/H\ÀD±ƒ¶ÁœpÝ9¦7ú\¸(OëäM(E/C_eºìÁî<* ïé¸Ê+0‡ÂO’ U“éQÔÖ·îðC¡{”å‹bÔ|ЇÄÞfI£iš¯)M –€ýA´¿Ý˜LµÐ©öì-«Ñ‚ÈùA„ð=Àí-argÊs5±« ÑG11WjzAó…Gõ¢:i© U.7´¾'oËJxŽE™ÚzKàÊ­Ió¹«òØ «åPL•å|f9*óq%× 5ŒÆò¾ˆ‡6Âu@êkÆxSoÅhò@¨ÜS†t"Å´ú žÍ‘ƒP½Ò¡;™ðŠ;ä[çüsº·žàäX‰u ˜]rµØs©-¼¢N-M…Κ˜Üp¹ás.ªD€Œ‹äµ,›7~eì¢UZ=•ªÑ@€`Ç‘è8ÌîúSˆÊd)€{ œVgU(æç áÄ™J°h¡ïN/ ³¬¼((±ƒ:E±v5`EƒžÆÞZØ*¯¨ºH\˜2á*²þ9`€ïÄU`w{5W‰øŽÝ¯`B½˜íéB[íªÍF'Yì~~®”*š!o±Ò"ý"öPXjùa¿±ˆÁT“AÄC Gá*Z ¾ÖuÒ\uIIõ—–ׂKJáTþ¡’ÛA(XÅTBÛ,-´$ßGa)­…‡Éü«ÄVyÃoO: cíÕ@¤­e“%ôEwIgKç ‡àÊ)Ú,{9%sâØ®°àlŸ›RçWW‡˜æ ÓÜ97ŒP« Ykñùï L³Puñ]&Ñ*,÷2§ÎÍ«ôÜø|SÎ[³„Ѹ²3~*V®Ç6XæÎ¿Ê,òÜZÁ¾WB•ª@åSˆ\úBJàfE£+Y¡Zñ)ˆóæ3tvo+ÌUãrð²h™ïOpQ”ƒå—ãíiC» ùÇpõíýåEüþÇÊÓ–·ýkèöiaÒÔ‚Ï*óhàÙ@õid¥ hР›¯Ã|\=áÝå‡ÏxSsÚ±\Z9÷æªqVhg•x‹C*W0Åúªac¢5® ½!WßÞ/4=½ú©ì´U¥ Ðäa'‚’­úJTMƒê¡ˆdÕJ—¸!Ý0“+}¹Ûqõõí»ÛŸ–°ošoS%Ät3‰kwo“Ô@‰”äÄÝK2# êëÁUØžG_µ† ZìU´ox“¾RKy«újé´’;ò–N}EÎA±IóVþÕw.?|ù!ß¿jm¤Ø¤°ª‚EÀ»> õ'ƒi‡ë< %D$Ž_ÈU‘3üúö¢ÛÚjÄiÑkèn_]óƒ 'ßK/ê­šHŸDwÿÒª 7í7ŒrÕtéc8L_ËžKíÊ了rüvw[N,@%7Yef‚~@woHWwàÌôݽ ‡Ó²°þª¬A†GÒf¤4èbd¸LŸÿ±à¹–‹8W_ß¾9Ç®â¢ÁÊú„Ö¢¢‡‰ö¸ iDÔnƒŽÆß×½‘nÐ>áªuØõÔ‰«§×2â°šDžä8D«ÚBÚËîbn%ªÀ÷Øo¤{]Áƒ U™ƒ«+QŸKã¢Ì åÚ”þφP-æm5º ù8ÕXÕ(m%E·e¸FqõåçPCI\´‡c”›Íí>/ËTµ®ëªý.Ö 9&P¨¦Z_eÍaÕ¦Áâ®GkWßþäÃôUKm*ã‘ÐÔb7dýVˆÆ8A·èwùˆ¢\«Y­ §åê剽^<øí¦¡å ÖMf…ºøíŽZõÚ­‰œ–E^¡líy­ûu·¼i¬z:h€ŸÑúîÚװW­·i›:ØAãÏèa³"7©C ä†ýa»ÍOM‘±8nlr˜¸h%WPƒ =£aÒY‚ì`.Š=_Ù¹Oùœv€¾±ÜÛÁ¸j>F´Žî~]ëê2üCh;YK2³¹‚Éå †\™†RzÖ"§ ]íI –ìëeÔT2Û4"³¡Bþ½‹8ºgQÄÇâÊ(Žú'ûá+k5ZŽ«Š•ã–‡ >"ùÆY¹ì¿’ÿx\É~€}W0á¹oVq¸]—|ýd„23¦â;¹DØÓ ð~¹’¥øWXºÌÃê àš]¯›7ô97_ÒÉáª1Aˆ\93{tÊ­°›°÷ zuWÁ†¸‚|(䪑+ãù?Ý®F$LjT»¥'vJ(‰y,æHŒ‚DNËøÍÕ"ÈÕMUüúYú^˜Û NŽÚÚ <ñ€èÑ Ç3·K–„ƒ"Þ²Ê=u¨›Ä8Ãuø}–¾­ü+¼ª!·[LòÜFçp•L|óG*jàöWì·Äð\ý×§OŸþG濾 ú*,EW@ ´RIo6mã)­¦ßø)£Pyo¹ªäêç¶üzô½%R Û©D‹'JïB¤•F÷&£1ëøÁ¹úßOŸþñÿ\¤®N]/GYX±v Âî`{8°ÿKƺS‰Q4Mlª+§”@%W™_û»+WÿôÇ/ý~„«³tç î/í ÛÁ,/+®lL][ åúüUmr•ýµÿòé·¿3_ÿêÓ§?þùÏþâåß8W}Ør¸‚\Òõr‚ŽO¨ ô-ÆZ¿#WÅÊtX=WÁïýúìY}úͯþüÓoþèo_~üÕÏ.?pÃêò_h!=Õ”2D`¢{É`È*¶R†ÝËŠ\Õ|ï‹ÇnË¿yŸ°±²ÙjãÊ ’7’¾˜ÃHuz߃²­c­keÅÇÈUÝ÷>ºŸýá_/Pýã¿þ·ò˜¬V´ªO+“¤ÛmõRŒäZM•]Mk°­3ÂÓXrŠü-NÔϞݫOÿô»œNZ‘­=Á˜¥»ñ©L;­•AeFãíïw.›\¥ÆxõÍŸ}÷ùç"®r•Ê6-Ãijíud%ÅÃ:Á4¤t®¹V謮ŽÎÕ •1ÿþ¬¬þ7VÔM©êííÝ&„&¶º·þÜLÎÅ©¯ö°¬±rõ’\E¿Ù¦êìºÿç \ŠÓžŒÙ¤ÁBD Ú§U?IBD_BXíŒ8Ö«©)‚Qª†\E¿YPe®šêÛoÎxU\RÎ’ ç—¤ø{tDd}Y6ôÍ´ø¦t1ŸZrþæËÄNRuê.|ýöÿŠõU5X~æ)¼P$–t‘KÊ:ö¹2ՆОîj}4®.(‡ªù‹ýû÷KÄšâhUŒ4·PBIâJ‚Cì/;¶í… ã:Ž/·À¹KUE€¢‡Î‚¶m ¡ ƒ[%Á˜T;äjÛÈ@ªª>ýñÆÕºÐWBUþ_–¢õõ×ù]D]9”Vnvtf·ì «(W5±œ\´¸JÍâaйª}¢öæÓª>›FÈU¹)Kç ŒGÌ Ñ<³ÆZBðzÖ‘«\•$,e'ƒ+˜h¹>½ãy“¾ZW"1ûßÛo§®®^Vη!„B,/]f[Åk%·…dððÖ rõ<â·ýy11÷êŒËQ1Ö²¯âÅ#VÆc²:6Ðw ι:öe÷CÁsB+ÈÍÒʤÛ|-݇‘æ ž5,„P™ê«àXÛ qs-¹K† §¨¹`ŒñV#Ó8×r=ÎB®‚îôI/Ï£Çùj¸›è­ NDFáÆØëcäM%Ú…+1ÌH—2DûµÄÁJpe9WöVy$Wr=¼+"£äªØ*!êûÚ9O脲IÀ‰7J=4ÇF"†k}EîP?ÚÁ°³uÛ‚±ë 7'±EÁ eAb éoãÑrÛýœÁŠè0j@•2¾bׂ¬¾l€iOŽLÄwóN}w2xªÖ¨ÁŒÒ}€äª+¨Z껃eÕÖÏoñ-“ü<†"½VéP °Åq/®Óè°]jÏæö ^ÚÐçwbŽUá÷›F¢Y@Ê ÇCaGä }Ö2ƒþ¾¸P€~`Ù˹2ȸÄXØiMŽO×rlm*ql}u på/MÚ¬Ãtk)ÅiVÁ•^tOë&Ë•&šâ….©³ýsrœ•Š0z¯wt¿†h#Á•™pš‡p€ UDß¹j×vÏUd>?ò£/¶§HªÎ»A¹ß€_q@"‹FdR¡Æ»¢¾Š¼ ú@t°…ŽeZ¸ (¬uÅ3þUîOrt é¸*âDÀÛ÷°¹ èk £Yç‰ß!¬>àîî †ÈêOÏÐÒo¹ìâù"­+‚Má«'b*+ÍUÀ^êÏX[•£ïf bàðÌÊÚµ•_*Ãs­zlBY/F”-.\ȉ(,QX4¦Œìmùñ>…À®õU²€PWèÇÕízä¾ôàÊ÷"=!¬ÊïQ+(RÚ‘§Ê€«œêAPó‚oxË-z–1ÛJÖ Rb0±Yrï2´×®ÛpÍÌÚ¬ 6¬‘&k=BΗ+Jr•Paöv–Ãw½FÂìa£²>ûÒWY›­€Ô¼N‘×$B˜¡³FxGE?È®è÷Gñ÷šæQ¹BVÞX b_Ð öŒz/p{< ¦döYn»ñÂé:uÎF_¡+÷ G¸·Ã",…+eò 5–É #àùÞwÅÛðãÆAš+ôÀ*\çÓ^¥í²…îdùX®”©"¤Ä>àó…ØµÜžì_é¯dQ± ½ˆU¼ÓÚÖGcù»ÿ´n&´w#Æ’n*‡p!Ì5À÷;­ÿ( kPv õ'¢jHü€P³Ô uаJ­»Tü6ÿù ó4JËæq® :V¼0PÁBÈ׃ÊU8U!ùA(7 «Í“í«a;‰3 «@Å7U®›‰ˆ),ÕjÓÈu ‚)y^_9£t't®Ð€UÀ¹q_è^µêà.A§bi@Ò‘2áBÅ9 Vß%¨¨%Š«¶:ŒŠÓ /ìÐΕ\ƒvýçTôCïÝfò¸ržìÚ¹(ÑWM÷?;X¸Òv­@ :˜ú2ÖB\eFÕü€B$âtÄ!‚aêªÎÃë« ¬Âƒ¸t“tN†Ðtoka›¬KŠrÄ`Oð,œÖÂ"ñ‰öƒÍ«C ¡9¡Ÿúk'KcEDØÖºŠ+?¶•HŠ1Ñ8X( †úªÖg=ï¤ÉÑ «R_Á±ËẤ ®ÖíÁöÑäª©í²³ÅÜtÝcîWL°“± ¹²Ú[iwÛýðª\}~t®ÐÙ*®YöhÄÞaË"Cµè{ûuÏ`,:§¨+±üL}5«Å‰’5e:),™rµ‚UË‚ÁŒIï 8N0`ÈU®ìÙvºBdKpK´XiDÜ&ÎÁ쿟S‘Ûþ0óÁv¬$]© AÝ-­UΙ Ò:æ¨+¿ÊQÖz ’—…2®D_ºrUT#ë;†¦°'…@t¡ø=0&·èò¢`>W`\´'Vv`Ç ÷³l@¸X¶‰l¾É-¬‹´¾Ò›Þ·,‡â \õÄjÙ93`Aߎ:]\÷8Wá]¨™éÂzÿÂæCÓWÈ™gY_uÅJL¹ÐŸ«…‰ó>Šu=et"Ù¨Ù›¢õ¼åœÐ/T:h3ý^¸êŒ•ÌŽí)¬Õ…–Â:Aúâd8?œ˜—™Âªseo_Ó¹2äª?W&P\ôÕm­…Â@„y…û“\ô•1ãÒÝwÂÕ¬Ô¼Þ»UnÝG!Ös¼îKáp¦¦.ÓŠ%X»vŠ_dz@®zO =†–r¶¹™°ÀŠÄ»tu•ó¼BI4°SÔâ}µ\á(\Æ`e ÷¢ „{ =·e$¯sÂp 0¢\¥¼ë Wbv åŽPcaLÎæ¥=puÆ•ëÀ¬ïu‹p×zo ó¸‚à*ÙÃG«)¹²â*þ‘lQ¥ìeÇZȳ9³oõÖÎË„a®Ëlm°ƒŽ94‘TÆþC¸®†aåöÐq²•ÐÂlD¯A,•ZrB߯ªîY¥IÕöƒ¹²Þw W§G+í/UO~iæÐ䡘«øk€Ðž ¸Ê½íîúêë[¼ú‡÷o¶âj V‹{¯$F#X"4†KtÔí‰dyÕ¡Gƒ"®öÛƒ+ߨX|Æ}^Ÿ¿ûðôê§/?¼9WÁòÂM†²…Ø™«€Bów^ûp¤í®ô´!ÌG“~$ò*4sõíYS=suþß\ÅÊiÿÞ-ï n?Ýk½5WŸ!bû鉠¤xàí°Ó›§ð¯¾¾½rõýÇàÊX› ‘ó®æ~­pÍ5®ÔPCºM\ôF®bã¡—wË›JwÖW¯Ï\}ÜF_ÆJ6þê×~Ž6ÂmýÙÒ1)g]÷ëSñ†<…e›A„|;„ÃÃݹ2Ÿñ'¼ÛBMžÆs%®G ”¶xîWZ¥Ðz®| "­ Ökq¥¯Èĺù ð݇-ÌïVXé3/´N åk…Èd§Qä{ÈAO*Ôh ÷CÍ¿Ú +µ±ä’eYl•ÞÀé$wªæs…xg®ìyíœPL ÄFUˆöžë¹2¡œXx­ ŒÉÜA‚žlË%"úÔæ`!+ÜQ_Á 4UL5­/<¯ÊN°Fߟ¿åôÛÊ[:„{cJ÷ջƯ^â /²AœaCu¥-­qºÜæÙ"à½Á^§Ë@õ‘$8ýwÛ6Ž«*.ú"Ãã¢j©í¸²uH·^2—Œ+Û —5OKz2HÙb(VWÖ)y }u:m©®}eB·RK þr^;WN+Bw…#†±&.º‰µ)U_Ù5ˆ=¸:ÉšÌ&¬ÊÄ*1Û‡;}€—Ô´ºÞ1Îpž6i«ŒÓn•Ú–éבÚÊðT#Ø(ä*iÅB•¿…bHǸYãWzmýM.âÑC¦¼ô²„z³rŸ+´(µÚ—³3Õk÷Ù=yR®¤ºÚ’+ÑO ¦û¤ K¨W‡ð¸Ê8iª8œÈb·p¥TïÏÕÍ¿½O|¦Œ«-­ `§œ ?Ü—¢X᪹Z»¯–[³+àÚ4‹êÏÓè«Ï1¬–d‡‹Ÿ}Zl†U8/Tl£Ÿ b-&¸BãàZ÷Ï£»ê̦†¼ìàÇ×mµÐÊ*sµAˆ!ØÆUæ¦ä¼~sñ&®7õSs`mš@CÉ€Þ\Eâ¢_ß¾ ¨5»#hb2>Ô¹ÒÕÄýöCáÖG.ƒ«>c…e_ˆÝê«ó”pWÕúj;§~½uÄËÞ¡W`úœ1cÂ9X¥\¥Õ´·vs„Õ"Ré\^'_ß¾Ž0w šwíàÎ>»ÂUTaÝ*õh#‡%:ªU êÞ|YLÿÄ·¯Ó‡Õ‡/ —vãê6ŒF“º7WJˆXs#ˆþâæá¶³>X±ª¯¢†—9±ª+»*ˆŒtå.#·ÃN¿Ú8Ònd™°ziÈÄã:ê諯ì:X25ÚªÓ…5.¿¾]9—C®R\E,‚¹—U伋Béf£øï¤e-{ÂîÀ#¢,é^/ý¸úúR~{Wb?Ôv\eïXïà¿ãZ A›Òu³è’òc×Éq–wn%‹”T¿ºn'³qur6pnÄUör `š•I+3„+{¯ ±Êj­•³VçQkVU²©ì€ÛúÌ‹ ©ÏpÚÞ ÊìªÒj*µ“5½ŒðVÀnœÀÕ²œµD3Ô÷nXüê¦¯ÆøWA¬°ºêT¥'ãà(W9-,‹–ÒúYÆÜÜ{gÊ2–«¡~ûÒža[3X“;Ùj á¿BH|}{=.'ÞÏ£“9:ÐpÛ-Ww1„åO£É{¿GÃ\¡ïBåJë-gsS›}VºðÕß¿·0Œ¶Ÿb Oí\!³&ˆ¶çÙY©…³+ìÝB|gÐâ¢÷RW•£I_Á·„9.š5s–(]®¬(Å[ægâê>XåÇ®:ë+ã‚U¥¯Š\,d5kßÉe†ùãW÷âÊ òY´â>-5fü¯ëϼ<%¿ì¶œ7ì]ˆ«»au7®pëà_¶q)/±§¥L@¦:øó˜H°zmÛ- ‰¢;Xý¸Ê¬ì†Ý;ùNLaÕe rÓ± ;`Î-UWàê\Ù]ÊŽ â- ·m‘KNŸ…»Lí €Á£Ó Üïr¶óÛíT~ÅþŒ| XÙ@ľ/¥¼h¤¹‹¢ʯÿ–³7¬î2gwWX]úµ[\5LMkÂ&¼iKE8+õ=¬°ºpõñÕOO¯Í—_Œ«Ï€á£âªlµ Wë ˆ ý€Å"zWWšSU§èóKýö×ø |0Ö2·—! 5ýèv+“_E¯Ý †3'¬&ŒÊ¤P>Ÿn\}ùåçÿmÁÕ6ž˜›!2¾%¨–»³¡·†DÀ‡OÄ$’-ƒÔ WU“—9áx®6uàíîy\ÁtãJKkß$«ûi”îåÀÕ9 úñÍfýq6Í^¹0Ûr…k¬Á®$Ôµ6R¶+š{ñy$ãC—þì¸?Ï ›¦ƒuúj ®²7- Û ¯]äD1÷àÊêû«÷v…zñ³D‹îwÚÜùÁx®Ç÷´„&esèÖlz”,óXîZ;‚«€Âz Xú\vÖpuBÕm†è+`ÈåªsžÌý8˜€«¼ ~G¬€Û:!¼ÜÕ~e!²#-9\¥ JÍÇ0W‰F¹º  æDoÂʸBÜ ÎÆÕv3ì”L]å®n1%tŒgÊIÉlN7 q¼?WÛ¾ m\uœ »wÌö\Ù‰ (â*’‚2¡¾º³ƒ•UR´«×¾˜Ùè[Ñ&ô•EJ[ÃÄ3æÈÕ$\-3Wƒ=95Èäê²cûÔk€G÷‰Ëγ9#ʺtçê6Np{$mÁ•ëÜæq5Ÿâ@Ã…`ìEååÞ¢éjU®®- e}½áSd¨ÅÝR¯ï54Òc8ïÏÕpwáAhWEy©¶ïZ02 KݯšT×8Yù=˜™«¬ŽYY»­Ðs4—Q½sLª”î ¬|O=pUWÀÌ\å)¬ 4rho×WbßíYæ„…½—.a»Yvv®Ò¬aƒN9ÈÊIíe!wŠžN²÷ð\Uþqß\ÝãÊó€º.Zï‹Ê̸ŠVUŒ»'ùWp¦#÷¹ÂM¸ò‚~Ëf\U¶$?ìªpsë+7eân\aXur„&¡C62\—ÃôÏ;ÅQ綃áHͦr vk®œ"3BUö"²ª*N–×—Å6âjœT·!‡-p ý«$'«!Ù¸šÄoÏà Åã“Á•Å:æ -õµ²*¡Ï¦¯æáª¸ôam¨Áµ‡"”mLÿVÀ%ßÅgÏ¡r~®ðp\­`AUmãöð¯SÁ$X{Ø7±ieTÈ2*£¹rJâ]ç.Â…é£%ŠÊ&Tì΄AW«”j@ÇG?ÔÙ«wWÕ ^¯+cýp?\a« [Ë?içq%ÊY[q÷‰¸’ú(úÊlèÈ1‚*ÉÕiWõUêók*r_ªÿz*9¹ý§dF-y°bmå»ß™+xÚêˆ\m™)ãeÕa;®°îÍ•½YðÀ\E£žq†àØáJÙ¯pºå%ßûá#¹«ë°\õT#ÐÝ­Þë”®é%c®ÊêUÓ¿Šr%»Å˜1\!„®lGÑÏ…DÅ¥žÈUw®ÆÌËìÂЇ|H Ž®N÷ìÚ0íiK4;8fW Üù§ÆÕ²Ê¹*¿ê«ðtÐåjŒ¾Š²V W;àÍN[чÊWaÐö%:¥˜¨!`~¾âvÉÕØÞP*¥®F=ÑcP;?¿Ó£pµí†ºaúµJ10€…BªNx®¶SW#;Š¸Ø‚\õ& …Xrµ#uåd‡·iÜ,gCc¶Û:W˜‘« à=œ^\ÕÝ;õUâEDP‘õ} ˆž£3X¹Jè«¡íjÜ}=è;'kü§#p5k¾º‚ÁF\¥ mt$ ¹TÌþ¹šÔ  «Í_”°ß,aE®Æ¸Wã*|–õé–²=Ä:[…/@®2ÜvŒÛTVôLú¥U&€¾EbâM.{öÛg⪟-T¶—;„vò6ó“«ž\aláØâ:_½À Ô„ºrujÆŠ\ÉËêò +”TQÑ£ X@xNê%ñ‘«f%…` ìÏÁ®`›©²N]¿^h9|äªÇeAAnV¨Ð…ÀÂÊ´{A%XäªÒm‡ÁÐêÞu_Ý,õ®”¤r5€«Yª4w×YêËrþÖ’êˆá§C®â\Íz¥§™ï'«ÍtÞý“«Jÿjæiɺõ$(ã W5XÍÖ©ãW©v”›Sr5Ž«mü²^d9ßS®%W•\Í«®º‘ - ƒ+«Ãqu3ah;\»é¬4«d&¹:„Ûž@#ÿ@íÐì¸]h¹ r…-vEëÔñ˜l®h“W…œ¹ÎÌde²•÷Ù¼rÚ We\™½É)®S&Y ˱quýpµ?¬l\rÂ)òœb¯"¹Êp¯°ß{<ŤäúSQQrUƦ]qnÀ«âq$£íŒ‹f\”齪:<C®:se(I;ÛúO®\‘, Éóúr?í`¶ÅŽ\©úŠêʘÔJNT§OÅîý ý+][IrE¿½Þ©ß‹Ľ±ÈUöø¤_ê†\ÑkŸ“«oï/ƒôý;ãjT+Ɇ ’±­þò„w—>ãÍ®¸"VÔÕgøíýBÓÓ«ŸÈUqÄd*¹$=à¬_ß¾»ýø9` 1'V³p…ÙÓì“qcê+¡&qÛ§Ÿ7ܧ/ÀÓw.?|ùa_þÃW½f÷cžà×·—ù`@[ÍjÉU=Hs ðÜ\á0Ãûh—6©ßŽ]a5sÖŘùà‹WõygqÑ.â<"WO¯eÄ\—+lÇÕ•¨ÏÒsÇ"órÅ”¾™õÕ—_œC ûŠ‹†sÁ>ÐŒâêÛŸ|PôÕÔ3Ÿ+j®É¸z¢×‹¿W®&5Øk/h}÷aÍkØ W‚$b5W“ž6C_ –ˆUí’+W_í &<ÚU}ùáݾƼ1ýE®\®hüÈÕ°2£z äê1¹Z],äT~4®@®Z],àø˜0ΰ½-¤«h‘ rÅ©>ŸÈa¹"XäŠ÷C®øù@8rÅû!W|Œ| 9$HäŠB®ø¸ø ‚+F@ÉY"W|>äêq†‹šŠ\Ñ’«=pµl'$\äªï5€é£äª;V„Š\ 1ƒ‹\õÇêñ¹ÚÀ (z•ùŠô{“ÈUØ·šMÖ>bGõF¾ˆ\m`g"ëRñ H­ÿ¬=Z |<óžs¯\éÏÅÚ­¶ÓÈy'¬]Û@2«2Sv59rÕ¨­æš™f¹:ÝÐM [˜P;%ö7À VuóÒ˜µê{ÕÁ/Ë+·C®tK2¯ŽLúû_rËûE®ò¬Éö&ç 0*{Z rÕAÉß `Ý­Ûi †¿e W-¸ÝêõÝGa­­TPôvŒ¾Øâ׌\I­¿Ñö\­!¦<®Ö+Å–Ô“«*'yÒ1ÁçE Ï»Æ ¿Ä¶Õ«`\´Ê°Æ´ÇˆÝ†~5%p׈êç( Âo;©!WrâŽ~æLC¦˜÷ì>ö›¨ÔW×xÓNã’™ïÜÕ.~KÃUj]uÉâƒéÒߣjÜwc¹X!x9KíöŽû#~ßEÐ.ÚãְˉÆ,m&ÜõìrÄÉÕVS`?uÄ"h‰'; ­Ú+z€ æd”ô@ú*ê@éºÍÔÕ#ë±:¼ªJ»v‡á ÆÞJºØµÔhÇyÔ!uø7yéʼ¶–+Y¬~júÅY©¾ŽÕž¹ºa4vþnq\²JçØaÕG¦j—\•ì­Nþ¬6eÇ÷ØÉÕ X^®oƒ%XûãjT&§åM5(l…#q5p[¾ü¡¶ÜÉçx÷× WÅ!/9g\­ ßCúÅÛÓÊ1“££MsöEï‚«¡–f],õ ³„Ñòú0Z1(›$B‘ùåKàÃRµw®¬•˜a~••cåïy  ¥Gf ‚8>⨼Kkÿ‚ÜãМӕÙÀ·:WªO3–,è/§ýããÎ½Ï ƒ’l|Î¥*§ÇQXEwº;®ÆÎ Õ‡¨š»‡³EîÕN¸-œB?n•äƒøí›¨)•›–)6¹"WYŠ ª­ýøW¸ËŽqöôª‰q5¹§ú`h‘+Ê ?!×žì ‡sB¸fçªcMzÊæškb®ì™âê—|Í×ä\yiëâE®Z/„$‘«^…\Qȹ"WäŠB®(äŠ\‘+rE!WrE®ÈÕý.„²c™—+ÊÁ5¹¢+ ¹"WäŠ\QÈ…\‘+rE®(äŠB®øäɹ¢+ ¹¢+rE!W”ÇäŠòhYÇ} ôhìQñ+rE®È¹"äŠ\‘+rE®ÈÉ WäŠ\‘+rE®( …B¡P( …B¡P( …B¡P( …Bi’/¿üñù߯o_v½~þéóõÿKŽ^*;ºþ¼7©;ªíÄm÷Üö¼w#_ß~ÿrŸŸ¿ûp¨wÏ¿{]xôí ²£ëÏ»bUsTÛ‰Ûî¹íyïFžß–ó}>ÿ5æÛû×ö]ç½Tv´©>ïMêŽj;qÛ=·=ïýÁÞ\îðãëåË¿ÙG/}–ªóÚPqTÓ‰Ûî¹íyïJž.oßï=›ù7/wøî¬¬ß”½Tztýyo£RsTë‰Ûî¹íy³…ÑÉ/æÞüóÑËA¥GןwuNL•{Òrâ¶{n{Þ;ãjñe7æªú¼­\µœ¸W÷=1M¸èayŸx—§—£klÂúçíg[NÜÁ6Þ÷ÞôÕË}¾YÆ«à_*=ºþ¼Òë}×ÂUñW´ÝsÛóÞW—{þ±tÞûÔg¨>okœ¡åÄm÷Üö¼w7<û‘oŠãtOmqÑêóšÆ¨bˉÛî¹íyïÎ~|vwÞ]#wë ×£«×qjÏkÅ+WAêOÜvÏmÏ›B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( Å•¯~ÊúÌÓ›š#)ä**Ja2rE!W”{qõt©ùíý›Àù·/ÿÿ—Ï?}|õw?ßÿ͹DÙù€—¿üéËOk±I Eáêãwε¿½¿"ûøýÏÜœ¹úéE_}[¸Zþòt=ˆBѹºÐñôRvñ¬^ýt.¥xþ/—«K‘ÅóçƒÖ‚žŠäêR󙘅ž§óo>*\]þòôê§å >GJ6W—>3W·¿œkyßê-R(!®>£B_Q(9þ•íEyþÕË/ÿŠtQRóÁ×Ú¬ïÊÕùŸÏ¿xþìòÃ!‹XSZ¹ºxHo¬ø•¥:¯ãà¥Æ>ðúéú—ïÿì¿"V”rîH ¥«œ;a}æ\ÒY^l]r …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P(””ÿÍLendstream endobj 93 0 obj << /Filter /FlateDecode /Length 519 >> stream xÚT]kÛ0}÷¯ÐÛœ©Wß,ƒfkÇJ)ËKÉú:^fpìÌËÃ~þ$[rlPK AWò=çžsuíõ&»ºYbShó QΉV)© ãmöh›\`Éd~< ëöÕþ[[5çŸ áþz9><º-]jŠòߊǸ­SÊ”&V›7+k»]s(<œ®ßîp×WA¸aÔ¬Á‡8uéïw]9̦é¹k+¦!l›…®Ÿ+¢@Ì/²n›ÔÚ¼Þ=ÁÈLΖ.ì`*„“âä.‘QPZ§FyË.0Á‰äÌh›Dpèó°f!b’+!‰W.’Zæ®ËRP#’éN4äÅi¢h¡’ùª/ài=H»Ž}Ò#À[¯š6£…¾M=âuÓö‚¯Ï\ãaÒæ0 œMÝg7›Œºr€èø‘£ ˆr/nqÌþdDq%EŸ1 ûG‚³~WwxõõÈÑç6ûî~‘G^> stream xÚíÝ WÛHFá"†d×,ÌÚ‹cèÿÿ7W¶ !ƒ-õG½Õ÷ž³³œ3Œ¥‡RK!&%""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""ÒË(x\ñ­|pàŠpE¸Â®pE¸"\á W¸"\®p…+\®W¸Â®.}Irø«vú2‡+z¢‰Ã•&b}»Êzn“ H¬GWMì4p†+gœÎß•*¦ÎpUÉÓ"D}ÅtÕ…¦¹Îp•‰Ô¢×Ø å N“|áê"S8ºÀ®0U®>5…¶´]a*?®Þ]aʳ-QW˜rNKѦêØê˨êÑêÆ¦jÛêÁ¨ZЊî TB´d\¡JJ–ˆ+P5§Ðª<ÈŠæ U^hEr…*IYÎ]¡J–oW¨R•åÙªte9v…*aX~]Áʯ,]W¨Ò–åÔ¬Äaùt+uXŽ]q}ËÒs+yX]ÁJ–CW¬­Àòç V:°„\Á*,o®`–KWœ3\åu« °|¹‚UX¸¢ð®`–;Wœ,5X¸¢j WTb`yrÅò*ÎÀòæŠ3c`ኂ»â2èBèÌç)ÈÀòãŠq…«R®8K¸Â^`¹q«P W„+®p…+Âù¿!ôâ V±®W„+\á W„+®pÕЬp…+ÂáŠp…+ÂáŠp…+ªæêév9þs7~µo¸ÂUVW››ÃGw¸ÂUFW/¢v×?q…«|®¬®N\ q…«I®žÿY1¯p•ÙÕþ+ݼ®àÏt,\Aëj•6vÇÏÉàŠŸ¿"MWö®puy›qyõ|?~9®ƒ¸ÊÈj\³¯÷ ÷çû%®p•©çûqLí®VòËT\9X®X9„uš®tXù[di¹2XiÀ2WŽ–GV¾`} WZ¬\ÁÂUVž`©¹2X} ËùòÊ«äÈÕv ¬‰ã Wz¬¼ÀÒse°ò¿Ä2-W W°>e…+EV.`)º2Xy_b™š«„+XŸ³Â•(«#,\i¹Úâ*¦+c\ù¾šž«¦K†Uãõ+\i»pu™+cuå–)ºjK‰UkW W1]5„¥éª¬AËU³¥»‰ºJ ]mq5\áJÞÕ€«Ë\¬œ,“u•påÜUÂUÔU{³ !®‚«FKÜ•áÊ¥+vÕ``)²jq!<‡®Ä]mqu¹+Õ?Wg±òë*áʯ«„«\ ¸ºÌ•ÁÊÛÀ2uW W^]%\á Wm/„¸Êxôì*áʧ«À•Á W™]%\¹ƒÆ•áÊ‘+ á*áÊ—«³Yá Wº2\yqu>+ç®®¼¹J¸êƒ®&º2\ùpeq\Uƒ…«¬ã W¸êÒU-X¸Êzôï*áÊ‘«„+O®ßê¸rçÊ„]ÙÛ„]Y0WIÚ•ýª«ËX᪨+û(\ùqeŠ®ÞXzyE`Uqu!+W©–«¡ «¿¾C²Ãªæ*t¥7°Þ©z# W\%EWvâÊ‘®æ¸2-WvrA’V WÒUuõÉw‰é¹J¸jîêÓïo\yreB®¾úåÇ9aÕxC ê*År•r»rÇ WE`}ù[Ô2 âêé?«Ãÿo¾=œþ¤çûãâôäçLq¥3°Îøu J®&°*ãjcwÇv¶ÌôeËÃÂU¶EûÅ'ø×Ú·üä³^ÿÝæúg® WÓçÕgŸr{÷ëÃ݉©vù²®8¬¼®Îy5"®¬Š«³¦ZþyU~é^ÕU¾Uü1Ã$VNðÓíkòQÓÕËL{ü¾L¸*îjÁÕúúçæ&=þXaïÄ´šìÊ »p•‡Õ„õÕí2íF/£­ŠÏ¯¤V8W©’«Ç=þ7mæØÔ]ÅU`WûEùþžðSW³›Ã3‰»ÌóÊpUwÙnµ\ˆ®—'ïôŸ2^#×vóÇa†Ûаjº²œ®Ž«)'x\¸ëòOnŸïÇ1µ;Üîò=g¨âjÀU3Wg,ÁFWÇëd¾ç¢B«æóv§—ÁBÏEËÌ«ÒKw\ecUæçd ­¯j¸ªs!4‘e{-W¿žw~ñ¼}DUà~0Ð…Pdy5•ÊÏõÕUÕ•Èe0áÊ×…Ðb\ûpc`Å¿ ʹJ®jý=¯¢®æ°ÂUýŸUù™¾þ\™ûV¿G_ty5‹•ž+©Uø}?Š«„+—)çÝ™Éû>E¸ÊìJàBøÑ`Y~VN/ƒ‚®ÊÃÚæ…Uì F³ÂUAWÛ²¬p•ùË–„5x¿¢Bï†\ò28—•¤«$3°ÞÉʹåÒã*áʱ«r᪄+‘ aYVn/ƒš®ŠÃb\™%\õ8°\ø² ,Ït]¥Þ]ù^]áJõBˆ«r®:†å•¬«’°D\ù]´ãJu…å}\éºêz`¼ Zï®z¾%t?®Ô]õ9°J«Ôµ«Ò°ºW W]ºpUöË–ƒåúB(pÔv•º\a)°Â•¦«®J»ê –ĸwÕãÒ½°«„«.–ÂÍ ¾«þ–ÄêJßUoKwÕ®Ô`‰Œ«®úX*ãJßUW+,‘E;®´Ö 3®¸ê–ÿç‹äªô-áÐËUЮzXB¬B¸ê–΢WJ°ÜÿÝ®p®ºXJ««(®:ø»9Z¬p%2°\µr–«(®Š¯°†¸¬XÅrÖàü]Ôâº*%`Õ£«¤òksœ=¹ÂUÃÕ–ภä*,,½E;®–Xƒâ¸Šä*æÀªÀ W —î`•eUl\Ås –*«X®â-±TYáÊ5¬²¬pÕé•P—U4W¡` \%\9pUÖ <®Â¹Š³ÄªÂ W>bÕƒUšUÙqÔUqXCUº¬ºŠ«<«EYV¸ò«+\ù‚Uz‘U^UáE{PW©´«²°*°*>®âº’…‚ULWʰj°Zg…+_«÷¡+\u«"+\ù\º—€U‡UqÚUiX™eURU…UXWz°j±ZÔ`…«,°†\ª*±Â•wX™FV5UUí¡]¥:®^GÖ 0¬j±Šîª¬¹²*ªªÆ*²«°†éªª°ZÔbßUXSe uUÕcÚUMXS®†µUUzÄßUªéê¡5ÔWUq\wUÖYŸâúãÓuYáJéaÃDzÞéz÷okîZÍqÕ…«ª°ÞË:Ý",«ð®À:“Ö¢v5Y᪠®ûc¸Šë#]Íö£ê¢½ W©©+/UfUä?Ý.ÇîÆ×ñíÁ‰+ƒUUVå\mnÝ9“ÀZÔfUÌÕ‹¨ÝõO'® V\=þX\¸V~‘½ÃªÎª˜«çVnæU÷°,Š«ýë¸y]Á;¸ íÚUV¥NðHëj•6vçåñ®â>HjíÊ`ôÛk X‘YZ_X­·“½.Ý-’«_º»üö骫bÏ6‡ûAW˺aµbUöÏo|Ý.t««‚®Ž´\ø´ˆWei}YÐ#«†¶\µÁýશ®>^:®W„+\á W„+®p…+Âá W¸ÂáŠp…+\áŠpE¸:|Y ^`ílÅÿVpÅVpÅVpÅYÀ®Ø ®Ø ®8 ¸Â[Á[ÁÑÜvfvóÇ[_ÿœ»•Mž}™ûJ²íH–ƒ’íÕe5¾ðÇï7û½¾KO·sNæþÎÚÊÆ–ãfïËÜW’mG²”l'¨jO·Ëýqüöð|¿ßãÝÕjò†ö‡pÖVŽmö¾Ì}%Ùv$ÓAÉt‚*«_ûùø}ùúÏIßâ×ÿ=|cÍØÊã÷»ý†®Vóöeî+ɶ#YJ¶T·Í·ÿÝ®ÚÇcyüî˜r*~¬Ö‡C8k+‡É·‡y[ɰyv$ËAÉu‚j»²ñûa?b÷Wï4ùúý|¿<,Qçmå÷ÒfÎVæïC¦ÉrP2 ú®–Ça;o·7ãáËâêuµÜÚU†ÉrP2 š¢Æ–›Ãå{Üç‰cö¸•qào©gmåõ(:¸fØ‘¹åeGfž ¦ëöÃnÿ>ÓŒšý^èÞMÛ›õál¦y[™¹Ùv$ÏAÉs‚ªwÜÛ]ŽÛØõÜ[êñLÜexRá†<ÏŽd9(OPå‡Ãsþc·õÜG€¿ï¡?͵#9JÆTùJø²´iÿG¯ŽÖŽ“mG²ý9N–DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD$ó&>„+"\Q1W›ãÛú<ß/×vxW~¢ù®ÖW«Ãû¢=ßk½ ¹vu|«½ÍÕêù~?«Ö ,Êáêøþ›ãÇ·ãÄኜ»Ú®¨Ðú W”û~ð&áŠrºúýü WDDDDDDDDDDDDDDDDDDDDDDDDDDDÔGÿvßÚ¦endstream endobj 95 0 obj << /Filter /FlateDecode /Length 867 >> stream xÚ½VMoÜ6½ï¯Ð­°¢ùM)ÀHHÑCì-ÍA+Ñk!²äê#nþ}gHÊÙ Ôxc4±‹ ß¼÷f$ëõ~su­T•ʈd“p)©5yb´¥Bêd_'ˆJ3Î#ïRÉIßt©ddJ3i )ýÕ’º§²«\Ø•]nà‰+‡¦;¦÷\]‹<)ha„ñÕ- ~&8ÍyŠ]§¹$sWMMßÁi–“ÚÓ»TX_Zä¾4+Èà¦yèÆ°™n]Hnû4ƒœª\Τ¿ ·îýsców.¦–á²–¹ ôCslº- S^(ÈJ²E ç´ÐÑ6³` ¸Gš”“q¸kdkóh$|Å`M3 ¡·Ó’%n¸-ïc¤? ±ÏM?ÇÀ<º€ÓtáztýànÜຠ­÷IÞ­Yn<™›ÀÔ;õÕo!e9¿Üpñ„ã¡—’Â{ó[MMnŸ¥ìIïsI¹¼—ýPvǵ™œJ«Ÿ1áÂâ‹M]î¸ü_¸m&÷_Ód~¢çúÏûâøæ÷ýß,á_”Ü ÷6©î6o¨W«ò'KKIá7Ë‚WoïTò¦ß¼‡ß6[p³à×øA{ö…)™¤\ª$/(” ,ÍBñ_ ™¨Eendstream endobj 96 0 obj << /BitsPerComponent 8 /ColorSpace [ /Indexed /DeviceRGB 36 503 0 R ] /Filter /FlateDecode /Height 600 /Subtype /Image /Type /XObject /Width 600 /Length 11947 >> stream xÚí‹–Ü8n†ÿ™)wvcÇÞÄN¦“Œ½6ßÿÓ] $Á;)Qª笷§»Tºð‚ ` …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡PŽ' œ\v⊯Öɹ¢+ ¹"WäŠ\QÈ…\‘+rE®(äŠB®È¹"WrE!WäŠ\‘+ ¹¢«Ãs'Œ‘+õbróÒœOÌ‘ÊF®¦ãêÊ‚Àâ†Æ“wxGyn®”B4hÉÐέgçÊÆÀ¦AÒóø€ #~ïr8VÃ’«é¸ò¸Æîú÷ôWÞÿ]Hð¼,Ï.‡¿=ÕçÓq…;(ž™sµŠ¿ØÒ`…‡%'©Y‚óùZ«MÝ*e”lj÷)ѧ ¦ÜÂî‹ÕSqõxë]ÂÜ14ÕþQæ®ò‘®žÿt–˜2¬v< WR!¬îø:¤îÔFÞqwÃÖÏZ©fñ£Ù…­§àê1ŒÓbÁÖ4 ¹úêN•wâÎøÁì`›+K3Y6ö”ëGÚ·|+e¤î—Øš¬3såè 1ŽÖjŒ°LèƒqûcFƺ¼—‹\u‚êácHgJD–¬¿Ö;W(%k™Hô(7gê¬\yšÎºËÃW7®ÂhBºèÊŽúJ܇õœÑá<…Ÿ«›6rfZ^¼Z„üXCÏ5“8teØ ¥h‘²ÂÂsë+™¾ûãF›ú£×ëgFs%ŠOƒÌP½75(»Ḑ8ö8­›e`“æf1h/±<¼êmf¸êÕy«Q”ÄÆŸ×ÀuB;h~°Æ·ãµ#ñÜÊ—ú†c».h6%Q„­±úsÎ×`”ü”‹%©eÿ2£18N”Ê’êwÅÿ3©ŸHžÏÚŽ’¦æ½Ü€L纷UjbâÆyœa©Ñ!‡´Ï—óšD“€º¥Œ«‡…³'xkìÓ ?Ø«;m f #˜ºÒ¸þµÓ'tO­×Rå¹ì Ý!âë“ӞĔ=ão‘’¢žÀÒÌH…%JÅN+ÇTKßÉó±e’Õv£æ„&"|@®¤¯éí¤±Q[¿ÅÑ 22o?}/q†‰Aµ²Z®$Œµ3½‘q«MwÛ‹hÓ[óøí…κ•ŽŽGm(„þZ".…3‡ò¡…ðEœ{c‡t÷Ú ¨o±ÄÜóÁ¢Bj¼aëj™0c–…c¬LÝ÷ n­aûJ›²8†ß^òRƒíjg0µ¾*p ÓîeŽÚ†GDH½ ¾®S‚ȲÐf´ µêßW;Öa8W]'n¸’ÉndüÏŠWçF¶Z:ü”N@1ô/Øþµgçʸ{2ãUññ ü§µThœ‚î^ŠÞ\AãÊþBkÝ)+C®"\YëTÉôÈÒ ‹·æªìŠñ¶Û•©«ÌôJ‚q÷h'"èÀX™ùýv+ö tàÊ Oi8ù#ŽfCÒ±r²é Ô••à|FlcŽŠG˜fVJh»ðeà‚\)üâë•aœj-æ8eî'_wö+ŒâÊ ¢Û¡QÍqr¡øö`ÙaEx.æ¡ +Ïï_+K£‡÷èe¸–Ÿ `œ­`5Ǹº2N™¾L8 RúK0Û:ŽS*ÁÀŒãÊÎpp´WŽe™ÄË >hseÏ]ö)±WGUàv§[Dæ'Ñü0d9w¹:Ê•‰ÄHsfþ–i0Qì m0'\wŽé>n•§uò&”¢—¡¯2]ö`;JÃ{z®ò ̡ǣð“äBÕdzµõ­;üPèå`ù¢5ô!‘ÛÁL i4­Có5¥ Äp<ˆŽá·“©:ÕžƒÜ²-ˆœDßÜÙ®ÑÒ&w¦CAg÷&°Â\5./‹6°³ãý .Šr°ür¼=Ía¨`wá"ÿ®~~¾½ˆ¿þYyÚò¶ ݾ#-LšZð‰2ž TŸFVª€¶q º)ð:ÌÇÕ >Ý~ø†5§-Ë¥•so®g…2«Ä[R¹‚)ÖW ãk­qè ¹úùy¡éåÝ_e§­*M€&;”lÕWVÕ4¨Š•¬Zé7¤fr¥/×c;®~|üôøñ[ÀöMómª„˜n&Ñb`e÷6›(‘’œ¸{é@f$¡C}½3¸ {Âóè«ÖpA‹½Šö oÒWj)oU_-VRc‡BÞÒ©¯È9(6iÞÊ¿úåËí‡ïäûW­›VU¢x×D þd0íp§¡ÄƒˆÄñ ¹*Ò¡cæƒ?>Þt{@[8-c Ýí«kÞaô¤â{é­z«&Ò'ÑÝ¿´êÂÄMû £\5]úNÓײgÇRYùÝôQWŽßînˉ¨ìMV™™ €_ÐÝRÄÕîœ9`ƒ¾»ôpZÖ_•dx$!mFJƒ.Æ—éó? <×r'àêÇÇרUC\t XYŸÐZTô0ÑW!ˆÚmÐÑøûº7Ò Ú'\µ»ž:qõòÞŽ8l &‘'9‘Áª¶Ð£ö²;„X£[‰*ð=öé^Wð hUcæàêNÔ·Ò¸èsÂD¹6¥ÿs£!T‹y‹Fw!§«¥­¤è¶ ×(®¾ÿýj(‰‹öpŒr³£Ýçí2U­ëºj¿‹uCŽ ª©ÖWYsXµi°u×£5Š«Ÿÿü²ƒ¾j©Me¼ šZì†Ì ß Ñ'áý.Q”k5ÑÚpZ®ÞžØûŃßnZ¾`Ðd"ÄÐÅowÔ‚]¯]Lä´,ò‚ e±çµjì×Ýò¦±êé ~Eë—/k^Ãv\µÞ>lÛÔÁFÉŠ½Ijx 7ìƒÜm~jŠŒà¸±Éýi⢕\A 2ôŒ†ÙÎìæVñ °ç+;÷©1ŸSè˽Œ«æ#`¬ÖÑݯk]]†¿bm'kI¦q6W0¹\Á+ÓPJOŒ!r ÒÕž–Á²ûz5•LšFd6TÈÿ 7c±ŽîYñ¹¸2Š#þIã~øJ¬FÛãªbå¸å¡C†O€H>„qV.û¯ä?Wv?À¾+˜ðÜ7Qœn×%_¿!„ÌŒ©øN.+l‹éø¸\Ù¥øWXºÌCtpÍ®W‹Íúœ›/éˆäpÕ˜ D®œ™=:åVX‹MÈ}ƒ€^$ÄU°!F®`?rÕÈ•ñüŸnWc%ÇX©vKOí”PóYÌ‘>‰œÂøÍÕ"È~•!ævƒ³GmmPˆxÀêÑ Ç3—%KÂAïYåž:ÔMbœá÷ß%X}Ýu­ü+¼ª!·Ûšä¹Îá*™øæTÔÀí¯Øo‰áI¹úýw VßLVUWÀ*@(RIo6¥ñ´­¦ßø)£Pyo¹júÚß_ÁBïn"P·ÈC:u€U@Ðâd"Bé]ˆ‚´ÒèÞd4f“«U.WY¹ºÜ¥ëå( +b*d§éá@þ—Œu§£Õ4±©®œR•\Õ|íeŸ«Žp©«·0, ¶›DÄÀ•©k ´\Ÿ¿ªM®Š¿ÖeGØÁÛÓìÉ–Ãì%]/·!èø„Ú@?b¬õ;rU¬L‡¥Ñsq•ø^ ™+qpZ‰\y +Ÿ«5Ó9–­%§Š­…”!{Y‘«Êï ¡²h+gh3ÑB®ºò'û '"Õé}JZÇZ×JÄÇÈUí÷Æ Ñ±Zª>­¬`»Ý¢—b$‡P4aTvU4­ @Zg„§±ä*Êà#4²9hE¶öc–îÆW¤2í ´V•=·¿ß¹lr•ãýñÎÉU±bÉ}˜Åjл]Dëë¯ó»ˆºr(­ÜìèÌ&Ù WB*¡’q)ùrŸ«Ô,¦˜«Ú'*7Ÿ®PõÙ4r>®jüë²GY>É„ÂM‚ñˆ4šgÖXK^Ï:råúè*«Ù`)Ë8\ÁDËõéÏ›ôÕº‰(Ž]N{Ū¸Ök…JÌù6„Pˆå¥ÛÙVñZÉm¡»xxk¹º©’ÂDuT&HÔ—£bIJ¯âÅ#VÆc²:6Ðw Ή¹ZF»hÙ 5¬ 7K+“lóµtFš+xÖ°^M]GçT\‰±– qs-¹K† §UsAŒñV#Ó8×VÇV@®²Üé% “^žGóÕpem¢œˆŒÂ±×ÇÈ›J´? WÖ0#]Êí×+Á•p®äVy$Wr=¼+"£äªØ*!êûÊœ'tBÙ¤Æ?àÄ¥šc#õ¾"w¨Àí`ØÙŒºmÁÈúÂÍIlQ°EY˜BúÛx´Üv?g°"úŒ“p¥Œ¯µkÁ®¾l€iOŽLÄwóN}w2xªÖ¨ÁŒÒ}€äª+¨Z껃%jëç·ø¶“ü<†"½VéP pűW‰itØ.µgs{P/mèó;1ǪðûÍ#Ñ, e†ã¡°3r…>+Ì ¿/.Ô X²Âc9W— ;­ÉñéZŽ­M%έ¯.®ü¥‰@›u˜Ž`-¥8"-Ã*¸Ò‹îi½Âìr¥‰¦x¡KjÆìø\…g¥"ŒÞëݯ!ÁHp¥G&œæÀ!`‡*¢o ‚\µ¿k‡ç*2ƒùÑ—ÛS$UçÝ ÜoÀoq@"‹ÆÊ¤BwE} y-ôè` Ë´pPXëŠgü«Üžä è>@Óq…Ò¢{q¿éŠa@ ·³ŠÉ:Oüaõww_°0DV x†–~{Ìe·ž/Òº"ؾZq"¦²Ò\Üè¥þŒØª}7f‡gV®Ð®­üR&˜kÕcÊz1VÙâÂ…œˆÂ² ‹Æ”‘Ü–ï€QZ_% åp…~\=®ÇÞ÷€\ùB¤'„¨üµ‚VJ;òTÙp•U}H;á]\,·èYÆl+Y'H ˆÁÄdɽËÐ^»nÃ53Wh³‚Ú°Fš¬õ9ß®(ÉUB…!ØwÚMXßõi³‡­ÊúJ_e–µJÍËáôépMV3tÖï è•ýþ(þ^3À<+WhÃÊ Dì :ÁžQïnÄ”¬…}–än¼pºD³§ÑWhÀÊýè.äí°ÈKáJ™<ØË‹d†ƒð|ïÀ»âmøqã OÍz`®ó)Wi»l¡»+À•2U„-±„ø|Fg!² –ÛÃó‰ý+jÑšF® ŠwŠ-a}4–¿ûOëaB{7b\!ùpà¦rX.$€¹x¿ÓB)F[v¼^¯öaŸr­ÞÅ!ñBÍR3ÔU@Ã*µFd©øm†ÿóA¿Dåá:W+^¨`!äëAå*œªü ”›†hó$}5ŒBã q´`¨˜à¦Êu31…¥ÚC-c¹.A0%Ïë+g”îäÏΰ 87î Ý«VÜ%èT, H:R&\¨!§AôXRŠX⩸j«Ã¨8ÍðÂí\ÙkЮÿœŠ~è½ÛLWÎ3ƒ¬‹}Õ4|dzƒU+m× ´ ƒ©/£!Îâ*3ªæ"§ #+¦®ê<½¾ªÀ*<ˆK7Igàìšîm-l“uIQ®€ìá žÀi-,Ÿh?Ù|°:Äšú©ï;Y+"BZë*®üØV")ÆDã`¡l,ê«ZŸ=ôüD¼“&GËRX•ú Ž]×%MpµnŸ¶&WMm—-æ¦ës¿b‚LÆ*äJ´iwÛýðª½úüì\¡³T ])²ìÑX{‡…%D†jÑ÷öêžÁÈu*AS{ù™újV‹eה餰씫¬Z® †dLzWÀp‚!C®:p%gÛé ‘-Á,Ñd`¥Ur›8³ü~NEnûÓÌÛ±²éJ]êni­’ KÉ«ÕÑ"aD \€«äe¡Œ«'ÑW—®\•ÅÈúN§¡)䤈N"¿Æä=C^Ìç Œ‹öÄJv z?øÁ„‹e›Èæ›ÜºHë+½é}Ër(NÂUO¬–s0ôeÔéæºÇ¹ ïBÍLFÐû·l>4}…œyæ™õUW¬¬)úsµ0qÝG±®§¬‘N$• {sC´ž·='ô •ÚL®:c%ƒÙ±=…µºP(¬ l_€Î'æe¦°ê\Éík:W†\õçÊŠË¢“¾z ¢X( ô‡@8pW¸?ÉU@_3.Ýý \ÀJÍëí°[åÑ}ÖzŽ×})ÎÔÔeZ±k÷A¦øE¦äª÷´Ð3ah)g +7¬H¼KWW9Ï+”D™Ê ï«å gáê2+½m ÜSè¹-#yŸ†S€å*å]¹²f§Pî5†Æäl^:W—a\¹Ìú^·w­÷rù׫˜L®`q•ìá£U‡´¹qÿÈg¶ƒƒ¨Rö²c-äٜٷzkW¬^Á ùW±ÌÖ;è˜CIeì?„àjVn'[ -\A ú¯» ¨Ô’Òxø6VuO”&UÛo RXäJ¼ï@¯N"íwÁêÍêÓÁ6®â¯B{.à*÷¶»ë«ñîÿ>ØŠ«X-î ¼’`ÉИΕl÷L%FWûíÁ•oT,>cÈ>¯o¿|yy÷×÷?>œ„«`yá&C(a€+a½JþK¯B zJóѤ‰¼ $Í\ý|ÕT¯\]ÿ·Wc±rÚ¿wË{ƒi+g•0’¢žÜÍq>]!ÅpéW«ï\ýúç9¸2b3!rÞÕܯ]†TWW¸gºM\ôF®bã¡—wË›JwÖWï¯\}ÝF_ÆÊnüÕ¯ýL†7DБ m¢Èž*d*,iòíwçÊ|çW®^ði 5yÏ•u=j ´Ås¿ýø†ÕÅmö׉+ß‚Hk‚õB\©Å+ò±n>üòe ó»VúÌ ­SBg9G¬™ì4Š|9èI…š­“áþq¨¹ãW›a¥6–\²,«’Eé \.öNÕ|®çé ð'¨­2׊M¶þ\m‡•j” x –ð±ð{¹k,½”-ÂÔŽn°2½µ ]µí]õÕÕÞeƒùàÎ\QÛ vNhM ¬ª°þEØ{®çÊ„rbáµ.0&s z°”[Dô¥ÍÁB6VØQ_Á 4UL5Å^“ÝíN£ïÏßrúmå-½1¥ûê®ñ«·8ÛlgØP]i:BT¹3@—Û¼ZB¼7ÈuJ¡eZê“À ì/¸KÛ8¬ª¸è› ‹ª¤¶ãJên½d®ëe¶9A/1OKz2HÙb(V×®SòDúêrÙR])úJB·R7K þr^;WN+Bw…#†±&.º‰µ)U_Ù5ˆ=¸ºØ5™M0X•‰Ub¶wú/!¨iu½cœá:)lÒV§Ý+µ=„éבZdxªlr•4ƒÖB•¿…bHǸãW{½¶þ&—ëÑC¦¼ôëíîhVîs…¥±Vûrv¦zí>»ç"OÈÕß®bvâÊê§Ó}Òt¿;½:„ÇUÆISÅá¬,v³UJu®–Ðhl>øósâ3H=x¬ ­ SNÐîÇÝ…«æjí¾ZnMVÀ•4[ÕŸ§ÑWßbX-É7?û´~,Xá¾P±>úJÜÒ\¡qpÅýÀóèîц¦†¼ìà×÷mµÐÊ*Ý›«p?T™›r®rôU^ÞUNÜÔOÍØ4†’½¹ŠÄE|üPk²#húç\ijâaÈNû¡Š¸ê³1ÆQX’+Ùê«ó”pWÕúj3®œü=ëÝCðÍìðì£vÐ]Ì (9¡r%r6 f½éÙLí“úññ}„¹GÐ4¸kgo¿]á*ª°•‡šÉZïNË2À€æËÖôÏúöuÒê׆K»qõ˜F£É•ÅFO-!+ˆDÜïîÌ^ÉÊ[©áÊv¤ ·vȺön„/èÔñ«Ëeã(ƒÕC&l>Zäzw2±Á¸Ž:úê+YËNuº°Æå×·+ç`ÃÕæc•vEô½ìá¾ã­4Ôn6ŠÿÞIaÁv Ä²'d+Ê’îõÒ«ÿþ%å·7qu¹`®²w¬wðßq/Š… MéºYtIù‘urœåGÉ"%Õ¯®ÛÉl\Ý×e·æ*{¹0ÍÊ$È••Ü+hDY­µrÖêŒ&}ßbä¸hÖÌY¢t¹=PŠ·ÌÏÄÕ>XåÇ®:ë+ã‚U¥¯Š\,d5³Ö¾“Ë óǯöâÊ òY´â¾,5fü¯ëϼ<%¿ì¶=?nØ»:W»aµW·F½±òSéó•—ØÓR&`§:øó˜H°zmÛ- ‰¢;Xý¸Ê¬ì†Ý;ùNLaÕe`#ä¦cvÀœ'.Zª®NÀ՛ºèAÙQA¼e!ð±-rÉé“aP¸ËÔÑ<:} À~—³ß.JÌ\û3ò)`e˪bíûRÊ‹Fš»(*¡üú9{Ãê~ sƱ»ÂêÒ¯]pÕ05­ s˜ð¦ ,áDê{Xauáê뻿^Þ›ïWŸÃG5ÄUÙk®ÖA±&ô‹ è]u\iLU¢ooõÛßã*ðÁXËÜ^†0Ôô£;ØA®L~½vƒΜM•I¡ý|ºqõý^ÿ·WÛxbn†Èø– >XîΆÞ>“H¶ R'\U}LÞæ„ã¹ÚÔ—Üó¸‚鯕–Ö¾IV2öÓ(ÝË1€«k@ôë‡Íúãlš\¹0Ûr…{¬AVêZ)Û•M½ø<’ñ¡ŠKuÜ_ç„MÓÁ:}µWÙ›Ðí„·X¬$cöàJôýÕ{»B½øY¢Eû6w~0ž+Çñ½,¡I»9tk6=J–y„»…ÖŽ ä* °€^–~¸¬má”ÝÌÕ²Â\uΓ²p•7ÁïˆðX'„—»Ú©,DI¤%‡+Ä«)¹æà*ÑÈ¡#WÔœèM¸BWˆ[ÁÙ¸Ún†²ƒ©«ÁÕ#¦äŽñL9©3™Íé$Ž÷çjÛ´«Ž³A#{çÀlÏ•L\@W‘” õÕÎVVIÑ®^ûbRìFߊ6¦­Üh,RÚ&ž1G®&ájɘñ¸ìØSƒL®n;¶/½xtŸ¸ì<Ë‘3¢¬ËAw®ã·GÒ\¹ÎmWó)4\Æ^T^î-š®VåêV¼È©¯7|Š µ¸[êõ½‡Fz çþ\ wçôvpU”·jkð®#“°ÔýªIu‹ÈïÁÌ\euìÀøËÊÚm…ž£¹Œ¢Õ;ǤJéÂÊ÷ðÔWuÌÌUžÂÚ@c!‡öv}eíã{¼1Ëœ°°÷RÃ… lb§Vpv®Ò¬aƒN9ÈÊIíeaï½7]Dx*1~òþxl®ö¸2ä< ®Ëƒâ}Q¹‚Ù‰«hUŸ{2‘g:²Ïn•Ì€å·lÆUeKòËEV…›[_!¸)»q…aÕÉš„²‘Ắ Þ)Ž:· Gj6µ°—`·æÊ)2ƒ‘Ñ!Te/"«ªâdy}Y\a#®Æ™Aeqö°®¡•äâaY8W“øí\¡x|2¸Q¬Ëh®ÐR_+«úlúj®ŠKÖ†\{h…²éß ¸ä› øì9TÎÏžŽ«,¨ªm¼Ãþà}*˜ëû&6­Œ »ŒÊh®œ’x÷¹‹åÂô¿ÑÅe*g‹ +ƒ¨¥…ÐñÀµ¬9(øªfð~]ë‡Çá []ØZþI;o¯EJ(‡õw"î>W¶>‹¾2$úÀrŒ Ê‡Ææê2Œ«ú*õù5¹/Õ=•œÜþS2£–Tn¼ ƒ¶/(Ñ)ÅD «ðó—pH®Æn$ð†zP)u5ꉃÚùù]ž…«m7Ô «Ð¯UŠÙ,RuÁ“pµºÙQÄíÄäª7Y(ÄÊ«©+'8¼McO°œ ÙnëL\aF®6@‚wjtôpzqUwïÔW‰AEÖ÷) zŽÎ`a4Vä*¡¯†¶«q÷õ ïœ¬ýñ_ÎÀÕ ¬ùê q•*´Ñ‘,äRu1ÇçjR33¬6QÂ~O°P„¹ã^«ðYÖ§s XÊöq¶ _€\e¸í·©¬è™ôK«L}‹ÄÄ›\Žì·ÏÄU?[¨l/32„vñ6ó“«ž\aláØâ:_½À Ô„ºsuiÆŠ\Ù—ÕåV(©¢¢G°€ðœÔKâ#WÍJ ÁØŸƒ¬`›©².]¿^h9|äªÇeAAnV¨Ð…ÀÂÊ´{A%XäªÒm‡ÁÐêÞu_Ý,õ®”¤r5€«Yª4w×YêËrýÖ’êˆá§C®â\Íz¥—™ïÑf:ïþÉU¥5óŽ´Îd=z”q«¬fëÒñ«.Ú-£Üœ’«q\mã—õ"Ëùž‚p-¹ªäj^uÕ¬Xh\\Ž«‡ CÛáÚMg¥qˆ’™äên{üµC³ãv¡MDä*ȶhxØ-•­ß^¥ôsÛ,”Éí`òª3×™™,“ß~ÓÀºd鸼rÚ We\™£ÉŇë·ß\°.—KUY ˱quýpu<¬lÞÈùí·,û/ÕžSìU$WîŽ{ >+W%HÅ]'Û»'W%\aÚç2¼,®*G2ÚθhÆEÉLïãS%Ý«À”0õ8 ¹êÌ•9‰Ôc•¶ƒ±­ÿä*ÀNVÝãHrż¾\Å2;h"qÑVÿ*йRõÕy a§çQ¨®æâ {?Fb¥êïb+I®Îí·ÀãøWØ+€\eßIú¥nÈÈÕ”\ýü|¤_ÿ<W£ZIžÎó2éØVyÁ§ÛßðáP\«NêjÈ3üùy¡éåÝ_äªÇ8b²G•\’pÖ?=~ü°„˜«Y¸Âìiöɸ1õ•¥&qÛ§Ÿ7ìÓàå—/·¾ÿq,ÿŠá«^³û1OðÇÇÛ|0 ­fµƒäª¤9xn®pšá}¶K›ÔoÇ¡°š9ëbÌ|ðÍ«úv°¸èqž‘«—÷vÄ\—+lÇÕ¨o¶çŽEæå \œX_}ÿû5Ôp¬¸(`8ìÍ(®~þ󋢯¦žÉø\QsMÆÕÛ½_<ø£r5©Á~Z;xCë—/k^Ãa¸²H"VÓq5éi3ô•űªAråê«£Á„g»ªï|:ÖØ7r<°È•˹Vf`´B¯\='W«‹…œJÀÏÆÈU«‹œÆ¶·…r5-rA®8Õç9-W‹\ñ~È#ÇB®x?䊑ä9烉\QÈÔSpÅ(¹"KäŠÏ‡\=ÏpQS‘+@ru®–í„„‹\õ½F0}”\uÇŠP‘«!f`‘«þX=R WXÁE¯2_‘~o¹ ûV³)ÐÚGì¨ÞÈ‘« ŒàLdÝ*¾¡©õŸµG ”gÞsî5+ýÙa¢X»h;œwBìÚ¶PlÆ *3eW“#WÚj®™iÖ˜«Ó ݺ… µSâx bU7/Y«¾Wü²¼r;äJ·$ÓøêȤ¿ÿ%·¼_ä*Ïšlÿhr®©’Ób«JþQk´§-46þ–\µàö¨×·ÂZ[© èí}±Å¯¹²µþ:DÛsµ†˜ò¸Z¯[RO®ªœäeHÇŸmhyÞ5Nø-î´­^ã¢U~„Ó#öúÕ”À]#ªŸ# ,¿í¤†\Ùwô3/0 ™bîÙ} ì7Q©¯¯ñ¡Æ%3ïÜÕ.~KÏÃUj]uÉâƒéÒߣjì»±ƒ\YX!x9KíöŽû#¾ï¢híñhØåDc–6îú?9âäj«)°Ÿ:"ZâÉŽB«öŠž ƒ9%=‘¾Š:PúŸ3uõÈz¬N¯ªÒ®Ýi¸‚‘[I»–í˜#:¤N¿ãbâ&/ýBÙ€ÂÖr%‹ÕOM¿8‘êûäX™«6Aó'ów‹ã’U:G†UŸ™ªCrU²_´:ù³Ú”ßc?%Wƒv`y¹¾ :”`«Q™œÂ›j.4|ùSm¹?“ Îñö× ÏWÅ!/9ç\­ ßCúÅËiå˜ÉÑÙ&„9û¢ÁÕPK³. –zPÏYÂè y}­”M¡ÈüòÇ%ði©::Wb%f˜_åEåãXù{`žÈÅBE鑃 Ž8*ïRì_°÷8$4çteg6ð­ÎÀ•êÓŒ% úË)|Þá¹÷yaP’Ï™££Tåô< «èNÇÕØy¡úUs÷t6°È½:Wƒc¢…Sèç­’|¿}5¥rÓ2Å&Wä*Kq@£uÿ »ìgO¯º‘8W“{ªO†¹¢ òbpÉr8'„kv®:Ö¤§l®¹&æJμW¿äk6¸&çÊH+X/rÕz!$‰\ðB(äŠB®È¹"WrE!WäŠ\‘+ ¹¢+rE®ö»Êe^®('×`äŠB®(äŠ\‘+rE!WrE®È¹¢+ ¹â“'WäŠB®(äŠB®È…\Qž“+ʳed÷-xÒ£qDÅC®È¹"WäŠd+rE®È¹"W$ƒ\‘+rE®È¹¢P( …B¡P( …B¡P( …B¡P( ¥I¾ÿãÏ×||ÛAôþõ§o÷ÿ/9z=¨ìèúó>¤î¨¶·ÝsÛó>ŒüøøëÛ}~ûåËc >½þî}áуʎ®?ïŠUÍQm'n»ç¶ç}y}[®÷ùrýטŸŸßË»Î;z9¨ìhS}Þ‡ÔÕvâ¶{n{ÞÇ1‚|¸Ýá×÷Ë/–³^*:ú*Uç•PqTÓ‰Ûî¹íyJ^noß¿½šùowøéª¬?”½Tztýy£RsTë‰Ûî¹íyŒ««…ÓÉoæÞüëÑËA¥GןwuNL•{Òrâ¶{n{Þãjñe7æªú¼­\µœ¸W÷=1M¸éaû>ñ)O/;Gר„õ+ ÎÛ϶œ¸ƒl¼ï£é«·ûü°ŒWÁ3¾Tztýym¯÷S WÅ_ÑvÏmÏû`\ÝnìõÇÒyïK[œ¡ú¼­q†–·ÝsÛó>Ü|ðêG~(ŽÓ½´ÅE«Ïk£Š-'n»ç¶ç}8;øõÕÝùtܬ+Ü®^Ç©=¯ˆ3V®‚ÔŸ¸ížÛž7…B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P(Š+_ßý•õ™—5GRÈUT”ÂdäŠB®({qõr«ùóó‡¯Àõ·oÿÿ_¯?}}÷?¿þ÷µDÙõ€·¿üÇÛ/k±I Eáêë/_®µ~~"ûú럯Ü\¹úëM_ý\¸Zþòr?ˆBѹºÑñòVvñªÞýu-¥xý/—«[‘Åë׃ւžŠÍÕ­ç+1 =/×ß|U¸ºýååÝ_ËA|Ž”l®n}f4®¹Öò~Ô[¤PB\}C…¾¢Prü+éEyþÕÛ/ÿŠtQRóÁ÷Ú¬ïÎÕõß®¿xýìòÃ)‹XSZ¹ºyHDüÊ‹R]×qðVcxÿrÿ˯ÿùˆ_+J9w¤†ÒU®°¾q®Gé,o6Ž.9…B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P(ÊÊÿIÜß endstream endobj 97 0 obj << /Filter /FlateDecode /Length 1220 >> stream xÚ¥W[oÛ6~÷¯ÐCR@Å𦶠X»X‘Øà=ëh‰ŽµI¢§KœlØßáEŽÝȉÓÁ$Éï|ç;‡¤üv¹¸¸" s‘°`¹(ç8M² ‰SÌx,Ëà7‡¥„ ò®jBNÑØ„ORTË¡ÆR¹‘nM› é†7’ƒ³UWÔ*ü}ùáâŠeAŽó„%ÖÀ9ˆÅÍœ·OaÆ‘a§ÈP! ¨ÈÑØ+g6ÊYÖc[ •n{g¯êzì‡Nªtó«0b)RµY†vÎ6h·ø3á€)*ÝXƒ[°ÛX·~5`@ÔAM¤)Åyì%:T"G•á”Àp äV0ì5É'Mläݘ/Œ¯Í70ÎRdWƒ}·G:ðöjBëtß+ïV:[¿2¤ŠÊ„ ²öÄóN-¨g `?`Ï>¢$‡7‡Í+Sµª7QÜSø»ò’™ ìXÀჾ®çB¢Œ`–žÍheNåcÉiò Ÿ +¦8ñlX[(ßÁÆÕÔ>®b>†,ÃYŸCç—/…ˆq’egƒxFÛbsÉÈDOÝ]²ƒà’úLpŪro»‡úµ¥{ÒËÓ‚0N0ÉèÙÁÜ«ºÖ» N1O㯨W–BÌT<»={ÝÊ„_µVsÊ}lV€ÿ#‚ˆíÇá™E Ï–jç`LÅ“P‚EœÍh¥8!töâY_eÓ ê%p—=Eÿ<}ošeÿ>qe›}ìÆ?âÊ ®=ä¸RÝ­¬/ 3Ñl’z°ß–æknÇå/¿¾æÆ~È3ø}evy€7{6¯ôê‘ߪ‡$[ø%:g8ãçæ¹”ÝŸþý8‘ñ˜a–Ó¯É8OÎH>«†l‡ê8Ʋե͆½¡'©NÉdÏÉ­šÎÅYÒ;·û—`k½ì Ñ4Åi~ö%ð ð‰ÇB¤˜Àÿ·ë»x¿\˜´€îÿùQšcó h-p“XØ];%8³ƒ©ãÅMü ?Ão‚&Üèø­ùãyôGŽ)A–ÔW>(þLS¢Dendstream endobj 98 0 obj << /Filter /FlateDecode /Length 1133 >> stream xÚWÛŽ£F}Ÿ¯ð[°d÷ÒWèU&’7Ú‰e£(ë(мó€1c#a°kvþ>Uݾ 3Fy1PtŸ>§úT5þ´¼ûð Ô„+&•“åÓ„KÉ"OŒŽ˜z²ÜLV™Î9Ãà—:KÚé\¤yÞGA^N%Ú¬n²´Í«²™>.ûð â‰eÖãp³°Ò\póØÃþ9qPÁl¸´ `qTOþJÑ£ªÛâËg7Ý¶Ä Æxf—&4s=Ã茆TûñÍ6ýR.  Ñ¨Âû(H0ðÒ°é\É8øgK@}“y'‰sf5eêØÀJá4¸Ä°¯ÊG¼í²‡÷íÎGc U– ¶ññ¯HopÍ:)Ó¼I+zÎÛŸ³Ø7¤M²‚QlÎ †DÍxjßB©ê¦¥¼ø àƒ žwYQbwÙ ¨«¦ñï×.>¼É§ÌË­®v@_îÀ±9½ÞµƒÛ” ˜öúœ=%6ÇÁv| u¸M=w„8ª:XŠB·Wf¾a]‚﯄žÝxͬŒ­í…žòø5„…/Òï­]y âôtJm'õº[¸¸«“­x£$ h…å¯:ƒûSåïÿêDšb®;Зż›úv7ad®º ?ïÆŠS7p/þ7  ®çEÌýR1޼û¼¼û<^[ñendstream endobj 99 0 obj << /BitsPerComponent 8 /ColorSpace [ /Indexed /DeviceRGB 34 504 0 R ] /Filter /FlateDecode /Height 600 /Subtype /Image /Type /XObject /Width 600 /Length 12743 >> stream xÚí {;r†?ðÙ 6ä8 Ðÿÿ‘±g¦»KRé.õm¾zže}l»[z»T*ÕÅ …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡O@9¹lÄ_­“+rE!WrE®È¹¢+ ¹"WäŠ\QÈ…\‘+rE®(äŠB®È¹"WrE!W‡ç Nü)"WêÍ䯥9¿±P6rµ;®®,,nhÜq0Iq‡és”ÇæjF)Dƒ¦‘là Ñzt®l l$=Ó/˜8âû.‡c5,¹ÚW>’w±»þ<ý'ïÿΤ/˲ËáoKõùp\áŠ·Ì¹Ú ÅØÒ`…Kn*R»ç;òµ W«šUÊ,5¬a¨ù¸O‰¾]0å+ì¶X=WÓ[ïæÎ¡©¶2?è*iêù£3ÿŠ)ÃjSÿǃp%ÂbŽ/SêÎ@ídä}î¾°õ[­Ôeñ£Ù„­‡àjšÆÀÒbÁÖ4 ¹úêN•wáÎC<1»XçæÊÒLÖš{ËŽåWÚ·üUÊHÝ9Ô/±6YgæÊÑAb­Ó±2¡Ææéëò^.rÕ ªÉÆÆ”ð4Ì,Y?­7®PJÖ¼‘hQ®ÎÔY¹ò4œs—ÉV7®ÂhÝB|tÖ•õ•xkœÑá:…>W7mäì´<µp7ø¾†6žk6qèʰçJÑ® ìx3õv¾#MSdq$fØhƒêV0Ò+Ðà–qw”•¾á½q…^Ekù³Gß5Ü…3ò~fm²Ìؘm ùÈM«ä¡êbÒç[ðØ5Wè°×ÃzaoÔu£*‘?ŸZµË–Ec•áš½hx#DéŒE¶/f÷ëเ¸Öç7Oa…ìŸl£?åЄÍ$XE>‘Ò)LDÞGwΕõ’.y¢Ê~[Oo÷FGf½ÞA‚9qOD­Ù.¶¬ÈÜ Ä\Mƒ£÷ÜóùÃÚíˆ,u‹WÊ:dä·X;j7šAÚº—(å;­œS-|'ÏÆ–AVë͚㚈Üð¹’¶¦—Ic£¶üG+Hϼ=>z.qƃje5ßIkg{#ýV«fÛˆÑ ¦·öc·ëV8:B´Pý5{\: wåS a9 ?ëíÒÝ*APO±Ä¾÷ƒE…Ô|ÃÖÕ2`ÆÌ9ÆX‘º!ë7âÜZÜö•kÊl"ützÉH ¶é:ƒ]뫳0}ã^䨽ð©çÔÏ5`j\Yk ´íL­úsÁ•Á†uŽÀU× ‡®D²éÿ³üÕ¹ž­–ƒ?¤PúŒlûZ{çʸ9 ™þªøüþÓ:*4NÁ à)"í\AãÊþƒÖ¹S–#†\E¸²Î©’á‘¥NïÌUÉŠ‰"%éJD™ç;札ÈòRÅ©ö•Ù¿Ýnù>\ä)Û/ l€ÞÔT—q¢é Ô•à|†oc!°̬”ÐvãóÄÉ I¤´ ~Î綬X¯ŒÅY¡Ö²1aŽSæ~ççÎ~…±Q\yNtɈ¦¤Þo`þì|üüePžXZ~­Éþí+cEiô°¯âýíïûæx4€Òùá¢ãr}$–º2N™¾Ì5p/Hé/ÁÞÎqœR fWw-1áøg) YO™©Vvžš>´xQwª»»óAdþ&šÂPw«£\©ºd&+½E³ H˹€ùÚ&s‡çÎ1½ÑçÆKnÚø‰Ä–Pˆ^:[Sê¬\»jÊû±ºVà ñWYæÐa(äfÎVe ®BÖq= °4çæ³1¬=ÇÉ`Ô~ð‰ômÊt0MëP Õ¨¦4_ŽÑ1ìö„zíÅÕ$hR‘³‘ƒ¸»]£…1ìܘòLM*ÃôÕÛ8¸n ƒW¹šBgù\Ù^ûI°sEåíþ0p»>Œ+5¼Î ùÆ¡­VH뤹2Tú‹ÝÚVBájçXÍ'á9+Ê®×Á@oÉf®|È­I³¹³®l_Á[aµ ì[Y/™ܶjWö9¡¢†ÑXÞW±¬­½~0橨fŒO㬃âÄhçŽP;§ é@ŠÝê+xkŽ= Õ'VžÂjªâƒåì%^v=Ác5GÓ§§pÏv»mÔªE;*°Ò¬6ÇÓÞç\RYneÂ=ì„Ï}QeEØ~‘¼–eûõ_Y´J«§R1šwÉÆ·½–Š{5÷üÀ)De²À§ÕYAŠýs…pàL1X¡(O7ö¹[&‚8W±9VÞÒ_PâuŠbí>ÊÀ®Ð0X3§`seWAÔIÚWáf ˜à¸ d·—sµx+£¦i¿îW¸m‡êÌÀò‰açX%‹ÝïŸ+¥ŠfÈZ,KlÏ”\ ÄTX‹ñ{]zÕ[–÷d¶#îj8 WÑõE%ůãªKH*Ü­‚( 8'ÂïʾŠò8²¾rÎb£æN6X!» É÷QX¾ïÝΘÅÎì«Dª<Îa·'ÌÄ*Õ¿ Æ*vÐܪ±`烻­“Ø¿o®p ®œr õ`¢¢㪟‚˕Q“w‘+‘RW§Øæ “‰U| oíÊêF­<+´+ÊmÊÿzï‰I´ ˽Í]Ç‹æUzÎâ*z+Qã­•«Û2nmFa×·qŠDdæ/U/ÛÙ°ïø«Ì"ϩ醜£_B•ª»îr+–¾¸QÑèJV¨V|Aâ~ã :»'~ù©’«ÆãàùÐæv…ÛMØ¥ÔÀw¥”lÔÄ4è¦Àë°?®žñåöÅ >Õ\¶p.çVÎ5X%C‹ÛzÑŠ¾)sú« rS¬¯æ1Ö(Zã Ñ+rõçëLÓó‡e—­*MëN›Â*Ù–¹U_ G‚Û r…Z“¸,“É•~\õ¸úýùËôåK`%lóM¿L96{Îv²+©Fon,•+;¨Ò"®ÉŒ ;¥2¹ [ÂûÑWî˜À‡“X™xLQC­„%¢y\wã꫹ÓJjîPÈ[:ô9Šmš×²¯Þ}»}ñë¯|ûªµ‘¢VW‰*¦h¿±Y2V-çP(ìpÙ§¡Ä‚ˆøñ ¹*Ò¡cöƒ¿?ßt{@[¸¬ªîžrÔ•‰­éÐ9Tt/!`@ÀšÑ¥cFÄá§ðÔÁK*ž†Òa8M_KÍÙð”ËUÀs‘,[²>Ãå¦åÄTv’Uf$àtsCЏÚ|‚3'lÐß.6®Bþ§eaý]‰I¾Å6øst)uºÈÚá€Þ²ÐÙ °“mؼŒÙ~ºú®ü¢]ÀÒ±ÊI]4Z‹ŠKôäw·"tâ±(בóN#K„°ñM5˜½põüÑö8¬ &&K˜ýÛðÂ% "ƒEm¡Gíåå¿ÄyÎDp™Q¥"“»ˆØ‡ UÙWw¢^Jý¢g0´ &ʵ)ýŸB§Hü]aÁQÈõ-e\°bÚ•Ý–éÅÕ¯\] %~Ñ»®â¾2»–É.!“«>n\- 9&P¨¦Z_eíaÕ¦ÁÖS7ÎÖ(®þüëÛúJŽVÖùMè»Vk¿f‡­“@¸”É].c2ÖK¯7£´·‡lDµO®ÞFìãlÁ¯· E Wáê9µ,¡Û*îê• {{6oä´(ò‚e‘óZ5÷K¶¼i¬z:h‚_Ñz÷m‰kX«BB3³Ÿtˆorwô7®œX>X½…=×Avˆcæ«!2‚ãÆ&÷§ñ‹:\ezDÕ±…1¦¯— ¶?íT]üÀîèê:Ôj.œé o,÷v2® Õ• †¯õuß±kÞ–5&«ç"íhâ &—+rePŠ•ë¸ŒÈð±>Ï+!\óYî<ÔsºQ!³F£‰5µ/Sýj=W¦z!”{€Â¬ÖâJ¶,¤ ÏeS–_V*Ä|F(óÈøÇŽm¹£pa<ÇQŒvT)—Ì™)ÖYÐÒ¶Ü"]°[Ô»‘æ±{E®¶ÌlUÕ§?Þ9¹*V,¹ƒY¬½Çu&Îéd¾ìï"êÊ¡´2ÙÑÙMLÑ W:W¨0„Jæ¥äû\y»xÇ3SÌUíˆÊäÓª>I#gâê>C5XÝOù& 7A·B`ì„eÖXK^Ï:reÏÐ묮²š –rŒ“ÁL´\ŸÞñ¼I_-'‘ØóoÉÕ«âZ¯¦¬KÎ_C¿à¨³…ŒÄ{*ªG¶†ŽYn'âjª8P½âfbk-Ô—£bı¯Âb•a¼¿jß@ßœSrõóUž=Rtl† V›¥•IÊÂj·tFš+x«a½šºÎÎI¸úy1×2 cî%÷Èé„ÐW²`ŒwªÙƹ«aµoä*ˆÕ+X¶‘b²"u«ï¥•+Ì_ó‰ eçÄ?ߣ¤DS‰öósõsk±IäÖ¡ý^â`%¸2ÆÊP•ý ã'9ÞžQrUÊ•½gÔ=F;W—äC"å'p‚0üºDz #ÿ­)ß üqŒr¥¦-Y_¸9ˆ-3¯ÏµÒÍΉvpÓx´Øv?f°ÂûŒâà´\ÙY vmô9¦=82áo@Öà Oü˜O_A7²QžH®òÀrÞhhÚËùaw°DmýÜßBa9~$uã°×~››lO¹ò'×ÓVšƒA]—Ú£¹°&݈‚N̲=o°UAW®³¹[á3ë«G’ñ°R:û!Ò X¢¬cW·s;-ÁñéZŽ­M%έ¯®+‘rzëMÚ¬Ãtk.Åif –ßšW_Çàpm’MñB·ÔŒÙñ¹ºNª’6¨TÄ€Ñ{½w+æbÈâJ÷L8ÍC8ÀvUDßšpùËöwíð\ݦTKsöÃ(8 l‘Tw”s¥Ãoq@"ЯФBuE}u›Ð@+g¯ƒ>ÖBÇÆ2-\ÖrâýS^Íðä$è>A»ãªlЧé r…tÅ0 Ç†Û+u®~O,„aõ7»/X"«?Ò®¶ÕW“ó(PœH™Y„~«XÚ.SØ\ÌhÌ)€hôq°ñiîZwÞXVÚÎ Õ]vÖ|hú 9ûÌ3ë+½Œg-WrË…þ\ÍL\ó(–ó”ÅÓ¨$:s";¹!ZÏÛÞú…J%Ó…«ÎXIgv,§°V …um‹°Ýù^w/™‚üÁ„ºµû)) ‹\uåÊŠË¢“¾š&QúC„¸rÌŸä‚æ* ¯Œî~®Ŭ;p~ƒ«ýW°òõ{Â0WÐÔeZ±k÷A†ø)öÈU_®eᓬX±™`Eü]â‘´rgÈØÛÍ+ß{߯ÎÂU°ö~_®¬q®Ï3wÏNî{Âp0¢\¥¬ë WÖîÊ¡f!„19ÉKGà*ØÓ¡+߀YÞë–Â=ë k¸JöðѪCÚ\ ¿ŠÿÉG^ƒBÚ¹r¢U°òlŽì[¬µë1a˜«`»g˜×hR_- CûOḠ·6jåÊé¡ãD+¡…+HDïN,•Zà™òÚA Z—O”&UÛo RXäJ¼ï@¯N"ìo‰ª¿4shóà–ɯÈk€PÎ\å>vw}õû3>üß×OkqéÄÖÌÕ\´Ö+‰Ñ–åÃÍ;êöDVµI)¬,®¶Ûƒ'ߨ8|Æ<¯—wßž?üøõק͹ê€U¬¼pÓB»…Ø•«€Bs¶ž*³*´Àêé‘Ý1a›ý&¾ŽêïMG®þ¼jªW®®ÿ[ƒ«±êÊiÿÞ-î n?Ý{½5WŸ)©±öS!™Íq=]!ÅpéW«ßŸï\½ÿû\‘Lˆœw5÷ÏZ¦¹Æ•êj€ûTù§„êBoNoK\°•>^¹ú¾Ž¾Šõ¹íÂ•Õø«_û!8ÚÓù³Ð1úx¸`Ô,.PXrÔ¹Zº(b ®Ì ¾¼rõŒ/k¨ÉËx®¬ûQ¥-–»Æ•V)´ž+ß‚Hk‚åB\©Å+ò'±n?¼û¶Æò»VúÎ ­[Bç8Gœ™H…c`e[ÈAK*ÔhÙ ÷÷CíÛÃjWÆk‡U»/„Uz—‹©šÏò,~µUæR1 i­?$WQ¬FqåF¨^ íJ.7'V(#~òD¦º2HvVÒÛì‹ ]õÕu ¼Ë ûÁ¹’.óÚ=¡µ-°Uaý /‰°W& ¯u1™$è9ÁRnÑç6 ÙXaC}ÏÑT±ÕðzNhw¢€˜ýI»XMy›2_`¬À+¸ÆU«7¥³ŸáMVð3ÄÕÕX® :È4„byOäôϲ+sÜ¿u •ANê¬Iæ¬ÚŽýw¹6Ž«Ê/ú&Ãý¢j©QXœ–GÒä1#¢Í¡9½®±ÈH‡^åP+ÜAdú µ<©¾º\ÖTWоE£Ð­”Ám% ºÇnÿkî²-ä$WN+B÷„#¦±Æ/ºŠ}• j»Ç"ï”+[]aÅUÐê§Ó}Ó„ÛJ¨W‡˜&}ÎN͸hª8œÅ.p¶J©nÏÕìíÿ|MüNWÃÕ•ÛÓO Œê¦° Ç:­rú´ŠqöNö„Uýy7úê%†Õìp³ñ³/‹l¬:dºæ­d (T ¥Îî)!¸BãäŠçgÑÝufSCÞëà÷m5ÓŠ*suÎU¸ª–›’ëúÍÅ=®îéôyqW9~S?4"i %zsñ‹þþü% ÖdGÐÄfó&Cê3\²VÁÞ‡ÎÇ€¨}/§‹(zY†D 8ÿ„㸚“ –h†úÞ ó_MújŒ}Ä CÍ«ÌN4½ìR˜W~6}ÓE}g»bM‹½w¶,c¹j·ÏíÖ5Ûkb'[WBø¯u +Íüð¿ŸÇ冱¸ šêÜÆÀp¬®YDËyvNjád…MÞ-Ä3ƒàÝJ]UF“¾‚¿Vé«òÕF7ÏÝlCÙ¥8e~O\åb5L_­ÈÕõç«ôU‘‰…Xsã·¢'Óö_m£®L~ŠB?°–¦LÁ>½yOYV ͉SòËnÛûã†ÜÕqµ•ºÚŽ+Lü¿§z°Ð –M Ôœhû˜ˆ³zmÛ齪+t«W™õ‚]·»íaêþú˜@t(àdˆ,ñ &¬v®Ì@¿h©º:W×ÊîºSvWfŽ[˜{o.e{¥î1u´ƒ@›]ÕuGÆ»n!ìÑWû²øÝÝ$ä!\‰| ˜¼£Åce—4wQTBùØL1{Ãê~ ñ¹¹öÖ «K¿vÁ•»5–ÔIF÷ïb®'Bßà « Wß?üxþh~ýc\}¬¾ÆkRåj™kC?s5nA‰yô®:®4 ¦ªNÑË[ýöø ü"Ü·½¹ 7ýèU˜+{!ÈU¬ ‰h¨l íñéÆÕ¯þ}ýß\!l^õç*ÐóyW Xnfƒ²¢Y=)6|Â'‘l¤n¸ªú˜¼í ÇsµJ=5÷bùÕc`ºq…«Q´ë)ê¹R*Söáêêýþiµþ8Þ‡s•UÓ³+W¸ûd%¡ÝãÁòýSjµf×?¤¨bt^ ÷×=aÓv°N_­ÁUvt»à½‹œD0ÔÓÙ"Õ€òŠ Ø7?bxÖÔW±r Ç çÊ1|/³kJRΊz XÂ0oíB® è5aé¸eÖN’Õ”Dˆ5&É\(àªsœÌ|쀫¼ØÑŽXÓ9!œØÕWX‡+×q•uû™ù{à*1Š«q•häБ«i‚àru÷`­ÁʸB|ÜWs¶Ò:˜ºË\M>%—«ÑÆŠ•m«HÜnàø¦\eª¶E*ãªãnÐÈÞ9vóÞu¸’ (â*‚²C}µÉ2¨ÚUø‚6Gû$g.+ƒ±»+Ë„²öÄÐ?ÈÕþ¸š#f<®oí­A&W·ŒíK¯ Ý'.3ö #ÁÊ+Œî\Mó»nVáÊ5nó¸·_îÇ²ÕÆÞT^ì-šÞ •«{ h«¾Þ½µÆbåÿwêÐáîiÎ}p >Ø@xÒ®ƒ‹¢¼U[³N¡ïž†±F»÷­¤›*’zW°{æ Ûså«ÿÞeYÕÙœgÑêc–˜†U±rVâÐu왫,…5ü JRÝ}eåñM^«yO8«°5bûB¯xfؽs•f +D$]6™;Sôr±{c°EY~l®Öó2„íØÑö•ÕØKå f#®¢Uíر}g;âÿêñH«på93`Ù-«qUÙ’ür‘Uáö­¯œŠ9êï®Í†U'Gh kÊ ¶å úï;ÅQ÷½†ƒæo®Â•}»6WN‘™Wèþ •ì¯rª*î,®/‹+¬ÄÕ¸eP9܆=mr!ÄéÊËeƒæa¸¤oegújk«=+ÏOW‹uÍZêófUBß›¾ÚWÅ¥k] îzh¹²­|É~-(ê¡nI8>Wx8®°œ* >þÉ_¼o“`!oB7Û1+$ºÆõ§$Þ}ïb™0#ê`Uÿnn%ô#å㸌AwQJs5 ãÀwµÀîÕ;‚«jï÷•q~x®VZ(ÿ¤Ý+0ˆ+«œµð»ïˆ«‹]Kâ<\ wÀÁŸrŒ Êç Ææê2Œ«ú*õÙ5ÄÕ:IåðUªžJ®à`½Ä»oÍ•C®pµNÜò‘hÖYêËrý«Èç*2:ä*ΕÙ'W]¬, +¸ÊJÜä*j_íŠ+g(:“5õ$(ãjPCŽñ\mŒÕnV_u±þV¾[\­Ìջ̋^d9§À]K®*¹ÚÓ:¨ F²b®dp…rµ&VGäjZÂЕG&b¾ß¹:²Ù~?|ÎC#Ÿ)í£Ù~»PÑιZ+ãå]ûâ*8— ¶âŸÉæêxëàÓÚ\!g¯³G°fÝséÀTþ,…{íœ+³!Wƈ+‹­Kë/ÅIî ÉUŒ«]b•’‹”ÌŸYN±Wñ \­ŽUÉ»£/¥'W>B®”ÜÊ+J®Ê¸Â¾Nœ+Ǥ¨ì1ÀAÏqÖæJFzït\3G0§äje¬–º:&W&ݯ>H¹ pE}$¹:d\ßÚXÙ=Ûö«±Ö¬†¹ ê«}/„OëG¡ºÚWØ\]À¾ZQaÕ«än¹zZ«ƒØí[¼r!£þ(ë ¶;™NG®2æïˆýR7:ÁöÍÕö`mÄÕŸ¯·Izÿ÷Á¸Ê<{t®ãÛê/ÏørûâŸÅÕA°Ú¬ô0Ã?_gšž?ü¨ºìã¶c®< yk®<’pÕߟ¿L_¾VÂr…y°¶ç ©0ûíÂT>Å.õÕ&êjq on¶cvBÑ Ž±¯Þ}»}ñë¯*ûêi“Q;Œûj»!ʇhÌþþ|Û´Uâ²Ûau®¶ ~cýÛfÄã]FiÇ÷¹C®6z—ãÁC`õ6N;Žº³|³ª^jý¢Ûqu$uõ¨\=´=Ù—ÝÊn8WW°ÉnãêNÔ‹m¹c–ýr‡«Ç²¯Þ¸úõ««¡Ü/ºÙ`M¸…ª-_Áí¸úó¯oоJ_vÃí³ÏÕþÃ6Ú:oÅÕÛ}œ-ø‚Ëné•ñ¸ö¾&>ív)4n¯h½û¶Ä5ä^v[gŸkúá¦Ö^ÁÚ—ÿjÓQºad±t„óœ}‚³+®¶}ù&uu Ã}¿ kà þúëË¡¸2ÈíTCëP\í ¨èxúÊ«øeŸ¶óî\ei¬ ½†kW\m?˜Ñʨ¼®V9’«}¼fÈ7²vó O;´±ðP—Í^ &s¥\ž\õXá¬'ruÖÇÙr%T¯M®Î¡á6´±Ô “«“<ÏV`.K®Nó<›€õD®N/€¼$¹:Ñ󬾆¯G®Îô<ë‚»¹:×ã¬VbrE#kÄ…ÈÕÙî{µ0urUvß8D©™Ñd¥/A®NÁÒº*+ãï“«S*Ö‘deýmrWU6ßÇ•ù‡ÉÕ™ÀádeÿQr¡ ÇÈM]‹¬§‚?H®"÷¬®d=ý1rÁêØP žÖ…Š\%–Á€Õ¬š¿@®ÂXá4§M¹d –ä*¼ žèOO9€ RUºŽ\…m«c;=ü:^OO)Ræk¤•\Õ.‚{"ëVñ H-ÿÀf¦f*« í‡QF®J';òµ‹¶ÓÈy'DÖ¶õz`ê0ïäKëÌ‘«¶Ú×ÎÔû2{»µ`ª¿4Jš€Vë’\í+÷fb+tß»þ±¼r;äJ_Ivc«#“þþ·Üò~‘«¼Õdý¡É¹ ¤Jn‹A®:(ù©Ö&hM—-\l0ü-¹jÁmª×·ÂZZ© èí}³Å¯¹²µþ2Eës5¡œ«–;ÅšÔ“«*#yžÒ~³×·Tc„ßR¯«WA¿h•!æ´ÇŒMS¿,%pψê÷(s¯»©!WöÆý–˜†l1·ì>«:}Õx“v̼qW»ø#=W©³ä9ЦKKŒ6¨±mb¹²°BðvæÚí= ÷5f|ÛCpœµÇÔ°ËñÆÌm&ÜórÆÉÕZ[`?tD4û“…Vm)‚92 ¢¯¢”þ£i§®~²«Ó«ª´iw®`d*é¼®¥f;fÈ£)œ]_í¸ÉK?W6๰µXÉbõSÓ/nö¨šGÇêÈ\MØ—?¿[ì—¬Ò9Ò­úÈT’«’|ÑêàÏê¥ìüû)¹”åÅú6èP‚u<®FEr kªÁ¹ð@n+œ‰«i}høãBÔùÖÁào{ úHH-uŽ8™%à{H¿x¹­³9:Û†0c¨ŽÁÕЕf9,µ ³»Áâú0Z1(I!ÏüüÃ9ða©::Wâ$f˜]åyåãXù90db¡¢ôÈ Ž8*îRä/Ø9 ͹»²3+ØVgàJµiÆ’ýå”_>îŽðÜy^dãsæè(U9=ŽÂ*zÒÃq5v_¨¢ºÜ=ÜXd^„«Á>ÑÂ-4Ïz.»}5¥rÓ²Å&Wä*Kq@£uû ›dŒ?æYMûLˆ«[ª†¹¢ ²bpiäts•PÀ¹Ü©æÚ1Wrç…¸ú%_{ƒkç\y)9ÈkùH)'äŠ$‘«Cß…\Qȹ"WäŠB®(äŠ\‘+rE!WrE®ÈÕv7B9°ì—+ÊÉ5¹¢+ ¹"WäŠ\QÈ…\‘+rE®(äŠB®8òäŠ\QÈ…\Qȹ¢+ÊcrEy´ˆ¬ó¾úiQñ+rE®È¹"äŠ\‘+rE®ÈÉ WäŠ\‘+rE®( …B¡P( …B¡P( …B¡P( …Bi’_ÿüûõßߟß2ˆ>¾~õrÿÿ’O/*ûtýu'©ûTÛ…Ûž¹m¼#¿?¿{Ηwߦ‰úòú½…Ÿž>Töéúë.XÕ|ªíÂmÏÜ6Þ‡‘×·åúœÏ×ùóõ£|ê¼OÏ*û´©¾î$uŸj»pÛ3·÷qÁ¿>ÝžðûÇùó¿ÙŸž?Tôé«T]WÞ@ŧš.ÜöÌmã}(y¾½}ÿöºÌz{Â/Weý©äÓó‡J?]ÝiVj>Õzá¶gnïƒqu]áßtòÛro üë§ç•~ºþº‹qbªÌ“– ·=sÛxŒ«Ù–]™«êë¶rÕrá\5>÷ŽiÂMÛω/yzÙùtÍš°ü‰‚ëö[[.Üal|î£é«·çü4ÏWÁß?TúéúëÚVï—®ŠÿDÛ3·÷Á¸º=Øë—¥ûÞç6?Cõu[ý -n{æ¶ñ>Ü~ðjG~*öÓ=·ùE«¯k½Š-n{æ¶ñ>Ü:øýÕÜùr÷Üœ+Ü?]}ŽS{]ág¬<©¿pÛ3·7…B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P(Š+ß?üÈúçO5Ÿ¤«¨(…ÉÈ…\Q¶âêùV7òÏ×Oßëwßþÿ¿^¿úþáþÞÿ÷µDÙõo?ù·/ž—b“ŠÂÕ÷wß®µÿ| ‘}ÿ÷+7W®~¼é«?3WóOžï¢Pt®nt<¿•]¼*¤?®¥¯ÿåru+²xýâú¡¥ '…bsu«ÀùJÌLÏóõ;ß®n?yþðcþÇ‘’ÍÕ­ÏŒÆÕô“k-ï©Þ"…âêúŠBɱ¯¤åÙWoßpì+ÒEIí?j»¾;W×o¼\¿ñú»ó§,bMiåêf!}þ+ÏKu=ÇÁ[}àãóý'ïÿsò_+J9w¤†ÒU®°^¸×£t–·5Ž&9…B¡P( …B¡P( …B¡P( …B¡P( …B¡P( …B¡P(ÊÊÿœÓãendstream endobj 100 0 obj << /Filter /FlateDecode /Length 1046 >> stream xÚ­VmÛ6 þž_áo“±³Ïz³­aÐÛV C;lh€ahûAg룎ÉN¯ù÷#%Ù—¤ÞE€H¢ÈGI‘2øÑˆržyqÅRFeTíVÿ¬ÒœçR8“©Ûœ¹Å4‚ðöå.~éWÂØdÂMN€ïÖ«ÛBDT¤\ä,Z?</UÊ ­ëè-)â„Ò,#ëX1bÝm­›¾‹ß¯»}ÁÊH¥*g¹©ȄѴ¤¥·¿3m³’<Æ‰È Ò ~Ï @”óIïö­I㤒ü—œ¿³Õ1+ÈG„1Á|kMØø6*‡Ðße2ûýï¯ðêù—¾~rм!$*¥©’¹§ª»K9£Ã´n¬©&dX#2+) JÆIž… UÒa{óà0üi[Cö´Ý˜|TÓ;SéÃNzœÜCe&.6ÎYg¯ô|‡ýÖXãPàl¼Ÿ¬91l·÷d¯;ŒÍޅͯÖíDŸk†C;˜åò <-lÚ£×¶sR<øÄOºG•ã‰é‚‡¡é6 4žØÛú{t€A‘åO7e¤êwûÃh¼¸ì'UL‰éÐÙÑöMíUl¿»ÐC— Ò·Ç‹+Hjó.ã¢3µ_>61ª?™-0ž.S$„0LjœC¥ ¿^CWÕÁêѸ¸ñŒÔVOqÃ]?¸<6•nÏPK¼¹’c ­tç'þæÀd§?ø}Jþˆ½ƒH!]b¿Þbr(‹‡CWùâÃUÓ ÆŽÃ´p»3u£1Ü(½ðÖ uÛcþpêÂìõ¸ Û÷ÎÆŒ¡ ´˜4/sÎAÜÄÉ9i/3ᬣ_ÒÌvþÒ¹¾&NûZæZ𢅧òVœ„vâÇ?VH(Q> stream xÚ•VËnÛ0¼ç+t«RH,—Ëå#hz(ÐzêÁ7LJ4v[#Ž8Úü}—E’CÅîÁ»3»3éϳ‹_5U^x£L5ûY7‚ÀU†¬PHÕlYÍëÍn{Ù"h_onaD2¯«ãÚbö­j–ª@xÊ™sh—-HNh½ZzK—-)ª5Ë;µUʧG‚¼Ty¿ q3`Ë#X`cH%<˜åUXÓµ@.¬‡(k…t(]6KÐ8¨…AåsšFácÅÖ䬀T,ÄM†eYÝ@V&QLÂÂF’O)c¹~:<Ü0ÕþÇz» Øa²Þæ \©E“¢â¯ô‚7!ü2þÐ6v‹ŒId‘-š7* ‰‡Ø¯ê~H‹db‡ôÚE Þ×RH®“ÈC/SE(Yf›jVRJŒž ˆ¬xvÀk+pÚÒ#ä#JÇ'•p¼È1{ÞÄ9íí¸Ü#äž2qXÖ›9éž<9>ì²È¡»£ÙÕÒ“º†¤I§CÏ‘ñ§4™LDQ'l$ÂD¤Â¤ã¸ðI¡K™ž(U‰Ü°£øÈ…·ÕlÅט“DZPЛ7E×}Œ-+ŠÖMÚ¶ƒ«"\%’œô¸ã¨§|Ñt×ÉdìæyÌoªœÜ ª€èÊ ¸»Õö°ãÅ¥Ý:B”Àø ż*JQnïWßSfD9¯³_»mHàaÈyV¹Ÿ»Ýæ:[à‡/£ôÂb¼ˆó®à ~¯º€çÕf³ûSâï­>ƒÝþK|Š@M'L ‚†vöMú>Ãäîw¹#-ÈáÙ½/`ŒN"¼­p†Î[Þîïó¡\- püÊ;Äÿ®mõ÷Zõ¯¬Æ·Èÿ# ŠèHLy¿×‹/³‹6ü8endstream endobj 102 0 obj << /BitsPerComponent 8 /ColorSpace [ /Indexed /DeviceRGB 56 505 0 R ] /Filter /FlateDecode /Height 600 /Subtype /Image /Type /XObject /Width 600 /Length 7850 >> stream xÚí {ãºq…Ï.íÛ½©]ßÔm·MS·NZ¥­óÁ¨^›ÿÿ—UEŠß‰0Îyž$Êî WƒÁTEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQŸ@¹T¾ ¸âO«÷+.°pZ‡35kÿœ\)Àª ÕÆJ@i“«¨±Zÿ÷äŠ\íªÃÊ@H®ˆÕÎJ œt«¤¹*ÔaìÈ“+be_‡‹É‚ûþ|®íã×Wr¥œ+™ˆ*\ðT8â\)ÇÊÈ ßü&.:øó¹¥ép÷F®øN®Ráªwi6¶2P‘+bµÎ`ž_ÒE¶*r• W;:JF®RÇj±­å"W© ƒ[ÛÚíµµä*u¬¦ï…s}2¹Ê”«4;˜\yÃÊéñrE®¼ö¹J«y¿\Qò\¹ír•:V ©ù@®(i®*rEY`5ÕÖ W¹"W ±â8H‘+r VÓë8äŠrÀUý‡äŠXI¶5è·S¸ªà¼ÈUêX5¾&nÛ"WäÊ¢­ÛdðÃÐ]?«Ô±º¦»šÎÈW$ËW‘©srå «©Ðuÿ㊴xäÊÿ,r•VþÁ¢ßžW®ï-Ñã_Ñdyäj¶µ“‰•_¬2áŠ.–çapš¬$ã¢ËV£ÉÒ\ ”~;¹²jv·X‘«¬¸¶{‚\Ñs€Õ »ÜE¦‚pÕ ¹¯XÉ·<œ‚E®2ãª{v0Á|}+˜½êÌ‘à>úí°ª[U²ûE{1:òãËko/ H5_¹ ‚Õdû§å··C¡‡ÓläÊwÇ»)þ󹦿ë«9WÄÊ+WŽÛÛIé<ÕŽxX˜• ¹–«Ðþ±rÜà. ÿ|ni:ܽÍÏK¦/’«0ŽŽ¸>ŸšÇ™‘°=Òv½ÝyœŽXÅÏ•‰½º™­f(d@‹\­ùW_¾×Þ¿=¬?Öü¢bYýäts•ítpßÚ`°¦Â(ªn}p0VùE£ «\–.®ªà#t¤X¹'kœ9 ÷_UËj‹ŒhÓ™ ù,üú¸ª*r%Þ¬;xÚø8ÍqQ’U¸kWAž&G>å\¡"W^¹’q´uÇÛ³ û†5tPe'nÊãí­v- ›8@ \eLVá®qÆ•P©çªÊ{²ƒÖu§DWíÃæwé'òM®òàêÜŠWSP‘« ¸ò½>‡Š\¥ŽÕÔ¹"W‚VÊY¨ÈU’\ÍŽ{~ÈŠ„«|£WÅN¦'†¡zRáú ¹aÊY¨ÈUB\™ÏøÈ¹’fÊ]{®^qK®¢Âj{d ²™®²‘«h¸Úí„N^ŸJ®¼qeA‡‹^"WÑce»*ƒ l+Í\I,ôímP»¹ÒÊ•Ôâ1‚|\iÄJrC|bÕ½J™\éâJz“ |buͽO{¥B·ß·ƒSð‡UÕÞç@®4`Õälw²Ïcðéf¨Ô£Ï«zç°çß°øÀ µ~{žwâ༷µd|a”`ž\…§êÇ—WZÃ%…Ý߆‚~$W¨NX9@Á5Vrvüûñ£æ U®°y£‚aùä*¬¥ºr¨±á¬xrª`\Áaéä*8TáÌU>\!?¨Âq%ÒÚqœÇA~PÅÍUç&!Tá°"W C’+‡`í(ùãwÿûü޳çªK g¯4quüòýp÷öþí\Ù›ªk°=ÈlªæƒŸ'KuâêòŽƒ úã/¿þ‹s%³WW®¾¾’«-ã_®àÒT-ð¹Ã^Ý_¸z¡½Ú0þýùÇ¿þò÷õŸ\Á)T¢1×#žN\ðÄù ±Su²UÿvâêÏ¿½°+ánÑÐØi>|ùžRØÃµ§þ»_ZýW@®äg±äý@ŠTô§ßÿöÄÔ¯óû?û´Wphªtvdª\•³A…?ž¹ú‹×(\CÕ>Äö¾‰Ëx•‹ù`ä`-„ªNXýçï¦Àr¹SÎÆ¿ÁC$î1©#¢;+A®Ê¥øç_ùå_üß?O»íçwþi«Œ£ÎLUS0¦¸Ýg8ËIœ!^®Ö¢êú—“©úãoþf´ñ?ýSLº2äÍé0{;+hŸ×9.zÖã TˆzÝËùyÑwÞe׬ìÕ¤IÔf¯bkLÕ¥¹¯®ßØ_õ)‹¹Ã{â¢.ý«ˆ¸º&"èPÕiûÞ±ÄùZ>Á³7.je­’àêUÇ4m.¥ð]í] ajªÓÇè¿×26¬®#ÝÞRŠð/bB–'äJ®3ÎNÿmYN¡ç…Øj Íÿ[¼wÌsŽ‹¶ƒG ‘êú^nŽ«š%ÓSÑ{æh…U„\õýœQ©a5ïà7—Üo8j¿»e^îƒ+6-®õÁA3·WGZ×¶¨ôªÃWRØðÊ»›f).ÚnΪcs514Hf?ÓÌU¿ ¶¦qÁÕçí°ÎÜ.xý\M;Â9õbàª6W¶$U÷ý~áïžÖÜ0Ý\ÍMޤ5ÆUÛ)[«»çƒ Ñýö ˆši:é?#áªß-ft9éÉv‘gö”¡>®VšËINÙX¸šè—5¶ÜôäªQÓ5®þe*Ž˜«µfÛ>þÝ÷Õù Åð‹H­uGTŃÕB¯Ì5Ÿ_® êþV3/ÔU1pµ².¸ÐŽÛú±‰wžµžŸa!&|?ƒéÌÆUú¹Â†$ÿÃöÜm¯ ´‹+`™Ï–]R¥«Î óvýÉa/œÚqœ”I‚)ÇTiçjïåÍÒ‹:½»à´Ï^¹ãjÛvIÇT©æªOÜ6ôÅÝýÑ>™—³û¥‰«­¯êœ*Å\½ÛnàóC“¥…«íÛº=P¥«vSLsG—Ø2zÁßîãJ´N{Ž ø J-W·me×m¡žîñ5_}<æjßñ?TEÁ•Å3mñv)®öiòE•f®:ǘᤃGÚ ÅÕþcrþ¨Rìµwî2¬´ƒí%‚íVÇJ1WÈ‚«+U¢-ž*µQ†ÛÑÔ¹ª¤oJP`¬´Ï!q«Ž¶{âFP!9ª´Op%ê®S%]ÃRIçÅsÒ99®:ãŸTKbå,•\ ²‡§e¬"ÊO”WCO]¤Š¥¬bà*9ÿjâÆÏĨ"WÞ¹š *Ô°ÔÕkäL‰«™H•u Kbåß`iájáªÚ´ŒU ÓÁT¸Zª[U±T‡U ‹Î·ŸA+5H‰*ý\aÓÅ]J¹2ZÿÛ[IT©¶ý3„1råìµÆ*®®‹„ˆ–« [vT³TÚs1DìÂp\mÚ³¹š¥V¬âˆ^¡ŠÔ^mÝV…D¨"WNõ“ÓŠ*¦*‚#•DKóùÁ_Ñl¬b˜fÆ•éwTSÃeK";Ü#âÊèK¥r¬tƒm#qµþ-õT)¶_ÃV©îÝû-õTEÙàžWeXEpé È±‰„ü«¨R}Ò°¸'U®Ê8°Ò|ÍD»èœWˆÜX)OÌ DTþÕìô7¬t›+Íå¹ì­2¬È•ê×è£UºóŠ’«ÞˆH¬$æ‚ysUïmZáü¿eLX‘+µöª¿AQQ¥;¡Zæã`ï›%@®< r5š‚\‰Í€ÈUÇa±RØûñrU:ôÈU®\õÆ@+%îzä\5Ñ *° eX‘«VÐñ4W)q5 ¹"Wv-§J!WªFÁø¸ê+€\)´UrUÎ5È•"ª"ãja‘c3¯-®UäCU\\•«%¢wÑ8¹ EUL\­ìˆ™0PÊ V‘UqUî)QY:¸¹Ú‚Õ\‘ŠÈR1¢â8¸ «Ù"µøïJÜ+ŽƒÆ®Õj™*È*rÂ* ®Jû2E®”=¶ÜWæ¥àÃa‘VpUî,t|‡YݱJ—«²²àjLL ‘æ‹\izì¶ãÿ?`ãôÐÕÖ®"+¬”sUÚ”Š¹Ño‘,8j!r¥ç±e%ÀÕ4Y0¯á ¹Ú>ދŢ…œܴQfX)檴-›ç‚‰\)yli_.Ä^Ô~ZXä…•Z®ÊJ˜«À÷‘+-% –äÊöëäJBŸÏµüõu×c-’Z9ãÊîû¹¹WnwÀSýሇ-¥ÞGXEø>‹ßoÿ|ni:ܽm~l)öB²\Ù Ëòäêãñ©ùxœ á «®B,w\/afn¯JÁ7æÊ¢áqðv™Œ¯ L ~uøò½þðþm£%†V#W"Xu–†k&d¥ýx¬ß{ÆZÍ>¶~#-a!ASmšf›Ì7%9ý\~l)]¶ƒUØ?xå®­k³WÂëÎK«»b©Øãã  ·òÑý‡Ód¥ÂÕhü,“Ç–.ÞÉý@h²§´¨œs5ØÅèj[F`®^€‡÷_½v#k-ݼ“ëLØÚÊÕƱµq°ªç…K vâçêå䯿\lÕÑ4ÎPºz)8åÊ,³[±ì |ÏY÷Ët#9®.Vêýç W†qÑÒÙ[¡Í똸&öª¾ê§-h¢Ã’Q™Ü‹•ßRàªúüoc{%y0 ä^Æý¸ÎÕÌämp Pƒ,»6úýí‡ÆJ}<šÄEK·/†eRÌŸÜ)ÖƒkõÇžsµ!Áró¨c½¡¡Ý×°øØÒõ›ayž´³hó^+v`Õu¿®9¬;7«óƒ¥€é0Kê¶õÉ^ÆÆaëSgü‹ ¬à\••+®ú`-ð ÖnØê^­sÕÒ·ëèu¾\•.«? A’áÛR ¬À\•n«?œÂq¾:˜c¦óàÊÃå̽+¿®þŠçæ,Æ>BõoykKŸ/Ø™R!W“YnÈ•ècK¿oØý‚5ઠˆUùKßMëç–&,pï·`äÇU’&Ÿ`½¿AØm›Éså+,Ó„@\!ôñÐĹ*¿–aòVÑuÙÃÌ»'&á8ƒƒ5“7° ïcÐEäÊÁƒä2bíà Úzbïó’õ³&ëÌ€`ÌU˜ë'ÂÀäʺMÇG|-—ad®Pâ*Ð&¬„íÖÿÌ+WaÚ™\ùxˆ¯eXŒ¸ tJ¨]îIûWPÂÕ¾mÄž~[äJ,¸rÎk'W¾æƒþ Váw¦f L=~U­‚…ܸ 6iJë±+ÊÕ ÓÁp+}®†÷zÁÏX¨ˆ+¬†íä\p5X͘¸ïÒá+†çjr‘Ð9X9pUMä;p_ôÜ«\¢îÃŒ€8YYp5½¬çô¸ y½ôĵ±½ß˜ÍErÕŸ’­gœ’yG \-Žû€›FȈ«ÊsÖ±óÓ §ä påêÇ•WÕÔ.R‡U (àÊh•AøÈn¦\yZæ/:Þr®„ÉÏ—+øáªõœCre’ S¶†™qUÍe9wS¡¢?Û×ÁÕlzwr%ÁUå—«*°ÁZ?•ËqPÞÁrtYWÓ'”œM*ræÊ½É*´`Õ­—;r㪛uÖ9WzÌU+“-W>6Ì(ãê– “\9ôÜÇ\!®–ç}¹’µWj¥+£Œ6‚©È³äÊX íÕä˜ÀÊš«ÉýmH«Áu<Ã&½råÇ\UNvŠÛ&kœ?ím›¿ÏM>×ÓᯯäÊö•]Nº0{*ó@ðT8âã b®®‡š'¶:häêó¹¥ép÷–W°åjï;c ¹7ƒ ÅrÑÁOÍÇãÌHˆt©šÃJ>ñ¤¯t¼’‘öJ¼‘ Ѷvm®Öžµ-7þÕ—ïõ‡÷oiøWPȼåØÛC–›þx¬Ák•)W²z}]!¯È^©}lÀéàÞ×FX¬°eù0XÏïÞO‡«¢J†+‹ëMÜtðáT£ËœðÆ|pK… Ñæö°ôëE¹à‘«3MïßîSâʼÆQpìIÐÛ‚Üü[¸»ahgxºøî'¯\Ù½¸¬öeZÇ>:ø=ƒ•WÆU.$ˆ¢aïÏUÌ Wµ½:ÿï=¹²zsu}ç6myáªýÞ¿A3WNRï‚O•Ý"#ºèƒñŸ÷÷8é±fÃçsB\™ýûBð±¢æJ&º3ËÕèLl]ªd(„W® °ç7/CCý"M”oPïBîå£âŠöÊmÅå¸RwN½›ªsC-rç kÇ•Y`1É^¨Ù ÖϽ!w®œlY+Ì{h©bKù]𫶦ÍV¹ÇAùÊ›~üÓ“¶•Kl®ÿÀ_vWx`€ È•¸©+,Êé9'Ëûùü'–ìñµžK†\ÉÖ¿Ø[L‘+Þ•OkyU“¦`LU¨7ØÉÿP±À܇rE®È $W,\±×ȹb䊒+ö¹"W,¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢’Ôû¯.¹´Î¹–Ï)q«cóÁ®¼öƒmy£r¬ ¬ß¶¾¼C¢0ñÚ]Rç]ô$WCÏúx¼äh;àáô÷ç×x:ýÙ½myíÛòFåXxÒË ªcÝiö…UÒµ»½ùÝ›hu¬oɬk~øúúù|þplnâÙ[^ûÁ¶¼Q9ÖVÍýB/wo…õù|¾Zæ S»ý¢z¿=\²–¾;çÄ=5LÝä³;™–×)ت¼q9¶6ÖEâmÇ\IØÒ/Y _ur+¿|}­ûx|°/¯¬Myƒr ¼þü/ØÖïÞÄ ¬{C¤ý‚sUûXõ{Ü qe_Þ ›qO…Ýí‘×½yW÷•h¡¸jÝö乺úí‚\Õ®Ð×WA êÛ&cãêV¨³v7Päûìî¸<ËqpP Ð8Ø”úÜýágq°.°6€"£tûÞ/—[&£_êNlüÄ'1ÿʶ¼A96>ÑÙ›”)¬¶*§¹›\í®&J®À0\Ð^’b9¯ís%0O>ˆÇ®c×½Ø,¾µWrµ»¢iœ¡oz>®âzñ¸èåëÿE*êØøWraÌ¥Hã¢×n;ÔËuSÛ­ ¸²_‡–#°°qž½ Õ®ã]"±é:EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ^Tg€Zÿ7‡‡=ߤÈÕ¢&’Ž‘+Š\Q¡¸:Ô¹?Ÿ^®é€Îÿûï§O/w8çúKú±ËÎó—´×M"IŠšäꜵìœùíó¹I2vÎA}À…«·³½úl¹jÿæpýEMsUÓq¹Íáb®iÒ/ÿoÈU>ñòáò¥[rzŠêsU§D<ÓÒS'³{™àªþ›ÃÝ[û%¶#eÌUkwŠ«æo®™-A®¨E®ŽØa¯(ÊÄ¿êzQ#ÿêüÿŠtQkóÁû©Yß•«Ë/p¹¢äú!ÊÕ”k®jé¡¿E©.ë88ߛܮóõŸšø±¢¶sGj(QµwèR”¤h.þ¦(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢²ÒÿÛtU7endstream endobj 103 0 obj << /Filter /FlateDecode /Length 668 >> stream xÚ•TßkÛ0~Ï_áGbÕúaÙ†1H»ul”²A^J×ÇV3ÇÊl§cÿýîtr–Žlt¢»Óé»ï>,¢~"JñÜ‘*%—"‹êÝâû‚e2í3NL¿¥•ôμBðâã.Þ¹Åø‰›Ì¸É ðåzqq­u$4WÚÈhýø»|Vr™«hÝD÷¬ˆ!Ò”]Újhû§øaýéâZQÉK#?¦y @‰¼º´‹eÁ~ĉR,`[²¿¦JãDNívûÃv¦m0š6l„ÂlªúÚ5«ú†v7q‚hDÇG·#ëÆ”½êŸlgǹd–Þ¬à_„BÛ]s!x™b~k³‚ÝÅ…fnøFBÜÞ!§ÀzkGKf5èÑJÙÁ³·ÐF¶­Ç†C>{h)g®ícX&‚xDßz7«Pkš‚…M¤~Fô›v šIeúuB,<á=ì¥íÛ©­:Òƒ/UÓšv°õÔºþع ³®¾ظj‡º³HMùK¡(Y_uäl¼ºÄz Jââ«ýÞcº @kä° õ»½[B;΄Fw®…§öÙOxÏé}èÓ÷‘ú§QÎOãmœd2ùÀåM\¸·+7¶½¥aEJKÜÒÀSgJá¨pö÷Â÷ârU™çFèWSݼ¤º!%‰ç’bô4þÁoóüLÆKU”êõZÚqú ¯gòœP­UÐns¢cs*ãT²œgRðœÀaø`X„.YÞZ2§~0îÅ2ðNrÅ •¬£¨¦NÑï¶4òܧÓ^ä>Ì’ežàâýzñ ö¼w¤endstream endobj 104 0 obj << /Filter /FlateDecode /Length 1009 >> stream xÚÅW]o¤6}ϯ˜·)¸ø[jZu»mÕªS­4#­ªlHgóïëkY2™t[õeÀž{Ï=çú`ûíÙ7?sµÒXK*WÛÛa ÇR­¤ˆ1ebµÍVWè» T ?þ ®·¿™1IˆV!%X“Ø…^‘kÆH!‰D„x„%óÉj!YÍêÜUR¾Ë“¶¨L>Ú}2¿ÿp10Cr„ˆzFD3¬#­…Oá+Â1ã’úF±æÔåhSŽDú%ïû¢Ú!“ÕŸ"ÆÂ¾MÒ€EèÎÁÐYϸ඼"ÚA}Ü'}R¡âÖ]Q>Þ+”Wðë£\•´~h;“TÙ4¸õÓ&N;LŸxcA}PZß7&#s£ÈìAïÞÁE’²®vÛ@1KcòïÞ]ŸTineDs¶›L ”)‚™˜¾}¨Ò¾¨«¡d¾16~uam}ïîΛs¸á¨¯ÝÄzã®VÜŒªìì¨ F‡¢ß/±tâ4µUé.…±m{¢CMøg׿Öff*-Ú´ÌÍCÂŒkÓ´ÖÏ·u×9ûBžàͯ…™ôù|ó¥A*v{ðn?c,cà ¯œ…Ê¢òfjó¦Í;ïoo½~pš]·!392üi,ž¼?feIëC¡"XÿhQ0L÷b‡c_ö…1>ÒÀ'ïUIŸ¹›oC?ami`ïÞÛ§tlôt ó7îQ\¢éÑ›9¶õ®ñm?ƒ»¹˜P±n9 YÖ6ýЖ™Oì›2/½j=Q­9&”,‹q¾Ð)ÕC@¹aØÉžÒ粸¿LgHXt=4ð8Pz!(ü3 7gŽ6;1]Ô†é o—+­Ë%éJa¥ÅÉÌoʇ|…Föp|£þò]Ò‰ ƒBãåõ?XAí;/³…óò¸RÂ%æät©­ÙÇP–J½Ui“î/i4ðË?ÏdÇ I^ѽÞ\Ð}mA8ZÃ`sE¯+¼ÐÅpDôÿ³ØÏTSxAÑ|¾Ï~éÞ_+»Ëåí}žI?ßbšý’ÝN¿ YbãŸbp6Õ¬±4ÛÄ+Oì’æõæ¿ÓìN|I½ ØÄ_«ž ûÒ}ÜçÍÔÏІ×> stream xÚí‹zÛ8’Fÿt+é±×é]{w[3»‰lãý_qÄ«(‰w÷ó÷׉ E°` B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B¡ø$”¸ÐÅ·jƒ«ðÍ¥ýyð¨—êÃIO븪ž<7zSò À¬¥u®>¶4~­°ÙÝ\E꼩ÊèE3 Û«ç—æãi`&œÞÏ ®ï®ûl¤(h¬‚´W½Ù‹À*w®ÌñËkõáýûÿª¯™<„ö㋯˪mË|^GVq¥Û¶â¼G°Ä³ÉUMÔi]œ¡çVdØ™ì×\Íí|kóJÁÕû2Ô°2.za©»¿} \^fÁ™/ [åêó¯×íöªû‚ªtÙæW~¼+Í›í̓­¿Å'ÔçN‚HŸN{³}ÉWZ_^/û6puuü„š¿€,O‹Á9oix ÍÆª›‘®%M© S|íòýŸåz=¸÷÷W2Wï_•«ÁéÚ×ã÷œw WÝ@{¤+"®¤ÞFkvh(®nâX ö£h¾ IKL@$\uO‹ÔbÅÕ̾³,ænB‰‡«ëïQ”`EÑà‘4CKFĕˆ¤ Öˆ±š; FÇÕí¹ ñ¬àºã!O-Á*žyÐtèÄûŒ0dºÆ#šsRKÅÈUǵŠþѳâÃjNîN£8¹2Í«ÐÑï” ñ<·)¿uV®aÅÇÕÕÆ†ØÉ ,íe®®WíqÕ݇?X …¸«ç¯;aWµ5Iœ÷Õ»üòâ:޼E·,{Ä\űdŸ}C7“º¯ØÜ@°yák›1äCžhv›‘»O=uûpÝã½°ÍïëòÖN·;‰—'s'ÊGC4`¬fš¬ÐóÖÎü>¤½Å]î«Óø®k7¬‚χ<Ï-Lþ%B¹­kêœL¸ÊàåT…€U'‹p²óà•QÎà¥gÁÕØ+‚«(ÁRX —úÒÀ*èóRÇKå“nTn*YõlP g=»Wùd,’;¬FœsK‡«œaÉVƒ6h¹¹Š—+ck®ìm—I†«M¬¬ÌÚSà*³4EVsßÏÞã>rà*7É"VÓ\µµ`>ŒŒ«\S@ÊW=5 p¥þ{dïMd›§O–±šÜ<5ŠÖp*Ò˜º‰™ÐÒe§¹’I˜+À²Õ®d’àJpåàò˜15Û\EÇU¾‰­n9›Þ<¥^kzŸ)\…ΕM[=‡«ÎcÙ«cûàŠ¹p=Wƒd.ï„-jÁU^\ÉÌ⪓“ÚtÌUëÁœÑ’g®.¹|:liu¶€:(ïÄ}ruÉG{ó^á`ü!*®ržmëÔõB®’6ô à ‹5‹«îVåk® \ÁÕ¬ksuœ]fð|5¸‚«Y\Ýí}랉½‚«µ\ÝdáÖUpXóœ#õd‰¦ÊÞùÎÆœÎïÀ©ápXš‡Úý“i-|3l®ŽÕùÎ/pµ°Á=WAõáX¢-®j¢6žGWö;a"íÕVcÛ–lqõþãµäj`&dr0`rÕ)ºôá²-®>ÿzµa¯âçêëY!5>5Hõ'ôkÿª¨ð±õàáê«ÀÚ©¦ü£û\ºšééY¨3Z_^ÍQ/®î±Ú–ö j9çjù?8JpU˜¬ÀUl\Ýeš¾Ša­ Sìí¾ÃU?WNÁZ4cê™»ØhЕó~·\-tð5ŠUðW!r¥ûm¡k˜‡«´¹Zj®ËÃ\­õÂzüòµ™Íɳ W®ö ®’æJK.7–FÓëH¸Ê†«E‘«±ìŠe¤àÊA.±V“û‘á ®–s5H׺n‡+\Y›×…;±Q=Ÿó¼0X£É„víVÁUæ\Y ÊÀU>\í˜Ó®àÊW h€á*@®¶žš-W‰dý‹+¸‚«ñ(\Á\…Rm*ɯ¬qP¤ ®¼põ ®à*@ƒ¥Ð»®ÒáJÄàj÷þ +÷ëÁ¹Úó`6ü+¸ìˆ 9Ýá ®± ¸ŠŸ«MPÀ\õvöcMdà ®zºAaÀ>?\}Û§ï¶ŸÁW¬»NÐNC!¸‚«›ƒK÷ ¸‚«ž,ý›C‚+¸Úoê’Wpµ»‘Qç·|¹bÇè¾Ýм-¸‚«=GAÆIá 0\¥À•d‡*¸Ê+>;\eÌU“qÆ[p剫oþºý.‰‘àŠ@ÃænWÈì§Zv¸oïv9éI¸Êˆ«ßgµ µ%¸‚«½°úýÛ܃Wp5¬¯³°:[,kA+¸Šš«¯ uÕÙbI¡0\9æêëf]¸r€\ÌÕ„ZˆdÇ^EgøüYe<0®¾-Dj'¯=j®Žz©>œŠcé÷«6¬ÌððîÊR/X&V®>¶4~ÁÕÈŠÐF9«5"®>ž_š§™0o®n-‡u¢&­$ö*!¬ÎƒìŠ(çhÇ¿úòZ}xÿ¾«•X®Ü•Wç™°ZX«¼¹:t¹r[µ¬i—j£ëp–Û·÷RåjÅÙx quhä+¹î=›Uâ¡e-t ÕáðÕøÁ ®R㪕ó«È¹j¼ö‘'92Ù€uÇ”{g6®Ìû÷'ö*2®üCÕÁIñσoŃÁ̹:„•'¬¬ Sa²ræ* ¦ê%xB\&ë™ruªjñä+›Ãôñœ#Wá0ešT|’ûž‹,Þ8WAAÕfx”¥¢påªPZÔre'‡èÎÃôñ¬‡ÿÿùWýX} §Iº¼9/…n8N_^¿wÀäÉU€P™K~G¹ï¶Åõ›öŠÝzÇÁ=0¹quª+®©œSeL4XU›úŒû‡Îf]\Ô»U牖ÜuØ!2¬êØ•<™«ÕqÑMÖjy°=Û¨ÆlúÅÏ ž«ªuh©â¤ê–Ó¾Š+‡>C¤T]Yõ¸ ú\ºã*Z¨Ú>ò2 ®®ó´ «]¸rÐ]_c¦ª ŽF5!½=zæÊþ×ðpˆ+ç+í>ÀGßó å;ÄO•ñòÆDô\Y5X)`%ß<øñìytA•‰\1ùW“)ià*¨äÕ½Š7~e­é‰ØªK¼®hz*TUd)žþø× üv+`RÂÊS¤®R¶U]Ï=|®šs =ùGB°2‰)¶y0„»T¥ì@§ÀU˜‰;à*n®R5V&’8ÃÇóÃÿ²OfO®Ò¥Šø•·«)cW~®’8UñpPüj‡«$\y¸JòPŲÿ*°¸è¶Ë¤oªJ¨bÙ'P\tËe™+E¶_4Œjµ +“´Õ{ÍÆ¾ü«Õ×ɪ:EC4\½=ü:>š÷>ó3l¼PT]r«Eñþ`‘§èTäoŒ•«C&X5sa<\½ÿùwùnVaeL>\Åñ¾sqŽI±&Œ”«C^X_[‘—×YDßžÆÎÇ©RúÆ|{yºƒÌ¨Š‰«Âq?¯ G–ƒ%W¥ÿõñüWyyVío1åý˜rÁj¢NVM>n!Ã)ÐËY^6¹ªãCig½›¸èÀbú±k•h NU@ÔU\´—¬|©J—+ÕÞuÈ+¸ÚŸ¬ßgåm¬BÀ*­´[g²~—Ê+¸Ú]¬LÆXÁÕ~—+;ó÷ï,WpµCOV/öþn•5W®ö»`×^Á\íï^eΕàÊXPWÀ‚*¸²–Q®XåÞeÓÁp•HµÊ,ÉÀ\ÁUÕ*w°D[dý¢pWxîpMµ+¸²æfÁ\ÁU"‹Á4çAåÈ•h\eàL&|¬´®f %ÌY€÷–8W´Hér%Ú䔫k•*WaâLæA¸‚+[u$êa9òWƒ•¤ V€ðfÅUš&K!²›WI’…WéM†¢U®«UD (¸Š’«t÷üÁ•W®®c¤+¸ÚÇ^]³4F–dé\ ¸J¤Z]q¥™“aTOàÊ3W÷^–àJ´Ë+W½oiFãWp5½ œãeÁ\-œïM–¦'°‚«\Ý¢¤{™hÀ‚«p¸ZZ;\Á• ®‹–ùªV{° pWpËDÈj®à ®¢™y WV¸rÚO‚«}þ¬Œ§†Ã\­Q{þîIO‰pårçïúÊ‹«ÏŸ-MG'çÑϺÃO“]~4—°¼¸úxn ? Ì„p5ÉUõ¤2V°ò±Wq8XÕcïÎãoÁÕÅ¿úòZ}xÿîÝ¿ŠÅÁÜQ!¸êÌ„U÷ X+?Ë«p¹jXRo"ÁUÐËöÀ„ƒ¾”F2ñÂÕ±÷ÌU€Vc±ú0^Ž\¤ÆÏ Â^…฾µ8ôó‹÷}ÌŒ«7ééýÏ¿»ý!\­³¹šøÑ WêÏòœWogý­´U'ÿq†~ƒµÕÁ’Y•dyd.œKwÞô‡²âª´Rï?J®üÇEû Ö\-¸Œz¬œn ¨Æ¦Èç=?®Ìç¿B±W}k#WZxN”ó’÷{v˜Jà Ïjgر±RÏþã¢7K{€µ˜O]’³ÎSšêÇó8+_®ÎKÁÒ_o÷5„•Ѧc™68jê™è:Ñ}Æ¸Š Ú MÚr|ŽV/,¨Q‡0iEßÁ•ßjuk#\s¥ñ ¯ã4Xrµå\q­ØáœHºØ+“ÁJ÷œ¸ ƒ¥Õ_³"“F—Šºà*Z®41Ò“øò{Ñ×KZs‡ä­õÊÕÁZÿè{Õé(³ÌÕºmípåªÚ)ƒµdÎÙçf´sŸ®‚áê,í˜k[Îï6|ƒ¥Œª½ŠÈW²Ú}œ?WFÿ­Þdé^á*¨j;Ñm7\Ù:¯®Bäjk kXÆ:WœHµÚ»!¸Ê§Ú½Á’SkWÁT+»\ ív€\Ä•ƒåÆ\Á•Çjïö0¸0XÖÌÕŒ#3àÊ/W6 –½ñ†«°æA‹\õ½‹,Ë_¸ ¤Ú¾mé{ŠÜaáÂÙsµ—ã+WN{ERè;òâjàý, ©¬æ6«pª½Écc+«Ó“‚ß(“½Ù–®ý+Ý-±p•+Wr¸uQpå±Z¥ÃUøIàÊW‚«ŒªËBËö4È<Tœa‚Ý//§o†®BäÊÄÆUø¡²­vÿglp•+WvÁºvÜá*7®41+îpW¸ ;4šWÝüeû?dsÇÕí‚3¸¤ùq%“:Wök‡«±dw°ru³§¡Œ“°XÙquå`íì£ì5X÷\us´Á•¿ê÷ö}åÎÇé=¤P£‡Á•³ê­,?\Yx8W› ÖöV9äjê´ ¸òëbíl°än\Ç'\y½ñýãÖmtÌ/W2p•Wfc¾å•aÀ¦Áܹ²ó4D‚«\¹2šãýn ®àÊB«°Wpe¥U¸ ‚ÂU0\íû\͉½ ö4ñܹºy¦§Èn®‚»óÞMbãÊ(#®ªSOçIeà4ú`¹Š+3¶yA)ru|4ÍÉôsÕë ÇÅ•²áª&êôð+&®LZ\)=®Þ¼–\ Ì„¡rµßXÈá]ŒŸÏ“WŸ½Æa¯lù¼!på,;\›d[>*®Œ¢âJ÷N¡RåªBëË«9êÅDÀ•ËWÒX)-®­¶Ÿû-p6òØ:¸‘ô(ò¸X­BâÊÊT(oC¨î«liqu<“SNÇp׃êp§ÖÉxå*Íy° éýûc4\™˜¹êÛÛî¿£mÔûùó¥tÝ~Á•íÑS_ë媎µ`…ÌÕP !®ú7`ÈeÂ$÷öªøýñr¼Ý¦ãîb÷UïúG’ à4 kþU¡÷ï š+ÙsÜp5X³ÿÜXv*=é©¶Xsu òôù¾ñ¬ïk [rÆûúZ°tï¨DÌÕ3/Á•ŸvèÞd)âûëLðp嬞LdQse®ßå—àÊX{¬0ìÕÕ3Á•¦ì»$ôœt£/ä WApµ­‰på/òWCÓDÄ\p”8\Y ®àjè%¼ˆ¹"{¢+°8Š{WÃk}+[–¿JÄ`…¶,\…ÄÕêf†¶,«°¾ÔIpåeo\NJçöà* ¹"`®¤µ ®ÂòAèíÕ©¼u¿ï®‚k×Üd®ÎÆiÅO†§œ‚Wó¸Z×R9kkýÒü0Ø«Ð<[…vwýo *°‡+ Mµ8Ýhe5×A,¸Š‰«± kÆ®bËWà ï]*MΆ.ÓøÀ• ®,·d ƒå„=Ò ôà*c®“[ ¼Z?ß»‡« ë„+iÈ$ùXOÀUÄkúµ­ñ££äÎÍ‚«x¸RŸ“uÿO¹‘è;\EÆ•Æ+‘Ùû™\¥î`ÝnæéM,¸‚«m\õ×&Bºi¸Šf"ÔÌÍ<2pWó©Ò%ÜxmóÀ² \Íi¥ÿ‰PÝí¡3ÀšÑ@«`ÁÕœ¯´Bº¿i+5kߌM°àjN3ãê¾]w«ÂYûüà*6®¶¦Ï}Î7yþªÐôv,üvŸ¡\¬–ޱÇ13vMk^ÓW98Xš•mÖî>m«®‚l¯¶Rµù ÅÕa™qåpÜçxMM—\•ÜáNYGn zê{¸²e}¶«5—è-$ͨ ®ÒäJÚ͉„á’«L¸Ú)5Ä®”ö§þÜÙ Wý`ù93®¬ ÜsÕ›'U9 °PâŠÚ&ìW^4?Íé®à ®h>\Á\Á\Á͇+¸‚+¸‚+¸¢ùÑmÓD!„B!„B!„B!„¦ôþçßÅooÒ—×âÃIÒãòòǦØÂòuñöÃÊêO+«¯›¾îÖ+m©úÜþïÕ{Y/~ª·¦ç?Šy;ÿzªnîåüwKËõt.ú¸¸|]¼ý°²ú¶ØÒòÅ­Ÿ¡Zuë͸®¯úr¿ÖV.ùþ}[õt†¼˜÷ïç~ýüùXþþÛêû;¿|uCÇ?þ^X¾.Þ~XY}[liùÒ`<p=üZQÖUŸÖWU}…öºòÏO«:Þö$øýéXŒjtª^®~]P¾ä²èÝeåÛê/×YY}]laùÆÞ¬húWëŠ_Ð^W¾iCõvtáêÜ95 Õ·`iùb2]\¾-Þásqõm±ååë‘)ÁX\ö2>üZY¼î·5·^Ýþÿ<—nÕ†êíružRžšoï’yºÃeéc-,ÍÕÊêÛbËË7ó ^V”m=ïU=w™ËÍÚòGÕSèúê­Û«â[·«Öm‹«Úo_ÍUåýñ÷ú=–s-WO•Í „«",P6©;-˜ îËWw8³|Oõ‹æÁ›òëæÁæ"oÒÃ?,ž«â•¹[3·÷ðVxhf]õ-“Á΃Mó.t,*ÿV óâò·\­ª¾-¶¼|së…k¸¦le'Î3Ñêªk³²ú W+«·ÊU»ž[¾\=Öñ«—vM¹¨ü5W+«ßg¨g³Ç• ýÖ^­®ºfaKõ§Ðâ WSÑÅᵎÁ0+›×\­¬~Kp²ü×åt².²ØøW«“ ëÊ÷ÿùó)´¸hg«–¥ÊòÇêaD5:‹Êßpµ®úMO3Šõܺº/ŽNé!­|rllÌúç8Oë‹#„B!„B!„B!„B!„B!„B!„B!„B(U ¤¦ÿÍñiMIW£êI:W®/®ŽUҞϟOouò â÷ÿ>z{øg‘èËôceâ'ÿY&Én2ý ÔËÕ[™)üéÌU“d¬Ha}TÉÕ¯Â^}¶\µ?9Ö…ê窢£ÌfY¤:©zù§[®ªì‹å‡úÄúõsUeT<ÓÒSåÂ{ëáªúÉñáW[ˆ~D³¹ª’êöqÕü¤Na)¸B£\´Â^!4Ç¿êzQwþUñ7þt¡©õàcߪ¯æª>h±ø‹òø’úCH ªQ0\UÒS'~u¥*Ÿã¨ÈŸ/=ëŸüñ_Mü ¬Ðrî íªö|]„öÔQÍ¡à!„B!„B!„B!„B!„B!„B(+ýÛèdendstream endobj 106 0 obj << /Filter /FlateDecode /Length 814 >> stream xÚ¥VKs›0¾ûWp+L¢7©{褙i§—Îøææ@ÇL1¸˜4É¿ï®$°“*‰ÓŽÇ–ö¡Oûí®$³€Â‡L’è4'œ© ØÎ~͈ZIãq45&)¸Æ”g_¶ipÑ;Ç9ØxÄ€?-gg—RL!5–ëÃö*#<Á² V!£QÌ¥áE½ò¶¨¢XhŽI˜Ûa »æ¡©Û*ºZ~=»äi‘Lsm %É`³˜3’²Ô"/7€%OÃ;üé¬b}ÛCݵ é,,«}Ñ××Q •UåVêpÍïˆ'“¾w·ûª´ªºu›lœO <ø7 Ó³×°É ræ"fŒdJÛˆ‹n»»ª=øRåa²ßt=h+•uÄBpa!¦ æÎË8­ªÖZrS9„nmGH*Pë€ Ã~tfa‹èÈÊgïw›ª¯‹¼1t¨#¢,‘M_óc½Yþ Šv½O7]»#¶¨ò¸¨ÔÔ3ëù1ŠW¡é3ûÛ±¿®ÛÑ ü‰FŸÒyÌ)"Ï­“³)Ð3^â":WꩉQ'ù˜6züúábÞµ˜Þ×bNèüïMåSN,p1IkB9ò>îV)§÷Äú>Š5ϲcoý Š4ûømÏí̯xlí§¤±´ÃÂIãAC ›á)M‚1½X—¦lÖPÚæ?«—7v>rvÕµiv|÷@÷j‰×¦~çédE¸íì<{àà0‘Š™Nˆ€ËùÑ-2rƒƒ=àÙ¢öİðµdL ž$³èL6|ܳŒ%N¥~ÝÜVNáë“é»rìŠÍÂöšË… $GáejåjΑ͕ãV¢°š‹«±a;/O&aéé1öð<ø:…è4ý¢0ÁˆHNîºûÿîº1AÕý‚²Îñ}Ϥ7ëk¼íq‚‰¯íŸKÙyÛww¦"ÓÁ?ºÞá…CÛMñ¥ª~[•u>ŒçÜXWõ|,Y s~>UðÑíÞÜ• þri%K‰xCnz|X=]¬ “ú͇øÉxSBU ¥šàÿ&ó'I ëìóröä~O9endstream endobj 107 0 obj << /BitsPerComponent 8 /ColorSpace [ /Indexed /DeviceRGB 41 507 0 R ] /Filter /FlateDecode /Height 600 /Subtype /Image /Type /XObject /Width 600 /Length 5179 >> stream xÚí݉zÛ6†á“6¦;cǵ“Q˜=‘U÷ƒ#’Ú%Ê"‰åàûŸ'©Ú&¢¼ÆFtŽB!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„Bˆ½É<‰\ñ£•yÃ+‚+‚+\á WWW¸Â®Bf^ןÿi_-ëºþ+\ùÉ÷ºþvøW¸šžÅº™Ú5\¸Â•‡ü¬ë/Eô‚¸Šš×¯uý£„^Wñ‡î¿VÍÕ ®påyè^7m®på3ÍØªcá W“¾çIV®žõìW•MIg;Âo#þ® uu‰y;¾zñóf¸ÊØÕ Íðê×–Y_¸š*jàtðG·ˆüP¸²Jjø_[´'pcOãôãÒwJWqH5iZªßnêiç³@Ý)m\E!Õæçzd5½M9ù$êNiã*Ž©5§—`?’¶SÚ¸Šbê°‹3tã£i;¥«+jÎÂ'TvJW¶Qí>§®SÚ¸ºTY!Þ¶ª}ÜgM§´qU@Wí9¢g\‰*¤«ö”ö­’ŽWQQtµ9¥­cHˆ«¸ª‚¹Ú?¥­€®U…?F W‡§´“ËÂUĦ* «ÓSÚieá*®ª@®ÎžÒNÙhá*vqÕsJ;,\Åî2B¸ê?¥J®bDB¸ºtJ;¬â]E/ö`ë¢z¾"®y|W)æ†e»JÑE¤pÿ›–ì*Í6«Øß¶\W©fJÞ\ }£¨_¸XWÉVv|¹ª†¿QÄï\¨«„KÑþ\iþÚeºJyîÌ“«‘oë›—è*íÉ~?®ª±oéËè*ñ/®ª ïåû—ç*õÎ$®ªIo£Js•~'¥WÕÄ÷ˆÐæJÁÞo/®Ô—CY®4\R0…ž4tIåJÅ•*“UT^FþË¢ WJ®¬›ª¢òµ°*¸šNJ´°šêªòwÞ:d‰áJô´V\™hÁKp%Î9ÉÄ•ß]6á ¥WM?˜ƒ«Êóî­`°Jqå²pUyß Vã+E¬&º²2K.g>˜« [˜ÃM!®œÃUTXÅôƒ¸ vI±RÁ¯Ý37þø¨Ã•ÃUdXAŠ|&Ý‹¹ÜáÊ—Ž€ˆù‡¢È_·šfï?áÊ*ä…‡Þa…(òåýÃæå¼§'Œ»~•‰+KeTB{¥ë¦H#}„¾LÚ3¬0ã«wO݋ŭ†ñ®â—R˜2_ÞwóÁžÖ WúXy.¦Ö¯WñË)öe‚a+»—é(!QnBã³VÂÌ›QÕ\˺(®À æjvs¸â€« DbÝ3ˬP®Ö¢æ Ö컪¢Ý‹M½«Å_íRƒ‚uQÉÁ•¹Â åêõï'%í•¶G GóΑ¾`…qÕÌøn¶#x\ÙqåDu©¯h½{ÚíkÀÕ%‘ot+–KWz] ® ²Ì$ú}¹½À®B®”»Jð ®p®t»Jô4\YceÕà*kWÉÒ„+\i,7\iv•ŒÕäžW¸ Qp™»Ó®²šZr¹»r¸JRt¸ÂUˆ²Ã•^WiYMë q…«…‡+\…h°òv%–]¥f5©–2wåp•æÇWZ]¥g5¥üp…«ˆ+\…è q¥Ô• VãK0kW‚«TE˜·+‡«Deˆ+®´°Û`á W! W*]éa5²Á®B”"®p¢ÁÊÙ•à*YeeíÊYu¥ŠÕ¨ŸO\á*DAâ W¸*Ä•2VcJW¸Â®¬ŒÜ3v%¸JW_9»rF]éc5ügW¸ Q˜¸ÂUˆ Wê\id5¸4q…+\áÊ ,\is¥”®ÆNqå±<3våp•®@q…+\àJ-«a%Š+\á WVFî¸ÒåJ1«AEŠ+\á*P£+ïÕ–¯+‡+\áÊ«®p¢Tq…+\åîJ;«ë;B\á*D±â W!,\)r¥ŸÕÕåš«+qƒ+\ëJp…«d%‹+Xá WV`á W¸Â®p•'«ëÊW¸ÂÕõï¯×ÕŸþiÝ•”ëJ3«Xf\9\re‡®p•ª#Ä•–ñ•!WWLqU´+K¬®èq…«å‹+\áÊã„WA 8SW ÛW ®`…+\Yéq…«EŒ+\á*[WæX½Õâ W!ÊW¸Â®¬t„Yº2·ÜnÕu˜§+š+\áʪ+Á®"3®`…+\á W¹»ºTθ®p…+\åïJp«¨“«y]þ§}óe]׿q…+?ù^×ßÚ7_¿ÀU²Ž0+W‹®™’MÃ…«dõ˜×øêg]Y½¹©^Wú]½~­ëîÞT/hÛ•”1lzÀ_«æêVi+2·u†Õˆ½nÚ,\áÊgš†fŒ…«´avë¢sc½ qW®WMGømWeÛà W›«]ƒUV¸=¼z>7ÀªL4]ùÀÊÌÕªü!_û&„•…ö Wú\-š8²¸|\¸–f¹ý÷€ÓÎà ¶Ò•«õéÁaÛdÀ¢.srµìf‚²6hR.\õÚ»íWëóÏÃgüàòÕf¸yÚ{3¢÷RฮÆÏO&ê®ü¾¸F9®À¥ÂÕò?Oí?g|,Ǹt¸z}”6½Æ¢+põieZ-l¼4¹ëÿc3yè^ÌûþÔµ‡í{hm2W{¸¦|ÈÉSWs%'¥>º½º¨o«iöþÓ”Êï}ÈvZWÓ?äÔ¿©¬”“bQ Ëû‡ÍËùaO¸kíp…«c5oŒh¯p5¢>¼ÿ4»q‹¿.t‡³wëÿ¹¸Ír|åm”Äøj¯¹ºsóU+´²õv›ÖÓZ 9ìày—8bm>¸vµø×ÇöW”Å€°W)zÂÉ®šÁS3'TëŠj6éª]ýp×;"Ç®ÆUÃjà¾?M:ƒ«¼†WjªaÈa‡Á•ŠÊÄÁ®òtµY—º¼ÞŽ«â‡W&öõ ‚…+u‰+‚«þlo­-KcwCÆ•êöjsQª|7v7ä,‡W6®›¸–ÑgdÚ\åãÊè3p¥Ý•ÍgàJ»+“ÏÈuxeäºÔë`|&@®ÍUV® >W\|&®,¸ê{&—&Ç^Y¹ïÇU4.?b1+2#W½Ïè#æ ›Ÿ«µl^óU€«Ëϸ–ØÕÙá„ÑkT­?'îmXÍÓþûÖ3|bÃUÏK}ÓU³Üþ?q E_´+gÜÕ›°nW#«{—äaÁã«Ü]‰<73Áæ‚âÊ,Ùßu5î™Äo5fàJ¸%®¼»B®Æ¶ÝÚº:Ú¼*\M9l;zj`¬" J-+#®ÚÍë+Wû›×Q…«É‡mªj× ‚ W>Û,TÕ¦D•Vö]ím^Téo®ì¬3¬7¯ƒ W^Ûn^¯ï3Wejßa® Ù¼n–äàJä¾.á’SK®œuWÍPýpó:°p5õ°íP½^ý*a ®¢¸Ú¬*4›×‹ØcÆ•Øuµ[ªê¶­/J¸‘XâlºÚ_ÿlZªß.Åæu\eåêhQ}³·¸„{<q%ö\œ©Yng‚%l^·Kœ W[JçNÿ•µyWþ>•t¿lžSö|…®¼}*qÎî>ïW”Z€%V\‰X½¥™®œWÎá WÆWfa7r7⊭Ŷ\‰3⊘‚…+\áŠq%¸V’êîp…+#Ý ®€¤öp¥³úq…+\áÊLí+†%W¸Â¬p…«Ðu¯–àÊòZ€^WW†]©……+Ó¬´º\¯w°ÄáÊv­ã WŸ\™¯t°Äá W¸‚• X‚+\%¬8\©®pu°p…«„Ý ®tW·:WWYT·2X¸Ê¤²u¹\­ëÊ• K®2©j\•â*rM+‚%¸ÂUÚZÕúzÖ W¸J\i¸Ò_ËZ`á WiGí¸2QÇ:`‰Ã®p+°Wë·*ê¸ã« W&Ú \åì*aí&‡%WöF¸ÊÖUÚANbX‚«®2tu©R½?/U,ÁUüNÈûóºr¸JÑ\eÞ` ®Th®®LÅb±JKp•çCâO"Wy.1$ý(‚«ÜY%ù0âp•u/ˆ«¼\©ªçè\%¨Ç®* U…«IÕ˜ÿÕ„‚«­CбWÜcŠÃU¬âö„‚«5˜fªÕ•ÃU!¬bWp¿úª\9\E¯½t ¦±Ž,Ê*øõQÚüñÑ®+µ½`Ä–R™«™X aU)få–¿ó¶…»šÄÊå¶òîq;@Ñ®¨2Àj:,q¸ÒÀJ›«‰IpY•V¿T@V庚ÊÊid5–ß½–…ºVüvXoG=oá-Ó•VZ]k²|ï ÏÜÕ¼®?ÿÓ¾ZÖuý{TccŒÕ(XÞ/8Ƚ½ú^×ß_xéW4³ÁÞÿu,¹»Z¬›©]ÃU«¡MV€Ë£²_ý¬ë/G½àôŸ|õ®Á qÕ]ö®^¿Öõ¹Ù Ze5¤/ r1gþóÁUXÿZýzñÈêð¿&½Îkr“æáÖV#öºi³²2 +Ð¥ç¸Z>×ÍK±Òëêš;Ô JX••«çÁ‡¬®d¥ÙUªÖª WmGxŠ•ÚñÕ¹‘æá"qÀÛ¯àjÞŽ¯^†bÏÐÄÂ.¬‹?`û‹Ä!ïê“¿«e7ü2¤«ëYYru¸HôfQù»Zýlþh±®/ÈLY.‡½Yö®íÏf÷ûueÙ;=7wú$ÝÏWÓ ÞJ6 G’Ã6%ù{7´¸Ö V¶š«®l‰ŸÅájzË¿;Aø¬þµÄXm‰kq¸š:h9¶–u~cV5ŒUU™sµlYå5áOpØÝ®«nhÑÁw~cÖ'™°êV]^pæèrncÖ%&ö‡ì›Ü×c78âê Xrº1ëbc•ÃØªýâÝ"1®ÂÉÚιÇÍ ²’–Õ¯ÍHW¡~t?_±1kÀ‰Bõ¬ö‰qt¨ñfgÃj=¨Ü-ã*äœûËUöXµsà£Eb\œs?ïýËñŠV• «õ‰Ž‰q&ÝÆ,ÙýÛáŠÖ¥ERsm•;»HŒ«@ÍUSÒëŸæ£­‹‹¤U_$ÆUáÕzÎÝÉ:\ѺtF§²ƒª¬ Öàê`ÎÝTÀë5+Z•!V ŸóX®«ã9·È5+ZvT¥}xh±®Î͹åxEëdŽhEUòGÒëêìœûdEëhŽh„•‚ç—êªgÎÝ®híÕÊáÑ+Ï.ÕUÏœû{½¾Jšµ¶Q³0´RóDvž?¸ŸùnÉz„²›#ªg%jPáê´sÜÛEÒT”l®4xQ­JT¡ÂÕIçx¼‹Däª]˜ÂUoÎï"é®4¸Ç®Æ¥oɼ»»ƒ¶ TK W‡éÛEò}{¥(©KÑm Wǃös»HæGW¤­T¤pu–x[2ÈUwWÎYs“Ȧ­ú@ƒE|¸êîǹzÑÝžWWD¹«¹àŠ_áŠøžÞ8\Ÿ®vëW¸"„B!„B!„B!„B!„B!„B!„BHù?ªNhïendstream endobj 108 0 obj << /Filter /FlateDecode /Length 827 >> stream xÚ••Q›8Çßó)x«‘‚Á& ÝÝÃÝu¥VjÕvóÖÄÁ©1]õÛwÆcr]ªÝ*Rì{þþÍ0žðã ¯ª|S7IÕ–yÉeÒWßVy]ÕR„O¦aITe0–œë7Ç6ù×®>ÂGÙlÑÍžÿ½]­o…H¸È+Q—Év÷ßñ²…“6ɶO>3ÎÓŒó¢`ŸiÅÙ|L«‚=¤YU×l0£žÒûíÛõmÙ$mÞÖe„DÞ‚tVò¼á é@xÙ`x¹ á²b_ Yìœ=’åš&w'5šé@Æ#î·®'kgM:;»IߠѰWî,‹›_.ÇÁ†”³À,åâ “wÊì'Ï9(V„çša ÙÞ©>ÍédœŠK¡cýàO¹>FÛQÇÉG_0à8^; ^xy‰§//Dló¦¨ñ/¸¥dï?ÐøGFc‡É7d42ä}%Áý@½†1w·7‹âòןù=Ȝ˦/F~¸$Ž ŸóñA°nW`~•Áo€ žÃÝç/'í»KÔÞLþ;A'„Š!) öç`{÷½sÞw·(±È}@ã9¹ˆ·>«_ùäÕuÞljøæAzMüæQ V¯·«Ÿ±jýUendstream endobj 109 0 obj << /BitsPerComponent 8 /ColorSpace [ /Indexed /DeviceRGB 63 508 0 R ] /Filter /FlateDecode /Height 600 /Subtype /Image /Type /XObject /Width 600 /Length 14553 >> stream xÚí {äºq¦¿zGò%¶£YïÆR6Ùl¤d/έ{¨ðÿÿUºÉ&Q¸_Uõ<öÑHÝìFñe¡P(T ÁÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂâ‘,rç|Íû>ÿ¼Ò÷¿Kþð¸ w¥Ë/ßÔŸb%C{ƒ«WÏ>WŸž/?üøšÊUŽöºç*êy»g®&]>ÌÊHã*K{ëbzÂ6 suãên²>¿b®(Wïÿr±ä¿¹êdþÃ4àùö_~ñ?~‡ÏÏâ¯ÿpyÑßMZ{ÿŸ—'óg¿_ÌÞE7üÝå¿ó<_ùŸ/þÙ?M/¼¼ç7þj½°úžù3zåê×÷—½?}ú¯3WRUëÈV•‘q¯Ú›~õ3õ 'àêrŸ¯.Â/\a²î“‘¿=Ž·Yô·«fÞæ_|š•õËåçW âg÷Ö «ïIöx›âêoŸðxq¯>ÿã4 ¢ªud«ÊȸW®þæ:÷¯®·õõ2¸oW¸\}þƒø÷ë?þ þßäH\^ÿ·ßþúõúÊÙ’_þxyëëôÇéõï/Ë ï¾ýÕ~aã=âßûÕåÃËeo¸{»•ªj™T÷m¼¾ëïÿzU(\ݦ¥ï÷.®n>éà  Ûë_óTaþùòúGu¾{³«¾ç¡kÿêáõ2Ä [o7˾¨jU÷M{³juŸ«“ÿsû«G±ZïËÓôÓíõªçùþǸ‡Æ•ÿÂÆ{:Öåã÷ûOÿ|™ '®ˆª–‘Q•‘qÏÚ[þøz›»æJúW!®¦Wú¹úþ»5hA.à¿°ñžž¹ºŒñê»[¸Z"[RerÜ:W¤úVEWêë W—ß|úÍÿúÓ} Wæ{zæjZúLSàÄÕƒ¦g¢2:n«½: W7è :WÄ‘Z^ÿ7ÿ´üzÖä›n¯¼6ßÓ3WWcsÉÄõ9o##*£ã^W=Ô¿êœ+b¬çeÛWÜ*óÏW×ò÷×EÎYæ=J®æ_¨\y/l¾§ëgô:ù=Î\QU-#“*£ã¶®ÏÃÕ¿½\-¸>vËë//Ÿ¶Äî¦ÿ7ý«ù¯·ø•~aó=]suÞüÿr¨WU-#“*£ãžµ§Å¯ÎÃÕÿßó4q+?ýöO†5‘ñoŸâÃÿÿ—×`ß_/¾èúË|ýíI¼^ø·þºøöÊ…÷tÍÕ<¦›«$UµŽLªŒŒû¦=!þø_–`|ç\YD] —½ðÉvÁXŽåêåêKÜbË,ÌU)y#s- sUL®~ÃÅ«úÆÚeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa))èRXWÍëªË‡uźb]±®XW¬+ÖëŠuźb]±®XW¬+ÖëŠuźb]±®XW¬+ÖëŠuźb]±®XW¬+ÖëŠuźb]±®XW¬+ÖëŠuźb]±®XW¬+ÖëŠuźb]±®XW¬+ÖëŠuźb]±®XW¬+ÖëŠuźb]±®XW¬+ÖëŠuźb]±®XW¬+ÖëŠuÕí—þñõË7ÖU§;êÒW¿¾`®zúXFyœÕáêA¼â޹êâcSRaµ¸â ´˜«&>6ž ½»W3ZŸjçmñÎÇÕ6]„®R•«¦nÑ2þ|ô<\•aŠ\íÃre=®spU–©« ÃÇ];Gãvn®Š3e§êCpåWe‚¢»×Uy¨TÕÒÕûÓܨÈáµïy‹ÂºŒÖvç\íHU%]½âqY>{‹ât9~®v¥ªŽ®ÞŸVš^;:hˆªèöÌÕ¾TÕZ>.?¾¿ #Ø/W{yëÂ^¥uß-WYTùz†¨ªå_}zžø~œ5ª{åjÌEJýÁê(ÛþãëüÅœù2h«à›úäJZ®€x› O’`VkÄQ\ÿ±c…·u©«Q·B7p„½c5Äú"¯Û/â¨:oîG {ÔÅjE Ò,¦JZ'˜f.j 0Wc­·÷ÆÕ(ý*—"Fìf©L¯^ºíƒðùû'çj¬vθ•Õ,B‡Ý\?b¦y2Ž­ºq†%޵ã-ë]¢/®FË›¡[¡-e®4­ÕäZ²÷ÑìÕXñ"}å~Œ*>¶)põ£ ¸ö¶×Ãâ€YØ;?WcÍËt•û1Þ¦?m $?,ó_Ìg ‹†È/u.®Æªêi/uu®‰øYrý缬4uäv¬{©ŽìÕ(¤×±Ø+m3ùVˆ3V$Òq W—%á—¿<=ìù±cå‹õ“û1J¿|YÁ©TA7^a¬¢¡ªÈÕÛ§çËó§ëÊÑÓV¶Ëõ“û1j®:t&Ìý¿0Wä­‡qu5ïW»¾g^_éSqýú #uªè†³aˆ‹pÖàÄQ\M¥?®\í—‡\«¹Ê·í£¶Ô³ì$ß<®à¥ VGrõþt7qõ²›½*Á½W¯ÀÝ},u‹ÆÛ4GcU¶ÈUDØÊ{˜¨JŽÎä_áñÂÕ«KYè«J~û/×Ê;ïO…üöQha™£gü¡Â³UÏ–îè~ûƒ½rõþô8-r®b!Û.s®Ö-@èŒE]:O‘3l+¾èñXÕ‹‹~ÿÅÕ -¡ÎHÂnªò°1ó ÄY¸*C…ü»­qJûWe ]®Öä â#«¸Dš¼%ξõö1W•žÁ—RëAܦAH~¤s%“qß]X‰(®êøí{ŸwÞÉ\µí3,–d\×~Xï1ݵ‰¢Ê™ÈŽ˜T†ZëÁ½ë3ìd®šæj¹‘£Ñ#€ŠS•U”!:‹½ÚË\µ¾Æ™îåH˜Zýur1\ !£1Vñ¯v­Ï°—¹j˜+é÷ŒËÝ×r­ hÀÁ߇€Oóû¯Ï°›¹jÙ^-÷{¹ýäüÂ"| oµ´Èlô¿ÚÍ\µÊÕzšFР蚄¼w0¹B2W±»ÎýsµŸ¹j“+ÐXÕ(ŒÙï¶ Ð[†¬„ˆŒL1WIÞE“\É ÔÌ•N‡6ï}‘ŠiÕ¹z©gØÑ\5ɨSNµaM†AðÆ…Vz½Û«ÍU‹º’Ñ„é_4EFý“4°r°ŠÏ¬ê½&¹øà\ RÀ(h9>¹Ï (•¯Ü+4 ¢º}r5ô¤«5øyóÞG9W­‰|ž;Ì“¥*&1XÊÕë²Z9¿}WsÕ WÚàe±9q™g´LÔb|öc¹ºÒôýþ޹ªo¯$—F¬¨ èIîú¥dí†h¬éÕrÕæîáu¹Ú«6¹ò,ó¸Î|’*A7¡W}T> ªÌñ‘öê–Ïp‹¹ªï·¯S݈uꓵiÕï'Äe‡8Ú^M‡½ªrµ3VÍ®q×}\s« ¸ï"t¬ ÑÖêÐypý¾ßƒ¹ªÎÕÂθ0FÎÇ] ѳà±ñ«%ÿøý‰¹ÚÃ^M·{$ÛËÖZµ¾…edµÿ£Ï;ïñ±{cÕvþ•šË°š.™Ð'|{ÆÑåþô¯˜«Ý¹Ë<¨¹ôê>Ž«X¯éìãìŽU›ñöÕŽX°"s—¿8߀´ÃÌUŠ5ïŒ+z ËÐÒ¨èt½Óσã&ªòv]ãJµY£e‘óV¼¹ÚÕÑéŠ+w,gèLWò¤©¡Èq¥Ó¢Žo¥œßú0=@5‡Ä¢Ê>¹*W2Ù]í ç©J5ˆX®Ò@?Wî ¢W®ÄZªVÈÚ ôäüšõà0Ó1UbbÑH®LÅ k®È=W¹¢íÉ?à™þƒ}I›vÊÕ˜E•yX3«V¹šïø¸Ú&}„ÒÒyX¥–áû(\‘ü7ûwè˜+1GE׉ŽÌYrš¶î² ;l¯ÒÙtÚc=ëóÝhÞF‡=ÖéÂöš$šÊ GKŽ>[ NE«‡%ãX¬ ¬“Û«Ñê;yýJµÏIÞǪ1]©CGbždlAIm̲‰\áãpµ®£}Ö 'Ô>1}s…5z²·¬ÖŽ‘MâÜ%¶öâ#q¥'ÿÛõ£ä#é-­b±j+åI…MPúVÒÇŠÐ1OžßÜïH:€«Q[Ó¼kX›c»65–W÷È•°pEª·õ´œ\ùÌQ\UÒÓpµž8û±#KnaiµU›\‰%YTÚ&iÆ!ŒЏIƒ0í¾'Ì Îî·ëÕ-ÈDhÉ^£¾…¥={¿\I¯G-ø±ºV®XCÊz/m§G®Fs¨Ìsð„¬D¯\­ãͨKØŽìȤu€³q…ór¥>°_Ü›/Ù/WdjÍW¯ó !˜DWæR2ànõÍ•†r\·¢_®„…+u{Çþ¬M” v%¹¹2Lˆ3q5Ú‚8î‹/ÇÉ]+Þ\µ¤+­ðôˆžÐƒYÆ$9ÀÄ ¾”œ³Ç¯FM\­.¶˜«V¹švqÔîoP –ÑÍËf®|Ü©ÝIúåÊÓ Ú‚I¸+$˜«¦t¥ffŒŠ­Pã*Ú~ε»}¢½Jo\©8%ãÊâ9¬I”ƒè㠯ќ‹åRÖ2*vJCœõƒeñô  >W¾Ä˜S¡ùB™!Ó WÊ*„€¦”fSÔÜ™Á u9…ø\y3®èv¡¬àjcoZn÷Â)î¨ÿyÔ:,a5æ´níê|Â^ÿ¸\ÆÃäʹZÀº½Ø8WŽœMÜ*õ‘­R:SRÿ2teM(*¶1ƒ>¹‚Ïu'G{AüVËÚ}zr­E®œ›x#9(AËlÛ¸ZŠY-å]uÍ•ãR î„°6r\½ÙAaƆ¹r©ê ™ã'W.‹5¼»óo5qì}rîD$Ô­ sãã†ÈytÍ•ôÔ…ÒN7YSLÔzïÝ‹ëdJz³W£ÿÝ´ Œ–ƒkÿ”D¥^¹içÕ@k\-? pL©®<"ä`Õ#WÞýÅs÷ãi®ó­ÚåŠt[¢[7ú¬/ÔA1ó 2¾qŸ\*Üë¹G>sE#Býreös¦Ps|}–`åÊu@âô\á) S~®’ Þ÷<(Ìü2«Å»rŠ+‡Uw~ûè°ØÐŸ”8wiÐ2zæÊr7ͦpbÚ^ŽSq¹ªã_M—jq[Ô@WMWƒ~JôÏ•½ ¹Â ·M¥ð5ÏÕ¯ïªqe$%£-ádî >WêIIØL”ݹÈĪR?¯ñŠ»â·HVФñÅ‘Hàj°½»o®|ÍAŽvÁjX€R\‰z\]{äxÐÚÆ•ÜÈ7 ¢£'Éæª®œ_—r¥΂¿•xköj’ Z%û.Ò¨ÓÔ"]™H˜OÆ•ãU«ëD¹R|QaÏù€•Tˆˆª‘5¹ª1Ò UÛ"(ÖgüH\-1+['qáŽ<È2€a¯½#®Féš“ùÏb®âgAdh˜«pULئA+ø±R±¦ÁŽâW£ a嘸º LâJœ›+ZXTõÚ¡çÑZN~Y± j¢_®”ZšF”uÌUŸöjíølBçJø‘áÓÀA\]fÂyâÌ—ÉäJ­cB\ŦcwÍÕ Jvqåß,1ËATäªÂ-eõd·®0#CŽsÕ%W¤FÅÚçÒ:¢Ð<•® ÑWê"¶üÈ(Ós2®Fÿ”4Oí—ê CÅ­CÁvôÃÕ¨epÃ<Ã…È©p°ÆwÎÉÕz®p€Ò”CX ®Bí"‚í¨ª«_2r.WZZ‡-â’Á•ÀIíÕê` $öB¾¡yPÄäÈDòm†+íþ«9}$ƒD¬b¹B\-ï ,ÔED<É ‘w޳î…+Õ!Ô¸’šHæ*ÂÓÇñgâ6r¥4Èë­gXâX›¹-O”ªˆØK9ß@§\Ñ:jBï m›Cöƒ¯Ý”NìÕè°Ô+•ÎâžÃ¹’ÖJ;/W¹cUЏuÅ•+:û¤e™+ôé_ÉЕ £ÿ¶Mƒè™+Ë3Þ€ØÌ•è’+rZbÉ-Xº™+«ß_—«’Kv¥€¾éœÐ È^¬ý¼\ +ÅJùŽ ÆFŠ­i:âJ=•«%3 þÊCX;þuNgöJŽ™4xölóÅ.ª]\Õ·W—%á—¿<=”àj­ËªY[«K•Å¢J~´ÉUœ¹RTæžîRÒ²ÍGz®Þ>=¿~ù¦çÉD2¾üh@¤ÚX÷jð¬bNÈ•ÞnW/ô嬴É]pÖÑÅ5µïšÓW&¯£1é­……^C,ƒ+q$W‘gL²¹Ü+o¯jûWSé+WEòGX5¹‘ŠØàÕã%¸_rè“\ «ƒ•¦êªÙ«»‰«—"öj¤ d2Ò\¬@‘ë^%vIK3ì a^]•á ¡©ù[ Øc=ø†Ç‹žÖ‡1—+ܸ"±u²Ã%ÔLµôAKÏ×€¨UË"òŒI!®B*äœ*…¹,¨¹ܾ?0ƒ²Sn/Q”g®¢6+íãÄØ+ÿ$àÊŽ•Ö,{3HÑvüêöŒ KÀµR¹vL2«¸LT«IqÆ¢WJúšëyʨ׾cüªWË—ó ¬Õ!Ò¬•«ÃyÜxïvWZdˆ`a'®Öz}[ë3ÈirMÓ Ød®¢ÔY;ÚÛrÌÏÕà PyV"ÉkO®^ïT¯4ƒ+¬š£ýô”¶¡Ñ.Ò&®Èg 1dÀ3Y î•apw.Éä*d ·su#ê­DœaT5W[ƒñ\Õ²W×5ó÷{ïZÀ.ž«ÁéIú*Sä'‹VçêûÏŸÃkç®ÖÞò2ï?Í^ ^×)~ Q«‹†&e½?=glâ z„ÂC¢ÛÚµ¸zÿûç­öjõh½Z‹UÈFsU-†<Ùõ—»]9Ö¤ \é9 e–¸Z'TÛóšW8wÂSi4)õw”,†1#i™«[ +hÛíËÇÕàÖ;ŠI=rÔÜ£¿ uñœáö8{µD¯„Y î†£ÕnWq]xëøW/Ë'lÛ‘l¯†%|FíÐa]®ŠÄ¯°4[·X%b½qãÿ§x~ðÚLh2Xo.Ç=ÐÂgàcT Š½}qEW4Ò‡W›S¹Ñëùij¨¼Í‹Û»°®l_Õ—Ö7øÎqâJ¯FÝ8W \iÅU×.ŽšÇîžÐ†ó[ ½e·re\k똌ôJì“ù’gP±Gs(k—u¥j´Ë¨  Q\ Î|PÝËÞd¬Œ2çÍî*‡ÐFóÕÐ6 •¨\:W¢‡ú 9\ xÛ'wÀRQ¹i®@_ÔßòúµXÕãÊz$‹+Är5Øf4}Æ6¬àÈen˜«e×YXNÉÃÈõÍUe¸Ê¸öÓ#‡qhù`Ù§¶È•z{–ƒIp[öd¬ jÕ¿ I×Õv®Pr‘kI9Dã\­ëÕQ÷«\\9/:„æ·Zý&B§Gªr5Ø'o¶WÂ~(§Þ>Ž÷ôR°P³<1ZL‹r,7VÐiG={å?=’ÇR¸‚@`(ÊUÕºjïO¡XÝ|tZ¢ˆD®¬Sy^¡^ÝÚÀ鑚\ –9ÞrñÑq7ZªÏy]ÔM\Ij$Ó•R¿ÐÒ Ïª£bæ*s=èɬªÏ•0ôS”+ãŠk"oµ½‰Ç \ÉÇ`v¯d0(];5®²ƒ §ú[ðE3¸Þ<µÍ“«6ãWë‰[H®VÒ@:ί†KSÎΚáÊ Œ Ql?»,W¤·.n%?°¨ë¥/xlÕX‡¨g®W«—¸Rë¶—`Y|4È•¬þ…Å¿‚Ìo7Ò°,N8ýåa\]eŽˆ¾ns°,M–Ã\YwY]É­¡el±ßˆÉ¹q’Ö§¯6ÌRu2Ä|—Z\-Ë—rq†¹zS›\ѽ`©ù¡¶tv6Ü€îb¾J-®–4ìrqQ¬(®¼…CK.oÉ7r%HŸq=2oreÉ Ò6z†Øg®{É•«W‹½]å¶õ u"lp2óó™T+F¹ùÿq\ ˆJ\ÝjZ•ô¯DÜ<8Øtê¬Ç°Ñ»²ØÐf>ƒœÎÖåàT%Áû QÞUE®æEá&ke‹díÕà%¶-\ìS ,mr%cU!H{ÆåùKŽí\Uô¯ªè*Æ^ )Pv62ÖÅ»I}ÃùíòL*hkb¨'ß|}§bgÁ¾¸…¹Ê, Bµ–¸ZReFâXÛ3Ø·s…Šy2Å㢺C•«\ˆ¬/+ÚµWÓ÷SϤڊëxžÁx¬êöK}Û„•ß¿JâJÀí ä¹W0Õ®ìäF¸º¹#9ÎKï]ï‚pˆVOåyðå®(W4’›f¯ Õ»¢ \µÞßyún£QP€êÕ_¥xˆ~îDe®JÆE5s°«l ³Ê±­r%`Q Ÿ Ï:;ß7W"w„«É|^]map%ãC-Û+- ™úŠÇ†ø¢ËµüöÕ}/=ú¹DÒ<˜[ë™Ìƒ²°OL –c¸¢=›G‡'@Ny¹¹B|qÜÊëÁmQø0HáÊUö1ó™1ÊÑ Š­q¥–£]Kåˆåì_#¾³¸h€«!'ž’=’\ÊM\]Oð~«Æ•öìŒùcâË.T÷¯JsEî`We#£„%­Ùvž½zݾåˆÐ­_kÌÿ„!¾LL5®~üççò~»p5„Öo¥"XJ¾®Ú‡;Îðâ«¶+5f´rD5—ˆ]sV²WK_Á«”ªÏ`‚u$WÔáêj®ÅÛ°‚öØäJé8TÅÝV¢ú P‚âfW.ÂÙƒI{©ç¿ü¹Nž ÚÑ\©çÐÛç +Wd{S3Wp9£CÜàRº5e¯r¸ò5IÝöý´Æ2 sEÏЯíRA’EéB¾¹êt\ã±òpµñì„ÑK­r5ûM£<” ¡ô2g(àä*¤¬5í¿³ø•bbJpµ­g' ^ U{µ–¾‚RõŠN}Ô‡wTúˆ3X¢G®ààjÈÁ&®@ޱ€N6ír5u¦G&hV>䦔Ã\…šÄŒÙVâ¢ù\‰*\A«›ÑàyµÙü(‹ ªåAû°èJ¢ÇD…¶-Ì6嵯EÚæjîë (ÁR½RzóÚå†xï±ò\ >Õ¾¤ññ2\¡:W3Z }-õöˆ#LåXRIņÁô•ÜÜâCpåx ‰ïŽMw`w®Òt¥OÔ£Ö C5X€6,W¾8‚uì‰+-\)‡i6Õò7â=hŒ+­±žQý*¦k ®µtäj°c®†¤khùG[vžËqØÚÙð—¡l`]'‚îêPïs€å¢þÕ`Ÿh>qÚ Íå šs¹)â‹/wW°,ç ws)ªF²®»Æê>ÿ*õÁj0†Ë•µØ 7ÉQ~ªÙ`Éív>§fÃﵟ|\)Q­×Ý›½ŠÁÂ\® Ýc),kö7׉šh%ó$&0jɹA²»Iï6®DÄæëGäŠ"G†*ìÉâ­b­Vš\;ùP<Ùg‰,SFøB(ÙØ²œûmkÐN,ˆ³p•x %KøS/4Æ*¿\›Ñ¿yãWå;Ðn~»Á•ê…i鯃å999WˆçJÀÁ•(ÊÕ:Ýk¯l™Ä·mZûX&2@=”³¬en•‰Ì&'@1RZ¶WƒÈ䪤½R¤Wð¯–RFßïþ•l-h,äF5‹Î”Ò—•eG\¡W8W4"ZðBTå*\¸\9d›la"-” Qáê¶3˜ÊU¢¹:!WeFc:VWÞô²™¥ --®n¿\—ò”ÂO6W]sezH.ÔËšàÊ!ãÚ‡L–fÏ”2XËΠm»Â¹™:öópEÖáE&¬Î¸’åˆÈ„©œY7¹Ø ¼§:ÅiìÕróé–`‘1iUaë΃/¾dä0Wã/%Kt®–Ÿr¾2†Œ çáŠâðñ¸¢UˆäV3Œíͽ²gì»K‰¥ßݹJÀJ@÷-Q¬ýä®~ûv® ¥UŽWŠqW Š`Õ?WÚb¥d[S-΀j¾ègøô¼a´N£~8YÉ¡´*W(U›~ûF®JE™ : ¨ª«Íþ•u^ÓïòÊ•Rš4àå¶É>Wz~{¡oõÀk»\émÂaájPË5èç Kq%NÁ•r…±’ ø¸‚+ùÿL[ì‹'àlöjˆ½ÔÚg…ˆ2η]÷c Wr™<ØæxŸ·‰•8WñúOˆ½@ÑP½|†¢\Y²ÜÕQ Æ3𙫂ë@ºb߃«k¿Þ¿<=TãjMk §4Ô/÷f{µwÆ4¬ s¥ç“L¦jºzûôüú回'£•fŠâÊ[WlÑ*Ô_ºûÁuIM“5ãj}¨«quMí»æô…òúb¸òÜh¨æ úYS[Žes¼'°We¹‚…Ùº\M¥?®\ò󱲺Wz©4K»¹Ñ[ÝÌ•;¾e‡¶¢½º›¸zɵWcpÅb®\\™t`Tõ¸‚¨e¯Ô)CTŒ‹¾áñÂÕz૬½‚L_TEéiÍìCCFñ4Žr•U™ûnçJTåjÞ"Ì߃s œÉIhý„³•QÁqççÐn¼=‡«R ®Ž¯³ï_-9~ƒWð=˜ðé;d°åjȹL¡|>[ÅÚ®¹Z0hÜŠ"Ð;Të‡ÖØÎ•Ï(ËU½}œH]måj]¹wMÒ·DB=®bkä ¸ÒC×g(Æ섚YÇ™«z1äè3¼%¹*5§[¸ªi¯Î;gs™!ßÎŵtܶc¸Š®9P˜+Q–+h! qp}†m\ ²ï‰‡+ÿf¡ˆY¢E{5ÇÄÊÆ•¨ÈU]{EN©°ôO´Wˆ²V¨–Ï[s '®jåª%ÔgH7W²ØÈNp´Ðˆ["x'ªÅ"käªàª†×¾©|!]eqµnÖ̧IgakUðÛcÒãvzv_årUn–5®/º‰+¬5ˆã£•±–!#†q}Þþ\7Ä3¹B-®Ð9WËûÕãv§ñ$7D>À»põæ.™ì]é^©\¡{®Š•VÝÒ¬¥±â }spÛµ•¹zÉŒ3Œa÷`0ÎTk>ûV®P•«ˆ*ïe¹Ê©LÑWõìÕ hãû†ðv®`ó䙫(®D#\‰D®ô8…ô”(° šÌoO¿¨ñÝ`bÕ WHãJݼ)m¯,\5k¯ÒÆÊ\¸R’cŠreÚ«ú=‹·Ìƒ­qÕÖ<¨Ü´1Œ•Þýµ°Á²Ø+´9&}«*XéaÑvÖÎY\©~*:îX²yå mq%ã !®éÇŽrÿÛü+c£ ÚôÛäÊô¥äJ$såÙµËgÀ²ö­»ÜÞzpw®à檱=ú{eË»rÞml©¢¦¯›æê€yŽÿR«®D*WÂS4!;Ú´¦‡jÙ7h5~•²R-„vK.žÛÑ++ß¶Ù+sg¼Y¿=¾c 'WͬÕÛ–ÄU¡s¨Š‡ÞdÛèÃÚW±È 0in®ZñÔaš½rT’Ë{dH»O(¬‰ÜÚF¹BÃ\‰À<8ˆ®DîÙHRúÚ’¢Ýy0ö»Õ‰2èåš8?hÅ …+xš¿åžV¡Ûr‚n–+Yo Àþ\Áöè„«Áée£hY Z W-ˆÛ6Wˆ8^U'ØÞ4WjÏÓ®J¯•P ]pUø°aÿ\Ñ׋UÀgÍ÷¯l\µ]æA„bl‘+Å`ÑXùŸÐ<®@sˆÑ WÁïÂUKy2¸òºªÈ9µI,–V!Œ¹ê+‘Ë•gÌ÷¯d™ÌP»ÕÖ¸²–—­Ã•}Ñ}®|Es¿V¼ÎÁU¥T;8V`qµÞÅ1+wy¾M¹2ÄF´[=š+Õ ´…bêØN¸‚ƒ«!Gí›ò†×åÝÎ}rµNíu¸‚8+WnMgWÀ§aÆ–ë·St`ñ8I{Æy>ðu¹ª¢ŠW<Šï÷À§ç$®æáoÂJöpÏŸ·Ô¸h‡\‘#%¹Â®‹„ «Ï?‰ï?¾öÉyLô¯6s¥æ!ä΂¤@:àJ5RP¶Ì¡›Þn¹úñõBÓËÔyéíË·§hRÄ®HŽÆ¦“†³Û4WzøVùÎ@0"ÓWïOWI=Öm\ IJ¦Oè–T<­¤¢Ýh5¹úñõË·É`½¹wxìÍè}w—¬¦·UîÓïSãñ+ãËÙR6QòØÄ1\]ûNr—ª«0W²ì±Ãƨäo”6lyÜ+ã¸ÊÕU WÎÅ .lj˿жßn”*©h¯@º–ô•P¹R.b¦±eA¨×)BMǯl\‰:\Éz`ûsõþäíFïËÅS¸’Ô zê!ÊÏ™VÐv]5«½²}Û¢\‰C¸z]º;¿á!™+É•MqkáØžâ¼›émh×WÖ2ŸUü+o†Š\ÝbWaiq†é±\Ù2Êhy€M¥ÐÔðs¥¹›®É v¼ýf°’â¢:W‰™ 3`8(ËÖž^ seø„6®JF»²WˆçÊ0X¤_g±»¹:WÌÕ±\‰×%úý>Ù¿"öj™\¡ W$Û²ñøUˆ«’†;Q°êzðÇ×ùî:¬U®dȪlgK²¸î†+[ó„’%Rát3ÚŒ_¥q¥R‚Ž+K2ƒ+0WQ 2æ¬bÚÓª‡¡íýA#ïÚÁUÙX]q•€•~j®dù3-¯·u®„9ÚÐ+«¸KÕÓÕ‹Ó¹*Ç•6Š’.„–'‡†Ïy•ë>W$ZUªþ’Q2pïÛ îxÚηÎÕòà't3PÊž Ù¸o9~%,q[׌¸Úùœ×gH:“ËU8¦’zIr;H ¿æ¹òÛ«‚ë(®²íÕºŒÆÊ{‚|›[EOå´Ï•0S˜«|® ÊrËÌÒ WqUhQ O/m´ÌUVŹ4&*š_ÝWÎhY¿»s•§+¤qïÊ:Óo7¹jýü`W@±SEîb¾-s5d\¦Ø£h9‰#ZßwŽâªÜ(àÉú¯ÌÕeIøå/Ou¹ò,‡ pÑWÖ³áhDö7rŸ&©ÚÏëíÓóë—ozžLðxéÍ¿2°*vÍvU¤ˆ_Û\W1årˆŽáêšÚwÍéKÍ뛹Ê2W¥¹Ò ÿ4¾?¨GeÔ peŸ+éêÇ×W‰yÈ™\´%jƒ²)Ô6W"Æ^‰b©ž2;×8ïOwW/éç&ÆCÍ•ÊNÇU UAÆ•xÃã…«õÀWu®J½Aq¯ ¦‚«BÓ R²fG®æ-¬ýÁcÍ•’\¤Wúéš+ P«­Wh±öNWÈobé 3hžZçJ[m¸´T$‡¢/®ÆÌ•³á¸ûÆôÌ•êkåÊ<¿Rkíœ_ŸáÂöá*:ÎP0ðS•+áã rš,n¯„¥FRkõrìÕ†òi¬ ë±o® k …¹2ãühí¼s~³¤RaKÚiÁÛ#¹*•øêåªg_ æ×gÈïž[æ–A ˆ’§ÞçÁb6â ®6Ù+Êšñ°h…4;™] ãÖšU\w Wf•ßÖê3ìk¯|ßš k}ßÙÃÕâU¡Èi%/W¹ÚPŸ! ¬ò\iYX×8[ÖÎ^WSopGžmÈ\mz3Ò‡Ûæsµ´vö>bPV‚Š9Û6¥À˜ñiír%p4Wæ „j\móE}/¶5`A‰¶ð, NÅUùïf+&ÕÞÚ9ƒ«2a†£¹zÉÒÊ1Z€+´ZÛ0‡+”ÙÆ qÕä'q^Û«Šg6­}¯¶6"+–.j÷« Zæ*ui]ã«in{ÅÜÚMkç({ËäCr•d°Š—»²pU÷ŒIÉZ¹Ú¤^ÍÁªËÕ5¹}n½”“IX´ ì1gGXû÷1AVËŒW(ÑåP®¦þƒdµ“ö Fû(l¿lŽ'ªæ½^.ãÇ××·ép¼˜Frùïü¯õ‡ð{_îÖkľ%ëõÕ­ãrO/óнçÊ7MûÂ/wö»?ãÈ­†Ü¸zœ,ýÃúC„ÙùÕ¬£ø·,ZN{}µA«Ã¯—»À³ÜsòM_R,‰¼ª:bÏg¼~þ·¯'ò¯f¿aÝÝúC„r7[ñø·H‡Bì`I®ÖaÌ·ûò‡Ùå>=Óošö}׫ª#ö}Æëåò-—«Õ?í›+9ŒišÍÇÍ–Ðoúš1M-S›Ô®ç3^'óÖûlxçg;>Ê÷NjégÔ­²þ K0çÁ—ÈÅ ¦uľϘÁ}Kˆetá_ÍÞããúC¼ñI}Kêëw±WxT,…êS?fšWÉÕí:¾Ïx;#Wq†ŒË»û‹3P®ÖaÌ7XùZä›&>ëUÕëø>ãö·sÄÖÁ§ÇE'…¼?=ôUÖƒË0®ñ)íkÉošøÈ«ª×ñ}Æõ;É·œ„«œÝ„—ÅSèoG>Ld¯æ×Z¿i²Û¾\õíöÿËu<ŸñFB,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,JL§ëk^rÞÉÂ\yÅR¹ba®XŽâêVúýéá˜~{ýï¿^~zùò§{àóÿÊMo¸þå¿]xå:;«¼N…®X*W/·rÐïOkA°Ï?]¸™¸úvÕ×ûÊÕúZCúÃËU?lÄ5®nå ¯U!'ƒôåÛT×pú—ÎÕ\ñpúáDý¶ËÛ§ÿþógVƒÂÕZz¥g.W÷bájþËë—oJ i–‹{pÇJr5™¡WWË_”Ò,'ªl\˜«‹bÒíËê`]·E½(ÿºþB󯘮eAøùßx9h_ÞÙV}7®¦_¼M¿¸¼výáàòÙíȯ'ªÅ¾ÙÕÄ­ Ç¿2¢TÓ>®Ý€»×Û_>ÿã¿b¬ä#z¢&J••Åzb)¿¸áKq7tj–Çz`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiBþç^5¢endstream endobj 110 0 obj << /Filter /FlateDecode /Length 948 >> stream xÚÕVMsÛ6½ëWðfª5a|“ÌÄ9¤M¦éLÛ´Õ-É"!‰)¿B㨿¾ ’© ]+ÏtjÀÅ.Þ¾`¡}¹Zܼæ"ÊQ.©ŒV›ˆ0†R™ER¤ˆ2­Êè]üŽ|X&‚Š£,e8•éòÃêgX™MVâ(¡å$õk^ø½ñãóÄ¥ìÛ®jí»ý2!q³~þóõµw¯ÃXÞšnß–ÎWš‚1|ïúÎäÙq¨¸ä’ yž¼8OnÖ•Ç<åÛoZ«Óè²RVŸ¹}ë2œgéÄy:eÜêfcº»ÛÂ:“\S·î‘µ¥²ÊEß™º|,MÝÙch fý(â6œK>9—œ#B9`W3''¥ù1 ž€v1@ ô¹®šÛÂñLÇ×ÄÑÓÝ<œüD\çSO£ªvNÅ åp%/%òêÓ¾2º°ªu¹·ûZ™Ô4Cœ¥ƒžÎ&á˜"ÉéìÕU«§­7ATÑÕsš2†¤”g_×{=»3cÝ}½BœÌϽ†âI5]΀™eß"ç(#ô_‹ªÑ¦¸°¨\èÿ£¨„ȸ£—Ò> stream xÚ½XKoã6¾çWøV¹kqŇ$ ¨{(Ð=(°£—tŒÄØêÊ’@)Müï;CR±ìeç^">†3ß|ó ß6WŸ¿0¹(H‘±l±¹]PÎIžÉE–æ„ñt±©×QoºeœfÑ?ºë%ÚeL£í2æ ÆvƒJ G,»“-ý©M©ÆÎ¸åmS‡R'i¢ÚÊ Õí’åÑ¿K&#mÝgÛ홣ãå·Í‹dSJŠÔÃîš”S²ŒÍ£ г”E·w­ó§kÝÂ^}·¿âßmâjÝÚŒNh¤ªªÔ­jܦG8Ö¥öˆ\Zp_¹Å¡ßiS—î¸ka ¦ƒˆKT²±øÜ©Ñ¬–ªuƒøä‘v“¾éÆQWn‚„ön×ìT?¸Uu;j3 pa«0@-.Ö–8'½ïŒv«eg HY‚•G¢B®ôj52Ïó该G²8:Q%ɺZá4‹î.¿Ój”9,%ìv!ö¸û ŽO]Ö身U=Œª-'ã6츎aæ Æ=‘Q=¸o×:¥e,´-”µ $,ßvÆ æõ‡ïëqçF2[í5»ìÐ&ž2G?¸ ®?ÁÃ2óõÆŠOí'`·'dΦk·õxWi RÅyÔ+äû Ø‚KÑ®ÞîÜJ£F{l ¨õó1ï`ƒ š;¿B’°4ê»Æ ~‰Ý×ÜÔm… KüS†à“UÌ…ÜžLVéùbâ'!ya‰XÅÙ[”=š°‰ˆª ™¦¾úŠm¶6ºf:>§Ÿ¥SqM¿9%‚ ÏÓ\£ŠO”?C—<¥ ª¯!€¾&¡ç¼Ú¶L/6Wêv4]]9/ÑÜS֠ͧŒž*i"žåÃRObsb¯éÊC³Û"KÑÇ%qĉ;E!.Æ=ôªõ‘ña†b]ïQ•zx‘“$c§Ij=`œô`›×Ëу"Ižn’S™[W8½¸Zèi½½2p¶v¸OôW,Îî¼t§<þ}JÀC£nÖF1ƒ!%‘E jìñŸ@SÂX1 <¶†€*OÍ¥ª<°ÃÀxF²D\Ì÷ž.J$ç¯ÅUê‡5óãæ¾ZóG"ëýCá;‡˜ZÎi÷ˆáÕC8 ö¦nõ€§ïMSMæ\|CL‚Pv9[£-,±Év©–£#”¥DÅóž ù€<3pûþ¨„¦$“òµ‘Äè±™? %/DÆÖ¡ë¯‡ç›Ô] ꦹÓO…'{¯k"#‚¦A×ú®nGëvutíØÙ›Ù…Ø—» ›^õ¥è7•!>YNŠüò¬¨”ùîôA¥è6„“xž¾¡Tàõ ­&H?¼ÏƉ|c¯ÒòcÿzaÄ?iÈ¡ÉåN—÷û;âÌA*/DðÎiôV»§6EûÔòw¸°wøüÁõu„?” ]”ðü¥vÉiÌÓ£“½ûJœ•a3Öt^å«)ÉØYŽ}ZÆ…ÒÈ“üò„äL~DÎßC.MˆHåÿÜ.gÄÂ3¡Ñë·Æêѵ~ú `uúH(Ø\¯.³³¥Äú^WyA8óÏEš¡äÕÿnUA¡endstream endobj 112 0 obj << /BitsPerComponent 8 /ColorSpace [ /Indexed /DeviceRGB 89 509 0 R ] /Filter /FlateDecode /Height 600 /Subtype /Image /Type /XObject /Width 600 /Length 9713 >> stream xÚíÝ {ë¸u`v®æÞ$îžzÒ´uws—q'éM¢¤[¦íQº_ªNjãÿÿ‘’Iq@ÄrH~çIf<–hI䫃C„@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ Äö¢ØOPõ?OµûöOMüѺ7Fª÷GãGÏÉäj?_Dõ?åÐìQ«?aýÔÄŸº÷Eó6zÇí)óÞ“«z—“މMÃê­ÀUîÃà‹˜~mFÀàŠ‰+VùŠx$SW©aY¤­¾8ã ®¶åêVœ±ve®ið?¸JæÊD†„¾„aô™¬\u9®B|š[‡+r®ò™ÂjQ5ÿ„«P¬$,]O‚;,Z,°hTÂU@URY"­+âˆK‹æÝÝp‚U÷ò‰eW²Ÿ•XêN ið¶á*¸«ÁOùj~¾NìzÖ¼ò"¸ ÄJþÂóC³+Uo0\­u5ú÷fPÌ®‡ 2ÛSBÙ\k?¡ ãêtZãŠH튬‘+¢a¨<Ç…« ®N§–¯«Á7Ÿ›˜œ°&Hßâ¡ áêÔÄŠvt "¯–p InWêöÚT#«Á]1‚EŠs âu€wÕÏд2i•>®Hè]±ê#uèTƒ«Õ®ZVÍK°Tõ9 þ)8',äpµú£T˜ÚË8M[XÚ¹š²Ñ¹b:Ú®bG]Võ×X¥Í^öÿºh±6†«»jÏ»îÑ¥”EÃZÝΕ€«ã¹j‹«›†“9eiûÓçÝ 4)êáêP®fn$¬ÒÇ•"aÁÕ]®Ú¶P-K{wËüš\ÖÕŒUk@KçŠ4³æWÉY‘Â*õ¬tãIÑ0\ÉÕœÕMÀI-ËÕßìá*%+=l†Wpes*8½|Ö q˜ÊÒ ÖUt› ®çJW³a5)«\n G®Ú‘s ËÀUÎâʲhÑÕpÇkÏp•˜•*­Èq¤,Òµ}b8÷Çü \ÅU©`¥l®N}Ê*§®TX¤fWÇpUZ¦«qÊ’©ˆ ®ô³;\íß•’•u!&;°˜s®vìJÊôOïRV9œWq*gG¬à*Tqe'aµ¡Šqê5ä«Ý»R·‚æ Ä-¬¾1tM@ÈW»w¥gµ«KY¥ûÐb¸Ú¥+²¬ÙM³ª S–3+¸jâíYÞIðîë½¹Ò°Z¼âB·”%ʲ,YÁU—âIþp-öáŠÌ5ûèîÒÍE4‚U•{¶ê5]ÞÚU}¥KW‹“„Ò¨|wKYÌ&ïËæêõñ©ûñ:n ‹ÌË=­LVzVšQųߜ|dÑa!_Ù¸"7VЉ H¨`•–¬\5š>û(x¹ßA}Õ#±feœw¥‡e+k8-úÁÏ_ek§ÉV›sÕ°(u5»Õµ¾1¬,kÖ®¸¾ì Y‚ôéÊ-a aYÈ¢Á!Û©³àÊ®À"'VKM`•–ùŠ”£þàj«®ÌÅ•æôϸ"ïÖRÊ¢ñpäd,¸²£eb¥éV0Θx²•ukünó\íÄ•¡fÚ…®Ì}ZSX¥>[M=m Ì‚+[V¡]`éR V„ÎòÎÞæC¶red¥]˜oáâÎiYV?$~|*ˆ|µ W ¬´%úâÊ‚3X¥®ÂšNaÄ\­-®Uºò–%„,McH¤ºW®¶îª\JW‚T¢õàŒCþN˲ºË8[bWXM{«¦s{˜×@ÚNA£ºY•˜7…pµžÕä>õäþË÷TèS–Ê%ñ–WK¬ÊeVã%Z‚·ÐjÎ …:‹\mÓ•EºúÛãm\)SÖÒÕèár uÁUVª]\Ma-s É;WreËjé~œåɲO޲Hðîv€«¬¬&aWÁ*­]qƒWkköA«Db…+ç”Å\™Yqe»fÄ–“,¸ÚŒ+ûV0Œ+5¬r,‚«í²´|½å>­‘Å)cÁUVK³~¸ŒÃ›Á›„Wkkv»fÐþÏaYË‚«b ¬\ gñ_{´Oê”Un \­fÕg+ u¬ýSÁÕNŠ+¡Z’rí‘>ùÊ‚«ý°2v¶ûh ,‹»îáj5ûÿ£¬€e™²XЂ«•ÅU,WʶPØÎ@W;`Ç•>em¡Ì‚«õ¬b¹òOYpÅ•peeÇ–ÕÜFpÅÍ•`“®tm¡EcHpµyVQ]y¦,¸Ú|q³Ô§¬YpµVÆ+Î`96†pµVBPܣ뜲àjã§‚ÆîèªaéeÁÕÆkvÓ ypOú”UÂgW«X9/€9ee¿’Wë‹+ ¢Ð‡öä" ®öÁ*+cÊ*ኣ«U5»æHF8´'kYpŇWÚ”5k áŠÃnÀ*IChHYY«_›8ºr^ß™6Ï*ÙTFXå®û6¶¾s€â*¡+«”µKW[/µ “®R5„&X½¬]ºÒ¯ïÌÑU(V ]éË÷®1D¾Ê]c•–^ÖNÇ‹z¬ïœm‰ªp¬’º2¤,ÇùضÔϰõ²Jìj!e•{tåñ²¹²UŒUjWY”Ö±]êaÐ÷4,M<åo }§ Ù ýXJ\¿SþÆ“«Ô•{hVÚÁ}³5“(*,bP¿Çé¿*ú÷_Ý~o{X¶ÄJíŠ&‹.þ¤3YÄàÌ0J¾z{Ö^dÔgeu¿…ÿMaƒ3ÃX×ïØ»ª÷wXV6÷{Å©ãG²hÖç°ŸúêZê8rÝî÷7bÉÚu¾ÊÉjvœyºÒ÷”êC:¸«¼¬œ`ete–W|jvÍ0w4Ðê‚Vlí*ëЮ²³r¾5›+­,ï3ÃýºbÀÊu®ÊÆÊ, ®˜±šÏ°Í×U'ëDÖ^]1aå6§hfWº¤åÓîÔVNSkçweW¬X¹,1ÁÁ•¦9t•µSWŒX¹,]B\©“–cc¸KW¬X9-µD<\)“–¬=ºbÆÊemK6®”IËAÖ]qcÕÞÒÙUŒËø³¤eßîÏ?Ví­ò´9W Z¶°b­?¨Z-5‰+†¬Ú™ù¢ºŠ¼‚ô`§ÚÉŠr€/Ýêƒ×â!µ+ެì+w†®fI˪1Œq€ßž{M—÷ŸÒºbÉj뮦´,dÅY7¼_hâªi ¿l¿9OV֮ؕWºöpK¹ü.òU¿È=SV»p5¡ÕËêw~‚úê³ò‡—ûõUÑWV{q5¢%Ãbñ ×GùJšlôeûÄ—•5,þ®´N5¬~ç'q•ò4´ÿDÕ'- ήŒ3Êñêm·³UËš†¸³â ËèªÙNr5J[*XqŽÃ¥zæœðý|pÀª[tu»pH›r5;GŒïªÖôrgtEa]Éï oW‹¸ÓÆX y®ÔŠîêíù©©Ý«ª}âJ}îÆU)¶ïжçJ4—Î’¸jûEkXÉÚÁº„ܤ« «ófbuÛù óUýï»$®ÚŽöæ¤WÀUZWE—¯œvš^î‹ø×qzXMo \™Ï bÀjê«$ý Ý8†·ç4®ŠÚU‘f¥uÿ#¿<-Åa7a• V{××_Ãá K›°¶íJHW©®ã$uÕʪ>à Kç*Ä"õ”õ“•¥ªC:¢«—û§D®DÑ™-¬»R^?Û‡+ÑŸír…µ[Wš‰6÷æ*ö:ëpµ)WÄcXCW´#Wº v”¯Ä`øõV\‘Ø+‘ÖUºóÁ‰+†°hôÏv\Ì|æG¿¹ )'+±W´Ö[X4ÍZDº®Rg[yӕؾ£›'¹ºêÔvÁ»IÉÎêH®¸ÁR¸2 õÛ|ºÚ›+®°n®HUryR¡ü¬áJLæ>áçjP;懴vµzÎ÷ã¹ò]í…%,ÃXcOW”ÛTÏ*˜«×ÇâýÿõUñT¹ê§äcçŠ#¬…UrfLÈpO=åäJNÓÍDÄÍ•P­ÁÁÇY·kĸ °:%?À1\‘‡+°hñý[ÃâÁj)]íožíP Åpe^1Õ +VÁ\uó¥çÐNãŠìV~XVKäØŒñcÂ*´«:dèe]1Mê*fïÊbL2qKWá\Õý u¤îg X‚,Ë5ié¦úͤ+¿~Ñ:˜ö‹j?mVXÖk[š;P™¥« ®rå«• a^XA\¿tÐU;§ßúJû5Ê+T¾ÚLºòî]•­¢»âËÇY|Ø‘«÷eu8,rf¥hõø±:ž+f°Ü]‘Ø€«¸ïe{>húÈÑ`QWÄŠU`W]õ¾ŠU6WÑ`ÆUו8ß±vµ+í!²-ÛÇÕy¶ƒVQ\]8·ƒ¦ïR†ËÝ•rŒqbeNWt•Y€«ª|çܪ’4åƒåœ¯Ô³°/Va]-.-È•âÛDù`‘#«m¸Ê{€³¹:YÔ°rÕÝ¡™4’±bìŠ"Ãl`‘ƒ êW#díêÚÕë T·çt•v)¹«`9úÊ>]åtwOÁrwÅs°h4WoÏ·ñí,çg°OX ÛBÛÞöÿýðáÃ_êŸË‰U¼|eåO›Ó’¸âË6]õ®˜ÞŠ3JW§ ‰£¿úªËj)N]¥‚eëêçßýð¶wº¤«HëZöšt³Îðp•–…«ÿû$]}³Nðô_Gsõúøþ¿—ÇÉ´ëð6 +þúƒ+Â4°lÊ«Ÿ|ø½¯R»úÅ_I]¼Y8_Ù$¬°,ÒU%êÇ_ù‹ï}øÕ¿ÿÝ}õ¾át©¾ênªÐÎê—È X®êŠ}¿Î›U WVýW‹ÓtóÛ¸Š˦lÿÅßýiê¿ÿ·ŸØ¹*Y¸Á_6^ŠËötðucøÍ¿þľh·Ù¯ûíµNXI`Y¸øI“­~™¥«ñ²Ø­qúEå¹ aö5V®bòsõ³*YýÃw?|øµOÜÓUWVq®ÒÙËw¾ö8drÅ–•«ºtÿתhç–®b¸êjrC}UÏÝpnrÕu\¹ßZQ‘ –ÈËÆÕÏe¦ú×ï5¼|šQVéÊÃU…ær'^¾øhWe)ù„œý¢. +&,«ºýí{M¯ýËo~øÕL·'V¬â¸ªç)ª³ÐåÎìJ¼ýç<_%we°"²<ü·?hžö³ßšî1 á8~W½\Õ¥Sý]ô}ÝdY9]e‡åÐŽ) Rî Š<Ò•ß:&õ9¡ÉU=Ç{ãK;É{ºáÏÖ®bôsÔwùöì¹UÕ!ÛÁóÊ|¸»j’Ñùéú8kV$Xö®^¿Ý5|“úJät5cÇUý «sBÖó3ø%¬8m¡}3Ø»šNXÄÌUæürÿ´5W1`Í\]ºþ⋼jQUçúRêË}ÝysþÖsõ0µUœ~$¨~ø«\®¦{®œÂ(°¦®êÁ͉MýC=àãí¹*CëûÇ›|u–œ~I>&Ο¢/«g_ &®Npå“°ÂÚ¸j& hNªå<øï¾~{®É4ÕEíª&W=F^åꟛý˜«ôKW1×›àã*+¬‰«~¯\›Æ°úO9ÃtíêZ?õcÔ<õüù~Ø<ñ²gW›ÌWŽ +,•«Kûý4»úòóÉÞÀL®æ¬²»bó²§¼°È”¯D7#þÌ• º°v•3_y¦«C¸rMXaѼ¾ª)Éúª¤pÕje WÍc/¿QýþËvhÈ5Ëù`éÛ Õs kÖÑ0쿺´ƒâ‡uÿ•ôS?V÷’~Ùœ+VgIßÏãÊwGÅUFXöîdlA°‚«µ + ,W³¥-Y dpù~ÂUtXÞ®6œ®Žã*,‡q2$àj[®|V X¶³_±kU¬à*@ kW®\HXÖ°HÅbµ+n¬à*T²Bj¼¯ÁÞ•`îêW¡V€±Éþ®6œ®åê乃Ëõ¬àj·®<ÖZX®&u:?Vp2a­ƒåæjx+ΖÓÕ‘\y'¬U°Ê«Q*qcWÁÖX.®ºK>Üîœ÷Ø{Gr埰üa¹”íæ~°M¥«£¹JË)]qYÃy}º:–« Ë–£+ALY¹îº£¹J k‹®J¸J˜°ü`mÓÕúoäá\¥…Eb{®”ŸÒu¿ÌÕª„å ®ã*),gW¼V¯ôßmGsµ.a9Ã"w+ÄÓ•€«ˆ ËÖö\…IWÇsµ2a9 ´ýæÒÕ!]­†UºÙ’+õgƒ«ø ËÖN\à*A²n »Q r5ý`òxì°ºZ°la‘”}4ƒu•Öö\éXÁ'X>®v’®Žé*@Kh‹<°ì$]ÖU X®ö’®"ànhí\Ü™]…HX˰¶æJóyø¸ê×ñº\]%€åîŠgºââª^J®–{]˘ Ë–í]Yyî©x°Zxîuxã&¬%X.®ÜÚ0]6_…IX °,F_±@:]Eª¯º¥äÜ÷L]Ňeq‡ˆ8 Ò²båª_ŸI;çx~W––•+Á#´éŠ“+®/!a™`YŒ¾"&°§«»JËfTß;œWí£˜øª_¢ƒ«P-¡Öv\…NWw\E©ÚçWrn¿{ƒUz•íìY±ÊW/÷ 'îù*\K¨†µWÌ èfUõ-¸:…;4åf›ÁÅtå~Òë×)‹¿«p Kk®¼ßf¼|.~{ ®âÁ²»i‚8³òß9ðë#W1a™\ña¡º:t¿hð–pËèJÊbÑÛ#]Å<Àruþ®bÁ2»Úï%¸ ž°F°–\1 íU(¸â“°†°š0ÄÝU¥„«˜°š¦Ž9¬8é ®B·„7Xí=Þ® ¬¸ºÚÆù`ð„ÕÃj—QÚ¬+W,a‘ìM0œî7]ÁU„–°…%ó•ñî»Z½Gà*BÂ’°ˆL}TD‚ø²‚+– «†%AC¾âìêW,V›± xöÍ ®"Â"£bíJÀ_X¥1_í¸º‚«x%•Ýi!SV1›A¸Š—°¨+²˜®à*RÂ’Õ“l ˜®à*^¢¾z?^º‚«h°dg»fÊž/áÀUTXíE5¬=wµÃUTXÝÅAíÐûMWp«v§nÆ4ÒݱºçtW‘õ®T°,¶7]ÁUœÝÚ‘‘ÿVß±ºçtW‘öëmð•¢Æ"άàŠ{K8¸Ók|c!cW®X·„·±¢#XD¼[A¸Ú¬Û0ö~Ð;ƒˆŸ®à*,š°º zçÍ ®˜×î};HÃsû£¤+¸ŠóµÜBOƒãY%]ÁU°¥+¸ŠV»Ó­ÒšÜ’«Ð·OÂU´K­òf¬Té ®âÁ"íÜi”+c%cWq`õ×qtwfUFœè®RÀºÝ5¡|0S•.]ñqU0ˆ`{ü†Š´¥WzXÉŠöh®ÞžU«¥š]åONE°¯ò|ôÕ¼¢O+aºŠs8/E;sûµ^ÞrÛ®¼vºr4ƒ˜ž!&†•2]E9œoϽ¦ËûO[wåËÎUbX)ÓU¤uÃû…&tK¦nÉ•êŠìNÐ6Î ùÊÊÕÉÇÕ2«¤°Òõ1Ä«¯>û(x¹ß~}å«¿ÙyUBXiÓU¤Ãùú(Ï5Ùjk®œ÷}»„‰…«dCHã,—Ø•ÇËÚ¼Ó aó¤ùp_8î}íR^ê‹Ðe>VqZÁ»z} éÊi–š Í1/³¹:mÈ•<¤×ðý¢]¹7W `¥NWñ\]îÆ=î®^ÿ¼*Ó—¢ù¡r%O ^«¿~®ê·×\ûhuzîKº—ûJõ÷»'Ïÿ”û¾8¹È²-ÛSÁJ®¢¹jE]Ç•»áRœÊUñ$Ï(Ï•ú‡Ê•<üV¿8WÉðR3ê}{®žßˆëÞDÿäÛŸº´OöØ.°Tõ¦üˆ +9«h®^¾hºÖô‹J"—w_K•ˆº<×R«4mâÛsýCûhýB>Þ%ÍîÉÓ?¥~W‹ûÂþ0(ëv2ù2‹+±1WoóQ‘¯]=Élsmš³&Y=UeÛSóˆl+3ý£oÏwbâª{òüOùí Ûã 'Z8ôåŽÒU$WuKwg*ž\O#Wµž:ßÈœs1»êžÜÿ©KÛ {»²†5OX$rÁÒü刬bõ3T´ªÃ})ž„•¯*Mž¹¼ûéóƒ˜æ«êQ…«îÉ“?å¿/,k¬nœÌ°¢¢å£_¦NWbk®Bô_u2ÆõU•™þ¬®ÝTõÕÜUûäÉŸÒè²Ù¶Åûü!‰L°Ê 銷«êð7#¸äß][e_Âä|ðN¨\µOÿ©þœÑk_Øg,WW‘`å`Ó•©ÓÎÕïÜ·•ЭÿJ6yB’)Þ5꿺ª~[W`òÉ“?u·j_ØÅxQZêïŠ+G+ÈÜ•ºèö]œïÞ„|²]ç»í¾°€Õ¯EO6u{WåSŒ ³¤« ºjGw5‰èZ,\ØiŸÖ•Å1¡aÎf$-ÃvÂ÷à°ò°Úœ«êDó®kçŠÂtv7|r`W6°ìOoO5,,ØUlVœ]18™ð?-¼õ4,6„Ýó(Fñ®MWb³®Öžrvµ‹ˆFyHwjëm˜Ú‚ÂÊ”®àÊû-˜Í<])ÇùÝ´˜GúåbWþoaÖ( š_/T”úÁa)ÿNVpµâ-œ–RVJ¨eôPFc%°‚«5oÁk8¤Á0WC\XÙÒ\­{ FXm»i®†¸°ò±‚«•oÁ²nýÝLî©a©þBVpµö-haѰ«aZ™'•‘\­ šCÕ÷]©:’ÀR»påN·­Ü'½¬þtPÖíIaåLWpâ-h`µåU‘ÆÙÕ*Xªm“±‚«0oA-‹úÞÑnŒ_BXYYíÁUÓiãê,§ܤÚþFœ¿õl±f_(aÝ.ö+›D…5¾”“[W¥)¦®Ú›N»Û 룷›T»ßT¾bî ­¬ÛØ÷Î׌uò5ßìWfV3WýM§òŽúçþ&Õþ7Í€ø˜ûB K e YްÚÿ+ÓUŠ#K;jÛ›¸$¡z.æÚÕm°»üÍmä{´ï˜JÖ­K ÆŽFl u®NpååJÞ^x® ]†®ºß$pÕÀ:é]ÆŽÚãrÍXͨӜÅÕþò•œØ{èªÿM WÊ”Eãª{ìC7…³ ³Ú‡«þ¦SyËýÛóÐU÷›4®T²n½îÃÂ:fwCvVûpÕÞtÚÔíwòÎÁÞUÿ›T® ]D~¬œaMŸœÕ>\µ7ÊéfŠâý¿oªï~“Ì•>e‘OÖíyC¬öÓ²Ú'u™%ü’•3¬É33°‚«Hûâ¤ís+dù²‚«½¸ÒËÑaŸ–CÆ_Å| Á…¬Yºpµ+WšœÖè9“7@pµ‹ïØ)°, X&VpµŸÜVÖ2¬‰«]íK¸Š&k ÖðaUo\y‡ìU„²gô6Ê4Þ¾)Ë køèé”-]Ë•2R¸ ZhaY)ž@W;rR–“lÅ×ÕÉ“MÛ•ÃúqîoÏßznǶw«,ɱíçv–[9ʽ÷žÊUÀæPëö@VUl]\ÉU(êEpÚqî·±íý*Krl{íªþU³VE7î=¡«`IK‹ «=´ƒÝüÈý8÷ÁØö~L_óœn&¹ÖW;î=©«þVÿ[óD7peW ÉY‘ûq£ã1}ým:ƒÛ(º:¬n?» DK ˆ\9ÔéÍJJý8÷ÞÕm•%…«nÜ{zWAÚC¬îW¹Áhû²9Òá×á5¾à“._Ýz®†®úqïY\ÈZsXí/N XÅÙ—ý:^×â!«º±ëǹÆ ÷‹«v®šúª~B?î=—«Ûɉ?¬Rájy¦æ­ºjyh„­X×Òºn¯…\êÅvÛqîƒ{¼ºU–zWÍùàµ]©©÷žÏÕZ[X=«…Í6ëj°ZøšuxÒcÓ%Õsܓڭ²tsÕ÷_uãÞóºö©ø¶…íŠÙÍÏÚÀä«ç~û"²­V{rŠU¤úª«—u+¿ÃU([¬ÞUaµñ–ûä Ïíµ¸ò°e‹«¨aI`ʼnM¶Âø+foalË‚I§JéŠO²‚+Ž®f¸ `dXÁªUŠ‚ ¬8ûòÒ\6¬W>ºæÄêóÀ¦x—¬ø|‚8uû»¯ÅËM¿ã\Eò5÷¶wWMÿ•\yù:®Ü‹>à*01q WÝ*Ì)úEåJÌÛAåìq_ž+SU¾‚«ð® ެâìË×Ç÷Ÿš„uÕîpµ&H«Ø¿+yñ­½4gëŠAl…Õ`^šþ}3{ÿRÃc0Ö…é÷®Øæ$—‹]¶ønLËÕÀÕb>²ïçØ†ÃÕŠó \!à Wpµê<®p>Up…B®Ž•¬à ®‚“Ú—ª|®· ¢’µ·µàŦ_~ão¿Øoâ„+¸Â+¸ÂÛ‡+¸‚+¸‚+¼}¸‚+¸Â+@ @ @ @ ØÅËwº)“åbnWÓü‘úí»á\·o7¿zn¾vÛÛûî¹6.¡Þ>«x}ì¦â¾6Ë4]›•šï\·¿Õ¦wÎÛ·›÷[¹¾üÊm›í«Ý¬²é¹½ïžëYùí¹ÙÇg×~è×ÇzïÈ5)µó(ë¶—¬_ƒ×zûvó~+×—õ¶Íj™^ÛÊÏýàõÖ‡ÁgÏõß­zyïw·¼¸´®.ï¿j¾¸°n¡n{9'Ò¥^ýÔeûÛæíVŽ/?rå±­Ïí=÷Ümxí¹á.ô{×±£uõòÅÇs³wž„ÛR‚—Û’çnµf‡í,«­Ü_¾kº¥îWA¼¼û§Ç¦@ñÜÞÏ 4=7t¹zíÇX®êeê½s-žúäìêJV ŽÛ7›÷[¹¿|³k‹âA¯mëw]%¬º5ñÜÞÏMk,¯í×¼lWõBÐ+]õÅgbWçÆÅ»¯½]=ÈÖÐw{ï=7°q'vâª>¹mvhÛիʹdóÉöýñ±Ü~úò^í ü#²´ðiCåör1ìêð¸nß¾¼ëž›ï§=·­vð"'·¹UO®ùê,™8o?ªÛŸÜ_¾ýÂV ™Ç¶·º½qå³ýŠ=×å[Ï=7®ÛŸXºê{÷ÜO[Ûv´xò;í½¬ígèó•ç·Üþº¢ŸÁwÏu0=÷ç~†™+÷n¶AÂñ馻¬îíê+ïŽÉjS¹ú™wãÙ¿_Ôϱî¹r¾,0nG·o_~͵”úÅ×\H¹vµ^Žë8þ{nøöù±B @ @ @ @ @ @ @ Á-æé©çO¸<¨~‹@ø»Ê™Çà Wˆ\®.r¾¡·ç‡s;qQýï7óþÇ}Q¼ûi3Yé~ä«f‚în’"B骞_­ž¥ìí¹›iìüîëÊœW¶ÎWo½«þ‘K»¡v%u4ëN4 ©Ð½ù¯©+Ùl6?´‹M`"Ô®ä›Õ½9ÓñYáJ>ryÿ©ß»aíj83ýØU÷H; cW£«kᑯ›újXEÍê«ú“ú ºKçƒwª³¾ÖUó‹f±Àú¹ýg©F°qu뿚õR5×qŠzêÿ¢¸»´¼û~×Vç8C "h4+ç\q®‡—v!@ @ @ @ @ @ Äñâÿ2ú9Äendstream endobj 113 0 obj << /Filter /FlateDecode /Length 779 >> stream xÚ­VK“Ó0 ¾÷Wä¶ÎÌÆõ#ÎãPʦj÷qÂʵ?;µ´ J?ây—?uÛlk3Tj®¥q‚·…@RÇ R ôöF ¶ñf\·º]”£ 7JU½Íˆ‰RŠK‘ùDMk ´n›¾®”Í./Mo÷¸ ܽîýÙvª«×Rã8IY†–¡ukS ¨ÞxÃ)†ðvðÊ1†ÛAWá9ò[|ïl•ªl¬à™óÁ%ÐÖîÂ/Œ„’„/ic OiŽÎ¦´@cîYªñ~II¼Mó¾Ï ùˆY Ûƒ±IÅ¥Ås`°))÷ÄN$_)胱0§8ᔺѰçX{cï pg> stream xÚí} ›7rÝHkŠZ‡LBÅr¢„‰ÇKo’I"yµÞ15ö’"©«Ç þÿÏÉ}uwPx}»ûV}»Òh  ÓõB¡Ê%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%¥õÑÍuÑÝgÿó³+{å áêº>£wwï¯q(®f ÝÝ/Š+ÅUkz|sw¯¸R\µ¦÷w?)®Wméa/w÷Š+ÅUc­ýíA¾W\)®.@Ož,£Å•âJq¥¸RýJq¥¤¸RR\)®WŠ+%Å•’âªjØå˜ÒJŠ«¦„ýÿ()ŠTŠ8‘(ÞФ<¢¸ºB\±@`q‚Æ !Lb¸ÃðœÒuãj„’ Gâ´gZ׎+ŽŠž¡ñ‡üÞÆa_«¸Z®\PØÂîø÷x—çŽHmo*¦Ù¥àï’ìsÓ¸’lGœÂÑõä ln†l¸2–ùXÔ¨ˆY Öoèg¡¸ê+Ê¡@qeÉÀ*ŽR`‰z`ÆYjN÷—…ÕUÉÁá«·fï¡)Ö´™UõŒ ¬Ç/ Çw¢¸ê)‡0íÝÞÒÍH{î,ØŠ¤•ˆ+Q,žÁh.‚­¥áª‹;}ØFha`«Ú†T~µKP¿½µªþ€ÙZ`lʶqÅ8“9à&;¦&õ>±”¢ÊxP9~‰ªþ7€«Ö¨‚`T1íÀH&´q†úczúºœKõ«F t ªLOÈ%ö×rå ¹È ÉŽeLÅXØqåpXç.ƒ®nl†QkBe<:òʆüмñ~ŒzV¥Œ¿r\¸‘ei9þjânp} uxÎÒ}Øþ·Â°ãJ‘ëãF2ý¼Þë©Mo\Ñ­Bö0HtÕ;¦AÞ±<Æq‰aíø(Ž4;ŠAúˆéã î¯6z5&ö»@HBXwíâpmP ?˜üÛÆÒÚY·ü£¾î° Í ’ŒDˆOʰå<_ù•¥³ÓZG~0Å«‰ è~l‹’¨w…ÿ3è)7$·'¹¢$±y'6 Q¹n­_‘Mfæ•ÏÖ g¤M8AR£{bS¸â‡Æ¾Xd©A™¸ÊÚY¸ŠmtÊg j>¶1\ Žx“øéN™CÆfæ¿<|BÖÔZUnKBàÄÿ8-5{öÿga}ùÀš#$E€qfD´r¶"$@ëÔ-a’-^e{r)¸ä0‡©òf h:þéx\Á°f•‘ƒa¦È­0° hbÄ aÂWq%k®äKœÎà Õ­Àõ­€—Àêëap¸ó«d¨Eˆ|uÁÛËgRSOç;T5EÒG4ÐaôˆÏ<ˆ"*Û`Š]…÷ \òØ¢•ã -¼ŠLüñÕ·wKp¾Ï$#«NÙMÁ•c¾r•ô=TTút ‹ÆðrX/¸¡Qr ¿p79Éz—†Í‹ÆÊˆ?jô â‹ôˆÔ‹d_Ìâåà¸bŒ- {Ü(ÀGˆý0Ä› Á]?´Ž‹ûŠk¬I†H7“ýª‚áG-b<-¯_Ù{Ê>Òéž(,?¢÷z»³:ôÖ à„Á{Á·e‡Põrs˜¬H4B®¦¼)d‡ÛçóëÑÛ­WE@ÔM^©³—€p4÷•ÙÅf;šê²—(æ;5ej»¾“¦cÓ «nZ]dº!F¾l9ˆ˜®9îù(ŽŒjˆûÊB»÷ì×¥’ #3«q&~X[æ õ[Íš®HDƒßZŽÞž©¬³ptXß¿aj_á_£‡€…d‰¢.CD$£jtβ0 IÞp—î¥.ÊW,±l{0k£8¯¦3f<È1†EêÊÚïIóN£ÌËcE£X_l™'¥üå`3áj}~†,µ0.vœÈQ.xˆ‡ÔñJhtŠÓ9¸q…“¢ëϧepÁ< kÀU²ÒpeÝ!ઊ¡þ?æ¯öx¶H?QÌ‹8y+pé¸2ö†€¯4}ÿ<ÿÉŽ •pþKÑWpÅ;dçNQ¦ò«®Ø9U4<2×é✹ ·bœëvyì*1õ‡`pJÙ`ÝÑŽxÐeÀÊ,_o'¾Ï°«/íÁ l…?Ä7¥k<éR["¸"àJIË7»b%û¼Ö`&fJ¨[Ïq㼸rîLÅÔuë• œÔ2Ƙå¥]#®„ c½på8ѹkTRܽ¸tû`q·"sU‰•—¯_¥ÑB¿ kôÔÝ ¦§{­7lÙÃìÊXiúeàE“o—‹+Ç^ƒW+=¾r\ñ‹{ùAcü¾,ùHCŽ«ñÇ£oÿ2)öJpå½b¸¸óAÄùR-®ÈMhš_†g‹4¹üŠ^NЮXDáô²§sεKÁEž;‡øF9ÈÒÓZyã ÑKàW‰*»×…/w\a¸JK0‡KáÉù²É´HjëJw¸®Ð5ÒÊâEÑËtAB¯ƒÉÚ ¿CVË)Ç—€õhz»1‰l¶‹Ð3è•Õ`Bät'‚ÿ`[»F cX¸2娚k‘ƒÌ\ë€+á‹ã'¿\¡Wäö+œ.Vv…àR,Wbâ0ƒà|xý›y¸û)_¼Ú÷¾àö4f†Ê5•ö]=ùݾ+ÇWñŽS^/¬ž¾LŒ'áVòœ-=µ%›ðøæ½y÷6_m³sR‹=•&ã~|óã“ço™„•b(ÒÓ{óü_[l€õz s™ÿô£¼äËÃ?'Ø0Bé}w¯Þ?¹¸b¶þ™/¹=çŒÙýË?ºšØÕi#§£Ä~÷“ú_×dÊ]3ží>ÔÓbù™Ã7ÁÇ8Þݽχ•ðÿ{*³_»š(g\Yùã=E_/™rz[)»8”ÔÓ’õv®ÔŠI;œïðî—\\1ŒN~¹§"ÝzèŠ_¸¿ð‰œž0¬pO, €ûEì™J=-ü¾óô!KùT„Ýx|swŸ+ã^~¾‰ö”üµ]Y‰¬Øì!Yãyl6©HOvY!–ÒÓòq8ã¤i²^óÃ}Ô^’íLöö÷m,¯}㤆,6qXypõ¡Ñ¤b=Aýr ±§ä)bå>ì Ѱö,ywŸ„+ ¡¶øúûxOiüöÉï¦I±à*®<ïà±"rC—ÏQÙ4n‰+;v?D"®Ì9# Žw \d]ÄqÓñ±k?®ÄÓšÌký}põøùÍ‘>þ²pØÉvN‡\^í;PÂDšIæM`^‡8 ˆ 8ËABfY¥^ŠŸÃòpu{óâôÃîæYɰy 9ãªHØûÞ+r\§Fôr—3Üug\Ádó«L;MmáxoÆÖ‘¼47]¸Õˆ¦ÛO¾Í¶(5Ž˜ Ë ®N>Qž5ÍÉÊÝÀI^,äø’Ü,i¸’ï(a>\=<1ü¸óH¯:StcŠq/RR#`iõ6Žž’¿;L®îöBü¼¥ßH»#®ßrø•·:M®‰T€Ê`Ýð ~eäTÞöf²‚R°E¤À|ø×ñ”<ÎÇ ãÑ»xÃAzÏuðö£/N?üúiº~UéÜ®sŽ9!²oë€ð䟔öA(B(àÇÏÄUÀ¤œë¾óÃó“=èáV=†­òŽ"«Z\MEp¼šTø.=Ë·juíûK/Œ¼´[0Êfӹ˰™º–-+–ÒÌï¦ »²ôvØb_¿}žHHLc¸Ií»!Y¸ÊÔPæÅÕÍH¦°šôdX‚™ÊDd“-\îÆ¦û†bNÁr‡rÉBË@€ìy³^ãâ¸zxþì軪ð‹ö–è# "¦Z°ARÕÐÁ•#¢4VÐÿ>e³öU-{ºáêö)÷8ÌÀ&&Ñ//àjˆ@8 3Õ¢Û¹ìî üöZy޵XiWY‡ƒƒ«âº†=quFÔ.×/:ƒMI×FÎ]ŸX¥ “y“Bw>§VñgÂõfXÊü÷ï…«_t5äøE[(F‰UŸ§Uá`Æsžâøq±ÞÅt!ÇxÕó«$ÖŽ>Xз®tõÂÕãßq~U“óŒùrXi¿hü\sn…»¢1–ÂNúï3‰Æ#º\m+¢.W‹ïé¨Á›‘Rl;ÁÇɈ‹!AoLÒòTÙ! ¬°¼ðÊäÎk¦è#Mœxä¼l_?ÃZ}1Å5̇«—‚¸3Sð êsô;¥()V0m'Œ˜³(½Â R¯ù‰!2ÇÞœÔÅÕ…†ÍÇD'CKoW–À+˜›IÄÂò¯ô|õéñœŠPz-KÚàÙ†µ´† Vb˜nÑÀoE¦G¯î`xö\¦juÀL*®`W%‹7u 5T q%HBØê³TP…È¥x5ªäó¡jŠ|˜âOkcr°NF9Aèíå3ˆ›ÌB/{0¢Ú¹¡kßûñê`¡ß³“Ëò5X<®²÷\ñz€m/ÃQßHr+÷6þ6:›ÂWoœøšŒK‘–cÍõ¸o W‡UšWÁ•K|‚ã nÔ±Q\•ÛÁ϶®ÅÜ@­@5Çÿ±nebdE«òʹq1×€« °Ôãª5ûNoa(°¦ðh9À@ªóÀ*æ Î;3q\íMáªN)hŸßÓÂÕ(Јa?â*ÄA}e kù\V‰ý+ÇUoƒ0o1sF´l5¸š"½ÀâÑZÔT¬M¤ ZËŠKÝàÕáª8©r*»‚ Zp"ÞÕ ¨t,U­ˆLÄUR¡¸j¡³û˜,ÁÍ»PµLR„Q¸UQu6*!˜±Š«ªwUvº?¯ÏÒ¾øŠH¤s.0¥©1¨Z)—T¡r°‘ò]ëc@Þ¥eXE-ƒµŽHP2„²+³ÌãP‚+ µŠ«Öð¨R¯BÅ0ìÞá¸"1†»°X7ê˜Þe¯‹ªWfw&}c[ÓÛ+•Ø.¸‚¤‚+‰ÍÄ»Åî±c™Ñá„Wž6®W‰uçuP¤ÊÁ¹^¢ÞŽ4ÍåÜÖvÚ6-X·9\*‘Å{Íì^‚ùõ'û.À®,”^v´¬‰!zW‡«$ô”åqíK;\Ŭx˜l\¥ß‡ö‹€ªÍùûæpU$ÒЫ®Œ+$`< ­W­ÆÕÄ´€ ?ë¶ôv)‘c}Z™ÆFD®`‚éúäŠçUüj:‰D£¯[qÕœ] ·{(„r,òh«àM-Ô¹xpÿÕ kÄUš6'·J+¹,†û Z®2Ë‚¡qÅl dV¨3„+8Ò0oz,c<š~hÅ•¡qE¹ º(ílYÎ’0Æ9U ˜q¶4,Æ®W^ÿfî~2… G‡ÌèñóvˆÂ‘£í†m·¾÷»Û¯Âk8 õUâbÞdݸz|swŸÔ—Û—?-à7§vÖ`=~&쮦A >|ÿgT¼òšøÕÁœ=˜µQiäiÈC>öíÛáñ»\9Ú®§ÃÄŽ©8&Qk7ôáêØî»E\1>{p üÍgïåZaׇWþæ»÷Q÷ÕÑi±Ÿá´¸_rêÒl-¤ó•C:A K™&w½‚gÁÁɪƒqŠû\¦,iä©·¸våV˜®v¹¯õ'aïÝ0JxŽ-K¾®+ü<‰"Q4,’ qí*R>UqáE¾ôÔõ5Kä ⊧ðhSçô.äÄ3 Q;gxT J˲\%³à¢›—Áïh0Œ:—ÆpŪêD³7#­>$WÛRGk\e2ªX©R÷Ë[µ®[âgY09è óϫʞá‘Ä9Ùöä`ƒE7UÁ•Ul‹iXÕúOOV,ïXõ%ØA\’«\2šNqBKÅU“ü0Rn'«ôÅ•p?¨W®†¨ A2¿‡¤àajrð1P»›Æ•˜ƒ'ø…·ÓÚ'\¥X[ÑR÷~JáWÀÒ#ë°~\yïrfm1„ýät0åi4p•èUs=뼬™9ÃÄÒ]Q~Ul!®WÍÔçÓ7{ÒY„ŠÌ…ÓxàД‚¸B`‡©}"x,¨ÙkV"ë=+`ɨÜÐw›,¨‹LF5®\ßV$(æ sÆÕ‹øå\ïLŠ~µU\Þ«ÙU†é€h'E+>4àW°ä²ß?|œWS©]oùè+ÕÛ[y­$ê±eËÃÕXg«®H9pvç™Kºçà†Ÿ>_;®zÕ~°pÕÒÌžÜp/!G'ßíÄ;ƒy NS~ü¬üª°xuµˆÚZšUû3W!AGƒ|¨¿ë"šH^q•³÷8žbD 8ÖøÌ Çá…®!'qá âígVÏ 9ìj|)\;0Äl·;Ȱϓ­ºÍRv´›—c¶ÙÕ•2p¥üªDÆEòúäœá‹ÖÁ {ûJCRBgWˆá PýªµcÜ ô|oPÚ·„l§‹£”eaˆhÿQ.z_s ṟ́$ïg \§x¸øÕPÉÒõÆù é9rÂÇpünò_ˆ&ºb¶­W½r½÷u¸ÂqÕÅÝ ­sù=ó¡ †+!0‡¤’ á*¦]{qEQo„AŸ…«¸òøo@Òá•|ÈN¬³Þsg–Ç+0Á‰Ø±€›’Fž–œ* «Ï¯ WvÙ±DŠæ äæMÕfiðÃöÊú¤gS('U:¸2r¬"P¥¸c+¸ê4^CÇŠVBMÄ((D„‡mg…TD\‘߇ÏCY÷HjRHfKà mÈŠä`'\‘ï0I†}²æ6ÝU°qo¹¤l\…?øî\Àƒ«Ô×Fk\=<¿ùäÿ}þlúÕ †Hoû"V]ˆ;¨ÀlfE‚ã¦I¸‚Go—ýHó`ÁÇ [oðî£/n?ùö×OŸmWS&k jF(¦ˆg÷J±–bÙC ¬^ÉS²ê‘£òwÓpƒ÷œj«ãÿWƒ«Ç´t! FÍ]/¶ÓîÕ=ë”ÐïäGô6#Èx2C Á¥]º“Ê ~x~ÆÕÇ_nWg»HJ¯R§¹+ؽÚÑ ­&ò"®B ã!§wK3¥ó«§G\½\¿Š:±rÒ¥»08¬œŠnFL²P 1èoHcXT §ÛÁïnŽ+³»y±ÇÕíÍ ³ \±¥5š»„+ru±®àý ¥ ¦9øp%&¯H÷`•Ùƒ77}±t{0Ï-yiëLB Wä„È$‡QD5dDì ÀWh¨àÒ#YÑæÎqF8âÊ8å°JíB°Ô€xŽ+¤i:ðüI8DµÊðÛE–0´.ÛÅU™ dBQÐ@2†á™\¬‚“Æ_1–sÛ†Hàìpº(ë"!nlº/9–ž@Ó >ŠÀ3-ÆlTJÇ#!ëï)ƒ‚$lsQöOøµçr\M!²¯]øŒ"«“\Ò$ƒOÑÛ:++rpŸ<é†+’„…ɰïZYu 09 Øo)õ¶€9 ¼‚­\ÕzSû4£Ÿ!‚«¦!á$ËAÕ/^< í ôœÒ:Ši9¾U€åؘ;¾é¬"¿èæó‹v¬ŠÀå!À7˜—F¥Ñæ³Ò;öô 1Y,áÊu{\¿º®¨×)£žj<ŸÊp\v&×,ÕUŠÐ>ao–ò²nƒw7³êWÕ Ùþ”TB Šè¸áL°Í8§àåEÐW'£°Š[-ÐßÉó¢5 ~›"¾D62qÖA•{…"]Êg貫ð_õ+Ä=TP‘H÷„£_ÿ”<’P.Vîâ ¦†_/H:7SaÚ “³ÉÁq剖ìŠ+VO &ÑhJŸÆìÄHÀU‰%‡cQìΘÒc¸]£!{ðñóH›<\éÃëßÌÃÝOá'ÊÁIÒœý%²†%ã¹ÞèëC#ZÁeÃýÝÔˆÄÙ³Û^ÿ _ÿ—“ÿÏgÃyïœJùÕ.«1Øá¤ã'ã*øå=¾yoÞ½Y«‰ÀIY:ìžä¥§­¼«ouÅ6ÐF¯ÞŽ«¤×³'öøÙ¿‘F`EÄÇÆo~4¯þzŒ;;º‚âJ^òb9øòi€[hòE•ÞH“ÝëŸ÷ŸFZ£ÈGñúçþMÐÓÙ.Y=yÖž´òOŒ4â§r&J`,½ž;1Þˆ:×IÓ¯öÃý‰ð±¢Õ<>'6*ÆUÀ/úðü…‡­M§‹ùV¹1ïîÞÇ¥þ©Q„^ÝýHƃÍF„ž¼÷ ’Æ›q/:x£¹iÃ!ØÃŽ”ú¤]È|»¾¸*æWḻû%A@ (îîþ ®â=Áw•*eRO>&¼ ŠÏ=aœ’^OÈN²ãÃAúj°_ÃjÆæ ]­cOB†ÉÑ¢‚g JqõðüisƒÓÔ{k§dØÇ7w÷eì…Ù7úáÎÎ KnÍz29ÈJšÔß|66š”[Î'EBZDö˜0Ü“'¼»f?‰ûoŽkÀS@ÀŽª8õ$Hš@œS±=tŒF•àêÃýÙ&C£¨½tlô½cé_ëyÚX}ñ’ñÎ0å!‚UóÃý?~ÿ„îvþ>o8Š+®Ha?ÜÞÚjL¥ÈS‡…ú)â倸ë‰ë{¸ûoOv÷\=ìYòî>ÚoDkÈŒý[¦2ã ÆXôûØ‹¥Ý‚\¦ô»ÿš?˃5‚zß»û?N©)'¿üÄÞR†ƒ¼ëÁÕÁ–=Ø´íMé܉¤³Ñ’îÕã¸9ß½ýƒùæ»÷a—¨w8¦k»ÃÙþ^spiààk`׆¸.fÌóæäÅ•<§|9øï¿ˆé핸ÂÜ gáßkü(Èâ׆3ì“ââcÈÍ“cï )‹ 9ŠKª,W³‹Š¤XœK((Ê·¹É¸2ŏнŸ#)®ˆò(+*ò™‡«á|æ@ýó3°ýè—‹§#)×ÉSôÜW€ÿ*`õ+–,‚ÜÆ1ÓÁœÀ~÷»ë¦è üjýŠtÄR+Ñ´â©GBl¨bXBégîW°cï-“¥·Ý[oÇÌr°,v²XÒ^!Ò}}>.ÃÒé͇ÌÎ4@‚Ûjq5;Á$V¢‘ãÔ«y¤ˆ«Ô© ÷)®ì”œµñØY><ÿäÿ>¿ÄýAôÅÿÉ+rKÃÖYàÑ\!1'$±Ë=aÝ 3 þà´Y_¿²·7V¡/³{VŒ¨¸§™r°‘´ŸÎíúPÆ.ÒJLÆÌoDq•–m1tFVi ñ«"…ÐIr*ª¶ìêŽ|̰NÿÕ¬èEBxÊF´QÐw^&4«Š«›v›ë~Á»«áÏjµ¸j](§&MpL?Ék-ïä@²c\±M,Ônð¼~Ñ –Úáj 1ÈÎSQ¹“õ/žÈ26“¹rt(`ݼ¦Ö-%dؤKö‹Fìü ãŠTÞ*ÅÕùLEºnÕˉ7×"ǘ>ê=7¢7K#”\~yz;ª?Ëü/¼D&§ì‰½%•?¹n©¢‘§CfªmÑi@H/(îÒ‚_1{óÅ3@CÕílfk\™|wg…ÓÆi´˜ B‹ –éå'ßÞ>5¿þ¾_~tßU¯XÊêµ®Ü(ûŽŒ+àA˜b²sBfªô«çÏÌî¿ýé,úœ(²¯eÂ2Vô£9°½¸2éYô*ß¡„&W‚Q_Ÿ"\ýú·_ÿ?®ài+«°MO† WáÒp'Grüå(N¹ KÕ19Ø„ýq…üϳ\³§ ÜÓpU) ÜÌÖu³9¢:ür´ íÿ@\¢/Ÿ]¢>NÜ8ý5aœ÷!yåÚáÊJ©7…nö€–÷0‹›…bª ¥¯`ƒ÷ŠûÞ&¬2Ëø2ðRŠ«ä<.0­pŲ¼LñNÀ©û Q„¢'®:û¯.C–]Š«ôPdÃïjœr~»84*1ŒœóCV£Òx=¸J>“I2 ÑWGëXžy°À­÷viQC®ÚÆÉt9wFGô¤â*×7Ó®&Ç=„ÃÂ’keeÖ =CØôì(»áªîë,¶]4ËÖWl@!–`\!WX®æ³°üIi•=âjð)9@ï¼ 4€V²ŠÒ×_®ú&ªo‹«¦Ö …ª¹qEï×Ë+ëpv…üêÂ!L\Y‘¡,àľ Ý«3ãV¶7Öµ‰­%\®ZDÐ,Wír1Çqeäk‰K”eÕ‰K³l«¡VM®šº†Ç•œu«9®låvf\5£›Šê&ààÊ¿~ˆmm(˜RÆ)Æcxù}³]RPrüбȒ5áªLÏXp˜Ip¶¹·ÀÄ]™"éì¹tĕ羪ÉÀ•XOv9¸JªØ®¸rÙ»ªÜM H„a Éhy°òçQ2>#vɸJcX½.ÕÕàÊÅšÝ㳯V!³öRÅûÂÏŒ6‚+D·ýS®HP=®¦=áyXI¤pUøÇuãê¤,nå ØÒd§?S\õY˜!=Qµ>+ª' Ò¯`™#½Í¿ âÊq’ç:…]o\¥”$ÏËçWð^ÊÄÅpåõ3TO >#&ºæ6 ò¾1{fS¤ò‚å ßS3§„$Ü Hö%M.ØW/®,Òƒ+4ÁŠ¢Óâï×—„+4OW&W©ñöþ sîu…pÕ>Krb#Zø3….Œ_ÍÈ–¢–·_±BeÜžïf\!;¿Y0XQÔ«àW—3툶ÌÔ‡¹þnO|*B:=*Æ+Ô,PˆÊåã 3ãŠì]WÞ»AÍpe*qeÖsèƒ,œíod§j-ÚY+%·]z¹|¨° ±»5ÝÇA³í•?ö1‘9É%¹Úl´ '—g7\y!WX®góÌ´Ó¦ôOÒ¸ÅU—¬²,âµâùp•ÎÛÖ¦_eø}RN" —‚âSˆªt\ÁÌ…«œ{ã¥Ã¯ô^êqYz”Ì˨Šò©dËA©š8ºÀ*WØ®"NâÖP¤{¯QÁ­ªp%‡W¿;ò?µíã*¨5ÙnDö¾ ®äû ‹ÀU°6’Ÿ¡%ñú»–ÛëÁ•IÚöpÔ«’† ®^-®L'\ñj1ÈG»øÏ¶>r?çàËî.ÅUWã·’-¨€{ÑÄh¯¿ØŠ>ÅU®”„W,wO—¤”½•ÉãT65…+ÓW…‰¬»ãŠøÝWÕ:'\†›îý\°óâÊä᪈S¯WÜL ¬4g«aæÂÕLÑ38Öɯ|–rW‰Çaþ2*J˜&à*ãCIÎ=CA¼ÅâêÃëßÌÃÝO&¹al~ŸÒáa§­‘½^ÑìFpuøk»ôZž\yÎ]lä¾òrqõøæ½y÷6¡«Ô†IíìÊjèeWÕ3„uùgßó¼22;„ÝnUq}|®»×?ᅫJm˜Òî(YÃÀ!Îîõªš!ì\e»™é•‘Ùáx(›¼) Ö¯ÞݽOë,µaJ»ã‡H«wó¼r†¬éá¯fzeäuHrÚÒv+õ‹îî~Ië,µaB»|HÃ`¹šÚ:k³;Œ)•n‡Ë682äv+Ál™wŸÔWjÃP»ñ²¬†8 +i «ghŸD~“Ý¡4­óïÿ–q~ä¿òrùÕ‡û4Ë#¹a¨Ãmˆ“»Ò)ó¡Ýÿ~R1²½½ÿÐä• ®Rެ!ò7e±¸zØ3Ü]Ê·‘Ú0©ÝW¬áo Ä2œÚýÇš‘y¯_Ï÷ʰ¾ÿ3¾ºá HÞ”åâê`ÎÌÚf “ÚðsløÙ¿‘%u•ö£ [?C.‹;tÜÁçÿLؘW‡†ßýˆ˜Úž¦ƒc‘fgVa)©¸ê©·' e~ŒÓmÖõèW˜Aø¬æv3®ó­W±EÚ–~Õ WÀ…ç²ÄpõøùÍ‘>þrEzû¢¦>†Dx•ºlðí͋ӻ›g«ÂÕJ`uqV_¦üøùˆ¦ÛO¾m?l§eõáªýpÙ=ÂøJ^bc°®ž¿~Üy$aw\Ôëò¸JO¾Ñ­Ðu… b­üªOÃä@¾ø¡sÖê‹u˜`ýê£/N?üúéºô«U;×]óoÉÙîM<±Ú&®J6y:„Y ®–}ØÇúbŠk(¶Ï)`LR$¹ñÝW«ÔÇ™?ûÕé䚣!eC°V\]ÂjGüŽï•mm𯟾X®\A¨ÀR\5Õ ¿«ÁÕ<ªÖ!«&N‰5Ó@¸ ‰¥¸ê¯—Ž*R2_®°5\ͯb%§VÚ’=Ø‘­QsW\-WFo®Wjê+®z{â]—=9Q§¸R†¥¸RA8;5ú@WJŠ«(}xý›y¸ûiöž°ÄI]²§áêñÍ{óîíü=a‰“ ±žVszòDîikrp÷úçý÷3wOXâ¤Â"­Ñœöcˆ=mN¿zw÷~q=-rR}{Ú®vw¿tì KœÔ{Ú®ßÜÝwìÉwv¶¢:OªÈÚóõ”oŠ=m WîÛX9¤§”sèðnt˜T5®|=åãJìic¸zسäÝ}År?Ÿ{Âå&µêž6†«ƒÁ{0|ëquìé»gŸT_¾ÞzR{À{0ãqò§\=T\PcæŠòÛÚMÖõáj¶8/ÖðÑuãja¥¯NUTW„«™Ôñ^ŽKõ«¶ÚÕõA Íä„âÊ«\aCáz‰ŸH¨™âª ªÆ­²çãÍãè¨Ý;+®¼BpIÈ:e|C¤¦L5Z 4¿óȬRç ¸’7 ºcCÊN#å› ·¶TŽ1ÌL¡lrL*®*¹Õ¢æÚóˆ¹!‹@;1¡4$Ö·Á7 «2»4$­ÚÎÚÛYÒ(Š+$YŒ®ŽDô·Ÿ²à “Pq•&MæÔ¦¼ÜÇÙWtD5‹¡¸jÀä‡XÖ0,BV™«C£ûW†5lðBùÎgÍ ”•²ƒ©©” ²¾ŽÞŸ@ög¦¸â\ڢƸJÀÙäbJÃÕ4SÌöÙ­W—;”äqKÛíÈ‹ÜiÞ%JøÉï´§× kõ‹^0®a*èÅþ³’R/äYÀ9E-ÊÚyÍ¥.iÂ*¹áŽvâL]LÌyªÉ¨…Ö›(äW•[6p§~ÁÌ®j~¥ëÁUì,yŒâƒiRßu]Ä….[‚SqÅ`ŸDý4M÷êO²MÿA‚RXq…Ñæ°cºÑ@€\ã§ÃŽÏCŠ«:Ø !ýÉC³˜[ú\AsÔKº!~T ä? –ºødé¡ëj@UÌ­Š-WYï C¯’Žr-¶Û!E% ¾¢Š¥¸Â…ê;—áÊ}Ë”÷ž p$]‰¶TR/Ž„únY®+þ*ûë`ã4~7Û/YÄs¨[õšQµJý*ç¾(JÏÏŠEÙö5öMâªäVF(A­=7›juÁóù-âªW$'Ѧ »Ÿ9Æôb¸J<äZ•~Uq­/Ö;*:¿ª+÷«“ƒ÷Úx ¿ïRuêê²8¤Ý]ƒœ¾»Ô‹§feãhSb1ÍlZ®ºJšé`0WƒZ§šSÝÚB\z3á’„Ï3?þq 4WHØB¼(9‰éű\¯|Vî˜+R±ÒßtѸ²³¨ôŠ»$÷B„s..íÌ ºÕp%ê4}‘ùã¤?^¯E¸â{^—2„ä™Óõ0¬¬7]®:Ú…Ô¨²âF¥ô?×—‚ts¸ªó‰¦ëI#\qúíèí=Ù”ßã‰9½æ¼ÛŠ« \9ºPÙÐZ~5ÿÆòëÏJ9;±"\-\S½2h)®”:ùBàZ“Ôí\ ¸–Ž«¤€‚õîÁÖê ZœkÁ¸¢–Â슫e½ÍÒqåHJX¨á¯¸*Õ"i]Âp}¸RR\)®WŠ+%Å•’âJq¥¸R\))®VJ^ÿfî~R\)®šÒã›÷æÝ[åWŠ«Æ´{ýóže)®.‚«-Ó«»7ý~ ÆÕ¦iw÷Ë•iòŠ«Y¬»{ŕ⪹Ax¿msPquzØKÁݽâJqÕ–>†ƒ¯Aq¥¸RR\))®WŠ+Å•’âJIq¥¸R\)®”WJŠ+%Å•âJi ¸RÚ8]ÑWp¥O߬‘ñ(®WŠ+Å•âJ‘¡¸R\)®WŠ+Å•"Cq¥¸R\)®WŠ+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%¥*úõo¿ÜÿóáùáÑÓýO»ó¿sžžÊ{º|ÜÊžª¸îëÖ{5ôðüãÃ{î>úbبûß=Í|zx(ïéòq'X•ËöÓÝÖùE‹Ç5•^ÅšëÞ¹n½W'_îÕgÏ]ƹÂùéâsœÒq‰Ÿ±ð¤|àºw®[o%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%›^~òmR›Ûg%O*)®‚$$&S\))®”.…«ÛSÞÈÇÏŸ½¼¹9þöðïÿ¾ÿéå'ÿçÓ››ÿÇ1EÙñÃ_þóá‡Û)Ù¤’’€«—}q̽øøùˆìåÇ_îqsÄÕ·~õ8âjüËíù!%%W'tÜÒ.Ò'ßS)ÿËÆÕ)Éâñ‡ãCSBO%%Ž«SÎ=bFôÜóRÀÕé/·Ÿ|;>¤ë¨”Œ«S WÃ_޹¼‡|‹JJ>\ín ø•’RŠ~Eµ(G¿:üÂÒ¯]J1{ð©dõquüÅîø‹}Ûñ‡M&±VªÅÕICzFüWŽ—êxŽssȱsóôöü—ÿËà¿RX)åãNQ£Ô”Ž•°vjë)5¦ƒŒS•\IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIé éÿ\T1endstream endobj 115 0 obj << /Filter /FlateDecode /Length 928 >> stream xÚÍWKoÛF¾ëW¹˜DÂõξ7r(\ r) K‘æ@I´¬„]™BÊŸÙmª¥\²6Š@ÉÝ™ý8óÍ‹‚„âàœhena “ÕnöçŒ(®¤ð½G/œùEwÇÍË;`ÉU=û qó8ï!ÿ²˜]^ ‘€ \(–,nß/-aš'‹uò9‘唦WEÆ!m«r¿in³/‹—×Ì$–XÅ”?-ˆE¼œ1`Âáß3ÃÓú˜åï«b2HëÝݱ)Ãz]dLäÛŒ™´ ÛÅjUÖÛýÆ-™ÛÅcñù6½©;wøXA²ôPAx‘Ö‡{w°GXZvðq^ ;Ñpb¥ †ÿA%k%Þd¹V }9àanSt uïÔÛ(©oÂfxn´Î¢].Aâ°=(Üî´qâMåË,G84¯ßÝ¥,£6…b¿kL‡wød{v…ÛÅUÑ”Þ=“Á±Ñ¥J¿–.žRb)ú±¤>Œ¶ ã{<ÃdZ܇ëì7ôMØ«[²ÙîçÇös‚ZL—çbàU’0f;F©ÍåÀ$æ®…ÑX.tQGötrÐŒHÑC”?×àÏ+Fæ”çÎ+¯þ 9øwÚ3$|h Ýžc$¡~2†4ÑöÔË¿¤&tWÕc‡¾µ]ò¬‹¶r0¾¥8YU4ó¾¼nçଌë¶òɶ›¯<Ð&z¦½+‡æ€]MèѬTCÄöþ!ôWU, RDQ1íSÑl›ãº@Øj9Ÿ`—ïw á¸{Ò^cãИ­í£µ!‚'ñª8§VkB›Êæ®. ‰l>æQ—m¸câùÔòD‡zvM6&ilu71 Kìä•l9ZOõ«ú¾ž³®qBkE„U§Á‰Tm÷åý?KÈÙ]=UB†:•‡R8€Ý(­†èdBúo€§½xȹÍÁ §E›Êó¸`†®Ù‹rÚ÷­^ßX!BRb­í²:•(CP/J„:%¢Ü”ûu×{sÇ÷È‹Œ!ÆŽ ¼@;Dß· ü´ Bšç1Á 7ÕÌD3iäv1n0ûñîç#†ñ\üSŠ);!1‹Õ·s%ªžEàÄ<Ù,þWKž*V=1˜a¦RMŒ†á™Šó»ü41œ(¥¦Ì®Q“Hj"ÙØþøxúoÎé ?R༈`œâì×ÅìQg4endstream endobj 116 0 obj << /BitsPerComponent 8 /ColorSpace [ /Indexed /DeviceRGB 62 511 0 R ] /Filter /FlateDecode /Height 600 /Subtype /Image /Type /XObject /Width 600 /Length 5054 >> stream xÚíÝ‹šâ¶†a ›P–Mšf¡IHÓ¤‡mp’6Åeîÿ²jI–-ƒ9[¶ßÿ<Ù!Œ±lëI`„B!„B!„B!„B!„B!„B!„B!„B!„B!„B:ÌZ¨¼|ùáì"û¥mn[ÛîµÊ—Õq!çWвv¹ó´Zãi^çb¼½sWO_sçZ>~]¨fîp%N,<â*“\©µ”Oë5úáªØ¤K‡‰´º:_õ7»ÚM»pU®åäñà®)3aW ÁÏS!f¸ºe÷È®äA“‡øç¯Š–ë‹UuÄó‚[Yó¿/zo¶ú5ýûT|ògå¢xúË_åâºé›¨_ÿ ħ+ÛÕr±mc½ W¦à²¨§­5®ªz•þîŸz=õ6•©Vsº‘æ5e±Ö3m;ÝXã'²³16H½¤µòÿò•­w¥«7¯ÆZåóò‡þUQ«2c}„?7C²Wy Å'Ó†«ãÛºîj­õÚ®ì‚/»*ªT˜-±¶I§^Ms#­×T-UõLëN›5þP-f»j,imE³üƦ%êÊ*D&ÿ‹ƒ5+ÿ.UË>~RŸÅ!}دÕãbáÉöãÒT³î墙õG_<3._`­×re\®¥Â\÷¬úT{U ½Mf]ÕjN6R¿¦:7°×Ò²Ó5ÔbËÿfmXÕ'Ú‡§ÜŠ“òÿ>àÊü‘ªã§Q^­ÑFHýlqÈõb²Ë\-šµ Ÿ1µ`Ö{2¾Ò/¹ìª\\uÛö6ŒƒN7²ìê­B­gŽwºqxc ÎkŒÖVTåÏ_Uö??º]PCq<ÕQÍ…Ý—UUVþmë-­‹=n×µS¯·éª*ø²+»À¼åT¶Z͹´ÇGæ™–nì³²¿›X“!fÉæV•Ÿ¼«²¿f!ÿ ‹Ãjª¸éªµš¯¹Ò?êõÚ®š?ìÊZ͹¾²–´ž>-Ÿùör¨ Oî&æT|b±‰oåYϤåôìãüª«êܬ^oÓUUp‹«ªIãÔÞ&S¯ÕjN7òä|P?Ó¾ÓWΛ‡ÇlÅiù¸jÌóL̯«ŠÍPæt:IÍ_™CÝÚ~^ƒÌz›ý`U°^‹.´\cY¶(ÁÏ_ÙÃì¶ñUã5Ö{}ú™ö>¿:žo¯–¬·â´üÔ]½¼ÿÏ¡ì?ýP³ó²¬ùv9e~8þ~ÿ«ëþ¯Ðó¾}Ü^η¬õÚ]’]°ZKY¨^£¿¼ÿ¥.ð k¾Ý¬öhûO6ò‹“ùöò™Ö®çÛ¿.þl¾my§^²ÞŠ“òIëûa·ÎÀØçP]®×çöz7g\é+më“qåe7èè€ËۈȜ}Ó··»*»?y‡y]ä×9®ât•™ cççniÚñ¸}7UßÖ×Ûn` X…ïʺ>qV_Ñß¡+yCy \EíªºûÖù+«wêJ¨Šî/Á~ppV·Wº™*N͸}«8ÇWÍ{™öÖ^¥7Ï0<«^Ï_çú|ðLkåj|•Þ¼hb®®¦ãóÁÌNì}XyáêÂ7áyßW7µjðœõq>˜¬+Xõ:n/4©›Kâ W]Î3èi¤bă«ØYõ?/*aáÊ%«Ä\éöJÍTâ*öæªïñ•Ìn*p9«^ÏÍçÔde/®ÔõåÇÊg͉,!+Ÿ›«¯‡¬Ï ع+FW\¹ve_Y¾©£ß˱wV¸º¿´®‡¬Þ„ÖiÈê7 q…«zq6çO뺑ZÇÛ^yÃ*8Wose}š!³>-bc…«~ΫºïË#>ô‡U*®Öæ#_Yã+V¸zÂUÕ ®›ßq±ÂUÏ®ÌgÛ«ošEèÊ+V‰¸*?Û~ò¹ú¸\pÕ³«rØžé÷s¢œ¿ò‹Uì®î.^W¸ò–®`…+\…1¸Â¬p…«`zA\ÁªOV¸‚®’vå%+\Á W¸ …®`•¨+·U¢®Hˆ¬p+\‘PXá V¸"¶*ŸYá V}²Â} ®`…+\ÅÞâ V¸"¡ô¸‚®H(} ®`…+rF®h¬p«®p•°ªó¬p+\¡ W¸ŠŸ®˜]À®p•2+\¡ W ¢ ”®P…«ÔT¼ý¸b\Õ++\¡ W°Â®bW…+Xኳ@\áêQUQ°Âm®Wá W «Âã*\¡ W¸JÕEV¸BU0®^ç³âß\1Ú¤î*ZTC¹Ê&êÑ"iW1«ÆU)*o“u7ª\íÞ­”«3=¡@®qµÿn•p{•ªA\É;þMª|j®ÒP5ÈñaÑ ®ÐIšU®:>1ß›0½<4/*]­;n¯À•¶+9/Z¸Êž›½T,¸’t¥gF_Vn‹Wr®ú+V…êÂUgÅ‚ Wn‹W¬®<¸¾(¸h¯œ‹-\9+\1¹’ï:o½áL¯O{••ø,­N€+–~ðiZÝWã«uQŸ\+|W™ºd.¼»ž ¸Âuµ›š–Êçëª+¸óÁê-gŸ]+ÌñU8Å‚ WàJוy0¼ûã€ËgWò‚µ“ÃîÝêš+py=nŸrù½‰I˜®¸¨¯\í>Û¨ÿ‚ueá‚€®ä÷å=½Âweõ‰8~|%g­Ö³Î¿—Êp+õy†bà^œ>w•Q¿*\>¸º©³¼2áaýË{WÕ—VóswëõµêÀ5Üù ¸öá«}}£s£0¯k Yý»Zë¦(»tÛð×yõûüLOè!«OW¹ù0Ãnºˆ¶½¢ÙêÛ•u‘íõ…ùö¬ÖØøŠÑÖ ®¬›\üð•yoúì0, z—?®šÞ OLÔUØúТ½rÜ'Wôˆ¸ºåz27,xµ@k†c¿¼Ö˜_'ôˆCTðÕ›ÉÅPÈê¿‚¯ÝL.šÊ€–WQMÐ#âŠWôˆ¸Â="®èqEˆ+\! Wвp…+há Y¸‚®p•¶,\A WÈ®R¦…+dá Z¸ÂUʲp5-\á Y¸ H®p…,\Ñâ YW¸B®gá Y¸Â#x\Ñdá Y¸Â!®h²p…,\áŠÎW4Y¸B®p,\…! W¸¢É°p…,\á X¸B®€…+\u/ W¸¢É°pE_ˆ+\¥ WÀ°p…«”aá X¸®p•2,\ W$X¸®H(°p,\‘P`á X¸"¡À°pEjX¸ÂUz°pEOˆ+ ,\ W$”!–‹M{ÏŠóâïi´ÁUš°œ¹Ê&êÑWIö„®\•¢òñW)Âråj÷n¥\5{BQq÷„®\í¿[Ñ^% Ë+Ù"Mª<®Òë mUAëeuÈÄ‚óÁ4,毀…+‚+\¥ W ÝqEBi°p,\‘PzB\Ñ`ኄ W¸Â ®p…+ ,\á W$X¸Â®H(°p…+\‘P`á W¸"¡À®pEp…«”aá W¸"¡À®pEp…«”aá W¸"¸ÂUʰp…+\\á*eX¸Â®®p…+\ WW¸Â®€…+‚+\á W¸Âñ®p…+‚+\á W¸ÂÁ®Ò„…+\áŠà W¸Â®pEp…+\á X¸"¸Â®p…+\\á W¸Â®ˆo°p…+\\á W¸Â®®p…+\ WW¸ÂUÙ/…Êhƒ+\u–L,ôƒ\Ìp…«ÎZ«JS6Þâj W}¦— ~/ÌüÙ^Ø‚+Ú+2Èøêe¥즌¯pÕeO¨›Ç3­®pU±WW¸"¸"¸"¸ÂÁÁÁ®®®®p…«!Š%‘'!à‘`oBàŠÃE¸¢\Q®8\+ŠÀEàŠÃE„B!„B!„B!„BH”É…w«ÏÌê–³VWSuWDî~/ò^T¬‡×ùÄ«YQÄÄq9¹ºJ¯»"òbõ»©Ó½¨Öì¸BzÊ~)÷ 7çî:úe£Ór^çÒ•»"^ç3×{±_Ê¿Œìeå¸BúоÊûÙk½?¿zyû‹âp9-'ÿQ5(®ŠÈ›×ÄwQDåÊq…ôçjQýA:Ëz´qYÎîÝj­\¹*"ýk®Æ<÷Bwãm/ÒÏðêà¸?×c,gåÈ[·HWîŠÈDÑ`ÉÊåÑÚM…¼[‡«jØî¨y ×®fº7t¸kEw´‰Ä•ûfWWŠ»rŠ^PÏ38ìÕøª¨q‡{¡TÅš#éÍ0qáll¥o¯é®œL_›§ñv_D^»rV„j¦Š¾Öy…D1ÏPݾÕq9k§ó º®s—ó U{É<ƒãi¸ú|Ùm9k·ó¢Ùh£ïìè®3¾Šd^ÔñÛU'Áû83·G+3÷ö‹ã}B!„B!„B!„B!„B!„B!„B!„B!„x};ÙL?›Í®/KȮ̕ÉZ®P†+‚+⇫µºÞ¼ ìh³ÿ"þ¨®U¦)~«.Ê­. 4㸑]™+÷©vªøùs_¹Z6…(9êzY…‘tÒ›«òF£M«+ý[õ ¼ƒGŽÜ8¾Ú/eØêJ_Ø8oõõ;ƒ¿:,鯔¨ÎµWº*\•×§¸"7¹ÊÅìB?xÔ^r«+ F^WøÄ•¼³ÑÑø ]äæqûDÎ!4]©Ó@uBy5ëêA W³&Ž]éñÒL]¥züS¡&SóW[õSå'Y95ú“™¿‚!„B!„B!„B!„B!„B!„B!„BbËÿßü»endstream endobj 117 0 obj << /Filter /FlateDecode /Length 693 >> stream xÚmTßoÛ ~Ï_áG,ÕÄŒqÞÖµU[­Ò–díÃ:MžMT©q忿ܦZeÉœ»ï¾û8Œ’Ü>(Aʲ×,P™´ÛÉëRLKâ#ÎL¿Epá?ÆÕ:§w[„“+=ùaq³8;C¾\N¦7„$ˆ@Lh‘,WïõËN–]ò  2ÍÊs0ç+ÞsÕr“þ^ÞOo –Ô°¦u©y’2ÄBÒMÊ0н9 ~‘f¸ à ~…Ѽ†÷ÐYÌO/‚Ë`ß÷ãþ.âþbh62zo£ïÉaïƒÝ¨.Á‡1¥M 6:Íì¢åsŽ —]Ä@u]BG?)jȘ“Áº¤õTÕ`ër+`‘à)2¸[½Ý5½0Z…ï•îƒÑ5®âIrµ6ÁÕ˜¸ÆÐ½j1&j‹¹ ¦l1ì;£}7ïˆ1|å ç‘k¸Zaí6Æ6Êru4›Þ*@H ®[-õZ´Îç¸cbK\ µy,Ÿ±*åÈ>èk,„Rz.BÂ>E ÕŒÄZ¢öÜ¿^…õÛmãÈ\3¼7BqŸeÏèåBÇ–à2epÉM«wþä"eÏy™ö…f!•õgz< ;™ÊU‚vvH,]BXúªÈÒ®l·YE+p%zÞÁí98Cøôƒ×³7<8–{wt&|ºݺ棢F´ãž «oß\J±3ZtÿO\d}nbHe•Øí¤h›0%Îá+UPÜ ¼ >þº÷ƶÁ(‹}ï†4| 1s~ür ìÔCúUö~0–Õ~ðmür`%Í_Ï`c¯ý,ÜyRžÝyÊ`Îj‹â³7ð›M§ÇãÑQ‚jm ÒM×ú0ýþórñç›óß]N…:8yá®[}ò#± uN-±ŠB\Æß òG>¹^Nþ nJRendstream endobj 118 0 obj << /Filter /FlateDecode /Length 119 >> stream xÚ31Ö3µT0P02Q02W06U05RH1ä*ä24PA#S¨Tr.—“'—~¸‚¡—¾PœKßÓW¡¤¨4•Kß)ÀYÁKßE!ÚPÁ –ËÓEŸÁ¾Ô¨o€B¬Â@ø €a—«'W $o&|endstream endobj 119 0 obj << /Filter /FlateDecode /Length 218 >> stream xÚeαJA àÿØb Í>Âä Ü]vÏÃjá<Á-­,ÄJ--mo|±é|y§¼bœ˜áÄC®ÈB†þdyÆ-Ÿj /;~ìè…ú•æ¶Ä2xx¦õDÍ-÷+j.µKÍtÅo¯ïOÔ¬¯ÏYó†ï:nïiÚ0Ùýêñs ü’#ŸV¾œH€ˆø…|ˆ¯Ä›œ¯Foý;sŠ+lqÎ…¤à÷Ƕ÷d,²6ª‚ɺY'=alp µ¾Œ+ù–‰Êè%ÐÅD7ôpëendstream endobj 120 0 obj << /Filter /FlateDecode /Length 196 >> stream xÚmŽ= Â@…'X¦Ù#ìœÀMX£XüSZYˆ•ZZ(Úêm’#X¦Œo[±Øf–÷æùa5•B&x#/~,§’¯ì+ÌEÓÇñ³†ÝN|Ån…-»f-÷ÛãÌn¶™KÉn!ûRŠ7 !ÒH”ë›ÈꇨÖ+UÊ4jôdcÞ‘‰æM¦µ-å­@l_ Ϥô"j‰~Ð' f& Ê”Ö74˜.WHÁe °Ê4ù½’©A— où \s`¸endstream endobj 121 0 obj << /Filter /FlateDecode /Length 181 >> stream xÚuα Â0à+ ·ôzO`RL'¡V0ƒ “ƒ8iGE7±}4¥Ð±C1Þ…:”ün83d3Òdäf”¥tJñ‚F“Žòq> stream xÚmαNÃ0à‹2XºÅà{H¬¦.X*E"L0"‚5)oÖG1o`‰Åƒ©¹saAõð ¾ÿt7;ž/¨%KGvAÝ)ÍNèÁâ v=ÿ¶4ïG÷O¸°YS×csÉÿØ WôöúþˆÍòúœ,6+ºµÔÞá°"à§<€ .L)'¨rfë¢Îù;‰î“õÚGpåŸaF¨Ù]1Píõ¢.š­ä;Á´a?2ÈyWL ǹGõ•9^ÖþÄjoÉó.G¥ò¤8Œ¸2T‰Já‘=ã"b<èXL’á-Ϋ(UM+®eÊýw1•ëÒEK[¼ðÙzAendstream endobj 123 0 obj << /Filter /FlateDecode /Length 194 >> stream xÚ}Î1 Â@ЋÀ4Á9IH,¬„Á-­,ÄJ--mÝMoð¦L2ÎL‚ö±vY~ Gc 0äG8 q bÉD9ìŽðׇàÏy ¾Yàå|=€Ÿ,§È9Å ¿Ü‚Iѱ…ËÊ_­êª½ÆâŸ^cÞÖfì“8y/âû>Éß_[;b¥–â Psõ®fm]vÒ¨íº”¾V½i».¥o­VÚ·¥¥Ü[e¤Ú2‡™¼ ¹t6endstream endobj 124 0 obj << /Filter /FlateDecode /Length 156 >> stream xÚ31Ö3µT0P0bcKS#…C®B.cC ßÄI$çr9yré‡+ré{E¹ô=}JŠJS¹ôœ€¢. Ñ@-±\ž. ì ò€øƒ=2>çgÀÿÿg`†àñzÑp=×aÁÿ€ø&fᘘ„?Àqýÿÿþÿÿÿ†A|.WO®@.ïûJÏendstream endobj 125 0 obj << /Filter /FlateDecode /Length 205 >> stream xÚб‚0à# $·øÜ hA%1!ALd0ÑÉÁ8©£ƒFWáÑxÁ‘ÁXâ`›|Ã]ÚûÛ‘5°]2hH}sB–Kö&žÑr¸jиjíOè‡(6d9(\G.éz¹Qø«™(Úšdì0 Ô„é¥9Fÿ"­ºZ ,EÊÔIIQã«Úx Ð%ª¹ÿàUóì¢4d]Ô†G­ mQþMSÐÏáež[ò©p )yX$³>ïñ“Aã&à<Ä5¾NÇXêendstream endobj 126 0 obj << /Filter /FlateDecode /Length 230 >> stream xÚ}ͱJ1à9®X˜&yw×Ýl œ'¸…pVb¥–ŠvbÖ7[ñEâ(6W77V8±0/™É̤möf‡Rɾíö@fµÜÔ|Ïmcq…×w<︼¶áòÔ²\vgòøðtËå|y,/䲖ꊻ…PLdK?ÿ³“ìt4ýg1:üVuÈ&*Þ Ëw×#ïú¦ºÞ%è{"ßo¬×OÖpº‚($BòÁJ(D|p¤0hÚùÊðŽ®øšÍs^>Û¹3˜k¸•ý ÝðcÔ¤RýP5¿²¸y>éøœ·ZsYendstream endobj 127 0 obj << /Filter /FlateDecode /Length 154 >> stream xÚuɱ 1 €áŠƒÅG0O`¯\opÎì èä Nêè èjûh÷(÷ŽblÂ-ò…?ñå´šaUŸ—Óƒ+”>·$?Ž¨Ø–ì*_Á†5Þo3Øz³ÀÜ î šH1D¯>‘1Cf$t c¡U˜Ia.…È<5¾ÌGa ¼ûD"JLKLü“`` ?:•RŽendstream endobj 128 0 obj << /Filter /FlateDecode /Length 194 >> stream xÚuÊÁ ‚@`Ń0Áy‚Vq :f‡ N¢SuìPÔY£Ó7|;µÁâ4kuh¾ýçgd4ˆGôOÆ q¤ì^Í·=@’X¡” fÜ‚Èæx>]ö ’ÅC)®C 6¥èh¿[®¦Š —¨¡’}PíOmåwjØŠnì•ÖîØÎÖ¬¶ÕGe·¿rÛºµInùOsá•&yÅ?Í…_˜ä[ßæ*o©&+jIÓÓhò»‡iKx—‚»endstream endobj 129 0 obj << /Filter /FlateDecode /Length 180 >> stream xÚmÊ1 Â@Ð )ÓxçnBVÁJˆÜBÐÊB¬ÔÒBÑÖÍÑ"^doà–)BÆÙÕBÁbÿFåƒáSÌøTŽù÷œ@ùžúêÃî…¹F•œó R/ðr¾@Ë)òZâ†?· KŒ¨6•ˆéA–}’c‰Eî-Û ol¼}´Á:X}±“·"jþ³&x±ûoÂvÁV$öGCÖëˆ* š~‡™†¼êõfendstream endobj 130 0 obj << /Filter /FlateDecode /Length 198 >> stream xÚmŽ1jÃ@E¿p!˜f°s‚¬ÄZ1®d¢"W.B*'e »öh{A¥ ¡É(&E óàÿaøíª-¼Ñ]{öü^Ò™|¥ºXär8}RÝ’;²¯È=©K®}æëåöA®~ÙqI®á×’‹7j$¹ô€•2©%32É« ]Ì„hzØdL²¦úsÇ×_Lÿä_ØÄY£t:wÌjh^Hù;„F´U.Úo%m¥Z”ö-è/LRzendstream endobj 131 0 obj << /Filter /FlateDecode /Length 230 >> stream xÚuνNÃ0ð«:Dº%à{â„:&Km‘È€bj@°’¾y?BFiŽ>@U¥JÖOöÝùîÜò¢¸‘L—²È¯Å9Y^É.çwv™î/·}ãUÉöI\Áö ¶å½|~|½²]=¬%g»‘ç\².7B>š@TÅ*ƒvPU‰<ÜÓL_Ã: ØÑ¼¡y;§3‹ýóÄd4œÑÅ0 ½ã1õ¤iÈï{±•‰˜O¦K[¨lû£5LQB}!ѿՑßgìŽlO­4 b ó¦ûçÛ’ùÜv›endstream endobj 132 0 obj << /Filter /FlateDecode /Length 228 >> stream xÚuαJÄ@à )¦É#d^@7!¹;­îN0… •…X©¥…r׺ë›åQro°`³à‘ßY#\qØ|,ÿìðOÛœÏ/¥’…œÕÒ¶Ò,乿7n–šV2oÿFO¯¼êØÜK³ds­9›îF¶ï»6«ÛµÔl6òPKõÈÝFˆ@fØ*ñÉá;€á!É…Y$ ‡rHôT Ö'Hq‰Ä˜8(ý)坨 Ýp^wáeðÖç ÛÐ *ô ½LÉ1j ¢~-SÑ‘1qø‡ì—x 0hãD˜^)㫎ïø Zz endstream endobj 133 0 obj << /Filter /FlateDecode /Length 179 >> stream xÚ}Í1 Â@Ð]R¦Éœ¸‰VBŒà‚Vb¥–ŠÖÉÑö(9BʈÁqvE‹y0ÿ3LªûÃÆ8àI3Ôî8BªyÝêŠírj…©5ã”™ãùtÙƒÊL@¸N0Þ€)PR+IÔFdêÆÞ’jIW¢ZÈE,×Î&´¬ *>¨„`…óîí¼íÛ°ù°þmôÔþ³÷´ú²$j¼üŒ¼åKÎaj` ¿†Uàendstream endobj 134 0 obj << /Filter /FlateDecode /Length 206 >> stream xÚU1jÃ@E¿q!˜foÍ ¼Rd\ l¬Â`W)Bª$eŠ„\v¶Gä)U8ÿM—b3ûàí¼™µK­tÁ™ßk³Ð×Z>¤iyWùÌâå]V½øGmZñ[¾Šïwúõy|¿Ú¯µ¿Ñ§Z«gé7Љ}'8³„Îl€"M !#ÊT ‰pˆp‘›P\‰©`‰~ÀԅƲꌀE¢Œw€KÕ¸r40À€0æïâ‚ß=æO%›òÐËAnªRZAendstream endobj 135 0 obj << /Filter /FlateDecode /Length 176 >> stream xÚuϽ Â@ à”nYúæ ¼Ö«¢ µ‚7:9ˆ“::(ºÖ>šâ#tìP“C…îãòÑKm8¡˜ÆrÒ¥#:&xAk%5ÕÆáŒ™C³%kÑ,¥ŠÆ­èv½ŸÐdë9%hrÚ%ïÑåHD¥ÐëbæfþRú›¯A¡#´JÓAà©;=L•â—Vi„@ …&ª!`®”ÈnOY—õoò .nð îRðendstream endobj 136 0 obj << /Filter /FlateDecode /Length 178 >> stream xÚm̱ Â0àH†À-}„Þ˜–´ŠS¡V0ƒ “ƒ8©£ƒ¢«Í£Å7é#t¬P<“àRt¸ûïŽËÔ8Ÿa‚SW™B5Ác P¹Ë‰~q8C©AnQå —n R¯ðv½Ÿ@–ë9¦ +Ü¥˜ìAWX·œ µÂÑ ²0ã-‹‡FV°_j,{üáÍâ€aý€Ñ—ÂðÞÿé\wî¸v‘ðpzQÃèI6ð&‹]+endstream endobj 137 0 obj << /Filter /FlateDecode /Length 176 >> stream xÚ=Ë=‚@à!$Óxæ.dÑ@ bâ&ZY+µ´Ðh‡Á£qް%gù+æËÌ›¼@.Wyò!É5Ý||¢4™gNó¸>0U(N$#;NQ¨=½_Ÿ;Šô°!EFgŸ¼ ªŒŠÖêš®³Ú~ë3§˜œ ⻂|¦ž°4Øš±4#\YüÀª¨]˜ˆgr¦1äõÄWOÕLÉ$ÓÇ­Â#þbVO˜endstream endobj 138 0 obj << /Filter /FlateDecode /Length 197 >> stream xÚ5Í; Â` à€ƒ%7°9‹õm`A'qRGE¡C¡GàEz”¡c±æokB>òbwÚÝ!›Ü—²ÜéñÞÂÚ&ë”QvGû¨Öl›¨æ²Eå/ør¾P—¶PMyc±¹EÊQÑ·( ˆ5Ò•;Š¡‘iÒ?Í’ä•Ä5™Ó-7€î- ÇÇ«y¾! ^P+Ì<§$r4¡+n ”„¬"©ID>8óq…?áUÑendstream endobj 139 0 obj << /Filter /FlateDecode /Length 216 >> stream xÚEαnÂ@ PGNò’OÀ_ÐKH@b!¥`b@L´#ˆnˆ¤vý“Hý¶Þ0öe`¸'Ûwg»ÈßFJ)—SŒ)Óg†G,†’§šêÅþ€³ 톊!Ú…TÑVK:Ÿ¾¿ÐÎVÓ6£t‡Õœbö%71w%;Ã]Í®û:$δ &À´ƒ nKoW1ò]Ћp¿©uû²tÁF@ˆƒu¨°ÞFÿjü§ïM0ùÕ>ÉŸÔ)è” èÄN¼6ª²#0˾¢ jÜ×ñ£Â5>Ý[¦endstream endobj 140 0 obj << /Filter /FlateDecode /Length 224 >> stream xÚMαŠÂ@à )„iòBæÎÍâ´‰ày` A«++µ¼âŽ®ˆè£åQò)·®;»Áló±ü3ìüj:™-(#IorNjNÓœNPå6Íh¦úÑñW%ŠOR9ŠÍQ”[úû½œQ¬vï$Q¬éKRvÀrM`ºØèÈ> stream xÚmŽ= 1F'XÓxçf× Vº‚[ZYˆ•ZZ( vz4²G°L±¿‰?•ä13yLâ²Þ`(‰d8.—,—mÊv}ô‰¶z±ÙsQ±]Šë³bʶšÉéxÞ±-æcIÙ–²J%YsU äf”÷7[qòáƒ(hžÊV£ì ¨©[“©it'äzS¤í•ˆÈ[Œ vý».Qô*šFEŠññQ¯"xÅ¿ ?>â¤&žT¼àwse–endstream endobj 142 0 obj << /Filter /FlateDecode /Length 203 >> stream xÚ}Ï¿ Â0ð”…[ú½д´Õtj3:9ˆ“::(ºÚ> stream xÚuн‚0ð’[xî´‚âD‚˜ØÁD'㤎]…GãQxFBí¥1èòKû¿~\Šq4CCM1Åx à"Ö¡“¨«ÎJà[1ð¥ŽËÞ®÷ðt=Çx†»ý=È ™W3ƼV“¨‚¨ôTQ˜ÎScýÃ6ÔCC5Ä5”ŸQ·˜š±•>ÕRÍ›p(s©Ú5MÛ’‚`_ä=´=ÍËÐ?Í¥ËèGrú¥J‚"Z–S°°òZ¨endstream endobj 144 0 obj << /Filter /FlateDecode /Length 137 >> stream xÚ31Ö3µT0P04S02W01V05RH1ä*ä22Š(™B¥’s¹œ<¹ôÌ̸ô=€â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. ò ü ö ò ö öêQqC=C=2Ãp\ÆàÀñ†   \®ž\\Õ8æendstream endobj 145 0 obj << /Filter /FlateDecode /Length 273 >> stream xÚu±NÃ0†Ïòtyß @¥!°ÔR)`b@LÀÈ‚ 5ÞúXñ dcÄ£‘¢çÒÒ‰ÁŸìÿ¬ûî&å~uD9Õ´WÓ¤¢ên |À²–0§ƒê·rs³³K*kÌN%Ƭ9£§Çç;ÌfçÇT`6§«‚òklæ :Aò¬P<Ê‹ÙaîÀ2÷Ð~½z`³ôj0:hoTн Y¡“,ílR7Ý"fSíÒ®_‹øÇ¢‡Åâ¯á°®@œ¾c9´ò1XÊ·£¼ôtíX Žu¿Æ(c¹Ar³°ˆâ6yÀ.ߟ!nÕC½Iœ@­ŒqqHÝf Ø`Wž4x?lÿ„endstream endobj 146 0 obj << /Filter /FlateDecode /Length 199 >> stream xÚ¥=‚@…‡PLÜ è²ÈŸ bâ&ZY+µ´Ðh«£xJ Îd)è-¾bß›yó6šÏâ¤3šf%gtÖxÃ0e5 $¬Ó ƒjOaŠjÍ:*³¡ÇýyAUl—¤Q•tÐÑ”àÔîÀg&Ì›ß}NÇr à5ƒÅr^± ÅaÛý2󆿶ã“Ê®ä`‘Õ׉iÿ`œ•»r_zHé&=¥¯| z)3”óWwøFHH—endstream endobj 147 0 obj << /Filter /FlateDecode /Length 203 >> stream xÚu1‚@EÇPLÃLœ è‚ÁÊ1‘ÂD+ c¥–&j´ŽÆQ8%…gd•B-^6™ÿgþß‘;ðÆd“Oý€\¼€öžqðÇ~£ìŽƨÖ4 PÍyŒ*^Ðõr;  —SrPE´qÈÞbt ÇLR~3&0 £è> stream xÚmË¿JAðOS¬Ls/ î<{ÇÞù§ñ FðŠ€©,ÄJS¦P´ ¹€/¶²Â6å‰G>÷ÄÎ Ìæ›™ÒŸV—šë…žkYjéõ¹ñUÊrõg¿‹§…Œq÷ê+q·)×Lõíõ}.n|w­…¸‰>š?J3Qà©®V{X‡‰u¶îGÁ†>‹vÛ×Ñv£Ý}1’‘=@nšȘ^í@›Æ2"Ýu)âõ÷'Ñn6?"±2±ÅÒÄÀÄ£ü‘…ÿ˜ÔrÓÈL~‰Qendstream endobj 149 0 obj << /Filter /FlateDecode /Length 151 >> stream xÚ31Ö3µT0P0W0S01U01QH1ä*ä26Š([€%’s¹œ<¹ôÌ͹ô=€¢\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. | @ …°v¸ˆ:QƒAØÿÿÿÿA=øñN€¹ ?@J@#˜ø€ƒ`pì`ÖÑÀÀÀåêÉÈ\z> stream xÚ=É1 Â@EÑR~“-¼ èäg”`£#8… •…¤RK EÁJ³4—âRZ„ŒÓ(œêÞ‘Ž'̨–Íi•ª<¨œE‹3æö÷ö')˜-µ³ CŒ[ñz¹Å”ë9ULÅ2«ÅUD‹¸CÒ#õMx‘fÀx¢ñi‹çþß î€,œlä õ‡* endstream endobj 151 0 obj << /Filter /FlateDecode /Length 102 >> stream xÚ31Ö3µT0P0"3#C…C®B.#¨‚)T&9—ËÉ“K?\ÁÈ’KßCÁ”KßÓW¡¤¨4•Kß)ÀYÁKßE!ÚPÁ –ËÓE¡þÿÿÿÿÿÿà >—«'W ²©$Ìendstream endobj 152 0 obj << /Filter /FlateDecode /Length 99 >> stream xÚ31Ö3µT0P04F– †† )†\…\@Ú$l‘IÎåròäÒ pé{€IO_…’¢ÒT.}§g ßE!¨'–ËÓEŸÁþ@ýúÿ!Äncàrõä 䄬eendstream endobj 153 0 obj << /Filter /FlateDecode /Length 179 >> stream xÚ31Ö3µT0P0QÐ5W0±P0µPH1ä*ä21 (˜™Bd’s¹œ<¹ôÃLŒ¹ô=€Â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. @ÀxD2?@ì,Î&å¤=ˆ`¨C"ÿ€ù ™? ÆaÄdÃjðÆŽa¦›ìÐÝ„lÔMð¹Iž$bº‰¿Ÿ‘ÜÄ6†¡Lr¹zrrШAendstream endobj 154 0 obj << /Filter /FlateDecode /Length 221 >> stream xÚuÏ1nƒ@Ð(VšfÀ\À^Ù’¥PXJªQ*;eŠDv m²G tØ Æ.’æ­4#ý¿J—Ù†c^ó"áUÆÙŸú¦4—aÌY:mŽ_´­È¼qš“y–1™êÀçŸË'™íËŽ2%¿'PU2µ|„þ (ßÚ2w(Ú¦E-zD6¸BÛðFå”{ íDØIÚ3ê?¯”ûmgDíŒj #’× Arf#érµÑNN,t']´÷cÉá^Þal о¢Wúqái7endstream endobj 155 0 obj << /Filter /FlateDecode /Length 170 >> stream xÚeÊ1Â0 PW"y€#Ô' MKU˜J‘È€CÅŒ X)GëQz„Ž U‚ƒ€ Ïòÿö8eSŠIÅ<Ò e ž1ÉÉ5ß—ý rKIŽrÉ5J½¢ëåvDY¬ç¤P–T)Šw¨K@ô1c5³ ™0|2 GÂÞAô¼w=ÿý œ§/t:ŸpZßÐi|‘óø©­m¬µí—˸иÁI Ptendstream endobj 156 0 obj << /Filter /FlateDecode /Length 229 >> stream xÚmбN„@àCA2 À<ÀÉ™X‘œg"…‰WY«ÓÒB£­ðh<Ê>%aœ™K¼Kî6ðegçß]B}}µ¾å’k{ox½â·Š>©®´.­´Æþƒ6-Ï\WT<è*í#ý¼S±yºc]Ýò‹ny¥vË@6CG'=D"ŠŒº,2ùdíf‹Fzìé-måý©É™Áé1º:šƒð;Ý_w1Â|4™Ìt4³hæn7˜öµ¾)ñxæñÜãM> stream xÚUпJÄ@ðYR,L“Gȼ€nb.r6¸?` A+ ±RK Eá*ï-’GH¹EØq¾‹‚²ð[˜Ýý†ÙE}Þ\I)—rVÉ¢‘æBž+~ãziÅRšz>yzåuÇá^ê%‡k+sènäãýó…Ãúv#‡­r·¢69MD^õH…jO­ê@‡±IÉGJä¢3&ƒþ`ËM´·S¢™ øñ—|0ÚÞ8‘oæFˆ ¡¦xoÍí2(ð"~øB³9~…ÚÐò}B@BTB_Cm˵c1a´H9æó˜Ôzã x×ñ‡kendstream endobj 158 0 obj << /Filter /FlateDecode /Length 214 >> stream xÚeÏ1jÃ@Ð[¦Ñ4'ðJ–T¨±@±!* q•"¤JR¦°±» ë¹’n+¨s«.*„70‚,̃ýË0³i²Èr‰$C¥™dKyyωf‘^õáí“ËŠí³$9ÛG¤l«­§¶åÓƒÄl×òKôÊÕZˆ¨hÁYqžb~ÁOC~O¨•xCH7Lü-…VhPjeÞLã hAØ€‚&j¢Ψ\ïœ5Ó™ØÖëÿcîtsŒÃ·|纚ñ¦âÿþ*fëendstream endobj 159 0 obj << /Filter /FlateDecode /Length 224 >> stream xÚuϱnÂ0à‹2Xº%{â˜D,Q*5C%˜ªNÀÈ@Õ®uÍâGˆÔÅC”ë™vaˆ‡O§³ìûoQÏšGªhI† 5†N¯X¯¤YQ3ÿ»9^pÓ¢>P½Bý"mÔí+}~|QovOdPoéÍPõŽí–À2GpÌÃ=¾AΘ&ÈnÄ òè<ä?ÜCžþÆ Þuj„Ò«…W=AP!÷BzÙO²P½ÿSÜðBé%­í$”ë¤bpR«l°J–,³Laî ã´œ•øÜâ¼p.endstream endobj 160 0 obj << /Filter /FlateDecode /Length 247 >> stream xÚm1NÅ@ D'JÉMŽ_òC~Q­ôùH¤@‚ŠQ%Z6Tƒ«ä({„-SD1³Q ѼÂcg¶íqwªíõ¨Ñm§Ý‰>4ò,mÏáF»öG¹’Ý õ¶½ÔK=\êëËÛ£Ô»«3m¤Þëm£›;ö d ´ p³ˆÜlFaùŒr&ª@¸©˜áGÂPÌÙŠÂ>pßO¼ôcÝÂëÿ(Ã{zóU­àA¬L/”˜»Œ.²³°ßÄÞ©8óð’Éå|kùØës†endstream endobj 161 0 obj << /Filter /FlateDecode /Length 202 >> stream xÚ]; Â@†GR¦É2ÐÍšD„€p A+ ±RK EÁB–£ìRZ㬺†8Åóø¿‰ÂN< €¤¤¶¤¨Oq—vöxP~WÛŽŠ…=3ž£Ps:Ÿ.{£Å˜$Š ­%TWRU•ÎE:å]þÈî7€ ®ÐâœÒàÁp †§~nµ(->ºGCW;]Ý@ýâõGÏÀ5vœ*\â jwR]endstream endobj 162 0 obj << /Filter /FlateDecode /Length 251 >> stream xÚU±NÃ0„/òÉ‹Áÿ @ÒTêd©‰ H01 NÀÈ‚µÍ£åQü=X1ç¶bùdßoßݿꯇ´²–«NVknä­ÓŸº/b+Cž¼~èí¨›gé7º¹§¬›ñA¾¿~Þu³}¼•N7;yé¤Ýëq'€‰rTÎLÎ6çlÄqª#¨T%T©âÓ¤ˆE… µ§öjU$Tä;øÍxØ™VÌpya"ÝQ1ì|r9±@Åæ¡°“™afË6ÞM¨½q¸@…R¹þƒñÅ{æÔ¸éúÑ ÃÍŠ¢Ie¿€º,yZ¥,[è»Q?é_Wuçendstream endobj 163 0 obj << /Filter /FlateDecode /Length 241 >> stream xÚuϱN„@ÐK¦˜ä5ü€ ï”E–+’uM¤0ÑÊbc¥–­¡ó·ø”élé¤ <ï°ÆÎæîÀ÷¶åYu¡­õ´Ðm¥Õ¹>ò*eÍp£Uy> stream xÚ31Ö3µT0P04ÆÆ Æf )†\…\†¦@¾ˆ –IÎåròäÒW04åÒ÷ sé{ú*”•¦ré;8+ré»(D*Äryº(0|`þÃþ‡ý?‚Ø?0àü öêÔ?ø vƒ—«'W Èa*‰endstream endobj 165 0 obj << /Filter /FlateDecode /Length 187 >> stream xÚUޱ Â0ES:Þ¢Ð÷¦µ±ÐI©Ì èä Nêè è&´ŸÖOé'8:knh †ä@Î}7D%“YÆg¬X¥Øç˜n”¤ÆE¬¦68])×$÷œ¤$ׯ’Ô~ÜŸ’ùvÉ1É‚1GGÒ ³æxos «ï*!‚¯¹…ø¦÷~‡ÑÖù²ŽZoŸ(kÌ ‡²B" PõÑðqã>´.îÛ¶ø{€°xcA+M;úç–=Äendstream endobj 166 0 obj << /Filter /FlateDecode /Length 118 >> stream xÚ31Ö3µT0P0S04S01S06QH1ä*ä2 (Z@d’s¹œ<¹ôÃŒ-¹ô=€Â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. òÿÿÿÿc$þ!°‘ ¨øÿÿ Àb\®ž\\ÏŠ>Ãendstream endobj 167 0 obj << /Filter /FlateDecode /Length 187 >> stream xÚU޽ Â@ ÇO YúÍx­w8jotr'utPÜê£õQúŠ5I-Ôåù$±f2›cŒ-ZƒÖá)+GZŒv*Æñ™½Cã@¯Hí×x¿=Π³ÍÐ9îŒàsT/¥Ô¨"ŒkFÃ㇠ZFQ"¶Ã7!Ø\LÅ®{»kwÅ; #e´%ç(𮈻iõÓÇÜ›^/ªaTtY!ŸÉ)yçÉ@,=lá M>kendstream endobj 168 0 obj << /Filter /FlateDecode /Length 188 >> stream xÚUÌ=‚@`6$Ópæ.?’`# bâ&ZY+µ´Ðh+œL9 G ¤Ø°Î nñ¾ÌÌKfÍâúQæ!Æ!^¸C”ÐîëUçdø£ø†®ÀÅŸ×x¶[a<Çc€þ DŽ–eI ëÛÄ™p?šïˆ×“éÄR󞬱§öÊ?ÜjÄ+ R¥ I}ëi*»qúèÔD!™jUÇ”T­¡©¿ÁZÀ~'dØendstream endobj 169 0 obj << /Filter /FlateDecode /Length 222 >> stream xÚmбnƒ@ à1Dò’GˆŸ @ C§“ÒT*C¥dÊPeJ;vhÕ®GãQxF„kû²D‰d>á;Ýñãòñ¡zâœ×ú”WôM¥õ¹µörú¢MMÙË5e¯ºJYýÆ¿?Ÿ”mvϬý–ß ÎToHˆÈèNî [`ÑCZ,{µÃª3ïVÜZµwŒ¼ ³™LæR¿D·Ã%Ú»º{F:™ÉlZY<ÀߨFãåÉxmãžÝéhÒÁîW£ÿõÞÆ IÄÇÓxLz©iOÿ¸Çñendstream endobj 170 0 obj << /Filter /FlateDecode /Length 237 >> stream xÚ¥Ð=NÃ@à¹Xiš=‚çà˜ØB‘,… á * D)S€ µ÷&\Å7ÁGHéÂòð6.‚DIói5û3o¶X—k]꥞åZ¬µ¼Ð×\Þ¤ÈY\j¹šw^ö²©%{Ô"—ì–eÉê;ýxÿÜI¶¹¿VV·úÄ;ÏRoðƒÐN>`aö˜}x3 H‡”V½£mH¨ñâbŒ&oÃNúhà»h:€+T¨p²=Úüq::þϤ‹º>¾F›_²/C2ã1eÂyaÜ:ÄùÜèã#fœÃÉ`ÖÅèx–!7µ<È=cendstream endobj 171 0 obj << /Filter /FlateDecode /Length 208 >> stream xÚuн‚0ðkšÜâ#xO `âD‚˜È`¢“ƒqRG®À£ñ(}FB½ЄĤý¥ÿ~¦øópE.-¸K =ºzøÀÀçìšh.wŒStŽøèlytG¯çû†N¼_ç„N¹gL‚\kÐZ—ÖÊZƒ™o¤’-ÀT c Úš[£âçìÛº8RõòfÉÂ_yOwyö_¾ªµ6ƒ|pd‚mAÔ&²Â:©­•QV&òƒ£Ò˜¬ÐöëíP€®$> stream xÚuÎÁ ‚@àÂ\z'HÅ Á òÔ©CtªŽŠºEúh>Šàуh³kˆeͰü³°;ÂûSrÈã#&ä»ttñ‚Bpvd”‡3†1Ú[í%OÑŽWt»ÞOh‡ë9qŽhç’³Ç8"h¸re¡)¡¯‘ƒQÀ¨5“ñŸVzV \¿4Ù ¤0°i:“·uç“ûÓl3%üRk-Le00½µÏöåøãæËJÍKÀEŒ|ñ}xBendstream endobj 173 0 obj << /Filter /FlateDecode /Length 186 >> stream xÚ}Ê1‚@Ð!$Óp™èBBE‚˜Ha¢•…±RK ¶.Gã(’‚¸Î.ZHÄIæ%ÿψÙ$ŒÉ§)¯ˆ) èàEÄÙ×QgLsô¶$"ô–Ü¢—¯èv½ŸÐK×sâœÑ. yF •R 0ªýRG5X-ØXÍ NPƒSÏnil¡Ó•b“EOþÒ&¬4>ÀíØ=ŸÆöŸVgÓWªÊX³Ê(ßê9nðón endstream endobj 174 0 obj << /Filter /FlateDecode /Length 232 >> stream xÚ]Ð=NÄ0่4MŽà¹8!U¤e‘H¢b·¤D±Â9Ú%Gpé²!±4_ñžfü³jO»K®ù‚O^swÆÛ†^©í%¬¹k—æù…Ö#™n{27“oùýícGf}wÅ ™ ?6\?Ѹa@Ï=ü*Å€2¥€*£ :À¢ ˆ(}!½Wj¡t™Y¨W=-ó0ð‹Í|3á?*¹|ÿ—Ÿ z†clÞbó¾´`Q$9R “Š2S ³Ž¨œù}Q:¡Hq/“þ3@×#ÝÓ7çp@endstream endobj 175 0 obj << /Filter /FlateDecode /Length 193 >> stream xÚmÐA ‚@à'.„·é¾4ZŠ´Ì Yµj­ªe‹¢¶i7ó(Á¥ qš§ 3üo~f‚ù4\G3½C½|:ûxà ҹ|pºb"Qì)ˆP¬õ…ÜÐãþ¼ H¶KÒ9¥ƒOÞeJ5 jPÊRÍÈnî|À-`ÒY€››s.°9Ä`6.°¯?•¾ðgÖ[÷êÂ@KÛ´Ö`UfíŠ lviÖ)¹À–üÊ¡™‚öÞJìæ¸’¸Ã/V±endstream endobj 176 0 obj << /Filter /FlateDecode /Length 156 >> stream xÚ31Ö3µT0P0b3SC…C®B.c ßÄI$çr9yré‡+[pé{E¹ô=}JŠJS¹ôœ€|…hCƒX.O†úÿÿ0üÿÿÿcà?ÀÀÀ &pö`‚Q"êpÿ@Ä#˜øƒ`pì`â2Qì¿pOþaàrõä äIVRendstream endobj 177 0 obj << /Filter /FlateDecode /Length 163 >> stream xÚ31Ö3µT0P0bcSC…C®B.c˜ˆ ’HÎåròäÒW0¶äÒ÷Šré{ú*”•¦ré;8+ù. ц ±\ž. õÿ00üÿÿ™‹1 ì`â‚LÀAȃ‰„=˜`ÀAÔƒˆ:\Ä?ñ‡ÁDÔ¡ÿÁÄ Qÿÿÿÿ?ÿQˆ ±\®ž\\Á˜[Éendstream endobj 178 0 obj << /Filter /FlateDecode /Length 242 >> stream xÚmбNÃ0à?Ê`é–¼Aì' ¤ª¢X*E"LSadÈ`µy^ÉoÀ+dc$¢–sŒT@•|Ÿôßù»89šžª‰:æšòÉÕ]NTÌ8ÑV4¯)[ªbFÙw)«/ÕóÓË=eó«3Åy¡nr5¹¥z¡°é ìzÈí^½ÅÆAHœ¿ ^Ù_öŸÑk¢O mb¶2ñ{Ë o)Þ¼IP¶X—’5•”`ÓÑj´5Ò†uiSyû½² ®9iÙ^ZÃ&­WÀ‹ÄÁŽW9ˆ õ+¿å§ûo w }:¯éš¾ˆ¢{{endstream endobj 179 0 obj << /Filter /FlateDecode /Length 221 >> stream xÚmÏAJÃ@à¿tx›9BÞ šFSŠ›j³tåB\U—.”ºjir½‰ä(s„én„¡ãË š…ÿ}ðÿ³šâ|2»à)ŸÉÍ$9?åôJÅ\z¨ÝÃú…–e÷\Ì)»–•²ê†7oïÏ”-o/YúŠrž>RµbÔµƒ·ðGx×+£$qP-Tô ªú8aÚ ý ¦Hñ«Ú”@\¨fñgm£{`Ü%íNGõP¸ iÛk,FÓû=pk0Žjluo-9¢Ôðþ¿m·Ë骢;ú[Ê|endstream endobj 180 0 obj << /Filter /FlateDecode /Length 194 >> stream xÚ}ν Â0à+„[ú½'°ÿ‚S¡V°ƒ “ƒ8©£ƒ¢sóh}”>BÇ¥ñ.EÁ†ËÇý$$q4MæäSÄ;žQÐ)À+Æ!×¾”28^0+ÐÛQ¢·â.zÅšî·Ç½l³ ®sÚä°È ´Ö Ä,¶5yoÔ“ÚfJN©Ñ­>¾ãÕTåHA¶±-£ÝIÓå?”ò±6*‘°<”+¼º1­ÁvL{°ùµÔ¢yõˡ˷øäjÒendstream endobj 181 0 obj << /Filter /FlateDecode /Length 244 >> stream xÚmÐ1NÄ0Ð¥ˆ4¹8I±U¤e‘H¢Z()XA»ö 8W‰DAÉr„”)¢5c‡H€ÖÅ“5¶ü¿\Ö+.¸äÃU͵áCÏT•2,¸.ç“í­[Ò·\•¤/eLº½â—Ýë#éõõ9Ò¾3\ÜS»aXà½wÑ>:@æ~²^M€ê¹¤:ÌÚ_6‹ù¬;â~±qá…ÉLÇ ‚VrﻘëðÓJöX&{بäÈ#’‰Iz³c&ñ4ÃÍÿ~¸àg'ò¯.¿ýÑz¨w'©ÊÏÊ—¸ì EJsY#袥ú´}×endstream endobj 182 0 obj << /Filter /FlateDecode /Length 245 >> stream xÚmÏ1JÄPàYR¦É |sÍÆ}!°®` A+ ±RK EÁÊ—£å^a2Å’ñŸ‰‹6É̼yÿ‹«£úT–å°’x"õ±ƒ‰pÂ,ÑÎ\@Ç_³Ùès/*g.ù ù)¨&éÖL“ÙøOPëãv˜Y´µ‡ùÏì`nî ÿ,ß{à·ùOÄ›Mx±[l)õz»i²ç&µ$©vªX?zÎÌòEË7ü }„t£endstream endobj 183 0 obj << /Filter /FlateDecode /Length 163 >> stream xÚ31Ö3µT0PaS 2TH1ä*ä21PA $‘œËåäÉ¥®`bÀ¥ïåÒ÷ôU()*MåÒw pVò]¢  b¹<]ìÿÿÿÿ¯HüG#êìêÿ1Ô3Ôÿa¨c¨ÃFT0üc°a`øÃÀ€•`?pÌ`â‚L<ÀAðƒ‰8y0Ñ€LðÿÿdüÿL€Å¸\=¹¹7X^´endstream endobj 184 0 obj << /Filter /FlateDecode /Length 207 >> stream xÚmÏ= Â@à‘irçºY“€V þ€)­,ÄJ--mMŽ–£ä–â8“mR,„Þì›d“gãbF)Mid©˜Paélñ†y&ÃT'ÝÉéŠóÍžò ÍZÆhÊ =îÏ šùvAÍ’–Ò#–Kª¸vÜ07·}ý> stream xÚU̱ Â@ à”B–>‚y½;m§B­`A'qRGE7iûh}”>BÅA‡âyM½ŠIøù!þxLH’’4PðìžÐ—Ôt0úF»#F Š5ùÅÜÜQ$ ºœ¯ÑrJ ELEr‹ILY Ù[¿A3š7¾yx…¥Ïä–ZJÈÒ–^ µÅyY\¦²˜ü‹Ç-nÕÏ-!ü‘vÜjËýÕQ8¥áÉÍäÿ€)Æ|œ%¸Â\0okendstream endobj 186 0 obj << /Filter /FlateDecode /Length 196 >> stream xÚ}Í1 ÂP à_ Yz„¾Øëàb¡V°ƒ “ƒ8©£ƒ¢›´=ZÒ#tìðè3É$‚BøHþGò’éd67‘‰#fKcºQ"³&úrºRVP¸7IDášc ‹yÜŸ ³íÒðœ›Cl¢#¹©,ªÁ pŠÓN3¿EÐxLíuH… ã%Æ=ÁbÔË=ÓÖSZ`ð T‚šI™4³JáÅVè^…¯´Bó¹ùùç ÏñeßõŸhF«‚vôý}Zendstream endobj 187 0 obj << /Filter /FlateDecode /Length 167 >> stream xÚ31Ö3µT0P04SÐ5W05P0µPH1ä*ä26Š(˜™B¥’s¹œ<¹ôÃŒ¹ô=€â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. òÿÿ30Øÿÿ߀JÅ€ NÔa!þÁ‰?˜#‚øI0#ˆ˜;‚x€Ið#ˆ˜„<‚hÀ$ì&ß»ÿÿÿÿ‰z—«'W !èVŽendstream endobj 188 0 obj << /Filter /FlateDecode /Length 172 >> stream xÚuÐ1AÆñ…ä5Ž0ߘ]cÕ&k%¦P)D…RAh­£íQA©;Cñš_ñ½êÿºº  ƒV:FÔÇ:¤i]âèyYm)5¤æÐšÔ¸šI™ ûã†T:"$•a"X’É ¤µB$Öž?!ä›Ä#rlj£tÜjžCÝsehx. MOÁ ‹¯¾ßÒÿ¹¹{•}R¾ÈmU@#C3zäTñendstream endobj 189 0 obj << /Filter /FlateDecode /Length 197 >> stream xÚUÌ; Â@à?¤¦ñ™¸ ‰«` A+ ±RK E[7GËQr„”)–Œ³Øh1Ìë/òÉtÎ)—ZEÁyÉ—Œî”Ï´OCç-*2Îgd6:%Smùùx]É,vKÎȬø˜qz¢jÅH€HƒH¤C,â10êã\ÀÖq‡¤ŽEÏÿqRc,ŠS4EB€è¨µH<,l«)®o ÿËðe@ä¡ß®±ú¨)]¢ôšîúX¼í!í¸£uE{ú³/^qendstream endobj 190 0 obj << /Filter /FlateDecode /Length 212 >> stream xÚuϱJÄ@à_R¦ÙGÈ> stream xÚ•Ž1 ÂP †q(d°Gx9¯¥OA ZÁ‚N⤎Š®mÖ£x„ŽÒ˜Á!$!ù¿'3NØ*Φ|IéNYÐ>±Öç-KòÎùNÉ—[~>^WòËÝŠSòSNNT ȈD'Ò i!Š4y;ì‘·ÑGwp{c×ȃjCeè ß s»]Ø—ÊžZž†º.þ"US³“‚9©-­KÚÓ¦IÆendstream endobj 192 0 obj << /Filter /FlateDecode /Length 193 >> stream xڕα‚@ à’.<} L— &Þ`¢“ƒqRG®â›á£øŒ—;[pqÓᾤ½´ý 5)+ÊHñ+•9ís<¡’^&¥|ìŽXLפ*LçÜÅÔ,èr¾0­—S⺡MNÙMC±€Ä  ÿ$z1Ú1Þwxï!"Ëûâ>ô<æôZ™iá&³N°?â>cíH ãRa¸ÊÉHŽ'c Ë:ÇÑ´m™¸O,Î ®ð —ºYKendstream endobj 193 0 obj << /Filter /FlateDecode /Length 201 >> stream xÚmޱŠÂPEï’âÁ4ù„ÌìKˆ¬® ›BÐÊB¬Ôr‹mM>í}ÊûËâì}VÌ™;ܹ“ú³™i©“Ô¥ÖS=Tò'uÃù9&aÿ+óNüFëFü·â»¥žO—£øùêK+ñ ÝVZî¤[(²€ÂÐÛ f#2³;܃J>ÂPD´Cˆv@Z }•ˆ„‹÷c½C  ¤7¸¾Ð'Ð* 4u‘ö.æ7ú¹mp Ìb2ræcÀòÝÉZþI÷_þendstream endobj 194 0 obj << /Filter /FlateDecode /Length 154 >> stream xÚ31Ö3µT0P0asSC…C®B.cßÄ1’s¹œ<¹ôÃŒ¹ô=€¢\úž¾ %E¥©\úNÎ @¾‹B´¡‚A,—§‹ÿû@âÿÆÿÿ˜AûŸz ñHð?°*;&põÿÿÿš4A€Åðk£aÿÿÿ[~ `1.WO®@.òÅ^£endstream endobj 195 0 obj << /Filter /FlateDecode /Length 253 >> stream xÚ}±JÄ@†ÿ#E`š}!óšÄä”k.pž` A+ ±RK E»#›ÎÇðUò(y„”[,g‚²ìǰóÿÿÌÖÕÉzßòq¹áºâꜟJz¥º`;볟Öã íZÊï¸.(¿ÒwÊÛk~ûx¦|wsÁ%å{¾/¹x vÏ’€4¸ˆlnfxYé•DdöItÁ§S¶n\Å#7@efd=º`’El6X4jB*²`„éá¾fÀ}E_éh0‡íb•ôj“1SLÍ€,xÝ>v*‹Å!*:MÃö–Æ¢ó½:²?-y‰%Û§F‚Í@—-ÝÒ7ãè‚>endstream endobj 196 0 obj << /Filter /FlateDecode /Length 161 >> stream xÚ31Ö3µT0P0bcSC…C®B.ßÄ1’s¹œ<¹ôÃL ¹ô=€¢\úž¾ %E¥©\úNÎ @¾‹B4Pe,—§‹Bý øÿ¬“Œ‘ò@dý ùóÿ? ùûÿ ùB~°o’äAdƒü ÉÀ$ÿÉ?Häz“õÿøÿÿÇÿÿIˆ8—«'W ƒzúendstream endobj 197 0 obj << /Filter /FlateDecode /Length 132 >> stream xÚ31Ö3µT0P0bcKS#…C®B.cC ßÄI$çr9yré‡+ré{E¹ô=}JŠJS¹ôœ€¢. Ñ@-±\ž. ì ò ØþÃÄ@òx@ýÿ@ü€á?×C1;}pýÿÿþÿÿÿ†A|.WO®@.üØO)endstream endobj 198 0 obj << /Filter /FlateDecode /Length 198 >> stream xÚÌ;‚@à%$Ópçò.¨H)L´²0Vji¡ÑV¸‰Wá(xŒ…[Æ_­Å~Éü³ó‡Á0ŠÑEŸ_ècäáÆƒ=’¹2Êb½ƒ4gA ΄Spò)§-8él„ôŒs˜ÃQ¹yÀendstream endobj 199 0 obj << /Filter /FlateDecode /Length 115 >> stream xÚ31Ö3µT0P0b e¨bÈUÈel䃹 ‰ä\.'O.ýpc.} (—¾§¯BIQi*—¾S€³ï¢m¨`Ëåé¢PÿÿÃÿÿ‰zÁÀ<Œˆúÿÿÿ7ñÿ,ÆåêÉÈî{\Wendstream endobj 200 0 obj << /Filter /FlateDecode /Length 171 >> stream xÚ½Š= Â@…·[˜&GÈ\@7!Q°1#¸… •…X©¥…¢õ^,7ðæ[n±ì8šÎȃ÷WÃÑ3ä‚r„Å9œAl&’ø]ö'¨-˜\À,¤c—x½ÜŽ`êÕ s0 nå¹Û =œî=Cê¿bq䙣Ò1 S¥e¬”ö‰K•vI'ì’ö‡mrÿ/)Tžòì8R`ßû¾‡¹…5¼ízfÊendstream endobj 201 0 obj << /Filter /FlateDecode /Length 155 >> stream xÚ31Ö3µT0P0bcc3…C®B.ßÄ1’s¹œ<¹ôÃL ¹ô=€¢\úž¾ %E¥©\úNÎ @Q…h ÊX.O…úòþÿ¨ÿ$þÿ$ÿÿÏÀPÿD2þÿ`ß$ȃÈù@’Hþ“Èô&ëÿ?:ñÿÿÿÿ7 “q.WO®@.‹£llendstream endobj 202 0 obj << /Filter /FlateDecode /Length 183 >> stream xÚ}Ž=‚@…‡XLÃvNàBL¬H·0ÑÊÂX©¥…F[Ù£íQ8¥…a†‚Îb^2ï}¹™KJ)*%³ K†w4÷Ò‹ó +‹ú@¦@½á)j»¥çãuE]íV”¡®é˜QzB[Ä_P¥ ¢:˜…ðá9o’.êAµ@9(¡dq%Ÿ»7@â'a¸ý/=ßµÓGÃ.^¬ÄTyhÆ ‰”pÁ A!\\[Üã>P:endstream endobj 203 0 obj << /Filter /FlateDecode /Length 200 >> stream xÚ¥= Â@…g°¦ñ™ èfI"¦üSZYˆ•ZZ(ښͣä[.(w“€–‚S|Åæ½7q4HRYs_8Ö ù éL‘WCNâvµ?Ñ$#µá(%µp:©lÉ×ËíHj²š²&5ã­æpGÙŒs” V,ÈS*7;(& A‰]ƒt,¾à -À•ÇýGTÎÀµ@Û8×=ÓF–>¼®á ¡¯†¾$Úñ¼Ë_È¥÷ªùF­Ñ<£5½Þ¯ìendstream endobj 204 0 obj << /Filter /FlateDecode /Length 158 >> stream xÚ­É1 Â@ПJø—ðŸÀÝu£Äj!Fp A+ ±RKAEëõh9J¼AÊÁqc!Ú[̃™Ií`4-ØԈËÞð™m»îjw쎜{Vk±«y\Yù…\/·«|9ê½e_Hx’+5ÐCôÑ8´äÂ#‚$ÒRC®¡¹šˆ\õ¡ì¸ÿBÿ"¨¿xo<ó¼âõõIwendstream endobj 205 0 obj << /Filter /FlateDecode /Length 185 >> stream xÚMË1 Â@ЋÀ4!s7q5Æ@T0… •…X©¥EÁÊÍÑrr‹ñ,,Þ2³óÿÔŽg©D’€MÅ&rŽùÆv‚=ê×þpºr^°Ù‹°Yã—M±‘Çýya“o³YÊ!–èÈÅRÈùr¨êGB®ù7 }Kïÿ´D#"×eZS¨¡W¡ÿ!§ˆ("P÷B Ca÷£}­¢9ª6A«ª=> stream xÚ31Ö3µT0P0bc 3…C®B.cS ßÄI$çr9yré‡+›ré{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]ä€Àž¢þÿÿÿ @ü¿A€ÅH2…‚ù`€hàÀ ß €AþAý~ [@óÿ Œÿ€LxÀÀåêÉÈþ:B„endstream endobj 207 0 obj << /Filter /FlateDecode /Length 148 >> stream xÚ31Ö3µT0P0bcc3…C®B.ßÄ1’s¹œ<¹ôÃL ¹ô=€¢\úž¾ %E¥©\úNÎ @Q…h ÊX.O…úÌÿþÿ`ÿ…¬ÿÁ $0ð()DÚÉ? õþÜÆðêdƒ=˜”ÿH2ÿcÿÏÀåêÉÈÄ£d>endstream endobj 208 0 obj << /Filter /FlateDecode /Length 186 >> stream xÚ5Í= Â0ÀñW:oéúN`ú¥ÐÅB­`A'qRGE7©…^Ì­×è êØ¡4¾Ø”É? ‰Âé,&žQ@áœÎ>Þ0ÔÍÓ[}pºb*Qì)ŒQ¬¹¢zÜŸévI>ŠŒ>yG”½•¥:ÅôJ•^ý›]ƒS |Á-,ZHZX:È^<rœ[CÂ×Á准’qÊz¤b&Õg¤aì¦QŒ¥À½†¿À•Äþ$›Lãendstream endobj 209 0 obj << /Filter /FlateDecode /Length 174 >> stream xÚ31Ö3µT0P0bcc3…C®B.ßÄ1’s¹œ<¹ôÃL ¹ô=€¢\úž¾ %E¥©\úNÎ @Q…h ÊX.O…úÿ `Ôðÿ?ÃÙaCÄÙ00~ @2?ÀDv`²N2~¨+þߎ ¿#Èß``’ ?Ÿ‡“¿¿G#«¾g``¨?øA6 Hû†@Rž¡†ËÕ“+ Ém¢endstream endobj 210 0 obj << /Filter /FlateDecode /Length 202 >> stream xÚEŒ; ÂPEoH!Lãœø£‚UÀ˜BÐÊB¬ÔÒBÑN!…Û²³t î@Ë!ãL@,ÞaæÌ»·µ{¸£¯Ûá¨ÏÛ™ lµÃfOÄܒ£¹©ZrÉŒOÇóŽÜp>âܘW!kJÆ‹/ŸLnRüQ;”H¡(Ô+€Øû­Üp{Íçh¼¯€/ O ¨.†êçê«oŸk> ¹¶´¬4¶ú…¥4Wè¬&F&ž”™äRŠ¢ª§ÚÑ$¡}¨xY&endstream endobj 211 0 obj << /Filter /FlateDecode /Length 237 >> stream xÚEαjÃ@ àßdˆ‚ÁzöìØ)ÍCšB=Ò©CÉ”dÌÐÒnÆvÈÐ×jé‹:tÍ&É=Žûîî$%ñÍpÄ!ø:ºãdÀñ-¯"z¥X£!—Znh’‘yæxDæQâd²¿¿}¬ÉLæ÷‘™òKÄႲ)—Ö³µ[{²v§È­õöð+ïðOPy5À‘ Æ@®²äÌ©¤äUíð·-Gÿ[ùÙ;z¿Êßàµ[*ö‚l”ãŽBÉ;¥v\ɼHer”;åSú¾H‹R §Z88 ¾~íKôÑßÍa{endstream endobj 212 0 obj << /Filter /FlateDecode /Length 117 >> stream xÚ31Ö3µT0P°T02W06U05RH1ä*ä22 ()°Lr.—“'—~8P€KßLzú*”•¦ré;8+ré»(D*Äryº(Ø0È1Ôá†úl¸ž;¬c°ÇŠí Èl ärõä äÇ\+ßendstream endobj 213 0 obj << /Filter /FlateDecode /Length 116 >> stream xÚ31Ö3µT0P0V0S01T01QH1ä*ä26ŠE-Àɹ\Nž\úá Ææ\ú@Q.}O_…’¢ÒT.}§gC.}…hCƒX.O† øA-Âþÿÿÿ€øÿ4‚Šv@  Ã¹\=¹¹emH™endstream endobj 214 0 obj << /Filter /FlateDecode /Length 136 >> stream xÚ31Ö3µT0P04UÐ54R0² R ¹ ¹ M€Â FÆ0¹ä\.'O.ýpC.} —¾§¯BIQi*—¾S€³‚!—¾‹B´¡‚A,—§‹ƒüûõ?€ðÚÿ‘ÿÃÿ‡áÆŒ?˜?°PààP—«'W ŸÒ,5endstream endobj 215 0 obj << /Filter /FlateDecode /Length 103 >> stream xÚ31Ö3µT0P0W04S06W02TH1ä*ä2 (˜B$’s¹œ<¹ôÃŒ,¹ô=L¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]êÿÿÿðÿÿÿ0 âs¹zrrå$~endstream endobj 216 0 obj << /Filter /FlateDecode /Length 99 >> stream xÚ31Ö3µT0P04F †† )†\…\@Ú$l‘IÎåròäÒ pé{€IO_…’¢ÒT.}§g ßE!¨'–ËÓEAžÁ¾¡þÀÿ0XÀ¾AžËÕ“+ ‰;“endstream endobj 217 0 obj << /Filter /FlateDecode /Length 157 >> stream xÚ31Ö3µT0P0UÐ5W0¶T0µPH1ä*ä26 (˜™Bd’s¹œ<¹ôÃŒ¹ô=€Â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. ì@ÌÀß#äÁHÌD؈:Q'þ€ˆ@Ì&> f0ñd˜82î>3Ñ dfâ ¸™¢Dp¹zrr@Ä:Õendstream endobj 218 0 obj << /Filter /FlateDecode /Length 203 >> stream xÚ= Â@…_°L“#8ÐMLRØðL!he!Vji¡h'š£å({„”!qœ-–6ß²ó`ö}›ÄÃtÌ!'<ˆ8 9ñ1¢ Å© å»äp¦iNfËqJf)c2ùŠo×û‰Ìt=ãˆÌœw‡{ÊçŒÞ@в¶^m ´­…ו„û•W÷¨”x:ô däTLdOñ”€_Öû'¤X`–*ºw]!WÒ¢qµ½z¨‘º9KõUóïÐ"§ }}dÃendstream endobj 219 0 obj << /Filter /FlateDecode /Length 141 >> stream xÚ31Ö3µT0Pac S#…C®B.# ßÄI$çr9yré‡+Ypé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]Øø XŠí¸ˆÿ7001;×ñ¾Äójä‘Ô®ÿÿÿÁÿÿÿ?À0ˆÏåêÉÈÅFJÜendstream endobj 220 0 obj << /Filter /FlateDecode /Length 222 >> stream xÚe1N1Eÿ*…¥i|„Ì ð.›-V Ab $¨(U ¤A›Ý£ù(>BÊÑóÓ„,?kÆÿWíEw¥µ®¸kí.õµ‘i;¯O%/¶ï²$=iÛIºó®¤á^¿>¿ß$­n´‘´ÑçFë6Šx0ڄʬ ˜íÍŽX⌾T†~ÂèËϰœfGvÄlŽâgØ×ÎOÈ —˜À<|žðHTGÇ‚+î©¥µ§Ë‡D5ÿWôTŒL3ü*Ù¡¸=·‡2šÿÐþ‚½,·ƒ<Ê8hñendstream endobj 221 0 obj << /Filter /FlateDecode /Length 226 >> stream xÚEнNÄ0 ðÿé†J^òñ @ZÚHH•îC¢L ˆ @°Ò>ZåáÆ§úl·ÀŸDZãTåe}Í9W|Qp•s}ů}PYkP·å|òòN›–Ò#—5¥[ SjïøëóûÒæ~Ë¥?œ?S»c„€Nz¬DÈDF‘â˜Mˆ&4=:4§WâLì• «hLºVÆÚšÄQ—5Aýâ1;Í,òw×Ki üs°Ä™ãÇ…à Îdw;«Ò-¯—y"ŸÍ§\Û¼>¹ÿí[z 3áVc4endstream endobj 222 0 obj << /Filter /FlateDecode /Length 181 >> stream xÚ•Ï=‚@à!$Ópæ.¿ bâ&ZY+µ´Ðh £pJŠëL±hë$ó%ó^5YºÌ Š(áÍʺÄxÇT²HN)Î7¬4ª¥ª §¨ô–ž×Uµ[QŒª¦cLÑ uMþÁÄ„B9ÓÌÆ›‹‘ñGÐ3aç(if ãMŽÅ( Œ/½#ì˜`Ëc„÷—V2öOZË¿Z;ý®5îñÜþtýendstream endobj 223 0 obj << /Filter /FlateDecode /Length 207 >> stream xÚ¥Î= Â@à‹À4{„Ìt³&)!à˜BÐÊB¬ÔÒBÑÖ,x¯’£xË’qFEÐÖæƒÙ}o“¸v)¢„ZŽ’ˆRGk‡;ŒSʱóÚ¬¶ØÏÑÎ)NÑŽeŒ6ŸÐaÜ íOäÐiá(Zb>$Ã\CÈÌßÈÌüǹ.ì5ïªTʺ)ñ7¢ ½œùPÐ €ù\è)'…ߘ'å-,e›ù$9óÒ‘• i«ÌŒþ `¾AƒYÒ Öš G9Îð-²c—endstream endobj 224 0 obj << /Filter /FlateDecode /Length 241 >> stream xÚmŽ1NÄ0E”"Ò4¹ž @’T––E"Th+ ¤Ø´±æ£ø)S„ ãÍ“ü=3ÿuíEÅ5w|ÞpWsÉ/ ©í5ÔgûýóüF»ªGn{ªn5¦j¸ã÷ÓÇ+U»ûkn¨ÚóSÃõ†=6™Ì@! `dÕHpÑë³Îç³¢˜¢¢Œ°0g0º°¿p ã†\ÏF<'Ÿ"D´MÖbLz[‚Îë€õZj6]*7DEñã?°?(£j”A…LP5ãË GÕÔ¡˜µ(O•Y*GÒ@BRƒæ ›è þ5pIendstream endobj 225 0 obj << /Filter /FlateDecode /Length 183 >> stream xڕͽ Â0à+Â-¾Þ hÓ NB­`A'qRGEÁÉöÑú(}„ޤzW©Eqñ _Èå~3°#ò) ¾¦À';¤Æ#ËI~š×Ïö€¡Cµ"cQÍ8ÊÍé|ºìQ…‹ iT­5ùt]ãÁ‘ Ù'é`œ010%p1ßà ­‚içBÆt*R¦—€t 2;nB)¼û½¢¦•×4㪙_T+~Ѭý‹.œ:\âãM†endstream endobj 226 0 obj << /Filter /FlateDecode /Length 213 >> stream xÚ}O» Â@œ`q°M>!ûz‰I «€0… •…X©¥…¢­É§åSü„”Áõ²W؈p w»3s3Y:Ê'sÆÃ„³˜ó1ºPš»¡{¦~s8Ó´$»å4'»tc²åŠo×û‰ìt=ã„ìœw Ç{*ç Ó(¤Džˆ¼`D:„y#jAÔ BQ»SQ]9h@ø”¢9…׆mðÆ 3/"-PIÿoÓ™n•§ ÕªË×ÙñÍó?|ÉR3{¿¾‡6ÒnÚRûúæ}Z”´¡ëånendstream endobj 227 0 obj << /Filter /FlateDecode /Length 245 >> stream xÚm1NÄ@ EmÉÍa|HB’b«‘–E"Tˆj¡¤`í&G›ŽkøéHÅü 4ÒÓØ£ñnêóv+¥4rVISJ{!O¿rÝ¢‰²þ~9¼ð®ãâ^ê–‹k´¹ènäíøþÌÅîöR*.öòPIùÈÝ^(Ÿ‰(`)3SÚ˜èç¹1›É+-:%ô8p'?, ó\üú‡%ᔀ^Ê‚úH½"È4Ÿ)ÂM¡ñ©úP¨9%7¹Hiè/üŠ!©¯ Gó«dLºâ!n&{„ÁÈë•|ÚÒöÍ J™MøÞc_u|Ç_ž!r·endstream endobj 228 0 obj << /Filter /FlateDecode /Length 107 >> stream xÚ31Ö3µT0P04F Æf )†\…\††@¾ˆ –IÎåròäÒW04äÒ÷ sé{ú*”•¦ré;8+E]¢zb¹<]äìêüƒõìäðì:¸\=¹¹{-=endstream endobj 229 0 obj << /Filter /FlateDecode /Length 184 >> stream xÚmÉ=‚` à’.žÀ߉1‘ÁD'㤎]…Ä‹‘8p n #¡~ $(}úö­ëL<ŸL²å¸6y6í-<¡Óvf{¶ÝÃÅšÅ\¶(â]Î׊p9% ED‹Ì-Æ4 ð•Óžgö&ëÉ{ô¼øâ!1îå¥qƒú?µ\ÀÜ P˜ùCÁµ#ýA“dZz–4Àu ×,iºÔu8‹q…/ÂaoMendstream endobj 230 0 obj << /Filter /FlateDecode /Length 190 >> stream xÚ}±‚0†K:˜ÜÂ#pO`iÀ‰1±ƒ‰NÆI4º æ£ðõ®ØîKÿëÝùÓd¹Ê0FM•j\i¼jx@½˜%\îPPGL2P[ê‚2;|=ß7PÅ~¤K<ÑäL‰•s ´Â9×óËy|¥9#l K#‚vÓœ_ó[¹Z²½äC„N Ò_‹¦C£•èFôŒÏ,úa8è—‘[NÔøXT®®þQ­€ü÷âŠÝendstream endobj 231 0 obj << /Filter /FlateDecode /Length 147 >> stream xÚ31Ö3µT0P0b#SC…C®B.c˜ˆ ’HÎåròäÒW0¶äÒ÷Šré{ú*”•¦ré;8+ù. ц ±\ž. õÿÿÿÿÄÿ Øæ Œ„ † ‚ƒ`|$€lthv›bˆ)ØŒ‡6 ¢Žä£ÿQ Ø.WO®@.ÌŒ‡rendstream endobj 232 0 obj << /Filter /FlateDecode /Length 145 >> stream xÚ31Ö3µT0P0bCSC…C®B.c ßÄI$çr9yré‡+[pé{E¹ô=}JŠJS¹ôœ€|…hCƒX.O…úÿÿÿÿâÿHìó"ˆ Á€ƒø$`@±ØCLÁmQDýÿ ÿ!Ä( ,ÆåêÉÈæxôendstream endobj 233 0 obj << /Filter /FlateDecode /Length 108 >> stream xÚ31Ö3µT0P0bc SC…C®B.crAɹ\Nž\úá Æ\ú@Q.}O_…’¢ÒT.}§g ßE!ÚPÁ –ËÓE¡þÿÿÿÿÿÿà >ÿ†Áޱ¹›ËÕ“+ H¨X~endstream endobj 234 0 obj << /Filter /FlateDecode /Length 123 >> stream xÚ31Ö3µT0P0bCSC…C®B.cs ßÄI$çr9yré‡+›sé{E¹ô=}JŠJS¹ôœ€|…hCƒX.O…úÿþÿÿ€L€Å˜ŒÁN|Œ?ˆ êÿÿÿÿã?*ûÀåêÉÈé f’endstream endobj 235 0 obj << /Filter /FlateDecode /Length 174 >> stream xÚ31Ö3µT0P0bSC…C®B.cs ÌI$çr9yré‡+›sé{E¹ô=}JŠJS¹ôœ€|…hCƒX.O…úÿÿ0üÿÿÿˆø"þ3Åþ70`øH؃þ@‚ýŒ`?€#^¬„ùŠ^°Q`Cƃ-YÉ ²œä fƒ€² Ô$êÿ700€ F"Àb\®ž\\æ„wNendstream endobj 236 0 obj << /Filter /FlateDecode /Length 197 >> stream xڕСÂ0à›jrfÐ{Ø::"#a‚‚ ‰€€îÞ e0‰XvtmC‚ùÄßöîOõh˜Ž)¦„Š´¦TÑ^á µ²aLiâOvGÌ ŒÖ¤FscT,èr¾0Ê–S²iNûf‹EN†`æÒY9†»Q‰¶3p‚qNÊNÙ3¼ÿ¶ßO0ïÉn‹ßè¶ ×ÄZ¿’J4½&}þ5tÊò›¦y+™A²ý ½-ؼ+Ô€³Wø2>z endstream endobj 237 0 obj << /Filter /FlateDecode /Length 236 >> stream xÚu1NÄ@ E½Ú"’›a|˜„$ÕHË"‘ * D”H»$*â£å\!GØ2HQÌw€‰æÉãÿmÿ©«ãæT ©å¨”ºæDJÞsÕ ‰gõ­Ü?ñ¦åx#UÃñmŽí¥¼<¿>rÜ\IÉq+·¥wÜn…˜™åº2ûÐÌÌ4w„C0Mý€¤LúNÔéL”túAø ¨9ÁçÒ„Éa=tC¹6”8y€ÇF¢Ì›Ôa¥OÚ2éý/òaÁ<Ãô&ÄØùE>oùš¿åxvendstream endobj 238 0 obj << /Filter /FlateDecode /Length 124 >> stream xÚ31Ö3µT0P0b#SC…C®B.c˜ˆ ’HÎåròäÒW0¶äÒ÷Šré{ú*”•¦ré;8+ù. ц ±\ž. õÿÿÿÿÄÿÿ¡êêð@†H0 zÂþÿ(Qÿÿ—ËÕ“+ +òT¬endstream endobj 239 0 obj << /Filter /FlateDecode /Length 167 >> stream xÚÕË1‚@…áG(L¦áÌtYY +ÄD ­,Œ•ZZh´†£qŽ@IaGhôf'_ñϬ‹gÉ‚#}SËÎqbùléF.b27§+e™=»˜ÌZ3™bÃûóB&Û.Ù’Éù`9:R‘s)U*µH]JóíØý^‡¿w˜ŸøÂ¤Ôè¨%ÂH«´RQCôª/ê‰~ú´*hGo8‚˜endstream endobj 240 0 obj << /Filter /FlateDecode /Length 114 >> stream xÚ31Ö3µT0P04WÐ5W01T0µPH1ä*ä22Š(˜™B¥’s¹œ<¹ôÃŒŒ¹ô=€â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. õÿÿüÿÿ†þüa`üè?’›îçrõä ä—5ezendstream endobj 241 0 obj << /Filter /FlateDecode /Length 116 >> stream xÚ31Ö3µT0P0VÐ5W02W0µPH1ä*ä22 (˜™Bd’s¹œ<¹ôÃŒŒ¹ô=€Â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. õÿÿüÿÿ‚êÿÿc`¨ü¨æ`°›ÿp¹zrrléIendstream endobj 242 0 obj << /Filter /FlateDecode /Length 104 >> stream xÚ31Ö3µT0P0UеP0¶TÐ5RH1ä*ä26 (˜A$’s¹œ<¹ôÃŒ¹ô≠ô=}JŠJS¹ôœ ¹ô]¢  b¹<]êÿÿÿÏÄÿа—«'W *›endstream endobj 243 0 obj << /Filter /FlateDecode /Length 191 >> stream xÚmÌ= Â@à Óx„¸ ‰‚Õ‚?` A+ ±RK E[“›™£ä)S,;Îh%Xìûfæùh<¥” }å:exÅ\³T¿:8^pV¢ÝQ>E»’m¹¦ûíqF;ÛÌ)C» }FéËEÜ$ s­´àXBט^H”ȃ©ÁÃ@ž?|be¨®ŸàzY©E—ƒâÿðTZ_Õq×-`öRÅ!a~…ˆƒ„®K<.KÜâj/\endstream endobj 244 0 obj << /Filter /FlateDecode /Length 187 >> stream xÚŽ= Â@…g°¦ñ™˜„Ä"•#¸… •…X©¥…¢­ÉÑr”aË€!ãN;±˜æï½GÓY‡®âg!ŸBºR¤³@[]/”òw%ä¯Ü”|³æûíq&?Ý,ØõïÝåLƹ©¿+ðx•ƒ“À—´€"Ò¡@±y‰Rx Œ-¶0ª±éþ~Ð*ž?¢uîmÖ½rç!0±ƒe¥æ] ÔEÓ`ç%ÐÒЖÞ*Åszendstream endobj 245 0 obj << /Filter /FlateDecode /Length 182 >> stream xÚŽ1 Â@E¿¤¦Ik—9›°° Än!he!Vji¡h›äh%G°L2ΦÐÖ…}ðgÙ?of§óÇœêÅlS>'t#k5Ñ?œ®”;2{¶–ÌZ§d܆÷ç…L¾]rB¦àCÂñ‘\Á¤"iJzŒDˆÆ=á[5/”ÈjLAOåQ~Ñý‰ß¡@«B_ÕZ¯h4èÊJ—â5¡Î«µ^RMuZ9ÚѲuEJendstream endobj 246 0 obj << /Filter /FlateDecode /Length 198 >> stream xÚ31Ó34V0P0VÐ5T01Q0µPH1ä*ä21PASKˆLr.—“'—~¸‚‰—¾P˜KßÓW¡¤¨4•Kß)ÀYÁKßE!ÚPÁ –ËÓEÿó‚ÁþT‚zó !ÿHÔ±÷`øÁøþó†ú쀶¤ „|P±=˜i«‡u âÉDª)öph‘<„ÚkrF=ÈAï?0þ`<ÿŸ¡†½ÿ?ƒü?þÿ ì@‡s¹zrroXhIendstream endobj 247 0 obj << /Filter /FlateDecode /Length 189 >> stream xÚ]Î1 Â@Ð\˜B/ 8ÐM²(ÚЦ´²+µT´“èÑr”!åbI qáÁ23ü;èö9änÀ¶ÏvÈû€ÎdC)úlGUgw¤IBfÍ6$3—2™dÁ×Ëí@f²œr@&æm)‰Ú¸·2Ï©\^¡sϵ2¸Î÷¯HÅøQ‰RñþQÖOþø—Ö5ÉQÑJrµìhè M£íÂá„TårL¼@³„Vô½£@ endstream endobj 248 0 obj << /Filter /FlateDecode /Length 141 >> stream xÚ32Õ36W0P0bcSK…C®B.# ÌI$çr9yré‡+Ypé{E¹ô=}JŠJS¹ôœ ¹ô]¢*c¹<]ê˜ÿ70ð|À ßþ€ÁžÿCÿ`ÆÌ00ŠÿÿÿÇäè§3ÿa`¨ÿÿ޹\=¹¹¢&[endstream endobj 249 0 obj << /Filter /FlateDecode /Length 237 >> stream xÚ¿J1Æ¿00…ñ v^@³9ïäŠÃ…ó·´²+µT´[¸}´> stream xÚ31Ó34V0P0bS …C®B.C ßÄI$çr9yré‡+˜ré{E¹ô=}JŠJS¹ôœ€¢. Ñ@-±\ž. Ì€à?É&™iN‚ìaþ`ÿD~°’È700nà?ÀÀüDþ“ØÀÈä‡$Ù€‚ëÿÿƒÿÿ7 “\®ž\\yendstream endobj 251 0 obj << /Filter /FlateDecode /Length 122 >> stream xÚ32Ö30W0P0aCS3…C®B.C ßÄI$çr9yré‡+Zpé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]˜ø0È@A@ 8~Àüá? ±q©ŽØ0üÿ‚¸\=¹¹(CE`endstream endobj 252 0 obj << /Filter /FlateDecode /Length 150 >> stream xÚ32Õ36W0PÐ5QÐ54W0´P05SH1ä*ä22 (˜Ãä’s¹œ<¹ôÃŒ ¹ô=€\úž¾ %E¥©\úNÎ @Q…h ®X.OÆ ìø   P?`üÁð†Ø€¸ôE6Œ?êügüðŸ‚üc?PÃ~À†Ÿÿó.WO®@.ÿ§Wõendstream endobj 253 0 obj << /Filter /FlateDecode /Length 196 >> stream xÚµÍ1 Â@Еir3'p.#˜BÐÊB¬ÔRPQ°ÍÑr±0EÈ:? êdÙ³3ó7èuÂ.{Œô¸òʧãH‰ÆrCqJzÆGz$¯¤Ó1öÇ5éx2`ŸtÂsŸ½¥ […RÊüâë?´LõºæÝ3Ø‚ærÁÊkm‚¨„;xÔÂ3êH†Kv¤Ø@%¯â.êýoÔ nn—**ŒÉù@Ô¦ôDrendstream endobj 254 0 obj << /Filter /FlateDecode /Length 108 >> stream xÚ32Ö30W0P0aCS …C®B.C ßÄI$çr9yré‡+Zpé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]˜?0ü‡!þ ̃±ÿ`øÿÿq¹zrrÆ‚Q.endstream endobj 255 0 obj << /Filter /FlateDecode /Length 177 >> stream xÚ3³Ô3R0Pa3scs…C®B.3 ßÄI$çr9yré‡+˜™pé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]˜?ð`Àðÿƒý†ú@úƒ=ãƒ:†ÿÈ77Ø3ðnà?Î ßÀüÿˆþÇÀDÿa`ÿÁÀNÿ``ÿ€þÀÀþ`Ð O€âÿÿƒÿÿ7ÿÿNs¹zrr#߈endstream endobj 256 0 obj << /Filter /FlateDecode /Length 147 >> stream xÚ31Ó34V0P0bcs…C®B.C ßÄI$çr9yré‡+˜ré{E¹ô=}JŠJS¹ôœ€¢. Ñ@-±\ž. Ìø?00üÿ`ÿD~°’È70ðnà?ÀÀüDþ“ØÀÈä‡$Ù0½ñÿÿÁÿÿI.WO®@.‡e%endstream endobj 257 0 obj << /Filter /FlateDecode /Length 188 >> stream xÚŽ1‚@E¿¡ ™†#0Ðeƒ6 &na¢•…±RK v9Gá”Tâd)H¬ÌN^fþîþù‘žÌ¦ð”Çš£€Ã9Ÿ5Ý(ŒE”qÑßœ®”R{cRk‘I™ ?îÏ ©l»dM*çƒæàH&g8^W‰S­œQƒdHàVðá•R¾ ò!J*¨- Ài~ nNû/†ooñkg»Íîõ$AéÖHåŠ> éáwlzZÚÑIKÚendstream endobj 258 0 obj << /Filter /FlateDecode /Length 196 >> stream xÚα Â@ àH†B¡y½ž­uj;:9ˆ“::(ºÚ>Z¥p"ØŠç]qÐQ |CB’?Šû2ä€Ü“1G!‡#ÞI:R°«aøm”d$V$f¶O"›óùtÙ“H–$R^K6”¥ŒÊ¯À¨\ƒ¹UW0÷Â/¼º%>Á«°T¨5*è´4hy~“ÿÌ÷ö²¥ý¦Ýß> stream xÚ31Ö³0R0P0VÐ54S01Q06WH1ä*ä21PASc¨Tr.—“'—~¸‚‰—¾PœKßÓW¡¤¨4•Kß)ÀYÁKßE!ÚPÁ –ËÓEùÃùŒêØ0üa<|€ùÃãìÊð?`0?À€Áþ€> stream xÚ36Ò35R0PacCcs…C®B.# ßÄI$çr9yré‡+Ypé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]ØÈ3üPàÿÃÇþ?nÿÀÿœýó3 ~Äo˜0ÿah`þÁÀ€‚?P³Íüÿÿs¹zrrjÙF„endstream endobj 261 0 obj << /Filter /FlateDecode /Length 195 >> stream xÚ=αJÄ@à¶X˜fßÀÌ x{›`TñSwÕ‡•Z * Wî£í£ÄÊ6`“"8Î%GŠ™ùÿfŠ|q~ÆK.ø4p¡ó‚½R^j¨çåÔ<> stream xÚ36Ò3²T0P0TÐ5T0²P05TH1ä*ä22 (˜Ad’s¹œ<¹ôÌ̸ô=€Â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž.  Ø W á Œ@Ì Äì@,ÿÿ?Ã(f„ÊQ „þ0‚pC sC3ƒ=;ÿ?°f.WO®@.uH–endstream endobj 263 0 obj << /Filter /FlateDecode /Length 153 >> stream xÚ31Ó34V0P0RÐ5T01Q06WH1ä*ä21 ([@d’s¹œ<¹ôÃL ¹ô=€Â\úž¾ %E¥©\úNÎ @Q…h žX.Oæ ìþ`üJò`À‘p’ƒºBþ`°ÀÀðƒ¡üÆçÿì™Iùÿí@’ùÐ.WO®@.1cendstream endobj 264 0 obj << /Filter /FlateDecode /Length 183 >> stream xÚU̱ ‚PÆñ#‘k[çêªWJ'Á rjjˆ ¨Æ†¢¶ˆûh>Š`›Ph—º—jù ÿ¾@ BŸ\ò©ïQà“ÒÎÃ#ŠHE—Äè³l˜dÈ—$"äS•‘g3:Ÿ.{äÉ|Lò”V¹kÌRj×_œ œÒ.Á.X ,g0i)à <¡¥©¡pƒ¶&†®A†=éjœ|c(v‘kØ]þb=ÀÐ(Ô¿áúO¨ÁI† |F£?êendstream endobj 265 0 obj << /Filter /FlateDecode /Length 233 >> stream xÚUÎ=KÃPÅñs Xx³v(æùzËíËb ­`A' ÖQ|A7©‘|±€Ð~Lïx‡`¼7UÓN?8gù«áá°Ï!ñAÄjÀÝÏ"z$¥ìr·¿~nîh”¼d¥HžÚ™drÆÏO/·$GçcŽHNø*âðš’ WUPñ÷6¾Aß´4æðŠ5¹§q ‘þ" bxØ%âtÇq¿Á_ù®cùGˆÅ²h;²š÷L€ Ëtè5Â<þfúOk…2·|âµÁ+ñ–ZlECÝdÑ ±ï(°ç˜ÂÑIBô¥Y_™endstream endobj 266 0 obj << /Filter /FlateDecode /Length 210 >> stream xÚMν Â@ ð)(¡«ƒÐ> stream xÚUÎÁjÂ@àYi® Î èn²Zõ$¨sÚSE¨GÁ½‰æÑöQ|„x ‰³²Iéå;üÃüü=ÝF¤(¢N8 ^DúÖ!þ qª¨¯ÝiµÅIŒò‹ôåœs”ñ‚ö¿‡ ÊÉÇ”B”3úI-1žQY¦ãâàAægà//7ˆœŽ4gËZŽvª*Ì 0‰Ã¿˜Š+ã]S‡¸CEÉ@QsüϰFÕì,IqSn/¼'¶’gCþbŸ^m‘mjg`ç1øã'>ÚŸKøendstream endobj 268 0 obj << /Filter /FlateDecode /Length 183 >> stream xÚ%Î1 Â@„á‘@„‡$|'0‰+AA¢‚)­,D¨¥ ¢æQ<‚eŠ`œÅ_ìì·°&î# µÇL_M¬‡H.bìÚ£½ØŸ$I%ب‰$Xp• ]êíz?J¬¦Êu¦[>ÙI:ÓIU•uO§Ã)Fh~ðß!;£ó:còÌÛዬQÖ‘‚ôŸÿ)HÿåpIëH]R·YÀ#õH[¤mé(œ²âl2Oe-?uàC endstream endobj 269 0 obj << /Filter /FlateDecode /Length 175 >> stream xÚ3±Ð31Q0P0bScSK…C®B.SßÄ1’s¹œ<¹ôÃL ¹ô=€¢\úž¾ %E¥©\úNÎ @Q…h ÊX.Oþ êÿ³ÿg``üÁ~¿ùûÆÿüäØÿÉ?`°gàÿ¤êàÔ õN}`o`üÁÀþ¤›™ÚÔøFÑ¢¢˜ÿ0°ÿÿƒÿÿ? Q\®ž\\à  endstream endobj 270 0 obj << /Filter /FlateDecode /Length 172 >> stream xÚ31Ó34V0P0bSK…C®B.# ßÄI$çr9yré‡+˜qé{E¹ô=}JŠJS¹ôœ ¹ô]¢*c¹<]ø0Aý? Áøƒ½ýãù† ö@CÿùA2þ€’@5@’±D‚!™dþÀðPI¸ùÌCdþÃÀþƒ¡þÿƒÿÿ “\®ž\\^åˆÓendstream endobj 271 0 obj << /Filter /FlateDecode /Length 154 >> stream xÚ31Ó34V0P0bSK…C®B.# ßÄI$çr9yré‡+˜qé{E¹ô=}JŠJS¹ôœ ¹ô]¢*c¹<]øÿ0AýÿÆÌذIù~ iÏ"ëÈ?P¨†ñ3õÈÿ@€JR×|Z“ÌÀ0ù Çÿÿ@&¹\=¹¹)“ endstream endobj 272 0 obj << /Filter /FlateDecode /Length 109 >> stream xÚ32Ö30W0PaCs3…C®B.K ×ĉ'çr9yré‡+Xré{¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]dêþ7 ÂzlÐ+”Á Ѫ-õ@>—«'W Êî/äendstream endobj 273 0 obj << /Filter /FlateDecode /Length 122 >> stream xÚ31Ô35R0P°T0²T06V0µTH1ä*ä22 (Ce’s¹œ<¹ôÃŒŒ¹ô=€Â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. 5 5ÿþýg„" Õ1ü*Êl*,,0‘ƒ—«'W /¨67endstream endobj 274 0 obj << /Filter /FlateDecode /Length 130 >> stream xÚ-ɱ Â0…á gð 2œ'0¹-¥™k3:9ˆ TGAEçæÑòfÚ¢|Ûÿ—ÕÒ7ôlXUÔÀ:ð¢x@='eý;ý m„;P=ÜfÌpqË×ó}…kw+*\Ç£ÒŸ;Zä“Fy2d›åÏd“L*R!s™ÉB¬¹ËY°ŽØã ,P#Œendstream endobj 275 0 obj << /Filter /FlateDecode /Length 189 >> stream xÚ1 Â@E°L¡70sÝì ’@°ˆÜBÐÊB„€ZZ( 9ZŽ’#XZ:IV›t«þ 3ïOÌØÄrÄ#²‰xjø¨éBºN%7nt8SjImYǤ–’“²+¾]ï'RézΚTÆ;ÍážlÆ@TðJô ø@ ðhxÁ«jze/¨ š]aöåÙáýÝ;¿íÇÎAdDÉ/ak+ÚÎ?i¶¥”T“‚RSÊ"§…¥ }G«@endstream endobj 276 0 obj << /Filter /FlateDecode /Length 188 >> stream xÚ1 Â@E¿¤L/ :ÐÍ®A"ˆEŒà‚Vb¥–‚Š‚…EŽ–£äÁÍ$±ÐNxÕÌgæý¡˜1‡qß„l">hº.§!Ǧ^íO”XRÖcR 7'e—|»Þ¤’ÕŒ5©”·šÃÙ”s Î@ t€h~//i¹ÝKxO`L®Ð“tIVãçßxÅ?üÞù¼¨>ö‡©(=C±uÚ•¿/ñ@ªÅRÓr•iniMoEËBsendstream endobj 277 0 obj << /Filter /FlateDecode /Length 105 >> stream xÚ33Ñ3µP0P0UÐ5S03P0±PH1ä*ä25 …M 2ɹ\Nž\úá@.}0éé«PRTšÊ¥ïà¬`È¥ï¢m¨`Ëåé¢ÀÀÀ`ÀC‰ú ÔÐô—«'W —á)Ðendstream endobj 278 0 obj << /Filter /FlateDecode /Length 131 >> stream xÚ-É1 Â@EÑ?^á ¦xЙ‰‰mŒà‚V"ÑRPÑ:³´Ù™&Nwo¾\ø’ž%红V\ó¦xA=y1žö:À¨n×w¸°ççý½ÃÕ‡ ®áYé/ ­tò‹½4è’M22ÉD³˜ÉT&2+•<å*ØñBÛ#´endstream endobj 279 0 obj << /Filter /FlateDecode /Length 94 >> stream xÚMÉ=@PEáþ®â®À¼™x¨ý$^!¡Rˆ ¥‚°{ äTß±4J2:*5¡Å4嬨`ö¢£ÿÆ´"žfšû¹@ò¶ BJJ7"”¼ï몀Ði ‹endstream endobj 280 0 obj << /Filter /FlateDecode /Length 94 >> stream xÚ32Ö30W0PaCsK…C®B.K Ïȉ&çr9yré‡+Xré{€O_…’¢ÒT.}§gC.}…hCƒX.O†z†ÿ 0XÏ ÃÀåêÉÈ[\wendstream endobj 281 0 obj << /Filter /FlateDecode /Length 153 >> stream xڅ̽AÅñ ɉ¨ŠóÌ—eëµSH¨"‘ ” ôÍ£xw³ÓN¦ø5çæþgvZ8œ8K¿àÜñbñ€·²–>žÎ7TzOo¡×²C‡ _Ï÷ºÚ.)k̓<j*¥zÑP ¢±‰R˜è.NÑO|[ƧÕmÈÜÏdSéL6•Îeé\6•NdV;üxÔ*Æendstream endobj 282 0 obj << /Filter /FlateDecode /Length 188 >> stream xÚµ1 Â@EH!L“#d. ›ÍºˆBŒ` A+ ±RK EÁBb޶GÉR¦R×l´6¯˜˜ÿþPtÌ+îǬƬ5$Ii;ŒXÜf¢$#±a¥I,ì˜D¶äëåv$‘¬f,I¤¼•í(K~ |[äj¿„W¢‚opGÏà ÀÄ!´—S‹¢E¦ /‹òèzù´ÌO¾6x+Ó¸YÛ~åÕÎÜuдñí…æ­éÂÕ`úendstream endobj 283 0 obj << /Filter /FlateDecode /Length 121 >> stream xÚ31Ô35R0P0bc3SS…C®B.# ßÄI$çr9yré‡+Ypé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]0001;Ëñÿ ÿaX*6T°ý†úÿÿ?À0—«'W ¾NÚendstream endobj 284 0 obj << /Filter /FlateDecode /Length 228 >> stream xÚmαJÄ@ÆñoÙ"0M^ป'p÷WóSZYˆ ¨¥ ¢`eòh>JáÊ+ŽŒóé5‚E~°;ÿY²¬šc­té_^iÓèC-/’³Ÿ+9¸’u'éZs–tî·’º }{}”´¾<ÕZÒFoj­n¥Û(Ê-€~‚Ù€8¶#J^ÎQì0CÜc…0áùîÈDÌ_úŸžÓÁïø:ßsöNüaçü™r$_΂[-> ³À,°ˆ, %‡s„'äƒlÏ"³ÈÌñ¥™aAZÒ›M°¿ÈY'Wò TŸc|endstream endobj 285 0 obj << /Filter /FlateDecode /Length 235 >> stream xÚuÐ1NÄ0ЉRXšß`3', ZiY$R AE¨€ ´ØGóQr„”[¬0¼„‰"OÊŒóÇ“ãîÈ/¥•^—ÒŸ‰÷òØñ+÷ÅVüɾóðÌëÝ­ôžÝ%Êì†+yûxb·¾>—ŽÝFî:iïyØ™-­2È9QµµÕ EëPõE6‚f¤LÍôV»&‘ÆàðÌÔb&e6‚€§Ñf“õÕŽó‘òY (yâ/ifU ý°Å_ cBüÔ¨M>Õ‹ý‚¸Ÿ™°y¥ÿ€‚޵¸2_ |ÃßÇ›jhendstream endobj 286 0 obj << /Filter /FlateDecode /Length 188 >> stream xڕν Â@ ð+ At-(˜'ð®¶µkotr¡P?ÁQðÅ_ÄÇè èý‹­³ù‘äIàõÃ+FŠÃ!¯=Ú“™º,ñ‘o)Ñ$ìG$'¦KROùt8oH&³{$S^z¬V¤SBĢ⊠ØÀ©iƒèA«äf°1ë€h‚.p;»Áö`¯Z  \2ðoóŠß›ÿÂy™³54Ö4§òý`öendstream endobj 287 0 obj << /Filter /FlateDecode /Length 226 >> stream xÚ•Ï¿jAðïnaÜ ˆÎ ˜½s=b!j W¦J!‚`R ìnÍG¹G°´8ÜÌœEH:›_1;ödÏyŸSp¯ÏnÈyΟíÉ9)¦œ¿Ü_6[šd?Ø9²oR&[Ìùð}ü";YL9#;ãeÆéŠŠÇÀŒÇæÒºÂ„ÐpQ*Å+j .+xsº7á”xÄ•‘Íç–Üð‘\ƒ }µrÓþ† ”¿ø´•R þ/:tK­¬uéîNTc¨'Û¼‰Ä'ò¡jìiT”2ƒ®D¥×‚Þé+XÑendstream endobj 288 0 obj << /Filter /FlateDecode /Length 243 >> stream xÚm½JÄ@…OØ"p›¼ÁÎ}d³ƒÚXW0… •… j)¨hëäÑò(ó)S„ÏD…m>†{çüÜuuìVZj­G+­ÏÔ9}ªäMjÇa©îägóø"›VìÖNìÇbÛkýxÿ|»¹¹ÐJìVï+-¤Ý*Ðô@ P„sŽºø‚&¾³¾[ D>#E@ƒ¢Ç†r˜Iõ~2û> stream xڕα Â@ àHÁB}Ѽ€Þ]õ¤“…ª`A'uª(¸ÙGóQî|ƒšTZèàà‘û†?$w#3°i²ÔhdÈŽéhð‚CË!Çá·s8cœ ÚÐТZpŒ*YÒíz?¡ŠWS2¨f´5¤w˜ÌHŸP˜Qžç®ÎëY’ 4aÐ:B@à ¸Ç8 ‚—1¾ìn -¡SQ¼üRá-8­ð d“_Ñ®Ó+ÈJ¢_<ÿ!’¯tùâ<Á5~lúQ-endstream endobj 290 0 obj << /Filter /FlateDecode /Length 265 >> stream xÚMÁJÃ@Eo˜ÅÀ[8мÐ$A„ÒB­`B]¹WêÒ…¢ÐEÁù´ù” ;#Ç›*ÖÍyóî{wæÎquÔLµÔZ§ZŸjÓè}%OR7KmN~&w²l¥¸Öº‘₲í¥¾<¿>H±\Ÿi%ÅJo*-o¥])L OÄ[ À`;d1ëa¶°3X`LpÀM6{ä{xÖSÏœ˜°Hpžî|tO¥0£1l¹6Ì ùi4ÈþÓ,ìÀe3zŸÓáw™gRÒô¦SÅß@v伕+ùÿcåendstream endobj 291 0 obj << /Filter /FlateDecode /Length 237 >> stream xÚuÏ1NÄ0бRDšÆ@ò\œlÖBT––E"Tˆ ¶¤AKr®â›ì!eŠ3³ ˆšgiÿ_×'aE5t¼¢æŒB ÇŸ± 2¬(œÎ_žpÓ¢¿¥& ¿”1úöŠ^_Þvè7×çT£ßÒ]MÕ=¶[‚b—….'0SÉ2*(ÙŒ`&p ÞÁõBì!Ît ç¼àÒð_èÝ_èR¥c§Ø™%Éž 6{6Cñ!I¬cˆ“Ä)A×ô?€Ö«ÌÁ“ôXZ1IÁØËN+éOVë”ùÀäqY‰-Þàú m9endstream endobj 292 0 obj << /Filter /FlateDecode /Length 101 >> stream xÚ32Ö30W0PaCsc3…C®B.K ×ĉ'çr9yré‡+Xré{¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]dêþ7À`=ƒ 1S—«'W fp"¸endstream endobj 293 0 obj << /Filter /FlateDecode /Length 140 >> stream xÚ32Ö30W0P0WÐ54S0´P06SH1ä*ä24PAS#¨Tr.—“'—~¸‚¡—¾PœKßÓW¡¤¨4•Kß)ÀYÁKßE!ÚPÁ –ËÓEA†¡žá Ö3È0຀`ý™ PÈx€±±¹™¨Ò‚¡€!ËÕ“+ &,•endstream endobj 294 0 obj << /Filter /FlateDecode /Length 107 >> stream xÚ33Ñ3µP0P0U04T03P06TH1ä*ä25 (Ae’s¹œ<¹ôÃLM¸ô=€Â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. õÿAà˜üÿ‡Îj-Ô\®ž\\~,Üendstream endobj 295 0 obj << /Filter /FlateDecode /Length 185 >> stream xÚÌ1 Â@…á· LàœÀMŒÀBŒà‚Vb¥–‚Šv¢9ZŽ’#¤L!êÄ‚ºËWÌü0aÔíìs_„D¼hO¡Ïõ—±«-%–ôœCŸôX¶¤í„‡Ó†t2r@:å…œY’M¦€zÜáæ&óÐÎc¸¥§ÜÁ©ÎPÕêöøp±t¼¸e£] 0.â,$+IJ’“‹¬áâ­õ§_ÏFn_óoõ^:,Íè Àv;rendstream endobj 296 0 obj << /Filter /FlateDecode /Length 235 >> stream xÚmÐÁj1à é^=;OÐd-‘õ$¨…îAhO=”‚ÐöX¨ÒÞ„Í£í£ø{ô°˜N"¸Q6>fB&?™Nî'izàmf4Õô™ãáZûÒ||ã¢DõJÆ zâ.ªrM¿»¿/T‹ç%å¨Vô–“~ÇrEP@X×ìû8õ \²²IU{ó˜»ùÁ3ÌbÆYã¥1Ezôè$æ'i=SË©†LÂB„p6Pu Ž–8ç:R†£ ²Ž÷›[4ß9Þ²áéí…ÃŽ&ÎÈ&üZÚú'­ãXήÁÇ_ð%°m¼endstream endobj 297 0 obj << /Filter /FlateDecode /Length 209 >> stream xÚ•±‚0†0Üâ#pO`Amd3ALd0ÑÉÁ8©£ƒFgúh< ÀÈ@¨…«Ú´_®íÝýýe4fÐÜ,¹ ¹¤kˆ”µÓ„íÅåŽqŠâH2@±5§(Ò½žïŠx¿¦EB§‚3¦ i3 €5C8ZA–›À/:LÊ^ÕÁ­ûpšôXpžÛôkÚF¶­±bIF°Ü2ÕéqžËUœNÐC¨™E>ª_…ñ÷c‹ð+v·d¯ó¯åínÔâ&Å~VŸPendstream endobj 298 0 obj << /Filter /FlateDecode /Length 260 >> stream xڭѱJÄ@à? LaZ áæ4‰Üª[-œ'˜BÐÊB¬ÔRPÑÖÌ›ø*¾‰yË+Äuv²g!–Bà#“ÍÌî¿ÎïúnÙñÎ;ÇÎóMG4÷Zly¿›¾\ßÑ¢§æ‚çžš-SÓŸòÓãó-5‹³#Ö÷%_vÜ^Q¿d ˆRPDZT†¸R´öR ÊOÔµ þ@ù*˜(ÞAWEÁ],øR‚º˜IµRê5ú7P­Ñ&?”2oÆ(~#FLØàgÈü5=dF#ïzv¢L;mf–Ä&,—mXJ[°Ìa Þ#å }Rº:%e-vÁvS½•Ô=U:î霾šes–endstream endobj 299 0 obj << /Filter /FlateDecode /Length 194 >> stream xÚ33Ö31V0PaS Ss…C®B.S ßÄI$çr9yré‡+˜špé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þÁõBýc``üßD@.ƒý0ÅÿL1ÿSŒÀÃ?UBÙ7@¨`JJ=SüPêŠýê (<ö¡9ÅñP¯@=ómrüC%h˜ACž  !@ y`> stream xÚuб Â0Ð  ·ô¼/0­ µ‚Dª£ƒ¢³ý4?Å/iLsqˆð’»INÍÆª œ&vª)©9 ¼¢‹åý¶O4¬4Ê©åÊFQê5Ýo3Êj³ ­ioK¨k2ýè D˜ÒÀ€§dFLƤ1’(­C8^Qˆ€„ÉÆDð¹ïɰ|pÃ1ÆÛ½Ó.þ"bøÿyÒ€Œ)™gëºk¸×¿àRã?UŸ’~endstream endobj 301 0 obj << /Filter /FlateDecode /Length 166 >> stream xÚ35Ñ3R0P0bSCSs…C®B.s ßÄI$çr9yré‡+˜˜sé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þƒÀd’ñƒü†ÿ Œ`’ᘬ“6`R‰äÁAòI68ÉØ€L2`%™‘Hv0)"ÿÿG'!âP5Ⱥ‰ A€J$ãÿ `G@%¹\=¹¹Mÿx×endstream endobj 302 0 obj << /Filter /FlateDecode /Length 254 >> stream xڭѱJÄ@à?l˜&yM"&`µpž` A+ ±:--­7`ákMgé+ä ¼òŠãÖÙÍ& XšæKf’Íì¿]{Üt\ó)p×p{Æ =SŠu¨ÄÎæ‰V=U·ÜvT]j™ªþŠ__Þ©Z]Ÿ³>¯ù®áúžú5ð(ü6S¬ßü`À쑊-Ì— oÕ¶¸áÖë¥d‡ˆ¾¯ I¾Sòý03a‘™LlB".€¿Ñ!1ÍúOx½&ÂpcÄJÂ&ÆHù‹¸£…¸Û…˜„rI)¥ÌÜ” _ò,v0Ÿšõù{lØtéT–‰é¢§úî”Ûendstream endobj 303 0 obj << /Filter /FlateDecode /Length 125 >> stream xÚ33Ò3²P0P0bSKSs…C®B.SS ßÄI$çr9yré‡+˜šré{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þÿÿÏøÿÿ?TŠñó bü78) À¤¯s‘)hèb y.WO®@.!»¥7endstream endobj 304 0 obj << /Filter /FlateDecode /Length 106 >> stream xÚ3²Ô³´T0P0aKSs…C®B.#3 ßÄI$çr9yré‡+™qé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þÿÿ†€ˆ¡¾aècWüÅåêÉÈ3v\‚endstream endobj 305 0 obj << /Filter /FlateDecode /Length 165 >> stream xÚ31Ò33W0P0VÐ5R0¶T05WH1ä*ä26 (˜ZBd’s¹œ<¹ôÃŒM¹ô=€Â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. öÿÿ?@"äÿ000°ÿâ„=ˆ¨oÿ`#ø?0üoõ ü ä0X0È`a°o`àŠ2°7Ãñÿ qõ \®ž\\ŸÎ`¬endstream endobj 306 0 obj << /Filter /FlateDecode /Length 243 >> stream xÚ]ÑÍJÃ@ðYrÌ¡¾@ û&A[sjsìɃxj= QôjöÑò(y„=HÇíÌÿДeöDzÌÌ~,¯/•/üUŒeé7~_òG‹8"ÇÝ;¯Οãšó›GÿõùýÆùúéΗœoüKé‹Wn6^DÈÅ8×I êF"!¢:˜+2oa[8˜®7“`¦dÎ`+ØÂÁÔôhLM‹fp ˜&byiguf0«­~5Õ¿jŸþ©RrÀyd* îÕõSkÜ_ Ÿ¨ NÔÇ÷9LÕxoéá ÿádÔÿ™‹„sù¾á-ÿ5Š•Pendstream endobj 307 0 obj << /Filter /FlateDecode /Length 140 >> stream xÚ35Ô³T0P0bKSs…C®B.S ßÄI$çr9yré‡+˜˜ré{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þÿÿÿ€™dü€þ3 eR/i& 0È ò‚d“Ì`’LÊ?`üßÀðÿÁ@!¹\=¹¹Afl÷endstream endobj 308 0 obj << /Filter /FlateDecode /Length 244 >> stream xÚuÑ?kÂPð{<0p² Þ'ð%œÿ€ ur(Ávt°ÔÙ€«ê•]ÝÌGÈè|½¨X#yîøÝ=8. [~›< 8¢€:½û¸Ä°ËµW”ÅÇ|ýÕ”Â.ª1wQÅÏôõ¹ú@ÕjH¯>yoÉà瘣1 ýƒ¸ 8hFãx‡]Ê*ñ›1æ•øá8§¾yºØTBŸ¤,a P³ —À“M õ2Ü< œ fepÒˆ\$ÀIÂÖ5+zÛG4÷V¸Y5D NZ@fWðí¤'c´ÔÒÇýoÊÀQŒü¦Â!endstream endobj 309 0 obj << /Filter /FlateDecode /Length 243 >> stream xÚUпJÄ@ð/.0…ûfŸÀMNÖ?óSge!Vji¡hkRù\AKÁTÖ©$EØuwöŠM1üøf`Šï`¹·<’…Üw£¥>”w%=’Ö.>úÃí­jRWRkRçnKª¾ÏO/÷¤V›SY’ZËëR7T¯¥µ@fµm óÀ¦‡í¼ÅÏ0 à{d¾¦˜üۘÎ=õ4]LÕ3ùȦ€aÒ@b·´liº@ÏT|`Ä“MLjbËÀ¾Å4ŸLõ“ÿ1ÂÄdtFÀœW$®Gœ á*Ã.|ר™±ÕtIÿ6D†cendstream endobj 310 0 obj << /Filter /FlateDecode /Length 239 >> stream xÚ­‘±‚0†Ï8˜ÜÂ#ô^@D'ÔDŒ“::htGáxWÚœmš~éÝßöú_LÂyÒxJsNgoô(ò»ÌéŠIŠîžÂÝ5‡ÑM7ô¸?/è&Ûñ~IŸ¼#¦K¶ Cµ¥ Ô¼*x1F%¨À)dBœÃè ñ‘Š…¬ªA«ÑŸ8çEÅjGîU…Ò(ßNk¼ûÈ4ª,— ~ÐjÔ…}Á<ÛC¿2[|Žþfa?­-ÈÖžÆ3ë ñ“­oŒ×œÈ¾}°]Ñ=ÂUŠ;ü”K‰Éendstream endobj 311 0 obj << /Filter /FlateDecode /Length 167 >> stream xÚ35Ó35T0P0bS#Ss…C®B.K ßÄI$çr9yré‡+˜Xré{E¹ô=}JŠJS¹ôœ ¹ô]¢ÆÄryº(ü‚ ê„úÏÀÀø¿,ÊÀ ÿLñSÌ? Ô0Åø™adªT Y;ªÑPû ¶CÝuP7ÈÙÿÀÔˆ ƒ™….ĵ˜—«'W ŽK€¿endstream endobj 312 0 obj << /Filter /FlateDecode /Length 221 >> stream xڕѽ Â0ð–‚ì#x/ i*Uœ ~€ÄIí£ù(}„ŽJãÙK Í"&…äHrÿt¢F*ÄÇ8 q¢0šâYÁ È€f4ãÊé óäžê ×´ 2Ùàãþ¼€œo¨@.ñ 08B²D­uåÐ uf,HW§‚ ô¥lüfëç¬(ºz¥eõ§Ö~ûüæÞ¦Øô§¹_Qš@™ñÍëõ6Ò+L®6ŸñeålóZ¹šÿ«›v,X¿ÕKéP~ï‡ÞEÔºe¯Ö©úN=â’¹«vð™<›Âendstream endobj 313 0 obj << /Filter /FlateDecode /Length 256 >> stream xÚUϱNÄ0 à¿Ê)K¡~h{=îÄB¤ãè€Ó ˆ @°!ZÞ̉èF%Psw ²|Jì8¶ç‹Ãª¦’æt0£ùŒŽŽé®r®^j°¤EµËÜ>¸U㊠ÕKWœkØÍ=?½Ü»buyJz_ÓuEåkÖ?€ÆŒ!òÎf°l#>Ù3ZÎ;@Î'€ç7Àîx ïÉ&Œ&È–Nm9ƒR0—!¡G/aEïFD+E$½ÑŒµ²MX‰¿„^É>a‡-úÆü‘Mˆÿèû=¦×:upÇ´–¤-µiÞ}õèGŒˆA§Š^{s¦ywÖ¸+÷=Ÿ†#endstream endobj 314 0 obj << /Filter /FlateDecode /Length 150 >> stream xÚ3µÔ³4W0P0bSsJ1ä*ä2ñÁ" Fr.—“'—~¸‚©1—¾P”KßÓW¡¤¨4•Kß)ÀYÁKßE!ÚPÁ –ËÓEÁþ?<@£0ÿg`ÇÀøùA ˆbüP¢>€©T*L`¥€)‹`J+ŦF Åþ¿Hʃ‚ârõä äWÎr°endstream endobj 315 0 obj << /Filter /FlateDecode /Length 240 >> stream xÚmÐ1jÃ0Æñg1> stream xÚuÑ1KÄ0àW „ãºv8ÈûÚôÎb ç vtrá@ÿ…?'â)ΤC¹ø’£âMHøH^ÂK^Yì/Pá÷æX.°8ÄÛ\<ˆR¡ëÅÑvçæ^,k‘]b©DvJË"«ÏðéñùNdËócÌE¶Â«Õµ¨WhíÀ­í"kÿ·ä@öŒæ¤àmDâ$f~¤#; Hl ¿¥½8@£ÁŠwdFUšì¨%[pù¤^q(é`J7)¯Iˆ’›ÑMk¯T¢äRÙñRI JN%}¤½Ö<=“Dt2l¥IÜ©yÑÑ&ôFš:Uï; ôAš9ÉOŠ} ô5*¡¿­ºÿÄÿ‰°­ ÄœŒE'"'íEÑ<´¾¦®_g'µ¸ßÑÆ©Ñendstream endobj 317 0 obj << /Filter /FlateDecode /Length 231 >> stream xÚÍαJAàYÈÁL›"y÷.p1©b¯L•BAS¦P´Î=’p²2EÈ8»n@ô,†ofgÙ§“ËÉŒK®´¦×WüRÑ+ÕsË8ÆÅó– ¹5×sr·zJ®¹ã÷· ¹Åý5Wä–ü 7©Y²È ð~k%…öÒvìT²Z^{ÓcÝÙ³ ÷ÃâôU«o²CÕ0Ë–*¤ÅSTB¶‹ú`ζÑñÞ&‡í%‹ãE¶Ÿ´§QÒÈ0›b4è3¾Ýe}÷¿Íÿô"Ý_馡}Èl®endstream endobj 318 0 obj << /Filter /FlateDecode /Length 104 >> stream xÚ32Ö30W0P0WÐ52T02R03RH1ä*ä24Š(XC¥’s¹œ<¹ôà M¸ô=€â\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. ÿÿüÿó‡a0C ¹\=¹¹¶ hendstream endobj 319 0 obj << /Filter /FlateDecode /Length 102 >> stream xÚÍŽ;@PÕggÜwAí“x…„J!*” Âî%>‰EÈt3ÍØ00 •¾UjÌØrR¬Ð豆iø¥qAæ 5‚T‡¸šûv̬ɩ‚½Ò p¯ó:½_ó¢thq_þhendstream endobj 320 0 obj << /Filter /FlateDecode /Length 204 >> stream xÚmÌ; Â@à . ´Vf. ›´1àL!he!Vji¡(X›£å({„”Á8ë£—åø‡ùÝéÅQ—Úš’˜º}Úi<"ÏÈŃ÷f{ÀQ†jÅ{T3ŽQes:Ÿ.{T£Å˜4ª ­5EÌ&¡€º6äü¥…°%/_x÷/PAP02gøýÁ0Ò¦–yp&îî¬dBw›:Œ+0ðÁüâ}¨AT¾yóMÞ6Ó¢5lö–¢.Ë5²Ài†K|¤øT£endstream endobj 321 0 obj << /Filter /FlateDecode /Length 198 >> stream xÚ31Ó34V0P0RÐ5T01V0µPH1ä*ä21PASKˆLr.—“'—~¸‚‰—¾P˜KßÓW¡¤¨4•Kß)ÀYÁKßE!ÚPÁ –ËÓEùÃT‚D0S$ê00|`ÇÀü¹A¾ù;ÿæ ì˜ÿå˜00þ* àÄ?8Q"êI&êPMÊøbÛ½`Ëßœq ä ã ò Ìê˜þÿ:]þ—«'W ÈckAendstream endobj 322 0 obj << /Filter /FlateDecode /Length 182 >> stream xÚÎA ‚`à'?( ‘œ ”ýüºÌ A­ZD«jXÔ.Ì£yàÒ…Tcu€ßæ 7f: 5ÙðP³™° ø éL¦ %¿—ý‰â”ü MþBbòÓ%_/·#ùñjÆ’&¼•ÎŽÒ„¡ZÀ{ÈUe5ÈTÆ©¬Ö-Õ‡W¨6êÀj@-ÐÉÅóOù¯Ó‰;*`{ú^‰ž[bàTd7“ý w§”§ÍSZÓ»=endstream endobj 323 0 obj << /Filter /FlateDecode /Length 253 >> stream xÚÕÒ½NÃ0ðT"ÝâGȽu¢~n–ú!‘ &ÄŒ ˜Ý7è+õQúíØ!ÊŸ³¯ñ‚ŠÄ„ˆdå—‹³ÿÊl4¬æ\ñ˜¯jžU<ñsMo4HQÇúæé• Ù{žNÈ^K™lsÃïŸ/d·K®É®ø¡æê‘šgáʱ‰wƒ_ s=Ìÿ‡$ p8E €.¢° (±s‡×…¢ÀŸÂ4Ž2ì¥*ȱÓ| ]¹Ñ6&âÜ´LèÎpßàÚ‹À_à‡ýøËÇIHGN!ÄXÊ>±] ³7ž#†Ýfæýß".ŒÎF«?«Ç^Q 3Ò™Ö Ýщb=endstream endobj 324 0 obj << /Filter /FlateDecode /Length 244 >> stream xÚ…¿J1‡gÙ"0M!óº·`D«Ày‚[ZYˆ•ZZ(Úºy´}”<•aÇ™¹ãôP1|ðå—?üâéáIO :¢ƒžâ1ÅH=>cT¹Pc;÷O¸°»¡Øcw!»á’^_Þ±[^‘ØÝÊ™;Và8ƒŒ‘?dm˜gPÇj·\R…q :“dÄ„*Á |…Vbn¶;ƒg³Eó çd˜ö1Öo( Ø÷aãhDBÿcü³!ýD[Áo˜¬1¿En¥ ¹±¦ä%iêÝînª6N:ó\ÒZÛ` æ]H›_ÙI<ð?yë­œendstream endobj 325 0 obj << /Filter /FlateDecode /Length 175 >> stream xÚÕн Â0àá–>Bï L*)¸j3:9ˆ“vtPtnÍGé#8fœ—:èÒM‡|ä~àŽ3z> stream xÚ¥‘?JÅ@Æ'¤XØ&GÈ\@“HòBª…çL!he!¯RK EëÍÑÖ›ä¦L2Î쮂°áÇîüû¾É®9o[,±Æ³‹w565>UúU7¿–Øv1ôø¢÷½.î±étqÍïºèoðýíãYûÛK¬tqÀ‡ Ë£î¯|¢QÑÑ’“CD–F°³"RcB|&;¦Jª ÀÌÆeÂ%w¹pU¾ëö3Bú?OûþÄÂ|€ G(ú‚^±'€f ‰]âTH¿Ø¯ð“|X9éʶÌÜ/O8E.‘> stream xÚ37Ö3°P0P0bsC c…C®B.33 ßÄI$çr9yré‡+˜™qé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]ì0€Áÿÿ$0˜a †aÃÿeüÿßf0ÿÿÿÌà‡xûÿùõÀŒ:û`PÛãçã?Hÿÿß  e00°ÿ?€Ìø‡ÁøCãÇ(ÎøŒv q€—«'W lù2 endstream endobj 328 0 obj << /Filter /FlateDecode /Length 138 >> stream xÚ36Ó35Q0Pacc …C®B.# ßÄI$çr9yré‡+Ypé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]ìþ``üÿ€ùÿ0fÿÿ+†ÉƒÔ‚ô€õ’ ä0üÿ‰˜aˆàÿÿÿ@Ç\®ž\\ÍÙ¥;endstream endobj 329 0 obj << /Filter /FlateDecode /Length 243 >> stream xÚÕѱJÄ@à)ÓänžÀMˆD­ç ¦´²«ÓÒBÑzïÍôQ|„-#†wæ_ñ°ñZË·“eþþäà°ã†uõG|Üñ]KÔkÝh©›Í­Fr×ÜwäÎÓ[rã??½Ü“[]žrKnÍ7-7·4®¹¦B‘ý,³Å?¶ ûXø€¾á ú-ä,fXN°pùµMõùÞËV´¶¤µ%‡\{œ`rùô‰Ä_ |•­¹»7fçZlžP‰Íð \X°~r„þ[ƒ'-pG NZpZ¸£ÛYÌŠŽê4ú_ÒÙHWôn¬$endstream endobj 330 0 obj << /Filter /FlateDecode /Length 107 >> stream xÚ36Ó35Q0Pac c…C®B.#K ßÄI$çr9yré‡+Yré{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]ì0üÿ‰™˜aãÄÿ„޹\=¹¹µ‰Ãendstream endobj 331 0 obj << /Filter /FlateDecode /Length 232 >> stream xÚíÒ½jAð WÓÜ#Ü>·ÔŒ‚WZ¥©LÊ+³vrp!E¶›üçT°+‹ ó›Ý-ÆÙÇvïÞXÓÅqöÁt;æÍñ';ë±j-->x˜súŒÇéiNó©Y-×ïœgOÙ‘yÁÌ+ç#CYEI ºO$RáxŠ%4ˆDJʤnï«Ò 󢣨Ò×®U¶¤ Hª@Yûƒ$߸»Np·â§¤D@¥(€þ¿ØAx^ƒæ §¨å9ìÅE…ÿÇÍÛ„ÂÆip xœóœÿvÚiCendstream endobj 332 0 obj << /Filter /FlateDecode /Length 184 >> stream xÚíѱ‚@ à& &]xúÞÜHLtr0Nêè ÑUy´{ጃ „zwÀ¡Í×6ÿÔd4”’™JBG´ñ„qlfiG{Ø1+P¬)ŽQÌÍE± Ëùz@‘-§¢Èi’Üb‘¤‚˜µ©ÒÁc®|æÚ!P÷Æái à±®!`{èø.ÿT¼ÊV6ß¡ýAÓõ_°yÍÀ4Õ8+p…o âøšendstream endobj 333 0 obj << /Filter /FlateDecode /Length 231 >> stream xÚµ‘±‚0†kHná¼Ђ±0’ &2˜èä`œÔÑA£3<šÂ#02Î^KL%!_sý{½þ¬æI‚!.qa¼@¥ðÁCT±Ý9ß +@P% 7º ²Øâóñº‚Ìv+Œ@æxŒ0> stream xÚÍ’¿NÃ@ Æ]u¨ä…G¨_.!MB§H¥•š ¦02€èœ<’GÈx•ªÛ¹F:¡.§Ÿ¾óùÏçË“«è†"Jèò:¡lN錞c|Ã,5¢<WO¯¸(Ñm(KÑ­EGWÞÑÇûîÝâþ–btKÚÆ=b¹$(“#ýÑÃ!@5@÷Šøo˜J ÿ§4ö{®aäÁ³ÅŒòßëŽfJ®`o}4¼‘.lO­%Þw£‹m_…mt§¢e4](z†`_ëTÀU‰øµ` endstream endobj 335 0 obj << /Filter /FlateDecode /Length 169 >> stream xÚÕÏ;Â0 ÐtõÒ#Ô' ’VbªTŠD$˜02€`nÆQz„T d¨jœ20õXö“üYœé™žcŠš+ã4xRp“s?¶aq¼@iAîÐä W<i×x¿=Î ËÍÈ ÷ ÓØ Eá¢^¹˜6¡–­É±Câ‰:_øˆ:WóÑ«}ßÍO_ /h‰ Æmƒú ýIž™–¶ðj^¤ïendstream endobj 336 0 obj << /Filter /FlateDecode /Length 259 >> stream xÚ]Ð1NÃ@Ð¥°4¾;ÛŠBƒ¥$\ ‘ŠQ%Ú¬æ£ì\¦°v˜Y)¢yÒî·çÝT—ëk.¹æ‹Šë57 ¿UôIõJ/Kn®æäõƒ6O\¯¨¸×k*ºþþúy§bóxË[~®¸|¡nËXÊp8™ÎÙë…HDÑFä#ò°Ô々Ú~Àþ¨¨7ö'ÉQÈ”´^;LKZ+45qj@.dêtÜÇv“ù!¤¸Ç"iíÐÄÌôehÖ”ôÁjÛ]ˆÿdVçµ³½ÍSuž‡è ±ýõ?h©›ÓêgåcfKxýºëhG¿Á•¡Zendstream endobj 337 0 obj << /Filter /FlateDecode /Length 186 >> stream xÚ35Ô34S0P0RÐ5T01Q07SH1ä*ä21 (˜›Cd’s¹œ<¹ôÃL ¹ô=€Â\úž¾ %E¥©\úNÎ @Q…h žX.O†ÀOþÁN2bÌH$;É&åÁ¤=˜¬“ÿA$3˜äÿÿÿÿ?†ÿ8H¨úANò7PJÊÃç‚”ÿÇ`$ÿƒHþÿ ÀØ`ÿð(Èþßÿ ýß E` q¹zrr:é“pendstream endobj 338 0 obj << /Filter /FlateDecode /Length 187 >> stream xÚíÑ1 Â@Ð  Óä™ èfÑlì1‚[ZYˆ•ZZ(ZÇÎkÙyÛt¦Ž»‰… а{üáÃÀ»°O!õ¨­(Võh¥p‹ZÛ0¤(j.Ë ¦匴F9²1J3¦ýî°F™N¤Pf4W.ÐdI àñ˜Kü#ZX€ƒøã+üÏÞ8ä¯È’ àö„wåÂ6î .n ŸÁÉÁNÃõ<sUÃv‹öÁ848Å”Ìðnendstream endobj 339 0 obj << /Filter /FlateDecode /Length 270 >> stream xÚ…±N…@E‡PLÃ'ì~ >ÄX‘<Ÿ‰&ZY+µ´Ðh+ü™| Ÿ€ÝK$\gfÑX)Éæ°{÷žúä ÚøÂʪýÑÆß—üÄu%ûB·úáî‘·-‡k_WÎeÊ¡½ð/ϯ¶—§¾ä°ó7¥/n¹ÝySÌÿ‘º…Èí‰壼£'7¬ìe†"Ê0Ò›0ÅDr„ì“92•ãD˜ÓIÙ-Ù¨l‘ÎèðÞ+s@!ËÊÙ˜Âb4ÐHëÜþfƒoöqŽ!þÿC»?ù„õI?b`6ÅÀ|ŒtC t} lL™D2r1uIU'‘TuIk*’ÖT%5P%5°­!Ä.ƒ>“ÏZ¾â/1¢¸¾endstream endobj 340 0 obj << /Filter /FlateDecode /Length 310 >> stream xÚ…Ð1NÃ@б\XÚÆGð\œ8ÁM,… á * D” è"ÖT¹–o+ølé"ò0³³DQXOš]yþþòôx:ÁNð¨˜bYâÉÆæÙ”OG8›…£û'³¨M~ƒeaò ž›¼¾Ä×—·G“/®Îplò%ÞŽqtgê%Qmÿ3¢ "Vì–åÏŠ<³Ÿ³•èXú1f3j îÔ„MÅVl!e±y‹ ºo+ =̃ï¬Zy·Çê½ÃÎÈ[‘ÄcoFG\{SZ·êƛЦQ?ƒä‰`߈†µ™=mÿ»•;4ëMÛ?l½þœ};Y«íTj¶Ä­õj´Ó©Ú õIP×Z§ël§klku釾2#}UJ.´Ò†RÌym®Íaɽïendstream endobj 341 0 obj << /Filter /FlateDecode /Length 232 >> stream xÚmÐ1jÃ@…á*ÓøÚx-"cUZpˆŠ@R¥©—)bì.X:šŽâ#¸T!vóÞRYHì ~†Y7ËzãV®Æ·¾ãûYé·Ö ÎvÃ_ºíÔ¿ººQÿˆ[õÝ“;N{õÛç{W©ß¹·Ê­ÞµÛ¹ðÄ[J–æ0Á)\$‡£éx " ³LãY$¤áß> LQ~à 3ó afˈLÀŒXF,@'˜› ”œ.Lè™ h¥”™Ö2­Î2#Ñæˆœ#‹Ìä‘‚rîm\É-õ¡Óýjh¦pendstream endobj 342 0 obj << /Filter /FlateDecode /Length 223 >> stream xÚíÓ±nÂ0`#†H·ärOP'€ [%R3T‚‰u‚ŽZµsx´ð&y„ŽTŠü÷¿ Á†XjÉÒw>ßÙ<?LFšê3k>Òm&ï’§Zbó&ÓRüJóø'®Š/ŸõóãëUüt1ÓL|¡ëLÓ) uUpµ)v ¾š -‘?@øË׌ö8õ€;n=pOkì£q11»EœcfØÕ˜À³1>†KZ³*t’¼³}–­w{¢»7¢á:Þïƒþy+Ø÷€}¬k(óR–ò éQtnendstream endobj 343 0 obj << /Filter /FlateDecode /Length 95 >> stream xÚ31Ö³0U0P0T02T06W06RH1ä*ä2 … !2ɹ\Nž\úá Æ¦\ú@a.}O_…’¢ÒT.}§g ßE!ÚPÁ –ËÓEá?< àrõä äìWGzendstream endobj 344 0 obj << /Filter /FlateDecode /Length 229 >> stream xÚÍ’1 Â@EG,„i<‚sÝl±F«@T0… •…X©¥…¢ur4â,-‚ëw3)–.düfÉÿ3tƒ8–Hœô­ ­Ä#Ù[>±s#‰ÇUewä4c³çØÌ!³Ér9_lÒåD,›©l¬D[ΦBÔöá$þ‰»å½:À¨ë[þŽRI9Šùƒz%”î 7t„ø | t}º½€GIÀ³¦ã%EPþðú_üþ+µM_*|u°69X~o ©hFš˜æW§©ÙjÒš»nîDµ!<ËxÅo†sendstream endobj 345 0 obj << /Filter /FlateDecode /Length 137 >> stream xÚ33Õ37W0P04¦æ æ )†\…\&f  ,“œËåäÉ¥®`bÆ¥ïæÒ÷ôU()*MåÒw pV0äÒwQˆ6T0ˆåòtQ```c;0ùD0ƒI~0Y"ÙÿIæÿ ò?&ù¤æDå(I²ôÿÿà"¹\=¹¹VI¢”endstream endobj 346 0 obj << /Filter /FlateDecode /Length 301 >> stream xÚ}ÑMJÅ0à)Y²é’Ø–G_]x>Á.]¹WêÒ…¢ëôh=JŽe¥ãüˆ? Ú¯if¦“tߟ ChÞ¯6 §á±s/®ßÑ\¦¼ððì£knC¿sÍ%½uÍxÞ^ߟ\s¸>kŽá® í½Ào@£B,D¸'€DdZš"-š,-ÚB/6¨3"x‰š¢äç”™œ®—ÓÊ®k‰í ƒËpÞ7q|Ì$pãFúæš¿È »ùdíL™@ÚAvüZ´H¥ÙFÓ¬¦YM«5Þk|,ZdÖìI³eb4Ðj`Môä³g!@Tt¶«`[ÈBÍ».àA8ã²EþõËwÌ•b«ÔŠW¢’üÉü'îbt7î}tû”endstream endobj 347 0 obj << /Filter /FlateDecode /Length 305 >> stream xÚ‘½N„@LJlA² À¼€ÅgErž‰&ZY+µ´ÐhÍ=Ú> @IA烋 á·ì|ýgf.ëK xQá®Âz¯•ÿð!ðe‰õ•Y^Þý¡õÅ#†à‹[¾öE{‡_Ÿßo¾8Ü_cå‹#>UX>ûöˆ)Eà§£‰¿ŽˆN£ÈGG#›"ˆqhfHøÔ8¾ÏéäfEÊAEIÅÈ=¿ÿ„Å-ˆÎ’%$©#쵂H\ÀÕWèfä¹  Íhg™…™cgݺi†¹8iZþG«`©s+´¤É,25×ô\iÜ`2[Ì[¸¨ÈE3)Dä/ˆþbZÁ1.8Gƒ ƒ•I¬³éUuužR¯áÍ:îXÔ&¼oÝ´í]Ö¯"MºÎÝß´þÁÿéýëoendstream endobj 348 0 obj << /Filter /FlateDecode /Length 225 >> stream xڽнjÃ0ð ‚[ôº'ˆìPÛt±!têP2µ;´4›qüh~?‚G‚$ÎýÅC»õ@ú¡Bw—&ó,㈮+]pöÈo1}R2æ¢ñ8^¼~в$ÿÌIF~{Í’/wüýu|'¿Ü¯8&¿æ—˜£•kžnûLMÔÐ@;ÑÁž&žEõD-twñ>‡5 pU/jh:ØŠ¶,PW+D5À^Ôh ma#:ôYÀVpÔ=ìDÓŠºb~9¬a€g‰æ/ÌÿŸuøÿwiSÒ]]Óqendstream endobj 349 0 obj << /Filter /FlateDecode /Length 285 >> stream xڭѽJÄ@ðY l“Gȼ€&áH¢ ç ¦´²+µ´P´N-²°`“b¹u>r‡"X?²ÙLæ¿Ó6']‡¶x\c[awŠOµ}µÍšéñLß<¾ØMoË;lÖ¶¼¢e[ö×øþöñlËÍÍÖ¶Üâ}Õƒí·hF8ˆs0;àÛ¤Ž¡+*³¯Lʨ€•Yñ ‘ iþŸŒk›àäï!%Nó¹4tíaà(.JÚ‚bÒî> stream xÚ’=NÄ0…'ÚÂ’›!sHRd ‘–E"Tˆ ()@ Qa-GÙ#¤Lyxcó´‘•Oòóx~ž×ÍaÛrÅ Ô¼®¹=âûÚ>Ù¦ÁfÅíqRîí¦·å57-ϱmËþ‚_ž_l¹¹<åÚ–[¾©¹ºµý–‰ÈÒOdÀ%2…È ¸9SQväTòÔy2ÙSÁ Tà» 2NXFvY òŒø_ȹèíC!š‹"Þˆº%R­î/ºQ‘‰(Œ¶"!×V$ÞMÀ x#$“0"»W ­ ÎˆPrÂ(¨ì$Ó7´Ày?â Âîßèö"^Ò\æ%òˆI‘Éd¾«^EÀ€AíÈRɯiP7ë@tÊê4F¦¾Ã}œÒ·  CÔGƒÉžõöÊ~†\öendstream endobj 351 0 obj << /Filter /FlateDecode /Length 239 >> stream xÚ­Ò±jÃ0`™[ü¾he…ÚÎTAš@=š)Cé”dÌÐnÁò£ùQü5˜8²þ@mp CoÐ'¸ÓJ“§,ã˜3~Tœ>óLñVÑ’Ô%cžMq³ÙÓ<'¹æ$%ùæÒ$ówþ>þìHÎ?^Y‘\ð§âø‹òGÂGT‚ ´%ð1Šîs °à< (G˜®Ï‹(ºnhÄÉõ<œA홀°OîÐÂS€ÆiüX+ÒÃé"¬]ö1¨Õö n\PrÀ䚇cDôÆÞ§ý+Á"ZlÎ`eºúý1´ÌiEWÂÁLendstream endobj 352 0 obj << /Filter /FlateDecode /Length 339 >> stream xÚU‘1NÄ0E'JÉMŽ`_²)²ÊÒ²H¤@‚ŠQ-” ¨£…›øéHayøcARäIñÿù?ûî¼ïÍÎtæ¬5ûÖôæ¹UoªëðqgúË|rzU‡A5¦ëTsƒÏªnÍÇûç‹jwW¦UÍÑ<¶f÷¤†£!*y"<–Þ3Dà‰ê@¼àȓơ©ŠD,#DQÄc!C<– S 1¹©úŸ`}½EØ fðŠQæjÙÀM5ÏA°˜øcÁ²¦Ç.%ó‚Í€€ %‚Æ ç œ9æd’QÿÅœrè™’t‘pI#xÙï$u_"E`—-5KˆfXÊz‘ qv, /&Áy¹6:)z…‹©veÒuFµA¹EøÅ”àVxXVˆ;Õ³]äß‘^KFƒùa9 ÔjcªG²ëÜY•ëAEJ˜¨ëAÝ«D©endstream endobj 353 0 obj << /Filter /FlateDecode /Length 312 >> stream xÚ’±JÄ@E_H10Íüy? ÙÙ(uSZY,Vji¡hý´|J>!eŠa®ïÍàÅsàN2sß½Y×'MÃ+®ù¸âuÅÍ)?VöÅÖµˆ+nÎÒÎóÝt¶¼ãº¶å•ȶì®ùíõýÉ–›› ®l¹å]Å«{Ûm™È`Oòô˜eÍ€@ªAÕ"dek¦v"ÂDÅLª8O92!~l@Ncï@ŠzÐÐ.1öaiÂŒßáÿðBÿÚ v?Qàƒàt>—p„ C 4‚s9¿ŸH]¶>Ÿ0BÁ/@ IL}~¦-&¾ÃÇ\²^+—™˜îèävq°€ÑÈpÚƒ Ä:ŠTNëµ&­ÐøXaž*ÌE——3ìµq}µˆNd”!ýÑ«ÌId/;{k?žnfendstream endobj 354 0 obj << /Filter /FlateDecode /Length 267 >> stream xÚµ“=nƒ@…Ç¢@šfà9Al%"’C$SX²+V*;eŠDI£pJ ÄzÖ°òÚîÌŠÕ·üì›y^çOÏ‘=“Jftˆñ“ˆìॽ±ÿÂEŽzKI„zÉWQç+úýùûD½X¿QŒ:£]LÑæ™óÑ@G¦j…ÌQ¨P¦˜ÚϘº§‰iz‚ÿVÈ8Jy›Ž¦<_’â­oSÈr¡ûºãJ^CoC¿âÁàK(®¥vR“ਾB,á|.ÅÝÚWK¥uÅÉ¡Ë`DuO6®KNý™‡‘¯6‘_i JGãT+É­”´ ç¤KP±„û²¡J¨ðÿ~ ßsÜà uÍyëendstream endobj 355 0 obj << /Filter /FlateDecode /Length 338 >> stream xÚÍ“?N…@ÆgC±É6½€QãÚ¸Éó™Ha¢•…±RK vF8Þä%^€’‚0Îì ‘¼Z ø-;;3|óqvrX”ºÐ§ú ÔÆhs¤ŸJõªL¡ù6Ç~çñEm*•ßiS¨üŠ^«¼ºÖïoÏ*ßÜ\èRå[}O‰TµÕ@W‚€dªR‰ˆ;Ȉ,Q–ˆG¨9ÛCi ì7rXKËä0—Aà@$ˆs;’²º:ñ>GOÔ11PV¨GG’ª à{ ré(µëÜ‘  J}1*7S(»$;SheIÙLõ>âoúCø¨^¥f­i0Ó¤ÚÙIñ™Î§ÉÌô¬ð§ Cœ4ôqú¢ŽHºèG®¹‹nJÛè°¬‰®³œcÔC +{ç7ZÛÎÛ¶>»ƒ Úà¿¢‹*E!¼Õe¥nÕ/ÙÏíãendstream endobj 356 0 obj << /Filter /FlateDecode /Length 258 >> stream xÚÕÓ1nƒ0`£ ‘ÞÂx'¨¡b€ ‰¦R"5S†ªSÛ±C¢d†£õ(9BF†ˆcWæGµR¦Z}lÀþ_ÇYÂ1§æÈSÎù#¡=e¹éÇ}·¿ñþEeEzÇYNzm®’®6|<œ>I—/Oœ^ñ«™æª‹kªo?nÁ‚>ƒíCK¹(Iç¸ÖªoïÐv^سs`'rVr\wƒ Iã‚—ý˼ÏÞ‹‘/ÞÁÈí¤íýênp=g¹ÇÍ?ôÿ;³†¸ÎØ—¹=Å  13èr…Ù‹ “E7™ÛòŒ™ÇZ€1µÓŒk kmªgjÖ.=W´¥€Ms³endstream endobj 357 0 obj << /Filter /FlateDecode /Length 349 >> stream xÚÕ“±NÄ0 †]u¨”¥P¿´U‘®"‡D$˜02€`ny³ãMNâ¸ñ†ªÆIÜ»´EÀJ÷“ã8vâ?ÏŠã¢Â x”cµÀ²Àû\=©Ò83,OÜÊÝ£ZÖ*½Æ²Ré9»UZ_àËóëƒJ——§˜«t…79f·ª^!ðÒ û5D±Åˆˆ6XÖÌ;Ж©‡Æí¤uH@†cýN.|ÍŽrá.m@µÎ³Û¯F|Ž=›Mb¶š Ö´`]ƒÃœb{)Ð$èÀU2¤ئç¿ô' ÄcW˜¾|–rƬÇ,eŽ9sóýÃôOx^cf¥u=þÌzÆ.‡–{6œü‡·›òðÖS–1´Œ¸;ôAýe&oVýögÛ›ù`¦_#œˆ7ÄŸ¢)ÒNG¼¼ èöÝYmv¢M£Ù­è×Üf !ˆ&\oê¬VWê ?¦!endstream endobj 358 0 obj << /Filter /FlateDecode /Length 105 >> stream xÚ3±Ð31Q0P0bS #…C®B.C ßÄI$çr9yré‡+˜ré{E¹ô=}JŠJS¹ôœ€¢. Ñ@-±\ž. ÿA ÉÀþÿÃ(9THü±ÉåêÉÈ’:Õ°endstream endobj 359 0 obj << /Filter /FlateDecode /Length 311 >> stream xÚÔ±N„0Àñ’oé#´O ”\<'HÎ3‘ÁD'㤎ÝHàÉ ÆÁÑGð‘áBýú•Iû%)ð+,ÿ¦`ÊÕÑz­ ½ÂaJ£OJ}oà Œ9Æ™ÂÙ=º{„MùµÆyÈÏqòæB¿<¿>@¾¹<Õò­¾1º¸…f«­µ£ #q·8&ÏtáÞ3ûŸxž=%Ýüæ·õT]ˆ_¶'V1ü´± òÃîˆSï>8ƒ|º‹bGýx ²¦~Ù‡©¨_‰(Jê¯fÔß2L©Šcâ–# ןî8º~w‰¢[ÙstýJptýU,Ýr´,]ÿÄû±ž#öc},»=Ö3Ö³Tëc)íÛfôÑrLi‡G’vKA;+DEï ñß1¥]þ*Y÷‡¨ÄB8kà ~oˆ§Lendstream endobj 360 0 obj << /Filter /FlateDecode /Length 209 >> stream xÚ³°Ô³0U0P0b c #…C®B.s ßÄI$çr9yré‡+˜[pé{E¹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þƒÁëÿ8ëœõ¿ÎJóƒûÿ ,fn0‹¤ªÿcÙ5CXòÿ@Y ÂbGb}ÀÂúe1ceý¡ Ÿ½ìH,ln~÷å Ÿ#BBðPŒº`pÎb€±~ÀY 0SFYä± I—«'W TÛ4#endstream endobj 361 0 obj << /Filter /FlateDecode /Length 290 >> stream xÚµÓ±NÄ `H‡&ÿÒGèÿJk×NMÎ3±ƒ‰NÆIMÔèÜ{4¥ÀØá"R ÜßÈ%)ù ~ø¡Ùœo®°ÀK<+±©±¾À×>¡©Lcuåz^ÞaÛxĦqkšAtwøýõób{%ˆ>•X> stream xÚ}ѱJÄ@à?¤l“v_@“pÞ] !pž` A+ ±RK E;!÷hñMÎ7H¹à’qfwO ¦ù`vv23»œ•µ)ÍÒVf±0õÌÜWêIÍ%Xšú8œÜ=ªU«Šk3¯UqÎaU´æåùõA«ËSS©bmn*SÞªvm€| 82"‡7@бï, }8$´þtHIR2>JØÜJ =°MT;4[6ÿ±ùR׳éÄÄ~“û íD©Ï}~k£.:Âíì£6ʃH«¬Ï±¥DÎJ†wðkñ©8ÊÌ1ÁÛ‡=Iszÿ‚‰6üÑWÎBðJIľ7ìl¢:šÇa²hJ½Ý7ùCÞ¦ûßÍ8‘ÂýðˆþÝÆðâÞ5,φýkV›Ôqœ<ò Òöè÷Ã/™„µXY×dã|…ËvRJµêJ}áI±endstream endobj 363 0 obj << /Filter /FlateDecode /Length 176 >> stream xÚ³4Ô31W0P0b 3 C…C®B. rAɹ\Nž\úá \ú@Q.}O_…’¢ÒT.}§g ßE!ÚPÁ –ËÓEÁþ?ü!žu€¡þ?3õ‡Äb°ÿSÿÂâÿWÿÂbÿWÂbþWßa1þ«g€°Xu0V6V ŒeG,ëŒeÿÆ’'Åc1Œ²†%‹’œÍârõä äãCì> stream xÚ•‘±JÄ@†'¤Ls°óšL® œ'˜BÐÊB¬> stream xÚÝ‘=NÃ@FÇJišÁsX[NŒ©"åGÂTPR€ ¶;®•ä 9BJGZí0;Þ J¨Øêifw<~ßEqžU”QAg9•—Tô˜ã –)fTûÎÃ3Îj4wTNÐ\IM}Mo¯ïOhf7sÊÑ,h•Svõ‚`Úæ_À ühv= ™{H™× ³ïñž¡±ÁBÊ [rë¡%k‰TïË3¶ü·š.‚ 0=€;  ý Ú¿€“ûv>ò;ö»ÕbC _Æ\”Éõ¶Aøf #àc§ƒ—è,'·4/+;h‚¼q1h¸¬ñ?7p%endstream endobj 366 0 obj << /Filter /FlateDecode /Length 243 >> stream xÚµ±NÃ0†/ê`é?BîÀ‰dSº`©‰ HeꀘhÇ XI-Â#dÌ`å¸s‚ºtÅËgý÷Û¿î·×~Iyºª)x ö5¾£_‰XQ¸™&oG\7èväWèEF×<ÑçÇ×Ýz{O5º ½ÔT½b³!€ÿ€œÈ£‚™Oª±ª–!2J`@;€÷PŽPÈ<²;…‘GgÈ3E9c̈¹*lÊ0´9Útüø / Îà Ýìi†Õnʲm'¾©¿;)¤ø–),åˆbÈߘ^‹ìJq™©Ý‚§®£zµlÑð¡ÁgüÍF‹¾endstream endobj 367 0 obj << /Filter /FlateDecode /Length 210 >> stream xÚuÏ1jÃ0àg<þÅ7ˆÿ 4²‘ã1'…z(¤S‡$ MH×XGÓQ|„ŒJÝW\(TˆôúŸ 7uN3uúk‘i1Ó}.Gq%CËáf÷&u#öU])ö‰±ØæYϧƒØzµÐ\ìR×¹fi–Šè €éÆWà‚Op_ÝPIÓ!õ I@Ò*¤#f %×#ý¸~á,üK{ÇT#ç¼³¶,„ΰq`É(°nìYÜsLøâ¾Þ–ÇF^䃷V2endstream endobj 368 0 obj << /Filter /FlateDecode /Length 125 >> stream xÚ32×3°P0P0b#S3s…C®B.#C ßÄI$çr9yré‡+ré{E¹ô=}JŠJS¹ôœ€¢. Ñ@-±\ž. ŒØ€ÿ‚ˆ¥ˆŒþÃûæ? : æ ÿÿÿ€ .WO®@.»P endstream endobj 369 0 obj << /Filter /FlateDecode /Length 161 >> stream xÚ3²Ô3·T0PÐ5UÐ52P02T03WH1ä*ä22 (X˜Ãä’s¹œ<¹ôÃŒL¹ô=€\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. 6 ÿ!˜ñ †‰ƒÕêìÿ#0Åì‡$¶âz þ$!¸Šÿ0Ô3ü`°aüÀ Çü€|ÿ¸\=¹¹¾[3endstream endobj 370 0 obj << /Filter /FlateDecode /Length 203 >> stream xÚåÐ=ªÂ@ðH˜Â\@ÈœÀMü BÀ0… •…X©¥ ¢­ÉÑö({Ë«ãî+¾¼b†ßü§˜aÖé8åž«|Äý>2ºPî³Ô~±?Ѥ$µá|@jáRRå’o×û‘Ôd5åŒÔŒ·§;*gX@l$Æu¯8lSyÕEÈžñn!Ñ­Á£X#xiTCÄÆ©F•þHjODO' 0¿ôvÒÊÝö§þ³B÷J#n Ò$"¡ˆù&š—´¦ݤ›endstream endobj 371 0 obj << /Filter /FlateDecode /Length 159 >> stream xÚ35Ñ34W0P0bSC…C®B.˜ˆ ’HÎåròäÒW01çÒ÷Šré{ú*”•¦ré;8+ré»(D*Äryº(0þaüÇÀðÿûÿ@RŽý´`üÁÀþ§€ñóŸ ÿ`ø$@äÿ†z É€ ÿa/É òmÃÿÿ?ìÿÿC&¹\=¹¹?qjSendstream endobj 372 0 obj << /Filter /FlateDecode /Length 209 >> stream xÚ= Â@…GR¦É2ÐMtý©bSZYˆ•ZZ(Ú‰ÉÑr2EH|›((vÂðí̛ݷ«Ga_<éIÛ=Ý—½Ï'Ö]ˆžQêÎîÈAÄj-ºËj™U´Ëùz`,§â³ eã‹·å(¢8!"«Ê@'-À1¹à4r²Sjed=L A Ñ‹]l»ÓŒßÄñ V0ùee˜þǯÛ̬äsnãÄ…«òíž ²Áœ¬Ì”/óÍKÝ´í*ëßàYÄ+~PûZ>endstream endobj 373 0 obj << /Filter /FlateDecode /Length 144 >> stream xÚ36׳4R0P0a3…C®B.c˜ˆ ’HÎåròäÒW06âÒ÷Šré{ú*”•¦ré;8+ré»(D*Äryº(0ÿ`þðÿ‡üŸÿ?lìþÿ(¨gÿñà?óÏÿ6ügü  u@lÃøŸñþC{Ì ´÷ÿÿpÌåêÉÈÈöPêendstream endobj 374 0 obj << /Filter /FlateDecode /Length 213 >> stream xÚMͱNÃ@б\DÚæÚTdëä""R.HE¨€’’‹ˆøÓü)÷ ‡h®°¼Œ!Åkfg´¾:[œë\½ž–ê—ºXêS)¯âK†såí÷òø"›ZŠ;õ¥׌¥¨oôýíãYŠÍí¥2Ýê=7Roë0ͬ¯&aÖ8äéYZi4 % :šŽú£¬1X[ÀÌz83L̺ܘE†œ[yß!8}†?£øË+–÷ÔðO2dñ»ÍÃWtm8 è\„\Õ²“uYÛendstream endobj 375 0 obj << /Filter /FlateDecode /Length 160 >> stream xÚ36׳4R0P0RÐ5T06V03TH1ä*ä26PA3#ˆLr.—“'—~¸‚±—¾P˜KßÓW¡¤¨4•Kß)ÀYÁKßE!ÚPÁ –ËÓEó¡a9$lÄuPüˆÙXþÿÿÿ¡$N#ÌC®ca¨gc{ ùù ì00þ?À”àrõä äùJmendstream endobj 376 0 obj << /Filter /FlateDecode /Length 136 >> stream xÚ32×3°P0P°PÐ5´T02P04PH1ä*ä24Š(YB¥’s¹œ<¹ôà ¹ô=€â\úž¾ %E¥©\úNÎ @Q…h ¦X.O9†ú†ÿ ÿᬠ—Àƒ€ ãÆæfv6> † $—«'W ÷ '®endstream endobj 377 0 obj << /Filter /FlateDecode /Length 95 >> stream xÚ32×3°P0PaCKC…C®B. ‚†‰ä\.'O.ýp ŸKßLzú*”•¦ré;8+ré»(D*Äryº(È1Ô7Ô7ü? ¶—«'W Ëendstream endobj 378 0 obj << /Filter /FlateDecode /Length 207 >> stream xÚ½½ ÂP F¿Ò¡¥Ð¼€ÞVn«“‚?`A'qRGE7Áúf}”>BÇÅšÞ‚Šè*3$|9º×î†ì³æV‡uÈQÄÛ€¤}®+ê5“Íž†1©%kŸÔTڤ⟎ç©á|Ä©1¯öר8Ux·èã”À*à%V7±38©“ÂÎ \Aî&°rOP ådeyÜ¿¡>Xý ?c\%éý#øë£æË'q¶(I£©fÔ‰µNšÄ´ ƒ…)endstream endobj 379 0 obj << /Filter /FlateDecode /Length 259 >> stream xÚ]ÐÁJ…@ÆñOf!"·."ç åÚÍE0p»A.‚Zµˆ ¨vµ ôÑ|Á¥‹ËÎgH0?˜ñ?p´¬NÎNmn¹ÊÒ®×ö¹wYUºÏ¹å‹§7ÙÔâîìªw¥§âêkûùñõ"nssa q[{_ØüAê­…ÙÈB´aD4%;˜>Ú#îp¨§Ýà{%*eÌdl”鈧W”]èHÿ‹ùOË·ž¦…dfä 3Âױt¢KÒ‡óF¼oæû¼³MØfl=³oÂ,"†EÌ"pLΉ~WІh–Fš¥F³*Ö4×€& !Œ3ž´DWþËZnåÎvjendstream endobj 380 0 obj << /Filter /FlateDecode /Length 206 >> stream xÚ¥ÐÍjÂ@Àñ„@CÐkBç º·‚Ð õäA ¶GAEÏæÍÌ£äMbö/hèµûƒÙf–Éf¯Ó±Zµ'›èdª?©$¶¹u©{øÞÉ<³Ñl(æ½½“èéxþ3ÿ\h*f©ÛTí—äKõ> stream xÚ37Ö3°T0P0b3K3 …C®B.3ßÄ1’s¹œ<¹ôÃÌL¸ô=€¢\úž¾ %E¥©\úNÎ †\ú. ц ±\ž. ÿÿÿ?Àü PhÆÿØÿ70Ô7000þc~4È«Øèáê_ì4,žq¥.WO®@.þ†Ãendstream endobj 382 0 obj << /Filter /FlateDecode /Length 171 >> stream xÚåÌ1 Â@Ð [~¡ò/ »1F“JˆL!he!Vj§ ¢uöh%G°L²î‚……7pŠWÌÀÄj RVsÈ£˜Ç BºRäJœϲ?SVÜp”’\Øšd±äûíq$™­f’Ìy²ÚQ‘3ºÆ´_@ x6ÿÂÔQj‹yþÂka´–Dƒ D~ü:èVðhˆªt—%¨š´¦7¥Tmendstream endobj 383 0 obj << /Filter /FlateDecode /Length 280 >> stream xÚ½’½nƒ@ Ç2 yáÎ/ÐD%dCJS© •Ú©C•©íØ!Qº&<Â#02 \±M9¤0‰Óïüqw¶ÿYºÜÜSL)Ý­(K(‹é3Á®ÓÞS¶RÏÇ7n ´o´NÑ>õf´Å3Ž?_h·/” ÝÑ{Bñ‹€é@¾À¹J lÂFÀ” ¾3@.!-@ÄA‹> ¬AÞˆ™Ýœ’–™òËî*PB §š œQíAoî×"…–½|s F¡óËÃë \ÜJ©iÜåÂÌ oÀ×¥%Oà¶¾cj{¾ó:‹šçéT~LpaàE䫸 »› `”›M5•Ò(­Qlƒüð±ÀWüq¦2endstream endobj 384 0 obj << /Filter /FlateDecode /Length 252 >> stream xÚ¥Ò½jÃ0p †[ò¹hd‡`e3$)ÔC ™2”@ íØ!!Gó£è­ ©ï3üU?&Æ ûw†ã0ÿ ó,N=jÂô7˜>ÌFTÒ¿ž¸‘Ux4·ÙF=„E_¹%¸\áµ€=Ü/ɸhendstream endobj 385 0 obj << /Filter /FlateDecode /Length 229 >> stream xÚuϱJAà¹ba ï ¼yÝÙhº…Á+­RˆPK E;1 ¾Øt¾Æ½±»âp½‹ S|Å?;?¬ŸÏxžjösö3¾­éüTCÆÍÍ=-r+öSrg“kÎùéñùŽÜââ„krK¾ªyrMÍ’a{è„Õ®lBŠ-`a:`Ðu)xªu‹w­äG½W‹˜ÕùÇ2©&e˯œɦá¶ÏÚnh›‡Î ÙÍhüuð‡aǨ‡k}ÿ¡ Þ[ bÔªµoŸb»ý"E“z“†O¾€Nº¤oÉŒlaendstream endobj 386 0 obj << /Filter /FlateDecode /Length 213 >> stream xÚÅѱ Â0à; ·ø½Ð4X-‚P¨ vtr'uTt•7)7´&/¡Â“²‰Ž hÀ4³“"¯rM¾ò¨Ó˜îzd‡Úendstream endobj 387 0 obj << /Filter /FlateDecode /Length 203 >> stream xÚ½ Â0…Oé¸KßÀÞд¤v øvtrAPGAEÁA0–Gé#8:õÆÜòANȹß-LÇÎØp;ç"ã¢ËëœödJ åZ¾_V[êU¤glJÒ#‰IWc>NÒ½IŸsÒžçœ-¨0pu@ÜÜ€Ä_‹x vёÒZÕ°uú/¬{#õÒ¡^EÈAó^Uö‹ÌzÌÅN4° ¨E A2ò¢;Wa…Äé ¨°V4¥'VhLrendstream endobj 388 0 obj << /Filter /FlateDecode /Length 290 >> stream xÚåѽJÄ@ðYR¦É˜yM̲pž` A+ ±º³´P´”äÞ,÷&ñ ´ËAȸ³›„ÃÃΰ¿Ý%“ͦ‡GÇ”RFûš¦štšÒRãN2»šÚ¹ö{‹{œå˜\Ó$Ãä\Ö1É/èéñù“Ùå)Ùùœn4¥·˜Ï ܵç0Cþ v þ-¸ôˆ¸ñ0ÜypiV‚ …p-P¯‚¸ØLð"(J€Ëv×W—ÀU+ov®Œ‡-ã“ßúcDâõg˜Uâ7({ð_`üú7'4»¨¿ ÁlÃ…éâm¶sކH/@×b€±'Û¸^U Þ¶b°æÊUŒVlÿA1J·1×vÏÞ€g9^á[9×^endstream endobj 389 0 obj << /Filter /FlateDecode /Length 267 >> stream xÚ‘±J1†'lq0…ûÞ¼€f̰pžà‚Vb¥–Š‚]òhy”}„-¯86ÎL¢œ‡• Ù/Ìü;“üq«Ó5äè¤%×QwFO-¾¢kHfçræñ×Ú;r Ú+£®éýíãíúæ‚Z´ºo©yÀaCÕ 2–i¤´å¯™5º˜À€z„>‚¬%k<&rš¥,«¶`vŒìd+q3Ëß’1«^+ü ô\úoxE<@ØG*Ðqˆ ÷ù/|AüýoŒÙ¸=˜¨×,¨¢8U(`‡Ø´ fA-©‘pœûžçÚŸ¹Ú¤Pjí"ê{mœ¤ÔIš€‘ƒã倷øYRŽendstream endobj 390 0 obj << /Filter /FlateDecode /Length 351 >> stream xÚ­‘ÍJÄ0ǧäÈ¥¼€¶‹µ‹§Âº‚=zò ‚ =øu“mÁë£ärì!4ÎLRuD¶„™ÉÌüg¦^îW¦4•Ù;(M}hêÊÜ-Ô£ªKCÿQ•\·jÕªâÒÔ¥*NÑ®Šö̼<½Þ«bu~lªX›«…)¯U»6À_‡GzahBŸ ‚Õï„—ã›t ]æ2 º‡¦G6Da)…Æh˜rûÅÌcf÷EA¿1-Û?pλëÛÕ³«÷³î I}Òˆš6Ä¥£P€gOén Àâܘ’ÝÙ'û+ít‰c¢„036u! è’¡AÒMÄ"9Ñ%ûÈ} |H³=¤X9ÑZ±H v¹÷]Ͻãm³E=L‰QVþgÎq)Ïœ¯ïRþT7éØD]àãn²¤Çó cˆ»Æ’|´M É'bÛ<Î%øªNZu¡>ÚvÔendstream endobj 391 0 obj << /Filter /FlateDecode /Length 219 >> stream xÚ37ѳ°T0P0bsCC…C®B.33 €˜’JÎåròäÒW03ãÒ÷ sé{ú*”•¦ré;8+ré»(D*Äryº(00`öÿPÆ"Œ0C=Ã~d3ê@Ìÿÿ@üÿÿCö àP³?PÁ ÿÌøÀÀÿÄ8x€ýˆq¸¤Íþ83˜qÈøe0‚w`Œ0H+Èû¸p3Œ2¨ÆÅ>ãÿ òÌÀøþÿÿÿf qƒËÕ“+ ‡ÞPendstream endobj 392 0 obj << /Filter /FlateDecode /Length 142 >> stream xÚ36×31R0P0bcCKS…C®B.#ßÄ1’s¹œ<¹ôÃŒL¹ô=€¢\úž¾ %E¥©\úNÎ †\ú. ц ±\ž.  Œÿ˜ÿ30°ÿoÀŠAr 5 µTì ü@;þ£af f€áú!Žÿ``üÿè¯ÿ ȘËÕ“+ > stream xÚåÑ=JÄ@ð )¯É2'p2°Dl ¬+˜BÐÊB¬\K E;qÒy­ˆ…å^aŽ2EÈ33ïŸÂEô„ßdȼ¯Ú»Ò¥Ou¤mYê­¥ªÂAßÃîöžÖ ™+]­Èœ…c2͹~z|¾#³¾8Ñ–ÌF_[]ÞP³ÑIÚ%ae,ò*˜¸=ëÿcÊ<üæ<¬6êF¹ç<ì â½Âö¢òÈÓ‰Y+æÈ _à ª^L½˜ubÞŠ¬qîð‹ï,÷?vïóMÜectJ§è¨ÄAq´O8Öç‡:ê®ÑG±ˆþò}-¢ÿ˜ ô¿È˜KHçÖ~Ÿc¹‹½DÇ='ùù0t[°gž7×ÒiC—ôÍâÞÏendstream endobj 394 0 obj << /Filter /FlateDecode /Length 207 >> stream xÚíÑ¡Â0à[*–œÙ#pO@·@ ¨%0&H@! $¸ñh%Ø#L"Çu€…D´ùþ¶—KzzµÙ¢ê²™Í"\¢1’CÝÅtíõˆŒAÝ“SÔiŸÖ«Íu{СuBãˆÂ ¦ ²åà³U|0Û€ù‰Ø–ØB%/Q@Px¼·à_åQvØïʲ#€rˆO‚û ^‰Ëç7\©ëŸ‘†ýãgpÓ÷x'A~^ɼ™¹P²Ù/ÀnŠC|U¸ýendstream endobj 395 0 obj << /Filter /FlateDecode /Length 249 >> stream xÚ­‘±NÃ@ †}êÉK!~¸5Ç©©*ÁÔ1#æÜ£õQú3T9l× êÈÝIßɾü±‡Ûë5•TÓUEá†Âš^+üÀ:p°¤PŸ3/ï¸éÐï©è·Fßíèëóû ýæáŽ*ô-=UT>c×€Kxåiôi$Þ«Š@v”#W@Áø!ç'=rå4à8 E\)™æGCÎ †B1Š:‹6ŠÓ½bê¥:wZ¹KÿŠ??²"XÖi=Ì1w«½fùbpêYœ4?Í]óšeä[›ƒã©ÄßÙÄt~xßá#þ°´”ðendstream endobj 396 0 obj << /Filter /FlateDecode /Length 288 >> stream xÚÕѱNÃ0Ы2Dº¥ŸûHmÚN–J‘È€SÄÔ22€`%ù4£Œýƒ*Ÿà1CÔÃg[!uBbˆòîbŸ»Éèt:£ŒFtr6¥IFÅ9­s|Âbl³ÍòðiõˆóÓ%cL¯lÓòš^ž_0ß\t—Svå‚ ÒPiˆYÇÜY0ë„Ù£Ö-$F°i nüQC$««­ö‚l±réÚ¢•ÈîWFÐ$\E‡aë×}!î~"Ú÷bÀÇ ö€?ÄqëÿÁ®·®Q®uæ{3}>t^ ãuCaÊΟ jëeG)…Am´«êÝø¢J¿IãŠe­Å[W.Üç¿¢jØ„7ý¼,ñ?n·Ùeendstream endobj 397 0 obj << /Filter /FlateDecode /Length 185 >> stream xÚÝÏ? ÂP ð¯,d°«ƒÐœÀ×ÚVt*øì èä ‚ Ž‚ŠÎ¯GëQzÇNÆ÷:ˆƒx‡üÈ—@ i¿—Drj*ñ æCDJb“Cíb¢qNjÍILjn¦¤òß®÷#©ñr©)oÌ™-åS†¯†/ž–ÂX¥ˆSeF·Ô•+^¡+ˆkÛª»d%ôA¢è3ðv×X}Xþ´øÅ~äÈö"õ7i–ÓŠ^¤Ds.endstream endobj 398 0 obj << /Filter /FlateDecode /Length 281 >> stream xÚuÐ1NÄ0Ð¥ˆäÆGð\’o$"-‹D $¨(PR€ [mr®â›#¸Lv˜q v š'Ù3þ3Éêì´n¨"O'5ùsj<=׿Íx/—5«¥òôjÖ)ïÉ{S^˵)»úxÿ|1åúö’jSn衦êÑt8ä€å©zÞ[dŒö yDñbDΰƒtÁ‰=Z¨b‹è°M΢ýÇûyqPû¡©“Újë•e^Œ5X*³>ìYëŽYžÌ:#•õB´IjÆ!¥MlGÕ-ƨéÉâH]$?r>Pçäcš6òŸA§Ù ÓìÖ~¢þ¥I"v˜¶ÈfD7¸ˆ(Ÿ0æºl@/]æª3wæׄŒœendstream endobj 399 0 obj << /Filter /FlateDecode /Length 191 >> stream xÚ35Ò31T0P0RÐ5T01U°°PH1ä*ä21 (XXBd’s¹œ<¹ôÃLŒ¸ô=€Â\úž¾ %E¥©\úNÎ †\ú. Ñ@ƒb¹<] @€ò>’ƒdF"Ù‘H~$RLÚƒÉz0ùD2ƒIþÿ@ÀðƒD1aˆ’Œ¨L²ÿ``n@'Ù˜ÿ0°3€H~`¼ücà1ƒ(¸l@Aÿà(ÀáÍþÿ8¸\=¹¹~@‡Øendstream endobj 400 0 obj << /Filter /FlateDecode /Length 203 >> stream xÚíÒ¿Aðïr Éî$7/ÀÞÆeQIüI\!¡Rˆ ¥¡æÑîQ<‚ReÌž V÷Ûùv¶ù¶™Ö[mN8åšå¦e×॥-9§Ã„]úHkêfd¦ì™¡ŽÉd#Þï+2Ýq-™>Ï,'sÊúŒ0eQĈ"”ïüå²ÇÜŸÞÑñþñ3‚Ï?£(%V” œÊUè… Ð’“n(6áÁY4nú+|×<>èÈ­h‘\Ð ºEƒŒ&tj8­Úendstream endobj 401 0 obj << /Filter /FlateDecode /Length 152 >> stream xÚ33×3Q0P04U05P05R040RH1ä*ä26 C„Àrɹ\Nž\úá Æf\ú@q.}O_…’¢ÒT.}§gC.}…hCƒX.Oyþû öê0Ô?ÿÄlB Vh Vl> stream xÚ½’±nÂ@ †2Dò@Þ€øÚp\hT$ R3 µbFª"1Ti-rÀ˜UµƒO9$f†oñý¿í³=<æ†úd,=Ø'ʇdúÏ´1¸G+q~É­]ïpR`¶ k0{“ÌŠ9}}¶˜MÞ§Äá-Ù·ÂbFÐez̈92'€Žˆ*€˜I~R¿(ßLÍ¥Kc§R/WËX-¥ÚÎ:uKtj‰]Kâ4’VšV‡h©Ÿ”w ¬w«ßkØø¯´ºþwâ®çÎ+œ£Ÿm3çRç.…d’Xö’èJ›DÆ\«ÑïXLb±Ü܃ÜEs#½—.¾øÿl«xnendstream endobj 403 0 obj << /Filter /FlateDecode /Length 257 >> stream xÚ½’=jÃ@…W¸0L£ØsDZ¯˜¬ÂT)Œ+'¥ ›Rˆ £é(:‚J&x†Ý‘ì:Å×ì¾y;óv&£Ç±Ågøà¦èžÐ¦3ü°pÇÇ)Ú± —û,rHÞÑYHÖ|I¾Á¯Ó÷'$‹×¤ã%n©lùkcLCüsb@ÄD¿$*cz$ˆXpÄ3‘C“0®¼¸_û‚^ã‹")º„Âß@¦–lÔR{ÖÆ·œ;"ár‹Ñüýê½{ýH¯º=Ï©çæt.:/£d[„ç%±K±*ýÿeá?‹î#‘W~â°ó°'¼¼7°Êá ®†„ƒendstream endobj 404 0 obj << /Filter /FlateDecode /Length 97 >> stream xÚ31ѳ4R0P0T02W0¶P06QH1ä*ä26 (˜C$’s¹œ<¹ôÌ͸ô=̹ô=}JŠJS¹ôœ ¹ô]¢  b¹<]þÁü—«'W ‘›44endstream endobj 405 0 obj << /Filter /FlateDecode /Length 96 >> stream xÚ36×31R0P0F¦ :Å« Ì ƒYɹ\Nž\úá@—¾˜ôôU()*MåÒw pV0äÒwQˆ6T0ˆåòtQàg°?Pÿàÿ¬`€ŸËÕ“+ è±"gendstream endobj 406 0 obj << /Filter /FlateDecode /Length 257 >> stream xÚÕ’±ŠÂ@†G,Óø™ÐM$æ° D…K!he!Vzå'ÚºûhyÁ2…$7³î ,]Øý†™açÿÓ¯AB¥ÔRÓ8¡]Œ8’dDãôVÙþb^ ZÑ(AõÍiTÅœûãª|1¡Õ”Ö1E,¦Ðm@NØœº©øíԚѭ@3zgKËdœ¿€¸ 'nf\A®Dœq.îv,L SBÓ³(Û!<¢ÌâòÚ¢Ò†¼Æâú™xù?·^mÐïÚ ð€¶8^¿¼¶¢´¾ë..¨½$’Œ3Jf¬œ‰œ¥6˜¹ÛÍ™Ï[Ñg.ñwÓÄendstream endobj 407 0 obj << /Filter /FlateDecode /Length 147 >> stream xÚ33×3Q0P04¦æ –& )†\…\& ¾ˆ –IÎåròäÒW01æÒ÷ sé{ú*”•¦ré;8+ré»(D*Äryº(000`f0É&ùÁ¤=˜¬‘ŒÿA$?˜ü"ÿCÈ ÙÿÀ$Då(9„Éÿà$ûÿ?àXþÿÿ&ÉåêÉÈie£\endstream endobj 408 0 obj << /Filter /FlateDecode /Length 328 >> stream xÚ’ÏJÄ0‡',ä`_@lžÀn—ý£ ÖìAГñ¤…* ÄöÑò(y„{X6Næ'XaštòÍ´Ì,–G3;±K~{2³•y1ó)Ÿå˜ÏfU›òÖΧ¦¼ä·¦¬¯ìÛëû“)W×ç¶2åÚÞUvroêµ%Ê7”VŒžwcÏÈcÜ2 _DÆ¿æàÀ—)Ž»žtàð@ÚK‚¬#ʶ”KÚ*vÀ©ñÇÀGBš]ˆœŒKp­1úÿ¢…à¼`/åtz<~ %Ÿð élÙfŒ|=€ÌîO¶CÙ’hØv;‡V@sМìÜ YÐ4 -ƒ–AË¡¸|Ik`7ÒNFj'Cì;À°ì@©s*P/PIS^Ëèø4œ‚‡‡ÎhÙc·æ¢67æRß̨endstream endobj 409 0 obj << /Filter /FlateDecode /Length 312 >> stream xÚÍÒ»JÄ@à˜&o°™Ð\ØÍ"uSne!Vj)¨(X9y´ˆ…¥o ó)S„gΉ²¢…¥Ó|äÌ%s~¦˜ïLMjæf;7Ejv§æ"Ó7z–S‘> ™9¿Ò‹J''f–ëäÊ:©ŽÌÝíý¥NÇû&ÓÉÒœf&=ÓÕÒ¨À”#&Pñ5AOt°A£œÐ`ÖmUï~Ô³Ÿ‚jÊ–þJ.óuË—ê•oåÅÁ¯5Jjó ˆ©éˆZŽ'¤@Z‰Ç}AýÑ|*OêMìHó ·Iù+íˆk†O%3Œ´?q2'X74BÍ\ËG¤‡‘=éÏCÝNÀ½{‚5""ìÕœRØpf“é·”'zÉÃJV¥‹¨€ˆ_~=´@ò‹}MTz¥?Î×À¥endstream endobj 410 0 obj << /Filter /FlateDecode /Length 118 >> stream xÚ3±Ð33T0P0b#K …C®B.c ßÄI$çr9yré‡+›pé{E¹ô=}JŠJS¹ôœ ¹ô]¢ÆÄryº(ü‚hCýÿù üF‰¡C€£ yØb•ËÕ“+ À¹——endstream endobj 411 0 obj << /Filter /FlateDecode /Length 374 >> stream xÚÓ1KÃ@Àñ 7´_ Øûš¤CI P¨Ì èÔAœÔQ¨¢s#~±lý·¹IÆ !ÏÜ»{w5‰Ö Ç—„ð?.qŸEs‰™8‰4i"bþÌS5ŒD™[÷O|•ñp#Ò9/Õœ‡Ù•x}y{äáêú\Ä<\‹ÛXDw<[ ¨™ºvÿ1ÈÑc(Ù²A2¿-õ#ÌkgSrí̪öC›wYÉX@–­ÁÙ7öŠ®skÏØÏ».БÕÒy§=ê¹DŸ¨e©=AW=/Ô2ÕNе³ ÞöÜPºÇ¯›ø{Ro0åR¼¶öó¾ J7ñÞ=Œ7ÆàÑ€KgŒŸW/´1>1®1x;à†ÒM¼4†Ÿö$.ÊÕñd¬s».(ãM.Æ[·Á£A—ÎmüdÐ¥c|b];·ÁÛA7”ŽñÒíYû@¹ÊïÖ|äÃÞ[3Ø3çOçÝ×/nœéþËæØ÷<.;Çí=ó‹ŒßðoZÎ)endstream endobj 412 0 obj << /Filter /FlateDecode /Length 287 >> stream xڕѽNÃ0à‹> stream xÚµ‘±JÄ@†ÿ%ÅÂ4yƒË¼€nnàà pž` A+ ¹J--îP¸B¸«Ø×\_ðSE;ò%ë_ûtòøBë–Ü=û’ܵl“koøuÿöLn}{ɹ ?T\n©Ý0`Bùòð¡h§"à(»Ù vì3…,r£Vˆç ½(R0§(™ºZ1̾‘?¡^3šAÑï RàWÄ^þS…ãML j×3ô)0}1Fè3‘õ¹fšÅš l—iX6e–§©î*y’›XˆÞ i}l±éæM‹ó£«–îè S-zYendstream endobj 414 0 obj << /Type /ObjStm /Length 1404 /Filter /FlateDecode /N 84 /First 734 >> stream xœXÁnÜ6½÷+xÌ^Ö"9Ã!À@Ñ¢½iÐæÐ´ÈÁµ×…ÇìuÑþ}ßP’—%ÙÊÁ&5¢Fï=Ÿ¸$˦3dƒñÚˆFõ‚6›œ!×紵ƅˆÖO„ÖòïÐÚ²akÑÃÏ;1!´ÑˆÕ6 ȃWE<Þš0Þ;“’¶ÞØN_ìÉXkûìÖ1õÍ…ÛÖ{MÔi d@%êÐ!íXt‘3622‹2l+A;È;$$dŽ ™ BæDÚQþ 0t™ X¥ÎÕŠ½jƒW0¡“ð³q^en—5bAG…ãhçÇ:ŠP\€^T[ÁSÈ P@æ¨02G‰Yc—²Ø:]XAhv߉F’ñVÅÆ…ϳþÞé4!»wAoyã½Õ[„þ˜x^dV*$ÈL ™ñbŸ1 2sD$"sÀQDæ AfQ`™E…ŠÈ­F9²F9uAæ¤Ó‘9%à"³H ÐáQÒj°N#N«R#^ëO#Zx€@y‚µZRPeñOÕŸ¢>`¿{ûÖœýhÞ<.7÷w{»3g¿™³Ÿï?Þ›óóáîŸÆaüjÎ~ÿô‡–Ö^ %w²OûîéöÖ|,Ü~ø÷˜D¾úpñp¸;fùúãÍñöב^êÓׇëë®Á.ºN}Ä‚ö­ïã! ñÃù¿›Çšm„ { Z©"Àó><þÉvPÒqnJG ßöðq™©(|Oû—ý˜|o (#]ÛK’ÇqCÙ/L™o)£&÷%×P”ÓåqFGÊaB™»avÊ™ôµë>–û¥ßP§ê[f{ÜS÷~•:WÔá–/SÏ”Jz«³{Ÿcã3¥Lî”?H# /H’6Hâm%‰¬J’jIhº®Øq€}5¬å«ÚåIž,˸֩£¬û-ÕÓÈæeò3F·,Set´`t½L¾¶=ßØÞ·øDQey¸¾ªÂ¬UÎ. Yf¼Cd/üŒ •]Òª]úÚ.ij—LE‹@†Š˜TÊ .PšY‹”¨²CZµCªí¦vH¯_»iúø†êë+¼¯…^Ù¯ÚÕvÆS;Ӣ̅E…êÃŒ<¯ËÐÿ¹«â›m‡bý«¡h»Žs_«¥éáÊŸxÕŸ¨ö'nüévœã×µÿÈÈU)i¨ÎQŸÖoìÂÆj(—†7Hµ´+¿ «~õßðÔoX§)ž¬X¿0ÏvüLcÖ3ì‹bK)Q¦sSX™FX5 ®M#4{,ßsy^a¶ð?>­:¹hK¸™FYõK»°Ùâ™ïÆbù†Ê]ª»„Ú]B³Ùòß«K9­ÃØ…o1üPYŒ¬ZL¨-F‹–ÜóâÂôõ^l9,lqxf×·ÈAVWO¨MC¦¦Á£§‡¢ÂFä~ºrž>ýtsˆ—Ÿ¸Œ]:Þ7Ðs6»e°ß2˜· Þ„9m\ïÂ^L[oA[t¦-:×®ÿÒà¸aðð åà-:óùµµñÃý–Ÿe]ÇÓêw…¹|üïëÁœýòt¼½¹;<Ž¿»ùrs|ÄëÞ|½øûÍmèa'……öþâË¡¾­'+špˆð.±‘°Ëg-E[d=t)"q—O_ŠHÚåc|^çFl2 7õXé”ÑïòñÒ) Ø¥DªÐ¥š‘—8x´« À¤ú¬7À”jtEReûI)ÏŒôt´ŽaŸGC}U› =ò«ƒJ>tK8Ë/où»¿„ZŽÑ£À:¿Jâ$˜å›ÀS ®«cšÑM2jB_Ì»jc?‡WAø F?‘Hg’&ÀtfhL'‡ `ÿ²0]endstream endobj 499 0 obj << /Filter /FlateDecode /Length 76 >> stream xÚQQAåHi”¹a¬·ÆÃ `"   ACsøè²~úôF$ZS¢Ô„¹ {+û!fš´g^tÉðõ®ín¢íë>O£> endstream endobj 500 0 obj << /Filter /FlateDecode /Length 73 >> stream xÚ‰ 0 ÂÐ… ô 3Ã9YXh…€€‚†váG$D‰>}MáÙJ”š0iÊ‚MûœU#¤I/í™]ïÚ¹¡½™­Å£>endstream endobj 501 0 obj << /Filter /FlateDecode /Length 121 >> stream xÚMQA"ÈC‰k°c‚kpŸ~m„MÀs࣠À€€€€† çßÞ) qàæ¹ªèƒ6˜CZ°é¿p§„2ëA-ÔF¥+i³ºï¾Ódž> stream xÚ‹AA ¢ AèÁÄY¨™Šáºü’ pŠ‚G%,[Y¿&O#"Åd;f:Ón´mïüqö¸}úÜC*9endstream endobj 503 0 obj << /Filter /FlateDecode /Length 71 >> stream xÚŠAA ÂÐ…ž›š¹jj1,å @C`€(|]{õ‰a#Ï8*HÅÙÁŠobÑ>æØI]Q‚¶Ê‚ ¼5´endstream endobj 504 0 obj << /Filter /FlateDecode /Length 66 >> stream xÚÌQ PP¹’Gš[FÏóc;6ÀB@@AC÷û qqôgêjÂÁ÷„3¯¹6fò-MÚîî4mÿ8x•Æ3Æendstream endobj 505 0 obj << /Filter /FlateDecode /Length 113 >> stream xÚŽQ ACŸ”ÓQA˜™ŒˆM°0 £¡Ç^Ó)M‚£$júç/ ‰Ð ;^‡¢¼`‰¤†ÊröÞ°Åvòˆ§¨ Rå.ûˆ“œæk:ÕÝn×”¶or‹Û\Ïq> stream xÚŒA A Ñ…žKõ 3ˆáX„Ì4¾M¿ù(‰ã¢Ü»à¹"4p†ëƒE×nÜFL”tf•¶ûë›hŸø:9Jendstream endobj 507 0 obj << /Filter /FlateDecode /Length 74 >> stream xÚŒ A G‚ЃššY1\{¤ ,†¢à9>IÂZäùlyˆöVëÀ˜i¼èµý'Š+ªÔô:jÜ+¸—N/zßÒÎ<Ñendstream endobj 508 0 obj << /Filter /FlateDecode /Length 100 >> stream xÚ-Ž E1BÍe ó˜Æ27Œß=¾az& h(|íîzÝ“¨ÙÜäùôÞ¬}Ä·D9¥&LZ°hµs¾ø–1ž•ÜNnÙ4é¥=ó¢?>uã²Ýÿ¢Æ#>ð±«$¸d[endstream endobj 509 0 obj << /Filter /FlateDecode /Length 182 >> stream xÚO± Ã0 ã?þ@7ô ƒ‹×` CWíó@—pô 9@ø U-AP€HPh€mÀè†NÐAá90 “˜ŽC•n½‚g{½íwiZ¡ÃH›°Ió°ƒvÈ®xü«Yf§Ñ•¼Å;Ç«Ïù~À­hNø„»ùé;ÏÑεDÈMtQ7µ];”R–æ:ÇúŒµ*¸Â-®"CŒêˆŒ]¢š‘™õ¤˜73> stream xÚ-N¹Ä@S?Û5l$.dSzp„Ê/wFàܱs{sÌ0|BÐa€  XÀÓöÖ nQ¾æH‡<@  CôÝ{h”r³¨A–ª”¸&¹È“äçòš¸¸.²¶žªÂ:û»T%Ý÷:î“ð,¾ïqj;mN˜‚ !¤Æ!ƒ,4—þÎL›É•¡–¯P3þº._4NzÝendstream endobj 511 0 obj << /Filter /FlateDecode /Length 98 >> stream xÚ-‹ QBÉE ò†2†ñãí9O " `A‚ չ຦ºæÔÃTzto®–-GeM¸œ`Ѧ3žxº7BĸV24Üd'»cNô³§mÙ5»ýܸÄÛìÄHbÂendstream endobj 512 0 obj << /Type /XRef /Length 780 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 85 0 R /Root 84 0 R /Size 513 /ID [<310d21f5ea4858d71987082e2c33ddba>] >> stream xœí–ëkÎQÀÏ9ÏfsÛãÁì1lDæÛ\Öì"Éýi¥¼/D ï()×RJ"µx¥k®3åæ ^°f® ¹d.óxÎ络ï_À {^|úö=ç÷½ŸsgüÏYc¢ð£q^a;ø1ab§ë’rz“ï~ÚÏìÛž‘jÏø&Ï”-ž·<Ý<ÏXgôµžù+=S»Ã†$íØm¬Vb§Õ3wòsö”zö¿Ïž5ž™¿XÅKÉ>ômìŒzæÕ³Zá-ç³úš¯6¢ç[s‰Ø{Z"±èí|ØâÝöرÏÔ*mT­Ž‚?aü(9¿ƒ‡ÃtØö‚ÔÓ.‚=Ôj?ø>‚GÉ¥6øuC‘?ÁÑp<ÌU'±S|M%°¦À‹JN…y°öU‘G`!ì¢êö–ª¨¤nåp¢Ú‡iªà—P1;:奧êÈ4øÞT}9?Ãh` ¾T6[TU%£¯ª#’õª}™Ù¶ÇTý_¨NÝ s#ÕtÅUµ%’U æÖZU‡ð^N!_U±e¨þ6ªº…ÄiŽ«NI7ª>T´EªWàcÕñþ]E•ªV¥Jw`7üÊ”6‡LÝ5ÃCTZU¯é¦iP1\WqŠÇì¹|@±9ì1—ñ(çqœúVzQªç„ÜÍ•E½š ±Íþ¹j’¥§ïátx ;'‘ß)_ØtåJS¬ú%§c¦ªùö¯C.€ÒGλÍüÓAÛÞM™ÿòPO·]u¼)ø5äå Õ¤‰ý7ÝÎ1á`Á-D^ùÖ ÃÚA4rÏpk¹ÕÈká4K‘7‡¬Ý^Èml+ ­ºI—݆Py[…f?²Ü¥Õ,ôejº¤ rÈy|ÅìÞ‘ösÇ»Ð~–%—¸ª@–š@¹CcgªÊ:'xqU!#WæÜÜCS©ìOF³\ÍØ¨ß‚§ùtäh¡© YËIt;‘¥žÜÛNnïe0ùþÚ¶jîóÏÿ?tðo2Y5Ðÿ[³»é¾Ì w£ÝŠf2ÿ¾ÌdÙ³ M²Ü0òÎ6¿öªÛ endstream endobj startxref 227675 %%EOF geosphere/build/0000755000176200001440000000000014677403144013344 5ustar liggesusersgeosphere/build/vignette.rds0000644000176200001440000000033414677403144015703 0ustar liggesusers‹uQÍ‚0 0Иð»xå) ‰ñbŒ¯ ”Ÿ¨3Ä›O.S›´ëÖïk¿f§!Ä&”ZÄv0u| SôºE(qñôRe‘‚à *£¸Þ ­d|‹t.Ó’é XO`Î<…ÿ‹81ŠËÁ8ç¿KµЉàW( þlˆ¸y~þæ[µA™ïà^IÕqF˜i‹¡a~nî1×ýÅÙoÂ6µ¦†¯þ#ý®’UÐíà5_ñÀP£™‹F^š‹.b®y(ä7º_SxÌgeosphere/build/partial.rdb0000644000176200001440000000007514677403034015471 0ustar liggesusers‹‹àb```b`aad`b1…À€… H02°0piÖ¼ÄÜÔb C"Éðh¿eÍ7geosphere/man/0000755000176200001440000000000014427774737013034 5ustar liggesusersgeosphere/man/gcIntersect.Rd0000644000176200001440000000171014131143521015541 0ustar liggesusers\name{gcIntersect} \Rdversion{1.1} \alias{gcIntersect} \title{ Intersections of two great circles } \description{ Get the two points where two great cricles cross each other. Great circles are defined by two points on it. } \usage{ gcIntersect(p1, p2, p3, p4) } \arguments{ \item{p1}{Longitude/latitude of a single point, in degrees; can be a vector of two numbers, a matrix of 2 columns (first one is longitude, second is latitude) or a SpatialPoints* object} \item{p2}{As above} \item{p3}{As above} \item{p4}{As above} } \value{ two points for each pair of great circles } \seealso{ \code{ \link[geosphere]{gcIntersectBearing} } } \references{ \url{https://www.edwilliams.org/intersect.htm} } \author{ Robert Hijmans, based on equations by Ed Williams (see reference) } \examples{ p1 <- c(5,52); p2 <- c(-120,37); p3 <- c(-60,0); p4 <- c(0,70) gcIntersect(p1,p2,p3,p4) } \keyword{ spatial } geosphere/man/alongTrackDistance.Rd0000644000176200001440000000171413472155746017056 0ustar liggesusers\name{alongTrackDistance} \Rdversion{1.1} \alias{alongTrackDistance} \title{ Along Track Distance } \description{ The "along track distance" is the distance from the start point (p1) to the closest point on the path to a third point (p3), following a great circle path defined by points p1 and p2. See \code{\link{dist2gc}} for the "cross track distance" } \usage{ alongTrackDistance(p1, p2, p3, r=6378137) } \arguments{ \item{p1}{longitude/latitude of point(s). Can be a vector of two numbers, a matrix of 2 columns (first one is longitude, second is latitude) or a SpatialPoints* object} \item{p2}{as above} \item{p3}{as above} \item{r}{radius of the earth; default = 6378137m} } \value{ A distance in units of r (default is meters) } \author{ Ed Williams and Robert Hijmans } \seealso{ \code{ \link[geosphere]{dist2gc} } } \examples{ alongTrackDistance(c(0,0),c(60,60),c(50,40)) } \keyword{ spatial } geosphere/man/refEllipsoids.Rd0000644000176200001440000000117513472155746016123 0ustar liggesusers\name{refEllipsoids} \alias{refEllipsoids} \title{Reference ellipsoids} \description{ This function returns a data.frame with parameters \code{a} (semi-major axis) and \code{1/f} (inverse flattening) for a set of reference ellipsoids. } \usage{ refEllipsoids() } \note{ To compute parameter \code{b} you can do } \value{ data.frame } \seealso{ \code{ \link[geosphere]{area}, \link[geosphere]{perimeter} } } \author{Robert J. Hijmans } \examples{ e <- refEllipsoids() e[e$code=='WE', ] #to compute semi-minor axis b: e$b <- e$a - e$a / e$invf } \keyword{methods} \keyword{spatial} geosphere/man/gcMaxLat.Rd0000644000176200001440000000231714131143521014773 0ustar liggesusers\name{gcMaxLat} \Rdversion{1.1} \alias{gcMaxLat} \title{ Highest latitude on a great circle } \description{ What is northern most point that will be reached when following a great circle? Computed with Clairaut's formula. The southern most point is the \code{\link[geosphere]{antipode}} of the northern-most point. This does not seem to be very precise; and you could use optimization instead to find this point (see examples) } \usage{ gcMaxLat(p1, p2) } \arguments{ \item{p1}{longitude/latitude of point(s). Can be a vector of two numbers, a matrix of 2 columns (first one is longitude, second is latitude) or a SpatialPoints* object} \item{p2}{as above} } \value{ A matrix with coordinates (longitude/latitude) } \references{ \url{https://www.edwilliams.org/ftp/avsig/avform.txt} \url{https://www.movable-type.co.uk/scripts/latlong.html} } \author{ Ed Williams, Chris Veness, Robert Hijmans } \seealso{ \code{\link[geosphere]{gcLat}, \link[geosphere]{gcLon}} } \examples{ gcMaxLat(c(5,52), c(-120,37)) # Another way to get there: f <- function(lon){gcLat(c(5,52), c(-120,37), lon)} optimize(f, interval=c(-180, 180), maximum=TRUE) } \keyword{ spatial } geosphere/man/distMeeus.Rd0000644000176200001440000000546614131143521015245 0ustar liggesusers\name{distMeeus} \Rdversion{1.1} \alias{distMeeus} \title{ 'Meeus' great circle distance } \description{ The shortest distance between two points on an ellipsoid (the 'geodetic'), according to the 'Meeus' method. \code{\link{distGeo}} should be more accurate. } \usage{ distMeeus(p1, p2, a=6378137, f=1/298.257223563) } \arguments{ \item{p1}{longitude/latitude of point(s), in degrees 1; can be a vector of two numbers, a matrix of 2 columns (first one is longitude, second is latitude) or a SpatialPoints* object} \item{p2}{as above; or missing, in which case the sequential distance between the points in p1 is computed} \item{a}{numeric. Major (equatorial) radius of the ellipsoid. The default value is for WGS84 } \item{f}{numeric. Ellipsoid flattening. The default value is for WGS84 } } \details{ Parameters from the WGS84 ellipsoid are used by default. It is the best available global ellipsoid, but for some areas other ellipsoids could be preferable, or even necessary if you work with a printed map that refers to that ellipsoid. Here are parameters for some commonly used ellipsoids: \tabular{rlll}{ \tab \code{ ellipsoid } \tab \code{ a } \tab \code{ f } \cr \tab \code{ WGS84 } \tab \code{ 6378137 } \tab \code{ 1/298.257223563 } \cr \tab \code{ GRS80 } \tab \code{ 6378137 } \tab \code{ 1/298.257222101 } \cr \tab \code{ GRS67 } \tab \code{ 6378160 } \tab \code{ 1/298.25 } \cr \tab \code{ Airy 1830 } \tab \code{ 6377563.396 } \tab \code{ 1/299.3249646 } \cr \tab \code{ Bessel 1841 } \tab \code{ 6377397.155 } \tab \code{ 1/299.1528434 } \cr \tab \code{ Clarke 1880 } \tab \code{ 6378249.145 } \tab \code{ 1/293.465 } \cr \tab \code{ Clarke 1866 } \tab \code{ 6378206.4 } \tab \code{ 1/294.9786982 } \cr \tab \code{ International 1924 } \tab \code{ 6378388 } \tab \code{ 1/297 } \cr \tab \code{ Krasovsky 1940 } \tab \code{ 6378245 } \tab \code{ 1/298.2997381 } \cr } more info: \url{https://en.wikipedia.org/wiki/Reference_ellipsoid} } \value{ Distance value in the same units as parameter \code{a} of the ellipsoid (default is meters) } \note{ This algorithm is also used in the \code{spDists} function in the sp package } \references{ Meeus, J., 1999 (2nd edition). Astronomical algoritms. Willman-Bell, 477p. } \author{ Robert Hijmans, based on a script by Stephen R. Schmitt } \seealso{ \code{\link[geosphere]{distGeo}, \link{distVincentyEllipsoid}, \link{distVincentySphere}, \link{distHaversine}, \link{distCosine}} } \examples{ distMeeus(c(0,0),c(90,90)) # on a 'Clarke 1880' ellipsoid distMeeus(c(0,0),c(90,90), a=6378249.145, f=1/293.465) } \keyword{ spatial } geosphere/man/centroid.Rd0000644000176200001440000000255213472325401015111 0ustar liggesusers\name{centroid} \alias{centroid} \alias{centroid,matrix-method} \alias{centroid,data.frame-method} \alias{centroid,SpatialPolygons-method} \title{Centroid of spherical polygons} \description{ Compute the centroid of longitude/latitude polygons. Unlike other functions in this package, there is no spherical trigonometry involved in the implementation of this function. Instead, the function projects the polygon to the (conformal) Mercator coordinate reference system, computes the centroid, and then inversely projects it to longitude and latitude. This approach fails for polygons that include one of the poles (and is rather biased for anything close to the poles). The function should work for polygons that cross the -180/180 meridian (date line). } \usage{ centroid(x, ...) } \arguments{ \item{x}{SpatialPolygons* object, or a 2-column matrix or data.frame reprenting a single polgyon (longitude/latitude)} \item{...}{Additional arguments. None implemented} } \note{ For multi-part polygons, the centroid of the largest part is returned. } \value{ A matrix (longitude/latitude) } \seealso{ \code{ \link[geosphere]{area}, \link[geosphere]{perimeter} } } \author{Robert J. Hijmans } \examples{ pol <- rbind(c(-180,-20), c(-160,5), c(-60, 0), c(-160,-60), c(-180,-20)) centroid(pol) } \keyword{methods} \keyword{spatial} geosphere/man/distCosine.Rd0000644000176200001440000000211514131143521015373 0ustar liggesusers\name{distCosine} \Rdversion{1.1} \alias{distCosine} \title{ 'Law of cosines' great circle distance } \description{ The shortest distance between two points (i.e., the 'great-circle-distance' or 'as the crow flies'), according to the 'law of the cosines'. This method assumes a spherical earth, ignoring ellipsoidal effects. } \usage{ distCosine(p1, p2, r=6378137) } \arguments{ \item{p1}{longitude/latitude of point(s). Can be a vector of two numbers, a matrix of 2 columns (first one is longitude, second is latitude) or a SpatialPoints* object} \item{p2}{as above} \item{r}{radius of the earth; default = 6378137 m} } \value{ Vector of distances in the same unit as \code{r} (default is meters) } \references{ \url{https://en.wikipedia.org/wiki/Great_circle_distance} } \author{ Robert Hijmans } \seealso{ \code{\link[geosphere]{distGeo}, \link[geosphere]{distHaversine}, \link[geosphere]{distVincentySphere}, \link[geosphere]{distVincentyEllipsoid}, \link{distMeeus}} } \examples{ distCosine(c(0,0),c(90,90)) } \keyword{ spatial } geosphere/man/intermediate.Rd0000644000176200001440000000263214131210620015740 0ustar liggesusers\name{intermediate} \Rdversion{1.1} \alias{gcIntermediate} \title{ Intermediate points on a great circle (sphere) } \description{ Get intermediate points (way points) between the two locations with longitude/latitude coordinates. gcIntermediate is based on a spherical model of the earth and internally uses \code{\link{distCosine}}. } \usage{ gcIntermediate(p1, p2, n=50, breakAtDateLine=FALSE, addStartEnd=FALSE, sp=FALSE, sepNA) } \arguments{ \item{p1}{longitude/latitude of a single point, in degrees. This can be a vector of two numbers, a matrix of 2 columns (first one is longitude, second is latitude) or a SpatialPoints* object} \item{p2}{as for \code{p1}} \item{n}{integer. The desired number of intermediate points} \item{breakAtDateLine}{logical. Return two matrices if the dateline is crossed?} \item{addStartEnd}{logical. Add p1 and p2 to the result?} \item{sp}{logical. Return a SpatialLines object?} \item{sepNA}{logical. Rather than as a list, return the values as a two column matrix with lines seperated by a row of NA values? (for use in 'plot')} } \value{ matrix or list with intermediate points } \references{ \url{https://www.edwilliams.org/avform147.htm#Intermediate} } \author{ Robert Hijmans based on code by Ed Williams (great circle) } \examples{ gcIntermediate(c(5,52), c(-120,37), n=6, addStartEnd=TRUE) } \keyword{ spatial } geosphere/man/perimeter.Rd0000644000176200001440000000321114131145601015262 0ustar liggesusers\name{perimeter} \Rdversion{1.1} \alias{perimeter} \alias{perimeter,matrix-method} \alias{perimeter,data.frame-method} \alias{perimeter,SpatialPolygons-method} \alias{perimeter,SpatialLines-method} \title{ Compute the perimeter of a longitude/latitude polygon } \description{ Compute the perimeter of a polygon (or the length of a line) with longitude/latitude coordinates, on an ellipsoid (WGS84 by default) } \usage{ \S4method{perimeter}{matrix}(x, a=6378137, f=1/298.257223563, ...) \S4method{perimeter}{SpatialPolygons}(x, a=6378137, f=1/298.257223563, ...) \S4method{perimeter}{SpatialLines}(x, a=6378137, f=1/298.257223563, ...) } \arguments{ \item{x}{Longitude/latitude of the points forming a polygon or line; Must be a matrix of 2 columns (first one is longitude, second is latitude) or a SpatialPolygons* or SpatialLines* object} \item{a}{major (equatorial) radius of the ellipsoid. The default value is for WGS84 } \item{f}{ellipsoid flattening. The default value is for WGS84 } \item{...}{Additional arguments. None implemented} } \value{ Numeric. The perimeter or length in m. } \seealso{ \code{ \link{areaPolygon}, \link[geosphere]{centroid} } } \author{ This function calls GeographicLib code by C.F.F. Karney } \references{ C.F.F. Karney, 2013. Algorithms for geodesics, J. Geodesy 87: 43-55. \doi{10.1007/s00190-012-0578-z}. Addenda: \url{https://geographiclib.sourceforge.io/geod-addenda.html}. Also see \url{https://geographiclib.sourceforge.io/} } \examples{ xy <- rbind(c(-180,-20), c(-140,55), c(10, 0), c(-140,-60), c(-180,-20)) perimeter(xy) } \keyword{ spatial } geosphere/man/dist2gc.Rd0000644000176200001440000000267014131143521014634 0ustar liggesusers\name{dist2gc} \Rdversion{1.1} \alias{dist2gc} \title{ Cross Track Distance } \description{ Compute the distance of a point to a great-circle path (also referred to as the cross track distance or cross track error). The great circle is defined by \code{p1} and \code{p2}, while \code{p3} is the point away from the path. } \usage{ dist2gc(p1, p2, p3, r=6378137, sign=FALSE) } \arguments{ \item{p1}{Start of great circle path. longitude/latitude of point(s). Can be a vector of two numbers, a matrix of 2 columns (first one is longitude, second is latitude) or a SpatialPoints* object} \item{p2}{End of great circle path. As above} \item{p3}{Point away from the great cricle path. As for p2} \item{r}{radius of the earth; default = 6378137} \item{sign}{logical. If \code{TRUE}, a negative sign is used to indicated that the points are to the left of the great circle} } \value{ A distance in units of \code{r} (default is meters) If \code{sign=TRUE}, the sign indicates which side of the path p3 is on. Positive means right of the course from p1 to p2, negative means left. } \author{ Ed Williams and Robert Hijmans } \seealso{ \code{\link{dist2Line}, \link{alongTrackDistance} } } \references{ \url{https://www.movable-type.co.uk/scripts/latlong.html} \url{https://www.edwilliams.org/ftp/avsig/avform.txt} } \examples{ dist2gc(c(0,0),c(90,90),c(80,80)) } \keyword{ spatial } geosphere/man/bearing.Rd0000644000176200001440000000300614131145600014676 0ustar liggesusers\name{bearing} \Rdversion{1.1} \alias{bearing} \title{ Direction of travel } \description{ Get the initial bearing (direction; azimuth) to go from point \code{p1} to point \code{p2} (in longitude/latitude) following the shortest path on an ellipsoid (geodetic). Note that the bearing of travel changes continuously while going along the path. A route with constant bearing is a rhumb line (see \code{\link[geosphere]{bearingRhumb}}). } \usage{ bearing(p1, p2, a=6378137, f=1/298.257223563) } \arguments{ \item{p1}{longitude/latitude of point(s). Can be a vector of two numbers, a matrix of 2 columns (first one is longitude, second is latitude) or a SpatialPoints* object} \item{p2}{as above. Can also be missing, in which case the bearing is computed going from the first point to the next and continuing along the following points} \item{a}{major (equatorial) radius of the ellipsoid. The default value is for WGS84 } \item{f}{ellipsoid flattening. The default value is for WGS84 } } \note{use \code{f=0} to get a bearing on a sphere (great circle)} \value{ Bearing in degrees } \author{ Robert Hijmans } \references{ C.F.F. Karney, 2013. Algorithms for geodesics, J. Geodesy 87: 43-55. \doi{10.1007/s00190-012-0578-z}. Addenda: \url{https://geographiclib.sourceforge.io/geod-addenda.html}. Also see \url{https://geographiclib.sourceforge.io/} } \seealso{ \code{ \link[geosphere]{bearingRhumb} } } \examples{ bearing(c(10,10),c(20,20)) } \keyword{ spatial } geosphere/man/greatCircle.Rd0000644000176200001440000000163114131210620015510 0ustar liggesusers\name{greatCircle} \Rdversion{1.1} \alias{greatCircle} \title{ Great circle } \description{ Get points on a great circle as defined by the shortest distance between two specified points } \usage{ greatCircle(p1, p2, n=360, sp=FALSE) } \arguments{ \item{p1}{longitude/latitude of point(s). Can be a vector of two numbers, a matrix of 2 columns (first one is longitude, second is latitude) or a SpatialPoints* object} \item{p2}{as above} \item{n}{The requested number of points on the Great Circle} \item{sp}{Logical. Return a SpatialLines object?} } \value{ A matrix of points, or a list of such matrices (e.g., if multiple bearings are supplied) } \references{ \url{https://www.edwilliams.org/avform147.htm#Int} } \author{ Robert Hijmans, based on a formula provided by Ed Williams } \examples{ greatCircle(c(5,52), c(-120,37), n=36) } \keyword{ spatial } geosphere/man/destPointRhumb.Rd0000644000176200001440000000214614131210620016235 0ustar liggesusers\name{destPointRhumb} \Rdversion{1.1} \alias{destPointRhumb} \title{ Destination along a rhumb line } \description{ Calculate the destination point when travelling along a 'rhumb line' (loxodrome), given a start point, direction, and distance. } \usage{ destPointRhumb(p, b, d, r = 6378137) } \arguments{ \item{p}{longitude/latitude of point(s). Can be a vector of two numbers, a matrix of 2 columns (first one is longitude, second is latitude) or a SpatialPoints* object} \item{b}{bearing (direction) in degrees} \item{d}{distance; in the same unit as \code{r} (default is meters)} \item{r}{radius of the earth; default = 6378137 m} } \value{ Coordinates (longitude/latitude) of a point } \references{ \url{https://www.edwilliams.org/avform147.htm#Rhumb} \url{https://www.movable-type.co.uk/scripts/latlong.html} \url{https://en.wikipedia.org/wiki/Rhumb_line} } \author{ Chris Veness; ported to R by Robert Hijmans } \seealso{ \code{ \link[geosphere]{destPoint} } } \examples{ destPointRhumb(c(0,0), 30, 100000, r = 6378137) } \keyword{ spatial } geosphere/man/geodesic.Rd0000644000176200001440000000663114131145601015061 0ustar liggesusers\name{geodesic} \Rdversion{1.1} \alias{geodesic} \alias{geodesic_inverse} \title{ geodesic and inverse geodesic problem } \description{ Highly accurate estimate of the 'geodesic problem' (find location and azimuth at arrival when departing from a location, given an direction (azimuth) at departure and distance) and the 'inverse geodesic problem' (find the distance between two points and the azimuth of departure and arrival for the shortest path. Computations are for an ellipsoid (default is WGS84 ellipsoid). This is a direct implementation of the the GeographicLib code by C.F.F. Karney that is also used in several other functions in this package (for example, in \code{\link{distGeo}} and \code{\link{areaPolygon}}). } \usage{ geodesic(p, azi, d, a=6378137, f=1/298.257223563, ...) geodesic_inverse(p1, p2, a=6378137, f=1/298.257223563, ...) } \arguments{ \item{p}{longitude/latitude of point(s). Can be a vector of two numbers, a matrix of 2 columns (first column is longitude, second column is latitude) or a SpatialPoints* object} \item{p1}{as above} \item{p2}{as above} \item{azi}{numeric. Azimuth of departure in degrees} \item{d}{numeric. Distance in meters} \item{a}{numeric. Major (equatorial) radius of the ellipsoid. The default value is for WGS84 } \item{f}{numeric. Ellipsoid flattening. The default value is for WGS84 } \item{...}{additional arguments (none implemented)} } \value{ Three column matrix with columns 'longitude', 'latitude', 'azimuth' (geodesic); or 'distance' (in meters), 'azimuth1' (of departure), 'azimuth2' (of arrival) (geodesic_inverse) } \details{ Parameters from the WGS84 ellipsoid are used by default. It is the best available global ellipsoid, but for some areas other ellipsoids could be preferable, or even necessary if you work with a printed map that refers to that ellipsoid. Here are parameters for some commonly used ellipsoids. \tabular{rlll}{ \tab \code{ ellipsoid } \tab \code{ a } \tab \code{ f } \cr \tab \code{ WGS84 } \tab \code{ 6378137 } \tab \code{ 1/298.257223563 } \cr \tab \code{ GRS80 } \tab \code{ 6378137 } \tab \code{ 1/298.257222101 } \cr \tab \code{ GRS67 } \tab \code{ 6378160 } \tab \code{ 1/298.25 } \cr \tab \code{ Airy 1830 } \tab \code{ 6377563.396 } \tab \code{ 1/299.3249646 } \cr \tab \code{ Bessel 1841 } \tab \code{ 6377397.155 } \tab \code{ 1/299.1528434 } \cr \tab \code{ Clarke 1880 } \tab \code{ 6378249.145 } \tab \code{ 1/293.465 } \cr \tab \code{ Clarke 1866 } \tab \code{ 6378206.4 } \tab \code{ 1/294.9786982 } \cr \tab \code{ International 1924 } \tab \code{ 6378388 } \tab \code{ 1/297 } \cr \tab \code{ Krasovsky 1940 } \tab \code{ 6378245 } \tab \code{ 1/298.2997381 } \cr } more info: \url{https://en.wikipedia.org/wiki/Reference_ellipsoid} } \author{ This function calls GeographicLib code by C.F.F. Karney } \references{ C.F.F. Karney, 2013. Algorithms for geodesics, J. Geodesy 87: 43-55. \doi{10.1007/s00190-012-0578-z}. Addenda: \url{https://geographiclib.sourceforge.io/geod-addenda.html}. Also see \url{https://geographiclib.sourceforge.io/} } \seealso{ \code{\link{distGeo}} } \examples{ geodesic(cbind(0,0), 30, 1000000) geodesic_inverse(cbind(0,0), cbind(90,90)) } \keyword{ spatial } geosphere/man/makepoly.Rd0000644000176200001440000000221713472155746015136 0ustar liggesusers\name{makePoly} \alias{makePoly} \alias{makeLine} \title{Add vertices to a polygon or line} \description{ Make a polygon or line by adding intermedate points (vertices) on the great circles inbetween the points supplied. This can be relevant when vertices are relatively far apart. It can make the shape of the object to be accurate, when plotted on a plane. \code{makePoly} will also close the polygon if needed. } \usage{ makePoly(p, interval=10000, sp=FALSE, ...) makeLine(p, interval=10000, sp=FALSE, ...) } \arguments{ \item{p}{a 2-column matrix (longitude/latitude) or a SpatialPolygons or SpatialLines object} \item{interval}{maximum interval of points, in units of r} \item{sp}{Logical. If \code{TRUE}, a SpatialPolygons object is retunred (depends on the 'sp' package)} \item{...}{additional arguments passed to distGeo} } \value{ A matrix } \author{Robert J. Hijmans } \examples{ pol <- rbind(c(-180,-20), c(-160,5), c(-60, 0), c(-160,-60), c(-180,-20)) plot(pol) lines(pol, col='red', lwd=3) pol2 = makePoly(pol, interval=100000) lines(pol2, col='blue', lwd=2) } \keyword{methods} \keyword{spatial} geosphere/man/mercator.Rd0000644000176200001440000000151213472155746015126 0ustar liggesusers\name{mercator} \Rdversion{1.1} \alias{mercator} \title{ Mercator projection } \description{ Transform longitude/latiude points to the Mercator projection. The main purpose of this function is to compute centroids, and to illustrate rhumb lines in the vignette. } \usage{ mercator(p, inverse=FALSE, r=6378137) } \arguments{ \item{p}{longitude/latitude of point(s). Can be a vector of two numbers, a matrix of 2 columns (first one is longitude, second is latitude) or a SpatialPoints* object} \item{inverse}{Logical. If \code{TRUE}, do the inverse projection (from Mercator to longitude/latitude} \item{r}{Numeric. Radius of the earth; default = 6378137 m} } \value{ matrix } \author{ Robert Hijmans } \examples{ a = mercator(c(5,52)) a mercator(a, inverse=TRUE) } \keyword{ spatial } geosphere/man/randomCoordinates.Rd0000644000176200001440000000211314131210415016735 0ustar liggesusers\name{randomCoordinates} \Rdversion{1.1} \alias{randomCoordinates} \alias{regularCoordinates} \title{ Random or regularly distributed coordinates on the globe } \description{ randomCoordinates returns a 'uniform random sample' in the sense that the probability that a point is drawn from any region is equal to the area of that region divided by the area of the entire sphere. This would not happen if you took a random uniform sample of longitude and latitude, as the sample would be biased towards the poles. regularCoordiaates returns a set of coordinates that are regularly distributed on the globe. } \usage{ randomCoordinates(n) regularCoordinates(N) } \arguments{ \item{n}{Sample size (number of points (coordinate pairs)) } \item{N}{Number of 'parts' in which the earth is subdived ) } } \value{ Matrix of lon/lat coordiantes } \author{ Robert Hijmans, based on code by Nils Haeck (regularCoordinates) and on suggstions by Michael Orion (randomCoordinates) } \examples{ randomCoordinates(3) regularCoordinates(1) } \keyword{ spatial } geosphere/man/geosphere-package.Rd0000644000176200001440000000443114677357207016673 0ustar liggesusers\name{geosphere-package} \alias{geosphere-package} \alias{geosphere} \docType{package} \title{Geosphere} \description{ This package implements functions that compute various aspects of distance, direction, area, etc. for geographic (geodetic) coordinates. Some of the functions are based on an ellipsoid (spheroid) model of the world, other functions use a (simpler, but less accuarate) spherical model. Functions using an ellipsoid can be recognized by having arguments to specify the ellipsoid's radius and flattening (\code{a} and \code{f}). By setting the value for \code{f} to zero, the ellipsoid becomes a sphere. There are also functions to compute intersections of of rhumb lines. There are also functions to compute the distance between points and polylines, and to characterize spherical polygons; for random sampling on a sphere, and to compute daylength. See the vignette \code{vignette('geosphere')} for examples. Geographic locations must be specified in latitude and longitude in degrees (NOT radians). Degrees are (obviously) in decimal notation. Thus 12 degrees, 30 minutes, 10 seconds = 12 + 30/60 + 10/3600 = 12.50278 degrees. The Southern and Western hemispheres have a negative sign. The default unit of distance is meter; but this can be adjusted by supplying a different radius \code{r} to functions. Directions are expressed in degrees (North = 0 and 360, East = 90, South = 180, and West = 270 degrees). } \author{ Robert Hijmans, using code by C.F.F. Karney and Chris Veness; formulas by Ed Williams; and with contributions from George Wang, Elias Pipping and others. Maintainer: Robert J. Hijmans } \references{ C.F.F. Karney, 2013. Algorithms for geodesics, J. Geodesy 87: 43-55. \doi{10.1007/s00190-012-0578-z}. Addenda: \url{https://geographiclib.sourceforge.io/geod-addenda.html}. Also see \url{https://geographiclib.sourceforge.io/} \url{https://www.edwilliams.org/avform147.htm} \url{https://www.movable-type.co.uk/scripts/latlong.html} \url{https://en.wikipedia.org/wiki/Great_circle_distance} \url{https://mathworld.wolfram.com/SphericalTrigonometry.html} } \section{Acknowledgements}{ David Purdy, Bill Monahan and others for suggestions to improve the package. } \keyword{ package } \keyword{ spatial } geosphere/man/gcLat.Rd0000644000176200001440000000142114131210620014313 0ustar liggesusers\name{gcLat} \Rdversion{1.1} \alias{gcLat} \title{ Latitude on a Great Circle } \description{ Latitude at which a great circle crosses a longitude } \usage{ gcLat(p1, p2, lon) } \arguments{ \item{p1}{Longitude/latitude of a single point, in degrees; can be a vector of two numbers, a matrix of 2 columns (first one is longitude, second is latitude) or a SpatialPoints* object} \item{p2}{As above} \item{lon}{Longitude} } \value{ A numeric (latitude) } \references{ \url{https://www.edwilliams.org/avform147.htm#Int} } \author{ Robert Hijmans based on a formula by Ed Williams } \seealso{ \code{\link[geosphere]{gcLon}, \link[geosphere]{gcMaxLat}} } \examples{ gcLat(c(5,52), c(-120,37), lon=-120) } \keyword{ spatial } geosphere/man/plotArrows.Rd0000644000176200001440000000211513472155746015466 0ustar liggesusers\name{plotArrows} \alias{plotArrows} \title{Plot} \description{ Plot polygons with arrow heads on each line segment, pointing towards the next vertex. This shows the direction of each line segment. } \usage{ plotArrows(p, fraction=0.9, length=0.15, first='', add=FALSE, ...) } \arguments{ \item{p}{Polygons (either a 2 column matrix or data.frame; or a SpatialPolygons* object} \item{fraction}{numeric between 0 and 1. When smaller then 1, interrupted lines are drawn} \item{length}{length of the edges of the arrow head (in inches)} \item{first}{Character to plot on first (and last) vertex } \item{add}{Logical. If \code{TRUE}, the plot is added to an existing plot} \item{...}{Additional arguments, see Details} } \author{Robert J. Hijmans} \note{ Based on an example in Software for Data Analysis by John Chambers (pp 250-251) but adjusted such that the line segments follow great circles between vertices. } \examples{ pol <- rbind(c(-180,-20), c(-160,5), c(-60, 0), c(-160,-60), c(-180,-20)) plotArrows(pol) } \keyword{methods} \keyword{spatial} geosphere/man/distm.Rd0000644000176200001440000000200014131143521014400 0ustar liggesusers\name{distm} \Rdversion{1.1} \alias{distm} \title{ Distance matrix } \description{ Distance matrix of a set of points, or between two sets of points } \usage{ distm(x, y, fun=distGeo) } \arguments{ \item{x}{longitude/latitude of point(s). Can be a vector of two numbers, a matrix of 2 columns (first one is longitude, second is latitude) or a SpatialPoints* object} \item{y}{Same as \code{x}. If missing, y is the same as x} \item{fun}{A function to compute distances (e.g., distCosine or distGeo)} } \value{ Matrix of distances } \references{ \url{https://en.wikipedia.org/wiki/Great_circle_distance} } \author{ Robert Hijmans } \seealso{ \code{\link[geosphere]{distGeo}, \link[geosphere]{distCosine}, \link[geosphere]{distHaversine}, \link[geosphere]{distVincentySphere}, \link[geosphere]{distVincentyEllipsoid}} } \examples{ xy <- rbind(c(0,0),c(90,90),c(10,10),c(-120,-45)) distm(xy) xy2 <- rbind(c(0,0),c(10,-10)) distm(xy, xy2) } \keyword{ spatial } geosphere/man/onGreatCircle.Rd0000644000176200001440000000160613472155746016037 0ustar liggesusers\name{onGreatCircle} \Rdversion{1.1} \alias{onGreatCircle} \title{ Is a point on a given great circle? } \description{ Test if a point is on a great circle defined by two other points. } \usage{ onGreatCircle(p1, p2, p3, tol=0.0001) } \arguments{ \item{p1}{Longitude/latitude of the first point defining a great circle, in degrees; can be a vector of two numbers, a matrix of 2 columns (first one is longitude, second is latitude) or a SpatialPoints* object} \item{p2}{as above for the second point} \item{p3}{the point(s) to be tested if they are on the great circle or not} \item{tol}{numeric. maximum distance from the great circle (in degrees) that is tolerated to be considered on the circle} } \value{ logical } \author{ Robert Hijmans } \examples{ onGreatCircle(c(0,0), c(30,30), rbind(c(-10 -11.33812), c(10,20))) } \keyword{ spatial } geosphere/man/gcLon.Rd0000644000176200001440000000143414131210620014327 0ustar liggesusers\name{gcLon} \Rdversion{1.1} \alias{gcLon} \title{ Longitude on a Great Circle } \description{ Longitudes at which a great circle crosses a latitude (parallel) } \usage{ gcLon(p1, p2, lat) } \arguments{ \item{p1}{longitude/latitude of point(s). Can be a vector of two numbers, a matrix of 2 columns (first one is longitude, second is latitude) or a SpatialPoints* object} \item{p2}{as above} \item{lat}{a latitude} } \value{ vector of two numbers (longitudes) } \references{ \url{https://www.edwilliams.org/avform147.htm#Intersection} } \author{ Robert Hijmans based on code by Ed Williams } \seealso{ \code{\link[geosphere]{gcLat}, \link[geosphere]{gcMaxLat}} } \examples{ gcLon(c(5,52), c(-120,37), 40) } \keyword{ spatial } geosphere/man/antipode.Rd0000644000176200001440000000222714131143521015076 0ustar liggesusers\name{antipode} \Rdversion{1.1} \alias{antipode} \alias{antipodal} \title{ Antipodes } \description{ Compute an antipode, or check whether two points are antipodes. Antipodes are places on Earth that are diametrically opposite to one another; and could be connected by a straight line through the centre of the Earth. Antipodal points are connected by an infinite number of great circles (e.g. the meridians connecting the poles), and can therefore not be used in some great circle based computations. } \usage{ antipode(p) antipodal(p1, p2, tol=1e-9) } \arguments{ \item{p}{Longitude/latitude of a single point, in degrees; can be a vector of two numbers, a matrix of 2 columns (first one is longitude, second is latitude) or a SpatialPoints* object} \item{p1}{as above} \item{p2}{as above} \item{tol}{tolerance for equality} } \value{ antipodal points or a logical value (\code{TRUE} if antipodal) } \references{ \url{https://en.wikipedia.org/wiki/Antipodes} } \author{ Robert Hijmans } \examples{ antipode(rbind(c(5,52), c(-120,37), c(-60,0), c(0,70))) antipodal(c(0,0), c(180,0)) } \keyword{ spatial } geosphere/man/bearingRhumb.Rd0000644000176200001440000000217014131210620015670 0ustar liggesusers\name{bearingRhumb} \Rdversion{1.1} \alias{bearingRhumb} \title{ Rhumbline direction } \description{ Bearing (direction of travel; true course) along a rhumb line (loxodrome) between two points. } \usage{ bearingRhumb(p1, p2) } \arguments{ \item{p1}{longitude/latitude of point(s). Can be a vector of two numbers, a matrix of 2 columns (first one is longitude, second is latitude) or a SpatialPoints* object} \item{p2}{as above} } \value{ A direction (bearing) in degrees } \references{ \url{https://www.edwilliams.org/avform147.htm#Rhumb} \url{https://en.wikipedia.org/wiki/Rhumb_line} } \author{ Chris Veness and Robert Hijmans, based on formulae by Ed Williams } \note{ Unlike most great circles, a rhumb line is a line of constant bearing (direction), i.e. tracks of constant true course. The meridians and the equator are both rhumb lines and great circles. Rhumb lines approaching a pole become a tightly wound spiral. } \seealso{ \code{ \link[geosphere]{bearing}, \link[geosphere]{distRhumb} } } \examples{ bearingRhumb(c(10,10),c(20,20)) } \keyword{ spatial } geosphere/man/geomean.Rd0000644000176200001440000000141313472155746014725 0ustar liggesusers\name{geomean} \docType{methods} \alias{geomean} \title{ Mean location of sperhical coordinates } \description{ mean location for spherical (longitude/latitude) coordinates that deals with the angularity. I.e., the mean of longitudes -179 and 178 is 179.5 } \usage{ geomean(xy, w) } \arguments{ \item{xy}{matrix with two columns (longitude/latitude), or a SpatialPoints or SpatialPolygons object with a longitude/latitude CRS} \item{w}{weights (vector of numeric values, with a length that is equal to the number of spatial features in \code{x}} } \value{ Ccoordinate pair (numeric) } \examples{ xy <- cbind(x=c(-179,179, 177), y=c(12,14,16)) xy geomean(xy) } \author{Robert J. Hijmans} \keyword{methods} \keyword{spatial} geosphere/man/horizon.Rd0000644000176200001440000000137514131210620014761 0ustar liggesusers\name{horizon} \alias{horizon} \title{Distance to the horizon} \description{ Empirical function to compute the distance to the horizon from a given altitude. The earth is assumed to be smooth, i.e. mountains and other obstacles are ignored. } \usage{ horizon(h, r=6378137) } \arguments{ \item{h}{altitude, numeric >= 0. Should have the same unit as r} \item{r}{radius of the earth; default value is 6378137 m} } \value{ Distance in units of \code{h} (default is meters) } \references{ \url{https://www.edwilliams.org/avform147.htm#Horizon} Bowditch, 1995. American Practical Navigator. Table 12. } \author{ Robert J. Hijmans } \examples{ horizon(1.80) # me horizon(324) # Eiffel tower } \keyword{ spatial } geosphere/man/midPoint.Rd0000644000176200001440000000137013472155746015077 0ustar liggesusers\name{midPoint} \Rdversion{1.1} \alias{midPoint} \title{Mid-point} \description{ Find the point half-way between two points along an ellipsoid } \usage{ midPoint(p1, p2, a=6378137, f = 1/298.257223563) } \arguments{ \item{p1}{longitude/latitude of point(s). Can be a vector of two numbers, a matrix of 2 columns (first one is longitude, second is latitude) or a SpatialPoints* object} \item{p2}{As above} \item{a}{major (equatorial) radius of the ellipsoid} \item{f}{ellipsoid flattening. The default value is for WGS84 } } \value{ matrix with coordinate pairs } \author{ Elias Pipping and Robert Hijmans } \examples{ midPoint(c(0,0),c(90,90)) midPoint(c(0,0),c(90,90), f=0) } \keyword{spatial} geosphere/man/OSGB.Rd0000644000176200001440000000231014472422166014033 0ustar liggesusers\name{OSGB} \alias{OSGB} \title{ Ordnance Survey for Great Britain grid reference system } \description{ Convert coordinates to the grid reference system used by the Ordnance Survey for Great Britain. Or do the inverse operation to get coordinates for a grid code. } \usage{ OSGB(xy, precision, geo=FALSE, inverse=FALSE) } \arguments{ \item{xy}{x coordinate pairs (vector, matrix, data.frame}; or grid codes if \code{inverse=TRUE}. \item{precision}{character. One of "1m", "5m", "10m", "50m", "100m", "500m", "1km", "5km", "10km", "50km", "100km", "500km"} \item{geo}{If \code{TRUE} the input coordinates are in longitude/latitude (on the airy ellipsoid!). If \code{FALSE} they must be in the "OSGB36 / British National Grid" coordinate reference system ("EPSG:27700" or "+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=airy +units=m")} \item{inverse}{If \code{TRUE}, coordinates are computed for the grid codes in \code{x}} } \value{ character } \examples{ pnts <- rbind(cbind(93555 , 256188), cbind(210637, 349798), cbind(696457, 481704)) g <- OSGB(pnts, "1km", geo=FALSE) g OSGB(g, inverse=TRUE) } \keyword{ spatial } geosphere/man/distVincentyEllipsoid.Rd0000644000176200001440000000701614131143521017624 0ustar liggesusers\name{distVincentyEllipsoid} \Rdversion{1.1} \alias{distVincentyEllipsoid} \title{ 'Vincenty' (ellipsoid) great circle distance } \description{ The shortest distance between two points (i.e., the 'great-circle-distance' or 'as the crow flies'), according to the 'Vincenty (ellipsoid)' method. This method uses an ellipsoid and the results are very accurate. The method is computationally more intensive than the other great-circled methods in this package. } \usage{ distVincentyEllipsoid(p1, p2, a=6378137, b=6356752.3142, f=1/298.257223563) } \arguments{ \item{p1}{longitude/latitude of point(s), in degrees 1; can be a vector of two numbers, a matrix of 2 columns (first one is longitude, second is latitude) or a SpatialPoints* object} \item{p2}{as above; or missing, in which case the sequential distance between the points in p1 is computed} \item{a}{Equatorial axis of ellipsoid} \item{b}{Polar axis of ellipsoid} \item{f}{Inverse flattening of ellipsoid} } \details{ The WGS84 ellipsoid is used by default. It is the best available global ellipsoid, but for some areas other ellipsoids could be preferable, or even necessary if you work with a printed map that refers to that ellipsoid. Here are parameters for some commonly used ellipsoids: \tabular{rllll}{ \tab \code{ ellipsoid } \tab \code{ a } \tab \code{ b } \tab \code{ f } \cr \tab \code{ WGS84 } \tab \code{ 6378137 } \tab \code{ 6356752.3142 } \tab \code{ 1/298.257223563 } \cr \tab \code{ GRS80 } \tab \code{ 6378137 } \tab \code{ 6356752.3141 } \tab \code{ 1/298.257222101 } \cr \tab \code{ GRS67 } \tab \code{ 6378160 } \tab \code{ 6356774.719 } \tab \code{ 1/298.25 } \cr \tab \code{ Airy 1830 } \tab \code{ 6377563.396 } \tab \code{ 6356256.909 } \tab \code{ 1/299.3249646 } \cr \tab \code{ Bessel 1841 } \tab \code{ 6377397.155 } \tab \code{ 6356078.965 } \tab \code{ 1/299.1528434 } \cr \tab \code{ Clarke 1880 } \tab \code{ 6378249.145 } \tab \code{ 6356514.86955 } \tab \code{ 1/293.465 } \cr \tab \code{ Clarke 1866 } \tab \code{ 6378206.4 } \tab \code{ 6356583.8 } \tab \code{ 1/294.9786982 } \cr \tab \code{ International 1924 } \tab \code{ 6378388 } \tab \code{ 6356911.946 } \tab \code{ 1/297 } \cr \tab \code{ Krasovsky 1940 } \tab \code{ 6378245 } \tab \code{ 6356863 } \tab \code{ 1/298.2997381 } \cr } \code{a} is the 'semi-major axis', and \code{b} is the 'semi-minor axis' of the ellipsoid. \code{f} is the flattening. Note that \code{f = (a-b)/a} more info: \url{https://en.wikipedia.org/wiki/Reference_ellipsoid} } \value{ Distance value in the same units as the ellipsoid (default is meters) } \references{ Vincenty, T. 1975. Direct and inverse solutions of geodesics on the ellipsoid with application of nested equations. Survey Review Vol. 23, No. 176, pp88-93. Available here: \url{https://www.movable-type.co.uk/scripts/latlong-vincenty.html} \url{https://en.wikipedia.org/wiki/Great_circle_distance} } \author{ Chris Veness and Robert Hijmans } \seealso{ \code{\link[geosphere]{distGeo}, \link{distVincentySphere}, \link{distHaversine}, \link{distCosine}, \link{distMeeus}} } \examples{ distVincentyEllipsoid(c(0,0),c(90,90)) # on a 'Clarke 1880' ellipsoid distVincentyEllipsoid(c(0,0),c(90,90), a=6378249.145, b=6356514.86955, f=1/293.465) } \keyword{ spatial } geosphere/man/gcIntersectBearing.Rd0000644000176200001440000000231414131210620017025 0ustar liggesusers\name{gcIntersectBearing} \Rdversion{1.1} \alias{gcIntersectBearing} \title{ Intersections of two great circles } \description{ Get the two points where two great cricles cross each other. In this function, great circles are defined by a points and an initial bearing. In function \code{ \link[geosphere]{gcIntersect}} they are defined by two sets of points. } \usage{ gcIntersectBearing(p1, brng1, p2, brng2) } \arguments{ \item{p1}{longitude/latitude of point(s). Can be a vector of two numbers, a matrix of 2 columns (first one is longitude, second is latitude) or a SpatialPoints* object} \item{brng1}{Bearing from p1} \item{p2}{As above. Should have same length as p1, or a single point (or vice versa when p1 is a single point} \item{brng2}{Bearing from p2} } \value{ a matrix with four columns (two points) } \seealso{ \code{ \link[geosphere]{gcIntersect} } } \references{ \url{https://www.edwilliams.org/avform147.htm#Intersection} \url{https://www.movable-type.co.uk/scripts/latlong.html} } \author{ Chris Veness and Robert Hijmans based on code by Ed Williams } \examples{ gcIntersectBearing(c(10,0), 10, c(-10,0), 10) } \keyword{ spatial } geosphere/man/distGeo.Rd0000644000176200001440000000551614131145601014676 0ustar liggesusers\name{distGeo} \Rdversion{1.1} \alias{distGeo} \title{ Distance on an ellipsoid (the geodesic) } \description{ Highly accurate estimate of the shortest distance between two points on an ellipsoid (default is WGS84 ellipsoid). The shortest path between two points on an ellipsoid is called the geodesic. } \usage{ distGeo(p1, p2, a=6378137, f=1/298.257223563) } \arguments{ \item{p1}{longitude/latitude of point(s). Can be a vector of two numbers, a matrix of 2 columns (first column is longitude, second column is latitude) or a SpatialPoints* object} \item{p2}{as above; or missing, in which case the sequential distance between the points in p1 is computed} \item{a}{numeric. Major (equatorial) radius of the ellipsoid. The default value is for WGS84 } \item{f}{numeric. Ellipsoid flattening. The default value is for WGS84 } } \value{ Vector of distances in meters } \details{ Parameters from the WGS84 ellipsoid are used by default. It is the best available global ellipsoid, but for some areas other ellipsoids could be preferable, or even necessary if you work with a printed map that refers to that ellipsoid. Here are parameters for some commonly used ellipsoids. Also see the \code{\link{refEllipsoids}} function. \tabular{rlll}{ \tab \code{ ellipsoid } \tab \code{ a } \tab \code{ f } \cr \tab \code{ WGS84 } \tab \code{ 6378137 } \tab \code{ 1/298.257223563 } \cr \tab \code{ GRS80 } \tab \code{ 6378137 } \tab \code{ 1/298.257222101 } \cr \tab \code{ GRS67 } \tab \code{ 6378160 } \tab \code{ 1/298.25 } \cr \tab \code{ Airy 1830 } \tab \code{ 6377563.396 } \tab \code{ 1/299.3249646 } \cr \tab \code{ Bessel 1841 } \tab \code{ 6377397.155 } \tab \code{ 1/299.1528434 } \cr \tab \code{ Clarke 1880 } \tab \code{ 6378249.145 } \tab \code{ 1/293.465 } \cr \tab \code{ Clarke 1866 } \tab \code{ 6378206.4 } \tab \code{ 1/294.9786982 } \cr \tab \code{ International 1924 } \tab \code{ 6378388 } \tab \code{ 1/297 } \cr \tab \code{ Krasovsky 1940 } \tab \code{ 6378245 } \tab \code{ 1/298.2997381 } \cr } more info: \url{https://en.wikipedia.org/wiki/Reference_ellipsoid} } \author{ This function calls GeographicLib code by C.F.F. Karney } \references{ C.F.F. Karney, 2013. Algorithms for geodesics, J. Geodesy 87: 43-55. \doi{10.1007/s00190-012-0578-z}. Addenda: \url{https://geographiclib.sourceforge.io/geod-addenda.html}. Also see \url{https://geographiclib.sourceforge.io/} } \seealso{ \code{\link[geosphere]{distCosine}, \link[geosphere]{distHaversine}, \link[geosphere]{distVincentySphere}, \link[geosphere]{distVincentyEllipsoid}, \link{distMeeus}} } \examples{ distGeo(c(0,0),c(90,90)) } \keyword{ spatial } geosphere/man/distVincentySphere.Rd0000644000176200001440000000241514131143521017124 0ustar liggesusers\name{distVincentySphere} \Rdversion{1.1} \alias{distVincentySphere} \title{ 'Vincenty' (sphere) great circle distance } \description{ The shortest distance between two points (i.e., the 'great-circle-distance' or 'as the crow flies'), according to the 'Vincenty (sphere)' method. This method assumes a spherical earth, ignoring ellipsoidal effects and it is less accurate then the \code{distVicentyEllipsoid} method. } \usage{ distVincentySphere(p1, p2, r=6378137) } \arguments{ \item{p1}{longitude/latitude of point(s). Can be a vector of two numbers, a matrix of 2 columns (first one is longitude, second is latitude) or a SpatialPoints* object} \item{p2}{as above; or missing, in which case the sequential distance between the points in p1 is computed} \item{r}{radius of the earth; default = 6378137 m} } \value{ Distance value in the same unit as \code{r} (default is meters) } \references{ \url{https://en.wikipedia.org/wiki/Great_circle_distance} } \author{ Robert Hijmans } \seealso{ \code{\link[geosphere]{distGeo}, \link[geosphere]{distVincentyEllipsoid}, \link[geosphere]{distHaversine}, \link[geosphere]{distCosine}, \link{distMeeus}} } \examples{ distVincentySphere(c(0,0),c(90,90)) } \keyword{ spatial } geosphere/man/data.Rd0000644000176200001440000000053613472155746014230 0ustar liggesusers\name{wrld} \alias{wrld} \alias{merc} \docType{data} \title{World countries} \description{ world coastline and country outlines in longitude/latitude (wrld) and in Mercator projection (merc). } \usage{ data(wrld) data(merc) } \source{ Derived from the wrld_simpl data set in package maptools } \keyword{datasets} geosphere/man/greatCircleBearing.Rd0000644000176200001440000000152114131210620016776 0ustar liggesusers\name{greatCircleBearing} \Rdversion{1.1} \alias{greatCircleBearing} \title{ Great circle } \description{ Get points on a great circle as defined by a point and an initial bearing } \usage{ greatCircleBearing(p, brng, n=360) } \arguments{ \item{p}{longitude/latitude of a single point. Can be a vector of two numbers, a matrix of 2 columns (first one is longitude, second is latitude) or a SpatialPoints* object} \item{brng}{bearing} \item{n}{The requested number of points on the great circle} } \value{ A matrix of points, or a list of matrices (e.g., if multiple bearings are supplied) } \references{ \url{https://www.edwilliams.org/avform147.htm#Int} } \author{ Robert Hijmans based on formulae by Ed Williams } \examples{ greatCircleBearing(c(5,52), 45, n=12) } \keyword{ spatial } geosphere/man/span.Rd0000644000176200001440000000322513472155746014256 0ustar liggesusers\name{span} \alias{span} \alias{span,SpatialPolygons-method} \alias{span,matrix-method} \title{Span of polygons} \description{ Compute the approximate surface span of polygons in longitude and latitude direction. Span is computed by rasterizing the polygons; and precision increases with the number of 'scan lines'. You can either use a fixed number of scan lines for each polygon, or a fixed band-width. } \usage{ span(x, ...) } \arguments{ \item{x}{a SpatialPolygons* object or a 2-column matrix (longitude/latitude)} \item{...}{Additional arguments, see Details} } \details{ The following additional arguments can be passed, to replace default values for this function \tabular{rll}{ \tab \code{nbands} \tab Character. Method to determine the number of bands to 'scan' the polygon. Either 'fixed' or 'variable' \cr \tab \code{n} \tab Integer >= 1. If \code{nbands='fixed'}, how many bands should be used \cr \tab \code{res} \tab Numeric. If \code{nbands='variable'}, what should the bandwidth be (in degrees)? \cr \tab \code{fun} \tab Logical. A function such as mean or min. Mean computes the average span \cr \tab \code{...} \tab further additional arguments passed to distGeo\cr } } \value{ A list, or a matrix if a function \code{fun} is specified. Values are in the units of \code{r} (default is meter) } \author{Robert J. Hijmans } \examples{ pol <- rbind(c(-180,-20), c(-160,5), c(-60, 0), c(-160,-60), c(-180,-20)) plot(pol) lines(pol) # lon and lat span in m span(pol, fun=max) x <- span(pol) max(x$latspan) mean(x$latspan) plot(x$longitude, x$lonspan) } \keyword{methods} \keyword{spatial} geosphere/man/destPoint.Rd0000644000176200001440000000354214131145600015245 0ustar liggesusers\name{destPoint} \Rdversion{1.1} \alias{destPoint} \title{ Destination given bearing (direction) and distance } \description{ Given a start point, initial bearing (direction), and distance, this function computes the destination point travelling along a the shortest path on an ellipsoid (the geodesic). } \usage{ destPoint(p, b, d, a=6378137, f=1/298.257223563, ...) } \arguments{ \item{p}{Longitude and Latitude of point(s), in degrees. Can be a vector of two numbers, a matrix of 2 columns (first one is longitude, second is latitude) or a SpatialPoints* object} \item{b}{numeric. Bearing (direction) in degrees} \item{d}{numeric. Distance in meters} \item{a}{major (equatorial) radius of the ellipsoid. The default value is for WGS84 } \item{f}{ellipsoid flattening. The default value is for WGS84 } \item{...}{additional arguments. If an argument 'r' is supplied, this is taken as the radius of the earth (e.g. 6378137 m) and computations are for a sphere (great circle) instead of an ellipsoid (geodetic). This is for backwards compatibility only} } \note{ Direction changes continuously when travelling along a geodesic. Therefore, the final direction is not the same as the initial direction. You can compute the final direction with \code{\link{finalBearing}} (see examples, below) } \value{ A pair of coordinates (longitude/latitude) } \author{ This function calls GeographicLib code by C.F.F. Karney } \references{ C.F.F. Karney, 2013. Algorithms for geodesics, J. Geodesy 87: 43-55. \doi{10.1007/s00190-012-0578-z}. Addenda: \url{https://geographiclib.sourceforge.io/geod-addenda.html}. Also see \url{https://geographiclib.sourceforge.io/} } \examples{ p <- cbind(5,52) d <- destPoint(p,30,10000) d #final direction, when arriving at endpoint: finalBearing(d, p) } \keyword{ spatial } geosphere/man/distHaversine.Rd0000644000176200001440000000342114131143521016100 0ustar liggesusers\name{distHaversine} \Rdversion{1.1} \alias{distHaversine} \title{ 'Haversine' great circle distance } \description{ The shortest distance between two points (i.e., the 'great-circle-distance' or 'as the crow flies'), according to the 'haversine method'. This method assumes a spherical earth, ignoring ellipsoidal effects. } \usage{distHaversine(p1, p2, r=6378137) } \arguments{ \item{p1}{longitude/latitude of point(s). Can be a vector of two numbers, a matrix of 2 columns (first one is longitude, second is latitude) or a SpatialPoints* object} \item{p2}{as above; or missing, in which case the sequential distance between the points in p1 is computed} \item{r}{radius of the earth; default = 6378137 m} } \details{ The Haversine ('half-versed-sine') formula was published by R.W. Sinnott in 1984, although it has been known for much longer. At that time computational precision was lower than today (15 digits precision). With current precision, the spherical law of cosines formula appears to give equally good results down to very small distances. If you want greater accuracy, you could use the \code{\link[geosphere]{distVincentyEllipsoid}} method. } \value{ Vector of distances in the same unit as \code{r} (default is meters) } \references{ Sinnott, R.W, 1984. Virtues of the Haversine. Sky and Telescope 68(2): 159 \url{https://www.movable-type.co.uk/scripts/latlong.html} \url{https://en.wikipedia.org/wiki/Great_circle_distance} } \author{ Chris Veness and Robert Hijmans } \seealso{ \code{\link[geosphere]{distGeo}, \link[geosphere]{distCosine}, \link[geosphere]{distVincentySphere}, \link[geosphere]{distVincentyEllipsoid}, \link{distMeeus}} } \examples{ distHaversine(c(0,0),c(90,90)) } \keyword{ spatial } geosphere/man/daylength.Rd0000644000176200001440000000172114253023226015254 0ustar liggesusers\name{daylength} \alias{daylength} \title{ Daylength } \description{ Compute daylength (photoperiod) for a latitude and date. } \usage{ daylength(lat, doy) } \arguments{ \item{lat}{latitude, in degrees. I.e. between -90.0 and 90.0 } \item{doy}{integer, day of the year (1..365) for common (non-leap) years; or an object of class Date; or a character that can be coerced into a date, using 'yyyy-mm-dd' format, e.g. '1982-11-23' } } \value{ Daylength in hours } \references{ Forsythe, William C., Edward J. Rykiel Jr., Randal S. Stahl, Hsin-i Wu and Robert M. Schoolfield, 1995. A model comparison for daylength as a function of latitude and day of the year. Ecological Modeling 80:87-95. } \author{ Robert J. Hijmans } \examples{ daylength(-25, '2010-10-10') daylength(45, 1:365) # average monthly daylength dl <- daylength(45, 1:365) tapply(dl, rep(1:12, c(31,28,31,30,31,30,31,31,30,31,30,31)), mean) } \keyword{ spatial } geosphere/man/finalDirection.Rd0000644000176200001440000000261714131145601016231 0ustar liggesusers\name{finalBearing} \Rdversion{1.1} \alias{finalBearing} \title{ Final direction } \description{ Get the final direction (bearing) when arriving at \code{p2} after starting from \code{p1} and following the shortest path on an ellipsoid (following a geodetic) or on a sphere (following a great circle). } \usage{ finalBearing(p1, p2, a=6378137, f=1/298.257223563, sphere=FALSE) } \arguments{ \item{p1}{longitude/latitude of point(s). Can be a vector of two numbers, a matrix of 2 columns (first column is longitude, second column is latitude) or a SpatialPoints* object} \item{p2}{as above} \item{a}{major (equatorial) radius of the ellipsoid. The default value is for WGS84 } \item{f}{ellipsoid flattening. The default value is for WGS84 } \item{sphere}{logical. If \code{TRUE}, the bearing is computed for a sphere, instead of for an ellipsoid} } \value{ A vector of directions (bearings) in degrees } \examples{ bearing(c(10,10),c(20,20)) finalBearing(c(10,10),c(20,20)) } \author{ This function calls GeographicLib code by C.F.F. Karney } \references{ C.F.F. Karney, 2013. Algorithms for geodesics, J. Geodesy 87: 43-55. \doi{10.1007/s00190-012-0578-z}. Addenda: \url{https://geographiclib.sourceforge.io/geod-addenda.html}. Also see \url{https://geographiclib.sourceforge.io/} } \seealso{ \code{ \link[geosphere]{bearing} } } \keyword{ spatial } geosphere/man/lengthLine.Rd0000644000176200001440000000112414131141671015363 0ustar liggesusers\name{lengthLine} \alias{lengthLine} \title{ Length of lines } \description{ Compute the length of lines } \usage{ lengthLine(line) } \arguments{ \item{line}{longitude/latitude of line as a matrix of 2 columns (first one is longitude, second is latitude) or a SpatialLines* or SpatialPolygons* object} } \value{ length (in meters) for each line } \seealso{ For planar coordinates, see the terra or sf packages } \examples{ line <- rbind(c(-180,-20), c(-150,-10), c(-140,55), c(10, 0), c(-140,-60)) d <- lengthLine(line) } \keyword{ spatial } geosphere/man/dist2line.Rd0000644000176200001440000000340614131141731015171 0ustar liggesusers\name{dist2Line} \Rdversion{1.1} \alias{dist2Line} \title{ Distance between points and lines or the border of polygons. } \description{ The shortest distance between points and polylines or polygons. } \usage{dist2Line(p, line, distfun=distGeo) } \arguments{ \item{p}{longitude/latitude of point(s). Can be a vector of two numbers, a matrix of 2 columns (first one is longitude, second is latitude) or a SpatialPoints* object} \item{line}{longitude/latitude of line as a matrix of 2 columns (first one is longitude, second is latitude) or a SpatialLines* or SpatialPolygons* object} \item{distfun}{A distance function, such as \link[geosphere]{distGeo}} } \value{ matrix with distance and lon/lat of the nearest point on the line. Distance is in the same unit as \code{r} in the \code{distfun}(default is meters). If \code{line} is a \code{Spatial*} object, the ID (index) of (one of) the nearest objects is also returned. Thus if the objects are polygons and the point is inside a polygon the function may return the ID of a neighboring polygon that shares the nearest border. You can use the \code{intersect} function in packages \code{terra}. } \author{ George Wang and Robert Hijmans } \seealso{ \code{\link{dist2gc}, \link{alongTrackDistance} } } \examples{ line <- rbind(c(-180,-20), c(-150,-10), c(-140,55), c(10, 0), c(-140,-60)) pnts <- rbind(c(-170,0), c(-75,0), c(-70,-10), c(-80,20), c(-100,-50), c(-100,-60), c(-100,-40), c(-100,-20), c(-100,-10), c(-100,0)) d = dist2Line(pnts, line) plot( makeLine(line), type='l') points(line) points(pnts, col='blue', pch=20) points(d[,2], d[,3], col='red', pch='x') for (i in 1:nrow(d)) lines(gcIntermediate(pnts[i,], d[i,2:3], 10), lwd=2) } \keyword{ spatial } geosphere/man/distRhumb.Rd0000644000176200001440000000272114131143521015233 0ustar liggesusers\name{distRhumb} \Rdversion{1.1} \alias{distRhumb} \title{ Distance along a rhumb line } \description{ A rhumb line (loxodrome) is a path of constant bearing (direction), which crosses all meridians at the same angle. } \usage{ distRhumb(p1, p2, r=6378137) } \arguments{ \item{p1}{longitude/latitude of point(s). Can be a vector of two numbers, a matrix of 2 columns (first one is longitude, second is latitude) or a SpatialPoints* object} \item{p2}{as above; or missing, in which case the sequential distance between the points in p1 is computed} \item{r}{radius of the earth; default = 6378137 m} } \details{ Rhumb (from the Spanish word for course, 'rumbo') lines are straight lines on a Mercator projection map. They were used in navigation because it is easier to follow a constant compass bearing than to continually adjust the bearing as is needed to follow a great circle, even though rhumb lines are normally longer than great-circle (orthodrome) routes. Most rhumb lines will gradually spiral towards one of the poles. } \value{ distance in units of r (default=meters) } \references{ \url{https://www.movable-type.co.uk/scripts/latlong.html} } \author{ Robert Hijmans and Chris Veness } \seealso{ \code{\link[geosphere]{distCosine}, \link[geosphere]{distHaversine}, \link[geosphere]{distVincentySphere}, \link[geosphere]{distVincentyEllipsoid}} } \examples{ distRhumb(c(10,10),c(20,20)) } \keyword{ spatial } geosphere/man/area.Rd0000644000176200001440000000405214131145600014201 0ustar liggesusers\name{areaPolygon} \Rdversion{1.1} \alias{areaPolygon} \alias{areaPolygon,matrix-method} \alias{areaPolygon,data.frame-method} \alias{areaPolygon,SpatialPolygons-method} \title{ Area of a longitude/latitude polygon } \description{ Compute the area of a polygon in angular coordinates (longitude/latitude) on an ellipsoid. } \usage{ \S4method{areaPolygon}{matrix}(x, a=6378137, f=1/298.257223563, ...) \S4method{areaPolygon}{SpatialPolygons}(x, a=6378137, f=1/298.257223563, ...) } \arguments{ \item{x}{longitude/latitude of the points forming a polygon; Must be a matrix or data.frame of 2 columns (first one is longitude, second is latitude) or a SpatialPolygons* object} \item{a}{major (equatorial) radius of the ellipsoid} \item{f}{ellipsoid flattening. The default value is for WGS84 } \item{...}{Additional arguments. None implemented} } \value{ area in square meters } \note{ Use raster::area for polygons that have a planar (projected) coordinate reference system. } \author{ This function calls GeographicLib code by C.F.F. Karney } \references{ C.F.F. Karney, 2013. Algorithms for geodesics, J. Geodesy 87: 43-55. \doi{10.1007/s00190-012-0578-z}. Addenda: \url{https://geographiclib.sourceforge.io/geod-addenda.html}. Also see \url{https://geographiclib.sourceforge.io/} } \seealso{ \code{ \link[geosphere]{centroid}, \link[geosphere]{perimeter} } } \examples{ p <- rbind(c(-180,-20), c(-140,55), c(10, 0), c(-140,-60), c(-180,-20)) areaPolygon(p) # Be careful with very large polygons, as they may not be what they seem! # For example, if you wanted a polygon to compute the area equal to about 1/4 of the ellipsoid # this won't work: b <- matrix(c(-180, 0, 90, 90, 0, 0, -180, 0), ncol=2, byrow=TRUE) areaPolygon(b) # Becausee the shortest path between (-180,0) and (0,0) is # over one of the poles, not along the equator! # Inserting a point along the equator fixes that b <- matrix(c(-180, 0, 0, 0, -90,0, -180, 0), ncol=2, byrow=TRUE) areaPolygon(b) } \keyword{ spatial } geosphere/DESCRIPTION0000644000176200001440000000173114677706706013767 0ustar liggesusersPackage: geosphere Type: Package Title: Spherical Trigonometry Version: 1.5-20 Date: 2024-10-02 LinkingTo: Rcpp Imports: Rcpp, sp Depends: R (>= 3.0.0) Suggests: methods, raster, terra Authors@R: c( person("Robert J.", "Hijmans", role = c("cre", "aut"), email = "r.hijmans@gmail.com"), person("Charles", "Karney", role = "ctb", comment="GeographicLib"), person("Ed", "Williams", role = "ctb"), person("Chris", "Vennes", role = "ctb")) Description: Spherical trigonometry for geographic applications. That is, compute distances and related measures for angular (longitude/latitude) locations. BugReports: https://github.com/rspatial/geosphere/issues/ License: GPL (>= 3) LazyLoad: yes NeedsCompilation: yes Packaged: 2024-10-03 02:50:13 UTC; rhijm Author: Robert J. Hijmans [cre, aut], Charles Karney [ctb] (GeographicLib), Ed Williams [ctb], Chris Vennes [ctb] Maintainer: Robert J. Hijmans Repository: CRAN Date/Publication: 2024-10-04 06:40:06 UTC