You can subscribe to this list here.
2005 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
(92) |
Dec
(141) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2006 |
Jan
(126) |
Feb
(72) |
Mar
(31) |
Apr
(200) |
May
(81) |
Jun
(130) |
Jul
(112) |
Aug
(134) |
Sep
(76) |
Oct
(89) |
Nov
(153) |
Dec
(9) |
2007 |
Jan
(59) |
Feb
(82) |
Mar
(50) |
Apr
(20) |
May
(9) |
Jun
(81) |
Jul
(41) |
Aug
(109) |
Sep
(91) |
Oct
(87) |
Nov
(33) |
Dec
(60) |
2008 |
Jan
(21) |
Feb
(15) |
Mar
(38) |
Apr
(75) |
May
(59) |
Jun
(46) |
Jul
(30) |
Aug
(20) |
Sep
(35) |
Oct
(32) |
Nov
(34) |
Dec
(19) |
2009 |
Jan
(29) |
Feb
(71) |
Mar
(54) |
Apr
(17) |
May
(4) |
Jun
|
Jul
(3) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(3) |
2010 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(3) |
Aug
(58) |
Sep
(7) |
Oct
(7) |
Nov
(12) |
Dec
(18) |
2011 |
Jan
(17) |
Feb
(29) |
Mar
(11) |
Apr
(5) |
May
(1) |
Jun
|
Jul
|
Aug
(11) |
Sep
|
Oct
|
Nov
|
Dec
|
2012 |
Jan
(2) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2014 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
(87) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2015 |
Jan
|
Feb
|
Mar
|
Apr
|
May
(44) |
Jun
(79) |
Jul
(16) |
Aug
(31) |
Sep
|
Oct
(51) |
Nov
|
Dec
|
2016 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
(2) |
Oct
|
Nov
|
Dec
|
From: <pg...@us...> - 2014-06-09 13:56:31
|
Revision: 2779 http://sourceforge.net/p/roadmap/code/2779 Author: pgf Date: 2014-06-09 13:56:28 +0000 (Mon, 09 Jun 2014) Log Message: ----------- Makefile: separate the clean targets for code and maps/icons Modified Paths: -------------- trunk/roadmap/src/Makefile Modified: trunk/roadmap/src/Makefile =================================================================== --- trunk/roadmap/src/Makefile 2014-06-09 13:56:23 UTC (rev 2778) +++ trunk/roadmap/src/Makefile 2014-06-09 13:56:28 UTC (rev 2779) @@ -560,13 +560,21 @@ $(RM) .#* clean: topclean - for module in icons $(OSDIR) gpx $(RDMODULES) basefiles quadtiles ; \ + for module in $(OSDIR) gpx $(RDMODULES) ; \ do \ $(MAKE) -C $$module clean || exit 1; \ done rm -f agg_support/*.o agg_support/.depends.mk ${PLUGIN_CLEAN} +miscclean: + for module in icons basefiles quadtiles ; \ + do \ + $(MAKE) -C $$module clean || exit 1; \ + done +clobber: clean misclean + + install: all installdata installbin installicons \ installdesktop installdoc installman for module in $(RDMODULES) ; \ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pg...@us...> - 2014-06-09 13:56:26
|
Revision: 2778 http://sourceforge.net/p/roadmap/code/2778 Author: pgf Date: 2014-06-09 13:56:23 +0000 (Mon, 09 Jun 2014) Log Message: ----------- limit selectable positions on the map roadmap doesn't wrap around correctly at either the poles or at the 180 meridian. so keep the user from going there. Modified Paths: -------------- trunk/roadmap/src/roadmap_math.c trunk/roadmap/src/roadmap_osm.c Modified: trunk/roadmap/src/roadmap_math.c =================================================================== --- trunk/roadmap/src/roadmap_math.c 2014-06-08 13:08:29 UTC (rev 2777) +++ trunk/roadmap/src/roadmap_math.c 2014-06-09 13:56:23 UTC (rev 2778) @@ -1202,8 +1202,20 @@ void roadmap_math_set_center (const RoadMapPosition *position) { - RoadMapContext->center = *position; + RoadMapPosition c; + c = *position; + /* impose limits: roadmap doesn't have the math smarts to wrap + * around 180/-180 going west/east, and mercator-like projections + * just don't work past about 85 degrees. */ + if (c.longitude < -179000000) c.longitude = -179000000; + else if (c.longitude > 179000000) c.longitude = 179000000; + + if (c.latitude < -86000000) c.latitude = -86000000; + else if (c.latitude > 86000000) c.latitude = 86000000; + + RoadMapContext->center = c; + roadmap_math_compute_scale (); } Modified: trunk/roadmap/src/roadmap_osm.c =================================================================== --- trunk/roadmap/src/roadmap_osm.c 2014-06-08 13:08:29 UTC (rev 2777) +++ trunk/roadmap/src/roadmap_osm.c 2014-06-09 13:56:23 UTC (rev 2778) @@ -178,6 +178,7 @@ int gridlon, gridlat; int lon, lat; char *delta; + int newtileid; int bits = tileid2bits(tileid); @@ -204,7 +205,15 @@ else if (delta[LON] == '-') lon -= gridlon; - return roadmap_osm_latlon2tileid(lat, lon, bits); + newtileid = roadmap_osm_latlon2tileid(lat, lon, bits); + + /* can happen if lat/lon go out of bounds (+-90/+-180) */ + if (newtileid == tileid) { + roadmap_log(ROADMAP_DEBUG, "attempt to compute out-of-bounds tileid"); + return -1; + } + + return newtileid; } @@ -337,16 +346,31 @@ (position->latitude, position->longitude, roadmap_osm_maps_biggest); roadmap_osm_add_if_exists(tileid); + +// FIXME -- the "no more tiles" checks below aren't quite right. +// we're computing a contiguous square of tiles by spiraling outward, +// moving northwest after every loop. if we're on the "edge of the +// world", we'll either hit an invalid tile right away, or after we've +// gone some way around. with the current checks we'll bail out right +// away -- we should actually keep checking, at least once per side, +// for more valid tiles. changing the algorithm would help: compute +// the next ring out based on the outward neighbors of the existing +// ring, rather than as a chain. + width = 1; oreally = -1; reallyfound = 0; while (reallyfound != oreally) { oreally = reallyfound; tileid = roadmap_osm_tileid_to_neighbor(tileid, TILE_NORTHWEST); + if (tileid == -1) /* no more tiles */ + break; width += 2; for (d = 0; d < 4; d++) { for (i = 0; i < width-1; i++) { tileid = roadmap_osm_tileid_to_neighbor(tileid, eswn[d]); + if (tileid == -1) /* no more tiles */ + break; roadmap_osm_tileid_to_bbox(tileid, &tileedges); if (roadmap_math_areas_intersect (&tileedges, focus)) reallyfound++; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pg...@us...> - 2014-06-08 13:08:33
|
Revision: 2777 http://sourceforge.net/p/roadmap/code/2777 Author: pgf Date: 2014-06-08 13:08:29 +0000 (Sun, 08 Jun 2014) Log Message: ----------- basemap: split into 8 slices, to let buildmap run on small machines with even 4 slices, buildmap was running out of memory on a machine with 2G of RAM. Modified Paths: -------------- trunk/roadmap/src/app_a02.txt trunk/roadmap/src/basefiles/Makefile trunk/roadmap/src/basefiles/basemap.sh trunk/roadmap/src/basefiles/shp2osm.awk Modified: trunk/roadmap/src/app_a02.txt =================================================================== --- trunk/roadmap/src/app_a02.txt 2014-06-08 10:43:37 UTC (rev 2776) +++ trunk/roadmap/src/app_a02.txt 2014-06-08 13:08:29 UTC (rev 2777) @@ -3242,6 +3242,12 @@ 81 071 World Boundaries SB 81 072 World Boundaries SB 81 073 World Boundaries SB +81 074 World Boundaries SB +81 075 World Boundaries SB +81 076 World Boundaries SB +81 077 World Boundaries SB +81 078 World Boundaries SB +81 079 World Boundaries SB 82 001 Placenames PN 83 010 DCW Europe and North Asia DW 83 011 DCW Europe and North Asia DW Modified: trunk/roadmap/src/basefiles/Makefile =================================================================== --- trunk/roadmap/src/basefiles/Makefile 2014-06-08 10:43:37 UTC (rev 2776) +++ trunk/roadmap/src/basefiles/Makefile 2014-06-08 13:08:29 UTC (rev 2777) @@ -2,13 +2,13 @@ TOP = .. include $(TOP)/options.mk -all: usc81070.rdm +all: usc81077.rdm -usc81070.rdm: basemap.sh shp2osm.awk +usc81077.rdm: basemap.sh shp2osm.awk ./basemap.sh clean: - rm -f usdir.rdm usc81070.rdm basefile.osm + rm -f usdir.rdm usc8107?.rdm tmp.osm sourcelist: @find . -print | egrep -v 'rdm$$|osm$$' Modified: trunk/roadmap/src/basefiles/basemap.sh =================================================================== --- trunk/roadmap/src/basefiles/basemap.sh 2014-06-08 10:43:37 UTC (rev 2776) +++ trunk/roadmap/src/basefiles/basemap.sh 2014-06-08 13:08:29 UTC (rev 2777) @@ -13,14 +13,36 @@ sources="$sources$b: $(cat $s.VERSION.txt); " done -# run all the shapefiles through the converter together -for s in $shapefiles +# create the world basemap in 8 slices -- otherwise there are too many +# "squares", and buildmap consumes way too much memory on a small +# machine. +# the 8107? map identifiers aren't special, except that they appear +# in app_a02.txt +for map in $(seq 0 7) do - shpdump $s -done | ./shp2osm.awk "$sources" >basefile.osm + echo + echo Making basemap usc8107$map.rdm... -../buildmap_osm -c ../default/All -i basefile.osm -o usc81070.rdm + case $map in + 0) w=-180; e=-90; s=-90; n=0;; + 1) w=-90; e=0; s=-90; n=0;; + 2) w=0; e=90; s=-90; n=0;; + 3) w=90; e=180; s=-90; n=0;; + 4) w=-180; e=-90; s=0; n=90;; + 5) w=-90; e=0; s=0; n=90;; + 6) w=0; e=90; s=0; n=90;; + 7) w=90; e=180; s=0; n=90;; + esac + # run all the shapefiles through the converter together + for s in $shapefiles + do + shpdump $s + done | tee foo | ./shp2osm.awk $w $s $e $n "$sources" >tmp.osm + + ../buildmap_osm -c ../default/All -i tmp.osm -o usc8107$map.rdm +done + ../buildus --path=.. --maps=. - +#rm -f tmp.osm Modified: trunk/roadmap/src/basefiles/shp2osm.awk =================================================================== --- trunk/roadmap/src/basefiles/shp2osm.awk 2014-06-08 10:43:37 UTC (rev 2776) +++ trunk/roadmap/src/basefiles/shp2osm.awk 2014-06-08 13:08:29 UTC (rev 2777) @@ -5,13 +5,22 @@ # both in layout of individual elements, and in ordering of elements # within the file. -# use sed to ensure spaces around some fields, to seperate them +west="$1" +south="$2" +east="$3" +north="$4" +sources="$5" + +# use sed first to ensure spaces around some fields, to separate them # from, or to replace, their punctuation. makes the awk job easier. +# "awk" is gawk on my system. don't know if that matters. sed -e '/^Shape:[[:digit:]]/s/:/ /' -e 's/,/ /g' -e 's/[()]/ & /g' | +awk --assign sources="$sources" \ + --assign west="$west" \ + --assign south="$south" \ + --assign east="$east" \ + --assign north="$north" ' -# "awk" is gawk on my system. don't know if that matters. -awk --assign sources="$1" ' - function emit_way(way_id) { printf " <way id=\"%s\">\n", way_id @@ -26,8 +35,9 @@ } BEGIN { - nodeid=1; - way_id=1; + discard = 0 + nodeid = 1; + way_id = 1; printf "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" printf "<osm version=\"0.6\" generator=\"roadmap shp2osm.awk\">\n" printf "<note>Made with Natural Earth. Free vector and raster map data @ naturalearthdata.com</note>\n" @@ -38,22 +48,35 @@ if (wayindex != 0) { emit_way(way_id++) } - wayindex=0 + wayindex = 0 } - /^ *\+ *\(.*Ring/ { + /^ *Bounds:/ { + + lat=$4; lon=$3 + if ( lon >= west && lon < east && + lat >= south && lat < north) { + discard = 0 + wayindex = 0 + } else { + discard = 1 + } + } + /^ *\+ *\(.*Ring/ && !discard { + if (wayindex != 0) { emit_way(way_id++) } - wayindex=0 + wayindex = 0 lat=$4; lon=$3 printf " <node id=\"%s\" lat=\"%s\" lon=\"%s\"/>\n", nodeid, lat, lon waynode[wayindex++] = nodeid++; } - /^ *\(/ { - lat=$3; lon=$2 + /^ *\(/ && !discard { + + lat = $3; lon = $2 printf " <node id=\"%s\" lat=\"%s\" lon=\"%s\"/>\n", nodeid, lat, lon waynode[wayindex++] = nodeid++; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pg...@us...> - 2014-06-08 10:43:40
|
Revision: 2776 http://sourceforge.net/p/roadmap/code/2776 Author: pgf Date: 2014-06-08 10:43:37 +0000 (Sun, 08 Jun 2014) Log Message: ----------- append to .gitignore we won't be committing .rdm, .ways, or .xpm files. Modified Paths: -------------- trunk/roadmap/.gitignore Modified: trunk/roadmap/.gitignore =================================================================== --- trunk/roadmap/.gitignore 2014-06-08 10:43:33 UTC (rev 2775) +++ trunk/roadmap/.gitignore 2014-06-08 10:43:37 UTC (rev 2776) @@ -1,5 +1,8 @@ *.o *.a +*.rdm +*.ways +*.xpm .depends.mk ID src/buildmap This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pg...@us...> - 2014-06-08 10:43:35
|
Revision: 2775 http://sourceforge.net/p/roadmap/code/2775 Author: pgf Date: 2014-06-08 10:43:33 +0000 (Sun, 08 Jun 2014) Log Message: ----------- build failures in the basefiles/ subdirectory are now fatal Modified Paths: -------------- trunk/roadmap/src/basefiles/basemap.sh trunk/roadmap/src/basefiles/shp2osm.awk Modified: trunk/roadmap/src/basefiles/basemap.sh =================================================================== --- trunk/roadmap/src/basefiles/basemap.sh 2014-06-08 10:43:26 UTC (rev 2774) +++ trunk/roadmap/src/basefiles/basemap.sh 2014-06-08 10:43:33 UTC (rev 2775) @@ -1,5 +1,7 @@ -#!/bin/sh -x +#!/bin/sh +set -e + # the shapefiles have the same name as their directory, and no suffix # is needed. shapefiles=$(for d in ne_110m* ; do echo $d/$d ; done) Modified: trunk/roadmap/src/basefiles/shp2osm.awk =================================================================== --- trunk/roadmap/src/basefiles/shp2osm.awk 2014-06-08 10:43:26 UTC (rev 2774) +++ trunk/roadmap/src/basefiles/shp2osm.awk 2014-06-08 10:43:33 UTC (rev 2775) @@ -59,6 +59,10 @@ } END { + if (way_id == 1 && wayindex == 0) { + print "Error: shp2osm.awk got no input data" > "/dev/stderr" + exit 1 + } if (wayindex != 0) emit_way(way_id++) printf "</osm>\n" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pg...@us...> - 2014-06-08 10:43:30
|
Revision: 2774 http://sourceforge.net/p/roadmap/code/2774 Author: pgf Date: 2014-06-08 10:43:26 +0000 (Sun, 08 Jun 2014) Log Message: ----------- fix build of quadtiles subdirectory Modified Paths: -------------- trunk/roadmap/src/quadtiles/Makefile Modified: trunk/roadmap/src/quadtiles/Makefile =================================================================== --- trunk/roadmap/src/quadtiles/Makefile 2014-06-07 20:27:33 UTC (rev 2773) +++ trunk/roadmap/src/quadtiles/Makefile 2014-06-08 10:43:26 UTC (rev 2774) @@ -9,7 +9,9 @@ all: qt19/3d/75/qt3d755007.rdm qt19/3d/75/qt3d755007.rdm: qt19/3d/75/qt3d755007.osm.gz - ../buildmap_osm -c ../default/All --maps . --tileid=0x3d755007 + ../buildmap_osm -c ../default/All \ + --fetcher=../rdm_osm_fetch_tile \ + --maps . --tileid=0x3d755007 clean: rm -f qt19/3d/75/qt3d755007.rdm qt19/3d/75/qt3d755007.ways This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pg...@us...> - 2014-06-07 20:27:35
|
Revision: 2773 http://sourceforge.net/p/roadmap/code/2773 Author: pgf Date: 2014-06-07 20:27:33 +0000 (Sat, 07 Jun 2014) Log Message: ----------- session: set the initial "first startup" position to brighton, england that's where the single provided quadtile is, and it makes zooming out bring up the familiar outlines of europe. Modified Paths: -------------- trunk/roadmap/src/session Modified: trunk/roadmap/src/session =================================================================== --- trunk/roadmap/src/session 2014-06-07 20:27:28 UTC (rev 2772) +++ trunk/roadmap/src/session 2014-06-07 20:27:33 UTC (rev 2773) @@ -5,8 +5,8 @@ Focus.Name: Address Hold.Direction: 0 Hold.Position: 0,0 -Selection.Position: -122394181,37794928 -Address.Position: -122394181,37794928 +Selection.Position: -140570,50819066 +Address.Position: -140570,50819066 GPS.Direction: 0 GPS.Position: 0,0 -General.Zoom: 150 +General.Zoom: 20 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pg...@us...> - 2014-06-07 20:27:32
|
Revision: 2772 http://sourceforge.net/p/roadmap/code/2772 Author: pgf Date: 2014-06-07 20:27:28 +0000 (Sat, 07 Jun 2014) Log Message: ----------- add the quadtiles subdirectory to the build we now preprocess the default preferences file to add the default maps directory. without this, it's too confusing (to the user) where the maps come from, and how they can change it. Modified Paths: -------------- trunk/roadmap/src/Makefile trunk/roadmap/src/basefiles/Makefile trunk/roadmap/src/preferences trunk/roadmap/src/quadtiles/Makefile Modified: trunk/roadmap/src/Makefile =================================================================== --- trunk/roadmap/src/Makefile 2014-06-07 20:26:39 UTC (rev 2771) +++ trunk/roadmap/src/Makefile 2014-06-07 20:27:28 UTC (rev 2772) @@ -370,7 +370,8 @@ ALL_SRC = $(MKFILES) $(C_SRC) $(HEADERS) \ $(PKGDATAFILES) $(MISCFILES) $(MANPAGES) $(SCRIPTS) $(FONT) $(MANUAL) -ALL_SUBDIRS = unix gpx gtk gtk2 qt qt4 icons ipkg agg_support win32 basefiles +ALL_SUBDIRS = unix gpx gtk gtk2 qt qt4 icons ipkg agg_support win32 \ + basefiles quadtiles # --- Additions for Trip plugin ------------------------------- @@ -493,9 +494,10 @@ # --- Conventional targets ---------------------------------------- .PHONY: all gtk gtk2 qt3 qt4 qpe4 rebuild build \ - topclean clean strip install uninstall unix gpx icons basefiles + topclean clean strip install uninstall unix gpx icons \ + basefiles quadtiles -all: runtime build $(TOOLS) icons basefiles $(MANUAL) +all: runtime build $(TOOLS) icons basefiles quadtiles $(MANUAL) # --- Convenience targets, to force a specific desktop build ------ @@ -546,16 +548,19 @@ icons: $(MAKE) -C icons all -basefiles: build # need buildmap_osm and builus to be built +basefiles: $(BUILD) $(MAKE) -C basefiles all +quadtiles: $(BUILD) + $(MAKE) -C quadtiles all + topclean: rm -f *.o *.a *.da .depends.mk $(BUILD) $(TOOLS) $(DRIVERS) # Clean up CVS backup files as well. $(RM) .#* clean: topclean - for module in icons $(OSDIR) gpx $(RDMODULES) ; \ + for module in icons $(OSDIR) gpx $(RDMODULES) basefiles quadtiles ; \ do \ $(MAKE) -C $$module clean || exit 1; \ done @@ -576,15 +581,17 @@ chmod a+rx $(pkgdatadir) mkdir -p $(pkgdatadir)/default chmod a+rx $(pkgdatadir)/default - mkdir -p $(pkgdatadir)/basemaps - chmod a+rx $(pkgdatadir)/basemaps + mkdir -p $(pkgmapsdir)/basemaps + chmod a+rx $(pkgmapsdir)/basemaps cd $(pkgdatadir) && rm -f $(PKGDATAFILES) - cp $(PKGDATAFILES) $(pkgdatadir)/. + for p in $(PKGDATAFILES); do \ + sed 's;%PKGMAPSDIR%;$(pkgmapsdir);g' $$p >$(pkgdatadir)/$$p ; done cd $(pkgdatadir) ; chmod a+r $(PKGDATAFILES) cp default/All $(pkgdatadir)/default/. chmod a+r $(pkgdatadir)/default/All - cp basefiles/us*.rdm $(pkgdatadir)/basemaps/. - chmod a+r $(pkgdatadir)/basemaps/us*.rdm + cp basefiles/us*.rdm $(pkgmapsdir)/basemaps/. + cp -a quadtiles/qt?? $(pkgmapsdir) + chmod -R a+r $(pkgmapsdir) ifneq ($(strip $(AGG)),NO) cp $(FONT) $(pkgdatadir)/font.ttf endif Modified: trunk/roadmap/src/basefiles/Makefile =================================================================== --- trunk/roadmap/src/basefiles/Makefile 2014-06-07 20:26:39 UTC (rev 2771) +++ trunk/roadmap/src/basefiles/Makefile 2014-06-07 20:27:28 UTC (rev 2772) @@ -7,6 +7,9 @@ usc81070.rdm: basemap.sh shp2osm.awk ./basemap.sh +clean: + rm -f usdir.rdm usc81070.rdm basefile.osm + sourcelist: @find . -print | egrep -v 'rdm$$|osm$$' Modified: trunk/roadmap/src/preferences =================================================================== --- trunk/roadmap/src/preferences 2014-06-07 20:26:39 UTC (rev 2771) +++ trunk/roadmap/src/preferences 2014-06-07 20:27:28 UTC (rev 2772) @@ -1,4 +1,4 @@ -Destination.Color: red +Map.Path: %PKGMAPSDIR%/... Map.Cache: 8 Map.Background: LightYellow General.Default Zoom: 20 @@ -21,3 +21,4 @@ Labels.Font Size: 15 Landmarks.Font Size: 20 Map.DynamicOrientation: off +Destination.Color: red Modified: trunk/roadmap/src/quadtiles/Makefile =================================================================== --- trunk/roadmap/src/quadtiles/Makefile 2014-06-07 20:26:39 UTC (rev 2771) +++ trunk/roadmap/src/quadtiles/Makefile 2014-06-07 20:27:28 UTC (rev 2772) @@ -11,6 +11,9 @@ qt19/3d/75/qt3d755007.rdm: qt19/3d/75/qt3d755007.osm.gz ../buildmap_osm -c ../default/All --maps . --tileid=0x3d755007 +clean: + rm -f qt19/3d/75/qt3d755007.rdm qt19/3d/75/qt3d755007.ways + sourcelist: @find . -print | egrep -v 'rdm$$|ways$$' This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pg...@us...> - 2014-06-07 20:26:43
|
Revision: 2771 http://sourceforge.net/p/roadmap/code/2771 Author: pgf Date: 2014-06-07 20:26:39 +0000 (Sat, 07 Jun 2014) Log Message: ----------- add a quadtiles directory, for prepopulated tiles currently just one, of brighton, england. Added Paths: ----------- trunk/roadmap/src/quadtiles/ trunk/roadmap/src/quadtiles/Makefile trunk/roadmap/src/quadtiles/qt19/ trunk/roadmap/src/quadtiles/qt19/3d/ trunk/roadmap/src/quadtiles/qt19/3d/75/ trunk/roadmap/src/quadtiles/qt19/3d/75/qt3d755007.osm.gz Added: trunk/roadmap/src/quadtiles/Makefile =================================================================== --- trunk/roadmap/src/quadtiles/Makefile (rev 0) +++ trunk/roadmap/src/quadtiles/Makefile 2014-06-07 20:26:39 UTC (rev 2771) @@ -0,0 +1,18 @@ + +TOP = .. +include $(TOP)/options.mk + +# this Makefile and directory just build a single tile, based +# on pre-loaded data from OSM. it provides a sample map tile +# centered on Brighton, England. + +all: qt19/3d/75/qt3d755007.rdm + +qt19/3d/75/qt3d755007.rdm: qt19/3d/75/qt3d755007.osm.gz + ../buildmap_osm -c ../default/All --maps . --tileid=0x3d755007 + +sourcelist: + @find . -print | egrep -v 'rdm$$|ways$$' + +depends: + Added: trunk/roadmap/src/quadtiles/qt19/3d/75/qt3d755007.osm.gz =================================================================== --- trunk/roadmap/src/quadtiles/qt19/3d/75/qt3d755007.osm.gz (rev 0) +++ trunk/roadmap/src/quadtiles/qt19/3d/75/qt3d755007.osm.gz 2014-06-07 20:26:39 UTC (rev 2771) @@ -0,0 +1,24813 @@ +\x8B+\xFF\xAC\xFD\xCDW\xF8\xF0\xFD\x87\xBF\xFE\xF9\x87\xFF\xC5\xDF\xFC;\xFB_\xFE\xFE\xEB\x9F~\xFA\xEA_\xFE\xFB\xFF\xFDo\xEC\xFF\xC3\xCF\xFE\xC7\xFF\xF8\xC7_\xFD\xFE럿\xFE\xEA\xDB\xEF\xBF\xF9\xEEϿ\xFF\xF0{\xFB\xFF|\xF5\xF3\xBF\xFD\xE9\xAB\xDF\xFF\xF0͟\xFF\xF4\xE1\xFB\x9F\xBF\xB2\xFF\xFF\xFA\xF1\x87?}\xF5\xFF\xF0\xFF쇿\xFF\xF0\xFDO?\xFF\xF8\xE1\xC3\xCF\xFA\xFA\xEF\xFF\xD9?\xFE\xE1\x9F}\xF5\xF1/\xFC\xF4՟\xBE\xFE\xFD\x87\xAF\xBE\xFE/_\xFB\xDD\xD7\xF7݇\xAF\xFE\xFC\xFD\xEF?\xFC\xF8տ\xFB\x9F\xFF\xEE\xDF\xFE\xB3\xFE\xDF-q\xFF\xE4\x9F\xFF\xE9\x83\xFDS\xFB\xCE\xDF\xFD\xDD\xD7?}\xF8\x93B,\xFF4\xB4\xFA\xE9\xBFO\xF1\xBF\xE9\xFF\xF77\xFF\xDD\xFF\xF8O\xFE\xC9W_\xD9\xDA_\xFB\xF6\xF7\xF6{s\xEA9\xFE\xCDW\xDF}\xFD\xF3\xBF\xF8\x9B\xFE\xD95͡\xFFB\xBF\xF3\x9F\x86\xEA\xC89w_piǵ0b\xD9q\xBD\xCDQ]\\xDEq}\xE4\x9E \xAF\xA7\x90\\.͔wܬ#FWw\\x99\xBD\xF2\xF7\xC5٦\x8Bk;.\xF5P\xF9\xFBB\x98\xE1o3\xE0\xCF_\xFF\xE1\xAB\xFF\xFC/\xFE\xE6\xEF\xBE\xFE\xF1\xC7o?\xFC\xF87_\xFD\x97\xF17\xF8\xFA\xE7\xCF?\xFB\xDF\xE9\xEF:\xE6& \x868\xE3\xD8\xB4rv?\xAC\x84\xD7\xD2\xE8\xFBj%\x96\xE6.`\xD97:Ξj\xDBq5\x95\xE8nt\xD97:E[й\xE3z\x8F\xA1\xB8\xB8}\xA3S)iB\xDE1\xF9\xF2\xF6\x8DN#\xA5\xB8\x90\x9EJ +\xCD\xC5\xED\x9D\xA3\xFD\xB3\xFD\x80ع+\xFE\x81,\xFBF\xE74kؿ\xB3\x97YZvq}\xC7\xF5\xB0.\xBD\xE6\x90\xDCYƆ+vp\xE1\xECx\x96\\xDC~^\x8A\xAD\xF6\xDD\xCEg\xEE>\xD4\xFD\xBC\x94m\x81+\xF6]\xDC~^j\x89u\xEE\xE7\xB37\xDBB\xF7|\xD6\xFD\xBC\xD4\xD6\xDA\xEC;\xAE\xC7<\x86\x8B\xDB\xCFK\x9Dy&\xECC\xB7pץ\xEE\xFB\xDE\xD2,y߇\xD1r\xF4\xEFCm\xC0\xA5Z\xF6\xEF\xB4\xED4]\xE8\xE2\xF6}o!\x86\xB0\xAF\xCB\xEC-g\xFF;\xF7}o\xC5t\xE6\xF6\x9DQ0\xFA\xB8}ߛ݈\xB1݇˜\xFE\xBE\xB7}\xDF{\x98Rq\xA9\xD6\xD6]ym\xDF\xF76k]\xF4\\xEE\xAD֗\xFDK\xB9G\xE0L\x89\x87\xB2\xCB+R//\xF7\xDD.s\x8D\xF2\xA2\xFD\xA5g_\x99^\xEE\xDF\xC2\xE2p\xDFc)!\xBF\xDEۅ\xAB\\xCF2\xF7\xEF\xACv~\xEB\xCByY8\x9CS\xA01l8\xFBO1\xBE藅\xE3yi&a\xC7\xD9iyՃ7p\x8F +\xF4D\xB4\xEF\xAE\xC5\xFF\xCE \x9C\xBD$eǕ\x9C\xEB˾\x97\xD6\xC5ޙg?c\xBC>\x94\xC7\xF3[\xDE\xF7\xAF\xE69\xBA\x8F\xDB\xF5\x84=#y\xFFbm\xD9\xD1K\xB7\xEF{\xB7g\xB3\xED\xEB\xD9B>\xEC_\xDA\xF7\xDD^\x99\xB4\xEBO\xD3%\x8D\x97we\xE1\xF6}\xEF=Ų\xEF{+Y/\x9D\x87\xBC\xA1\xEF\xF7=\x87Ҋ\xFF\xFBp\xDFͰɛ^\x8Afgٕ\xF7p\xFBg\x97m\xDFc\xC8v'\xDDs\xB0ك\xD7\xF6}7\xBBd\xBE\xEA\xEB\x85\xC3\xFE\xD9\xEB\xDAw\xFD\xA9穻\xF7`\xCBf\x8Al\xEBi;_\xEE{\x898\xD7f$\xD3\xC5.\xF7\xBD\x9A\xFAܿ\xD3\xBBJ.\xF7\xDD\xFEޱ:Kz\xB5\x97\xF7\xDD^\x95\xBE\xBFcf\x80\x9A\x89\xE1\xE2\xB0\xEF\xA6x\xC3n\xF7\xA4\xD2\xE6t\xCF'\xEC\xC1\xD6\xE3\xFB\xFB\xCD\xEF>\xFBn\xDBR\xF6\xF5,\xB5\x8F\xE8\x9Ek\xF6\x9DvH\x94\xDEw\xEC\xC1f\xFB5\xF6w\xD3̐\xEE\xBC+\xC2aߛ]\xEF_\xF4\xBC`\xA6\xE1\xB2{\xDDa\xB6Rï\xEAs\xAD\x8A\xD9A\x9E\xB4\x86W%N3{\xF6ۗ[H\xEEW6\xBC*qĄW,\x99\xD9Z_OK\xB77c?-)\xE7\xA0=\xA3YK>n\xD7.)\x8E\xBE[=\x86\xF5՚X\xB8 y\xF6pC\x9Er\xE76tm+\xAC\xF9\xFA0g~\xC5=\xACO\xBAC\xFC\xF6\xFC\x87\xAF\xFF\xDBr\x87~\xFE\xF1\xEB\xFF\xF4\x9F\xBE\xFD\xE6w?}\xFB\x87\xEF\xBF\xFEg\xB4d\xC1\x920\x93\x95/\x91\xF9\xB6\xDA\xEF\x92\xEF\xC6\xCC\xC0k \xE99y\x9B,xD\xB5V\xBC$f\xF6zs\x84\xAB\xC0\xD9G\xEEk_\xAAy\x8E\xAFgR\xB8\xC6u,\xBB\x87b8\xF3\xE4\xFA\xDB~\xCF\xF1x}\xEC\xB55\xBB\xE7m\xB2p\xF6\x8B\x96XS\xE8\xC9=\xFB\x99g8\xC6\x8Bq\xF9\xF8\xE71K\xF3\xD3B͎\xA6g\xAB\x9B*\x81\xBC\xA8\xA7\xFC]k\x82W55\xB36`\xB5\x9B:t\xACh\xE1\xE0mˋn\xD6>ݳ\x85W\xD5\xD4_߽'\xB3\xF6\x93=o\xFBm8\xC7\xE6\x9F7\xCA2\xEB\xCA\xDF7\x9C\xC9\xD2\xC7\xC491\x8Fű\xA0\x85\xE3\xF9\xCA\xE5\xE3\x9A\xD8\xEB\xE5\xDE\xD3L\xDD:\xE6\xFE\xA2\xDA_\xCDűL +\x87<\xE5\xDA\xEA.\xCF\xD9>\xE7Ҕ9\xD6\xC5\xDC\xE2\x9FKFt\xBA\x8CE\x9E\x95\xD9^-ᰞ\xADܟlJ\xF7ֳζ{\xCC&Ϝt_\xDE\xE4=\xAF\xF2́-\xEE>\xD4\xCBz\x86\xB2\xDF\xD7l\xBE\x9B}\xF8\x9B\xCEf\xE5̲\x873M\x96\xF9\xBDo\xBB㈬\x985\x9F'W\x8Em"t\x83\x99Zc\xD7g3\xFA]t\x83b\x9E\xF8m\xC36\xC8ݷ\xCA{`67\xBE\xB3\x97h\x88k\xF2͏?\xFC\xF4ӷ\xDF\xFF\xE1\xBC(\xFE\xFA\xFD\x8A\xFBͅk\xFB\xC2\xC5i\xAA\xD0>\xF05\xA4\xB8p\x99?d"\xF4Rl\xFD_\x95\xA3\xA9\xA7ɐ\xCD4Տ\xD0KN\xE55t&\\xA3)_fN\xB1\xAD\x97\xEF\8\x98\xF2m\xB4\xB4\xE6צ\xB9p0\xC9\xEB\xE0\xEFK3\xB7\xFCr\xC1\x8E\xAE\x98Lw\xE0JH\xBE\xBC\x8BM\xCEP\x88B\xCD\xC5\xFF}p\xC5Jh\xB8Vt\xF0\xAF\xEA\xC3\xD7?\xF8\xFD\xEF\xFE\xEEqN\xFE\x8F\xF7\xB7\xFF\xD7\xF9\x8C,p\xDB̝\x85rK\xE6\xA8\xDA\xB9+!\xC0\xF8\x8C\xCD~\xFC\xFD悽\xFB\x87\xF3\xA6\x9DW\xE0\xEA| +\xE9\xD7q\x9E\xCC\xF8\xB8\x88\xC1\xFE\xF0\xEBE\xFC\xC4\xDF\xD4&\xB6#LhFϋ\xFCt)w\xBBPx\xB0\xE2\xF5\xC5\xF5_8\x84\x94\xED\xD44(\xBE\xF5\xF0\xDC\xFD\xB6v\xF7\xF1蛹^\xEE\xAF1\xEE\x8D\xF9 \x99\xC2\xCCѽ7\xBD\xB1n\xC5\xF4\xF9\xF0\xCFM\xBF\xE0\xEA~\xDFJ \xFD5\xB8p8\xDFf\xFE\xC0Q1W3\xBF\x86Ln?\xDF=\xCCT\xE0<+d\xE2\xCAq\x8F ;ك5_\xA0\x85c\xC8\xD2\xEC\xB2\xFD>\xD91\xB3\x8FC\xE8\xC3\xDC|8\x8B\xF2}\xBD>\xA0gM;\xC3 +\xA3\xDBC\xE2\xE2\xA8g\xEB\xC0\xBAم\xEE\xBE겔\xF7{L\xB3\x95\xD7P\xD9\xC2a\xFF\xB2\x92;.\x9BI\xEB˃~J\xA6-\xF7\x90\xD7Y+\xE0\xE0&C\x96J\xD1\xED\xB8\xD4\xC2k\xE8x\xE1\xB24\xDB8\xB3\xEC_⅃\x99s\xEET\xB0k\xD6^퀅\xC3\xFEٺG\x84He\xBDP\x87\xFD˳!G>\xEC\xD7\xF9\xF7v\xE2\xBE\xC7\xE7\xF01\x94k\x89\xF3\xBE\x8E\xB7\xF5\x9C\xF6&6\xA1LU\xCFz +f|\xA2.2i\x97\x91k\xC2[d\xAA\xA3Ug\xCFF\xDE\xD3<v\xE1\xED\x99\xD8u\x8A}mW\x87\xF1ӿ\xADPB\xA8&#O\xDF\xAE\xEE8\xB3J&\x93)q\xE7\xFC\x8E\xBC\xA7\x84g\xA6%\xE4ue;]\\xDFq2\xB0OU>\xAE\x8B\xC4M\xA4\xF4\xCC8}\xE7v?\xA7\xBC8D3\x9B\xAF=8&\xDCD\x8Am\xCF\xE1\xE82#\xD3\xD2\xFD\xBE\x98y^\x9F\xBC\xD7{PlV\xF3\x85\xB8\xF6\xB9\xDAjܖ\xD1(\xA3\xCC \xD9t\xC8m\xFBY(\xD3T:GЭ\xBE+c\xDF\xFFGo\xFB\xD1\xCC+c\xAEIF\x85/a\xB6@K7mt\x93\xB1\xE9}sN\x9D\x{DA5C}\xE1\xFDߑ(\xE5'&c\xF96we\xEC\xF7C\x95\x8D\xF7?ږݖQ \xA3F\x9E];i\xE9\xF6\xD9݃\x80\xD3\xDC\xD3>p\xAE\x94r\xBC}v\xF7 \x9Er\xBD\xB0⌽\xF5\xDB\xEF\xC6\xF0\x93\x8C\xC2w\xC3\xBBv\xFF\xEC\xEEw0\xEA%\xC2~\xA4\xDC<\xDF~\xE4=\xC87Ͷ\xC9\xB4\xCEXF\xBE\xBD\x8F{@\xD0dTm\xDB.#\xD9"ߖ\xB1\x9F\xF9\x90[\x85\x8CQrxM\xA3/\xDC~Ɣ/C\xEC\xA6\xF7\xD2[=\x86 ݭ\xC8>\xCB5r\xB7\xC2\xC5u\xE0Z\x85>\xEE\xF6\x98\xBD\xD6.\xDCn;\xDBc\xC4\x93\xFC\xC2\xD72\x9D\x85\x9B\xC0\x8D\xB4\xD7F3!\xC2k\xFAV8$3\xD2n\x87\xA9\xBF\x96=-\\xAEtزM!\x9FWI\xB8\xDDv\xB6\x9F\x87\xB4}l\xCA\xEF\xDE{o%#SF@)\x89\xF2^\xD9]{$1F\xAF\xB9_J4Y\xF3p\xBBl\xCA*\xA6\xFDN\xB6:\x9C\x92\xBA\x85\xDB\xFD+s\xFC\;2\xF35ٻp( \x91\xBF\x9C\xF1\x9D+\xD5\xE1\xE1\xE0\x97\x92\xB0\xB7u \x8E\xCDm\xB8B\xFFXEX{\xDC@.\xAC\xFB\xFB\x98\xE2\xEF,E\x88\xE6%\xC5\xD7d\xD2±\xB4jL\xE8j\xA9\xC7\xCFvPJ\xD9ZEB/\xDA/|-[\xB8}=s\xD7\xEE\xB8fO\x83/o\xD7'\xE3 +i\xA8_q9\xA0\x942\x84\xF7;\x97B\xF2\xED\x81\xF4\xDCP\xA2h\xBFn\xC7 \x97zID\xD5V\xCC\xC5qqL\xB8tڔ\xD5\xCEax\xF5\x8F\x85Cྵy͌\xBA\xD7Z\xE1".-M\xEC_\x93\xDB\xF9\x96d\xA0d1[}\xAE\x9EV\xA3\xF3\x8DLƖQV\xD5\xED\xB7;\xEF\x81p\xBBN\xCAiU\xFD\xEC\xEFO{\xF53>\xFB\xB7!\xE1\x95\xD3`Ruد{-a \xAF\xFCK\xCD\xF6Ƿu\xBF\x91\xBC\xCA:(14\xBD\xEA\xDCs\xE1\xF6\xB5\xB4z\xD2^\xAA\xE6\xF9\xBE\xEA[\xE1 +p\xE6p-\xED\xB5\xF5J\xBB\x9B=\xF9\xC4%r<\xC7\xFA\xAE\xFD\ʇl\xD7D\xE0\xD7\xFA\xF0\xFD\xB7??\xF7\xEE\xC3w\xFE\xFE\x8F?|\xFF\x85\xFC&\x85\xD9\xF3\xEE\xF6\xAF\xABaᄏk̢\xD8\xE2\xF7=\x92\x82,\xBD\xAB\xF0\xB9'\x8B\x99{\xE3\xE3^l\xA9\xB0\xE5x-=Y\xB8\xABfދ\xB2\x93\xA9\xD8\xEA\xBC \xA52\xF3`\xB6H٣=)\xAA\xDB\xE0\xEA\xFC\xFE\xDB?|\xF3\xF3\xB7?|\xFFH\xEC}\xF7\xC37\xFF\xF9\xBE\xFD\xE9\xC3oe\xFF\xFE\xF4\xED\xF7\xDF\xFE\xEE\xC7\xFE\xFC\xFD\xEF\xBF\xFE\xBB\xFE\xFC\xF3o/\xF6Isߦ\xED\xCDq\x82\xB7\xA5(Ӣ\xAD\xB8\xE3\xBA\t\x87\x8A0{\xB2\xC3^5bOv\xAFu\x80\xD7 \xAF ؘ\xD6yr.\x97\xE1:p\xA3\xEF\xD5f\xAF\x99Zp*\xC9t\xE8&\xBEӞm\xC7\xE8\xFD\xE6\xDF\xECvJ\xAAt塒L\xA6\xD9n('\xBC\xA3\xD8\xAA\xC2J\x89\xAD\xEECw\x8C\xE1䍺'O\xF4|\xB8\x8Fa\xA8ֲ\xF5\xE7\xC5̛\xD7\xFE\x9C\x85+\xC0\xD9\xE3\xF0\x9D\xA6\xF4\xDC\xFDC\x95W)|h\x84k\x87߇\xF3b\xE7\x83WԬ\xE1\xE1\xEE\xD2l\x9FU.\x8E\xD5\xF4\xD7i恢\x9E\xBD+\xFB\xFB\xB5e\xB2\xB0\xB1$\\xFA\x88\x87;\x9B/{0+\xC4j/֫\xA1-\\xE3\x9DMp$\xECJ\xA5\xE4\xE3p\x87J\xBF<\xB3\xE9v-i\x88\x8E\xB4\xEF\x9DT\xCB|\xAD\x81\x86}\xF9Q\xFC\xFD\x97\xFAku\xABpxHKoA!{\xA8\xECq}\xD7ޡO\xA6\x98O\x91\xF9\xF8\xE6\xEE$\xF5\x84\xC3Zj +v#t\xD5\xD19Fhx\x86\xD56\xF6si\x9ENu\x82\xD5E\xFD;\xAE*\xA2\x84\xB5\x9C\xF5\xB5N\xE1\xA0W̞D圹v㵯c\xE1 +\xEFyF \xA4\xAB\xDA\xC1\xDD;&\xB3S\x98\xE8'\xB0#>\xBD\xA7X\xFD;.(\x80\xE2$E\x84\xAB\x90g=_~\x9F\xBF\x9EH:\xAB\xC6\x95\xA0\xAA\xEF\xF7\x8CJ\xC3\xED\xE7\xA5\xFER>\xF9+\xCE\Ϩ4\xFAd\xA4\xEE O+\xE5\xEA?$\x9D͇i\xE8#\xE9Վ\x9E\xFB\xFB\x90<\xAE\xE6\xD9 ɦ\xC7y\xC9G\xFB9 +\xC9\xB5̺\xFB\x8E\xE4q5\xA3\xE7l\x9A\xFC\xEA\xAE\xE7`a\x82\xED\xE4\xD9F8A +\xE1*q\xA9!8\xDB\xEE\xBD\xDC\xF7\x86\xC0\x92\xADI\xF2\x92E\xC2a\xDFe~\xEC\xAC\xF1ڗ\xB3p\xD8wA\x9E\xA9\xFDת þ犾\x95U.\xE7\xFE>$\xAB\xABLaG\xD8c\xF1ڷ\xB2p\x89\xB8L{\xAE/\xB8!\xF6]E\xA0\xB0?\xCC\xF0\x82\x86þK\xED¾\x9A\xC9K\x82 +\x87}\xAFi\xEC\xF7\xC8̹\xA9\x87}o)\xEFի\xAA\xA7w\xAAW\xFB\xAE"\x89\xDDEH\xE6V:\x81H\xE1x\xDFG\xFB\xFE%\xFA\xFEw^\xEE{\xAE\x90g\x8DSDTZD\xD0\xC7p\x8FF\xDC_q\xF6ֺ6ȣ\xD6\xEA#\xCE\xCE\xC1./۹w\x82v±ة\xB5]\xEF\x9A\xFBa?\xD9\xFB}1\xB0\xD8)?:\xE6\xC55՛\xBB8\xEE{(\xFB}\xB7\xD3cf\x82w\x8F\x8D*\xDB9C\xF5q\xCAsej\xAE\xB8j\xCF-~_*<\x9F%\xE6\xEE\x8B[p\x8E\xB0\xA0\xEDϴ\xEC\x9C\xCF\xFAl\xFC'\xA7߇\xA2\xDC\xCE\xEB>[\xA9ն\xBFcv\xD7Cv\xFC0\xE1`C\x9A\xF8\x8E\xEF|T>x8\xD8K\xF6p\xEE\xC5L\xA9\x86,\xCB\xC1\xC3\xC1^R\k\xFF}U\xE9v_쥢z\x91g\x81\xFC6\\xA4\xBD\xF4\x8C\xFF\x8A\xAB=\xBDvQ,\xFC7\xD3/\xB8^\x87s>\x85þ\x9B\x82\xD9\xFB\xDB\xECq\xAA\xCD)F\x8EvO\xE98\xD7%\xE4\xEA\xEDC\xBC\xF8ozo\xF7uiif'\x9C#ϋ}\xBE\xB3\xC6\xFAڿ\xBEp</\x91\xE7\xCC~\x9C\xD3\xBBp8/-\xD1ϴWz\xBC\xF6#/\xDC \xAEB/\xA9\xA1\xF6\xB5\xAA~\xE1h_lj{\xDBs\xF3\xECV\xC3!Q%y\xD0\xF3=\xD8Qw\xF6/\xD2?5ye/\xACTB\xDB +\x97\x88߁"\xF4ͻ\xF1\xE2kV{\xF0\xFBFϯ]&w9/a'I#\xD8\xF9\xEBRy\xAE\xF3^̓\xEC}r\x8A\xD2\xAE\xF1\x84\xF2\xE4\xC1yz\xD0p\xD4/\xABg\xC3\xD5\xD5g\xE6\xE1.\xBE-\xF5\xB5:\xE1{\xA2\xC6\xCE\xC59ǥ\xEBc\xA6Wb\x99\x85\x83OZ(\xA8\xB5\x83\xE0\xF8c\x86C\i\x99Y\x97N\x8C\xE6ؑ\xC2!b\x86*q\xDDM\xF7\xF7!\xAE\x94\xC1 pu\xBE\xA1X3Ɛ,\xDD\W\xEF>tv\xD8)\xE5\x8Bn\x9FO\xBF\xFB0RC1o]\xCC.\xC9 \xEE\xB0357'\xA6a8&hF\xBFt\xE7\xB5:\xFFO8$h\x94\xA3B\xD1q\x9B^\xECE8\x84\xD1eϣKh\xF4\xF9R\xE4\xFDc\xFF\xE9\xF7_\xFF\xE9\xC3\xFAw\xFF\xFE\xC7?\xFD\xFC\xC3\xF7_\xFD\xEBo\xFC\xE6Ͽ\xFA\xD0'a\x8Bs\x9Fl\x80\x99Q\x85\xBC\x94\xF3\xD7k\x80Y\x84Di->d\x91\xB7\xEB\xEF%\xEE\xA29u\x88U\xF3"]]C\x8E"U\xC9\xC1\xB7.i\x9E<c\xF4\xA5\x91\xD3C P\xC7F\x88\xE4(\x92\xAB\x84D\xB7ن\xED\xB5Z8\xF8\x90f?Fv1*\xF4\xE3\xE2&\xC1\x85\xBAj8\xF3l'\xF4v\x9C\xE0.JI\xBB\xFB2\xEE\xBE_\xA8\xA7R\xBB컩X\x87\xBEM\xC5r\x81\xCB\xEAsq\xA4\x9E=\xE0;\xB3\xDD5w\xDFA\xD0\xCCC%\x85}\xF8+\xA5\xE1\xC2a]\xBA=\xFD8/\xB63N\x89\x8Bp\x8D\xB8+\xE1\x85\xC39K1\xD0\xE5\x9A1\xBA\x{1CF879}\xB6j8\x80\x9B\xDD\xE9+6܅"\xB2\xB2\xBE[州\xAB}\xE1\xB7]\xAE(y\xB0eIN\x8A\xB7^8\xC2\xDB/͎q\xC3KI\xD6G\xB894\x9D\xA5~}~\xBDp\x84\xD79B\xB2bu\xDFw\xC6\xEBL\xED\x98\xB6\xE6\xAA8Լ\xC2AOTsڮ?{ \xD9)=\x8E\xA9h\xA6\xA6\x84\xEB\xFE\xB9\x86\x9E\xA8\xF6ڲW\xC8\xF4\x96\xD3?"Lw5*c\xFF\xCCN\xF1\xF7\x9D.\xC6\xC8}.\xA6\xA7\xAB?;K\x87L\xBF\xE0\xFE\xA9\xB4\xC6W\xA5\xCEҡ\xDEK\xA3̌u߿\xCEҡa\xEF+\xE4)i\xE8\xDE\xDBK P\xBA\x94\xDF\xD9;\xD7<=\xDFY\x92c +\x8D=\xA6\xF0\xAA\xBB,u\xA9\xA4\xAA\x85pqR\xFB\xEA\xB0Ǿ\xDB\xFDg\xFF\x884\xBF\xB3\x9E9]x\x8F&\xDF\xF7\Wͅ\x87# \xA68\xC2w\V\xB9\xA8\x8Bk\xC0\x99\xFF29= \xCE\xEF\xCB \xF7(\xCE@^ +S\xBA\xA5\xBC\xA7\xC4d\xE1\xC5a\xA6ʾwv\xA2\xBD2\xBA\xBA,\x85\xD73B\xA2+ +\xE1\xDCY\xF5b+F\x98\x94\x9C\xEE\xF1\xB1<\xA5\xE0$\xDB6\xF0\xBE\xE4Y\xEE\xB1\xF4=\xA5\x90g\xA2\xDCͤ\xF4x\x8F\xF7\xE5)\xF7%\xB6\x9C E\xBC\xD0o8c \xF7%j\xA6\xA4\xE4\xFEB\x9A\xFC9Rv +ؔ_\xBB\xF3\xD2\xCE\xB9\x82fFZA\xB3w\xF2K\xC7\xDF\xE7H\xB3PWx\x93RC +\xF7\x98:\x9ER +\xA44\xC4\xD3LJ\xBFɛ\xF8\x94\xB2\xDF}\xA9F\x9Cd\xB1\xF6) +R\x85\x82\x944\xDEq_\xC0\x9A\xA1\xD2\xC9\xCF\xD5.\xFF\xF4\xE7H\x94\x82\x93\xD2^\xC9v?C +\x98\x8CZXM\x{19B526}\x9A\xBB7H\xC1} \xF6g\xB1bM\xA3\xB7\xA4\xA8\xBD\xBA\xA2p$\x8DK\x97=\xA5\xE1E'\x96g\xB5\xA4\xB5\xC0\xD2/;\\xE4\xA9\xF0x\x9FH2\x8C8\x99\x94\xCC\xE5\xB5I\xE2\x81D)\x8E\xDC0\xC4DT\xDA\xF4\xCB|"\xC1\xEE;"U\x89\xAD2\xBCFO\x9FH\x96\xC6\xC9\xE2+!\xDC{ +RP\xBEe\xAA\x9F\xA5\xE64\xBF\xC6Þ\xC8K\x91\xE9d\xE4<vo*\xE0B\xB2\xB4M%k\xA0\xB1^\xF7\xB4\xC3C +\x8A\xA2\x94|\xC78\x851\xC2+\xD5\xF7\x89\^Vs3\x87Ld\xD9Ϸ\xBF\x8F\xDCi\xB2\xF8U\xBE\xD7\xF4I\x8D4s\xBAp\xFC\x94z\xD836\xE2\xAC+\x8A]Cd\xC1\xFA\xC0\xF6\x86=ci\xAC)>\x8CY\xA3vg\\xE1\x99yk2\xAAAƬNQ\xED\xC9\xFBV;yC\xCD?-\x81{"Y\xDF\xD1\xB5f\xBD\xF5w\xAC F~\x81w)\xA9\xF5\xD7:\x82'\xEFڢ\xE2ݑ\xE6\xB09ShH\xBC8v\xAC\x91S\x9E-8m\xED$\xD9}D\xA7r\x81n\x96\xC0A\xEF\x91\xDF'^\xF2asx\xF3\x9EH67m\xA9h\xBE\xE3?\x91|r\xDDsF)\xA8\xF8\xB0\xB6d\xF9I +\xCBI\x8Du\x8779\xA2\xDE"+\x88b%\xE2\xFE\xD1\xF7\xF5-긱ޞ\xB3Zes\xE7\xC3\xF3\x91T\xDD:\xBA8CMN\xD5\xEFI\xCA\x95l\xEF\xFD`A +\xDEpuȢ\xD3W\xD1\xDF.\xA5\x8E\x9B\xC1\x84%e\xB0\xFE\\xD3\xF06)v\xDB\xE9\xA9G\xF7\xBA!\xA1\xB4R\xCD\xC0 \x89\x957\xBD\xC8>\xED\xBERo;!p>\xF2P)\xA52^KʞH\xA8\xA0\xD9\xD0We{\xDC\xEBk\xBF\xD9y\xE9v\xA8`\xEC\xC9k\xF8\xAB\x8BL4\xA0ěd\x8AN\x8F\xD4\x89j\xE8\xC0\xB4\x8B!\xF5\xB8\xDE>/\x89=\xB7\xA6d\xF6d\x99J❙\xB5O$\xAA\xA7\x95'\xC1\xF7\xD5\xE20\xCC<\x91\x979Θ\xA9 h\xF15\xB1\xF7D\xA2\xD2>\\x90Ď\xFDZ\xD6\xF9@^zT\xE8\xB8#\xCDoy-Py"\x91}g\xAB\x92\xA8\xDD\xCE>\xA4\xB0\xBF%Gp-\x99WP\xDF`\xD2$T\xEB}\x83\x9A\xF5^b\xE6!'\xF7\xF2\xEC*\xC5\xEF\xDF>\x91dd2\x9D\x81\xEC\xF55\xF5\xF7Dv"Q`\xAC ~\xE3\xA0\xFDY\xBC\xF4\xCE9\x9Cҗ'\xA71\xA58\xF0\xB5f_\xBC&H2y\xA9*\x8F\xEB1\xBCv\x87=\x91\xEC\xA5IoUՋ\xFD\x86sre\xFEB\x80:\xE3\xDB\x9C\xA2D\x9E0\x99\x90\x92\xD4C\xFB)d +\xB2%\x82\x94\xA2\xC8\xC3\xA4\x90\x83l\x9C\xF9\xAAJ\xC4\xC3\xC9e\xBBN\xCD~\xFET\xBE\xEFLo ٗ\xF9b\xD7>\xC2딾\x92\x9D\xE5\xB5T\xBC\xA1b;iC\xF6r\xD5\xD6w\xB2zM\xED\xA73\xCF\xEE\xF2:#N=}-Ήx7.\xFD\xFA\xF3\xB5\xDF\xE6\x89,D\x82]\xFB嵜\xF1\x89\xBCpL\xF6\xB4\x9B\xF2Zp\xF4D^X,0\x9D{\xD1\xC9\xCC\xF8t\xE93\x9F\xB7NI\xAF\x83\xF3\x97عfk\xBB\x8F\xADQ\x95Wz-\xB5x"\xA1\xC3\xD4a\xAE\x80ќ\xC15d\xE1z\xCE\xCC\xFA\xA9\x91\xA0\xAF\xECJO$\xCFP-\xE051\x87\xD3 +\xB1c\xAEf:W\x9A0z:C\xEC+\x93\Cܣ\x87b\iyO\xD0hB\8\xB8\xBC\x89\xFDl%\xA1OL^\x9AS|\xFDDR'ؿ\x83\xCCQ\x9D\xF1yO$\xCEP\xEEH\xBFڏ\xEE\xE9\xC5\xFFm\x87\xB9\x94"\xD5\xC6\xF7\x89\xF0\xEC:\xEE{\xD1D\xB0\xFD\x84ͦ\xC7\xFA +Rp\xEDu\x80M9G\x87\xF7\x97\xD8\xFB2\x88s\x8A\xB8\xBFA +}#1\xB3\xEFR\xB2\xB8\xA8\xDE \x85>\x8D\xD9w{\xB1\x8Ai\xE7\x9B\x89\x9ER\xD8ݜ\xC1Z\xA4\x94\x856\xEA\xBE\xB4\xC6\xBFE4u-\x86\x96\xF5\xD4\xE1\xFBĽ~\xB2\xD1T\x93\xBBf\xECH\xBB?\xAF`O\xE4\xA5+=D\xC8,\xB3\xDDL\xE3.) +\xB59\xF6&\x95\x9B\xC6\xBCA +\xC6,\xF8-=\xB4w\xDC;\xF2\xAAƑk\xEDNp}"q\x974\xE339\x9C\xAE\xEE'\xB2\x99w/\xCB\xDE;+\xB0\xC7) \x86\xBE;`u\xEF\xAF\xCD\xE2&8"yyG\xD8 +bM\xFE\xCE'\x87\xE1ޖ +\xAB|ďu0kQq\x92\x97\x83\xBA#\xED?\xF2\x8A\x8A*\xCD_\xE9@\xCE\xF6J!\xF2D\xF2x\xB27|\xFC\xDA\xE9\x90?=\x91|+\xB1@<\xEBN\xE2\xB50'i\xC4\xC3;\x9E \xF8\xEF\xB2Z\xA5$\xD5\xECߗ\x82\xAB`\x86\xC1\xEE\xB1'\xD1U\xA6\xD3\xFA\xE1x\x8F\x91\xC9\xE1Tz I\xBA\xDAI\x9C\x9C4\xC5\xF8p\xB3W:\x81\x9A]5\x95'G\x83\x84\xAD]\xB33/\xC8\xD7a^O$\x93\xB6\xBE\xA1\xFAm\xC7!\x94\xD9'S\xAF\x85\x83+\xA5\xC6֍$v@\xB2'R/莴\xC5>x\xD7\xE0H2c$\xBB˧\xE23\xB0\xA4\xE9k+^A5W\xBAZ\xCBCbf|I\xACN\x90\xF6\xAF5\x9B\xE7\xF9I\xBC\x95\x93\xE3\xB29\xF2\x87\x88\xE4`\xB1\x868\xFA\xD8\xF7T\xD9'\x92\xDB]"b\x99\xFAS\x87*\xED1\xAEۍȡ\xB9\x96\xE5\x90\xCD\xE3\xB2ݏX\xD5/H\xBB\xF6\xE5P\x8A0X\xAC\xB1\x86\xECȮ)1>\x92p4v}v\xE6V\xC2M3\\x90\xB97\xCF&A\xD7w\xAA\x8C\xCEK(W\xFB\xB0\xB63Pe\xB4\xBAg3\x93\xFD\xEE|7M8\xA8j\xB9\xC6`\xFF洶=[*Ce\xB8xP^jz??\xE7?\xD1U\x95\xD5?\x8D.K3\xB2^)\x81\x9FH6mg>\xC9\xD1V\xE7P\x8F8險\xBBn\xDF\xC9h\x8E\xC1\xC1\x94\x9C\xD7v\xBDQ\xE2k=\x98]UfyT<8\xCAѥ7\xEFH\xDC\xE2ʼni\xDDL\xD7ê\xC2\xD5\xD5\x84#\xA2N\xE5\xEC?o\x93\xD4c\xCCU\xB5\x9D\xA7U\x85ci\x96`\xC2\xC4R +D:\xDCL\xB8\x87\x9A-\x87\x9DT\xC3\xD9\xC1t\x98\x97\xE9y\xB5\xA3g0\x84\xE0Pt?\x91\xD8I\x95P\xA1\xFD^u\xBE\xEE\x99p\xF2\x96[\x9E\x80\x8C\xA7^\xE4\xC9Yx\xE6$\x91\xA0\xA0Fg\xBE\xD8 R\xA36\xF1k\xEC\xA9\xDEw\x92\xB0\xA4\xF5R[\x86r \x9A$i\x85\x94\xBAS&\xAFo +N\x8A\xB4\xD41\x90c(\xC6u\xFA\x9D\xD8\xCFA;5\xF4\xE4PY:I(\xD2\xC9\xE8\x87\xE6\xED\xF4:iA\xEA\xE4d'y⇾\x9D\x89\x8E3\xE51\xE35\xEAl\xBCΚ +e\xD6F\x93\xD2\xC1\x99pD4c`\xC2h\xBAS;\xDDl\xB8\x9Aֱ\x87\xCDA5\x85z\xF8Z˩7\xCE$\xEA!\x8Eӛى4\xB7\x8E\xE4>3\xBCN\x97RcK\xB1\x9F\x97y\xA1k:\x8C\xFB; +\x89\xBBb\x92\xA5\xA6[\xE6\xC84\xCD\xDDx?KB\x92-\xEA\x95{\xC9\xA6v\x974D9\x84\xF13rʽ:s!Q)\xA2^^Yd +\xCE\xDA,d!ꊹg\xCF]_H\xDC/\xD38\xEBʘz\xC1g!;\x91\xB4C\x99\xC1sA\x84D\xA1\xB4|\xEE\x99\xF6n\xD2>\xA4\xE0^Ԏ\xC4C\xC1\xE9\xEBX\x90r\xF2\xFE\xD3T\x9F\xD9\xF0\xC2`I}n\xF7\xA2\xBC\xC2߅\xA4>\xCF\xC3%\xCCA\xEA^G\xC4BR+w\xED\xE2\xF2!\x9D\xFBoȎ4\x93=\xEB\xB0_ +\xDBA&Ú +Y\x90\x8CO Gsr^nGC\x8F\xAB!\xEDD:RH\x8404\\x90t\xF5\xB34/\xF4ւ\xCCV +\xF7Sm\x9E˫.Z\xBE\x95\xB6\x97 \xA71zޓ\x90\xE8\xE0\xB4{\xE2۵\x9F\x99dLjsFLh\xD48Z\xFF]\xFD͎\xB0`\xF20\xFB\xCB\xD5\x99\xFD8\x8B\x96Sy\xFB \xEB#\xC7e\x85\xD7V\x99\x87\xBB"\xB6( 5\xDD=\xB7\x99]5\xC9\ \xEC\x8AbYދ\xB7\x90\x9D'\x81#\x8D\xB2=\/]f\x9F\xFD\xA8\xE0\xD24\xF9k\xDC`\x94\x90{$\x95\xA6_V5x\x91\x82\x85\xE4\xCDL\x88\xD8/\~o\xFB\x85M\x9E;\xA797\xDF\xC2_H껀@\x9Dݻ\x9E\xBC\xDAڅ\xA4\xFD\x9A\x91\xF44dK\x9EE\xB8\x90Ԕd\xAD^2f!i\xBF\x89媚\xA47\xAE*\xEE\x94F@\xBB\x96\xE9\x92r-$\xA9N\x9F<f\x91\xBDx\x96\xAB\x90z\xD5\xC9\xE1p\xA6 5 \xF3m\xBF\x90\xAFݼLHVd\xF1n\xFAyIa<` \x85WM\xCF})\x99\x91\xA7\xF0t\xEF?J\x91J\x83\x94K\x90\x99C\x88\xC4P\xF7\x96\xDF\xC24\xC1\xB3\xFEW)a\x84\xB7Ha\xA2\xE7Y\xB7\xF5\x8BD\xF70&z&\xA7O\xAF\xF1\xF5\xFE\xF9Ό\xF2\x99~\xD9\xC9qe\x9COHD\xF9\xD4\xE5\x84Q2\xDDN\x95\xFFgF\xF9D\xAAM\x99\xF7$%\xE2\xFC\x95\xC5ܾIQ\xDD\xFF;\xA4\xE0\xFCUE&v)\xB2\xA9{\xC6\xC2\xF3\xFDAqk\x8FƼ[f\xB4\xA4\\x8A,\xD0fRV\x9A\xEA\xBEvg\xD4\xCCST5\xCD\xF4\x8B5e\xADbC\xCDlੴ\xC5u\xE6=\x90\xD7\xDA\xBA\xA9IM\xEFS\xF8\xF9R\xA33\x8C\xDAd\xEF\xA7"[He \xF7'\xCDl\xA3\xEAu\xB8.$\xDBr\x87i*\xEE=\x8Fi!YW58\xF9+\xA5\xC5p\xF2\xBE\xB5a\xB5Z\xBFI[Sx\xDE&\x8D\x94Hriv\xB7\xD8\xECE\x97i!Y\xF0/\xF6\xA4i\xAE\xA8\xC7ݾ\x90\xACg\xECq\xAF\x8D\x8Bz\xEC\xBDD\xC9B\x92\x94\xE6Z5\xD7hz\xDD\xD8Ib#3\xF6\xF7\xA7B\xB3\x98\xBD\xAA\x89\x85$\xB1Q\x8Byw\xA3\xCCM^\xD2c!\xB1\x93\xADLr\x9De\xBA\xD9R")$Aj\xB9\xFCU\x88{\xB3f|I\xE1\xC0\xF9\xCE\xE2k\xCC\xE9\xCDڽ%\x85\xE3\xE9G\x85!\xEB"_\xB8/\x85d^\xF66P\x8AN\xFD\xA4\xB0c \xF7 )%\xBFr\x88\x8EvL\xD4\xF9E\x8D\xED{IU}\x8Eܻ\x91P[\xA3\x86*\xBC\xE3\xB7\xE0\x8E\xCE\xE7F\xFD*\xC5?\xA4\x9B3Iբ\xA3'\xDAE{\x87\xA1\x8Ap~ +\x9D\xCF}\xF7\xC9\x97\xCCє7\x89\xFB\xF2x\xE1C\xBE\xA1\xFF\x91.PxD3bv%\xA8\x86\xF3}\x9FZͦ\xA5\xB4\xA0\xF1K\xF7oZ\xCDUCŴBE\xB7;\x96\x9C\xB3\xA4\x8C)\xB6\x9E\xFBR0]w\xCDg\x85\x94\xF8DŽ3u\xD5 7w)f&\x9D,,\xA4q\xEA\xACq\xE7q7\xE4\xDAQ\x89 e\xE3\xFB>Sr\xDA)\xF6ZG\xDBC\xC3\xEC\xC8QC&\xB7Pc!9\xA3\x9A%a5\x8F\xECA\x84 +Ֆ\x98\xF1\xB5Y\\x89w\xF7\xE1\xD9\xFD\x942\xAB\xA9\xF6\xCB\xFCآ*|J\xF9\xB5\xF7\xF2_\xFD\xF9\xC7?|\xF8駯\xFEͷ\xDF}wu\xBF\xFF\xFA\xEF\xFE\xFA\xFB\xFF\xFE_\xFE\xFC\xCD\xFF\xDA$\xAE?\xED\xBE\xFD\xAB\xFF\xE7?\xFCo\xFF\xCB\xDF\xFE\x9B\xEB?\xFF\xE1\xEF?\xFC\xF8\xF5\xCF?\xFC\xB8\xFE\xDD\xDF\xFE\xF0\xE7\x9F\xFF\xF8\xE1Ǘ\xA6Ͽ\xFF\xE1'\xFBs\xCF?\xF6\xFEM\xAC_\xCD\xFF\xF9\xBB\xFE\xA3\xBF\xFE\xF6\xBB_t\xC5O?\xFD\xB1y\xF4\xBC\x98\xFB%i\xA4\x95Kuf\xA9\xFC\xBA\xFF\xE6\xEB\x9F~\xFA\xE1\x9B\xFF\xFCR\xA8w\xFA\xFD\xFF\xE6_\xFE\xED\xBF\xFB\xD7\xFF\xE7\xDF\xDE\xFF\xFD\xFF\xEA\xFFn_\x8D\xFF\xE3~\xC3\xCF\xDF+3\xA6\xD90\x8F\xAC\xE1\xC8\xC5uu;Aq\xF2\x81\xE7\xD6\xEC\xC9\xEC_\x8B^\xD8N1T!\xB3!\xCDt\xB9=\xC0IR\xD81øH\xFDn#˒\xC2F\xAA\xD01?T1\xF0)p Bl\x89R\xEA\xC8g\xA8\xF0\xA3\xB3]*\xF9ڌ\xF7\xB2^\xE8\xEA\xA6pm\xB7Y +%\x85\xA124\x94\xA2\xEA\x817H\x81CXb\xBB\xFC\x8D\x99\x83\xB6\xDEF\xB8jZ\xB1ۃk\x96\x84\xD4\xDC +)=\xE7w\xEC>\xB9d\xE5\xFCSJ\xCD\xEF8\xC9\xE4\x92\xCCr\x98\x94\xDF"tJ\xE07U\xBD\xE3\xED\xF6ZI\xA1#c\xBE,9~ߒ\xE50U\xF3\xA8^8\xE0\xE7\xEAǹ/\xB5*C\xC5\xD5`4\x95\xDCwHi\x94R\xA5\xACn\xF0\xBBRZ\xE0o\xB1[J)\xE1 +\x94\xDE\xD0J1\xBD\xF6\x86}\xC1\xA0\xF0\xA1\x92\xC7@)\xED-R\x90\xFBQ·]\xA5\xBCA\xF3c\x84\xF7P\xE8~\\xA4\xDCn\xB0]Rv]\xA5\xED\xF5"\xA5\xBDc\xF7Q\x97\xAE'\x80\xEB;B:\x9D\xB5q\xEA}\xD73\xF6\x86\xFB\xC2!\xA3#\x89\xF7\xA5\xDD&V\x90\xB4\xA7+|a\x8EnO\xC6B\xE2\xD4\xCA\xBC\x86[!\x91\xF4\xAD\x84\x8B&(\xD9cP^\xE3\xA2\xF6\xAFՠ&.\xAE7n\x9ERͭ\x9B\xDDT\x999\x847\xD8\x83ށ\x98\xA0\xC1\xFCnί[Q\xE5Il\xBFL\xADO\xBA\x9B\xF5\x90\x87̤@-Ѣ\xB6\x8Bv\xFB\x9CH +\xD3m\xF5BZ\xF1\x98$q_ +'@q\xA4\xB8\x87\xEE{:\xF197\xF4\xA3\x94q\xB1v\xEC~\xDF\xD6E\xAA\xEE\x87\xE5\x96\xEA\x88W+\xF4\xF6!)\x9C\xAB.\xC4-Jg\xBDC +\xE7N\xF4\x8Bj+\xF6)x\xEFL +z=B%\xBF\xC5t %F\xBC\x9F\x94\x92\xF8\x86\xB3]VL\xF6wHA`0\\xC9'\xC6|\xCBI\x8EL\xC7N\xCB\xB3\x947h\x98\x82.\xAD\xAA\xC2]P\xFCL%] +XP\xECP\xAF\xF4\xD3\xEC\xFDw\xAC5\x884\xEAʭ\xEFRb\x89\xEF\xB8H\xFF\xD6R.>R,\xB7g:.)H+\xA8\x8F\x94R\xDE`\xF1K +\xD2 \xE6\xAA\Kxˊa_j\x9B{\x97~Ku\xEBp\x85Dj\xAE\xB54\xAF\xAB\xF0\x8Eۃh\x84&Y\x82C\xD0V\xA1{\xF3\xF7\xAE\xB7t٥\xF6\xAD\xCB4\xA8h\xAF %\xC5r;\xF2#)8q30\xBE4E\xF1)8q\xB3N\xFE\x96\x9Cޢ @\x82\xD1B\x8Cd\xAD\xCC\xF36\xEB\x92\xD2 \xE5B\x9D2Mۿ\xE35Dg\x9AR.\x85RF\xBBa\x90\x94\xFD$khw\xBF\xB5\xF6\x96ݟ\x90\xD2#? +@\xBDA +\xE2K-\xC5\xC2\xD7f\x84\xFE)H\xA2\xA5\xCA \xC2\xD3\xBBw\xDCJ$\xE0\x9B9A\\xB1\xEF\xD7KJ\x86\x94\x9A.R\xDA\xEDy\x89K +n\xA5\xF8\x9Fv/\x847TjK +\x8D%3\xBEB\xCA\xEF\xD00\xE8\xF5i\xA5\xC0\xAA\xCF\xFA)\xCCB\xE2>\x97E?\x8D\xEFo\xF0\xA0 +\xFA\x82Za\xE9̚#\xFC +\x88\xB2 u ^\xA4\x84\xFB\xB9\xA28J,Ze +_7\xAD\xBEc\xC5P\xF4Д9\xA6\x94\xF4݄r\xD5^\xF8\xA8W"\xEC\xBE\xEC~\xAB̮\x99\xCC\xEF\xD8} \xC8\xE5\xBCHy\x8B\xBD\xCDb\x85\xDE\xD2U\x9B\xC7w\x9C1\xF4C5\x8D\xA7\xBEHy˾\xB0b$\xE6\xBDl\xF7\xC7;t\xBA\xA5T.u\x99nhwߋ>&\xA3\xEE\xC8^\xC7\xF5M{\xCBZ\xC3 +\x98\xE1b7͔\xDFa\xD1 3\xD3\xEC\x8F^q?\x9E-)\x99R\x90˒6\x8B\x80~\xAD6k\x94\xD2\xEA;\xEE\xF3\xC4\xE9\x9C\xE4\xCA7)\xE3~.KR\x{197CDB}m~\xB1\xE6\xFDb`I\xE9\x90R\xF3\xBC\xFC\x96\x{18E4CC}8e\xFD\xBA/\xEF\xB1\xCD\xC1\xCAdR.>\xD5.\xEC\xDB́ +9.k]=z\xBD\x85\x8C$Y\xF4i\x832\xD9\xD39\x8E\xC8Ld\xE1\x9E\xC5\xEC\xF29-d!\xB2\xD2\x8B\xA5W\xA8\xFE\xE6\xDA\xC6Z=j\xB4\x85ld\xBD"`EnR\\x97ܕ\xB8.\x9E\x8F\xC4y\x8B\xCC^y\x99\xB6'$\xCEPd\xB4S\xC5x\xDDc\xD91_1\x90^\xE6\xCB\xFAD\x8B\x89l\xFCڒ\xE3Qf"r\xF2$\x94\xE1\xF2 +\x893G\xA6\xF5_S?\x9D!\xE4wzJ\xBB\xBC\xD6w\xC4r*"\xB5\xBBF\xAB \xB7o\x90\x82x\xABH¸ +\xF9)إ\xDA +u\xC4XC\xDB\xEFK\xC1\xBE\xB4\xDCy\x8A\xC6x\x87?W\xD1rfg\xE4\xF2[\xE6{v\xE4\xC9]c\xF7\x90\xE3\xF59\xBA\x9Aq\xEFL\xA3a~O\x8CQm]\xEE@\xED_\xD7\xA3zAzT\x9A\x89]Rv+\xDC\xFEY!\xA19\xA7\xCA\xFBvdZ=\xA7.\x99C͌)\xB9lT\x89\xAF\x9D\xA2\xDD\xD2.\x81o\xC1WIJ\xBB\xD9p\x9C\xBDb\xFA\xF7\xF7\x95uft\xD6W\xE4z\xBF\xB3:Ί\xB8\xF7\xF8\xA5\xF3\xEEW)\xE2Dx\x87\xD4:\x84Y/)o\xA8;\x90TqD\xB6\xA6\x88\xA3\xF3\xBA\x8A\x88\xF4\x88"$\x86\x941Ov\xE2\xBFCs\xEE8\xFF;F\x97\xD5CH\x9C\x858\xD0\xFA\xA0ڴ\xEA\xB25\xD4\xF1˳\xB5U\x99\x94whC\xC46E\xE8\xF3R;\xF7\x8E\xFDm\xACjc\xC6A\xBF\xE5\x9Es\xED\x97jCpJ\x8A\xE8\xC3nK\xFC-\xEDZ=Uߑᬃz3]\xAB\xDA\xDE\xA5\xAF\xA8\xBDY\x9C\xFA\x97\xDFR\xDE\xF0.\xB5r\xA9j\xA3\x8D\xAC\x96\xE07\xEC~+\xACj9_\xA4ܯ\x9B5)\x88\x9F\x8B\xA4)\xB3\xAAM\x85\xA1\xEE}n\x8DU\xAA\v"(n\xB3\xA0!;w\xC9\=\x9C\xEB^ݙ\xAF b/\xD7\xC4\xDEN\x97?OH\xDC%\x8DB\xF20.|!\xA1Q\xF2\xEC\x8Duu\xB9l\x89\xD6Y\xCB\xF7$rېҦ>kk\xEE9\xD7vDw\xD4\xF3BB?۵\xA25h\x86\xCFi\x85\xC0.\xB5\xD8E\xF9&\xB4\xECr\xC5E\xB5\xBB\xED\xC8>g\xE5;\x94]\xEEυĮ\x8CJ\xDF8\x8A\xA7¯ \xF7ߘ\xF6lcW4 \xCBkM\xBB\xA2\x9E6\xAC\xAD\xA6\x9E\xBEv\xBF+*Zdmf\xE7و\xEC\xD4KY\xCDU\xF7\xEF2\xA2`\xF3\x8A\xCB\xCDN;\xADfG\xE4h\x9A\xC7\xCDi\xB69\xB9\xC0\xB9\xEF\xE0\xD4\xD7K\xE7<\x9C\x9A\x8E\xF8\x8F\xAA\xE0g\xB2\xBA\xCC{B\xA2\xEA4\xC5p\xB5z\xEF\xB7\xCB\xC7I\xBEF{\xAF\xC6K\x85\xEAl\xB8\x8E\xB8\xD2\xCC䀒\x94w\xBC\x8B1\xA8\x99{\xA3\xDE\xCC\xF1\xF6\xB8\xB6%e\xB1TΓ.\xE7\xEF~g\x94\xA4\xECN\xA1\xAEt\xF1\xDE\xF1\xFAv\xC4\xC1\xE4\xA2\xF1Ɩt\xBF;BR"\xA4\xF4Zp\xEF\x8A\xBD\xFBw+פin\xCC\x89\xBBdǑӼŢ\xE1\xBF}\xAC\x9D\x9F=_\xEA\xD8\xD5;\xE6[A>s\xC0+=\xA9\xBEF\x85\xDD\xDF\x9Cy\xD5\xE2\xE2\x85\xED\xE6\xE8\xB4,b\x83s(\xDD\xC65\xE9.?\xB2\x908\x9B\x93\xEC[\xBF\xE5鱟`ڢ\\xF6!\xC6\xD3k\xB2\x93H\xCDUQyj\xDCiY\x80lד\xFAݳל\xCE5,\x81R\xD2'0\x92\xFD\x86\x94)\xCFr\xAD\x8Fw[Cy\xAB\xD0wdzN\xD0\xDC\xEC\x8Cꍥ[ȹ#_\xDE!sqߡ\xEF\xF6\x9Ef\x93\xD2\xC0خ\xB8\y\xE1K\xFD)\xE8-yH\xEFR\xBA\xCF\xE7*dڑ%\xCF\xC1\x88\xA8Ɓ\x908\xB9f.1\xA3\xDC\xDBᶠG%,\xBE$ \xDF@\xFE#)8\xB9\xA5_\xFC\xEFP\xDEa\x81\xF6\xDC/\xBF\x85Y1\xEB\xBEC +Ϊ;UH)\xE9\xB4K\xE7O\xA5\xE9 \xC8\xECS \x893e\x9B\xB9s\x8D2\x96~\xB8\x93g\xAA\x9A=\xBC\xDF\xC90\xFC\x89\x893e\xFF\xCD\xC0\xD7\xCA\xD3:!q\xA6ZIWdp\xD9\xD8\xE3z +vd\xA7/g\xDE\xE3+Q\xE1g\xEC`\xC19\xD1h\xBC)EDs\xF7\xA5LJ\x99\xF0\x85MJ\xBDM\xDDfR*N\x86JO\xB8bY\xEA羔\xC4\xDF2—\xA4|\xFA})<q\xBD$H\xE9=z\xD3J\x92'\xAEv\xC4tQ\xC7\xE1ͯ<q\xB52g\xF6\xDE!\xDDk\xBF d\xD6\xE4\x91[\xC8\xF1\x9BȒ\xB27\xECX\xC8.\xBF\x93\xB9\xD64N\xD9\xFC\xDE\xD2\xE5NRh\xC3amw%%\xEE}å\xAB\x92\xBB\xC7nת*\xAAz\xF3y\x92\xBB2`\x85\xAB\xAAljzî\x98*b\xCDc_\x8C\x9B>\xBB2\xC2Ĉv\xC5\xD3\xEA\xE1\xDDf7騗J\xBB\xDE\xF5\xEF{5\xA7"6 +3\xDA\xD4_\xE3MZ[\xC8\xE4\x93\xE9#\xD2\xFE\xD8 9\x80\x9C\x97\x9E\x93l\xAE\xC0 \xB9k\xBF(zxvx\x8C\xE1\x92\xC0\xC6'\xCB\xD3GdE\xDCҐ\xE6\xB6\xEE\xF2@\xBF\xADfd\xE2\xBC)\x99p85{~`F[ \x8C\x92\xCDF>\x9C\xF1\x81\xD2T\xBF}ܡ|2o\xBC\xECBb\x85\xECXF\x8C\x9F\xAB6\xDBE\xEEO\xFBU\x81}-c\xB4\xFC\x8E\xC4\xC4><\xE6\xD0\xEFR\xEA;\xEA\xF4\xFBI5)\xFDұj\xAB\xF4)\xB8;\xF5\xDA\xE3\xDB\xFB}zI\xC1=3\xED|e+ε9\xB8\xEC\x8Bm)\xBEU~\x8E\xDC3\x909h\xBD\x85\xF4\x86\xDF2\xEEK\xAF\x93&\xED1\xC9\xBF~\xDC\xEB1.\xBD\xB6S\xAD\xDF\xD8#\xD3j\x9Cɼ=5\xB5Cih1u\xE0\xED\xBAȌ\xD3wdG\xC0Y?\xBE\xAF\xF4\xE0| +\x89\xF37rvI\xBD\xEDހ\xF4\x85ę\x9A-\xE1\x85\xD5.25#\xE0\x9C\xCCg\xE6Gdw'\xFD \xB9GRg\xFAe\xE4\xCEGdQ\xE6\xF6j\xEE\x91T1\τs\x92S=\xF8Jc\x8F\xA4N\xBBT)\xE2\xFD\xC8\xFA\xF4\x86\xEFː\xA2J\xD9]\x8Ai\xC0\x97I\xA2\x9F#eײ)]\xD94>\xE1k\xDD \xA5b6\\xD2Ė\xDBdՒb\xC3\xF4t\xB46)\xE1\x9A \x92)\xE7\x8EAԚ\x97\x96\xEENG\x93ߎ;\x90\xFBh\xE9"\xA5\xDF\xD7\xE5#\xE1\x94\x88\xF1K\xCAx\xC3K\xB8/\xE6Cϋe\x98\xEFK\xC1}QG|\xA5\x94\xE9N\xF4r\xD7ަc\xBE\x9C\xCE\xE6\xF2\xE0\xC45\xE7gG\xB6\xz:\xD4C\xC4]5\xFD.s\xBB\xFA |$N\xB9\xD9E\x85\xA7\xBC\x8FC7\xFA@,U\xD3\xEF0Weo\xB0A1{N]\xE1yP{\xC7wt\xEFDOm\x87m\x9B\x94\xF62\xF1\xE9s\xA4\xE0d\xB4^\xDBE\xCA|4\xF19R:\xA5p6\xB6\xA4\x94w\xFC\xE8-\xCD\xE7\xE4{\x9C\xCA\xC1_\x88d\xDA\xC9L\x99/\xE5\xB1\xDAt i'\x93\xFCC\xB5C\x877\xF1\xC8d\x8Fu\xE3\xDB\xF2\xC1swr\xB4\xC6Mc\xF6\xDEp\xFE\xF54?\x95쁪\x8C~C\xAE \xEA\x99\xC4z\x89\x95/k\xF8\xB6\xBF +\xD0s\xA6D\x8B/\xDFg\x9E3)\x88\xE1\xE5`k\x8D]*\x8B\xF0\xC2\xFD>\xC4\xF0\xB2\xC8$\xAE\xDFw\x88\xF9\xC4\xF09h\x95p\x8A3\x8D\xBD\x9Et\xAEZg\xAEf:\xD5xD\xC5L\xB7\xF4<\xF9\xB5\xE3d#\xB6\x955t\x9E_+w䀜@\x9A\x9DMd?\xEE=b[\xAA\xC4!\xB2\x86\x90\xFC8\xCE@4&\x97\xE7h\xDE\xCD\xEB\xF2\xE9\xFC\x85\xC4~V\x95\xDA\xC3+\x8C\xED\x90A\x88\xA9h\x8Cj"Ҭ\x9F\xC3 +!!\xF6Vz\xA2\xF6\x84\xEA\xE7\xC7\xC4\xEF\x93)V\xA8\xB7qȗ\xC4\xF2\x8C\x98Q(\xEE\xA9|\xF2\xE17\xE7\xD9"ّ\xEC\xC6<\xDA \xBF\xB4\x840\xE9юy: s\xAFH2;!\xC6GC\x8C\x87\xFE\xBE L\xB9]\x9C\xDBS<\xE8\xDF 礼R\xA8\xE8.V\xC4\xC0? \xBEHQ\xE3x\x80R9uNر\xA5̰W;$;\x8F\xF9\xC5&\xFF\xBB\xAF\xFC\xF1\xDB\xF2?\x98\xDE\xFB\xAAC\xC7EPD\x98\xB3x\xC6O<\x82\xC5\xFC)8J\xB0\xBF\xA4k?\xF9\xE3\xF6S\xA9\xE1\xBEE\xAD\xC7Ce\xDC\xC4;QF\xAD\x8C\xF7\xAB\xD1\xE9\xB0[ȕ\x95\xCBD\x84\xDA\xEE\xD0\xE9<#;Q5B\x8C\xFD\x8D#\xB8sp\xE3\x9C{\xED\xB1z\x8A**kãO\xC1G6 \x95$ߑfa\xB2\xB1z\xB8\xAAȐ\xFD\x8D\x8B\xC5\xD3Ev\xFEΔ\x98\xDB.\x8B\x97\xCDG"'\xB3\xCE\xD5L\xC4ît\xFE\xCE4\x98\xA7jM\xDD\xC2>\xB2\x899\xD5"\x87\xE8\xD2\xEC\\xA1\x92w\xDDoȪ!.rg\x88Pc +&"9\xF5\xB1\x87Z2t\xE2B"Zs`W\xEA\x8C\xECt\xED%\x89ױ\xB6\xD6W(+"\xE3#\xB1B\xBD\xA5]\xB3=\x90\x87\xAFEޠ\xF6q\xE9 \xEFe,\xAC\x89\@U\x93\xEEJo>˃f@\xE6\x93\xB7LT\xA7\xDE\xEFr?CMEA\xA8& +\x87 \x86D4\xAE\xADp\xFF\x8EL\xB1\xBB\x8C\xB2B\xEE\xFBi\xFFEKD\x9A\x8E\xF0\xCEm\xD3ώ\xCC\xEA\x87ڑ\xB9ϓL\xD4[5\xF5\x88\xB0 +\xB37SfHT\x99Y\xA9U\x8396$\xBE\xB6\xF7\xC6:\xFD\xA6\x9Birךm\xA4<P7]\xA3?Ɛx\xBAz\xEC\xE1\xD2\xFBֺk?5v\xBAS\xBF\xD4\xE5\xF9S6\x84\xDCϐ\xD2\xAC\x8F\xAC+\x9E\xE4"\x91/\xEF"\xC2ch\xF0\xF3\xC8B\xEE+\xA4\x90'\xBB'\xC4v\xE7Y\x92\x86\x84\xBE5\x9D\x93w\xC5\xDEwO\xF7\xDA\xC4\xDCҰ\xEAd\xE8n\xAFjz\x920\xFE\x8Al)N\xACm\xE9\xB1\xF9+q\xB3W\x83\xFB\x8A\x8E\xE3=\xAFPRv\x9Bb\xC84\xE2/K\xBE\xCE2$\xAC\xCEi\xFA$\xD6,2\xA9;dV\xB5\xD5\xED_;s\xAA +\x9E\x9D Et\xD1\xEE\xF7!\xC68\xE3H\x97_V\xBB\x9B +r\xBF +\xBF\\xEA\xCAMm\xBD\xE1\x97!68s\xE6\xAB\xF8\x96.\xD7\xF4l\xDB\xFAUJ5+\xAC_\xEE\xB6k)9\x81l\x97ފ\xF9\xCD\xEFӯ\xFE(E}z\x83M\xF6\xE6\xE7\xAB\xF1\xC7o\xFA\xF9\x87\xBF\xFDf\xC9\xF8\xF1\xCF\xDF~\xEF\xCCF\xFAe\x80ԏ_\xFF\xE9\xEF>\xFC\xF8տ\xFE\xFA\xA7\x9F\xBF\xFBm\x9Bޞu\x8C\xAB4\xA1\xEEPew\xD5\xED\xFE\xBAVB\xEE\xB5߹\xB59\xF7yM\xA5w\xA3\x96*\xA1\xC4ަ\xE1Y\xFB\xF7\x85C-\x84\x90\x8A&N\xAB\xC0\xFCv\xB6Ԥ\x80\xE51\xCB\\xDBG}5\xD1\xD6{wUHLk*ϐ\xE2\xAF\xC8V}\xBB\xA0\x8C\x8E>\xC5,wj\x9F-e\xC0\x96{\x86\x9EAsl\x90\xA1U\xAB\xF3t+\xB6\x84\xC4>i\x84\xA9\xE8\xACg\xADi2#\x86>\xA7\xC1\x8CM\xB3j\xBC\xAF\xB5\xFF\xC9\xF6z\x8F\xD9\xC4\\xDAk +\xC0\xE75\x94\xB4\xFD\xA6$*}H+b\xF6\xBF\xB3i\x97\x80Lٍ\xF3\xB9\xDF!s\xDC\x86>kز;\xA7\xC0\x90k\xADA{\xACPb\x92\xB9w\xBA%\xD3\xAA\xD8s\xF0}\xF6\x90\xD6,\xD8ʉB\xFA8BbD瘁~tPH\xECC\xEB +#\x91sn5\x9B\xE8\xE3\xC1@\xAD\xEE\x9E4sk\xEE欖\x94}5=OX\x93f{\xE8XT\xA2\xCB\xC2HQ\xED-n\xD1\x90\xD4\x9A\x84\xB1\x9F5G{\xD6\xEAB\xE2ކ'\xC5\xC2GdI\xD3\xD1\x99\x88*\xAF\xA8\x96\xA7+2_d"k*\xA7\xDFY\x88L\xA3Pf\xF3"Y\xB9B\xA9]\x90\xC3\xEB\xB1\xEA\xE3ҁ\xADRx\xED\xC9\xE9^v\xB5O\xF5k\xE0\xDEk\xF9\x8ETa\xAB\x83RJxu\xFBhx\xAFmy\xCC\xE7~\x8FNT^\xFD\xC1\xA9\xB7\xB1G\xB0u\xF9\xDDH\xD8B\xE2.\x9Ak3\xF0F\x99\xE2\xDDb\xE5\x95\xC1\xAEǚD\xBF\xFDB[d/R/$\x98nLUu\xCC\LkF\xD1\xB9\x9FX5\xE4\xE1k\xF0\xF3<\xB3\x85l@\xB6\xBA[ܶ\xAF\xB6\xDB'\x99H\xB3d\xF6\xB5\xB5\xE3F\xDFV\xE6+Tj\xC1 e\xD5\xDC{5و\x8CH\xD3ڞ\xCD!d\xBB ;\xEC\xB3\xB0\xB3\x9F\H\xFCN\x95\x97\xEF'Vf\xD9p\xB4\x81\x90\x9D\xFB9\xC1 UZ\xE0\xC32\x99C\xB3\x93\xDC^ͅ\x84\x8Eց\xC7\xB2\xC7\xE7$s\xF0\xB5\x8C!\xD5+\xE9h !\xC1S`^u\xDB'8Ũh\xDC\xE1k\xC1\xC9h\x8E +*\xF0\xCDml\xCD\xEB\xABS&+\x94\x94"\xC4[i\xB7ӳ +9\xF9\xB2\x9B\xBA\xC1\x89W@\xC1\xB3Y:!+:\xB1k\x93`\xFE\x96s\xFA\xA6\xA98\xF1\xA9J\x99\xB2\xD3Ŧ9'\x88\x98\xDDZ\xD0\xF3E\xB3\xE0ijHX\xBC5U\xBC\xC3\xFCJNj| \xE1y\xE4g\xE2\xE4Wd +\x9Ar\xE0#\xA1\xDD\x{DF43}\xB73J\xEFNU\xFDB\x82\xB1\xC2d\xA2\xD2'\xAAA\xA6߫\xB0{H\xC1\xFB\xAC\x92Dxcf\xCD;#\xDC\xC8\xCB\xFB\xDC;\xFDL\x8D\x9F: \xF1>k\xC0<d\xAA2\xE4U\xF3<\x90x\xBDL\x85\xE1=\xE8yz5\xBA$vPfy\xC5\xEF\ݑ>;hV\xC7 \xB2d'\xBF!$\xA2f\xF2#,\xFA\xA1\x8F\x84\xA5f\xA6\xF0\xA0'\xDE\xF4/|$O\x8D\xBD\xAD\xF0\xEAԈs\x8D\xD4\xFD\xFE\xDB?|\xB3& \xEB\xD0|\xF3\xDD\xDF\xFC\xE7\xF8\xF6\xA7\xD7p\xC4nt\xFC\xE9\xDB\xEF\xBF\xFDݏ?\xFC\xF9\xFB\xDF\xFDw?\xFC\xF9\xE7\xBFp\xC8"8\xD4ܺ\x87\xBD\xC5\xDF\xE3\xA5\xCDH\xB25*GEi\xD0\x92F\xA0z\xB8\x84\xCDiy \xA00\x9F\xA3A\xA6]\x8A\x93L+\xB2VS\xD5\xD1k\xB7y \x98`o\xBF\xB3G\xE7Yz q\xDE2K\xEAl\xEFct\xE8H8t\x9A\x92\x87\xE0TI\xC5)\xD8YH'\x98\xC2A\xF9qly\x95\xF9H<\xF9\xC5|\xDA\x99\xF6ĝd&"c`بE'4\xF2@\xC2E*J\xA6i\x96\xF7\xE1$0\xF4Pr\x83`H\xAF\xEC恄\xB1P̩d\xC0iN'\xFE@\xE2\xC1ȶ\xA5X[\xFB\xC7\xDDy i\xDA<+7dr\xC6c>\x90\x832LrS'\xD5q H\x8F"\x88 +i\xAB}\xF8\x9D\xE1\xFE\xBA\x9Ffx\x9C\x90\xBA&^D6ϭ{ \x91u\xE2\xF4i\x9E\xFBI&C]q"H\xA6\xDFy8 h\xD0\xCDF\xA0=\xB6z\xFC\x9D!={\xC6#\xDC\xEC\x96S9<\xC6(\xDCm\xF5\xF6\xAC(\x97\xEC#q\xB3s\x97ў2r\xFD3\x84\xD2wg\xC7\xDE\xCAbn\x81sH\xAC\x90\xCAk\xE0\xE0\xDB_rR\xE9$VH\xE9\xCC d\xF6R\xCC$\xC7j6Ї\xC7U\xFB\xE2\xBF+(-\xD7Xx\xAC\xA8\xE81\xDEځs[C\x9Ep\xB6\xAB\xDD\xEB\x83a\x8DB\xF3a7\xAA \xB0T[맵ŹU'ݝ\xE6<\x90\xBB\xEE\xAB\xF6\xD2f\xACPm\xD9 \x81<\x90r7cBH\xAA\xD6\xEC +\x96} \xAFcĠ\x87\xE9\xB5'<\x90\xDA\xD52\xF7\xB3\xBAu\x89\x80M\xD3\x89\xC5L\xAF\xC4 gU\xFC\x80\xC4e\xD5\x88+WZ}\x89\xFD\xF0\xD3O\xDF~\xFF\x87\xB5&\xDF\xD9\xF3\xF2\xF3KM\xD0g?:3\x81[=Vȃ\xF4ֻq_H,\xBCH\x85\xB1\xFB\xADN\xCF4\x929 1X`\xE1\xD55p\xD0\xC8\xE1&\xD5b\xB3{\xF0\xE6 +=\x90\x97q\xA0L\xF3j<'z!#\x89\xF1Zs\xDAa\xB3\xC1\x85\xAD>\xAF\xC9V\xD3\xCD\xFA\xC8%ss\xAF\xE2\xE3/\xB3\xC7\xE9\xDAu\xFD\xB9\xE7%\x86\x8EK\xA3P0T5\xCA\xC6\xC9\xDC/$+\xA8D'\xC3g\xBA\x99sy@"X\xF3\xB8j\xA8z\x94 \x87Y\x95搙\x8Bz\xD4\xEE퀤4\x9E\xCA\xCA}\xB6;\xDE\xEEu\xA4?\xA4\xE0\xE54\xF7\xE2\xF2Z\x97\xE6T\xDA<\x90\x97̀`/!\xDE\xE4\xA1[R.(=J\xC9\xD3s +\x92(-&\x8D\x86=\xEC/\xABA\xECgD\xBE@%\xBC\xE8 +\xC3W_\xC2\xC4Bȝ\xA7\xBB$ז\xA1\xD5\xCEbݚ"\xB6d\xE7]\xEC\xA2\x9B\xCD\xEC>`B\xF2D\xE4\x86*?儏2\xA9\xD3T\xA5\x85]\xEE\xCAy~\xC37>\xA7+wS\xDE3\xA2\xE6o>)\xD1cۗ\xFB\xF3cÒ\xABT\x91?_<+\x9E\xB1$$\xBD\x941\xBB\xAE\xB8\xBE\x86\x90\xB4SZ\x85w\xA7\xF9\xE2\xF3]^\xA8I4A\xED\xE0B\x99i\xAE\xB6\xE7\x87 \xABH\x8Dl\\x9B\xA81\x8F7w=rL\x84\xD9S\xBC\xBEX\xC2\xDF \x85e\x8D\x8DQOM{\xCBo\xA1\x9D@n\xB1Ȧ\xE6=\x87\x9Eٙ\xF9<u\xB5v\x94刱\xA2x\xA4\x8B\xE5K\xC4\xECKP:\xA3A\xC6%\xF2\xAE{D\x92$γ\xAA\x92\x81l\xB5{Q˅\xA4\xAD\x9Eʸ8\xD6\xC9uU\x85\x8436\xF2\xE0\x83ւט\xF0@\xE2DTMl\xC4\xEFT\xD7\xD4ɢؐ& +\xB38"\x83\x92\xBBl\xFB|q\xAC\xBB)MⱾ8\xBA,\xA7\xED\xE2\xB1\xFF\xAD\xE7\xF7\xF2w\x9FC>l\xFBeUV\xF5\xC5\xDD3Ɓ &t\xBD\xAA\xF0\xE5\xB6q6\xF0\xCE\xF7\xBDeO\xCD\xCA\xD1)^~ \xA9- +3\x88\x9A\xE6\x90G?\x90x{\xCCԮD\x8A\xF9\xFC\x80\xC4\xD97c\xA3Lo\xEBB2=.\xF5\xA35\xF8H\xC6\xD6j\x82\xBEjfs_ C^\xB4vE>E2\xEFG-)\xB4*\xE85UI\xE5(_@+\xE6t)\x84\xAF ذ\xDF=\xE1\xF23\x8D\xB4FJt\xB39/2;v\xA7\xF4\xE8\xBA\xFDqQ\xC4\xE0\xFC\xC6Ƴ4\x82j2\xF2\xFC\x94?j\xA7\xDB\xE1\xFC2\xDDkGU\x8C\xC2]\xA7S\xC8lt\xE7HoC\xA6\xE8\xB4g?\x90\xD0\xFE*?\xE3m\xDE@\xD4\xF2\xA2\xAE\xF74\xB8\xB9\xF3\x85\xBC\xEAڈqz\xF4\x88$\xCFP\xC1@J\xD3G5\xD4\xD3~^\xCFмإ\xD1+\x81[H\xBE890t$\xBE\xE4\xC3\xEF\xBCD\xECUR\xA4]\xCE\xC3\xEF,t2Sf\x80T\x8F\xEDA\x93!\xD6/r\xEEA\x8B\xB8{\xC5\xD4$\xDBĚ\x8E\x92\xCE> /\xCD +\x83\x9ALO2\xE1\xC6K\xB5Ȑ\x8F|\xD8\xD8s̝\xAB|\xDB\xB0\x90ta\x89t\x86\xA6WO\xB3\x90\x9D\xC8\xDC\xE9\xAD\x88\x8D\x8F\xBC|-F\xA9\xAF\xA1\xE6n\xDCW-S\xF4[i\xB4\x87G;\xBD\x86\xE3r\x86X\xD3\xC5\xFDwX[\xFAFj\xEDn\x973䇰 =4\xCB%\xBC'ɻADI\x81\xCE=<O\xEA\xB2\xC0\xFD\xEF\xBBTT6\xDA\xD7\xE6/\x8E\xCFI|\xCEo`8$\x82>\xD1N~\xF1C\xD9B2\x94\xDD\xF3 \xB2\x9BUv\x8D\xE9È\x86\x8E7\xD3\xEBËBFDl\xFE\xE3)l\xF7 \xC1\xD6k\xFC\xA7\xBE\xFF\xB3m\xCB\xCF\xC7\xD8\xFF\xF2_\xBF\xFAw?~k\xFF\xE2\xC3W\xFF\xF6\xCF\xFF\xF5\xB7kM\xAC\x96 +\x95\xB9lM\xEB\xBCIu\xF8\x90B]\x97X\xC1\xA0Z\x9Cv\xFBn(\xC6)v\xAC\xF0ε\x96}]\xAC \x90\xA1\xC1'\xA3\x84Wa\xB1\x90y\xA7\x81\x9A\xA2aZ\xE0\x85\x82\xEA\xAFr\xAB\xEC\xFF\xB1t<2\xD75\xC4\xD6\xE8jK\xFB\xD4)\xEA:\xA6\xA58^\xCE\xC0_'TX/NW\xCB%wC\x83\xEF\xAEA\xA3\xBF\xD6r2s\x9E\\xE6\xD1s\xF0\x8AQ\xF2\xAA\xA4\x8F\x84¾\xD0o`\xA8u^;M\xAF\xBB\x9DU\xA9t Mv\xA4J\xE2\xF0]\xCFF\x93!_\xA71.\xC7K\xBE㯲R-L^\xE3\xD6*B +v\xB9\xBE\xCC\xE3\xD8.}CAL8\xFB\x97\xC4\xE8\xF1">\x90t\x84̰B\x868\xF9\xED\xC9\xECLn̹\x86ќy*d\xA5\xD2\xC9\xE8,\xEEf\x8Eܜ\xCF\xF4\x90\xC2\xEEܔ`\xF4\xB4ަ\x9F\xB3Q 5F\xCDMN\x87\xB7\x90\x99<\xA9\xD3!\xA9\xFF$\xAFY;(wg\xA6ӣ\xBF\x90̼\xAA\xEEv߇9\xC3]\xFC\x87>i\xF2\x97iX\xD1=\xDE\xE1\x87\xF6\xF9\x89#\x89\xEBW\xBC2\xC0\x85\xAC\x97\x95\xC7 +\xB6\xD3 \xF9@\xD2I\xD1h\x84\xD9gu\xD3Er\xE0/\xC1\x92\x8C┹B\xA4>\xD9Ԥa\x97xv\xE7\xEAC\xF5\x91\xCCy\xF7\xE7Z|\xAE^\xE9\xFEB\xF2\xBEr\x92\xD8b\xE6s\xD7VHb=\xEFLP\xF6\xC6\xCD\xE0:\x9D\xA9_\x9D\xB1\xDA\xC1\x89\xAD\xE1\x93ά\xCE\x92\xEDcjk2\xA4#\x92U$ʨ\xE1k\xED\xF3k\xCBT\x8A\xA6\xAF\xCEiO\xB2[k\xA7>\xF9\x8B \xCF L\xC1\x8Cx\x87 \xE0\x81db\xA29uD\xDD}m\xAF+\xCFI+_{p&?\x90<\x99#\xE6\xD4D\x87Sc!i\xF8\x9B7\xB4\xBF_\xEB?\xBA\x81!\xF9Ng\xB2 +\xFB\xF1\xDE$!鈗1pN\xC4 w\x92y\xBD\xBD 2GH\xAE\x83#$,A{?\xBF\xB6gץ5d\xBAT\xE6\xF4ݚ5\x9F\xB7\xB7~\x8B\xCF\xD8\xFBD\x8D\xC9\xAC\xE9\xF0\xAE"d#2b*K\xD4̛\xC3j&\xD6V\x88\xB2nG\x9A\xF5p:5\x99᥎\x90\xB3\xC6\xCC'\xB7\xBAMHv]7\xD4V\x99[ܖ\xA2\x85\xBC:\xEA'\xD54\xBE3a\xFB\x81\xE4\xBD\xCF\xFAl5 +\xE6\xF6f\x9E\xB0\x940\xEDC\x94=\xC6B2\xE0k\xEEB\xE4ޏ갤>\x90l\xF7<\xD7\xF1\xD1\xE8\xEF#/\xECYa\x89\xAB\xA8&\xB86\x9A\x90l\xDF5;\xA7\xA6\xF8\x8D\xC9B\xC2ưoo\x98]a2=~\xB1\x85d\xDDU)g\xB2d7\xD1&$ooF\xE5xR\xF7\x9BÈ\xF3@R\xCFnmC\x8E\xD3\xDA\xD2:Q\x892Sr\xC3{\x86d\xD86\xAE\xE1 +Y\xB5\xC5\xD9\xFB\xE9\x9B?\xFE\xF0\xC3ww}0}u\xCA\xCC\xDC\xE3\xC5\xF2s\xF8\xE3\xF2\xDB1KL\x91\xAE\x96\x9E*dC"`z\xAC\x87\xAD\xF5\x81\xC4\xA7+\xE7\x83\x8C\xF8\xBAă\xD5[⥶q\xBE.\xC1c6~ /5\xABQ\xC45v\xF0(\xCA%:\xF5\xF2\xB5\xCDc\xE9[HF\x9Cl\xE7\xE9Q\xCC\n{\xB0k\xDE\xCDE]\xD6$\xBB\xED\xA2B2\x9DX\x9E\x86\xDBv#\x9B\xDB\%$\xE3)ub\x9E\x86j)\xAFha:\xB1\xE6@\xFF,\x8F\xCB\xEE\x81\xE4\xCB\xDD^\x97Pf\xF48d\x84\xAC|\xB9s\xF4\xCFJv\xD3\xFDBb\x85\xD4|Nor\x95\xF9HF\xED\xA5)\x8B\xBD\x8C\x8B\xE7T\x90\xFEI\x8C\xAB\x81\xBB,\xE6\xF4\xDBi'\xFB%\xF4ڈ;\xCFbV+\x8E\xF0\xAC\xC6O\xCFj\x92g\xA8p\xE2@z\x90\x8E\xB8H\xFAQ\x9A\xB3\xB6\x9F\xDBd\x96\xB4\xC3\xFF@\x92\&\x84\xDD\xE6Q\xFE?\xBB\xB1!y\xCB\xCCp\xD9Y\xF1W\xD0\xE9\xB0+\xE5\xB2B\xF3.tYܨ\xDB/#5>"fW\x99\xFF\xBD\xC9'YyWj\xDA\xE3\xAA\xB0\xFD\xB0B\x95+\xD4\xD0m*\xA2\x9Ev\xE5\xC2\xF0\xAC\x81\xF3\xBBLs\xCD\xDDD\xA2z8\xB0\xB6#\xE5=\xF2-Kf\xBE\xF0h\xB2\x9E,\x81Q^5 J\xA9\xF3n\x9CMR\xB0gC +\xBB\x9B\x94`\xAE\xE5M6\xED\x87h\xD1\xF1t\x9E6)\xAF\x9D\x99\x9F!\xFE\xA3\xD9\xD1i/\x9B0ko4ܗ\x92 %^\xA6\x9D,\x8A\xA07H\xD9\xF5\xB1\xD9\xCA`\xA45`\xDD\xDF\xFBR\xF6;PV\xCD\xDC.E\x8A\xF4R\xF6\x93\4\x81\x93\xCCF\xED/eٟ,\xA5\x94EQzq2g\xEF/E\xD9 \x8B\xFB\xE1\xE7~\xB4\xFF\xF0\xBB\xFF\xEF\xCF\xDF?x\xE6.\xF6\xAF\x95'\xFF\xF2\xF7\xFE\xF1\xAB\xFF\xFD\xFB\x9F?\xFC\xF8\xCD\xBF\xFE\xFE\xBF]-nG\xA7\xD4\xA6\xD5j\xDE\xDEퟏ + +{\x9C"\xDC\xC6\xDE{\xF5~'\xD3AQ\xB7\xDB~\xD4\x9F\xF6ͪ\x8E\xE14\x92\x990\xC0Q\xD4\xFC\x8F\xCAB\x89>0\xC0\xB1\x9AK\xE4\xD6M +Y\xB1\x9A\x81\xA3Q\xABi\xF1\x97\xFA\xB3}\x9B\xFA\xFB\xB6\xAE\xDF\xD8^\xFE\xF8\xF5_\R\x9A'&ʊ\x84\xCA\xCD\xD0\xE5>\xE1so\xF0\x91\x8Bb\xD7}\x95\x89SlVd\x96>\xFDDC\xF2\x98\x895y\xDFF\xCD%vc\xAEB\xE2\xE8\xA8\xDCl\xF75\x8A^n\xFF\xE8`\xDEЫ +\xDFQ8\x8F\xFCn!AR\x94,\xB8dj\xB5\xB5ۺzq oR\xF4r\xEFR\xB2\xC6d\xBAvEǴ>Cj \xFD\x8EQ\xBF\xE7- +\xB9k\xBBjV\xA6Lf\xCD6\xF2\xAFӄ\x97R\xBBm\xF6~\x9D\xB2] +\xB7$X\xC8 \xA4*\xF2v\xA4*\xFC\xEB4\xE1\xA5\xD48\xE39\xCDU]\xE6##e\xCE\xA4\xB24\xB7\xDFtPCJ\x8F{OiR\xD1\xCD\xCDy\xE4)8\x8Dmq\xC2mR\xCCs\xBF9\xC1\xFD!\xA7\xB1Eo&\xF3 \xC4&_ +Nn\xD5\xFDݥ\x88\xF3\xFDt\xCE|DEG\x8A\xB3\xC4#g>\\x9FZݼV^\xFCV>\x96\xDC\xD3/\x9C\x97\x8D\xA1\x8A\xEA\x8F\xD9WH4~\xD8[\xD3\xA3OAd\x9F\xB7\xF7\x81\xD4oy6F\xEF\xEC\x8Cݜ{\xFD\x90\x82\xFBQz`\xAE\xD4\xF4O\xB8o\\xCC\xA5\e\xEC=( +vZk\x9C\xF9:\xE3`4\xAAM7\xC7 $\xCF\xF1\xEC\xFBɈST \x87\xD79DݢD}\xD65p\xD2GRw\xA7:M\xF5a\xBB\x99g!q\x8Ek\xC9l \xEA՛/\xF9@\xCE\xCB\xEFd\x93MQ)\x90\x8FD\xF3I\xED\x9E\xBA\xDAV\xFC!\xF1\xE2+ +\xB2\xEB\xB3P\xFD\xBA\x900Ùw\xBB\xADZ\x893\xD4SA,4\xAF\xC1$i #\x88q\x92\xC6 \x9D\xCE\xE2̦\x95\xE6\xCE_$\xAE\x90\xE9\xD0\xDB|\xF2\xED@\x96Uo\xD4\xEC\x942\xDCJ!q\xDEzɘ\xBC\x9D4i\xF1`?\xDA +v\xDC\xF0.\x96E:~\xFF\x97\xE1l\x9A1\x8Al\xB7\xC2\xED~$R%h\xD4K97\xC5\xE1\xDC&^!\xA97\xDA\xC3U\xFE\xE6gZ\x84$ef.\xCC-6\xBBJo\xD8\xEDJ\xCB5Ύ ++\xC8\xFA\xC8H\xE4ȕ\xFC\xF4ه\x85\xC4~\x9A\xEA\x85f\x9Cz\+\x84j\x8F\x97{?\xC5|B\xEE'A%\xF3h\xA4\x9E"-=\x9C!\xC4EEs\xC7\xFE\x8Dp\x887 :y\xB3\xCEꠒ\x88\xD7\xC8}?\xBB\xE6DZ\xF3\xA3yR\xC8}m\xE5 $ď\xEC\xFA\xB81\xE9P\xBB\x87\x809\xF2:\xD6\xD1\xF5B\x84\xE1\xBE\xEA\x9EP\xDD\xDEBVȌ\xA8\x9D\x90\xCC\xE0r\x89 \xDBAO\xD6\xFE;\xCDTwk +\x84\xDC\xCF툼+I\xD3v^\x98#?]\xC3FD\xA9\x86\x9Au\xB0\x83fտ\xA8}\x8E\x94 ) \xC5\xE4"\xD4q\xD7\xFF\xD38G\x8CP\xA8.\xF04\xF6~7")\xFB +]^q\xCF\xF2\xE25\xBB/c\x82\xE8\xDA\xF7\xB7\xC6}\xF8\xE7\xA6\xF0\xACԧI\xC1\xB4\x83\xB5\xCFjk\xECxIe\x9C\xB43\xA2Vv\xCAg!\xB2\x96\xD3ˇ\xA8\xD59\x89ۜ4\xF3\xCAG"*dꃑ(u\xA2\xB8\xD1C!w\xB0\xB1\x8B%-R&\x99\x81\xF0C\xA4\x87\x9B\xC5\xFBY4\x9BȞ]z!\xB1\x9F\xA3ƺ\xF15\x93\xD9Gb?kj̇\xAC23\xF9\xA9\xFA\xD16x\xFE\xF0_^\xA15D\xCA}K*\x99\x865\xF8\xF4G\xE6^\x{D66952}Xs68\xCA"\xAE\xB9\x91>\xEFt/\xFCZs/\xA6[qnH\xF4\xB06\xE5\xAB9RG\x86\xEC \x8Bm^M77?\xEES;\xBC`\xB3*:\x88\xB0D:\xEDV\xD6 \x8Bm\x86\x88^\xFD\xD2Dq@\xC2b3\xCB\x94~Em\x82\xA7\xAA$,pUX\xB9\xF9r!'z\x85,\xFE\xCB\xD7:"\xC5\xDD\xDC/\xD8zf\xF4\xFB|BrWc\xB6W|F7Ƭ\xB9\xB0d̄\x80\x95\x98\xFA\x81\xFEHHƑfޭa\xB1\xEF\xF9\xB1\xA6A\xFB\xB2\x87@\xB7c\x8A\xDA\xCF\x92\xF6\xA5^6\xC84\xE7߷\x81\xC6\xC5J\xDFKr\xFA\xBD\xA6B\xF2\xF4i&\xEC\x86T˒\xAF\xA9\xEDK; \x84\xBD\xEA\xE2v\xB35B\xE2\xF4\xB54@hVb\xF7O\xDF\xE0<\xD3C\x9C\xDFn\xBAo\xFAћ\xC11x\xAD\xF4Esa\x8A[\xE7!$\xF4\x902f_k\x97\xE2\xB0B\xC8\x9B\x87\x8E\x8B\xC5\xEFǷm\xDAV+'\x8BE\xE36\xC1\x90\xA4`\xF3u\xCEw]3.\xFD\xEF\xC3\xE6\xCB$tsۚ\xFF\xD6ڿZ95\xE3 \xFA\xF0ϝ\x90Ȋ\xAC\xB9p\xD2\xF6\xC9%\xB2[HdE\xECp\x93\xE8V\xFAݻ\xD3BB\xBBkD\x89\x9B\xA9\H\xE4\xC7\xCC\xC8#l\xF2I\xB0Y;4 \xE4\\x8A\xA7\xFDD-\xF4X\x8D\xB2;\xB2%\xAF$k\xC6k\xA1g\xF8\x9Dy\xB5\x80\xFBHVFM\xD2\xA5\xF8\xBAKH\xC3\xF7\x81\xB4\xD3Xo2\x88,)(\x9Co\xBD\xA2N/wk\\x96\xD97s9\xB0\xF2\xA1(3y_J\xA3文i&\x8F\xEBc!\xD9Q\xB2J\x82\x90\xC5\xEC/\x{17A7EB}\xB3% +\xD5\xFC\x85?\xCA|\x86í\xA9\xAC\xE6\xB7;R\xA9W\xD6\xE8#\xC9j\xFE\xA8fH"\xC3A;TV\xF3\x9B +g\xCEԎ\xB4W\xA1\xB7\x90\xEC\xE4\xFD2>\xC1\x8C\xF7\xA6\xF6\xB2\xC7G\xFA\x9C\x95&AΣW\xBB\xB1\x90Ȃ\x8AK\xBDMn\xF9BV s\xCBx\xB75\x9F\xC0==\x86\x949\xF7\x98\x8C)(sTn\xE6L\x97\x94 )\xA3\xEF\xB1\xF6 j\x9B\xBBlR\x92\x82ܺ\xB9\x98Bif\xD0Р\xDA\xFBR`{\x94\x90\xF6\xFE +c\xAF^~u!a{ت\xC0+HJ\xC0\xDE֊\xBD \xF3\xAE1\{'\xF1zI\xFBv\x96I\x905\xF0[\xCC\xFDx\xC3ZÊъ\x{DC4C}\xA0fӻ\xB9\xF6%\xF6YW\xCB\xCEMQ\xAE\xF9\xBEX\xBBb6ۭ@\xF5\xE6\xD6w\xFC\xDC\xB33v\xBF\xCEt\xB7\x8BqI\xC1PW\xFE\xAE\xE34\x93i\xBE\xE1$\xC3B\\x8D3\xD6er\xBFA +n\xA5\x86\xAC\xE3\x8C\xF59\xEE\xD6E/)Zc"b\xBA\xAA){_ +\xEE~i1CØ\x8C\xF1)\xB8\xFB\x85s\xE6Lʌ\xBD\xBF!iQ\xDA\xC3\xF7h\xDF"\xD4\xF3bb\x99\xA8uQc(*\xF9\xBEE\xA7-4P|\xBF=\xFA\x93\xF8\x92\xA7|"*\xA4[\xB5\xB7\x908\xB9=\xA2\x9F^\xFFyx3\xFC\x92o\x84--\x91\xEA\xA9> ;\xBF\\xC0\xFAK\xEEd\xE3\x85\xD4 +/\x9AR\xBE\xD5iӅ\xD6@~o2K\xF6\xE7 \x9B.\xB4Zw{א\xD5\xE5P]H\x9C\xA1\xC3\xDEBd?Xf\x99\x8E \xEF`\xDF\xCF&;\xE9f.~I\xC1j\xE6gI\xEE/R\xAAç5\x99Db\xFE\xB6mBm\xAFZ\xF5\xBF}\xF3݇_L\xF9\xAF\xFA\xEE/}\x8AlB^܃\x9B%E\S\xBAW\xA4O\x84\xDC\xC3\x8B\x9B\xF0`b\xD6ĐK\xC1䧠\x86\xE6\xE7\xDCv\xA1\xAAM\xF0\xF0\xB5hkS\xED+xd\xC0\xAE\xB5\xBDd\xCFl\x88o0)k\xA6\xF9\xDE1CF̺n\xCAא\x9D\xC6rT\xDBu\xB4\xFAC\xA1\xAA[Q\x9F\xECR\xCCӌ\xF7\x9F\xF0~5\xDFG\xC4\xDD1mr\x97\xECbI\x81\xEF$v\x92Z\x8Cop\xC8:\x9D\x841f\x9C\x9A\xC7|\xD8\xD1\xFDN*\x8D\xB5\x87ߥD\xC3\xFDЎ\xF3]JLso.1\xA5\xE7\xDDR\xDE%%B\x8A\x9D\xA3 +)-{E\xE7\xB9\xDF\xF5\x98\x98|\xE1-\xE4~\xD7\xED-蔩\xF9\xDB\xE1\xA4\xDEa\xA0\xC7<QbR\xEAx \xE4\x8E\x94\xFD\xDEiX%\xF1VJ\xBB;lbI\xD9\xEF\x9Df\xD5&\xACX\xA9\xE5 +\x8ES\x87\x81\x87\xBAX e\xB5\xD4ݗ\x82A!\xB2\x8F\xF6'\xBE\xA9J\xE8\xB7g\xBF\xA3j\xFFF\xE2R}\xA9\x8Da^\xF3\xE8w\xA4L\xA9\xE4^ \xDDB"-\x97Z\x8D\xC8~0\xB3\x93ky\xEEo_=\xCB>\xC95\xF3.\xA0\xC5d\xEA{\xF4y\xC9i~\xEA\x81ɻL\x8D\xBB\xFB0`̧\xB12͛[\xA4\xBB +\xE9K +gk\xCD\xC9ߒ\xA3\xE9\xE87H\xB9\xCCt\xAB{Vo\xAE ++\xE9Vs\xEE\xB0J\xE4b\xDCm\xCA\R@u7\x95\x84\x83\x94\ޱ\xFBd,\x8A9\xE3%R@\xE8 +N\xCD \xBBQb\xEAܤ\xA4rw\xB2\xF7\x92B&\xA4\xE7\xA0ڏ\xF7\xA5̷H\xB9\xB0&\xA1\xD6\xEE~\xEBw\xA9=\x97&5\xD0\xEDȩ.w)a\x96$Z\xEC\xF0s\xBA\xC6Z\xDE\xAC\xB8\xB4E\x83A&\xA4\xD1ߗ\xC2gx\x81\xBB\xFC\x8C7\xE8\xE4\xC4t(˲LJR\xBB\xFE})\xA4\x91\xAA\xE3\xB2/cޥy[R\x98p\xAF\xC4i:\xF8\xDDF\x89%\xC9y\x95\x8F \x80f'\xFB\x9A\x9F\x84@\xB5N\xA1z\xB8=KsIa+d\xAA\xF0\xEE{\x8F\xC5O\xC0\xF7AB 3\x83\x9C\xE9\x9AK\xF3\x8E\xB5F\xE9\x9Fz쨽\\xE9 +k\x9DY\xF0\xD5A\xCC\xE0\x9E\x87`\xEALb4$\xC3\xE5\xCFߦ\x95XR1\x89\x81\xB0!\xA17HAl\xA2g\x94*P\xF7}s\x89M\xA4\x89\xF1.Aꒂ\xD8D\xA77\xA5\x94wX4\x8CM\x889B\x8Aٞo\xB8\xA3\x8CM\xB4\xFD\xF8 +\xCD\xA6}\xFB\xA0\x94UR[ +\x98\xB5\x86\x99\xF9[\xDA|\xC3IfӼ\xA4}ĥ\xF32~\xF2\x93\xA5\xA6\xB0R*\xA5\xDA٬uo\xFC\xD1B\xC2\xEBM\x99-ݚV\xEE\x97D\xA6\x9A\x928\xEE +\x90!{\xC4W\x86\xACO6^\xBE6&\xB7As!\xE1\xC9j\xC0\x8ELvƽ\xD6\xEB\x85D\x81iH\xA4(\x88U^␟]\x8A3\x98\xD8e~a\xAA\xA6\x9B\xDFU\xAC)i\xF0\xB5\x95\xC3b\xFBDu[H\xBEv\x88\xB9bUbM\xDE\xF0\xAB\x85D\xE4\xC7,\xCC.\x8F\x9A#\xEE\xBEփɰh\xC6(4\xEB\xE2\xB8\xFB\xFBY\x8DcDb\xC5]J\x92\x85Ddt\xB4 +\xAA\x9F\xA8 \x83nLp0Iꎬ*\x80< \xC1T\xB3<\xBEV\xFA\xE6\xB0+\xF0U`\x86\xB21\xD9A~A\xA1J%\x8F\xABs\x8F\x83G\xBBX\xC9+\xFF_HD%5\x89 +&*\xF4<\xAC-|6MAC3\x85\xD7\xCF> +&\xFDl\xFB`\xB7\x89\x86}\xF8\xC9M\x95\xA12\xBAYA\xDFco\x9DK\x9D\xB7\x908Cm\x84Dd\xEA^\xCB\xFEB\xE2\xB5\x8CR\x944\xCDэ\xBF\x8D +\xBF&6\x95\xE0+\xE8f\xD0$?\xC59\x98K%̖p;r\x92O\x96(\x90V&\xC1G\xF2\xC9\xCA^\x9F5\x93\xE7p%\xD0_\xA04ФL\x95\xC1\xBF\xEFQF\xA7\x98\xA9]\x99\xA2\xA2\xF7\xDE\xB0\x85\x84\x8AR\xE1\xE7\xFE\x93\xB5 +\xDD_"\xE4\xDC+TdV?\xB9 \xCEi ۤy\xA4H\xEC\xE1ܡ\x83AhPZ?=\xCA\xE0\xE8\x8C\xD3,\xFAE5\xA2\xEF\xA0P\xD1qf\xB6\xBA6bj]\xCC4o\xDBIt\xA9\x89a\x85Fg-\xEED\x95\x85\xACD6<\xE4\xA9j\x92\xD7I\xF3*%\x9C\xF2TF\xF7\x98\x92\xE6U\xC9\xE8+\xBD:\xAB6\xE0pR +䄩\xC6QS?\xEFv\xE1.)\xD8{{>\xD1%E\x93v;|5jc\x8A\xBFU\xBA`"빝|7)|5\xC73v.\xADw\x89/\xE0\xCC{\xE9\x94H=\xE7\xE9\x8Do\xB4\x9Ff\xC5.e\xCD;\xED/\xD3\xEB!T\x9A\xA0\xB5{\xECBrr\xBC-z`4j\xEC%\x88|\xE3M\xE9d\x84\xB6\xB2\xDC4J\xFC\xF0\x9D\xD4H3\xC2Γ\xA5\xEF\xF7͈\xB72[\x9E@\x8EܮU!\x91\xBCzR\xE8w\xBF\x88ѐ\xBF3\xA1?h +;\x9C\x9Eqُ\xA6\xF2\x9C\xFD9\xAAIKx\xA06=jx\xEEI\xDBڳ +\xFD#\xB2J\xC7\xFDmq5҂\xAD\xB0 +\xB2n\x8Fd!i\xFB\x96v\xBC\xA4\xAC\xC4\xED$쨃\xBB2v[\xED\xAA'A褨\xDE<\xC5\xFAN{\x86sz̐Y}\xBEO!'=\xA6U?\xB3ۂ\xD1\xE50ZHZ\xAEO\x85\xF5i\xAE\xD6\xE1͛\xF4\x98D\xFA\xD3\xDC\x92\x96k'3\x86\xDAUO\xA7z\xF2\xD4\xD8\xDBE\xEBl6\xBF\xFA|\xD4\xC9S\x93&މ$r\xF4\xD3\xEF\xA4\xCF+T%\x87]\xC3\xE0p\xA8\xD4oI\xF5\xC3\xFE +\xB5K\x887b֗\xF9Mb\xAB; \xE2͉gh\xCC\xE9Ww\x8F\xC6p\xAD\xB2\xB3_m\xF8}c\xA3\xBD\x84^\xE9\xC3\xCC0\xFD\xDE\xD0\xD1.\xD41\xE8$\x9Fi{!/\xD4N_M \xB7\x930\xA31\xD8:\xC3]I$Ƨ5\xA1\xD1.6\xB3\xA2\xF6\xFE\xA9i\xB6\xCEN3҃\xCB $\xEFrx5#\xF6\xB4\x9A\xF1\xFD\x88\x94i\x8A\xE9!\xE2\xD2l\xD5Vc\xC3\xE25\xF2\x91\xF4 +\x9E\x97\xFB\xE3\xEF\x8C\xF5\xA0aC\xA6#]B\xA6f\x82-^\xA3Y\x83H\xF96\xE4%\xEC\x9Ev\xADޫƐ\xA9X[\xE8U\x98\xA1|@\xA6K؝|d\xB1\xE7r\x817\x86L\xFBl\xB0+\xB7)L +\xD3<\xA9\xC2\xFA\x8D\xE2R=\xAC\xC9`\x9A'bƕ!K\xF3x\xE1\x92\xE7m\x85/w\xA4\xC6O\x908o\xFDbO*+u:\xA9\x83Q\xA6N\xCF,\xAA5\xE7$\x93Q\xA6\x8AR\xDB{\xF2\xF2B^\xA2L\x93\xBCpSc7^\x91\xC5\xFC!N\x822+\xA9\xA5\xFA\xA8z\x{15163C}lF X\xFD\xEB#\xA0\xE1#1k|\x84ǰ\xC5_\x90@鱆.$*4JfG\xDA]\xF7R\xBF\xC9y\xD8!\xE0}\xD70o\xEF=XH0K\xF9T;r\xFD\x9F\xE5\xE3˪ߑ\xE6\x91( \xD7#\x84ߙ{\xAF\x8B\xE4$mSv\xD0b\xA2\xF5\xCE\xEDB\x92clL\xC4\x949tX\xFF\x9A+K\xCBsN\x97\x92\x8Ax\xD3:H\xE1\xD9\xD4NZ窩\xB9%\xA5j\xA2J\xD7F\xA8\xFB +P\xBB\xB9\xB4P\xCAO?\xFC\xF9\xC7o\x88\xFF\xFD\xFF\xF6\xB7Q+\xC01\x9D)U\xAF\xDC\x80cj\xE6\xDF\x93X^bß(`R+펺N\x9CACݩf\xD7\xE4\x97:\xA0O+xU}\xED\xE2\xEA_\xFF\x92\xBF\x98}=\xA3\xF7/\xAB\x8C\xF5k^R\xF2\xF5x&B\xFCү7\xCB0\xD52\xB6P\x9A\xF9K[\x80\x8A;-\xEF4f\xFA\xC2\xE62\xD1Ld\xF8Y\xA9\xA7\xF9eW\x883\xC55xg(5\xCDG\xFC\xB2\xC4"\xBEZ.Tڗ5\xDA9\x8D<.\xD2!|P\xF8·,^\xFA\xF5;F_dM\xEE\xFD\xB2\x8Fe\xBC4\xF3OP\xAB\xE6\x94Uu\xF5e?\x88E|\x99n\x8DuY\xFB\x86G\xE3,\x85z(\xC6/3\x8C\xCCF\xCC\xD6\xF1\x96){\xFD\x85okZ猙$\xF6\xB8/\xFAA\x89\xED.1\xF1\x83z\xF8\xC2 g\xB2\xAE\xFE|P\xE5˺5ت\x9EMh\x9A4\xFCe\xED\xA1x\xE9\xF2r\xFD\xFAA\xA9\xFE\xC5 +\xFEw\xEEb`T5\xC6\xE5+\xD1b\xDFX\xE2k\xAF\xE7^\xA1¶\x94B/"h\xA4\xC3\xFE \xD2t\xA8\xB7w\xFF q\xB3}\xE1"U`D,\xA8\x80\xE2\xCB~P)Ո\xB7,\x948\xBE\xB0\xA6F+\x98\xA7t\x9A\xE2\xB8U_\xF6\x9C\xE0\x81X\xBE\xDA}\xEE \xE0\x94\xC7D\xAF_\x98Uz\x8B*(]\xA7'\xE9ʕ\x8DH/\xB3\x9A?Q+,\x8E/\\xA3DY۠ +G\xED\xBB\xFD\x8B\x9A\xC9$AUm\xE4%\xE3\xB4\xFA +\xBF\xE8U|\xD0+\xDB-܃\xD2\xF1\x82\xF2Lw$\xEEA \xFB\xF0\xF3$N\x98{d=Q\xD9\xC5\xC0,\x8F\xF8/oiӞ\xF8\x84L*2շ\xCAl\xEFȴ\xA2\xEAcfЖ\xF4\x88/3\xD5?MR A\xF6̘J\xAA{v\xCB\xC31`\x86\xCB\xADȚ\x8B3n\xBF&\x80\xD3!F\xC0\x84\xDDНj\xDFO\xC0\xF1\xC8\xE6\x83\xE1\xA2#\xBDW\xF8D\x97Y>m7\xBC4\xA7\xDF*\xDC0\xFB)\xB2%/b\xAEʓ[\xB1k\xC0\x81M\xA1q\x9E\xAEْ\xF7\x94]B>\xD9[\xC1 \xCA\xD0Z\xBB\xE5eڟ\xCB`\xF6\xA0\x95\xD7f\x9AO\x80\xB1_b\x8C\xC4ߖ\xEF\x855M+DE\xD0\xD3ȵm\xE5\xB5n \xE0l\xD0\xF1\x98\xF3\xAB\x80T\xEF\x8D\xD3605c\x9B/ZL\xAF\xAC%\x9F$\x80E\xC81VD\xC8\xEC*\xF7\xAA\xDA +\x8B\x90 \xD8].;U\xF5\xDEHs\xC0MfC\x84\xEEŸUc8\xE57Ͻ\x8C:\x88Q\xEBVr\xB5\xB0\x8C\xDA\x8C}\x8C\xB0\xA9\x8EzSU\xF4Kd b|\x99\x94_\xB8\xB9D\x97\xC8\xC0\x98\xBBO'\xF5\xEF\x99-\xFDb\xB52\xB1D9\x96q'\xFCc\xE84\xE6\x9E\xF1\xD2*(\xBA%+bw\xD9AW\xD1\xC1\xAD\x87\xB5\xF2\xA1\xDB/h\xBB\x80\x9E\xEE\xFE\x95\x8E \xB0\xA1\xB7\x8C\x8B\xD6\xC5w\xEFa\xA2k\xE8\xB9\xEF\xB5\xF2\xA1\xD7t\xD3Gc1~hs\xEEAD T\xC2-0[̒\xCC\xFB)\xEAj.\xBEwLA\xB6\x9Af\x8C\xEF\xE2\xCDjU1C\x80&C\x809\xB6\xF7Nh\xA9\x82\xD7P=\xA8E\xE2\x9E+=\x82]\xE4Ne\xDC\"ԧ\x86P\xDD)N\xA1y\xCF d[\x8D\x99\xEAi\xCF\xDEQ\xF2\xDDj\x88(l\xAB \xA9\x96\xDD\xF4\xEB\xBDMF\xA9\x8A {\xE9\xA2 \xE8\xE9V\xC1Sa[\x8D\x9D\xD1]\xD8G\xA9\xDC|2Q\xAAb[\x9A\xA1\x8BL\xF7\xB5~\xEF&\xA3T%\xD8k\xB0\x97\xB2\x87\xAA2\xED{{\x80J\xCDd\xC0{`\xFF\xB1\xDF\xCA?\xF6\xED\xD3\xCDK\x94C\xB8\x97\xF3\xE9(\xA3\xB1̈M\xD6\xF8\x9B{\xC6/Ԃ\x86fe +0/\xF0\x9E+@1\xBE\xFD\x9E\x9B%\xBCeD܃\Ё'[5\xDF<E{`\xD6\xFE\x9AJ\xFF ܴMG\xC4&\xA7\x99\xB9Du\xDE\xCC'\x8F\x88'3 +\xF0\x9Cɔ\xB7\x9Au\xCBH\xD8\xE4\xA4P\xEC. +\xA3pO\xD9\xFA\xFBП\xA1|\x9C~\xA7\xBF\xAFY\xF77\xD7g\xBF_\xCA\xC7M\xFFT;\xA1\xF7\xE2'\xE0"\xD3ߟu\xB3\xDF\xCC\xDC\xEA7\xF5\xDF\xDF\xEA\xFE~U-Ͻ\xF5G\xFC\xA4\xCF\xF4\x91\xCC\xF9Q\xAAo +4\xA9_\xAC\xBF"\xFB\xFA\x88:\xE7\xD6\xF7O\xBC_*\x9F\x9A\x9BQ\x95\xA9\xBC\xF7\xFD\xF0/\xCC8\xFF8qU;\xC9Ÿ\xF7\xF7\xFE\xBE\xB9\xA4\xFB\xFA\x8Cr\xA7{{\xFD\xFDz\xF9\xFB\xD8_D\xB7\xCE\xE7D\xAA\xA1W3\xA8\xF0\xFD\xE6+~\xB9H\xB6\xBC\xF6;5O\xE9)j1\x8E\xE2\xBD1&E\xA9\xF87\xFC\xBF\xFD\xFA\xFB\xDF\xFF\xF4\xF5\xCF_\xFD\xFD\xF8\xF9\x87\xDF::b35\xC6pij\xE6\xD5\xF6\xFC\xBB\xAF\xFC\xF1\xDB?.Y\xDF}\xFB\x9F~\xFE\xDD\xBE\xFE\xF9\xC3C\xCE\xC7\xF4\xE3\xD7\xDF~\xF7_?\xBA\xFB\xF0_>|\xF7\xBBo~\xFC᧟\xBE\xFD\xFE\xE9\x8BPh\xC6/iE,\xF6[\xDA\xFC\x93~<\xB8\xA0T\x8A\xBBsd\xC6i\x92\xAB7\xE3\x93Da\xF8\xA8\x99\xACs\xAF+\xB6\x92\xD4\xD9\xE2\x94\xB8\xE5\x94.,\x95\xEC\xFA\xAE\xF5 \x8F\xB79f;\xDBc\xACs\xF5\x96\xBCI\x96>]XQj\x9B\xBF\xC9\\xF9I\xA2H\xB5\x9A"\xBA?4\x9B\xA8\xFC\xBF\xFA\xA7\x89"\x85\xF5\x9C;\xD9d,f +\xFEV^\xFF\xD3D\x81\xB1<\xB6\xB1\xD70\x9B>\xAE\xBF9`\xE2SD +\xEA\x88<R\xDC\xF9_Ė\xFB[3\x9F& +\xBF\xAA5L\x8A\)\xF4\xDF +\xF5}\x9A((Y\xD14\xEC\xBF*\xD7\xFA\x9B|\x85\x9F& +T\xB9\xF60b\xAF\xB2h\x92\xDEt\x85\xB5\xE7h(Ώb\xFD\xADXק\x89\x82bR\xB9ؾ\x80c\xFE[% \x9F&j\xBF\xC2%PTD\x91K\xFEVQԧ\x89گ\xB0Xk`\xD7ؕn\xBFU9\xF3I\xA2P[\xDCbH\xFB\xBC*\xB3\xA1\xD3o6\xD6\xFD\xA3E\xE9\xDFkQ\xA6\x99?h\x96\x8D9\xA7\xF0\xA2\xFC\xF6\xA7\xDF}\xFB\xFD\x92\xF4\xFF~\xF8\xE9\xE7\xAF\xFE\xF6\xCF?\xFD\xF4\xE1\xBF\xFE_\xFD/\xDF\xFF\xE1;\x93\xFC?|\xF5\xFF|\xFF\xED\xCF~\xFF\xD5\xFFiO\xFA\xEF\xF8\xD3\xF5\xFD\xFF\xFE\xEB?=>\xF3_\xFD\xF9\xC7?|\xF8駯\xFEͷ\xDF}w\xFDG\xFF\xDD\xD7\xCF\xF3\xF3\xFF\xF0\xFD\xCB\xFF\xFA\xC3\xDF\xFFپ\xF9\xDB_\x91\xA6\xA6+\xB5\xEE\xC5\xE9\xFE\xB7\xCB+\xE1\xF7k\x82\xCB\xE9\x95CK\x9E鮋L\xB5ޜV;\x98jʣZ\xE5\xBC+\xE9A\xF7\x91W\xD8+\x94\xCA\xE9w\x92\xFEZ\xE99C\xF85$\x97[};\xDE"$ʱf\x93\x89!W\xCB\xE1\xBDK#)5\xD2\xC0\xA5\x99\xA6\xB9\xBC0$ѬO\xF0\xFD'Y\x9E%+$f7'^73!H\x9E\x97ZS\xB4Q6\xA0\x8Fd\xBC\xB3\xC0\xC5v\xBDe2^\x99S\xFDEu\xA7y\x90i\xA6\xBD\xD3n\xD4GH<\xCEvD\x81\xE9zeH(\xC1\xA0>Xϱ\xFB+T2\x93\x93ri\xE8\xF7\xE2\x85\xE4\xC4u5/\x98~\xA8XH\xCEGV \xA6D\xA9\xC1\x84\xAAYOJh\x95\xC1\xFE\xD4Jr\xEFU\xC9H1\xE6P[\xC0צ\xACر\x8F\xE4\xAE\\xC6`\x95\xA2k2 ɵ\x9D3ÿ\x88\x9Afz@¿\x98\x91\xD3ed\xBC\x98\xBB\x9F\xAC\xD4L\xC6Ss\xF1b̚y1\x95>C +\xD8g\xED\x84\xD5A\xDFw\xF4\x97\x92\xCDϑ\xC2Y\xC3-\xF2\xABr\xF6p.C\x84\xC9\xEFk\xC8\xDC$\xBB\x90\x9C\xDF\x93\x88v[_\xA6A\xFE\x95\xFD2}\xBA*/\x97\x8A\xFA\xD7\xF22\x8B8\x85K\xC0pe\xA4}$\x8Ek\x9B1p\xF1Gq\xFD%!\xE1ڶ>/!\xF2臫\xE7 +cS͢l\xB4\xD4\xDC`\x8C\xF2\x81C\x9A'լJ\xC1\xCEn\xB6?|T\x96\xB5\xD5\xC3!c6\xB6\x8DK\x88\xDCn\x9F>\x87\xACՋߥ\xE5v\xBF\xB6\xB2\xBA3\xA9\xB9\xC6\xD2\xD0\xD4\xF5\xBBϤ\xF0\xFA\xA4r N\x84\xE9V\xCCʒP\xD5]E\xE6úf\x92g\xBCTfҒh_\x91\xA2`O\xF4+\xA0X\xA7\xB1C$\x8Cr\xE5\xE4\x99T\x9B\xE2\xCF\xF0\x91\x99Ȁ\x97\xD8\xF6w:o\xC7\x893do\xB4q\x8D\xE6c\xDF{R\xA8\xB9\xC9\xEC%\xB7\xAA:Q\xB3\xA7ƞ\x9ET-\xC9iqj\x94\xC9b\x85\xAA\xF9\xD1\xFE\x9A\xB4\xC0_Y\x86\xF0w\xB0\xC6\xF8\xD8u\x95\xC4 N\xBA\xF0\x81L<\xA9S\xF1\xAA\x86w\xF9\xBF\x93s%\xB3F\xD8Y\xE7\xE9\xB5h\xD9\xB0\x8D\x9B*j\xFD\xBB\xCCQ\x93ٞ\x9CT\xFB\x9F\xEBA\xE77$*\xA5\xF0Z\xD8v\xA7\xE3\xDAb?k*\xA84\xB2k\xA7\xAC\x88\x8F\xA4ЌD \xA5|$\xEC#\xB3\xCE;RfA\x8E\xD3~\xC2>2\xD7(#gb\x9BV\xBA\xB9E\x9E\x84\x98Qť~\xCA~\x92y9 9(C\xA7j\xF0\x81,\x94Yd&\x8Dr; \xF9\x8C\x89t~\x93|\x92ɓ\x90k'\xD2\xFF\xC3\xE9\xC30)\xDBO\xD6-\xD6+_\x9B\xB4xyf\xE7\xE9+\xC1\xF12\xF1$\\xDCb;}\xCD )=\x90\xD4 3\xA3\xB6\xCENPvr7$O\xC2hDv\xF3\xF2\xFCW\xBA%\x9E;k{\xA8\xA5=\xEA\x83|$-\x83Z\xD1\xC2\xD5\xDAb\xD2\xF7\x91כ +\xDD\xD7\xCC\x9C'\x99\xBC٥\xC0\x9Ak\x8A,\xEE'Cg\xD5\!h\xB0|\xBEe\xA8뷳\x97\x90I\xC3\xD0Hޕ\xA0ML\x91\x8F\x97\xFBO1[\xBE\xBC^\xA5^\x8Bz\x9C\x80\x85,|\xBDR\x8A,г?vX\xCDr\xCD\xDE\xD1\xCE2\xDD\xEC\xF8\xAE$\xBD\x87֡\xB3D\xF1B<\xF4y鄇\xB4\xCBy \x93e\xC1k\x91]H6(\xEAβ(\xA7\xC5\xD3e\xBFa|\xDBoG=\xBD!\x95;\xFBKiN:\x9CQ\xF6͙\x85\x80d\xAB\xA2`}ߪ"\xAD\xA0*\x8A\x8As-us\xB8\xEC\x84\x85\x85\x9DM~\xDD\xE1ܠ\xBE\xDA4F\xE5\xFD\xAD\x96r@\xEE\xFB\xA1\x88\xFF\xA4Θ\xC1)\xADy \xB9=Ҳ\xAF\xF6\xA7\xAF\x9D\xBCY\x81\xDDRv̝\x88\xE0B\xB2\xA9;\xAEq)\xF0\xF1\xBC +\x85\x9A<\xF4v\xE9g\xC6\x89x\xD2\x9D\xAFG\xBB\xCD\x89x\x92=\x8A\x88\T\xDEN,\xFD\xF2\xB0\xC2*\xBBkW\xF3\xF4;\xF9\xA1\xA3U\xD5\xE2\xF3\xB0+,e6u<\x80\x8C=|<)V+\xC94\xEFh\xEC\xCB"\x82= \xB1\x83\xA64\xE8\xA7\xE7\xE1!?\x90\x97N\x99\xF8\xB5\xAB6\xC8G\xB2SF4@@j\xE0\xFA\xC9\xF2\xCA\x98\xF3\x90\xFDw85\xD46\xE9ҝ'\xA2\xBA\xDB\xF1CI\xE1٬ +ކ\xE82\x9D\xB6\x85\x85\xBC4Y\x98\x9A\x9FDz\xF9\x91\x92gs\xF5\xBB3\x9Bsڇk\x93\xC5`?\x9E&\xE8z:MH\x9E\xB7\xCC\xF7b\xD1\xFA\x9E~'\xCF[d\xB9\x8D!\xA3S|\xFC@\xB2\xC9"\x85KE\xDCb\xBB\xF7\x91l\xB2ȗ\xEE\xA1T\xE5,\xF9H\x9E\xB74)\xD3\xD6\xC7ɱ=\x908 v\xFF*O\xEA\xF4\xBA\xA4\x92Mqs\xB0B\xDD)0y _\xDAm\x98n\xAFᅌ\xEC3\xCE8b\x96I)JdVb̮/.$[s\xD2\xD4\xD4\xE1\xF6"f\x99452\xC5c{85l1_/_\x9D\xC2\xF2\xA2\xA5X\xF7W\x82\xAA[H\x9E\x9A\xD9+ +\xA1\x9C\xBE\x96Z\xCA~*V($\xAF\灜\x97{uA\xCE\xE8z+\xF6>\xB3+\xB9/aURp\xEE\xC8Y\x92\xA7\xE2\x84D\x80\xAC\x9A\xBB\x9B+vTF\xF0\x8C܅d\x9A\xADu\xB4\xF2j3<\x87q! \xF1%\xE4\xFA\xA7\xDFY\x90\xD5U\xA7\xCC\xE0\x94\xE7<\x90LҌ\xA3CuǞ\xB9\xB2\x90\xE5\x{180BB7}9\xA2פ\xFF@24g\x97 +\xA4\x8A\x9D\xD3\xEFd(\xB7<\xB0\x9A\x81\xE5\x85\xC9o\xDDU\xF9T\xE1%:1\xBE\xB0>\xA2\xA1\xB3\xA4\xEC\xBFl\xD4QQ#\xDCjr1BB\xB7\xD1.\xA9\x83n\x8E\x8B\xA3HrWMӼ\xE4\xC1\xB4\xCC2\xDAo\xFF\xB2]\xE9\x9A\xCF[j\x98\xEDz\xF4\x9BՕK\xCA^Y;U.ZY\xA7^XZHԪ\x8AҒAM\xA8s\x9E\xB0\x85\xDCe\xDA/\x8901\x95\xC6 +\x8EI\xB2\x90\xD8\xED\xDC\xB0C<\x8E2\xB7s\xAC:\xFB\x8E\x9A\xDCi:\xC41\xB9\xEB%3ж\xE13\xA9\xB8\xE4U\xB5\xC6>\xB02\xD4\xCC9v\x94\x9E=\xE3y!7\xAD0\x9Fd\xE1\xDB\xF7\xD5\xF8\xCA\xEE\xF79߷\xEB0$\xDC\xD4\xE4y\xFAl\x87\xDDPE\xE9\xC8}\xCF4\xB4%\x90\xF6\x94\xCCӞ\xA1\xFE\x8An_\xCD&*\x8A\xC3\xD7"\xDC>cH\x97\xBB=^\xC8>c5\xF7\xD0\xFC\x94GQ\xE1,\xA5\xB8\x86\x86\x90\xBBV\xAD\xAA\xEC\xC1\x8B\xA52Û!\x92%e?Sʚ\xA3fx43o\xBC\xD7MHܳ\xD2\xD8?1{ N\xE9\xE2B"\xC8e\xFA\xA40\xF1l\xF6\x9F\x96Y\xC8\xFD\x84uinh\xA2\\xBC\xE2΅\xDC\xC32f\xBDnj\xD5\xECv\xAE\xBDⅅ\xC491c\xAFx\xEBs\x9EVh\xCBػX +\x92]S\xEC\xF0o8a{\x80b\xAA2A\x91\xD1\xC3x\x99\xF49Rد0'\x8BF\xED\xC9r\xB8&\x84S\x81>\x99\xF2\xB7\xFF4\xBD+̰\xC5\xD9RG\x8D\xD7ϰ\x900 +l\xD5+\x8D\xE4ֽ\x8A\xE8\x85\xEC\xFCZ\xAAۙ\xF6\xC2S\xF1\xE9\xFB\xC0(\xB2]\x9AA\xF7Is:\xFD\xD5D,X,5]B\xC1 +=\xB9?:\xD9Lv>\xF4\xB5ŗ\xE1@\x9F\xF1\xCB\xE0̋\a +Ss\xDD +\xE4\xB9\x9B\xE2j\n\xBCb\xFC= a$\xCBzܟS;%\xD3\xCB\x89\xAAEu\x9C\xB00ԓ\x91\ض;K\xEB\xD4{\xFD\x95\xFC\xF3\xF5^!?\xAF\xF2H\x90fF\x9A\xC3跐\xA8\xE3v\x8F\xD1N\xD9\xEA\xE2u\x90i\xB0^\xD1H\xBEV\x91\xBE\x9C\x97\xCF\xFE\x85i\xB0\xC6qiD\x81zwXDHv\xF6 +\x8C\xB9P'vt#\xDB\xE2\xF3a\x8F\xD6`\x97\x87\x86:m\xF7$;\xFB*\xDBګ旻\xE7Ɛl~6\xEC}<q\x8B\xED\xD0G\xB22&f\xF0cT+\x89\xDA\xC3tyi\xEA\xA2t@\xB2\xF6\xD0\xFCT\x9C5\xC1\x9D\xF6\xB5\x87\xEA\xEA\xC0\xEF|\x84]|d\xB2W8\xF3vފ\x97;\x8C\x8F\xA0מk\xEA\x952\xAB<\xD9\xB9&S\x98d\x877 +\xE9\xE6\xD4\x89jْ';Rk\xCD\xDE\xA52bm\xED6\xA0>\xAE\xAD\xA6O\x89l\J\xAE\xA3\xAD\xAD\xDB\xB5\x90\x99Ȃ\x80Z\x95v\xD8O\xF4\xAFb\xEA\x8F\xD3\xCDJ\x89%\xFA\xCD\xCCTWW\xF1@\x9C\xD6\xAE\xAD?\xF0v\xE4\xE9\xF4\x91\xD0R\xE20\xC5/\xCB\xCD#\xDA{ \xA1\xA5fʼ\x919\x95wh!\x91\xC3ϙ\x8B|\xF0\xBE\xCE\x89 \x96\xE2\xD3o7\xFB8\x97\x94\x8B\xF6\xB0\\xAB\\xB7w\xAC\xDC\xFF\xD1'{_\xA23\xE2\xF1s\xA4\xE0\xB7;\x91Y\xCF\xDF\xF3\x8B\xD7\xFB9Rp#F\xB8\xD8DA\x89\xF2\xFBR.\xB5\xE6\x85\xEA\xB8\xE7\xA3t\xE9\xC3\xEEZ\xAC\x98\xE1\xED\xD5N,$\xB4\x98&\xFF\xB2\xB2x +ڸ\xFF\xCB\xF8j\xB6D\xFD\xFC.)\xAC'N宷\x93&\xAFq\4\xBB\x94Z\xCB;~^\xEE5\xDE/ZP\xD7\xC0})x\xE5M\xA9M\xBE\xF2\xF7)\xB0h\xE0K\xB9H\xAB\xEEKa\xA5J\xB4\xCA\xED\xF1q\xE8\x9B5\xAC\xE5\xD1PE\x9B.4$L\xD4\xD5@xª\xFE\xC0\xEBXHZ\xB9\xB1\xB54\xB7\xFEp!\xB9\xBF)%\xBE\xC7\xF5\xDDH\x98?\xAB;\xB9g\xF6{5\xB6\x89}P\x9A\xFB`\xA6X|Ù\xBA\xB0\x86¹=O\x87\x9C\xF9\x81\xBC\xAC\xE1\xEB%\xF8 .C^xYm\x94\xB6f\x9E\xF9H\xC4(4O6\x8A\xB8QN_K\xAE{5\xE9ߖ\xEAU\xA8-$\xBD\x86\xC4\xF8\x94J\xBC_F\xC0~\xCE>\xD0⋑/c ݡ!3\xA4\xED\xD7~6mm\xC9\xFF\xD8rU$\xF6\xD6\xF7\xA5\/\xD1\xA2\xFA\xA9\xB6H\xC7\xD6^Hؕ\xABS`Gv\xA54|$\xE3¢@\xA8*\xC6}@6"\j<~-\xBD\xFCfqL\xBB 7\xF9kR\xB8&1\xA3\xA3T\xF4Q^w\x98\x90\xF4\xEB\xCD\xDC\xC7>\xF3\xC3<r!\xD9\xED\xD7\xD9[<\xDA̞[HZ\xA0\xA6\xC2\xB5V\xC3\xC6a5Yg\x87\xD9 +\xDB\xB7f!\xA71\xDB\xD1\xF9\xAE%r^\xA1\x85\xBC\xACmB\x94o\xCE\xEC\xF2\xC9^\xD1\xF1\x8D\xF7鳎,$\xDE$e!S|\xDE'$\xEDƑy\xDE\xD4:pXۋ\xF7Fa\xD9Qt\xCB\xE7ͼ|\x94\xCD\xC8\xE9\xF7R\xAE\x89w\xB0\xA4\x86.\x9A\xD9V+\x9E\x8Fd4\xA3\xB2kk\xCA{?\xEC';F5\xE0~\xFF\xDA\xDEzp\xA6\xC7=\x90\xB0\xFD4\xA8g\xC8T\xE3\xCB\xF0\xFAϸˍ\x9E\xCAԷ\xBDe\xDEd\xA4kR{Dl\xA8\xAB\xBD\xF4\xB0\x83\xE8\x81+-\xB3W\xBC\x97\xE9M\xA8ZH\xF8F\xA5 +\xD6[\xF7"\xA6\xE9˚\xFC\xF7\xFE\xE6\xEB\xEF\xFE\xA4!\xCDZ\x98\xFF\xF6\xE17\xE3\xDFK\xEED\x8F\xF5\xF6]Jw\x82\xBET\xB7s\x8C_\x97S\xF5r\x89;1Y-\xFA\xA3\x97\xDFG\xC2癝3{L\xE6\xF1ŀc\xFE\xAD\x99\x9E\x8B:I\xA2\xA8x\x8F+<\xBEKR\x81\xF2\xFD\xF3_F#\xD1\xD0\xF3j\xF6\xF6W\xA5\xDDi\xE6\xCE\xEFS\x88\xF5 +\xDF\xC72\xF0\x8BE\xDD\xD3z\x9E\xDE\xF0gjY\xEDI\xBB$\xF1\xE4\xDE\xFF=\xF0g\xAAh\xD7p\xDA\xD3"\xBD/e\xBFSU#dp3RH^a\xECBf K\xBD\xE4"\xC7|\xF1\xD3?w\xBD\xF7;X[\xBC\xBDv\x82\xBC\xB8\xF5B\xEE7\xA3\x95K\xBA\xBD\xAB\xC1˴.\xE4~ڛ\xE9`X\xCF\xCA/x\xFE\xD9B\xEE\xA7]\xE9w\xF4u\xEB\x8D\xF3\xB2W\xB9\x9F\xE0&ә2g\xF0\xEA\x84\x84\xB7\xD6\xEC\xFE\xE3-\#32\xE1\xAD\xF5p\x99jzK\xE1^\xB9\x9F\x9C\xAEV\xAD\x8A\xAF\xAD\xD3\xEB\xD5ZH\xD4\xE0\x98\xC2G1\xB6\xC9t\xBBar? ]\x9Cs\x90\xA9,\xDD\xE9k+\x90\xB2\xBC`\xE5\x96\xE1\xF9\xF8\x89RϦR\x9Ci\x8F\x87\xC7\xA3G\\xEFi\x82\xB5C\xFF\x8D\xC7 +\xB0\x90X!y\x97(DS\xC1\xA9\xBFB\xA5\x8A\xA6\x872l8\xDC<\x88\x89\x9E4q\xA1B\xC0J=h\x82\xC9J\xF3\xBD\xA1ymӲW\x95\xB0\x90\xFB~ +\xB3\x81\x95\xAB \x9C\xBF\x9F3\xA2\xBEG#\x88\xE0\x86\xE4\xF2\xC8-$\xEA{\xCCd\x88D\x8E\x93\xC59\xE9Q\xDB\xDB>M9\xAA\xBE\x9A\xE0\xA92\xA1\xAC\xA3"\xB3=x-u3fNU5{n\xEC\x8F \xB6\xA9\x99jf5\xD2\xEC\xE9\xE0%O\xB0M͢Q~\x91\x85\xE0vq/$JWʹޭ\xF9$rI/\x8B\xBE\x90(\xC5\xF3\xFA\xE04\x95\xF... [truncated message content] |
From: <pg...@us...> - 2014-06-07 20:26:35
|
Revision: 2770 http://sourceforge.net/p/roadmap/code/2770 Author: pgf Date: 2014-06-07 20:26:33 +0000 (Sat, 07 Jun 2014) Log Message: ----------- rdm_osm_fetch_tile: fixes to the lookaside cache when using the cache, the target path needs to exist before trying to copy. Modified Paths: -------------- trunk/roadmap/src/rdm_osm_fetch_tile Modified: trunk/roadmap/src/rdm_osm_fetch_tile =================================================================== --- trunk/roadmap/src/rdm_osm_fetch_tile 2014-06-07 20:26:28 UTC (rev 2769) +++ trunk/roadmap/src/rdm_osm_fetch_tile 2014-06-07 20:26:33 UTC (rev 2770) @@ -50,22 +50,32 @@ exit fi -case $xmlfile in -*.gz) want_compressed=1 ;; -esac - -# for development, convenient to be able to get the .osm from -# somewhere on the local system, when maps targetted for somewhere -# else. +# normally the .osm.gz files are stored alongside the .rdm files. +# but for development, it can be convenient to be able to get the .osm from +# somewhere else on the local system. localstore=/usr/local/share/roadmap/newquads -want=qt$bits/${xmlfile##*/qt$bits} -if [ -e "$localstore/$want" ] +# isolate the qt19/.../file.osm.gz partial path +wantqtpath=qt$bits/${xmlfile##*/qt$bits} + +if [ -e "$localstore/$wantqtpath" ] then - cp -a $localstore/$want $xmlfile + mkdir -p $(dirname $xmlfile) + cp $localstore/$wantqtpath $xmlfile exit fi +# okay... we need to get it from the web. +# one or two more layers of caching would be nice here -- a web +# cache of .osm.gz files is an obvious thing (to avoid all the +# clipping and slow transfer from the OSM servers), and maybe +# even a web store of .rdm files -- but that should really be +# checked long before we get to this point. + +case $xmlfile in +*.gz) want_compressed=1 ;; +esac + url="http://$server$bbox$query$me" echo "Fetching from $url" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pg...@us...> - 2014-06-07 20:26:31
|
Revision: 2769 http://sourceforge.net/p/roadmap/code/2769 Author: pgf Date: 2014-06-07 20:26:28 +0000 (Sat, 07 Jun 2014) Log Message: ----------- buildmap_osm_text: if we already have a layer, don't discard needlessly Modified Paths: -------------- trunk/roadmap/src/buildmap_osm_text.c Modified: trunk/roadmap/src/buildmap_osm_text.c =================================================================== --- trunk/roadmap/src/buildmap_osm_text.c 2014-06-07 20:26:23 UTC (rev 2768) +++ trunk/roadmap/src/buildmap_osm_text.c 2014-06-07 20:26:28 UTC (rev 2769) @@ -730,17 +730,19 @@ if (wi.WayId == 0) buildmap_fatal(0, "Wasn't in a way (%s)", data); - /* if a way is both a coast and a boundary, treat it only as coast */ - if (wi.WayCoast) { - wi.WayLayer = l_shoreline; - } else if (wi.WayAdminLevel) { - /* national == 2, state == 4, ignore lesser boundaries */ - /* also ignore territorial (marine) borders */ - if (wi.WayAdminLevel > 4 || wi.WayTerritorial) { - wi.WayIsInteresting = 0; + if (wi.WayLayer == 0) { + /* if a way is both a coast and a boundary, treat it only as coast */ + if (wi.WayCoast) { + wi.WayLayer = l_shoreline; + } else if (wi.WayAdminLevel) { + /* national == 2, state == 4, ignore lesser boundaries */ + /* also ignore territorial (marine) borders */ + if (wi.WayAdminLevel > 4 || wi.WayTerritorial) { + wi.WayIsInteresting = 0; + } + + wi.WayLayer = l_boundary; } - - wi.WayLayer = l_boundary; } if ( !wi.WayIsInteresting || wi.WayLayer == 0) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pg...@us...> - 2014-06-07 20:26:26
|
Revision: 2768 http://sourceforge.net/p/roadmap/code/2768 Author: pgf Date: 2014-06-07 20:26:23 +0000 (Sat, 07 Jun 2014) Log Message: ----------- doc/Configuration: minor corrections Modified Paths: -------------- trunk/roadmap/doc/Configuration Modified: trunk/roadmap/doc/Configuration =================================================================== --- trunk/roadmap/doc/Configuration 2014-06-07 20:26:19 UTC (rev 2767) +++ trunk/roadmap/doc/Configuration 2014-06-07 20:26:23 UTC (rev 2768) @@ -33,7 +33,7 @@ == Files == The syntax of most RoadMap configuration files is similar to the X - ressources file format (the exceptions are the sprites file and the + resources file format (the exceptions are the sprites file and the trip files). Each configuration item is represented by one line of text, using the following format: @@ -583,7 +583,7 @@ : Map.Path The map database search path. - //Format:// a comma-separated list of directory paths. - - //Default:// empty string (i.e. RoadMap uses the hardcoded default) + - //Default:// empty (RoadMap uses the hardcoded default, if any) - //Comment:// The hardcoded default also includes the directories /usr/local/share/roadmap and /usr/share/roadmap, for compatibility purposes. These two directories were the This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pg...@us...> - 2014-06-07 20:26:22
|
Revision: 2767 http://sourceforge.net/p/roadmap/code/2767 Author: pgf Date: 2014-06-07 20:26:19 +0000 (Sat, 07 Jun 2014) Log Message: ----------- increase the maximum polygon node count to a 32 bit value initially, there could only be a total of 65535 polygon nodes in a database. (well, twice that, because both the offset into the table of node ids, as well as the count of node ids, were each 16 bits.) these limits were later extended to 20 bits by reclaiming an unused filler byte, giving 4 bits more for the offset and the count. this commit gives 32 bits to to each, costing every polygon another 4 bytes. we preserve backward compatibility by detecting, when the database is opened, which version we have by looking at the total length of the polygon data vs. the count of polygon structures. so this code can use old maps, but old code can't read new maps. buildmap will no longer produce the old format. Modified Paths: -------------- trunk/roadmap/src/buildmap_polygon.c trunk/roadmap/src/roadmap_db_polygon.h trunk/roadmap/src/roadmap_polygon.c trunk/roadmap/src/roadmap_polygon.h Modified: trunk/roadmap/src/buildmap_polygon.c =================================================================== --- trunk/roadmap/src/buildmap_polygon.c 2014-06-07 20:26:14 UTC (rev 2766) +++ trunk/roadmap/src/buildmap_polygon.c 2014-06-07 20:26:19 UTC (rev 2767) @@ -256,34 +256,37 @@ (RoadMapPolygon *polygon, int from, int to) { int x1, x2, y1, y2; + RoadMapArea *pa; + pa = &polygon->area; + x1 = buildmap_point_get_longitude_sorted (from); y1 = buildmap_point_get_latitude_sorted (from); x2 = buildmap_point_get_longitude_sorted (to); y2 = buildmap_point_get_latitude_sorted (to); - if (x1 < polygon->west) { - polygon->west = x1; - } else if (x1 > polygon->east) { - polygon->east = x1; + if (x1 < pa->west) { + pa->west = x1; + } else if (x1 > pa->east) { + pa->east = x1; } - if (x2 < polygon->west) { - polygon->west = x2; - } else if (x2 > polygon->east) { - polygon->east = x2; + if (x2 < pa->west) { + pa->west = x2; + } else if (x2 > pa->east) { + pa->east = x2; } - if (y1 < polygon->south) { - polygon->south = y1; - } else if (y1 > polygon->north) { - polygon->north = y1; + if (y1 < pa->south) { + pa->south = y1; + } else if (y1 > pa->north) { + pa->north = y1; } - if (y2 < polygon->south) { - polygon->south = y2; - } else if (y2 > polygon->north) { - polygon->north = y2; + if (y2 < pa->south) { + pa->south = y2; + } else if (y2 > pa->north) { + pa->north = y2; } } @@ -300,12 +303,13 @@ int match_point; BuildMapPolygonLine *this_line; BuildMapPolygonLine *other_line; + RoadMapArea *pa = &polygon->area; - first = roadmap_polygon_get_first(polygon); - count = roadmap_polygon_get_count(polygon); + first = polygon->first; + count = polygon->count; - polygon->west = polygon->south = 180000000; - polygon->east = polygon->north = -180000000; + pa->west = pa->south = 180000000; + pa->east = pa->north = -180000000; end = first + count - 1; @@ -958,7 +962,7 @@ if (polygon_current >= 0) { - if (roadmap_polygon_get_count(db_poly) <= 1) { + if (db_poly->count <= 1) { buildmap_error (0, "empty polygon"); return 1; } @@ -971,14 +975,14 @@ db_poly = &db_head[polygon_current]; db_poly->name = one_polygon->name; - buildmap_polygon_set_first(db_poly, i); + db_poly->first = i; db_poly->cfcc = one_polygon->cfcc; if (one_polygon->count > MAX_POLYGON_LINE_COUNT) { buildmap_error (0, "too many polygon lines (%d, max %d)", one_polygon->count, MAX_POLYGON_LINE_COUNT); return 1; } - buildmap_polygon_set_count(db_poly, one_polygon->count); + db_poly->count = one_polygon->count; square = one_polygon->square[0]; Modified: trunk/roadmap/src/roadmap_db_polygon.h =================================================================== --- trunk/roadmap/src/roadmap_db_polygon.h 2014-06-07 20:26:14 UTC (rev 2766) +++ trunk/roadmap/src/roadmap_db_polygon.h 2014-06-07 20:26:19 UTC (rev 2767) @@ -51,39 +51,28 @@ int east; int south; -} RoadMapPolygon; +} RoadMapPolygon1; -/* Table polygons/lines is an array of int. */ -typedef int RoadMapPolygonLine; +typedef struct { /* table polygon/head */ -/* these accessors for the "count" and "first" values, which - * are 20 bits each -- 16 in an unsigned short, and 4 in each - * nibble of the "hi_f_c" element. - */ + unsigned long first; /* 32 bits */ + unsigned long count; /* 32 bits */ -#define hifirst(t) (((t)->hi_f_c >> 4) & 0xf) -#define hicount(t) (((t)->hi_f_c >> 0) & 0xf) + RoadMapString name; + unsigned char cfcc; + unsigned char filler; -#define sethifirst(t,i) { (t)->hi_f_c = \ - ((t)->hi_f_c & 0x0f) + (((i) & 0xf) << 4); } -#define sethicount(t,i) { (t)->hi_f_c = \ - ((t)->hi_f_c & 0xf0) + (((i) & 0xf) << 0); } + RoadMapArea area; -#define roadmap_polygon_get_count(this) \ - ((this)->count + (hicount(this) * 65536)) -#define roadmap_polygon_get_first(this) \ - ((this)->first + (hifirst(this) * 65536)) +} RoadMapPolygon; -#define buildmap_polygon_set_count(this, c) do { \ - (this)->count = (c) % 65536; \ - sethicount(this, (c) / 65536); \ - } while(0) -#define buildmap_polygon_set_first(this, f) do { \ - (this)->first = (f) % 65536; \ - sethifirst(this, (f) / 65536); \ - } while(0) -#define MAX_POLYGON_LINE_COUNT 0xfffff +/* Table polygons/lines is an array of int. */ +typedef int RoadMapPolygonLine; +// this isn't quite the true maximum, but if we hit this +// limit, it's really likely something's wrong. +#define MAX_POLYGON_LINE_COUNT 0x3fffffff + #endif // INCLUDED__ROADMAP_DB_POLYGON__H Modified: trunk/roadmap/src/roadmap_polygon.c =================================================================== --- trunk/roadmap/src/roadmap_polygon.c 2014-06-07 20:26:14 UTC (rev 2766) +++ trunk/roadmap/src/roadmap_polygon.c 2014-06-07 20:26:19 UTC (rev 2767) @@ -43,14 +43,45 @@ static char *RoadMapPolygonType = "RoadMapPolygonContext"; +/* for older RoadMapPolygon1 polygons, these accessors for the "count" + * and "first" values, which are 20 bits each -- 16 in an unsigned + * short, and 4 in each nibble of the "hi_f_c" element. + * + * newer maps have 32bit "first" and "count" elements. + */ + +#define hifirst(t) (((t)->hi_f_c >> 4) & 0xf) +#define hicount(t) (((t)->hi_f_c >> 0) & 0xf) + +#define sethifirst(t,i) { (t)->hi_f_c = \ + ((t)->hi_f_c & 0x0f) + (((i) & 0xf) << 4); } +#define sethicount(t,i) { (t)->hi_f_c = \ + ((t)->hi_f_c & 0xf0) + (((i) & 0xf) << 0); } + +#define roadmap_polygon_get_count(this) \ + ((this)->count + (hicount(this) * 65536)) +#define roadmap_polygon_get_first(this) \ + ((this)->first + (hifirst(this) * 65536)) + +#define buildmap_polygon_set_count(this, c) do { \ + (this)->count = (c) % 65536; \ + sethicount(this, (c) / 65536); \ + } while(0) +#define buildmap_polygon_set_first(this, f) do { \ + (this)->first = (f) % 65536; \ + sethifirst(this, (f) / 65536); \ + } while(0) + +int roadmap_polygon_db_version; + typedef struct { char *type; - RoadMapPolygon *Polygon; + RoadMapPolygon *Polygons; int PolygonCount; - RoadMapPolygonLine *PolygonLine; + RoadMapPolygonLine *PolygonLines; int PolygonLineCount; } RoadMapPolygonContext; @@ -76,19 +107,24 @@ point_table = roadmap_db_get_subsection (root, "point"); line_table = roadmap_db_get_subsection (root, "line"); - context->Polygon = (RoadMapPolygon *) roadmap_db_get_data (head_table); + context->Polygons = roadmap_db_get_data (head_table); context->PolygonCount = roadmap_db_get_count (head_table); - if (roadmap_db_get_size (head_table) != - context->PolygonCount * sizeof(RoadMapPolygon)) { - roadmap_log (ROADMAP_FATAL, "invalid polygon/head structure"); + if (roadmap_db_get_size (head_table) == + context->PolygonCount * sizeof(RoadMapPolygon1)) { + roadmap_polygon_db_version = 0; + } else if (roadmap_db_get_size (head_table) == + context->PolygonCount * sizeof(RoadMapPolygon)) { + roadmap_polygon_db_version = 1; + } else { + roadmap_log (ROADMAP_FATAL, "invalid polygon/head structure"); } /* an "old" (1.1.0 and earlier) set of maps may have a "point" * table and no "line" table. later, we only use the line table. */ if (line_table) { - context->PolygonLine = + context->PolygonLines = (RoadMapPolygonLine *) roadmap_db_get_data (line_table); context->PolygonLineCount = roadmap_db_get_count (line_table); @@ -100,7 +136,7 @@ if (point_table) { roadmap_log (ROADMAP_INFO, "Found old-style polygon data -- skipping."); } - context->PolygonLine = NULL; + context->PolygonLines = NULL; context->PolygonLineCount = 0; } @@ -145,41 +181,94 @@ if (RoadMapPolygonActive == NULL) return 0; - if (RoadMapPolygonActive->PolygonLine == NULL) return 0; + if (RoadMapPolygonActive->PolygonLines == NULL) return 0; return RoadMapPolygonActive->PolygonCount; } -int roadmap_polygon_category (int polygon) { +int roadmap_polygon_category1 (int polygon) +{ + RoadMapPolygon1 *polygons; + polygons = (RoadMapPolygon1 *)(RoadMapPolygonActive->Polygons); + return polygons[polygon].cfcc; +} - return RoadMapPolygonActive->Polygon[polygon].cfcc; +int roadmap_polygon_category2 (int polygon) +{ + RoadMapPolygon *polygons; + polygons = RoadMapPolygonActive->Polygons; + return polygons[polygon].cfcc; } -void roadmap_polygon_edges (int polygon, RoadMapArea *edges) { +void roadmap_polygon_edges1 (int polygon, RoadMapArea *edges) +{ - RoadMapPolygon *this_polygon = RoadMapPolygonActive->Polygon + polygon; + RoadMapPolygon1 *polygons; + polygons = (RoadMapPolygon1 *)(RoadMapPolygonActive->Polygons); - edges->west = this_polygon->west; - edges->east = this_polygon->east; - edges->north = this_polygon->north; - edges->south = this_polygon->south; + edges->west = polygons[polygon].west; + edges->east = polygons[polygon].east; + edges->north = polygons[polygon].north; + edges->south = polygons[polygon].south; } -int roadmap_polygon_lines (int polygon, int **listp) { +void roadmap_polygon_edges2 (int polygon, RoadMapArea *edges) +{ - RoadMapPolygon *this_polygon; + RoadMapPolygon *polygons; + polygons = RoadMapPolygonActive->Polygons; + *edges = polygons[polygon].area; +} + +int roadmap_polygon_lines1 (int polygon, int **listp) +{ + + RoadMapPolygon1 *polygons; + int count; int first; - this_polygon = RoadMapPolygonActive->Polygon + polygon; + polygons = (RoadMapPolygon1 *)(RoadMapPolygonActive->Polygons); + polygons += polygon; - count = roadmap_polygon_get_count(this_polygon); - first = roadmap_polygon_get_first(this_polygon); + count = roadmap_polygon_get_count(polygons); + first = roadmap_polygon_get_first(polygons); - *listp = RoadMapPolygonActive->PolygonLine + first; + *listp = RoadMapPolygonActive->PolygonLines + first; return count; } +int roadmap_polygon_lines2 (int polygon, int **listp) +{ + + RoadMapPolygon *polygons; + + int count; + int first; + + polygons = RoadMapPolygonActive->Polygons; + polygons += polygon; + + count = polygons->count; + first = polygons->first; + + *listp = RoadMapPolygonActive->PolygonLines + first; + + return count; +} + +struct roadmap_polygon_version roadmap_polygon_versions[] = { + { + roadmap_polygon_category1, + roadmap_polygon_edges1, + roadmap_polygon_lines1 + }, { + roadmap_polygon_category2, + roadmap_polygon_edges2, + roadmap_polygon_lines2 + } +}; + Modified: trunk/roadmap/src/roadmap_polygon.h =================================================================== --- trunk/roadmap/src/roadmap_polygon.h 2014-06-07 20:26:14 UTC (rev 2766) +++ trunk/roadmap/src/roadmap_polygon.h 2014-06-07 20:26:19 UTC (rev 2767) @@ -28,10 +28,22 @@ #include "roadmap_dbread.h" int roadmap_polygon_count (void); -int roadmap_polygon_category (int polygon); -void roadmap_polygon_edges (int polygon, RoadMapArea *edges); -int roadmap_polygon_lines (int polygon, int **listp); +struct roadmap_polygon_version { + int (*category)(int polygon); + void (*edges)(int polygon, RoadMapArea *edges); + int (*lines)(int polygon, int **listp); +}; +extern struct roadmap_polygon_version roadmap_polygon_versions[]; +extern int roadmap_polygon_db_version; +#define roadmap_polygon_category(p) \ + (roadmap_polygon_versions[roadmap_polygon_db_version].category)(p) +#define roadmap_polygon_edges(p, e) \ + (roadmap_polygon_versions[roadmap_polygon_db_version].edges)(p, e) +#define roadmap_polygon_lines(p, lp) \ + (roadmap_polygon_versions[roadmap_polygon_db_version].lines)(p, lp) + + extern roadmap_db_handler RoadMapPolygonHandler; #endif // _ROADMAP_POLYGON__H_ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pg...@us...> - 2014-06-07 20:26:17
|
Revision: 2766 http://sourceforge.net/p/roadmap/code/2766 Author: pgf Date: 2014-06-07 20:26:14 +0000 (Sat, 07 Jun 2014) Log Message: ----------- buildmap_turn_restrictions: get rid of compiler warnings Modified Paths: -------------- trunk/roadmap/src/buildmap_turn_restrictions.c Modified: trunk/roadmap/src/buildmap_turn_restrictions.c =================================================================== --- trunk/roadmap/src/buildmap_turn_restrictions.c 2014-06-07 20:26:10 UTC (rev 2765) +++ trunk/roadmap/src/buildmap_turn_restrictions.c 2014-06-07 20:26:14 UTC (rev 2766) @@ -254,8 +254,8 @@ int last_square = -1; int square_count; - int longitude = 0; - int latitude = 0; + // int longitude = 0; + // int latitude = 0; RoadMapTurns *db_turns; BuildMapTurns *one_turn; @@ -312,8 +312,8 @@ last_node = one_turn->node; - longitude = buildmap_point_get_longitude_sorted (last_node); - latitude = buildmap_point_get_latitude_sorted (last_node); + // longitude = buildmap_point_get_longitude_sorted (last_node); + // latitude = buildmap_point_get_latitude_sorted (last_node); square = buildmap_point_get_square_sorted (last_node); @@ -390,7 +390,7 @@ fprintf (stderr, "-- turn restrictions table: %d items, %d add, %d bytes used\n" - " %d lines (range %d), max %d points per line\n", + " %d lines (range %d), max %lu points per line\n", TurnsCount, 0, TurnsCount * sizeof(RoadMapTurns) + (TurnsMaxNode + 1) * sizeof(RoadMapTurnsByNode), This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pg...@us...> - 2014-06-07 20:26:12
|
Revision: 2765 http://sourceforge.net/p/roadmap/code/2765 Author: pgf Date: 2014-06-07 20:26:10 +0000 (Sat, 07 Jun 2014) Log Message: ----------- Makefile: remove rdmxchange source and objects from build these have never been finished, or particularly necessary -- it's hard enough to get data from some other source converted to rdm format, without worrying about exporting it again. Modified Paths: -------------- trunk/roadmap/src/Makefile Modified: trunk/roadmap/src/Makefile =================================================================== --- trunk/roadmap/src/Makefile 2014-06-07 20:26:06 UTC (rev 2764) +++ trunk/roadmap/src/Makefile 2014-06-07 20:26:10 UTC (rev 2765) @@ -161,23 +161,23 @@ BUOBJS = $(BUSRC:.c=.o) -XCHGSRC = rdmxchange_main.c \ - rdmxchange_dictionary.c \ - rdmxchange_index.c \ - rdmxchange_metadata.c \ - rdmxchange_point.c \ - rdmxchange_line.c \ - rdmxchange_shape.c \ - rdmxchange_square.c \ - rdmxchange_street.c \ - rdmxchange_range.c \ - rdmxchange_zip.c \ - buildmap_messages.c \ - buildmap_dbwrite.c +# XCHGSRC = rdmxchange_main.c \ +# rdmxchange_dictionary.c \ +# rdmxchange_index.c \ +# rdmxchange_metadata.c \ +# rdmxchange_point.c \ +# rdmxchange_line.c \ +# rdmxchange_shape.c \ +# rdmxchange_square.c \ +# rdmxchange_street.c \ +# rdmxchange_range.c \ +# rdmxchange_zip.c \ +# buildmap_messages.c \ +# buildmap_dbwrite.c +# +# XCHGOBJS = $(XCHGSRC:.c=.o) -XCHGOBJS = $(XCHGSRC:.c=.o) - MISCSRC = \ rdmindex_main.c \ roadmap_kismet.c \ @@ -212,8 +212,8 @@ buildus_fips.h \ buildmap_turn_restrictions.h -XCHGHEADERS = \ - rdmxchange.h +# XCHGHEADERS = \ +# rdmxchange.h RGHEADERS = \ roadgps_logger.h \ @@ -319,7 +319,7 @@ roadmap_dbread.h \ roadmap_db_turns.h -HEADERS = $(BMHEADERS) $(XCHGHEADERS) $(RGHEADERS) $(RMHEADERS) $(RMDBHEADERS) +HEADERS = $(BMHEADERS) $(RGHEADERS) $(RMHEADERS) $(RMDBHEADERS) # $(XCHGHEADERS) # more sources PKGDATAFILES = sprites preferences session drivers \ @@ -352,7 +352,7 @@ else BUILD = buildmap buildmap_osm buildus buildplace dumpmap RUNTIME += libguiroadgps.a -DRIVERS = rdmkismet rdmghost rdmfriends rdmtrace rdmxchange +DRIVERS = rdmkismet rdmghost rdmfriends rdmtrace # rdmxchange TOOLS = sunrise # rdmindex -- removed from default build. it's unfinished s/w, and # its presence is confusing. @@ -364,7 +364,8 @@ C_SRC = $(RMLIBSRC) $(RMGUISRC) $(RGGUISRC) \ $(RMPLUGINSRC) $(DMSRC) $(BMLIBSRC) $(BMSRC) \ $(BMOSMSRC) \ - $(BPSRC) $(BUSRC) $(XCHGSRC) $(MISCSRC) + $(BPSRC) $(BUSRC) $(MISCSRC) +# $(XCHGSRC) ALL_SRC = $(MKFILES) $(C_SRC) $(HEADERS) \ $(PKGDATAFILES) $(MISCFILES) $(MANPAGES) $(SCRIPTS) $(FONT) $(MANUAL) @@ -545,7 +546,7 @@ icons: $(MAKE) -C icons all -basefiles: build +basefiles: build # need buildmap_osm and builus to be built $(MAKE) -C basefiles all topclean: @@ -662,8 +663,8 @@ rdmindex : rdmindex_main.o libbuildmap.a $(RDMLIBS) $(CC) $(LDFLAGS) rdmindex_main.o -o rdmindex libbuildmap.a $(RDMLIBS) $(LIBS) -rdmxchange : $(XCHGOBJS) $(RDMLIBS) - $(CC) $(LDFLAGS) -o rdmxchange $(XCHGOBJS) $(RDMLIBS) $(LIBS) +# rdmxchange : $(XCHGOBJS) $(RDMLIBS) +# $(CC) $(LDFLAGS) -o rdmxchange $(XCHGOBJS) $(RDMLIBS) $(LIBS) rdmkismet: roadmap_kismet.o $(RDMLIBS) $(CC) $(LDFLAGS) roadmap_kismet.o -o rdmkismet $(RDMLIBS) $(RDMLIBS) -lm This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pg...@us...> - 2014-06-07 20:26:08
|
Revision: 2764 http://sourceforge.net/p/roadmap/code/2764 Author: pgf Date: 2014-06-07 20:26:06 +0000 (Sat, 07 Jun 2014) Log Message: ----------- basefiles: add scripts for creating the usc81070.rdm basefile the basefile is a rough map of country and US state borders Modified Paths: -------------- trunk/roadmap/src/Makefile Added Paths: ----------- trunk/roadmap/src/basefiles/Makefile trunk/roadmap/src/basefiles/basemap.sh trunk/roadmap/src/basefiles/shp2osm.awk Modified: trunk/roadmap/src/Makefile =================================================================== --- trunk/roadmap/src/Makefile 2014-06-07 20:25:54 UTC (rev 2763) +++ trunk/roadmap/src/Makefile 2014-06-07 20:26:06 UTC (rev 2764) @@ -369,7 +369,7 @@ ALL_SRC = $(MKFILES) $(C_SRC) $(HEADERS) \ $(PKGDATAFILES) $(MISCFILES) $(MANPAGES) $(SCRIPTS) $(FONT) $(MANUAL) -ALL_SUBDIRS = unix gpx gtk gtk2 qt qt4 icons ipkg agg_support win32 +ALL_SUBDIRS = unix gpx gtk gtk2 qt qt4 icons ipkg agg_support win32 basefiles # --- Additions for Trip plugin ------------------------------- @@ -492,9 +492,9 @@ # --- Conventional targets ---------------------------------------- .PHONY: all gtk gtk2 qt3 qt4 qpe4 rebuild build \ - topclean clean strip install uninstall unix gpx + topclean clean strip install uninstall unix gpx icons basefiles -all: runtime build $(TOOLS) icons $(MANUAL) +all: runtime build $(TOOLS) icons basefiles $(MANUAL) # --- Convenience targets, to force a specific desktop build ------ @@ -545,6 +545,9 @@ icons: $(MAKE) -C icons all +basefiles: build + $(MAKE) -C basefiles all + topclean: rm -f *.o *.a *.da .depends.mk $(BUILD) $(TOOLS) $(DRIVERS) # Clean up CVS backup files as well. @@ -572,11 +575,15 @@ chmod a+rx $(pkgdatadir) mkdir -p $(pkgdatadir)/default chmod a+rx $(pkgdatadir)/default + mkdir -p $(pkgdatadir)/basemaps + chmod a+rx $(pkgdatadir)/basemaps cd $(pkgdatadir) && rm -f $(PKGDATAFILES) cp $(PKGDATAFILES) $(pkgdatadir)/. cd $(pkgdatadir) ; chmod a+r $(PKGDATAFILES) cp default/All $(pkgdatadir)/default/. chmod a+r $(pkgdatadir)/default/All + cp basefiles/us*.rdm $(pkgdatadir)/basemaps/. + chmod a+r $(pkgdatadir)/basemaps/us*.rdm ifneq ($(strip $(AGG)),NO) cp $(FONT) $(pkgdatadir)/font.ttf endif @@ -618,7 +625,7 @@ $@ uninstall: - cd $(pkgdatadir) && rm -f $(PKGDATAFILES) + cd $(pkgdatadir) && rm -rf $(PKGDATAFILES) default basemaps cd $(pkgbindir) && rm -f $(BUILD) $(SCRIPTS) $(DRIVERS) -test -d $(menudir) && rm -f $(menudir)/roadmap $(MAKE) -C icons uninstall Added: trunk/roadmap/src/basefiles/Makefile =================================================================== --- trunk/roadmap/src/basefiles/Makefile (rev 0) +++ trunk/roadmap/src/basefiles/Makefile 2014-06-07 20:26:06 UTC (rev 2764) @@ -0,0 +1,14 @@ + +TOP = .. +include $(TOP)/options.mk + +all: usc81070.rdm + +usc81070.rdm: basemap.sh shp2osm.awk + ./basemap.sh + +sourcelist: + @find . -print | egrep -v 'rdm$$|osm$$' + +depends: + Added: trunk/roadmap/src/basefiles/basemap.sh =================================================================== --- trunk/roadmap/src/basefiles/basemap.sh (rev 0) +++ trunk/roadmap/src/basefiles/basemap.sh 2014-06-07 20:26:06 UTC (rev 2764) @@ -0,0 +1,24 @@ +#!/bin/sh -x + +# the shapefiles have the same name as their directory, and no suffix +# is needed. +shapefiles=$(for d in ne_110m* ; do echo $d/$d ; done) + +# gather attribution and version info +for s in $shapefiles +do + b=$(basename $s) + sources="$sources$b: $(cat $s.VERSION.txt); " +done + +# run all the shapefiles through the converter together +for s in $shapefiles +do + shpdump $s +done | ./shp2osm.awk "$sources" >basefile.osm + +../buildmap_osm -c ../default/All -i basefile.osm -o usc81070.rdm + +../buildus --path=.. --maps=. + + Property changes on: trunk/roadmap/src/basefiles/basemap.sh ___________________________________________________________________ Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Added: trunk/roadmap/src/basefiles/shp2osm.awk =================================================================== --- trunk/roadmap/src/basefiles/shp2osm.awk (rev 0) +++ trunk/roadmap/src/basefiles/shp2osm.awk 2014-06-07 20:26:06 UTC (rev 2764) @@ -0,0 +1,66 @@ +#!/bin/sh + +# merge all the sourcefiles into one XML file. +# the output is designed to mimic the current OSM XML format closely, +# both in layout of individual elements, and in ordering of elements +# within the file. + +# use sed to ensure spaces around some fields, to seperate them +# from, or to replace, their punctuation. makes the awk job easier. +sed -e '/^Shape:[[:digit:]]/s/:/ /' -e 's/,/ /g' -e 's/[()]/ & /g' | + +# "awk" is gawk on my system. don't know if that matters. +awk --assign sources="$1" ' + +function emit_way(way_id) +{ + printf " <way id=\"%s\">\n", way_id + for (i = 0; i < wayindex; i++) { + printf " <nd ref=\"%s\"/>\n", waynode[i] + } + # printf " <nd ref=\"%s\"/>\n", waynode[0] + printf " <tag k=\"boundary\" v=\"administrative\"/>\n" + printf " <tag k=\"admin_level\" v=\"2\"/>\n" + printf " </way>\n" + printf "\n" +} + + BEGIN { + nodeid=1; + way_id=1; + printf "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + printf "<osm version=\"0.6\" generator=\"roadmap shp2osm.awk\">\n" + printf "<note>Made with Natural Earth. Free vector and raster map data @ naturalearthdata.com</note>\n" + printf "<note>source files: " sources "</note>\n" + } + + /^Shape [[:digit:]].*/ { + if (wayindex != 0) { + emit_way(way_id++) + } + wayindex=0 + + } + /^ *\+ *\(.*Ring/ { + if (wayindex != 0) { + emit_way(way_id++) + } + wayindex=0 + + lat=$4; lon=$3 + printf " <node id=\"%s\" lat=\"%s\" lon=\"%s\"/>\n", nodeid, lat, lon + waynode[wayindex++] = nodeid++; + } + + /^ *\(/ { + lat=$3; lon=$2 + printf " <node id=\"%s\" lat=\"%s\" lon=\"%s\"/>\n", nodeid, lat, lon + waynode[wayindex++] = nodeid++; + } + + END { + if (wayindex != 0) + emit_way(way_id++) + printf "</osm>\n" + } +' Property changes on: trunk/roadmap/src/basefiles/shp2osm.awk ___________________________________________________________________ Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pg...@us...> - 2014-06-07 20:25:57
|
Revision: 2763 http://sourceforge.net/p/roadmap/code/2763 Author: pgf Date: 2014-06-07 20:25:54 +0000 (Sat, 07 Jun 2014) Log Message: ----------- import border/boundary shapefiles from naturalearthdata.com Added Paths: ----------- trunk/roadmap/src/basefiles/ trunk/roadmap/src/basefiles/ne_110m_admin_0_boundary_lines_land/ trunk/roadmap/src/basefiles/ne_110m_admin_0_boundary_lines_land/ne_110m_admin_0_boundary_lines_land.README.html trunk/roadmap/src/basefiles/ne_110m_admin_0_boundary_lines_land/ne_110m_admin_0_boundary_lines_land.VERSION.txt trunk/roadmap/src/basefiles/ne_110m_admin_0_boundary_lines_land/ne_110m_admin_0_boundary_lines_land.dbf trunk/roadmap/src/basefiles/ne_110m_admin_0_boundary_lines_land/ne_110m_admin_0_boundary_lines_land.dump trunk/roadmap/src/basefiles/ne_110m_admin_0_boundary_lines_land/ne_110m_admin_0_boundary_lines_land.prj trunk/roadmap/src/basefiles/ne_110m_admin_0_boundary_lines_land/ne_110m_admin_0_boundary_lines_land.shp trunk/roadmap/src/basefiles/ne_110m_admin_0_boundary_lines_land/ne_110m_admin_0_boundary_lines_land.shx trunk/roadmap/src/basefiles/ne_110m_admin_1_states_provinces_lakes/ trunk/roadmap/src/basefiles/ne_110m_admin_1_states_provinces_lakes/ne_110m_admin_1_states_provinces_lakes.README.html trunk/roadmap/src/basefiles/ne_110m_admin_1_states_provinces_lakes/ne_110m_admin_1_states_provinces_lakes.VERSION.txt trunk/roadmap/src/basefiles/ne_110m_admin_1_states_provinces_lakes/ne_110m_admin_1_states_provinces_lakes.dbf trunk/roadmap/src/basefiles/ne_110m_admin_1_states_provinces_lakes/ne_110m_admin_1_states_provinces_lakes.prj trunk/roadmap/src/basefiles/ne_110m_admin_1_states_provinces_lakes/ne_110m_admin_1_states_provinces_lakes.shp trunk/roadmap/src/basefiles/ne_110m_admin_1_states_provinces_lakes/ne_110m_admin_1_states_provinces_lakes.shx trunk/roadmap/src/basefiles/ne_110m_coastline/ trunk/roadmap/src/basefiles/ne_110m_coastline/ne_110m_coastline.README.html trunk/roadmap/src/basefiles/ne_110m_coastline/ne_110m_coastline.VERSION.txt trunk/roadmap/src/basefiles/ne_110m_coastline/ne_110m_coastline.dbf trunk/roadmap/src/basefiles/ne_110m_coastline/ne_110m_coastline.prj trunk/roadmap/src/basefiles/ne_110m_coastline/ne_110m_coastline.shp trunk/roadmap/src/basefiles/ne_110m_coastline/ne_110m_coastline.shx Added: trunk/roadmap/src/basefiles/ne_110m_admin_0_boundary_lines_land/ne_110m_admin_0_boundary_lines_land.README.html =================================================================== --- trunk/roadmap/src/basefiles/ne_110m_admin_0_boundary_lines_land/ne_110m_admin_0_boundary_lines_land.README.html (rev 0) +++ trunk/roadmap/src/basefiles/ne_110m_admin_0_boundary_lines_land/ne_110m_admin_0_boundary_lines_land.README.html 2014-06-07 20:25:54 UTC (rev 2763) @@ -0,0 +1,293 @@ + + +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="en-US"> + +<head profile="http://gmpg.org/xfn/11"> +<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> + +<title>Admin 0 – Boundary Lines | Natural Earth</title> + +<link rel="shortcut icon" href="favicon.ico" type="image/x-icon"> +<link rel="alternate" type="application/rss+xml" title="Natural Earth RSS Feed" href="http://www.naturalearthdata.com/feed/" /> +<link rel="pingback" href="http://www.naturalearthdata.com/xmlrpc.php" /> +<script type="text/javascript" src="http://www.naturalearthdata.com/wp-content/themes/NEV/includes/js/suckerfish.js"></script> +<!--[if lt IE 7]> + <script src="http://ie7-js.googlecode.com/svn/version/2.0(beta3)/IE7.js" type="text/javascript"></script> + <script defer="defer" type="text/javascript" src="http://www.naturalearthdata.com/wp-content/themes/NEV/includes/js/pngfix.js"></script> +<![endif]--> +<link rel="stylesheet" href="http://www.naturalearthdata.com/wp-content/themes/NEV/style.css" type="text/css" media="screen" /> + +<meta name='Admin Management Xtended WordPress plugin' content='2.1.1' /> +<link rel="alternate" type="application/rss+xml" title="Natural Earth » Admin 0 – Boundary Lines Comments Feed" href="http://www.naturalearthdata.com/downloads/110m-cultural-vectors/110m-admin-0-boundary-lines/feed/" /> +<link rel='stylesheet' id='sociable-front-css-css' href='http://www.naturalearthdata.com/wp-content/plugins/sociable/sociable.css?ver=2.9.2' type='text/css' media='' /> +<link rel="EditURI" type="application/rsd+xml" title="RSD" href="http://www.naturalearthdata.com/xmlrpc.php?rsd" /> +<link rel="wlwmanifest" type="application/wlwmanifest+xml" href="http://www.naturalearthdata.com/wp-includes/wlwmanifest.xml" /> +<link rel='index' title='Natural Earth' href='http://www.naturalearthdata.com' /> +<link rel='start' title='Welcome to the Natural Earth Blog' href='http://www.naturalearthdata.com/blog/miscellaneous/test/' /> +<link rel='prev' title='Admin 1 – States, Provinces' href='http://www.naturalearthdata.com/downloads/110m-cultural-vectors/110m-admin-1-states-provinces/' /> +<link rel='next' title='Admin 0 – Details' href='http://www.naturalearthdata.com/downloads/110m-cultural-vectors/110m-admin-0-details/' /> +<meta name="generator" content="WordPress 2.9.2" /> + +<!-- All in One SEO Pack 1.6.10.2 by Michael Torbert of Semper Fi Web Design[309,462] --> +<meta name="description" content="Country boundaries on land and offshore. About Land boundaries and Pacific grouping boxes. Marine boundaries and marine indicator" /> +<link rel="canonical" href="http://www.naturalearthdata.com/downloads/110m-cultural-vectors/110m-admin-0-boundary-lines/" /> +<!-- /all in one seo pack --> + + <!-- begin gallery scripts --> + <link rel="stylesheet" href="http://www.naturalearthdata.com/wp-content/plugins/featured-content-gallery/css/jd.gallery.css.php" type="text/css" media="screen" charset="utf-8"/> + <link rel="stylesheet" href="http://www.naturalearthdata.com/wp-content/plugins/featured-content-gallery/css/jd.gallery.css" type="text/css" media="screen" charset="utf-8"/> + <script type="text/javascript" src="http://www.naturalearthdata.com/wp-content/plugins/featured-content-gallery/scripts/mootools.v1.11.js"></script> + <script type="text/javascript" src="http://www.naturalearthdata.com/wp-content/plugins/featured-content-gallery/scripts/jd.gallery.js.php"></script> + <script type="text/javascript" src="http://www.naturalearthdata.com/wp-content/plugins/featured-content-gallery/scripts/jd.gallery.transitions.js"></script> + <!-- end gallery scripts --> +<style type="text/css">.broken_link, a.broken_link { + text-decoration: line-through; +}</style><link href="http://www.naturalearthdata.com/wp-content/themes/NEV/css/default.css" rel="stylesheet" type="text/css" /> + <style type="text/css">.recentcomments a{display:inline !important;padding:0 !important;margin:0 !important;}</style> +<!--[if lte IE 7]> +<link rel="stylesheet" type="text/css" href="http://www.naturalearthdata.com/wp-content/themes/NEV/ie.css" /> +<![endif]--> +<script src="http://www.naturalearthdata.com/wp-content/themes/NEV/js/jquery-1.2.6.min.js" type="text/javascript" charset="utf-8"></script> +<script> + jQuery.noConflict(); +</script> +<script type="text/javascript" charset="utf-8"> + $(function(){ + var tabContainers = $('div#maintabdiv > div'); + tabContainers.hide().filter('#comments').show(); + + $('div#maintabdiv ul#tabnav a').click(function () { + tabContainers.hide(); + tabContainers.filter(this.hash).show(); + $('div#maintabdiv ul#tabnav a').removeClass('current'); + $(this).addClass('current'); + return false; + }).filter('#comments').click(); + + + }); +</script> + + <script type="text/javascript" language="javascript" src="http://www.naturalearthdata.com/dataTables/media/js/jquery.dataTables.js"></script> + <script type="text/javascript" charset="utf-8"> + $(document).ready(function() { + $('#ne_table').dataTable(); + } ); + </script> + +</head> +<body> +<div id="page"> +<div id="header"> + <div id="headerimg"> + <h1><a href="http://www.naturalearthdata.com/"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/nev_logo.png" alt="Natural Earth title="Natural Earth" /></a></h1> + <div class="description">Free vector and raster map data at 1:10m, 1:50m, and 1:110m scales</div> + <div class="header_search"><form method="get" id="searchform" action="http://www.naturalearthdata.com/"> +<label class="hidden" for="s">Search for:</label> +<div><input type="text" value="" name="s" id="s" /> +<input type="submit" id="searchsubmit" value="Search" /> +</div> +</form> +</div> +<!--<div class="translate_panel" style="align:top; margin-left:650px; top:50px;"> +<div id="google_translate_element" style="float:left;"></div> +<script> +function googleTranslateElementInit() { + new google.translate.TranslateElement({ + pageLanguage: 'en' + }, 'google_translate_element'); +} +</script> +<script src="http://translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script> +</div>--> + </div> + +</div> + +<div id="pagemenu" style="align:bottom;"> + <ul id="page-list" class="clearfix"><li class="page_item page-item-4"><a href="http://www.naturalearthdata.com" title="Home">Home</a></li> +<li class="page_item page-item-10"><a href="http://www.naturalearthdata.com/features/" title="Features">Features</a></li> +<li class="page_item page-item-12"><a href="http://www.naturalearthdata.com/downloads/" title="Downloads">Downloads</a></li> +<li class="page_item page-item-6 current_page_parent"><a href="http://www.naturalearthdata.com/blog/" title="Blog">Blog</a></li> +<li class="page_item page-item-14"><a href="http://www.naturalearthdata.com/forums" title="Forums">Forums</a></li> +<li class="page_item page-item-366"><a href="http://www.naturalearthdata.com/corrections" title="Corrections">Corrections</a></li> +<li class="page_item page-item-16"><a href="http://www.naturalearthdata.com/about/" title="About">About</a></li> +</ul> +</div> + +<hr /> <div id="main"> + <div id="content" class="narrowcolumn"> + + + « <a href="http://www.naturalearthdata.com/downloads/110m-cultural-vectors/">1:110m Cultural Vectors</a> + <div class="post" id="post-1547"> + <h2>Admin 0 – Boundary Lines</h2> + <div class="entry"> + <div class="downloadPromoBlock"> +<div style="float: left; width: 170px;"><img class="alignleft size-thumbnail wp-image-92" title="home_image_3" src="http://www.naturalearthdata.com/wp-content/uploads/2009/09/boundaries_thumb.png" alt="home_image_3" width="150" height="97" /></div> +<div style="float: left; width: 410px;"><em>Country boundaries on land and offshore.</em></p> +<div class="download-link-div"> + <a class="download-link" rel="nofollow" title="Downloaded 18014 times (Shapefile, geoDB, or TIFF format)" onclick="if (window.urchinTracker) urchinTracker ('http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/110m/cultural/ne_110m_admin_0_boundary_lines_land.zip');" href="http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/110m/cultural/ne_110m_admin_0_boundary_lines_land.zip" onclick="javascript:pageTracker._trackPageview('/downloads/http///download/110m/cultural/ne_110m_admin_0_boundary_lines_land.zip');">Download country boundaries</a> <span class="download-link-span">(43.6 KB) version 2.0.0</span> +</div> +<div class="download-link-div"> + <a class="download-link" rel="nofollow" title="Downloaded 551 times (Shapefile, geoDB, or TIFF format)" onclick="if (window.urchinTracker) urchinTracker ('http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/110m/cultural/ne_110m_admin_0_pacific_groupings.zip');" href="http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/110m/cultural/ne_110m_admin_0_pacific_groupings.zip" onclick="javascript:pageTracker._trackPageview('/downloads/http///download/110m/cultural/ne_110m_admin_0_pacific_groupings.zip');">Download Pacific grouping lines</a> <span class="download-link-span">(17.51 KB) version 2.0.0</span> +</div> +<p><span id="more-1547"></span></div> +</div> +<div> +<img class="alignnone size-full wp-image-1901" title="pacific_banner" src="http://www.naturalearthdata.com/wp-content/uploads/2009/09/pacific_banner.png" alt="pacific_banner" width="580" height="150" /></p> +<p><strong>About</strong></p> +<p>Land boundaries and Pacific grouping boxes. Marine boundaries and marine indicator lines are deliberately omitted for the 110m scale.</p> +<p><strong>Issues</strong></p> +<p>None known.</p> +<p><strong>Version History</strong></p> + <ul> + <li> + <a rel="nofollow" title="Download version 2.0.0 of ne_110m_admin_0_boundary_lines_land.zip" href="http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/110m/cultural/ne_110m_admin_0_boundary_lines_land.zip" onclick="javascript:pageTracker._trackPageview('/downloads/http///download/110m/cultural/ne_110m_admin_0_boundary_lines_land.zip');">2.0.0</a> + </li> + <li> + 1.4.0 + </li> + <li> + 1.1.0 + </li> + <li> + 1.0.0 + </li> + </ul> + +<p><a href="https://github.com/nvkelso/natural-earth-vector/blob/master/CHANGELOG" onclick="javascript:pageTracker._trackPageview('/outbound/article/https://github.com/nvkelso/natural-earth-vector/blob/master/CHANGELOG');">The master changelog is available on Github »</a> +</div> + +<div class="sociable"> +<div class="sociable_tagline"> +<strong>Share and Enjoy:</strong> +</div> +<ul> + <li class="sociablefirst"><a rel="nofollow" target="_blank" href="http://twitter.com/home?status=Admin%200%20-%20Boundary%20Lines%20-%20http%3A%2F%2Fwww.naturalearthdata.com%2Fdownloads%2F110m-cultural-vectors%2F110m-admin-0-boundary-lines%2F" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://twitter.com/home?status=Admin%200%20-%20Boundary%20Lines%20-%20http%3A%2F%2Fwww.naturalearthdata.com%2Fdownloads%2F110m-cultural-vectors%2F110m-admin-0-boundary-lines%2F');" title="Twitter"><img src="http://www.naturalearthdata.com/wp-content/plugins/sociable/images/services-sprite.gif" title="Twitter" alt="Twitter" style="width: 16px; height: 16px; background: transparent url(http://www.naturalearthdata.com/wp-content/plugins/sociable/images/services-sprite.png) no-repeat; background-position:-343px -55px" class="sociable-hovers" /></a></li> + <li><a rel="nofollow" target="_blank" href="http://www.facebook.com/share.php?u=http%3A%2F%2Fwww.naturalearthdata.com%2Fdownloads%2F110m-cultural-vectors%2F110m-admin-0-boundary-lines%2F&t=Admin%200%20-%20Boundary%20Lines" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.facebook.com/share.php?u=http%3A%2F%2Fwww.naturalearthdata.com%2Fdownloads%2F110m-cultural-vectors%2F110m-admin-0-boundary-lines%2F&t=Admin%200%20-%20Boundary%20Lines');" title="Facebook"><img src="http://www.naturalearthdata.com/wp-content/plugins/sociable/images/services-sprite.gif" title="Facebook" alt="Facebook" style="width: 16px; height: 16px; background: transparent url(http://www.naturalearthdata.com/wp-content/plugins/sociable/images/services-sprite.png) no-repeat; background-position:-343px -1px" class="sociable-hovers" /></a></li> + <li><a rel="nofollow" target="_blank" href="http://digg.com/submit?phase=2&url=http%3A%2F%2Fwww.naturalearthdata.com%2Fdownloads%2F110m-cultural-vectors%2F110m-admin-0-boundary-lines%2F&title=Admin%200%20-%20Boundary%20Lines&bodytext=%0D%0A%0D%0ACountry%20boundaries%20on%20land%20and%20offshore.%0D%0A%0D%0A%5Bdrain%20file%20182%20show%20nev_download%5D%0D%0A%0D%0A%5Bdrain%20file%20184%20show%20nev_download%5D%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0AAbout%0D%0A%0D%0ALand%20boundaries%20and%20Pacific%20grouping%20boxes.%20Marine%20boundaries%20and%20marine%20indicator%20lines%20are%20deliberately%20omi" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://digg.com/submit?phase=2&url=http%3A%2F%2Fwww.naturalearthdata.com%2Fdownloads%2F110m-cultural-vectors%2F110m-admin-0-boundary-lines%2F&title=Admin%200%20-%20Boundary%20Lines&bodytext=%0D%0A%0D%0ACountry%20boundaries%20on%20land%20and%20offshore.%0D%0A%0D%0A%5Bdrain%20file%20182%20show%20nev_download%5D%0D%0A%0D%0A%5Bdrain%20file%20184%20show%20nev_download%5D%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0AAbout%0D%0A%0D%0ALand%20boundaries%20and%20Pacific%20grouping%20boxes.%20Marine%20boundaries%20and%20marine%20indicator%20lines%20are%20deliberately%20omi');" title="Digg"><img src="http://www.naturalearthdata.com/wp-content/plugins/sociable/images/services-sprite.gif" title="Digg" alt="Digg" style="width: 16px; height: 16px; background: transparent url(http://www.naturalearthdata.com/wp-content/plugins/sociable/images/services-sprite.png) no-repeat; background-position:-235px -1px" class="sociable-hovers" /></a></li> + <li><a rel="nofollow" target="_blank" href="http://delicious.com/post?url=http%3A%2F%2Fwww.naturalearthdata.com%2Fdownloads%2F110m-cultural-vectors%2F110m-admin-0-boundary-lines%2F&title=Admin%200%20-%20Boundary%20Lines&notes=%0D%0A%0D%0ACountry%20boundaries%20on%20land%20and%20offshore.%0D%0A%0D%0A%5Bdrain%20file%20182%20show%20nev_download%5D%0D%0A%0D%0A%5Bdrain%20file%20184%20show%20nev_download%5D%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0AAbout%0D%0A%0D%0ALand%20boundaries%20and%20Pacific%20grouping%20boxes.%20Marine%20boundaries%20and%20marine%20indicator%20lines%20are%20deliberately%20omi" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://delicious.com/post?url=http%3A%2F%2Fwww.naturalearthdata.com%2Fdownloads%2F110m-cultural-vectors%2F110m-admin-0-boundary-lines%2F&title=Admin%200%20-%20Boundary%20Lines&notes=%0D%0A%0D%0ACountry%20boundaries%20on%20land%20and%20offshore.%0D%0A%0D%0A%5Bdrain%20file%20182%20show%20nev_download%5D%0D%0A%0D%0A%5Bdrain%20file%20184%20show%20nev_download%5D%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0AAbout%0D%0A%0D%0ALand%20boundaries%20and%20Pacific%20grouping%20boxes.%20Marine%20boundaries%20and%20marine%20indicator%20lines%20are%20deliberately%20omi');" title="del.icio.us"><img src="http://www.naturalearthdata.com/wp-content/plugins/sociable/images/services-sprite.gif" title="del.icio.us" alt="del.icio.us" style="width: 16px; height: 16px; background: transparent url(http://www.naturalearthdata.com/wp-content/plugins/sociable/images/services-sprite.png) no-repeat; background-position:-199px -1px" class="sociable-hovers" /></a></li> + <li><a rel="nofollow" target="_blank" href="http://www.google.com/bookmarks/mark?op=edit&bkmk=http%3A%2F%2Fwww.naturalearthdata.com%2Fdownloads%2F110m-cultural-vectors%2F110m-admin-0-boundary-lines%2F&title=Admin%200%20-%20Boundary%20Lines&annotation=%0D%0A%0D%0ACountry%20boundaries%20on%20land%20and%20offshore.%0D%0A%0D%0A%5Bdrain%20file%20182%20show%20nev_download%5D%0D%0A%0D%0A%5Bdrain%20file%20184%20show%20nev_download%5D%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0AAbout%0D%0A%0D%0ALand%20boundaries%20and%20Pacific%20grouping%20boxes.%20Marine%20boundaries%20and%20marine%20indicator%20lines%20are%20deliberately%20omi" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.google.com/bookmarks/mark?op=edit&bkmk=http%3A%2F%2Fwww.naturalearthdata.com%2Fdownloads%2F110m-cultural-vectors%2F110m-admin-0-boundary-lines%2F&title=Admin%200%20-%20Boundary%20Lines&annotation=%0D%0A%0D%0ACountry%20boundaries%20on%20land%20and%20offshore.%0D%0A%0D%0A%5Bdrain%20file%20182%20show%20nev_download%5D%0D%0A%0D%0A%5Bdrain%20file%20184%20show%20nev_download%5D%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0AAbout%0D%0A%0D%0ALand%20boundaries%20and%20Pacific%20grouping%20boxes.%20Marine%20boundaries%20and%20marine%20indicator%20lines%20are%20deliberately%20omi');" title="Google Bookmarks"><img src="http://www.naturalearthdata.com/wp-content/plugins/sociable/images/services-sprite.gif" title="Google Bookmarks" alt="Google Bookmarks" style="width: 16px; height: 16px; background: transparent url(http://www.naturalearthdata.com/wp-content/plugins/sociable/images/services-sprite.png) no-repeat; background-position:-91px -19px" class="sociable-hovers" /></a></li> + <li><a rel="nofollow" target="_blank" href="http://slashdot.org/bookmark.pl?title=Admin%200%20-%20Boundary%20Lines&url=http%3A%2F%2Fwww.naturalearthdata.com%2Fdownloads%2F110m-cultural-vectors%2F110m-admin-0-boundary-lines%2F" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://slashdot.org/bookmark.pl?title=Admin%200%20-%20Boundary%20Lines&url=http%3A%2F%2Fwww.naturalearthdata.com%2Fdownloads%2F110m-cultural-vectors%2F110m-admin-0-boundary-lines%2F');" title="Slashdot"><img src="http://www.naturalearthdata.com/wp-content/plugins/sociable/images/services-sprite.gif" title="Slashdot" alt="Slashdot" style="width: 16px; height: 16px; background: transparent url(http://www.naturalearthdata.com/wp-content/plugins/sociable/images/services-sprite.png) no-repeat; background-position:-145px -55px" class="sociable-hovers" /></a></li> + <li><a rel="nofollow" target="_blank" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.naturalearthdata.com%2Fdownloads%2F110m-cultural-vectors%2F110m-admin-0-boundary-lines%2F&title=Admin%200%20-%20Boundary%20Lines" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.naturalearthdata.com%2Fdownloads%2F110m-cultural-vectors%2F110m-admin-0-boundary-lines%2F&title=Admin%200%20-%20Boundary%20Lines');" title="StumbleUpon"><img src="http://www.naturalearthdata.com/wp-content/plugins/sociable/images/services-sprite.gif" title="StumbleUpon" alt="StumbleUpon" style="width: 16px; height: 16px; background: transparent url(http://www.naturalearthdata.com/wp-content/plugins/sociable/images/services-sprite.png) no-repeat; background-position:-217px -55px" class="sociable-hovers" /></a></li> + <li><a rel="nofollow" target="_blank" href="mailto:?subject=Admin%200%20-%20Boundary%20Lines&body=http%3A%2F%2Fwww.naturalearthdata.com%2Fdownloads%2F110m-cultural-vectors%2F110m-admin-0-boundary-lines%2F" title="email"><img src="http://www.naturalearthdata.com/wp-content/plugins/sociable/images/services-sprite.gif" title="email" alt="email" style="width: 16px; height: 16px; background: transparent url(http://www.naturalearthdata.com/wp-content/plugins/sociable/images/services-sprite.png) no-repeat; background-position:-325px -1px" class="sociable-hovers" /></a></li> + <li><a rel="nofollow" target="_blank" href="http://www.linkedin.com/shareArticle?mini=true&url=http%3A%2F%2Fwww.naturalearthdata.com%2Fdownloads%2F110m-cultural-vectors%2F110m-admin-0-boundary-lines%2F&title=Admin%200%20-%20Boundary%20Lines&source=Natural+Earth+Free+vector+and+raster+map+data+at+1%3A10m%2C+1%3A50m%2C+and+1%3A110m+scales&summary=%0D%0A%0D%0ACountry%20boundaries%20on%20land%20and%20offshore.%0D%0A%0D%0A%5Bdrain%20file%20182%20show%20nev_download%5D%0D%0A%0D%0A%5Bdrain%20file%20184%20show%20nev_download%5D%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0AAbout%0D%0A%0D%0ALand%20boundaries%20and%20Pacific%20grouping%20boxes.%20Marine%20boundaries%20and%20marine%20indicator%20lines%20are%20deliberately%20omi" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.linkedin.com/shareArticle?mini=true&url=http%3A%2F%2Fwww.naturalearthdata.com%2Fdownloads%2F110m-cultural-vectors%2F110m-admin-0-boundary-lines%2F&title=Admin%200%20-%20Boundary%20Lines&source=Natural+Earth+Free+vector+and+raster+map+data+at+1%3A10m%2C+1%3A50m%2C+and+1%3A110m+scales&summary=%0D%0A%0D%0ACountry%20boundaries%20on%20land%20and%20offshore.%0D%0A%0D%0A%5Bdrain%20file%20182%20show%20nev_download%5D%0D%0A%0D%0A%5Bdrain%20file%20184%20show%20nev_download%5D%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0AAbout%0D%0A%0D%0ALand%20boundaries%20and%20Pacific%20grouping%20boxes.%20Marine%20boundaries%20and%20marine%20indicator%20lines%20are%20deliberately%20omi');" title="LinkedIn"><img src="http://www.naturalearthdata.com/wp-content/plugins/sociable/images/services-sprite.gif" title="LinkedIn" alt="LinkedIn" style="width: 16px; height: 16px; background: transparent url(http://www.naturalearthdata.com/wp-content/plugins/sociable/images/services-sprite.png) no-repeat; background-position:-1px -37px" class="sociable-hovers" /></a></li> + <li class="sociablelast"><a rel="nofollow" target="_blank" href="http://reddit.com/submit?url=http%3A%2F%2Fwww.naturalearthdata.com%2Fdownloads%2F110m-cultural-vectors%2F110m-admin-0-boundary-lines%2F&title=Admin%200%20-%20Boundary%20Lines" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://reddit.com/submit?url=http%3A%2F%2Fwww.naturalearthdata.com%2Fdownloads%2F110m-cultural-vectors%2F110m-admin-0-boundary-lines%2F&title=Admin%200%20-%20Boundary%20Lines');" title="Reddit"><img src="http://www.naturalearthdata.com/wp-content/plugins/sociable/images/services-sprite.gif" title="Reddit" alt="Reddit" style="width: 16px; height: 16px; background: transparent url(http://www.naturalearthdata.com/wp-content/plugins/sociable/images/services-sprite.png) no-repeat; background-position:-55px -55px" class="sociable-hovers" /></a></li> +</ul> +</div> + + + </div> + + </div> + + + </div> + + + <div id="sidebar"> + <ul><li id='text-5' class='widget widget_text'><h2 class="widgettitle">Stay up to Date</h2> + <div class="textwidget"> Know when a new version of Natural Earth is released by subscribing to our <a href="http://www.naturalearthdata.com/updates/" class="up-to-date-link" >announcement list</a>.</div> + </li></ul><ul><li id='text-2' class='widget widget_text'><h2 class="widgettitle">Find a Problem?</h2> + <div class="textwidget"><div> +<div style="float:left; width:65px;"><a href="/corrections/index.php?a=add"><img class="alignleft" title="New Ticket" src="http://www.naturalearthdata.com/corrections/img/newticket.png" alt="" width="60" height="60" /></a></div><div class="textwidget" style="float:left;width:120px; font-size:1.2em; font-size-adjust:none; font-style:normal; +font-variant:normal; font-weight:normal; line-height:normal;">Submit suggestions and bug reports via our <a href="/corrections/index.php?a=add">correction system</a> and track the progress of your edits.</div> +</div></div> + </li></ul><ul><li id='text-3' class='widget widget_text'><h2 class="widgettitle">Join Our Community</h2> + <div class="textwidget"><div> +<div style="float:left; width:65px;"><a href="/forums/"><img src="http://www.naturalearthdata.com/wp-content/uploads/2009/08/green_globe_chat_bubble_562e.png" alt="forums" title="Chat in the forum!" width="50" height="50" /></a></div><div class="textwidget" style="float:left;width:120px; font-size:1.2em; font-size-adjust:none; font-style:normal; +font-variant:normal; font-weight:normal; line-height:normal;">Talk back and discuss Natural Earth in the <a href="/forums/">Forums</a>.</div> +</div></div> + </li></ul><ul><li id='text-4' class='widget widget_text'><h2 class="widgettitle">Thank You</h2> + <div class="textwidget">Our data downloads are generously hosted by Florida State University.</div> + </li></ul> </div> + +</div> + +<hr /> +<div id="footer"> +<div id="footerarea"> + <div id="footerlogos"> + <p>Supported by:</p> + <div class="footer-ad-box"> + <a href="http://www.nacis.org" target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/nacis.png" alt="NACIS" /></a> + </div> + <div class="footer-ad-box"> + <a href="http://www.cartotalk.com" target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/cartotalk_ad.png" alt="Cartotalk" /></a> + </div> + <div class="footer-ad-box"> + <a href="http://www.mapgiving.org" target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/mapgiving.png" alt="Mapgiving" /></a> + </div> + <div class="footer-ad-box"> + <a href="http://www.geography.wisc.edu/cartography/" target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/wisconsin.png" alt="University of Wisconsin Madison - Cartography Dept." /></a> + </div> + <div class="footer-ad-box"> + <a href="http://www.shadedrelief.com" target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/shaded_relief.png" alt="Shaded Relief" /></a> + </div> + <div class="footer-ad-box"> + <a href="http://www.xnrproductions.com " target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/xnr.png" alt="XNR Productions" /></a> + </div> + + <p style="clear:both;"></p> + + <div class="footer-ad-box"> + <a href="http://www.freac.fsu.edu" target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/fsu.png" alt="Florida State University - FREAC" /></a> + </div> + <div class="footer-ad-box"> + <a href="http://www.springercartographics.com" target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/scllc.png" alt="Springer Cartographics LLC" /></a> + </div> + <div class="footer-ad-box"> + <a href="http://www.washingtonpost.com" target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/wpost.png" alt="Washington Post" /></a> + </div> + <div class="footer-ad-box"> + <a href="http://www.redgeographics.com" target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/redgeo.png" alt="Red Geographics" /></a> + </div> + <div class="footer-ad-box"> + <a href="http://kelsocartography.com/blog " target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/kelso.png" alt="Kelso Cartography" /></a> + </div> + + <p style="clear:both;"></p> + <div class="footer-ad-box"> + <a href="http://www.avenza.com" target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/avenza.png" alt="Avenza Systems Inc." /></a> + </div> + <div class="footer-ad-box"> + <a href="http://www.stamen.com" target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/stamen_ne_logo.png" alt="Stamen Design" /></a> + </div> + + + </div> + <p style="clear:both;"></p> + <span id="footerleft"> + © 2012. Natural Earth. All rights reserved. + </span> + <span id="footerright"> + <!-- Please help promote WordPress and simpleX. Do not remove --> + <div>Powered by <a href="http://wordpress.org/">WordPress</a></div> + <div><a href="http://www.naturalearthdata.com/wp-admin">Staff Login »</a></div> + </span> +</div> +</div> + +<!-- Google Analytics for WordPress | http://yoast.com/wordpress/google-analytics/ --> +<script type="text/javascript"> + var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www."); + document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E")); +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-10168306-1"); + } catch(err) {} +</script> +<script src="http://www.naturalearthdata.com/wp-content/plugins/google-analytics-for-wordpress/custom_se.js" type="text/javascript"></script> +<script type="text/javascript"> + try { + // Cookied already: + pageTracker._trackPageview(); + } catch(err) {} +</script> +<!-- End of Google Analytics code --> + +</body> +</html> \ No newline at end of file Added: trunk/roadmap/src/basefiles/ne_110m_admin_0_boundary_lines_land/ne_110m_admin_0_boundary_lines_land.VERSION.txt =================================================================== --- trunk/roadmap/src/basefiles/ne_110m_admin_0_boundary_lines_land/ne_110m_admin_0_boundary_lines_land.VERSION.txt (rev 0) +++ trunk/roadmap/src/basefiles/ne_110m_admin_0_boundary_lines_land/ne_110m_admin_0_boundary_lines_land.VERSION.txt 2014-06-07 20:25:54 UTC (rev 2763) @@ -0,0 +1 @@ +2.0.0 \ No newline at end of file Added: trunk/roadmap/src/basefiles/ne_110m_admin_0_boundary_lines_land/ne_110m_admin_0_boundary_lines_land.dbf =================================================================== --- trunk/roadmap/src/basefiles/ne_110m_admin_0_boundary_lines_land/ne_110m_admin_0_boundary_lines_land.dbf (rev 0) +++ trunk/roadmap/src/basefiles/ne_110m_admin_0_boundary_lines_land/ne_110m_admin_0_boundary_lines_land.dbf 2014-06-07 20:25:54 UTC (rev 2763) @@ -0,0 +1,3 @@ +_\xB9+ 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1Line of control (please verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1Indefinite (please verify) 1Line of control (please verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1Indefinite (please verify) 1International boundary (verify) 1International boundary (verify) 1Disputed (please verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1Disputed (please verify) 1International boundary (verify) 1Disputed (please verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1Disputed (please verify) 1Line of control (please verify) 1International boundary (verify) 1International boundary (verify) 1International boundary (verify) 1Disputed (please verify) 1Disputed (please verify) 1Disputed (please verify) 1International boundary (verify) 1Disputed (please verify) 1International boundary (verify) 1Disputed (please verify) 1International boundary (verify) 1International boundary (verify) 1Disputed (please verify) 1Disputed (please verify) 1International boundary (verify) 1International boundary (verify) 1Disputed (please verify) 1Disputed (please verify) 1International boundary (verify) 1International boundary (verify) ... [truncated message content] |
From: <pg...@us...> - 2014-06-07 20:25:49
|
Revision: 2762 http://sourceforge.net/p/roadmap/code/2762 Author: pgf Date: 2014-06-07 20:25:46 +0000 (Sat, 07 Jun 2014) Log Message: ----------- remove the php subdirectory, and the osmgetbmap utilities good riddance. no longer needed. Modified Paths: -------------- trunk/roadmap/src/Makefile Removed Paths: ------------- trunk/roadmap/src/php/Makefile trunk/roadmap/src/php/osmgetbmap trunk/roadmap/src/php/osmgetbmap.php trunk/roadmap/src/php/osmgetbmapcore.php Modified: trunk/roadmap/src/Makefile =================================================================== --- trunk/roadmap/src/Makefile 2014-06-07 20:25:42 UTC (rev 2761) +++ trunk/roadmap/src/Makefile 2014-06-07 20:25:46 UTC (rev 2762) @@ -369,7 +369,7 @@ ALL_SRC = $(MKFILES) $(C_SRC) $(HEADERS) \ $(PKGDATAFILES) $(MISCFILES) $(MANPAGES) $(SCRIPTS) $(FONT) $(MANUAL) -ALL_SUBDIRS = unix gpx gtk gtk2 qt qt4 icons ipkg agg_support php win32 +ALL_SUBDIRS = unix gpx gtk gtk2 qt qt4 icons ipkg agg_support win32 # --- Additions for Trip plugin ------------------------------- @@ -592,9 +592,6 @@ mkdir -p $(pkgbindir) cd $(pkgbindir) && rm -f $(BUILD) $(SCRIPTS) cp $(BUILD) $(SCRIPTS) $(DRIVERS) $(pkgbindir)/. - cp php/osmgetbmap php/osmgetbmapcore.php $(pkgbindir)/. - cd $(pkgbindir) && \ - chmod a+x $(BUILD) $(SCRIPTS) $(DRIVERS) osmgetbmap installdesktop: -test -d $(menudir) && cp roadmap.menu $(menudir)/roadmap Deleted: trunk/roadmap/src/php/Makefile =================================================================== --- trunk/roadmap/src/php/Makefile 2014-06-07 20:25:42 UTC (rev 2761) +++ trunk/roadmap/src/php/Makefile 2014-06-07 20:25:46 UTC (rev 2762) @@ -1,19 +0,0 @@ - -# stub makefile -- sole purpose is to assist building tarball distributions - -# The home for the PHP sources for the osmgetbmap scripts is here: -# https://svn.symbianos.org/osmtocsv/trunk -# and perhaps here: -# https://svn.symbianos.org/osmtocsv/branches/pgf -# -# The copy in CVS for the RoadMap project may or may not be slightly -# different. - -SOURCE = \ - osmgetbmap osmgetbmap.php osmgetbmapcore.php - -sourcelist: - @echo Makefile $(SOURCE) - - -depends: Deleted: trunk/roadmap/src/php/osmgetbmap =================================================================== --- trunk/roadmap/src/php/osmgetbmap 2014-06-07 20:25:42 UTC (rev 2761) +++ trunk/roadmap/src/php/osmgetbmap 2014-06-07 20:25:46 UTC (rev 2762) @@ -1,100 +0,0 @@ -#!/usr/bin/php -<?php - -// This script provides a command-line interface to the "binary mobile" -// protocol implemented in osmgetbmapcore.php. -// -// Released into the public domain by Adam Boardman and Paul Fox -// - -function usage() { - global $argv; - echo "usage: $argv[0] -t tileid [ -b bits ] [ -h have ] [ -c cachedir ]\n"; - exit(1); -} - -// configure the server -- should perhaps be cmdline arg -$server = "www.openstreetmap.org"; -$path = "/api/0.6/map"; - -$server = "api.openstreetmap.fr"; -$path = "/api/0.6/map"; - -//$server = "osmxapi.informationfreeway.org"; -//$server = "openstreetmap.gryph.de"; -// $server = "jxapi.openstreetmap.org"; - -$server = "www.overpass-api.de"; -$path = "/api/xapi?map"; - -#$server = "overpass.osm.rambler.ru"; -#$path = "/cgi/xapi?map"; - -// api/xapi?*[key=value][bbox=-180,-90,180,90] - -function doLog($text) { - fwrite(STDERR, $text . "\n"); -} - -function mkpath($path,$mode = 0755) { - if (@mkdir($path) or file_exists($path)) return true; - return (mkpath(dirname($path),$mode) and mkdir($path,$mode)); -} - -// adjust the search path for our inclusions to include the directory -// containing "ourself" -ini_set('include_path', - preg_replace('/\\/[^\\/]+$/',"",$_SERVER['PHP_SELF']) . - ini_get('include_path')); - -require_once( "osmgetbmapcore.php" ); - - -$WayUsedKeys = array( - "highway", - "cycleway", - "waterway", - "boundary", - "railway", - "natural", - "amenity", - "place", - "leisure", - "historic", - "name", - "ref", - "oneway" - ); - -// defaults -$bits = 25; -$have = 0; -$tileid = False; - -global $nocache, $CacheDir; -$nocache = false; -$CacheDir = getenv('HOME')."/".".osm_bmap_cache"; - -$options = getopt("b:t:h:c:", array('bits:', 'trutile:', 'have:', 'cache:')); -foreach (array_keys($options) as $opt) { - switch ($opt) { - case 'b': $bits = $options['b']; break; - case 'bits': $bits = $options['bits']; break; - case 't': $tileid = $options['t']; break; - case 'trutile': $tileid = $options['trutile']; break; - case 'h': $have = $options['h']; break; - case 'have': $have = $options['have']; break; - case 'c': $CacheDir = $options['c']; break; - case 'cache': $CacheDir = $options['cache']; break; - } -} - -if (!$tileid ) { - usage(); -} - -doLog("osm_bmap_cmd: tileid $tileid, bits $bits, have neighbors $have"); - -fetchTile($tileid, $bits, $have, $server, $path); - -?> Deleted: trunk/roadmap/src/php/osmgetbmap.php =================================================================== --- trunk/roadmap/src/php/osmgetbmap.php 2014-06-07 20:25:42 UTC (rev 2761) +++ trunk/roadmap/src/php/osmgetbmap.php 2014-06-07 20:25:46 UTC (rev 2762) @@ -1,113 +0,0 @@ -<?php - -// This is the CGI interface for the Mobile Binary proxy server. -// -// Released into the public domain by Adam Boardman and Paul Fox -// - -// configure the server -$server = "www.openstreetmap.org"; -$server = "osmxapi.informationfreeway.org"; -//$server = "openstreetmap.gryph.de"; -$path = "/api/0.5/map"; - -require_once( "osmgetbmapcore.php" ); -if file_exists("common/static-inc.php") { - require_once( "common/static-inc.php" ); -} -if file_exists("common/symbianmachineid.php") { - require_once( "common/symbianmachineid.php" ); -} - -global $nocache, $CacheDir; -$nocache = $_REQUEST["no-cache"]; -$CacheDir = "cache"; // cache is in current directory - -global $KDeviceUidLookup; -$machine = $KDeviceUidLookup[$_REQUEST["m"]]; -if (!$machine) { - $machine = $_REQUEST["m"]; -} - -function doLog($text) { - global $errorlogfilepointer; - if (!$errorlogfilepointer) { - global $config; - $errorlogfile = "log.txt"; - $errorlogfilepointer = fopen($errorlogfile, "a+"); - } - - $logentry = date("jS M Y (H:i:s)")." : ".getenv("REMOTE_ADDR"). - " (".$text.")\r\n"; - fwrite($errorlogfilepointer, $logentry); - - if (is_array($text)) { - foreach ($text as $key => $value) { - fwrite($errorlogfilepointer, "$key => $value\r\n"); - } - } -} - -global $KUserAgentToUsedKeys; -$KUserAgentToUsedKeys["WhereAmI/0.05"] = array( - "highway", - "railway", - "natural", - "amenity", - "place", - "leisure", - "historic", - "name", - "ref", - "oneway" - ); -$KUserAgentToUsedKeys["Mozilla"] = array( - "highway", - "cycleway", - "waterway", - "boundary", - "railway", - "natural", - "amenity", - "place", - "leisure", - "historic", - "name", - "ref", - "oneway" - ); -global $WayUsedKeys; -foreach ($KUserAgentToUsedKeys as $key => $value) { - if (strpos($key, $_SERVER['HTTP_USER_AGENT']) !== False) { - $WayUsedKeys = $value; - } -} -if (!$WayUsedKeys) { - $WayUsedKeys = $KUserAgentToUsedKeys["Mozilla"]; -} - - -function needAuth() { - header('WWW-Authenticate: Basic realm="OSMtoCSV Auth"'); - header('HTTP/1.0 401 Unauthorized'); - echo 'Please enter your openstreetmap login details'; - exit; -} - - -$tileid = $_REQUEST["tile"]; -$bits = $_REQUEST["ts"]; -$have = $_REQUEST["have"]; - -if ($bits < 19 || $bits > 31) $bits = 31; - -doLog("Tile: ".$tileid." Bits: ".$bits." - ".$_SERVER['HTTP_USER_AGENT']. - " ".$_SERVER['PHP_AUTH_USER']." - ".$machine); - -if (strstr($HTTP_SERVER_VARS['HTTP_ACCEPT_ENCODING'], 'gzip')) { - ob_start("compress_output"); -} - -fetchTile($tileid, $bits, $have, $server, $path); - -?> Deleted: trunk/roadmap/src/php/osmgetbmapcore.php =================================================================== --- trunk/roadmap/src/php/osmgetbmapcore.php 2014-06-07 20:25:42 UTC (rev 2761) +++ trunk/roadmap/src/php/osmgetbmapcore.php 2014-06-07 20:25:46 UTC (rev 2762) @@ -1,1307 +0,0 @@ -<?php /** - -bmap.php - OSM to Binary - Open Street Map to Binary Protocol converter - -Released into the public domain by Adam Boardman and Paul Fox. - -See - http://wiki.openstreetmap.org/index.php/OSM_Mobile_Binary_Protocol -for more information. - -This script takes requests for OSM map information for a bounding box, -makes the request to the Open Street Map API v0.6 and reforms the reply -from XML to a simplified binary format. - -eg: bmap.php?tile=tileid&ts=31&have=neighboursdownloaded - -the "tileid" is a 32bit integer representing the tile to download, "ts" -indicates how many bits of the tileid are in use (this php implementation -only supports 19-31bits giving tile sizes of 0.175781x0.175781 to -0.005493x0.005493). - -neighboursdownloaded = 8bits representing tiles already downloaded {nw,n,ne, -w,e,sw,s,se} eg: have downloaded ne,e,se => 00101001 = 0x29 = 41 - -only interesting nodes are given, and their properties are -encoded to one 8bit enum. - -binid/lat/lon/time etc is 32bit integers where from lat/lon * 1000000 - -Binary is all little endian - -To use this script you must give your web server write access to a directory -'cache' and a file log.txt - -Output format: -Node - length n id lon lat nodepropenumval {propkeyid (enumval | valsignedint | packedtime | strlen str)} -Way - length w id numberlonlat lon lat {londiff latdiff} {propkeyid (enumval | valsignedint | packedtime | strlen str)} -BlnBnBidBBloBBlaB -BlnBnBidBBloBBlaBBp -BlnBn... -BlnBwBidBBnuBBloBBatBBoBaBoBa -BlnBwBidBBnuBBloBBatBBoBa... -BlnBw... - -improvement: -tile - 1031529850 -osm xml: 4830 -bmap.php: 1621 -64% -*/ - - - -if (!function_exists("timingStart")) { - function timingStart() { - global $timingstarted; - $starttime = microtime(); - $stime = explode(' ', $starttime); - $timingstarted = $stime[0] + $stime[1]; - } - - function timingEnd() { - global $timingstarted; - $endtime = microtime(); - $etime = explode(' ', $endtime); - $timingended = $etime[0] + $etime[1]; - return number_format($timingended - $timingstarted, 4); - } -} - -if (!function_exists("mkpath")) { - function mkpath($path) - { - if (@mkdir($path) or file_exists($path)) return true; - return (mkpath(dirname($path)) and mkdir($path)); - } -} - -// args passed to reportError -global $KDownloadErrors; -global $EDownloadErrorTooBig; -global $EDownloadErrorConnect; -global $EDownloadErrorPerms; -global $EDownloadErrorXMLError; -global $EDownloadErrorNoData; - -$EDownloadErrorTooBig = 5; -$EDownloadErrorConnect = 6; -$EDownloadErrorPerms = 7; -$EDownloadErrorXMLError = 8; -$EDownloadErrorNoData = 9; -$EDownloadErrorNoData = 9; -$EDownloadErrorServerProblem = 10; -$EDownloadErrorLzmaProblem = 11; - -// suppress php default error reporting -error_reporting(0); - -//allocate values from here: -// http://wiki.openstreetmap.org/index.php/OSM_Mobile_Binary_Protocol/Types -$KDownloadErrors = Array( - 5=>"The tile is too big, or contains too much data", - 6=>"Couldn't connect to API server", // actual message supplied in-line - 7=>"Couldn't lock data file -- check file/directory permissions", - 8=>"XML Error", // actuall message supplied in-line - 9=>"No Data", -); - -global $KMaxLon,$KMaxLat,$KMaxBits,$KLLMultiplier; -$KMaxLon = 180000000; -$KMaxLat = 90000000; -$KLLMultiplier = 1000000; -global $KNodePropertyIndex; -$KNodePropertyIndex = array ( - "continent"=>1, - "country"=>2, - "state"=>3, - "region"=>4, - "county"=>5, - "city"=>6, - "town"=>7, - "village"=>8, - "hamlet"=>9, - "suburb"=>10, - "island"=>11, - "pub"=>14, - "biergarten"=>15, - "cafe"=>16, - "restaurant"=>17, - "fast_food"=>18, - "parking"=>19, - "bicycle_parking"=>20, - "fuel"=>21, - "telephone"=>22, - "toilets"=>23, - "recycling"=>24, - "public_building"=>25, - "place_of_worship"=>26, - "grave_yard"=>27, - "post_office"=>28, - "post_box"=>29, - "school"=>30, - "university"=>31, - "collage"=>32, - "pharmacy"=>33, - "hospital"=>34, - "library"=>35, - "police"=>36, - "fire_station"=>37, - "bus_station"=>38, - "theatre"=>39, - "cinema"=>40, - "arts_centre"=>41, - "courthouse"=>42, - "prison"=>43, - "bank"=>44, - "atm"=>45, - "townhall"=>46, - "park_ride"=>47, - "doctors"=>48, - "clinic"=>49, - "first_aid"=>50, - "bureau_de_change"=>51, - "border_control"=>52, - "music_venue"=>53, - "local_government"=>54, - "embassy"=>55, - "carsharing"=>56, - "car_rental"=>57, - "potable_water"=>58, - "dumpstation"=>59, - "cultural_centre"=>60, - "indoor_shopping_centre"=>61, - "crematorium"=>62, - "fire_hydrant"=>63, - "bicycle_rental"=>64, - "science_park"=>65, - "gallery"=>66, - "stop"=>72, - "traffic_signals"=>73, - "highway:crossing"=>74, - "gate"=>75, - "stile"=>76, - "cattle_grid"=>77, - "toll_booth"=>78, - "incline"=>79, - "incline_steep"=>80, - "highway:viaduct"=>81, - "motorway_junction"=>82, - "services"=>83, - "ford"=>84, - "mini_roundabout"=>78, - "bus_sluice"=>79, - "railway:station"=>89, - "halt"=>90, - "railway:viaduct"=>91, - "railway:crossing"=>92, - "level_Crossing"=>93, - "subway:station"=>94, - "station_entrance"=>95, - "lock_gate"=>98, - "turning_point"=>99, - "aqueduct"=>100, - "boatyard"=>101, - "water_point"=>102, - "waste_disposal"=>103, - "mooring"=>104, - "weir"=>105, - "waterfall"=>106, - "sports_centre"=>109, - "golf_course"=>110, - "stadium"=>111, - "marina"=>112, - "track"=>113, - "pitch"=>114, - "water_park"=>115, - "slipway"=>116, - "fishing"=>117, - "nature_reserve"=>118, - "park"=>119, - "playground"=>120, - "garden"=>121, - "common"=>122, - "information"=>125, - "tourism:camp_site"=>126, - "caravan_site"=>127, - "picnic_site"=>128, - "viewpoint"=>129, - "theme_park"=>130, - "hotel"=>131, - "motel"=>132, - "guest_house"=>134, - "hostel"=>135, - "attraction"=>136, - "zoo"=>137, - "chalet"=>138, - "rest_camp"=>138, - "castle"=>141, - "monument"=>142, - "museum"=>143, - "archaeological_site"=>144, - "icon"=>145, - "ruins"=>146, - "wreck"=>147, - "10Pin"=>150, - "athletics"=>151, - "baseball"=>152, - "basketball"=>153, - "bowls"=>154, - "climbing"=>155, - "cricket"=>156, - "cricket_nets"=>157, - "croquet"=>158, - "cycling"=>159, - "dog_racing"=>160, - "equestrian"=>161, - "football"=>162, - "golf"=>163, - "gymnastics"=>164, - "hockey"=>165, - "motor"=>166, - "multi"=>167, - "pelota"=>168, - "racquet"=>169, - "rugby"=>170, - "skating"=>171, - "skateboard"=>172, - "soccer"=>173, - "swimming"=>174, - "skiing"=>175, - "table_tennis"=>176, - "tennis"=>177, - "diving"=>178, - "aerodrome"=>182, - "terminal"=>183, - "helipad"=>184, - "power:tower"=>186, - "works"=>188, - "beacon"=>189, - "survey_point"=>190, - "power_wind"=>191, - "power_hydro"=>192, - "power_fossil"=>193, - "power_nuclear"=>194, - "manmade:tower"=>195, - "water_tower"=>196, - "gasometer"=>197, - "reservoir_covered"=>198, - "lighthouse"=>199, - "windmill"=>200, - "surveillance"=>201, - "communications_tower"=>202, - "baker"=>204, - "butcher"=>205, - "chandler"=>206, - "supermarket"=>207, - "outdoor_store"=>208, - "doityourself"=>209, - "convenience"=>210, - "bicycle"=>211, - "farm"=>215, - "quarry"=>216, - "landfill"=>217, - "basin"=>218, - "reservior"=>219, - "forest"=>220, - "allotments"=>221, - "residential"=>222, - "retail"=>223, - "commercial"=>224, - "industrial"=>225, - "brownfield"=>226, - "greenfield"=>227, - "cemetery"=>228, - "village_green"=>229, - "recreation_ground"=>230, - "landuse:camp_site"=>231, - "airfield"=>233, - "bunker"=>234, - "barracks"=>235, - "danger_area"=>236, - "range"=>237, - "spring"=>238, - "peak"=>239, - "cliff"=>240, - "scree"=>241, - "scrub"=>242, - "fell"=>243, - "heath"=>244, - "wood"=>245, - "marsh"=>246, - "water"=>247, - "mud"=>248, - "beach"=>249, - "bay"=>250, - "tree"=>251, - "life"=>252, - "cave"=>253, - "glacier"=>254 - ); -global $KNodePropertiesKept; -$KNodePropertiesKept = array ("name","name:*","ref"); -global $KWayPropertiesKeyTable; -global $KWayPropEnumMin,$KWayPropEnumMax,$KWayPropNumericalMin,$KWayPropNumericalMax,$KWayPropDateMin,$KWayPropDateMax,$KWayPropTextMin,$KWayPropTextMax; -$KWayPropEnumMin = 1; -$KWayPropEnumMax = 127; -$KWayPropNumericalMin = 128; -$KWayPropNumericalMax = 175; -$KWayPropDateMin = 176; -$KWayPropDateMax = 191; -$KWayPropTextMin = 192; -$KWayPropTextMax = 255; -$KWayPropertiesKeyTable = array ( - //enum based - "highway"=>1, - "cycleway"=>2, - "tracktype"=>3, - "waterway"=>4, - "railway"=>5, - "aeroway"=>6, - "aerialway"=>7, - "power"=>8, - "man_made"=>9, - "leisure"=>10, - "amenity"=>11, - "shop"=>12, - "tourism"=>13, - "historic"=>14, - "landuse"=>15, - "military"=>16, - "natural"=>17, - "route"=>18, - "boundary"=>19, - "sport"=>20, - "abutters"=>21, - "fenced"=>22, - "lit"=>23, - "area"=>24, - "bridge"=>25, - "cutting"=>26, - "embankment"=>27, - "surface"=>30, - "access"=>31, - "bicycle"=>32, - "foot"=>33, - "goods"=>34, - "hgv"=>35, - "horse"=>36, - "motorcycle"=>37, - "motorcar"=>38, - "psv"=>39, - "motorboat"=>40, - "boat"=>41, - "oneway"=>42, - "noexit"=>43, - "toll"=>44, - "place"=>45, - "lock"=>46, - "attraction"=>47, - "wheelchair"=>48, - "junction"=>49, - //numerical - "lanes"=>128, - "layer"=>129, - "ele"=>130, - "width"=>131, - "est_width"=>132, - "maxwidth"=>133, - "maxlength"=>134, - "maxspeed"=>135, - "minspeed"=>136, - "day_on"=>137, - "day_off"=>138, - "hour_on"=>139, - "hour_off"=>140, - "maxweight"=>141, - "maxheight"=>142, - //date based - "date_on"=>176, - "date_off"=>177, - "start_date"=>178, - "end_date"=>179, - //text based - "name"=>192, - "name_left"=>193, - "name_right"=>194, - "name:*"=>195, - "int_name"=>196, - "nat_name"=>197, - "reg_name"=>198, - "loc_name"=>199, - "old_name"=>200, - "ref"=>201, - "int_ref"=>202, - "nat_ref"=>203, - "reg_ref"=>204, - "loc_ref"=>205, - "old_ref"=>206, - "ncn_ref"=>207, - "rcn_ref"=>209, - "lcn_ref"=>210, - "icao"=>211, - "iata"=>212, - "place_name"=>213, - "place_numbers"=>214, - "postal_code"=>215, - "is_in"=>216, - "note"=>217, - "description"=>218, - "image"=>219, - "source"=>220, - "source_ref"=>221, - "created_by"=>222 -); -global $KTagsEnums; -$KTagsEnums["highway"] = Array( - "motorway"=>1, - "motorway_link"=>2, - "trunk"=>3, - "trunk_link"=>4, - "primary"=>5, - "primary_link"=>6, - "secondary"=>7, - "tertiary"=>8, - "unclassified"=>9, - "minor"=>10, - "residential"=>11, - "service"=>12, - "track"=>13, - "cycleway"=>14, - "bridleway"=>15, - "footway"=>16, - "steps"=>17, - "pedestrian"=>17 - ); -$KTagsEnums["cycleway"] = Array( - "lane"=>1, - "track"=>2, - "opposite_lane"=>3, - "opposite_track"=>4, - "opposite"=>5, - ); -$KTagsEnums["waterway"] = Array( - "river"=>1, - "canal"=>2, - ); -$KTagsEnums["boundary"] = Array( - "administrative"=>1, - "civil"=>2, - "political"=>3, - "national_park"=>4, - ); -$KTagsEnums["abutters"] = Array( - "residential"=>1, - "retail"=>2, - "industrial"=>3, - "commercial"=>4, - "mixed"=>5, - ); -$KTagsEnums["railway"] = Array( - "rail"=>1, - "tram"=>2, - "light_rail"=>3, - "subway"=>4, - "station"=>5, - ); -$KTagsEnums["natural"] = Array( - "coastline"=>1, - "water"=>2, - "wood"=>3, - "peak"=>4, - ); -$KTagsEnums["amenity"] = Array( - "hospital"=>1, - "pub"=>2, - "parking"=>3, - "post_office"=>4, - "fuel"=>5, - "telephone"=>6, - "toilets"=>7, - "post_box"=>8, - "school"=>9, - "supermarket"=>10, - "library"=>11, - "theatre"=>12, - "cinema"=>13, - "police"=>14, - "fire_station"=>15, - "restaurant"=>16, - "fastfood"=>17, - "bus_station"=>18, - "place_of_worship"=>19, - "cafe"=>20, - "bicycle_parking"=>21, - "public_building"=>22, - "grave_yard"=>23, - "universite"=>24, - "college"=>25, - "townhall"=>26 - ); -$KTagsEnums["place"] = Array( - "continent"=>1, - "country"=>2, - "state"=>3, - "region"=>4, - "county"=>5, - "city"=>6, - "town"=>7, - "village"=>8, - "hamlet"=>9, - "suburb"=>10, - ); -$KTagsEnums["leisure"] = Array( - "park"=>1, - "common"=>2, - "garden"=>3, - "nature_reserve"=>4, - "fishing"=>5, - "slipway"=>6, - "water_park"=>7, - "pitch"=>8, - "track"=>9, - "marina"=>10, - "stadium"=>11, - "golf_course"=>12, - "sports_centre"=>13, - ); -$KTagsEnums["historic"] = Array( - "castle"=>1, - "monument"=>2, - "museum"=>3, - "archaeological_site"=>4, - "icon"=>5, - "ruins"=>6 - ); -$KTagsEnums["oneway"] = Array( - "no"=>0, - "false"=>0, - "yes"=>1, - "true"=>1, - "1"=>1, - "-1"=>2 - ); - - -global $nodecount; -global $waycount; -global $nodes; -global $waysalreadydownloaded; - -class Element { - var $type; - var $id; - var $timestamp; - var $properties=Array(); - function OutputAsCSV() { - } - function OutputProperties($node=False) { - global $KNodePropertyIndex,$KNodePropertiesKept,$KPropertiesOmitted; - global $KWayPropertiesKeyTable; - $beginquote = False; - $comma = False; - $output = ""; - if ($node) { - $nodepropertiesbin = 0; - foreach ($KNodePropertyIndex as $nodeprop => $nodepropbin) { - $valuetofind = $nodeprop; - $keytofind = ""; - $colonpos = strpos($nodeprop,":"); - $valuetofind = $nodeprop; - if ($colonpos !== False) { - $valuetofind = substr($nodeprop,$colonpos+1); - $keytofind = substr($nodeprop,0,$colonpos); - } - $key = array_search($valuetofind,$this->properties); - if ($key && (!$keytofind || ($key == $keytofind))) { - $nodepropertiesbin = $nodepropbin; - break; - } - } - $output .= pack("C",$nodepropertiesbin); - $nodeproperties = array(); - foreach ($this->properties as $key => $value) { - if (in_array($key,$KNodePropertiesKept) && ($value != "FIXME")) { - $value = substr($value,0,255); - $nodeproperties[$KWayPropertiesKeyTable[$key]] = pack("C",strlen($value)).$value; - } - } - foreach ($nodeproperties as $key => $value) { - $output .= pack("C",$key).$value; - } - } else { - global $KWayPropertiesKeyTable; - global $KTagsEnums; - global $WayUsedKeys; - global $KWayPropEnumMin,$KWayPropEnumMax,$KWayPropNumericalMin,$KWayPropNumericalMax,$KWayPropDateMin,$KWayPropDateMax,$KWayPropTextMin,$KWayPropTextMax; - $wayproperties = array(); - foreach ($this->properties as $key => $value) { - if ((in_array($key,$WayUsedKeys) !== False) && ($value != "FIXME")) { - $waykeyid = $KWayPropertiesKeyTable[$key]; - if (($waykeyid >= $KWayPropEnumMin) && ($waykeyid < $KWayPropEnumMax)) { - $enumvalue = $KTagsEnums[$key][$value]; - if ($enumvalue) { - $wayproperties[$waykeyid] = pack("C",$enumvalue); - } - } else if (($waykeyid >= $KWayPropNumericalMin) && ($waykeyid < $KWayPropNumericalMax)) { - $wayproperties[$waykeyid] = pack("l",$enumvalue); - } else if (($waykeyid >= $KWayPropDateMin) && ($waykeyid < $KWayPropDateMax)) { - $wayproperties[$waykeyid] = pack("V",myStrToTime($value)); - } else if (($waykeyid >= $KWayPropTextMin) && ($waykeyid < $KWayPropTextMax)) { - $value = substr($value,0,255); - $wayproperties[$waykeyid] = pack("C",strlen($value)).$value; - } - } - } - foreach ($wayproperties as $key => $value) { - $output .= pack("C",$key).$value; - } - } - return $output; - } -}; - -function myStrToTime($string) { - if (($pos=strpos($string,"+")) !== FALSE) { - return(strtotime(substr($string,0,$pos-1))); - } -} - -function toDegrees($micros) { - global $KLLMultiplier; - return $micros / $KLLMultiplier; -} - -// avoid rounding errors which can introduce small discrepancies in lat/lon values -function toMicroDegrees($degrees) { - return str_replace(".", "", sprintf("%.6f", $degrees)); -} - -class NodeElement extends Element { - var $lat; - var $lon; - function OutputAsCSV() { - $output = "n"; - $output .= pack("V",$this->id); - $output .= pack("VV",toMicroDegrees($this->lon),toMicroDegrees($this->lat)); - $prop = $this->OutputProperties(True); - $output .= $prop; - $nodeproparray = unpack('Cp',substr($prop,0,1)); - if ((strlen($prop)>1)|| ($nodeproparray["p"])) { - echo pack("V",strlen($output)); - echo $output; - } - } -} - -function appendNodeToList(&$nodelist,&$nodecount,&$node,&$lastlon,&$lastlat,&$first) { - if ($first) { - $lastlon = toMicroDegrees($node->lon); - $lastlat = toMicroDegrees($node->lat); - $nodelist .= pack("ll",$lastlon,$lastlat); - $nodecount++; - $first = False; - } else { - $thislon = toMicroDegrees($node->lon); - $thislat = toMicroDegrees($node->lat); - $lon = $thislon-$lastlon; - $lat = $thislat-$lastlat; - while (($lon > 32767) || ($lon < -32767)) { - if ($lon > 32767) { - $partlon = 32767; - } else { - $partlon = -32767; - } - $partlat = $lat/($lon/$partlon); - if ($partlat > 32767 or $partlat < -32767) { - if ($partlat > 32767) { - $partlat = 32767; - } else { - $partlat = -32767; - } - $partlon = $lon/($lat/$partlat); - } - - $lon = $lon-$partlon; - $lat = $lat-$partlat; - $nodelist .= pack("ss",$partlon,$partlat); - - $nodecount++; - } - while (($lat > 32767) || ($lat < -32767)) { - if ($lat > 32767) { - $partlat = 32767; - } else { - $partlat = -32767; - } - $partlon = $lon/($lat/$partlat); - if ($partlon > 32767 or $partlon < -32767) { - if ($partlon > 32767) { - $partlon = 32767; - } else { - $partlon = -32767; - } - $partlat = $lat/($lon/$partlon); - } - $lon = $lon-$partlon; - $lat = $lat-$partlat; - $nodelist .= pack("ss",$partlon,$partlat); - $nodecount++; - } - $nodelist .= pack("ss",$lon,$lat); - $nodecount++; - $lastlon = $thislon; - $lastlat = $thislat; - } -} - -class WayElement extends Element { - var $nodes=Array(); - function OutputAsCSV() { - global $nodes; - $output = "w"; - $output .= pack("V",$this->id); - $first=True; - $lastnodeid=0; - $lastlat=0; - $lastlon=0; - $nodelist=""; - $nodecount=0; - foreach ($this->nodes as $key => $nodeid) { - $node = $nodes[$nodeid]; - appendNodeToList($nodelist,$nodecount,$node,$lastlon,$lastlat,$first); - } - $output .= pack("V",$nodecount); - $output .= $nodelist; - $output .= $this->OutputProperties(); - echo pack("V",strlen($output)); - echo $output; - } -} - -function startElement($parser, $name, $attrs) { - global $current; - switch ($name) { - case "NODE": - global $nodecount; - $nodecount++; - $current = new NodeElement(); - $current->id = $attrs["ID"]; - if ($attrs["ID"] > 4294967295) { - doLog("Node ID too big!!"); - } - $current->timestamp = $attrs["TIMESTAMP"]; - $current->lat = $attrs["LAT"]; - $current->lon = $attrs["LON"]; - break; - case "WAY": - global $waycount; - $waycount++; - $current = new WayElement(); - $current->id = $attrs["ID"]; - if ($attrs["ID"] > 4294967295) { - doLog("Way ID too big!!"); - } - $current->timestamp = $attrs["TIMESTAMP"]; - break; - case "TAG": - if ($attrs["K"] != "created_by") { - $current->properties[$attrs["K"]]=$attrs["V"]; - } - break; - case "ND": - $current->nodes[]=$attrs["REF"]; - break; - } -} - -function endElement($parser, $name) { - global $current,$nodes,$ways; - switch ($name) { - case "NODE": - $nodes[$current->id] = $current; - if ($current->properties) { - $current->OutputAsCSV(); - } - break; - case "WAY": - $current->OutputAsCSV(); - break; - } -} - -function compress_output($output) { - $compressed_out = gzencode($output); - header("Content-Encoding: gzip"); - return $compressed_out; -} - -function lonLatToTileId($lon, $lat) { - global $KMaxLon,$KMaxLat,$KMaxBits; - $out = 0; - for ($index=0; $index<$KMaxBits; $index++) { - if ($index%2) { - if ($lat >= ($KMaxLat-($KMaxLat>>($index>>1)))) { - $out += 1<<($KMaxBits-1-$index); - } else { - $lat += ($KMaxLat>>($index>>1)); - } - } else { - if ($lon >= ($KMaxLon-($KMaxLon>>($index>>1)))) { - $out += 1<<($KMaxBits-1-$index); - } else { - $lon += ($KMaxLon>>($index>>1)); - } - } - } - return $out; -} - -function tileIdToBBoxArg($tileid,&$lonmin,&$latmin,&$lonmax,&$latmax) { - global $KMaxLon,$KMaxLat,$KMaxBits; - $lonmin = -$KMaxLon; - $latmin = -$KMaxLat; - for ($index=($KMaxBits-1); $index>=0; $index--) { - $set = ((($tileid>>(($KMaxBits-1)-$index)) %2)==1); - if ($set) { - if ($index%2) { - $latmin += ($KMaxLat>>($index>>1)); - } else { - $lonmin += ($KMaxLon>>($index>>1)); - } - } - } - $lonmax = $lonmin+($KMaxLon>>(($KMaxBits-1)>>1)); - $latmax = $latmin+($KMaxLat>>(($KMaxBits-2)>>1)); -} - -function tileIdToBBox($tileid) { - $lonmin = 0; - $latmin = 0; - $lonmax = 0; - $latmax = 0; - tileIdToBBoxArg($tileid,$lonmin,$latmin,$lonmax,$latmax); - $out = sprintf("%F,%F,%F,%F", toDegrees($lonmin), toDegrees($latmin),toDegrees($lonmax), toDegrees($latmax)); - return $out; -} - -function report_xml_error($xml_parser) { - global $EDownloadErrorXMLError; - reportError($EDownloadErrorXMLError, - sprintf("XML error: %s at line %d", - xml_error_string( xml_get_error_code($xml_parser)), - xml_get_current_line_number( $xml_parser))); -} - -function downloadToXml($serverhost,$serverpath,$query) { - global $phpsupportsfilter; - - $testfile = $_REQUEST["testfile"]; - - $path = $serverpath . "?" . $query; - if ($testfile) { - $fp = fopen("test.5.osm",'r'); - } else { - doLog("Trying: " . $serverhost . $path . "\n"); - $fp = fsockopen( $serverhost, 80, &$errno, &$errstr, 120); - } - - if( !$fp ) { - global $EDownloadErrorConnect; - reportError($EDownloadErrorConnect, - "Couldn't connect to API server ".$serverhost); - } - - if (!$testfile) { - fwrite($fp, "GET $path HTTP/1.1\r\n"); - fwrite($fp, "Host: $serverhost\r\n"); - if ($_SERVER['PHP_AUTH_PW']) { - fwrite($fp, "Authorization: Basic " . - base64_encode($_SERVER['PHP_AUTH_USER'] . - ":" . $_SERVER['PHP_AUTH_PW']) . "\r\n"); - } - fwrite($fp, "User-Agent: OSMtoCSV/1.0\r\n"); - // - // Don't accept gzip until we get this to work - // fwrite($fp, "Accept-encoding: gzip\r\n"); - fwrite($fp, "Connection: Close\r\n"); - fwrite($fp, "\r\n"); - //doLog("wrote to socket"); - } - - $gzip = False; - $chunked = False; - $header200 = False; - $gotdata = False; - if (!$testfile) { - stream_set_timeout($fp,60*20); - ini_set('default_socket_timeout', 60*20); - } - - // get first (status) line - //doLog("get status line"); - if ($statusline = fgets($fp)) { - $statusline = trim($statusline); - //doLog("got statusline: ".$statusline); - if (strpos($statusline," 200 ")!==FALSE) { - $header200 = True; - } else if (strpos($statusline," 401 ")!==FALSE) { - needAuth(); - } else if (strpos($statusline," 400 ")!==FALSE) { - global $EDownloadErrorTooBig; - reportError($EDownloadErrorTooBig); - } else if (strpos($statusline," 404 ")!==FALSE) { - global $EDownloadErrorConnect; - reportError($EDownloadErrorConnect); - } - } - - if ($gzip && $chunked) { - global $EDownloadErrorNoData; - reportError($EDownloadErrorNoData, - "Can't handle chunked gzipped response"); - } - - // get header - while (!feof($fp)) { - - $headerline = trim(fgets($fp)); - //doLog("got headerline, len: ".strlen($headerline)); - - // headers end with a blank line - if (!$headerline) - break; - - if (strncasecmp($headerline,'Location:', 9) == 0) { - $headerline = trim(substr($headerline, 9)); - doLog("Redirecting to: " . $headerline ); - $parsed = parse_url($headerline); - fclose($fp); - downloadToXml( - $parsed['host'],$parsed['path'], - $parsed['query']); - return; - } - - if (strncasecmp($headerline,"Content-encoding: gzip", - strlen("Content-encoding: gzip")) == 0) { - $gzip = True; - } - - if (strncasecmp($headerline, "Transfer-Encoding: chunked", - strlen("Transfer-Encoding: chunked")) == 0) { - $chunked = True; - } - - } - - //doLog("finished header"); - - if (!$header200) { - //doLog("No 200 header: '" . $statusline . "'"); - reportError($EDownloadErrorNoData, - "Got: " . $statusline); - } - - - if ($gzip) { - //doLog("reading gzip header"); - $discard = fread($fp, 10); // discard gzip file header - if ($phpsupportsfilter) { - //doLog("append filter"); - if (!stream_filter_append($fp, 'zlib.inflate', - STREAM_FILTER_READ)) { - doLog("error appending zlib.inflate"); - exit(); - } - } - } - //doLog("create parser"); - $xml_parser = xml_parser_create(); - xml_set_element_handler($xml_parser, "startElement", "endElement"); - - //doLog("gzip: $gzip, chunked: $chunked, feof: ".feof($fp)); - - /* get and parse the body */ - if ($chunked) { - while (!feof($fp)) { - - // read a length line: "hex[;[comment]]CRNL" - $chunkline = preg_replace("/;.*/","",fgets($fp)); - $chunk = hexdec($chunkline); - - if ($chunk == 0) - break; - - $got = 0; - while ($got < $chunk && - ($piece = fread($fp, $chunk - $got))) { - $got += strlen($piece); - if (!xml_parse($xml_parser, $piece, False)) { - report_xml_error($xml_parser); - } - $gotdata = True; - } - fgets($fp); // data is followed by CR/NL - } - if (!xml_parse($xml_parser, "", True)) { - report_xml_error($xml_parser); - } - // consume footers, if any, and trailing blank line - while (!feof($fp)) { - $footer = fgets($fp); - } - - } else { - // not chunked -- much simpler - $alldata = ""; - while (!feof($fp)) { - //doLog("about to fread"); - $data = fread($fp, 8192); - //doLog("read"); - //doLog("readdata len: ".strlen($data).", feof: ".feof($fp)); - if ($phpsupportsfilter || !$gzip) { - //doLog("data is '" . $data . "'"); - if (!xml_parse($xml_parser, $data, feof($fp))) { - report_xml_error($xml_parser); - } - $gotdata = True; - } else { - $alldata .= $data; - } - } - if (!$phpsupportsfilter && $gzip) { - //doLog("parse all at once after unzip"); - $alldata = gzinflate($alldata); - if (!xml_parse($xml_parser, $alldata, feof($fp))) { - report_xml_error($xml_parser); - } - $gotdata = True; - } - } - xml_parser_free($xml_parser); - - fclose($fp); - - if (!$gotdata) { - global $EDownloadErrorNoData; - reportError($EDownloadErrorNoData); - } - -} - - -function getStaticPageNameBMap($tileid) { - global $KMaxBits, $CacheDir; - $htmldir = $CacheDir."/".$KMaxBits."/"; - if (!@is_dir($htmldir)) { - //echo "made: ".$htmldir; - mkpath($htmldir,0775,True); - } - $pagename = $htmldir.$tileid; - return $pagename; -} - - -//scan surrounding tiles for ways already known of -function findKnownWays($tileid, $have) { - global $waysalreadydownloaded,$KMaxBits,$KMaxLat,$KMaxLon; - $waysalreadydownloaded = Array(); - $neighbours = array(0x01=>"+-",0x02=>" -",0x04=>"--",0x08=>"+ ",0x10=>"- ",0x20=>"++",0x40=>" +",0x80=>"-+"); - $lonmin = 0; - $latmin = 0; - $lonmax = 0; - $latmax = 0; - $gridsizelon = ($KMaxLon>>(($KMaxBits-1)>>1)); - $gridsizelat = ($KMaxLat>>(($KMaxBits-2)>>1)); - //echo "gridsizelon: $gridsizelon, gridsizelat: $gridsizelat, "; - //echo base_convert($tileid, 10, 2); - tileIdToBBoxArg($tileid,$lonmin,$latmin,$lonmax,$latmax); - //echo "gridsizelon1: ".($lonmax-$lonmin).", gridsizelat1: ".($latmax-$latmin).", "; - - foreach ($neighbours as $mask => $direction) { - if ($have&$mask) { - //doLog("have: $have - $direction"); - //echo "<p>have: $direction, "; - $lon = $lonmin+$gridsizelon/2; - $lat = $latmin+$gridsizelat/2; - if ($direction[0]=='+') - $lon += $gridsizelon; - if ($direction[0]=='-') - $lon -= $gridsizelon; - if ($direction[1]=='+') - $lat += $gridsizelat; - if ($direction[1]=='-') - $lat -= $gridsizelat; - - $neighbourid = lonLatToTileId($lon,$lat); - //echo base_convert($neighbourid, 10, 2); - //echo ", ".base_convert($neighbourid^$tileid, 10, 2); - //doLog("neighbour: $neighbourid"); - - $filename = getStaticPageNameBMap($neighbourid); - if (file_exists($filename)) { - // doLog("found: $filename, "); - $content = file_get_contents($filename); - $foundwayscount = 0; - for ($i=0; $i<(strlen($content)); ) { - $lenarray = unpack('Vlen',substr($content,$i,4)); - $len = $lenarray["len"]; - if (($content[$i+4] == 'w')) { - $packarray = unpack('Vid',substr($content,$i+5,4)); - //var_dump($packarray); - //doLog("foundway(".$content[$i].$content[$i+1].$content[$i+2].$content[$i+3].$content[$i+4].")[".($foundwayscount++)."]: ".$packarray["id"]); - $waysalreadydownloaded[]=$packarray["id"]; - } - $i+=4+$len; - } - } - } - } -} - -/* - * start static page construction, also set to ignore abort if first - * one to ask for this page -*/ -function staticPageStartBMap($tileid) { - global $staticpagename,$staticpagelockfilehandle; - $staticpagename = getStaticPageNameBMap($tileid); - // doLog("staticpagename is $staticpagename"); - $staticpagelockfilehandle = fopen($staticpagename.".lock",'w'); - if (flock($staticpagelockfilehandle, LOCK_EX)) { - fwrite($staticpagelockfilehandle, ""); - $cachetimeout = 28800; //how long to keep cache files for - global $nocache; - if (!$nocache && file_exists($staticpagename) && - (filemtime($staticpagename)+$cachetimeout > time())) { - - fclose($staticpagelockfilehandle); - //read and return page - $tocutdotpos = strripos($staticpagename, "."); - if ($tocutdotpos) { - $extension = substr($staticpagename,$tocutdotpos+1); - } - outputWithoutNeighbouringWays(file_get_contents($staticpagename)); - echo pack("V",2)."#C"; - global $skipwaycount; - doLog("Cache Hit, Skipped Ways: ".$skipwaycount); - exit(); - } else { - ignore_user_abort(True); - } - } else { - global $EDownloadErrorPerms; - reportError($EDownloadErrorPerms); - } - - timingStart(); - ob_start(); -} - -function staticPageEndBMap() { - global $staticpagename,$staticpagelockfilehandle; - - $output = "t"; - $currenttime = time(); - $output .= pack("V",$currenttime); - echo pack("V",strlen($output)); - echo $output; - doLog("Page create time: ".timingEnd()); - - $staticpagecontent = ob_get_clean(); - outputWithoutNeighbouringWays($staticpagecontent); - - $f = fopen($staticpagename,'w'); - fwrite($f, $staticpagecontent); - fclose($f); - fclose($staticpagelockfilehandle); - - echo pack("V",2)."#F"; -} - -function reportError($error, $errorString) { - global $KDownloadErrors; - - $output = "f"; - $output .= pack("C",$error); - if (!$errorString) { - $errorString = $KDownloadErrors[$error]; - } - $errorString = substr($errorString,0,255); - $output .= pack("C", strlen($errorString)).$errorString; - echo pack("V",strlen($output)); - echo $output; - doLog("Reported error #".$error." '".$errorString."'"); - exit; -} - -function outputWithoutNeighbouringWays($content) { - global $waysalreadydownloaded,$skipwaycount; - $output = True; - $skipwaycount = 0; - $skippedways = Array(); - for ($i=0; $i<(strlen($content)); ) { - $lenarray = unpack('Vlen',substr($content,$i,4)); - $len = $lenarray["len"]; - if ($content[$i+4] == 'w') { - $packarray = unpack('Vid',substr($content,$i+5,4)); - //doLog("checking way: ".$packarray['id']); - if (in_array($packarray['id'],$waysalreadydownloaded)) { - // doLog("skipping way: ".$packarray['id']); - $output = False; - $skipwaycount++; - $skippedways[] = $packarray['id']; - } else { - $output = True; - } - } else { - $output = True; - } - if ($output) { - echo substr($content,$i,4+$len); - } - $i+=4+$len; - } - //output list of skipped way ids - if (count($skippedways)) { - //echo "<p>skippedways</p>"; - $output = "o"; - for ($i=0; $i<count($skippedways); $i++) { - //doLog($skippedways[$i]); - $output .= pack("V",$skippedways[$i]); - } - echo pack("V",strlen($output)); - echo $output; - } else { - //echo "<p>noskippedways</p>"; - } -} - -function fetchTile($tileid, $bits, $have, $server, $path) { - - global $KMaxBits, $nodecount, $waycount; - $KMaxBits = $bits; - - set_time_limit(60*20); - - $bbox = tileIdToBBox($tileid); - - findKnownWays($tileid,$have); - - /* if cached copy is found, will output it and exit */ - staticPageStartBMap($tileid); - - downloadToXml($server, $path, "bbox=".$bbox); - doLog("Nodes: ".$nodecount.", Ways: ".$waycount); - - /* will output based on fresh download */ - staticPageEndBMap(); - - global $skipwaycount; - doLog("Skipped Ways: ".$skipwaycount); - -} - - -?> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pg...@us...> - 2014-06-07 20:25:44
|
Revision: 2761 http://sourceforge.net/p/roadmap/code/2761 Author: pgf Date: 2014-06-07 20:25:42 +0000 (Sat, 07 Jun 2014) Log Message: ----------- doc: remove references to OSM binary protocol also remove the now-redundant (since 2010) OpenStreetMap file -- its content is now part of Maps. Modified Paths: -------------- trunk/roadmap/README trunk/roadmap/doc/Maps trunk/roadmap/src/Makefile trunk/roadmap/web/Makefile Removed Paths: ------------- trunk/roadmap/doc/OpenStreetMap Modified: trunk/roadmap/README =================================================================== --- trunk/roadmap/README 2014-06-07 20:25:37 UTC (rev 2760) +++ trunk/roadmap/README 2014-06-07 20:25:42 UTC (rev 2761) @@ -114,8 +114,6 @@ %!include: Configuration @@ runtime-help-link Maps %!include: Maps -@@ runtime-help-link OpenStreetMap -%!include: OpenStreetMap %!include: Map-Building @@ runtime-help-link Navigation %!include: Navigation Modified: trunk/roadmap/doc/Maps =================================================================== --- trunk/roadmap/doc/Maps 2014-06-07 20:25:37 UTC (rev 2760) +++ trunk/roadmap/doc/Maps 2014-06-07 20:25:42 UTC (rev 2761) @@ -1,11 +1,11 @@ RoadMap and OpenStreetMap map data -November 2010 +November 2014 = Maps = -RoadMap is program that displays maps. +RoadMap is a program that displays maps. Depending on how you got RoadMap, it may come prepackaged with a set of demo maps that may or may not be useful to you. This chapter describes @@ -101,56 +101,44 @@ OSM map data is available from servers on the web, using a simple API. As simple as it is, though, it can produce a lot of data in XML format, very - quickly. While it might not be a problem for desktop systems with - high-speed connections, if RoadMap is to be able to do on-demand loading - of OSM data, an alternative protocol is preferable. Conveniently, work - has already been done to specify just such a compact profile. Known as - the "OSM Mobile Binary Protocol", it is documented here: + quickly. Limiting the data to a single quadtile at a time makes this + manageable, both for buildmap_osm (the map builder) and for RoadMap itself. + + While it might not be a problem for desktop systems with high-speed + connections, if RoadMap is to be able to do on-demand loading of OSM data, + an alternative protocol is preferable. Conveniently, work Formerly + RoadMap attempted to make use of a lighter weight protocol known as the + "OSM Mobile Binary Protocol", but no public servers for that protocol have + ever become available, and RoadMap used a cumbersome protocol translator + program which has since been eliminated. - http://wiki.openstreetmap.org/index.php/OSM_Mobile_Binary_Protocol + Fetching OSM data, and converting it to RoadMaps's preferred format, is + handled by the command "buildmap_osm". Given some information about + position and area, the size of the quadtiles desired, and the source of + the data, buildmap_osm will produce the RoadMap .rdm files necessary for + displaying that region. - Roadmap comes with code which can provide data in this format, which can - be run in two different ways: either as a a command-line program, or as a - proxy server implemented as a CGI script. The two programs share most of - their code, and are written in PHP. - - Converting the "Mobile Binary" data to a format useable directly by - RoadMap is handled by the command "buildmap_osm". Given some information - about position and area, the size of the quadtiles desired, and the source - of the data, buildmap_osm will produce the RoadMap .rdm files necessary - for displaying that region. - buildmap_osm can be given two lat/lon pairs, to specify a bounding box, or a single lat/lon pair plus a radius in miles or km (it's not really a radius -- the distance again actually describes a square bounding box). The size of the quadtile to fetch is specified in "bits" (see the previous - section), and the source of the data is specified either as the PHP - "osmgetbmap" command, or as a URL referring to an installed version of the - PHP cgi script. + section). A helper script (written in Bourne shell) does the actual + fetching of data, and also handles caching of previous results. A sample command looks like: ``` - buildmap_osm -m /tmp/maps -s osmgetbmap 48.135,17.125:20km + buildmap_osm -m /tmp/maps 48.135,17.125:20km ``` - which will fetch 40 km square worth of maps centered on Bratislava. Using - the web proxy, the same request might look like: -``` - buildmap_osm -m /tmp/maps -s http://localhost:801/cgi-bin/bmap.php \ - 48.135,17.125:20km -``` + which will fetch 40 km square worth of maps centered on Bratislava. - Fetching OpenStreetMap data in large chunks - The OpenStreetMap servers only allow obtaining a limited amount of map - info per query. Access via the OSM Mobile Binary Protocol is subject to - such limitations. - Other services (e.g. http://download.geofabrik.de/osm/europe/) provide access to large chunks of OSM data in a single file, e.g. a file per country, like the maps used in many commercial GPS devices. - The buildmap_osm command was extended to be able to process those files. - A sample command looks like + The buildmap_osm command can also process those files. A sample command + looks like ``` buildmap_osm -i iso-be.osm -o iso-be.rdm ``` @@ -161,6 +149,8 @@ The latter format allows for country subdivisions (yyy is a subdivision of country xx). The codes xx and yyy are defined in the ISO-3166-1 (country) and ISO-3166-2 (country subdivision). Note that the latter is incomplete. + Converting very large areas in this way can test the limits of RoadMap's + design. - Limitations @@ -172,9 +162,9 @@ needs to be done to integrate a buildmap_osm "method" into RoadMap's map download scheme. - - When a tile is fetched, it will include all roads (and other lines -- - "ways" in OSM parlance) which start or end in that tile. This leads to - two interesting issues: + - When a quadtile is fetched, it will include all roads (and other lines, + which are "ways" in OSM parlance) which start or end in that tile. This + leads to two interesting issues: + The true bounding box of the data in a fetched tile is probably not going to line up with the presumed dimensions of that tile. The @@ -184,24 +174,10 @@ + When a neighboring tile is fetched, it may include the same line, if the other end of the line is in that tile. In order to reduce the - amount of duplicated data, when tiles are fetched via the "mobile - binary" protocol, we tell the server that we already have tiles to the - south and east, but not to the north and west. This way, if you load - a full set of tiles, you should get just one copy of any line. The - osmgetbmap code, however, doesn't do a perfect job of figuring out - what not to give you based on what you say you already have, so you - may get duplicated data, particularly around the edges of the area - requested. The order in which RoadMap fetches tiles might need to be - changed to help with this problem, as well. + amount of duplicated data, when tiles are fetched and converted by + buildmap_osm, a second ".ways" file is also produced. This contains + a list of the OSM "way ids" (line identifiers) defined in this + tile. When converting a tile, buildmap_osm checks the .ways files + for all eight of its nearest neighbors, and will discard any way + that is already defined by a neighboring tile. - - Because tiles can provide overlapping data, map rendering near the edges - of tiles can be somewhat messy -- the lines on one tile may be - rendered before the polygons of the next, for instance, and labels - placed when rendering one may collide with labels placed when - rendering the next. For this reason, tiles should be kept fairly - large -- RoadMap already has the means to make rendering relatively - large areas efficiently. The only reason to choose small tiles is to - reduce "latency" when requesting data on-demand. - - - Deleted: trunk/roadmap/doc/OpenStreetMap =================================================================== --- trunk/roadmap/doc/OpenStreetMap 2014-06-07 20:25:37 UTC (rev 2760) +++ trunk/roadmap/doc/OpenStreetMap 2014-06-07 20:25:42 UTC (rev 2761) @@ -1,173 +0,0 @@ -RoadMap and OpenStreetMap map data - -November 2010 - -== Using OpenStreetMap Maps == - -This information is preliminary, since OSM support is -work-in-progress. It does work, but may change in detail. - - - Indexed maps - - The maps that RoadMap renders come from several sources (TIGER, various - shapefile formats, OpenStreetMap). They all need to be indexed for use - by RoadMap for several reasons. First, we don't want to overload RoadMap - with several ways to interpret the same data. Second, there's not - always a direct mapping between the coordinates on the screen where - RoadMap is trying to display a map, and the name of the map file(s) that - contain(s) information for that region. - - - File name formats - - The map files are named in a way that depends on how the data was - obtained and therefore, how the data is organized. A map file called - "usc25027.rdm" contains contains data from county 27 in state 25). A - map file called iso-be.rdm contains the whole country "be". A third - map file format is based on QuadTiles. - - The files contain some information that RoadMap can use to figure out - where it is -- an index is made using this information so that RoadMap - doesn't need to continually look in all the files. That index is - currently called "usdir.rdm". - - - QuadTiles, RoadMap tileid values, and filenames - - If the name of the file holding the map data encoded its position and size - somehow, then an index wouldn't be needed (at least for positioning -- - there are other reasons an index is useful, but none are as critical to - rendering). For maps whose data source is organized by geography (i.e., - latitude/longitude) rather than politics (i.e. country name), it's - possible to do such an encoding. - - The encoding used by RoadMap for OpenStreetMap (OSM) maps is known as - "quadtile" encoding. There's a good description of quadtiles as they - relate to OSM on the OSM wiki, here: - - http://wiki.openstreetmap.org/index.php/QuadTiles - - (There's also a more general article on Wikipedia.) The OSM quadtile - scheme uses a full 32 bits worth of addressing in a "tileid", and can - reference tiles as small as 600 meters on a side (at the equator -- - they're narrower further north and south). RoadMap doesn't need such - fine-grained resolution, and uses fewer bits for RoadMap tileids. This - frees those bits to be used for other purposes, and RoadMap uses only 27 - bits to address quadtiles (the smallest addressable tile is about 2.4km on - a side). Of the 5 bits remaining in a 32 bit word, RoadMap uses one bit - internally to distinguish a tileid from one of the "FIPS" county - identifiers that represent RoadMaps other maps, and the other 4 are used - to encode how many bits of the 27 address bits are currently in use -- the - 4 bits are used to represent "bit count" values of 12 through 27, maximum - and a minimum tile sizes that RoadMap can handle of from 2.4km up to 320km - on a side. - - The encoded RoadMap tileid is used directly to form the filename - representing the data for that OSM quadtile. The tileid is represented in - hexadecimal. The lowest 4 bits (the least-significant hex digit) is 12 - less than the bit level -- so a 19 bit tile would have a '7' in that - digit. The OSM quadtile value appears in the other 7 hex digits. Its - value is "left-justified" -- i.e., as more bits are added to the quadtile - address, the address grows to the right. - - As an example, to RoadMap encoding of the 19 bit OSM quadtile id of - 251833, would be 0x3d7b9007. (251833 is 0x3d7b9 in hex). - - - Fetching OpenStreetMap data by QuadTile - - OSM map data is available from servers on the web, using a simple API. As - simple as it is, though, it can produce a lot of data in XML format, very - quickly. While it might not be a problem for desktop systems with - high-speed connections, if RoadMap is to be able to do on-demand loading - of OSM data, an alternative protocol is preferable. Conveniently, work - has already been done to specify just such a compact profile. Known as - the "OSM Mobile Binary Protocol", it is documented here: - - http://wiki.openstreetmap.org/index.php/OSM_Mobile_Binary_Protocol - - Roadmap comes with code which can provide data in this format, which can - be run in two different ways: either as a a command-line program, or as a - proxy server implemented as a CGI script. The two programs share most of - their code, and are written in PHP. - - Converting the "Mobile Binary" data to a format useable directly by - RoadMap is handled by the command "buildmap_osm". Given some information - about position and area, the size of the quadtiles desired, and the source - of the data, buildmap_osm will produce the RoadMap .rdm files necessary - for displaying that region. - - buildmap_osm can be given two lat/lon pairs, to specify a bounding box, or - a single lat/lon pair plus a radius in miles or km (it's not really a - radius -- the distance again actually describes a square bounding box). - The size of the quadtile to fetch is specified in "bits" (see the previous - section), and the source of the data is specified either as the PHP - "osmgetbmap" command, or as a URL referring to an installed version of the - PHP cgi script. - - A sample command looks like: -``` - buildmap_osm -m /tmp/maps -s osmgetbmap 48.135,17.125:20km -``` - which will fetch 40 km square worth of maps centered on Bratislava. Using - the web proxy, the same request might look like: -``` - buildmap_osm -m /tmp/maps -s http://localhost:801/cgi-bin/bmap.php \ - 48.135,17.125:20km -``` - - - Fetching OpenStreetMap data in large chunks - - The OpenStreetMap servers only allow obtaining a limited amount of map - info per query. Access via the OSM Mobile Binary Protocol is subject to - such limitations. - - Other services (e.g. http://download.geofabrik.de/osm/europe/) provide - access to large chunks of OSM data in a single file, e.g. a file per - country, like the maps used in many commercial GPS devices. - - The buildmap_osm command was extended to be able to process those files. - A sample command looks like -``` - buildmap_osm -i iso-be.osm -o iso-be.rdm -``` - which will convert one file into the other. - - The file name format is twofold : iso-xx.rdm or iso-xx-yyy.rdm . The former - is a file per country (xx is the ISO two-character code for the country). - The latter format allows for country subdivisions (yyy is a subdivision of - country xx). The codes xx and yyy are defined in the ISO-3166-1 (country) - and ISO-3166-2 (country subdivision). Note that the latter is incomplete. - - - Overall OpenStreetMap Limitations - - - Because the OSM maps are loaded based on geographic location, they - currently have no notion of political locality. This means that - searching by address or intersection can't currently work. - - - There's no way currently to do on-demand loading of OSM maps. Work - needs to be done to integrate a buildmap_osm "method" into RoadMap's map - download scheme. - - - When a quadtile is fetched, it will include all roads (and other lines -- - "ways" in OSM parlance) which start or end in that tile. This leads to - two interesting issues: - - + The true bounding box of the data in a fetched tile is probably not - going to line up with the presumed dimensions of that tile. The - bounding box may be smaller (if there is very little data, all within - the bounds of the tile), or larger (as a result of roads and other - features extending past the tile "boundaries"). - - + When a neighboring tile is fetched, it may include the same line, if - the other end of the line is in that tile. In order to reduce the - amount of duplicated data, when tiles are fetched via the "mobile - binary" protocol, we tell the server that we already have tiles to the - south and east, but not to the north and west. This way, if you load - a full set of tiles, you should get just one copy of any line. The - osmgetbmap code, however, doesn't do a perfect job of figuring out - what not to give you based on what you say you already have, so you - may get duplicated data, particularly around the edges of the area - requested. The order in which RoadMap fetches tiles might need to be - changed to help with this problem, as well. - - - - Modified: trunk/roadmap/src/Makefile =================================================================== --- trunk/roadmap/src/Makefile 2014-06-07 20:25:37 UTC (rev 2760) +++ trunk/roadmap/src/Makefile 2014-06-07 20:25:42 UTC (rev 2761) @@ -704,7 +704,7 @@ UPPER_SRC = README COPYING DOC_SRC = Bugs ChangeLog Coding Configuration Developer-Guide \ Installation Map-Building Map-Designing Map-Format \ - OpenStreetMap Platforms Quickstart Status ToDo Usage + Maps Platforms Quickstart Status ToDo Usage tarball: $(RELNAME)-src.tar.gz Modified: trunk/roadmap/web/Makefile =================================================================== --- trunk/roadmap/web/Makefile 2014-06-07 20:25:37 UTC (rev 2760) +++ trunk/roadmap/web/Makefile 2014-06-07 20:25:42 UTC (rev 2761) @@ -57,7 +57,7 @@ Installation \ Usage \ Configuration \ - OpenStreetMap \ + Maps \ Map-Building USER_GUIDE_SECTION_PATHS = $(addprefix ../doc/, $(USER_GUIDE_SECTIONS)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pg...@us...> - 2014-06-07 20:25:39
|
Revision: 2760 http://sourceforge.net/p/roadmap/code/2760 Author: pgf Date: 2014-06-07 20:25:37 +0000 (Sat, 07 Jun 2014) Log Message: ----------- buildmap_osm: remove support for the openstreetmap binary protocol with no public servers, running a local xml-to-OSMbinary translator makes no sense -- especially a very slow translator. quadtiles are now built using the the native xml parser. Modified Paths: -------------- trunk/roadmap/src/Makefile trunk/roadmap/src/buildmap_osm_common.c trunk/roadmap/src/buildmap_osm_common.h trunk/roadmap/src/buildmap_osm_main.c trunk/roadmap/src/rdm_osm_fetch_tile Removed Paths: ------------- trunk/roadmap/src/buildmap_osm_binary.c trunk/roadmap/src/buildmap_osm_binary.h Modified: trunk/roadmap/src/Makefile =================================================================== --- trunk/roadmap/src/Makefile 2014-06-07 20:25:32 UTC (rev 2759) +++ trunk/roadmap/src/Makefile 2014-06-07 20:25:37 UTC (rev 2760) @@ -120,7 +120,6 @@ buildmap_layer.c \ buildmap_tiger.c \ buildmap_shapefile.c \ - buildmap_osm_binary.c \ buildmap_osm_common.c \ buildmap_osm_text.c \ buildmap_empty.c \ @@ -196,7 +195,6 @@ buildmap_line.h \ buildmap_metadata.h \ buildmap_opt.h \ - buildmap_osm_binary.h \ buildmap_osm_common.h \ buildmap_osm_text.h \ buildmap_place.h \ Deleted: trunk/roadmap/src/buildmap_osm_binary.c =================================================================== --- trunk/roadmap/src/buildmap_osm_binary.c 2014-06-07 20:25:32 UTC (rev 2759) +++ trunk/roadmap/src/buildmap_osm_binary.c 2014-06-07 20:25:37 UTC (rev 2760) @@ -1,619 +0,0 @@ -/* - * LICENSE: - * - * Copyright 2007 Paul Fox - * Copyright (c) 2009, Danny Backx. - * - * This file is part of RoadMap. - * - * RoadMap is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * RoadMap is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with RoadMap; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/** - * @file - * @brief a module to read OSM Mobile Binary format - * - * The protocol is documented in - * http://wiki.openstreetmap.org/index.php/OSM_Mobile_Binary_Protocol , - * and - * http://wiki.openstreetmap.org/index.php/OSM_Binary_Format , - * the current OSM protocol is in - * http://wiki.openstreetmap.org/index.php/OSM_Protocol_Version_0.5 . - * More generic protocol documentation: - * http://wiki.openstreetmap.org/index.php/Protocol . - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <stdarg.h> - -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <unistd.h> -#include <sys/mman.h> -#include <time.h> - - -#include "roadmap.h" -#include "roadmap_types.h" -#include "roadmap_math.h" -#include "roadmap_path.h" -#include "roadmap_file.h" -#include "roadmap_osm.h" -#include "roadmap_line.h" - -#include "buildmap.h" -#include "buildmap_zip.h" -#include "buildmap_city.h" -#include "buildmap_square.h" -#include "buildmap_point.h" -#include "buildmap_line.h" -#include "buildmap_street.h" -#include "buildmap_range.h" -#include "buildmap_area.h" -#include "buildmap_shape.h" -#include "buildmap_polygon.h" - -#include "buildmap_layer.h" -#include "buildmap_osm_common.h" -#include "buildmap_osm_binary.h" - -extern char *BuildMapResult; - -/** - * @brief - * @param d - * @param string - * @return - */ -static RoadMapString str2dict (BuildMapDictionary d, const char *string) { - - if (!strlen(string)) { - return buildmap_dictionary_add (d, "", 0); - } - - return buildmap_dictionary_add (d, (char *) string, strlen(string)); -} - -/* the major options coming back from the server can indicate - * four types of values. those with a value that is itself an - * enumerated type, and those with arbitrary numeric, time, or - * string values. - */ -#define key_enumerated_start 1 -#define key_numeric_start 128 -#define key_date_start 176 -#define key_string_start 192 - -#define STRING_NAME 0 -#define STRING_REF 9 - -static unsigned char * -read_4_byte_int(unsigned char *p, int *r) -{ - *r = (p[3] << 24) + (p[2] << 16) + (p[1] << 8) + p[0]; - return p + 4; -} - -static unsigned char * -read_2_byte_int(unsigned char *p, int *r) -{ - short s; - s = (p[1] << 8) + p[0]; - *r = s; - return p + 2; -} - -/** - * @brief look ahead and figure out the additional info (options) - * like the road type - * @param cur - * @param end - * @param name - * @param ref - * @param flagp - * @return the layer that this way is in - */ -static int -buildmap_osm_binary_parse_options - (unsigned char *cur, unsigned char *end, - char *name, char *ref, int *flagp) -{ - - int key, slen; - int layer = 0; - - if (buildmap_is_verbose()) { - fprintf(stderr, "option data is\n"); - int i; - for (i = 0; i < end - cur; i++) { - fprintf(stderr, " %02x", cur[i]); - } - fprintf(stderr, "\n"); - - } - - if (name != NULL) - *name = '\0'; - if (ref != NULL) - *ref = '\0'; - - while (cur < end) { - key = *cur++; - if (key >= key_string_start) { - - key -= key_string_start; - slen = *cur++; - - buildmap_verbose("'%s' is %.*s", stringtype[key], slen, cur); - - if (key == STRING_NAME && name != NULL) { /* regular "name" */ - memcpy(name, cur, slen); - name[slen] = '\0'; - } - if (key == STRING_REF && ref != NULL) { /* usually route number */ - int i; - memcpy(ref, cur, slen); - for (i = 0; i < slen; i++) { - /* multiple route numbers separated by ';' in tag */ - if (ref[i] == ';') ref[i] = '/'; - } - ref[slen] = '\0'; - } - cur += slen; - - } else if (key >= key_date_start) { - time_t tim; - int itime; - - key -= key_date_start; - - cur = read_4_byte_int(cur, &itime); - tim = (time_t)itime; - - buildmap_verbose - ("'%s' is %s", datetype[key], asctime(gmtime(&tim))); - - } else if (key >= key_numeric_start) { - int val; - - key -= key_numeric_start; - cur = read_4_byte_int(cur, &val); - - buildmap_verbose("'%s' is %ld", stringtype[key], val); - - } else { - int val; - - /* the rest are enumerated types, and we have lists for - * the ones we're interested in. - */ - val = *cur++; - - buildmap_verbose - ("list type is '%s', subtype ", list_info[key].name); - - if (list_info[key].list) { - buildmap_verbose("'%s'", list_info[key].list[val].name); - - if (list_info[key].list[val].layerp) { - layer = *list_info[key].list[val].layerp; - if (flagp) *flagp = list_info[key].list[val].flags; - buildmap_verbose("maps with list to layer %d", layer); - } - } else { - buildmap_verbose("%d", val); - - if (list_info[key].layerp) { - layer = *list_info[key].layerp; - buildmap_verbose("maps to layer %d", layer); - } - } - - } - } - return layer; -} - -/** - * @brief - * @param data - * @param len - * @return - */ -static int -buildmap_osm_binary_node(unsigned char *data, int len) -{ - int id, lon, lat; - unsigned char *dp = data; - int prop; - int layer; - - dp = read_4_byte_int(dp, &id); - dp = read_4_byte_int(dp, &lon); - dp = read_4_byte_int(dp, &lat); - prop = *dp++; - - buildmap_verbose("node: id %ld, lon %ld, lat %ld, prop %d", - id, lon, lat, prop); - - if (dp < data + len) - layer = buildmap_osm_binary_parse_options - (dp, data + len, NULL, NULL, NULL); - - /* currently, RoadMap has no ability to display simple - * points, or "nodes" in OSM vocabulary. so we do this - * parsing, then drop it on the floor. - */ - - return 0; -} - - -struct shapeinfo { - int lineid; - int count; - int *lons; - int *lats; -}; - -static int numshapes; -static struct shapeinfo *shapes; - -/** - * @brief - * @param data - * @param len - * @return - */ -static int -buildmap_osm_binary_way(unsigned char *data, int len) -{ - int id, count, savecount; - int *lonp, *latp; - unsigned char *dp, *op; - int layer, flags, line, street, j; - int frlong, frlat, tolong, tolat, from_point, to_point; - char name[257]; - char ref[257]; - char compound_name[513]; - char *n; - static int *lonsbuf, *latsbuf; - static int lineid = 1; - - RoadMapString rms_dirp = str2dict(DictionaryPrefix, ""); - RoadMapString rms_dirs = str2dict(DictionarySuffix, ""); - RoadMapString rms_type = str2dict(DictionaryType, ""); - RoadMapString rms_name; - - dp = data; - dp = read_4_byte_int(dp, &id); - dp = read_4_byte_int(dp, &count); - - /* look ahead to find the options */ - op = dp + 4 + 4 + (count - 1) * (2 + 2); - if (op >= data + len) - return 0; - - layer = buildmap_osm_binary_parse_options - (op, data + len, name, ref, &flags); - - buildmap_verbose("'%s' (ref '%s') is in layer %d", name, ref, layer); - - if (*ref) { - if (*name) { - sprintf(compound_name, "%s/%s", ref, name); - n = compound_name; - } else { - n = ref; - } - } else { - n = name; - } - - if (!layer) - return 0; - - savecount = count; - - lonp = lonsbuf = realloc(lonsbuf, count * sizeof(long)); - buildmap_check_allocated(lonsbuf); - dp = read_4_byte_int(dp, lonp); - - latp = latsbuf = realloc(latsbuf, count * sizeof(long)); - buildmap_check_allocated(latsbuf); - dp = read_4_byte_int(dp, latp); - - buildmap_verbose("way: id %ld", id); - buildmap_verbose(" lon %ld, lat %ld", *lonp, *latp); - - count--; - while (count--) { - int tmp; - - dp = read_2_byte_int(dp, &tmp); - *(lonp + 1) = *lonp + tmp; - - dp = read_2_byte_int(dp, &tmp); - *(latp + 1) = *latp + tmp; - - lonp++; - latp++; - buildmap_verbose(" lon %ld, lat %ld", *lonp, *latp); - } - - frlong = *lonsbuf; - frlat = *latsbuf; - - tolong = *lonp; - tolat = *latp; - - if ((flags & AREA) && (frlong == tolong) && (frlat == tolat)) { - static int landid; - static int polyid; - static int cenid; - - buildmap_verbose("looks like a polygon"); - - buildmap_polygon_add_landmark - (++landid, layer, 0 /* RoadMapString name */ ); - - buildmap_polygon_add(landid, ++cenid, ++polyid); - - count = savecount - 1; - frlong = *lonsbuf; - frlat = *latsbuf; - from_point = buildmap_point_add(frlong, frlat); - lonp = lonsbuf; - latp = latsbuf; - while (count--) { - - tolong = *(lonp + 1); - tolat = *(latp + 1); - - to_point = buildmap_point_add(tolong, tolat); - line = buildmap_line_add(++lineid, layer, from_point, to_point, - ROADMAP_LINE_DIRECTION_BOTH); - - buildmap_verbose("from: %d, %d to: %d, %d lineid %d", - frlong, frlat, tolong, tolat, lineid); - - buildmap_polygon_add_line - (cenid, polyid, lineid, POLYGON_SIDE_RIGHT); - frlong = tolong; - frlat = tolat; - from_point = to_point; - lonp++; - latp++; - } - } else { - - from_point = buildmap_point_add(frlong, frlat); - to_point = buildmap_point_add(tolong, tolat); - line = buildmap_line_add(++lineid, layer, from_point, to_point, - ROADMAP_LINE_DIRECTION_BOTH); - - buildmap_verbose("from: %d, %d to: %d, %d lineid %d", - frlong, frlat, tolong, tolat, lineid); - - rms_name = str2dict(DictionaryStreet, n); - street = - buildmap_street_add(layer, rms_dirp, rms_name, rms_type, - rms_dirs, line); - - buildmap_range_add_no_address(line, street); - - for (j = 0; j < lonp - lonsbuf + 1; j++) { - buildmap_square_adjust_limits(lonsbuf[j], latsbuf[j]); - } - - shapes = realloc(shapes, - ((numshapes + 1024) & ~1023) * sizeof(*shapes)); - buildmap_check_allocated(shapes); - shapes[numshapes].lons = lonsbuf; - shapes[numshapes].lats = latsbuf; - shapes[numshapes].count = lonp - lonsbuf + 1; - shapes[numshapes].lineid = lineid; - lonsbuf = latsbuf = 0; - numshapes++; - } - - return 1; -} - -/** - * @brief - */ -static int -buildmap_osm_binary_ways_pass2(void) -{ - int i, j, count, lineid; - int *lons, *lats; - int line_index; - buildmap_info("loading shape info ..."); - buildmap_line_sort(); - for (i = 0; i < numshapes; i++) { - - lons = shapes[i].lons; - lats = shapes[i].lats; - count = shapes[i].count; - lineid = shapes[i].lineid; - if (count <= 2) - continue; - line_index = buildmap_line_find_sorted(lineid); - if (line_index >= 0) { - - // Add the shape points here - for (j = 1; j < count - 1; j++) { - buildmap_shape_add - (line_index, i, lineid, j - 1, lons[j], lats[j]); - } - } - if ((i & 0xff) == 0) { - buildmap_progress(i, numshapes); - } - - } - return 1; -} - -/** - * @brief - * @param data - * @return - */ -static int -buildmap_osm_binary_time(unsigned char *data) -{ - int itime; - time_t time; - - /* we do nothing with this (for now?) */ - read_4_byte_int(data, &itime); - - time = (time_t)itime; - - buildmap_verbose("Creation time is '%d', '%s'", - itime, asctime(gmtime(&time))); - return 0; -} - -/** - * @brief interpret the data read and collect error information - * - * known cases : - * return -2 on error 5 (The tile is too big, or contains too much data) - * convert HTTP error code in return value (negative) - * return -1 otherwise - * - * @param data string received - * @return - */ -static int -buildmap_osm_binary_error(unsigned char *data) -{ - int error = *data++; - int slen = *data++; - buildmap_error(0, "Error %d: '%.*s'", error, slen, data); - if (error == 5) - return -2; - - /* - * Interpret the HTTP error code, if present - */ - if (slen > 14 && strncasecmp((char *)data+5, "http", 4) == 0) { - error = atoi((char *)data + 14); - return -error; - } - return -1; -} - -/** - * @brief - * @param fdata - * @return - */ -int -buildmap_osm_binary_read(FILE * fdata) -{ - unsigned char *block = NULL; - int length, got; - unsigned char type; - unsigned char buf[5];; - int n; - int ret = 0, ranways = 0; - - DictionaryPrefix = buildmap_dictionary_open("prefix"); - DictionaryStreet = buildmap_dictionary_open("street"); - DictionaryType = buildmap_dictionary_open("type"); - DictionarySuffix = buildmap_dictionary_open("suffix"); - DictionaryCity = buildmap_dictionary_open("city"); - - n = 1; - - while (ret >= 0) { - buildmap_set_line(n); - got = (int)fread(buf, 1, 5, fdata); - if (got != 5) { - if (feof(fdata)) - break; - buildmap_fatal(0, "short read (length)"); - } - - /* four bytes of length */ - read_4_byte_int(buf, &length); - - buildmap_verbose("length is %ld", length); - - /* fifth byte is type */ - type = buf[4]; - buildmap_verbose("type is %c", type); - - block = realloc(block, length - 1); - buildmap_check_allocated(block); - got = (int)fread(block, 1, length - 1, fdata); - if (got != length - 1) { - if (feof(fdata)) - break; - buildmap_fatal(0, "short read (data)"); - } - - if (0 && buildmap_is_verbose()) { - fprintf(stderr, "data is"); - int i; - for (i = 0; i < length - 1; i++) { - fprintf(stderr, " %02x", block[i]); - } - fprintf(stderr, "\n"); - } - - switch (type) { - - case 'n': // node - ret += buildmap_osm_binary_node(block, length - 1); - break; - - case 'w': // way - if (buildmap_osm_binary_way(block, length - 1)) { - ret++; - ranways = 1; - } - break; - - case 'o': // omit - // ret += buildmap_osm_binary_omit(block); - break; - - case 't': // time - ret += buildmap_osm_binary_time(block); - break; - - case 'f': // failure - ret = buildmap_osm_binary_error(block); - break; - - default: - break; - } - } - - if (ranways) buildmap_osm_binary_ways_pass2(); - - if (block) free(block); - - return ret; -} Deleted: trunk/roadmap/src/buildmap_osm_binary.h =================================================================== --- trunk/roadmap/src/buildmap_osm_binary.h 2014-06-07 20:25:32 UTC (rev 2759) +++ trunk/roadmap/src/buildmap_osm_binary.h 2014-06-07 20:25:37 UTC (rev 2760) @@ -1,26 +0,0 @@ -/* buildmap_osm_binary.h - a module to read OSM Mobile Binary format - * - * LICENSE: - * - * Copyright 2007 Paul Fox - * - * This file is part of RoadMap. - * - * RoadMap is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * RoadMap is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with RoadMap; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - */ - -void buildmap_osm_binary_find_layers (void); -int buildmap_osm_binary_read(FILE * fdata); Modified: trunk/roadmap/src/buildmap_osm_common.c =================================================================== --- trunk/roadmap/src/buildmap_osm_common.c 2014-06-07 20:25:32 UTC (rev 2759) +++ trunk/roadmap/src/buildmap_osm_common.c 2014-06-07 20:25:37 UTC (rev 2760) @@ -64,7 +64,6 @@ #include "buildmap_layer.h" #include "buildmap_osm_common.h" -#include "buildmap_osm_binary.h" /* Road layers. */ Modified: trunk/roadmap/src/buildmap_osm_common.h =================================================================== --- trunk/roadmap/src/buildmap_osm_common.h 2014-06-07 20:25:32 UTC (rev 2759) +++ trunk/roadmap/src/buildmap_osm_common.h 2014-06-07 20:25:37 UTC (rev 2760) @@ -58,7 +58,6 @@ #include "buildmap_polygon.h" #include "buildmap_layer.h" -#include "buildmap_osm_binary.h" #define AREA 1 Modified: trunk/roadmap/src/buildmap_osm_main.c =================================================================== --- trunk/roadmap/src/buildmap_osm_main.c 2014-06-07 20:25:32 UTC (rev 2759) +++ trunk/roadmap/src/buildmap_osm_main.c 2014-06-07 20:25:37 UTC (rev 2760) @@ -47,7 +47,6 @@ #include "buildmap_metadata.h" #include "buildmap_layer.h" #include "buildmap_osm_common.h" -#include "buildmap_osm_binary.h" #include "buildmap_osm_text.h" #include "roadmap_osm.h" @@ -62,8 +61,6 @@ struct opt_defs options[] = { - {"format", "f", opt_string, "osmtext", - "Input format (OSM protocol)"}, {"class", "c", opt_string, "default/All", "The class file to create the map for"}, {"bits", "b", opt_int, ROADMAP_OSM_DEFAULT_BITS, @@ -89,9 +86,9 @@ {"debug", "d", opt_flag, "0", "Show debug information"}, {"inputfile", "i", opt_string, "", - "Convert this OSM file into a map"}, + "Convert arbitrary (non-quadtile) OSM xml data file"}, {"outputfile", "o", opt_string, "", - "Write output in this file"}, + "Write output to this file (use with --inputfile)"}, OPT_DEFS_END }; @@ -196,33 +193,26 @@ ( 1<<TILE_EAST | 1<<TILE_SOUTHEAST | 1<<TILE_SOUTH | 1<<TILE_SOUTHWEST ) /** - * @brief query the web server using the OSM binary protocol, and process it + * @brief use a helper command to fetch OSM data for a tile, and process it * @param tileid * @param fetcher * @return */ static int -buildmap_osm_process_one_tile (int tileid, const char *fetcher, const char *format) +buildmap_osm_process_one_tile (int tileid, const char *fetcher) { char cmd[512]; char bbox[100], *bbp; - int have = 0; - int ret, bits, trutile; + int ret, bits; RoadMapArea edges[1]; char *xmlfile; char *parent; bits = tileid2bits(tileid); - buildmap_verbose("called for tileid 0x%x, bits %d", tileid, bits); + buildmap_verbose("buildmap_osm_process_one_tile: tileid 0x%x, bits %d", + tileid, bits); - have = DEFAULT_NEIGHBORS; - - buildmap_verbose ("tileid %d, have 0x%02x", tileid, have); - - trutile = tileid2trutile(tileid); - - roadmap_osm_tileid_to_bbox(tileid, edges); /* w, s, e, n */ bbp = bbox; @@ -244,65 +234,18 @@ xmlfile = roadmap_path_join(BuildMapResult, roadmap_osm_filename(0, 1, tileid, ".osm.gz")); - snprintf(cmd, sizeof(cmd), "%s --trutile %d " - "--bits %d --have %d --bbox %s --xmlfile %s", - fetcher, trutile, bits, have, bbox, xmlfile); + snprintf(cmd, sizeof(cmd), "%s " + "--bits %d --bbox %s --xmlfile %s", + fetcher, bits, bbox, xmlfile); -// sprintf(cmd, "cat /tmp/out.xml > %s", xmlfile); - - if (strcasecmp(format, "osmbinary") == 0) { - FILE *fdata; - - buildmap_info("command is \"%s\"", cmd); - - fdata = popen(cmd, "r"); - if (fdata == NULL) { - buildmap_fatal(0, "couldn't open \"%s\"", cmd); - } - - buildmap_osm_common_find_layers(); - - ret = buildmap_osm_binary_read(fdata); - - if (pclose(fdata) != 0) { - buildmap_error(0, "problem fetching data (pclose: %s)", strerror(errno)); - ret = -1; - } - - /* - * When the OSM server is congested, it returns - * HTTP/1.1 509 Bandwidth Limit Exceeded - * - * Don't fail on this, but retry after a while. - */ - int cnt = 0; - while (ret == -509 && cnt++ < 100) { - sleep(30); - fdata = popen(cmd, "r"); - if (fdata == NULL) { - buildmap_fatal(0, "couldn't open \"%s\"", cmd); - } - - buildmap_osm_common_find_layers(); - - ret = buildmap_osm_binary_read(fdata); - - if (pclose(fdata) != 0) { - buildmap_error(0, "problem fetching data (pclose: %s), continuing", strerror(errno)); - ret = -1; - } - } - + ret = system(cmd); + if ((WEXITSTATUS(ret) != 0) || + (WIFSIGNALED(ret) && + (WTERMSIG(ret) == SIGINT || WTERMSIG(ret) == SIGQUIT))) { + ret = -1; } else { - ret = system(cmd); - if ((WEXITSTATUS(ret) != 0) || - (WIFSIGNALED(ret) && - (WTERMSIG(ret) == SIGINT || WTERMSIG(ret) == SIGQUIT))) { - ret = -1; - } else { - buildmap_osm_text_read(xmlfile, tileid, 0, 0); - ret = 0; - } + buildmap_osm_text_read(xmlfile, tileid, 0, 0); + ret = 0; } return ret; @@ -616,7 +559,7 @@ */ static int buildmap_osm_process_tiles (int *tiles, int bits, int count, - const char *fetcher, const char *format) + const char *fetcher) { int i, ret = 0; int nbits; @@ -638,7 +581,7 @@ ("processing tile %d of %d, file '%s'", i+1, count, name); roadmap_osm_filename(osmfile, 1, tileid, ".osm"); - ret = buildmap_osm_process_one_tile (tileid, fetcher, format); + ret = buildmap_osm_process_one_tile (tileid, fetcher); if (ret == -2) { /* we got a "tile too big" error. try for four @@ -900,7 +843,6 @@ int listonly; int tileid; char *class, *latlonarg, *fetcher, *inputfile; - char *format; BuildMapResult = strdup(roadmap_path_preferred("maps")); /* default. */ @@ -912,7 +854,6 @@ error = opt_val("verbose", &verbose) || opt_val("debug", &debug) || opt_val("quiet", &quiet) || - opt_val("format", &format) || opt_val("class", &class) || opt_val("bits", &osm_bits) || opt_val("replace", &BuildMapReplaceAll) || @@ -941,13 +882,6 @@ exit ( buildmap_osm_encode(encode, osm_bits) ); } - if (strcasecmp(format, "osmtext") != 0 && - strcasecmp(format, "osmbinary") != 0) { - fprintf (stderr, - "unsupported protocol input format %s", format); - exit(1); - } - if (!*fetcher) { usage (argv[0], "missing fetcher command option"); } @@ -1007,7 +941,7 @@ } error = buildmap_osm_process_tiles - (tileslist, osm_bits, count, fetcher, format); + (tileslist, osm_bits, count, fetcher); free (tileslist); Modified: trunk/roadmap/src/rdm_osm_fetch_tile =================================================================== --- trunk/roadmap/src/rdm_osm_fetch_tile 2014-06-07 20:25:32 UTC (rev 2759) +++ trunk/roadmap/src/rdm_osm_fetch_tile 2014-06-07 20:25:37 UTC (rev 2760) @@ -18,8 +18,8 @@ #server="overpass.osm.rambler.ru/cgi/xapi?*" -if ! opts="$(getopt -o t:b:h:B:x: \ - -l trutile:,bits:,have:,bbox:,xmlfile: -n $program -- $@)" +if ! opts="$(getopt -o b:B:x: \ + -l bits:,bbox:,xmlfile: -n $program -- $@)" then usage fi @@ -32,8 +32,6 @@ do : \$1 is $1 case $1 in - -t|--trutile) trutile=$2; shift 2 ;; - -h|--have) have=$2; shift 2 ;; -b|--bits) bits=$2; shift 2 ;; -B|--bbox) bbox=$2; shift 2 ;; -x|--xmlfile) xmlfile=$2; shift 2 ;; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pg...@us...> - 2014-06-07 20:25:34
|
Revision: 2759 http://sourceforge.net/p/roadmap/code/2759 Author: pgf Date: 2014-06-07 20:25:32 +0000 (Sat, 07 Jun 2014) Log Message: ----------- rdm_osm_fetch_tile: add local look-aside for existing osm data Modified Paths: -------------- trunk/roadmap/src/rdm_osm_fetch_tile Modified: trunk/roadmap/src/rdm_osm_fetch_tile =================================================================== --- trunk/roadmap/src/rdm_osm_fetch_tile 2014-06-07 20:25:27 UTC (rev 2758) +++ trunk/roadmap/src/rdm_osm_fetch_tile 2014-06-07 20:25:32 UTC (rev 2759) @@ -56,8 +56,22 @@ *.gz) want_compressed=1 ;; esac +# for development, convenient to be able to get the .osm from +# somewhere on the local system, when maps targetted for somewhere +# else. +localstore=/usr/local/share/roadmap/newquads +want=qt$bits/${xmlfile##*/qt$bits} + +if [ -e "$localstore/$want" ] +then + cp -a $localstore/$want $xmlfile + exit +fi + url="http://$server$bbox$query$me" +echo "Fetching from $url" + if [ "$want_compressed" ] then wget_opt="--header=Accept-Encoding: gzip" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pg...@us...> - 2014-06-07 20:25:30
|
Revision: 2758 http://sourceforge.net/p/roadmap/code/2758 Author: pgf Date: 2014-06-07 20:25:27 +0000 (Sat, 07 Jun 2014) Log Message: ----------- buildmap_osm_text: save hamlets, in addition to towns, villages, cities Modified Paths: -------------- trunk/roadmap/src/buildmap_osm_text.c Modified: trunk/roadmap/src/buildmap_osm_text.c =================================================================== --- trunk/roadmap/src/buildmap_osm_text.c 2014-06-07 20:25:23 UTC (rev 2757) +++ trunk/roadmap/src/buildmap_osm_text.c 2014-06-07 20:25:27 UTC (rev 2758) @@ -278,6 +278,7 @@ if (ni.NodeFakeFips) { if (ni.NodePlace && (strcmp(ni.NodePlace, "town") == 0 || strcmp(ni.NodePlace, "village") == 0 + || strcmp(ni.NodePlace, "hamlet") == 0 || strcmp(ni.NodePlace, "city") == 0)) { /* We have a town, process it */ @@ -594,20 +595,31 @@ if (ni.NodePostalCode) free(ni.NodePostalCode); ni.NodePostalCode = strdup(tagv); - if (catalog) saveInterestingNode(ni.NodeId); + if (catalog) { + saveInterestingNode(ni.NodeId); + buildmap_verbose("saving node info k %s v %s", tagk, tagv); + } } else if (strcmp(tagk, "place") == 0) { /* <tag k="place" v="town"/> */ if (ni.NodePlace) free(ni.NodePlace); ni.NodePlace = strdup(tagv); - if (catalog) saveInterestingNode(ni.NodeId); + if (catalog) { + saveInterestingNode(ni.NodeId); + buildmap_verbose("saving node info k %s v %s", tagk, tagv); + } } else if (strcmp(tagk, "name") == 0) { /* <tag k="name" v="Herent"/> */ if (ni.NodeTownName) free(ni.NodeTownName); ni.NodeTownName = FromXmlAndDup(tagv); - if (catalog) saveInterestingNode(ni.NodeId); - } + if (catalog) { + saveInterestingNode(ni.NodeId); + buildmap_verbose("saving node info k %s v %s", tagk, tagv); + } + } else { + buildmap_debug("dropping node info k %s v%s", tagk, tagv); + } } /** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pg...@us...> - 2014-06-07 20:25:25
|
Revision: 2757 http://sourceforge.net/p/roadmap/code/2757 Author: pgf Date: 2014-06-07 20:25:23 +0000 (Sat, 07 Jun 2014) Log Message: ----------- buildmap_osm_text: discard territorial (marine) borders Modified Paths: -------------- trunk/roadmap/src/buildmap_osm_text.c Modified: trunk/roadmap/src/buildmap_osm_text.c =================================================================== --- trunk/roadmap/src/buildmap_osm_text.c 2014-06-07 20:25:19 UTC (rev 2756) +++ trunk/roadmap/src/buildmap_osm_text.c 2014-06-07 20:25:23 UTC (rev 2757) @@ -87,6 +87,7 @@ the table flags */ int WayIsOneWay; /**< is this way one direction only */ int WayAdminLevel; /**< boundaries */ + int WayTerritorial; /* is this a territorial boundary? */ int WayCoast; /**< coastline */ int WayIsInteresting; /**< this way is interesting for RoadMap */ } wi; @@ -663,6 +664,9 @@ } } else if (strcasecmp(tag, "admin_level") == 0) { wi.WayAdminLevel = atoi(value); + } else if (strcasecmp(tag, "border_type") == 0 || + strcasecmp(tag, "boundary_type") == 0) { + wi.WayTerritorial = !strncasecmp(value, "territorial", 11); } else if (strcasecmp(tag, "natural") == 0 && strcasecmp(value, "coastline") == 0) { wi.WayCoast = 1; @@ -719,7 +723,8 @@ wi.WayLayer = l_shoreline; } else if (wi.WayAdminLevel) { /* national == 2, state == 4, ignore lesser boundaries */ - if (wi.WayAdminLevel > 4) { + /* also ignore territorial (marine) borders */ + if (wi.WayAdminLevel > 4 || wi.WayTerritorial) { wi.WayIsInteresting = 0; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pg...@us...> - 2014-06-07 20:25:21
|
Revision: 2756 http://sourceforge.net/p/roadmap/code/2756 Author: pgf Date: 2014-06-07 20:25:19 +0000 (Sat, 07 Jun 2014) Log Message: ----------- app_a02.txt: add numerology for world boundaries Modified Paths: -------------- trunk/roadmap/src/app_a02.txt Modified: trunk/roadmap/src/app_a02.txt =================================================================== --- trunk/roadmap/src/app_a02.txt 2014-06-07 20:25:14 UTC (rev 2755) +++ trunk/roadmap/src/app_a02.txt 2014-06-07 20:25:19 UTC (rev 2756) @@ -3238,6 +3238,10 @@ 81 003 Alaska State Boundaries SB 81 004 Hawaii State Boundaries SB 81 061 Canadian Provincial Boundaries SB +81 070 World Boundaries SB +81 071 World Boundaries SB +81 072 World Boundaries SB +81 073 World Boundaries SB 82 001 Placenames PN 83 010 DCW Europe and North Asia DW 83 011 DCW Europe and North Asia DW This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pg...@us...> - 2014-06-07 20:25:17
|
Revision: 2755 http://sourceforge.net/p/roadmap/code/2755 Author: pgf Date: 2014-06-07 20:25:14 +0000 (Sat, 07 Jun 2014) Log Message: ----------- create a basemap on/off menu entry this is really support for en/disabling "county" (usc-style) maps. since most maps are quadtiles now, this is a bit of a hack to provide a "switchable" basemap of county/state outlines. the naturalearthdata.com shapefiles provide a good basemap. Modified Paths: -------------- trunk/roadmap/src/roadmap_locator.c trunk/roadmap/src/roadmap_locator.h trunk/roadmap/src/roadmap_start.c Modified: trunk/roadmap/src/roadmap_locator.c =================================================================== --- trunk/roadmap/src/roadmap_locator.c 2014-06-07 20:25:09 UTC (rev 2754) +++ trunk/roadmap/src/roadmap_locator.c 2014-06-07 20:25:14 UTC (rev 2755) @@ -71,6 +71,7 @@ static int RoadMapActiveCounty; +static int RoadMapUseCounties = 1; static roadmap_db_model *RoadMapUsModel; static roadmap_db_model *RoadMapCountyModel; @@ -83,7 +84,14 @@ static RoadMapInstaller RoadMapDownload = roadmap_locator_no_download; +void +roadmap_locator_use_counties(int yesno) +{ + RoadMapUseCounties = yesno; +} + + /* * @brief */ @@ -330,7 +338,10 @@ roadmap_locator_configure(); if (RoadMapCountyCache == NULL) return 0; - count = roadmap_county_count(); + if (RoadMapUseCounties) + count = roadmap_county_count(); + else + count = 0; /* note that this can also be resized during tile splitting in * roadmap_osm.c -- see usage of roadmap_osm_tilelist in that file. @@ -371,7 +382,8 @@ count = roadmap_locator_allocate (fipslistp); if (count < 0) return 0; - count = roadmap_county_by_position (position, *fipslistp, count); + if (RoadMapUseCounties) + count = roadmap_county_by_position (position, *fipslistp, count); roadmap_math_get_focus (&focus); Modified: trunk/roadmap/src/roadmap_locator.h =================================================================== --- trunk/roadmap/src/roadmap_locator.h 2014-06-07 20:25:09 UTC (rev 2754) +++ trunk/roadmap/src/roadmap_locator.h 2014-06-07 20:25:14 UTC (rev 2755) @@ -53,5 +53,7 @@ int roadmap_locator_get_decluttered(int fips); void roadmap_locator_set_decluttered(int fips); +void roadmap_locator_use_counties(int yesno); + #endif // _ROADMAP_LOCATOR__H_ Modified: trunk/roadmap/src/roadmap_start.c =================================================================== --- trunk/roadmap/src/roadmap_start.c 2014-06-07 20:25:09 UTC (rev 2754) +++ trunk/roadmap/src/roadmap_start.c 2014-06-07 20:25:14 UTC (rev 2755) @@ -536,6 +536,13 @@ roadmap_start_request_repaint (ROADMAP_MAP, priority); } +void roadmap_start_toggle_basemap(void) +{ + static int basemap = 1; + basemap = !basemap; + roadmap_locator_use_counties(basemap); + roadmap_start_request_repaint_map(REPAINT_NOW); +} /* The RoadMap menu and toolbar items: ----------------------------------- */ #ifdef ANDROID @@ -711,6 +718,9 @@ {"toggleview", "2D/3D View", "M", NULL, "Toggle view mode 2D / 3D", NULL, roadmap_screen_toggle_view_mode}, + {"togglebasemap", "Basemap On/Off", "M", NULL, + "Turn the basemap on or off", NULL, roadmap_start_toggle_basemap}, + {"togglelabels", "Show/Hide Street Labels", "Labels", NULL, "Show or Hide the names of streets", NULL, roadmap_screen_toggle_labels}, @@ -954,6 +964,7 @@ ROADMAP_SUBMENU "Display modes...", + "togglebasemap", "togglelabels", "toggleorientation", "toggleview", This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |