Repository: 2gis/mapsapi Branch: master Commit: f7ce5f1182c6 Files: 487 Total size: 3.5 MB Directory structure: gitextract_whh8pbvz/ ├── .csscomb.json ├── .editorconfig ├── .eslintrc ├── .github/ │ └── workflows/ │ └── test.yml ├── .gitignore ├── .npmignore ├── CONTRIBUTING.md ├── LICENSE ├── LICENSE_EN ├── README.md ├── app/ │ ├── config.js │ ├── index.html │ ├── index.js │ └── loader.js ├── assets/ │ ├── cluster_realworld.js │ └── heat_realworld.js ├── config.main.json ├── functional-tests/ │ ├── .gitignore │ ├── README.md │ ├── classes/ │ │ ├── WAPI/ │ │ │ ├── __init__.py │ │ │ ├── dataWorker.py │ │ │ └── request.py │ │ ├── __init__.py │ │ ├── components/ │ │ │ ├── __init__.py │ │ │ ├── balloon.py │ │ │ ├── callout.py │ │ │ ├── component.py │ │ │ ├── map.py │ │ │ ├── mapsapi_sources.py │ │ │ ├── marker.py │ │ │ ├── page.py │ │ │ └── zoom_control.py │ │ ├── exceptions/ │ │ │ ├── __init__.py │ │ │ └── exceptions.py │ │ ├── mapsapi_base_test.py │ │ └── util/ │ │ ├── __init__.py │ │ ├── decorators.py │ │ ├── geo_types_map.py │ │ ├── link_generator.py │ │ ├── misc.py │ │ ├── scripts.py │ │ ├── transport_types_map.py │ │ └── unescape.py │ ├── config/ │ │ ├── __init__.py │ │ ├── config.ini │ │ └── config.my.ini │ ├── pep8 │ ├── pep8-hook.sh │ ├── prepare.sh │ ├── run.sh │ ├── template_render.sh │ ├── templates/ │ │ ├── __init__.py │ │ ├── base.html │ │ └── content.py │ └── tests/ │ ├── __init__.py │ ├── balloon_test.py │ ├── bounds_test.py │ ├── event_test.py │ ├── firm_callout_test.py │ ├── geo_clicker_test.py │ ├── loader_test.py │ ├── marker_test.py │ ├── ruler_test.py │ └── zoom_test.py ├── gulp/ │ ├── deps/ │ │ ├── build.html │ │ ├── deps.js │ │ ├── index.js │ │ └── packs.js │ ├── sprite-template.mustache │ ├── tasks/ │ │ ├── build.js │ │ ├── buildLeaflet.js │ │ ├── buildScripts.js │ │ ├── buildStyles.js │ │ ├── buildTest.js │ │ ├── clean.js │ │ ├── collectImagesStats.js │ │ ├── collectImagesUsageStats.js │ │ ├── concatScripts.js │ │ ├── copyAssets.js │ │ ├── copyImg.js │ │ ├── copyIndexPage.js │ │ ├── dev.js │ │ ├── doc.js │ │ ├── generateSprites.js │ │ ├── imageMinify.js │ │ ├── lint.js │ │ ├── lintCSS.js │ │ ├── lintJS.js │ │ ├── loadProjectList.js │ │ ├── loader.js │ │ ├── rebuildStyles.js │ │ ├── server.js │ │ ├── test.js │ │ └── watch.js │ └── util/ │ ├── buildCSS.js │ ├── buildEnd.js │ ├── csslint/ │ │ ├── gulp-csslint.js │ │ └── lib/ │ │ ├── csslint.js │ │ └── parserlib.js │ ├── destCSS.js │ ├── error.js │ ├── gendoc.js │ ├── projectList.js │ ├── stat.js │ └── templateStream.js ├── gulpfile.js ├── package.json ├── src/ │ ├── DGAjax/ │ │ ├── demo/ │ │ │ └── index.html │ │ ├── src/ │ │ │ └── DGAjax.js │ │ └── test/ │ │ └── DGAjaxSpec.js │ ├── DGAttribution/ │ │ ├── lang/ │ │ │ ├── ar.js │ │ │ ├── cs.js │ │ │ ├── en.js │ │ │ ├── es.js │ │ │ ├── it.js │ │ │ └── ru.js │ │ ├── skin/ │ │ │ └── basic/ │ │ │ └── less/ │ │ │ └── dg-mapcopyright.less │ │ ├── src/ │ │ │ └── DGAttribution.js │ │ ├── templates/ │ │ │ └── copyright.dust │ │ └── test/ │ │ └── DGAttributionSpec.js │ ├── DGCore/ │ │ ├── demo/ │ │ │ └── index.html │ │ ├── skin/ │ │ │ └── basic/ │ │ │ └── less/ │ │ │ └── dg-core.less │ │ └── src/ │ │ ├── DGCore.js │ │ ├── DGplugin.js │ │ └── DGthen.js │ ├── DGCustomization/ │ │ ├── skin/ │ │ │ └── basic/ │ │ │ ├── less/ │ │ │ │ ├── dg-customization.less │ │ │ │ ├── leaflet.ie.less │ │ │ │ └── leaflet.less │ │ │ └── skin.config.js │ │ ├── src/ │ │ │ ├── DGCustomization.js │ │ │ ├── DGMap.ApiKeyValidator.js │ │ │ ├── DGMap.BaseLayer.js │ │ │ ├── DGMap.Drag.js │ │ │ ├── DGMap.TilesCheck.js │ │ │ ├── DGMap.js │ │ │ ├── DGMobileImprove.js │ │ │ └── DGPolyUtil.js │ │ └── test/ │ │ ├── CanvasSpec.js │ │ ├── DGCustomizationSpec.js │ │ ├── DGMap.BaseLayerSpec.js │ │ ├── DGMapSpec.js │ │ ├── GridLayerSpec.js │ │ ├── Map.DragSpec.js │ │ ├── MapSpec.js │ │ ├── PathSpec.js │ │ ├── PopupSpec.js │ │ ├── UtilSpec.js │ │ └── ValidatorApiKeySpec.js │ ├── DGDust/ │ │ ├── doc/ │ │ │ └── DGDust.md │ │ ├── src/ │ │ │ └── DGDust.js │ │ └── test/ │ │ └── DGDustSpec.js │ ├── DGEntrance/ │ │ ├── demo/ │ │ │ └── index.html │ │ ├── src/ │ │ │ ├── DGAnimation.js │ │ │ ├── DGArrowPathTransform.js │ │ │ ├── DGArrowTipTransform.js │ │ │ ├── DGBezierCurves.js │ │ │ ├── DGComplexPath.js │ │ │ ├── DGEntrance.js │ │ │ ├── DGEntranceArrow.js │ │ │ ├── DGEntranceArrowShape.js │ │ │ ├── DGMetric.js │ │ │ ├── DGRenderer.js │ │ │ └── DGVertexTransform.js │ │ └── test/ │ │ ├── DGArrowShapeSpec.js │ │ ├── DGBezierSpec.js │ │ ├── DGMetricSpec.js │ │ ├── DGTransformSpec.js │ │ └── EntranceSpec.js │ ├── DGFullScreen/ │ │ ├── demo/ │ │ │ └── index.html │ │ ├── lang/ │ │ │ ├── ar.js │ │ │ ├── cs.js │ │ │ ├── en.js │ │ │ ├── es.js │ │ │ ├── it.js │ │ │ └── ru.js │ │ ├── skin/ │ │ │ ├── basic/ │ │ │ │ └── less/ │ │ │ │ ├── dg-control-round.less │ │ │ │ └── dg-fullscreen.ie.less │ │ │ ├── dark/ │ │ │ │ └── less/ │ │ │ │ └── dg-control-round.less │ │ │ └── light/ │ │ │ └── less/ │ │ │ └── dg-control-round.less │ │ ├── src/ │ │ │ ├── DGFullScreen.js │ │ │ ├── DGScreenfull.js │ │ │ └── LegacyFullScreen.js │ │ └── test/ │ │ └── DGFullScreenSpec.js │ ├── DGGeoclicker/ │ │ ├── demo/ │ │ │ └── index.html │ │ ├── lang/ │ │ │ ├── cs.js │ │ │ ├── en.js │ │ │ ├── es.js │ │ │ ├── it.js │ │ │ └── ru.js │ │ ├── skin/ │ │ │ ├── basic/ │ │ │ │ └── less/ │ │ │ │ ├── dg-building-callout.less │ │ │ │ ├── dg-firm-card.less │ │ │ │ ├── dg-link.less │ │ │ │ ├── dg-map-geoclicker.less │ │ │ │ ├── dg-popup.ie.less │ │ │ │ ├── dg-popup.less │ │ │ │ ├── dg-preloader.less │ │ │ │ ├── dg-schedule.ie.less │ │ │ │ └── dg-schedule.less │ │ │ ├── dark/ │ │ │ │ └── less/ │ │ │ │ ├── dg-building-callout.less │ │ │ │ ├── dg-firm-card.less │ │ │ │ ├── dg-map-geoclicker.less │ │ │ │ ├── dg-popup.ie.less │ │ │ │ ├── dg-popup.less │ │ │ │ ├── dg-schedule.ie.less │ │ │ │ └── dg-schedule.less │ │ │ └── light/ │ │ │ └── less/ │ │ │ ├── dg-building-callout.less │ │ │ ├── dg-firm-card.less │ │ │ ├── dg-map-geoclicker.less │ │ │ ├── dg-popup.less │ │ │ ├── dg-schedule.ie.less │ │ │ └── dg-schedule.less │ │ ├── src/ │ │ │ ├── ClampHelper.js │ │ │ ├── Controller.js │ │ │ ├── DGGeoclicker.js │ │ │ ├── View.js │ │ │ ├── handler/ │ │ │ │ ├── ApiError.js │ │ │ │ ├── CityArea.js │ │ │ │ ├── Default.js │ │ │ │ ├── Handler.js │ │ │ │ ├── House.View.js │ │ │ │ ├── House.js │ │ │ │ ├── POI.js │ │ │ │ └── Sight.js │ │ │ └── provider/ │ │ │ ├── CatalogApi.js │ │ │ └── Provider.js │ │ ├── templates/ │ │ │ ├── cityarea.dust │ │ │ ├── firmCardAddr.dust │ │ │ ├── firmCardContacts.dust │ │ │ ├── firmCardHeader.dust │ │ │ ├── firmCardRubric.dust │ │ │ ├── firmCardSchedule.dust │ │ │ ├── firmlistItem.dust │ │ │ ├── frimCardPayments.dust │ │ │ ├── house.dust │ │ │ ├── loader.dust │ │ │ ├── popupFooter.dust │ │ │ ├── popupFooterBtns.dust │ │ │ ├── popupHeader.dust │ │ │ └── sight.dust │ │ └── test/ │ │ ├── CatalogApiSpec.js │ │ ├── ControllerSpec.js │ │ └── GeoclickerSpec.js │ ├── DGLabel/ │ │ ├── demo/ │ │ │ └── index.html │ │ ├── skin/ │ │ │ ├── basic/ │ │ │ │ └── less/ │ │ │ │ └── dg-label.less │ │ │ ├── dark/ │ │ │ │ └── less/ │ │ │ │ └── dg-label.less │ │ │ └── light/ │ │ │ └── less/ │ │ │ └── dg-label.less │ │ ├── src/ │ │ │ ├── DGLabel.Layer.js │ │ │ ├── DGLabel.js │ │ │ ├── Entrance.DGLabel.js │ │ │ ├── Marker.DGLabel.js │ │ │ └── Path.DGLabel.js │ │ └── test/ │ │ └── DGLabelSpec.js │ ├── DGLocale/ │ │ ├── demo/ │ │ │ └── index.html │ │ ├── src/ │ │ │ ├── DGDictionary.js │ │ │ └── DGLocale.js │ │ └── test/ │ │ └── DGLocaleSpec.js │ ├── DGLocation/ │ │ ├── demo/ │ │ │ └── index.html │ │ ├── lang/ │ │ │ ├── ar.js │ │ │ ├── cs.js │ │ │ ├── en.js │ │ │ ├── es.js │ │ │ ├── it.js │ │ │ └── ru.js │ │ ├── skin/ │ │ │ ├── basic/ │ │ │ │ └── less/ │ │ │ │ ├── dg-control-round.less │ │ │ │ └── dg-location.less │ │ │ ├── dark/ │ │ │ │ └── less/ │ │ │ │ └── dg-control-round.less │ │ │ └── light/ │ │ │ └── less/ │ │ │ └── dg-control-round.less │ │ ├── src/ │ │ │ └── DGLocation.js │ │ └── test/ │ │ └── DGLocationSpec.js │ ├── DGMeta/ │ │ ├── src/ │ │ │ ├── DGMeta.Layer.js │ │ │ └── DGMeta.Origin.js │ │ └── test/ │ │ ├── DGMetaSpec.js │ │ └── PolyUtilContainsSpec.js │ ├── DGMuseum/ │ │ ├── skin/ │ │ │ └── basic/ │ │ │ └── less/ │ │ │ └── dg-museum.less │ │ └── src/ │ │ └── DGMuseum.js │ ├── DGPoi/ │ │ ├── demo/ │ │ │ └── index.html │ │ ├── src/ │ │ │ └── DGPoi.js │ │ └── test/ │ │ └── DGPoiSpec.js │ ├── DGPopup/ │ │ ├── skin/ │ │ │ ├── basic/ │ │ │ │ ├── less/ │ │ │ │ │ ├── dg-popup.less │ │ │ │ │ ├── leaflet.ie.less │ │ │ │ │ ├── leaflet.less │ │ │ │ │ └── scroller.less │ │ │ │ └── skin.config.js │ │ │ ├── dark/ │ │ │ │ └── less/ │ │ │ │ ├── dg-popup.less │ │ │ │ ├── leaflet.ie.less │ │ │ │ ├── leaflet.less │ │ │ │ └── scroller.less │ │ │ └── light/ │ │ │ └── less/ │ │ │ ├── dg-popup.less │ │ │ ├── leaflet.ie.less │ │ │ ├── leaflet.less │ │ │ └── scroller.less │ │ ├── src/ │ │ │ └── DGPopup.js │ │ └── test/ │ │ └── DGPopupSpec.js │ ├── DGProjectDetector/ │ │ ├── demo/ │ │ │ └── index.html │ │ ├── src/ │ │ │ └── DGProjectDetector.js │ │ └── test/ │ │ ├── ProjectDetectorInSpec.js │ │ ├── ProjectDetectorInitSpec.js │ │ ├── ProjectDetectorOutOfWorldSpec.js │ │ └── ProjectDetectorUnderSpec.js │ ├── DGRoundControl/ │ │ ├── skin/ │ │ │ ├── basic/ │ │ │ │ └── less/ │ │ │ │ └── dg-control-round.less │ │ │ ├── dark/ │ │ │ │ └── less/ │ │ │ │ └── dg-control-round.less │ │ │ └── light/ │ │ │ └── less/ │ │ │ └── dg-control-round.less │ │ ├── src/ │ │ │ └── DGRoundControl.js │ │ └── test/ │ │ └── DGRoundControlSpec.js │ ├── DGRuler/ │ │ ├── demo/ │ │ │ └── index.html │ │ ├── lang/ │ │ │ ├── ar.js │ │ │ ├── cs.js │ │ │ ├── en.js │ │ │ ├── es.js │ │ │ ├── it.js │ │ │ └── ru.js │ │ ├── skin/ │ │ │ └── basic/ │ │ │ └── less/ │ │ │ ├── dg-ruler.ie.less │ │ │ └── dg-ruler.less │ │ ├── src/ │ │ │ ├── GeometryStyles.js │ │ │ ├── LayeredMarker.js │ │ │ └── Ruler.js │ │ └── test/ │ │ └── RulerSpec.js │ ├── DGRulerControl/ │ │ ├── demo/ │ │ │ └── index.html │ │ ├── lang/ │ │ │ ├── ar.js │ │ │ ├── cs.js │ │ │ ├── en.js │ │ │ ├── es.js │ │ │ ├── it.js │ │ │ └── ru.js │ │ ├── skin/ │ │ │ └── basic/ │ │ │ └── less/ │ │ │ └── dg-control-round.less │ │ ├── src/ │ │ │ └── Control.Ruler.js │ │ └── test/ │ │ └── DGRulerControlSpec.js │ ├── DGTraffic/ │ │ ├── demo/ │ │ │ └── index.html │ │ ├── lang/ │ │ │ ├── ar.js │ │ │ ├── cs.js │ │ │ ├── en.js │ │ │ ├── es.js │ │ │ ├── it.js │ │ │ └── ru.js │ │ ├── src/ │ │ │ └── DGTraffic.js │ │ └── test/ │ │ └── DGTrafficSpec.js │ ├── DGTrafficControl/ │ │ ├── demo/ │ │ │ └── index.html │ │ ├── lang/ │ │ │ ├── ar.js │ │ │ ├── cs.js │ │ │ ├── en.js │ │ │ ├── es.js │ │ │ ├── it.js │ │ │ └── ru.js │ │ ├── skin/ │ │ │ └── basic/ │ │ │ └── less/ │ │ │ ├── dg-control-round.less │ │ │ ├── dg-traffic-control.ie.less │ │ │ └── dg-traffic-control.less │ │ ├── src/ │ │ │ └── Control.Traffic.js │ │ └── test/ │ │ └── TrafficControlSpec.js │ ├── DGWkt/ │ │ ├── DGWkt.js │ │ ├── demo/ │ │ │ └── index.html │ │ └── test/ │ │ ├── DGWktSpec.js │ │ ├── DGWktToGeoJSONSpec.js │ │ └── DGWktToLatLngsSpec.js │ ├── DGZoomControl/ │ │ ├── lang/ │ │ │ ├── ar.js │ │ │ ├── cs.js │ │ │ ├── en.js │ │ │ ├── es.js │ │ │ ├── it.js │ │ │ └── ru.js │ │ ├── skin/ │ │ │ ├── basic/ │ │ │ │ └── less/ │ │ │ │ └── dg-zoom-control.less │ │ │ ├── dark/ │ │ │ │ └── less/ │ │ │ │ └── dg-zoom-control.less │ │ │ └── light/ │ │ │ └── less/ │ │ │ └── dg-zoom-control.less │ │ ├── src/ │ │ │ └── DGZoomControl.js │ │ └── test/ │ │ └── DGZoomControlSpec.js │ ├── copyright.js │ ├── doc/ │ │ ├── en/ │ │ │ ├── examples/ │ │ │ │ ├── base.md │ │ │ │ ├── bounds.md │ │ │ │ ├── controls.md │ │ │ │ ├── events.md │ │ │ │ ├── external-modules.md │ │ │ │ ├── geojson.md │ │ │ │ ├── markers.md │ │ │ │ ├── popups.md │ │ │ │ ├── vector-layers.md │ │ │ │ └── wkt.md │ │ │ ├── manual/ │ │ │ │ ├── base-classes.md │ │ │ │ ├── basic-types.md │ │ │ │ ├── controls.md │ │ │ │ ├── dg-ajax.md │ │ │ │ ├── dg-entrance.md │ │ │ │ ├── dg-external-modules.md │ │ │ │ ├── dg-label.md │ │ │ │ ├── dg-loading.md │ │ │ │ ├── dg-locale.md │ │ │ │ ├── dg-metalayers.md │ │ │ │ ├── dg-project-detector.md │ │ │ │ ├── dg-ruler.md │ │ │ │ ├── dg-traffic.md │ │ │ │ ├── dg-wkt.md │ │ │ │ ├── dom-utils.md │ │ │ │ ├── map.md │ │ │ │ ├── markers.md │ │ │ │ ├── other-layers.md │ │ │ │ ├── popup.md │ │ │ │ ├── raster-layers.md │ │ │ │ ├── utils.md │ │ │ │ └── vector-layers.md │ │ │ └── quickstart/ │ │ │ └── quickstart.md │ │ └── ru/ │ │ ├── examples/ │ │ │ ├── base.md │ │ │ ├── bounds.md │ │ │ ├── controls.md │ │ │ ├── events.md │ │ │ ├── external-modules.md │ │ │ ├── geojson.md │ │ │ ├── markers.md │ │ │ ├── popups.md │ │ │ ├── vector-layers.md │ │ │ └── wkt.md │ │ ├── manual/ │ │ │ ├── base-classes.md │ │ │ ├── basic-types.md │ │ │ ├── controls.md │ │ │ ├── dg-ajax.md │ │ │ ├── dg-entrance.md │ │ │ ├── dg-external-modules.md │ │ │ ├── dg-label.md │ │ │ ├── dg-loading.md │ │ │ ├── dg-locale.md │ │ │ ├── dg-metalayers.md │ │ │ ├── dg-migration.md │ │ │ ├── dg-project-detector.md │ │ │ ├── dg-ruler.md │ │ │ ├── dg-traffic.md │ │ │ ├── dg-wkt.md │ │ │ ├── dom-utils.md │ │ │ ├── map.md │ │ │ ├── markers.md │ │ │ ├── other-layers.md │ │ │ ├── popup.md │ │ │ ├── raster-layers.md │ │ │ ├── utils.md │ │ │ └── vector-layers.md │ │ └── quickstart/ │ │ └── quickstart.md │ ├── less/ │ │ ├── images-usage-statistics.less │ │ ├── mixins.ie8.less │ │ ├── mixins.images-usage-statistics.less │ │ └── mixins.less │ └── menu.json ├── test/ │ ├── after.js │ ├── excludedTests.js │ ├── karma.conf.js │ └── test.js └── vendors/ ├── baron/ │ ├── Gruntfile.js │ ├── baron.css │ ├── baron.js │ ├── changelog.md │ ├── demo/ │ │ ├── baron.full.js │ │ ├── index.html │ │ ├── script.js │ │ └── style.css │ ├── js/ │ │ ├── bean.js │ │ ├── bonzo.js │ │ ├── jquery-1.9.0.js │ │ └── qwery.js │ ├── package.json │ ├── readme.md │ ├── src/ │ │ ├── controls.js │ │ ├── core.js │ │ ├── fix.js │ │ ├── pull.js │ │ └── test.js │ ├── tasks/ │ │ └── mocha-phantomjs.js │ └── test/ │ ├── core.auto.html │ ├── index.html │ ├── script.js │ ├── style.css │ └── tests.js ├── firmcard/ │ ├── doc/ │ │ └── Schedule.md │ ├── src/ │ │ ├── Dictionary.js │ │ ├── FirmCard.DataHelper.js │ │ ├── FirmCard.js │ │ ├── FirmList.js │ │ ├── Schedule.js │ │ └── vendors/ │ │ ├── momentjs/ │ │ │ └── lang/ │ │ │ ├── moment.cs.js │ │ │ ├── moment.it.js │ │ │ └── moment.ru.js │ │ └── underscore1.5.1.js │ └── test/ │ ├── FirmCardSpec.html │ ├── FirmCardSpec.js │ ├── FirmListSpec.html │ ├── FirmListSpec.js │ ├── demoData.js │ ├── expect.js │ ├── mocha.css │ ├── mocha.js │ └── sinon.js └── polyfills/ ├── es5.js └── promise.js ================================================ FILE CONTENTS ================================================ ================================================ FILE: .csscomb.json ================================================ { "always-semicolon": true, "block-indent": false, "color-case": "lower", "color-shorthand": true, "element-case": false, "eof-newline": false, "leading-zero": false, "quotes": "single", "space-after-colon": false, "space-after-combinator": " ", "space-after-opening-brace": false, "space-after-selector-delimiter": false, "space-before-closing-brace": false, "space-before-colon": "", "space-before-combinator": " ", "space-before-opening-brace": false, "space-before-selector-delimiter": "", "space-between-declarations": false, "strip-spaces": true, "unitless-zero": true, "vendor-prefix-align": false, "sort-order": [[ "position", "top", "right", "bottom", "left", "z-index", "display", "visibility", "-webkit-flex-direction", "-moz-flex-direction", "-ms-flex-direction", "-o-flex-direction", "flex-direction", "-webkit-flex-order", "-moz-flex-order", "-ms-flex-order", "-o-flex-order", "flex-order", "-webkit-flex-pack", "-moz-flex-pack", "-ms-flex-pack", "-o-flex-pack", "flex-pack", "float", "clear", "-webkit-flex-align", "-moz-flex-align", "-ms-flex-align", "-o-flex-align", "flex-align", "overflow", "-ms-overflow-x", "-ms-overflow-y", "overflow-x", "overflow-y", "-webkit-overflow-scrolling", "clip", "-webkit-box-sizing", "-moz-box-sizing", "box-sizing", "margin", "margin-top", "margin-right", "margin-bottom", "margin-left", "padding", "padding-top", "padding-right", "padding-bottom", "padding-left", "min-width", "min-height", "max-width", "max-height", "width", "height", "outline", "outline-width", "outline-style", "outline-color", "outline-offset", "border", "border-spacing", "border-collapse", "border-width", "border-style", "border-color", "border-top", "border-top-width", "border-top-style", "border-top-color", "border-right", "border-right-width", "border-right-style", "border-right-color", "border-bottom", "border-bottom-width", "border-bottom-style", "border-bottom-color", "border-left", "border-left-width", "border-left-style", "border-left-color", "-webkit-border-radius", "-moz-border-radius", "border-radius", "-webkit-border-top-left-radius", "-moz-border-radius-topleft", "border-top-left-radius", "-webkit-border-top-right-radius", "-moz-border-radius-topright", "border-top-right-radius", "-webkit-border-bottom-right-radius", "-moz-border-radius-bottomright", "border-bottom-right-radius", "-webkit-border-bottom-left-radius", "-moz-border-radius-bottomleft", "border-bottom-left-radius", "-webkit-border-image", "-moz-border-image", "-o-border-image", "border-image", "-webkit-border-image-source", "-moz-border-image-source", "-o-border-image-source", "border-image-source", "-webkit-border-image-slice", "-moz-border-image-slice", "-o-border-image-slice", "border-image-slice", "-webkit-border-image-width", "-moz-border-image-width", "-o-border-image-width", "border-image-width", "-webkit-border-image-outset", "-moz-border-image-outset", "-o-border-image-outset", "border-image-outset", "-webkit-border-image-repeat", "-moz-border-image-repeat", "-o-border-image-repeat", "border-image-repeat", "-webkit-border-top-image", "-moz-border-top-image", "-o-border-top-image", "border-top-image", "-webkit-border-right-image", "-moz-border-right-image", "-o-border-right-image", "border-right-image", "-webkit-border-bottom-image", "-moz-border-bottom-image", "-o-border-bottom-image", "border-bottom-image", "-webkit-border-left-image", "-moz-border-left-image", "-o-border-left-image", "border-left-image", "-webkit-border-corner-image", "-moz-border-corner-image", "-o-border-corner-image", "border-corner-image", "-webkit-border-top-left-image", "-moz-border-top-left-image", "-o-border-top-left-image", "border-top-left-image", "-webkit-border-top-right-image", "-moz-border-top-right-image", "-o-border-top-right-image", "border-top-right-image", "-webkit-border-bottom-right-image", "-moz-border-bottom-right-image", "-o-border-bottom-right-image", "border-bottom-right-image", "-webkit-border-bottom-left-image", "-moz-border-bottom-left-image", "-o-border-bottom-left-image", "border-bottom-left-image", "background", "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader", "background-color", "background-image", "background-attachment", "background-position", "-ms-background-position-x", "-ms-background-position-y", "background-position-x", "background-position-y", "-webkit-background-clip", "-moz-background-clip", "background-clip", "background-origin", "-webkit-background-size", "-moz-background-size", "-o-background-size", "background-size", "background-repeat", "box-decoration-break", "-webkit-box-shadow", "-moz-box-shadow", "box-shadow", "color", "table-layout", "caption-side", "empty-cells", "list-style", "list-style-position", "list-style-type", "list-style-image", "quotes", "content", "counter-increment", "counter-reset", "-ms-writing-mode", "vertical-align", "text-align", "-webkit-text-align-last", "-moz-text-align-last", "-ms-text-align-last", "text-align-last", "text-decoration", "text-emphasis", "text-emphasis-position", "text-emphasis-style", "text-emphasis-color", "text-indent", "-ms-text-justify", "text-justify", "text-outline", "text-transform", "text-wrap", "-ms-text-overflow", "text-overflow", "text-overflow-ellipsis", "text-overflow-mode", "text-shadow", "white-space", "word-spacing", "-ms-word-wrap", "word-wrap", "-ms-word-break", "word-break", "-moz-tab-size", "-o-tab-size", "tab-size", "-webkit-hyphens", "-moz-hyphens", "hyphens", "letter-spacing", "font", "font-weight", "font-style", "font-variant", "font-size-adjust", "font-stretch", "font-size", "font-family", "src", "line-height", "opacity", "-ms-filter:\\'progid:DXImageTransform.Microsoft.Alpha", "filter:progid:DXImageTransform.Microsoft.Alpha(Opacity", "-ms-interpolation-mode", "-webkit-filter", "-ms-filter", "filter", "resize", "cursor", "nav-index", "nav-up", "nav-right", "nav-down", "nav-left", "-webkit-transition", "-moz-transition", "-ms-transition", "-o-transition", "transition", "-webkit-transition-delay", "-moz-transition-delay", "-ms-transition-delay", "-o-transition-delay", "transition-delay", "-webkit-transition-timing-function", "-moz-transition-timing-function", "-ms-transition-timing-function", "-o-transition-timing-function", "transition-timing-function", "-webkit-transition-duration", "-moz-transition-duration", "-ms-transition-duration", "-o-transition-duration", "transition-duration", "-webkit-transition-property", "-moz-transition-property", "-ms-transition-property", "-o-transition-property", "transition-property", "-webkit-transform", "-moz-transform", "-ms-transform", "-o-transform", "transform", "-webkit-transform-origin", "-moz-transform-origin", "-ms-transform-origin", "-o-transform-origin", "transform-origin", "-webkit-animation", "-moz-animation", "-ms-animation", "-o-animation", "animation", "-webkit-animation-name", "-moz-animation-name", "-ms-animation-name", "-o-animation-name", "animation-name", "-webkit-animation-duration", "-moz-animation-duration", "-ms-animation-duration", "-o-animation-duration", "animation-duration", "-webkit-animation-play-state", "-moz-animation-play-state", "-ms-animation-play-state", "-o-animation-play-state", "animation-play-state", "-webkit-animation-timing-function", "-moz-animation-timing-function", "-ms-animation-timing-function", "-o-animation-timing-function", "animation-timing-function", "-webkit-animation-delay", "-moz-animation-delay", "-ms-animation-delay", "-o-animation-delay", "animation-delay", "-webkit-animation-iteration-count", "-moz-animation-iteration-count", "-ms-animation-iteration-count", "-o-animation-iteration-count", "animation-iteration-count", "-webkit-animation-direction", "-moz-animation-direction", "-ms-animation-direction", "-o-animation-direction", "animation-direction", "pointer-events", "unicode-bidi", "direction", "-webkit-columns", "-moz-columns", "columns", "-webkit-column-span", "-moz-column-span", "column-span", "-webkit-column-width", "-moz-column-width", "column-width", "-webkit-column-count", "-moz-column-count", "column-count", "-webkit-column-fill", "-moz-column-fill", "column-fill", "-webkit-column-gap", "-moz-column-gap", "column-gap", "-webkit-column-rule", "-moz-column-rule", "column-rule", "-webkit-column-rule-width", "-moz-column-rule-width", "column-rule-width", "-webkit-column-rule-style", "-moz-column-rule-style", "column-rule-style", "-webkit-column-rule-color", "-moz-column-rule-color", "column-rule-color", "break-before", "break-inside", "break-after", "page-break-before", "page-break-inside", "page-break-after", "orphans", "widows", "-ms-zoom", "zoom", "max-zoom", "min-zoom", "user-zoom", "orientation", "..." ]] } ================================================ FILE: .editorconfig ================================================ # EditorConfig: https://EditorConfig.org root = true [*] end_of_line = lf insert_final_newline = true trim_trailing_whitespace = true [*.{js,ts,jsx,tsx,json,html,css,md,yml}] charset = utf-8 [*.{js,ts,jsx,tsx,json,html,css}] indent_style = space indent_size = 4 [*.yml] indent_style = space indent_size = 2 ================================================ FILE: .eslintrc ================================================ { "extends": "eslint:recommended", "rules": { "eqeqeq": 0, "camelcase": 2, "quotes": [2, "single"], "no-mixed-spaces-and-tabs": [2, "smart-tabs"], "space-before-function-paren": [2, "never"], "space-in-parens": 2, "object-curly-spacing": 2, "array-bracket-spacing": 2, "computed-property-spacing": 2, "space-before-blocks": 2, "keyword-spacing": 2, "no-lonely-if": 2, "comma-style": 2, "indent": [2, 4, {"SwitchCase": 1}], "no-underscore-dangle": 0, "no-use-before-define": 0, "no-constant-condition": 0, "no-multi-spaces": 0, "strict": 0, "key-spacing": 0, "no-shadow": 0, "no-console": 1, "no-useless-escape": 0, "no-prototype-builtins": 0 }, "globals": { "DG": true, "L": true, "baron": true, "Promise": true }, "env": { "browser": true, "node": true } } ================================================ FILE: .github/workflows/test.yml ================================================ name: Test on: push jobs: test: runs-on: ubuntu-latest steps: - name: Checkout 🛎️ uses: actions/checkout@v2 - name: Set env var to fix the PhantomJS error run: | echo "OPENSSL_CONF=/tmp/openssl.cnf" >> "$GITHUB_ENV" - name: Setup node 🔧 uses: actions/setup-node@v2 with: node-version: 12 - name: Downgrade the Python version to fix the install errors uses: actions/setup-python@v5 with: python-version: '3.10' - name: Test ✔️ env: TEST_SECRET_KEY: ${{ secrets.TEST_SECRET_KEY }} run: | npm ci npm test ================================================ FILE: .gitignore ================================================ .DS_Store .idea node_modules npm-debug.log dist gulp/tmp .tern-port config.local.json nohup.out vendors/leaflet/dist/leaflet-src.js coverage jsconfig.json .vscode yarn.lock ================================================ FILE: .npmignore ================================================ .DS_Store .idea node_modules npm-debug.log gulp/tmp .tern-port config.local.json nohup.out vendors/leaflet/dist/leaflet-src.js coverage jsconfig.json .vscode yarn.lock ================================================ FILE: CONTRIBUTING.md ================================================ ## Содержание 1. [Как принять участие в развитии API карт](#Как-принять-участие-в-развитии-api-карт) * [Расскажите о нас](#Расскажите-о-нас) * [Сообщайте об ошибках](#Сообщайте-об-ошибках) * [Разрабатывайте собственные модули](#Разрабатывайте-собственные-модули) * [Участвуйте в исправлении ошибок](#Участвуйте-в-исправлении-ошибок) * [Участвуйте в улучшении документации](#Участвуйте-в-улучшении-документации) 2. [Как разработать собственный модуль](#Как-разработать-собственный-модуль) * [Инициализация](#Инициализация) * [Код модуля](#Код-модуля) * [Минификация и подключение](#Минификация-и-подключение) * [Прочие рекомендации](#Прочие-рекомендации) 3. [Как внести изменения в исходный код](#Как-внести-изменения-в-исходный-код) 4. [Установка локальной сборки API карт](#Установка-локальной-сборки-api-карт) 5. [Стандарты кодирования](#Стандарты-кодирования) * [JavaScript](#javascript) * [HTML и CSS](#html-и-css) ## Как принять участие в развитии API карт Каждый из вас может повлиять на качество API карт и сделать продукт еще лучше. Ниже перечислено несколько способов того, как вы можете это сделать. ### Расскажите о нас Реализовали качественный проект на API 2ГИС? Напишите об этом в своем блоге или социальной сети, поделитесь своим опытом использования API с другими разработчиками. ### Сообщайте об ошибках Если вы нашли ошибку в работе API карт или столкнулись с проблемой, сообщите об этом на [форуме обратной связи](https://api2gis.uservoice.com) и мы обязательно поможем вам разобраться с проблемой. Как правило, хорошо локализованная ошибка — это уже половина работы по её исправлению, потому постарайтесь сделать максимально простой пример, на котором воспроизводится ошибка и разместите его в публичном доступе (например, используя [JSFiddle](http://jsfiddle.net/)), также не забудьте указать версию браузера и ОС, чтобы мы смогли воспроизвести ошибку. ### Разрабатывайте собственные модули Вы можете расширять функциональность API карт под свои потребности при помощи модулей. Прочтите [небольшую инструкцию](#Как-разработать-собственный-модуль), которая поможет написать ваш первый модуль. Если считаете, что модуль будет полезен другим разработчикам, обязательно сообщите нам об этом по адресу api@2gis.ru, мы разместим информацию о нем на официальном сайте 2ГИС, а возможно и включим в базовую поставку API карт. ### Участвуйте в исправлении ошибок Вы можете самостоятельно исправить найденные ошибки в работе API карт, для этого необходимо ознакомиться с [процессом внесения изменений в исходный код](#Как-внести-изменения-в-исходный-код) и прислать нам [pull request](https://help.github.com/articles/using-pull-requests). ### Участвуйте в улучшении документации Если какой-то из разделов документации показался недостаточно полным и вы считаете, что его можно улучшить, вы можете сделать это самостоятельно. Для внесения изменений в документацию необходимо: * найти интересующий вас раздел документации в папке [src/doc/](https://github.com/2gis/maps-api-2.0/tree/master/src/doc/manual) и открыть его содержимое; * нажать кнопку Edit, отредактировать текст документации и нажать кнопку Propose File Change. Мы рассмотрим ваш pull request с изменениями и при следующем релизе после их принятия они появятся на сайте API 2ГИС. ## Как разработать собственный модуль Ниже приведен пример разработки простого модуля. С помощью этого модуля мы покажем, как расширить функционал API карт таким образом, чтобы у пользователей появилась возможность кликнуть в любой дом на карте и увидеть вокруг него магазины в радиусе 500 метров. Перед началом разработки рекомендуется ознакомиться со [стандартами кодирования](#Стандарты-кодирования) и [документацией](http://api.2gis.ru/doc/maps/manual/loading/) API карт. ### Инициализация Первое, что необходимо сделать — это создать отдельный [Github-репозиторий для нашего модуля](https://github.com/2gis/maps-api-2.0-plugin-demo). И сформировать файловую структуру: /src - исходные JS файлы /demo - HTML файлы с примерами использования /dist - минифицированные JS и CSS файлы, а также изображения README.md LICENSE.md ### Код модуля Так как наш модуль довольно простой, он будет состоять всего из одного исходного JS файла, назовем его DGDemoPlugin.js и напишем в нем необходимый для работы код: ```javascript DG.DemoPlugin = DG.Handler.extend({ _lastFirms: DG.layerGroup(), addHooks: function() { this._map.on('click', this._searchFirms, this); }, removeHooks: function() { this._map.off('click', this._searchFirms, this); }, _searchFirms: function(e) { // (MouseEvent) var latlng = e.latlng.wrap(); DG.ajax({ url: 'http://catalog.api.2gis.ru/2.0/search', data: { what: 'магазин', point: latlng.lng + ',' + latlng.lat, radius: 500, page_size: 50, type: 'filial', key: '12345678' }, success: DG.bind(this._showFirms, this), error: DG.bind(this._logError, this) }); }, _showFirms: function(data) { // (Object) var firms, marker; if (data.response.code > 200) { this._logError(data); return; } this._lastFirms.clearLayers(); firms = data.result.data; firms.forEach(function(firmInfo) { marker = DG.marker([firmInfo.geo.lat, firmInfo.geo.lon]); marker.bindPopup(firmInfo.firm.name); marker.addTo(this._lastFirms); }, this); this._lastFirms.addTo(this._map); }, _logError: function(data) { console.log('Error: ', data); } }); DG.Map.addInitHook('addHandler', 'demoPlugin', DG.DemoPlugin); ``` Наш модуль предполагает взаимодействие пользователя с картой, потому мы его отнаследовали от класса `DG.Handler`. Благодаря этому можно будет контролировать его поведение в процессе исполнения приложения (например, у разработчика будет возможность включить или выключить модуль). Свойство `_lastFirms` представляет собой группу, в которую мы добавляем маркеры. В нашем случае это необходимо для того, чтоб можно было одной командой удалить с карты маркеры всех магазинов, которые были добавлены после предыдущего клика пользователя, и отобразить новые. Методы `addHooks` и `removeHooks` срабатывает в тот момент, когда разработчик конечного приложения включает или отключает наш модуль. Метод `_searchFirms` отправляет AJAX-запрос к [REST API справочника 2ГИС](http://catalog.api.2gis.ru/doc/2.0/catalog/filial/search-by-what-and-radius) и в случае успешного ответа вызывает метод `_showFirms`. Метод `_showFirms` удаляет с карты все предыдущие маркеры и показывает новые. Метод `_logError` при возникновении ошибки печатает в консоль браузера данные о ней. Конструкция `DG.Map.addInitHook('addHandler', 'demoPlugin', DG.DemoPlugin)` позволяет карте зарегистрировать написанный нами обработчик пользовательских действий, после чего к нему можно будет обратиться по соответствующему имени, например: map.demoPlugin.enable(); ### Минификация и подключение Для минификации JS файлов существует множество популярных инструментов, вы можете воспользоваться любым из них, напрмиер [YUI Compressor](http://yui.github.io/yuicompressor/). Минифицированный JS файл необходимо положить в папку `dist` и предоставить к нему публичный доступ, после чего любой разработчик сможет подключить и использовать его вместе с API карт. Пример подключения модуля: DG.then(function() { //загрузка модуля return DG.plugin('https://raw.github.com/2gis/maps-api-2.0-plugin-demo/master/dist/DGDemoPlugin.js'); }) .then(function() { //инициализация карты var map = new DG.Map('map', { 'center': new DG.LatLng(54.980206086231, 82.898068362003), 'zoom': 15, 'geoclicker': false }); // включение модуля map.demoPlugin.enable(); }); ### Прочие рекомендации Выше мы привели пример очень простого модуля, но модули могут быть более сложные, ниже перечислены некоторые рекомендации по их разработке. Рекомендуемая файловая структура модуля: /src — исходные JS файлы /doc — документация /lang — языковые файлы /skin — изображения и CSS файлы разных тем API карт /templates — шаблоны /test — тесты /demo — HTML файлы с примерами использования /dist — минифицированные JS и CSS файлы, а также изображения README.md LICENSE.md В качестве примера модуля с описанной выше файловой структурой можно изучить [DGGeoclicker](https://github.com/2gis/maps-api-2.0/tree/master/src/DGGeoclicker). Не забывайте снабжать модули тестами, это позволит упростить их поддержку в будущем. В качестве тестового фреймворка в API карт используется [Mocha](http://visionmedia.github.io/mocha/). Делайте демонстрационные примеры. Как правило, это первое на что обращают внимание пользователи модуля при ознакомлении с его возможностями. Составьте и положите в корневую папку модуля файл `README.md`, в котором будут описаны возможности модуля и примеры его использования. Выберите лицензию для своего модуля, ведь это неотъемлемая часть любого open-source проекта. Такие ресурсы, как [tldrlegal.com](http://www.tldrlegal.com/) и [opensource.org](http://opensource.org/licenses) могут вам в этом помочь. ## Как внести изменения в исходный код Для внесения изменений в существующий исходный код API карт (например, для исправления ошибки) вам потребуется: * сделать [форк](https://help.github.com/articles/fork-a-repo) репозитория API карт; * [установить API карт локально](#Установка-локальной-сборки-api-карт) на своем компьютере; * сделать ветку, название которой будет соответствовать сути вашего изменения (ветку необходимо унаследовать от ветки `master`, так как в ней находится последняя стабильная версия API карт); * внести свои изменения в код (рекомендуется следовать принятым [стандартам кодирования](#Стандарты-кодирования)); * прислать нам pull request. После изучения и тестирования pull request-а мы его примем (возможно с некоторыми доработками), после чего они попадут в релиз и станут доступны всем пользователям API карт. Пожалуйста, не забывайте покрывать и проверять измененный код тестами. Для запуска тестов в PhantomJS (по умолчанию) необходимо из консоли выполнить команду: gulp test Для запуска тестов в браузерах вашей операционной системы укажите названия браузеров с помощью параметров: gulp test --ff --chrome Список доступных параметров: (default) PhantomJS --chrome Chrome --ff Firefox --opera Opera --safari Safari --ie IE (только для Windows) Если вам необходимо выполнить тесты за несколько запусков браузера, то вы можете использовать параметр: --multiple-chunks По умолчанию при каждом запуске браузера будут выполняться тесты из 10ти модулей. Изменить это число можно параметром: --items-in-chunk Также вы можете проверить код на наличие синтаксических ошибок, для этого необходимо выполнить команду: gulp lint ## Установка локальной сборки API карт Ниже перечислены шаги, которые необходимо выполнить для установки API карт локально на своем компьютере. * Склонируйте репозиторий: git clone git@github.com:2gis/mapsapi.git Примечание: если вы устанавливаете API карт не с текущего репозитория, а с его форка, тогда не забудьте указать первым параметром команды `clone` адрес форка вместо адреса репозитория 2ГИС. * Установите [Node.js](https://nodejs.org/) * Установите зависимости: cd ~/mapsapi-folder npm install * В файле `config.main.json` замените параметр `baseUrl` на пустую строку: `"baseUrl": ""`. * Выполните сборку API карт и запуск сервера: npm run dev После выполнения описанных выше действий вы сможете открыть в браузере карту по адресу http://127.0.0.1:3000/2.0/ ## Стандарты кодирования ### JavaScript Основные требования к JavaScript коду обеспечиваются синтаксическим анализатором и описаны в конфигурационом файле [ESLint](https://github.com/2gis/maps-api-2.0/blob/master/.eslintrc). В процессе разработки мы стараемся придерживаться соглашений, схожими с [Airbnb style guide](https://github.com/airbnb/javascript), за исключением соглашений о [пробелах](https://github.com/airbnb/javascript#whitespace) и [комментариях](https://github.com/airbnb/javascript#comments). ### HTML и CSS #### Определения Данные соглашения — набор правил разной степени обязательности исполнения. Используется три степени: * обязательно — нарушение правила не имеет смысла либо полностью запрещено. Нарушение должно обсуждаться заранее с командой; * должно — нарушение правила возможно при достаточном обосновании. Нарушение можно обсудить постфактум или оставить комментарий в коде; * рекомендуется — при прочих равных лучше использовать рекомендованный вариант. Соглашения являются расширением методологии [БЭМ](http://ru.bem.info/method/definitions/), поэтому используются следующие термины: * блок — синоним понятий «плагин», «модуль» — неразрывная независимая часть ветки DOM-дерева (или ветка целиком), и связанных с ней CSS-правил, которая может быть переиспользована на любом проекте, в любом контексте. Блоком так же называется корневой тег такой структуры; * элемент — структурная единица блока. Элемент всегда принадлежит одной копии блока. Элемент не имеет смысла вне блока. Элемент не может принадлежать одновременно нескольким блокам, или нескольким копиям одного блока. При движении от элемента вверх по DOM дереву можно встретить любое число других элементов того же блока, либо сам блок. Нельзя встретить элементы других блоков или другие блоки; * модификатор — синоним понятия «состояние». Модификатор реализует наследование блоков — когда нам нужен второй блок, очень похожий на первый. Модификатор всегда относится к какому-то конкретному блоку или элементу. У любого блока и элемента может быть несколько модификаторов, по несколько значений у каждого. #### Область применения Данное соглашение применяется для вновь создаваемых блоков (модулей). Сюда относится замена блока при рефакторинге. Соглашение имеет слабое влияние при небольших работах со старым кодом, а также при переиспользовании сторонних модулей. #### HTML * вёрстка должна быть [валидным](http://validator.w3.org/#validate_by_input+with_options) html5 кодом; * код должен быть максимально семантичным; * код должен быть в нижнем регистре; * рекомендуется не указывать типы для тегов `script` и `link`; * рекомендуется пропускать строку перед блоками, списками, таблицами и т.д.; * должны использоваться двойные кавычки в атрибутах HTML. ##### Рекомендуется использовать теги html5 * `article` — выделение смысловой самостоятельной единицы (обычно блока); * `address` — тег для адреса; * `aside` — тег для сопутствующей информации, например «конкуренты»; * `time` — тег для любого времени или даты; * `header` и `footer` для явно выраженной шапки и футера блока, если такие есть; * а также: `summary`, `nav` и другие. Существующие теги и их назначение: http://www.w3.org/TR/html-markup/elements.html#elements * рекомендуется использовать атрибуты [schema.org](http://schema.org/docs/gs.html#microdata_how); * запрещено использовать «табличные» теги: `table`, `thead`, `tbody`, `tfoot`, `tr`, `th`, `td` кроме как по их прямому назначению — т.е. для отображения табличных данных; * запрещено использование устаревших тегов: `font`, `blink` и прочее; * у каждого тега, который будет иметь визуальное представление на странице, должен быть CSS-класс (полное покрытие тегов классами). ##### Структура * должна использоваться методология БЭМ; * любая визуальная HTML нода должна быть покрыта CSS-классом; * структура HTML должна быть семантичной и минимально зависеть от дизайна. Иными словами, по HTML-коду должно быть всё понятно о содержимом страницы, но ничего не понятно о её дизайне. Плохо:
Какой-то текст
Хорошо:

Школа №176

Красный проспект, д. 348
Приветствуется минимизация DOM-дерева (исключение различных оберток, оболочек, разделителей, однопиксельных GIF-файлов и т.п.). ##### Общий пример
...

Школа №176

Красный проспект, д. 348
...
...
#### CSS ##### Именование классов * обязательно используется методология БЭМ для именования всех CSS-классов; * для блоков должен использоваться префикс .dg-, например: `.dg-fullscreen`; * любой CSS-класс должен начинаться с имени блока; * любой класс по своему предназначению и правилам составления имени должен быть блоком, элементом, или модификатором; * модификатор обязан иметь четкое описание-комментарий; * запрещено использовать в имени блока любые символы, кроме a-z, 0-9 и «-», а в качестве первого символа любые, кроме a-z. То же касается составных частей элементов и модификаторов; * должны использоваться одинарные кавычки; * должны использоваться короткие 16-тиричные числа, когда это возможно (#ffffff → #fff); * рекомендуется использовать сокращенные названия свойств CSS; * не рекомендуется указывать единицы измерений после нулевых значений. Плохо: `margin: 0px 10px;` Хорошо: `margin: 0 10px;`. Примеры классов блоков: `.dg-search`, `.dg-popup`, `.dg-card`, `.dg-firm-list`. * имя любого элемента обязательно имеет префикс `.block__`, где «block» — имя блока, которому принадлежит этот элемент. Примеры классов элементов: `.dg-card__name`, `.dg-search__query`, `.dg-popup__close`. * имя модификатора обязательно имеет префикс `block_` или `block__elem_` и состоит из двух частей: имя модификатора и значение модификатора. Примеры классов модификаторов: * `.dg-card_type_firm` — тип карточки «фирма»; * `.dg-search_mode_metro` — режим строки поиска «метро»; * `.dg-popup_state_hidden` — состояние коллаута «скрыт»; * `.dg-board__list_state_minimized` — состояние элемента «список» равно «свёрнут». Модификаторы: * любой модификатор обязательно относится только к какому-то конкретному элементу или блоку; * разрешено использовать несколько разных модификаторов блока или элемента одновременно (например `.dg-card_state_visible` и `.dg-card_type_building`); * запрещено использовать несколько разных значений одного модификатора или элемента одновременно (например `.dg-card_state_hidden` и `.dg-card_state_visible`). ##### Селекторы * селектор должен состоять только из одного имени класса; * селекторы по тегам крайне не желательны; * запрещено использовать селекторы по id; * одно состояние одного селектора должно встречаться в CSS 0 или 1 раз; * селекторы через запятую не желательны. Если такая необходимость сильно выражена, то стоит подумать о создании нового элемента с общими стилями, и его примешиванию к уже существующим в HTML коде; * классы должны быть сгруппированы вокруг своего блока в порядке: блок, элементы, модификаторы блока. То есть, в потоке CSS одним выделением можно выделить все стили блока и его элементов; * состояния класса должны быть также сгруппированы: класс, его псевдоклассы, его псевдоэлементы; * модификаторы блока должны быть сгруппированы по названию модификатора и по его значениям; * псевдоэлементы before и after должны отделяться от селектора одинарным двоеточием. ##### Свойства * запрещено использование `!important`; * стили, предназначенные для IE 8, должны находиться в отдельных файлах; * файлы со стилями для IE 8 должны иметь суффикс «ie». Пример: `dg-fullscreen.ie.less`; * наличие невалидного CSS должно быть строго обосновано. Используем [CSS валидатор](http://jigsaw.w3.org/css-validator/#validate_by_input); * любое неочевидное свойство или значение должно поясняться `/* комментарием */` на английском языке. ================================================ FILE: LICENSE ================================================ НАСТОЯЩИЙ ДОКУМЕНТ ЯВЛЯЕТСЯ ЮРИДИЧЕСКИМ ДОГОВОРОМ («Договор») между ООО «ДубльГИС» («Мы», «Нас», «2ГИС») И ВАМИ («Вы») В ОТНОШЕНИИ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ API («Программное обеспечение»). КОГДА ВЫ СКАЧИВАЕТЕ, УСТАНАВЛИВАЕТЕ, КОПИРУЕТЕ ИЛИ ИНЫМ ОБРАЗОМ ИСПОЛЬЗУЕТЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ, ВЫ ТЕМ САМЫМ ПРИНИМАЕТЕ УСЛОВИЯ ДОГОВОРА, ИЗЛОЖЕННЫЕ НИЖЕ. ЕСЛИ ВЫ НЕ СОГЛАСНЫ С НИЖЕСЛЕДУЮЩИМИ УСЛОВИЯМИ, ВЫ НЕ ИМЕЕТЕ ПРАВА СКАЧИВАТЬ, УСТАНАВЛИВАТЬ, КОПИРОВАТЬ ИЛИ ИНЫМ ОБРАЗОМ ИСПОЛЬЗОВАТЬ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ИЛИ КАКУЮ-ЛИБО ЕГО ЧАСТЬ. НАСТОЯЩИЙ ЛИЦЕНЗИОННЫЙ ДОГОВОР ОПИСЫВАЕТ ВАШИ ПРАВА И ОГРАНИЧЕНИЯ В ОТНОШЕНИИ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ И ЕГО КОМПОНЕНТОВ. 1. ОПРЕДЕЛЕНИЯ «Приложение» означает любое программное обеспечение, приложение или элементы, которые Вы «разрабатываете или которыми управляете, используя Программное обеспечение или Модификации в «соответствии с настоящим Договором. «Конечный пользователь» означает конечного пользователя Вашего Приложения, который приобрел лицензию «на Приложение для собственного внутреннего использования, но не для распространения, перепродажи, «разработки пользовательского интерфейса или иных целей, связанных с разработкой. «Модификация» означает: а) любое дополнение или удаление из контента файла, включенного в «первоначальную версию Программного обеспечения или предшествующие Модификации, созданные вами, «и/или b) любой новый файл, который использует любую часть первоначальной версии Программного «обеспечения или предшествующих Модификаций. «Исходная» форма означает предпочтительную форму для внесения изменений, включая, в том числе, «исходный код программного обеспечения, исходную документацию и конфигурационные файлы. «Объектная» форма означает любую форму, полученную в результате механической трансформации или «перевода из Исходной формы, включая, в том числе, скомпилированный объектный код, генерируемую «документацию и конвертирование в иные форматы. «Код счетчика посещений» означает часть Исходной формы, которая требуется для отслеживания, «мониторинга и регистрации деятельности Конечных пользователей. «Программное обеспечение API» (Программное обеспечение») означает программный интерфейс приложения «ООО ДубльГИС» версии 2.0 в форме, предоставляемой Вам ООО ДубльГИС», включая библиотеки, исходный «код, документацию, набор инструментальных средств разработчика и иные материалы, размещаемый на «https://github.com/2gis/maps-api-2.0 и http://api.2gis.ru/, предназначенный для модификаций, «адаптаций и иных изменений программного обеспечения. Программное обеспечение включает любые изменения, обновления, исправления ошибок или модифицированные версии Программного обеспечения, при условии, что Мы имеем право изменять Программное обеспечение, а также изменять или отзывать настоящую лицензию на использование Программного обеспечения по Нашему исключительному усмотрению и в любое время без направления Вам предварительного уведомления. Новая версия Договора вступает в силу в день ее размещения на сайте http://law.2gis.ru, если иное не предусмотрено новой версией договора. В случае Вашего несогласия с измененной или обновленной версией Программного обеспечения, применяется раздел 7 настоящего Договора. «Средства индивидуализации» означает в совокупности товарные знаки, торговые марки, знаки «обслуживания, логотипы, уведомления об авторском праве, доменные имена ООО ДубльГИС», а также иные «Наши средства индивидуализации. «Базы данных» означает в совокупности, общедоступные размещаемые и принадлежащие ООО ДубльГИС» Базы «данных электронных карт, включающие, в том числе, ГИС данные о географических объектах и населенных «пунктах в пределах территории, ограниченной определенными географическими координатами. «Контент» означает данные, включая, в том числе, любые фрагменты информации, хранящиеся и/или «извлекаемые из Баз данных, и/или любые иные данные или информацию, которую ОООДубльГИС» включило в «свое Программное обеспечение. Использование Вами Контента ограничено одновременным использованием «Программного обеспечения. 2. ПРЕДОСТАВЛЕНИЕ ЛИЦЕНЗИИ 2.1. При условии соблюдения условий настоящего Договора, Мы предоставляем на срок защиты авторского права, действующую по всему миру, неисключительную, бесплатную и не подлежащую сублицензированию лицензию (i) Вам — на использование, копирование, модификацию, объединение Программного обеспечения в исходной и объектной формах для создания Модификаций и Приложений; (ii) Вам — на публичный показ, публичное исполнение и бесплатное распространение Конечным пользователям Программного обеспечения и/или Модификаций в исходной или объектной форме, включенных в Приложения; и (iii) Конечным пользователям — на использование Программного обеспечения, включенного в Ваши Приложения в соответствии с условиями настоящего Договора; (iv) Вам — на право осуществления коммуникации между Вашим Приложением и Базами данных и извлечение из Баз данных информации, необходимой для использования способами, разрешенными настоящим Договором; (v) Вам — на изготовление ограниченного числа промежуточных копий Контента исключительно для совершение действий, разрешенных настоящим Договором, и на изменение (исключительно в целях реорганизации или упорядочивания) Контента в пределах Приложения; (vi) Вам — на раскрытие для всеобщего ознакомления структуры Программного обеспечения и Исходного кода, при условии, что Вы надлежащим образом идентифицируете их путем использования Средств индивидуализации. Мы сохраняем за собой право модифицировать, изменять, обновлять и/или улучшать Программное обеспечение, Базы данных, Исходный код и Контент в любое время с уведомлением Вас или без такого уведомления по Нашему исключительному усмотрению. 2.2. Вы можете модифицировать Исходный код исключительно в целях проектирования, разработки и тестирования Ваших собственных Приложений. Тем не менее, Вам разрешается использовать, копировать, воспроизводить, распространять и перераспределять Ваш модифицированный Исходный код при соблюдении следующих условий: (a) Вы включаете Наше уведомление об авторском праве (его текст содержится в Дополнении А к настоящему Договору) в Ваше Приложение, в том числе в любом месте, где в таком Приложении появляется любое иное уведомление об авторском праве; и (b) Вы не используете иным образом Наше наименование, Средства индивидуализации и иные Наши торговые марки для реализации Вашего Приложения, кроме случаев когда Мы в письменном виде согласовали иное. Кроме случаев, указанных выше, Вы не можете иным образом модифицировать, удалять или изменять Код счетчика посещений, включенный в Программное обеспечение. 2.3. На Вас не возлагается обязанность по уплате Нам каких-либо роялти в за осуществляемое Вами распространение Программного обеспечения в соответствии с настоящим Договором, а также по уплате Нам каких-либо комиссий за использование или распространение Приложений в соответствии с настоящим Договором. 3. ПРАВО СОБСТВЕННОСТИ 3.1. Настоящий Договор является лицензионным договором, а не договором купли- продажи. Мы сохраняем за собой все права интеллектуальной собственности на Программное обеспечение или связанные с Программным обеспечением, включая, в том числе, авторское право, патентные права, все права на зарегистрированные и не зарегистрированные товарные знаки (знаки обслуживания), конфиденциальную информацию (включая секреты производства и ноу-хау) и все иные права, кроме тех, которые в прямо выраженной форме предоставляются по настоящему Договору. 3.2. Мы предоставляем Вам Исходный код, что позволяет Вам создавать Модификации и Приложения. В то время как Вы сохраняете за собой все права на любые оригинальные произведения в составе Модификаций, автором которых Вы являетесь, мы сохраняем все права авторства и интеллектуальной собственности в отношении Программного обеспечения, Исходного кода, Баз данных, Контента, Кода счетчика посещений. 3.3. Вы не вправе удалять, скрывать или изменять любые уведомления об авторском праве, удостоверения, ссылки на источник, товарные знаки, предупреждения или заявление об отказе от ответственности, прикрепленные, включенные или иным образом применимые к Программному обеспечению. 4. ОБРАТНАЯ СВЯЗЬ 4.1. ООО «ДубльГИС» владеет бесплатной, действующей по всему миру, бессрочной лицензией на использование и включение в состав Программного обеспечения или Контента любых предложений, идей, заявок на расширение, откликов, рекомендаций и иной информации и ее производных, предоставляемых Вами. 5. ЗАПРЕЩЕННОЕ ИСПОЛЬЗОВАНИЕ 5.1. Вы не вправе повторно распространять Программное обеспечение или Модификации иным образом, кроме как путем включения Программного обеспечения или его части в Ваше Приложение. Вы не вправе изменять или удалять уведомление об авторском праве с файлов, включенных в Программное обеспечение или Модификации. 5.2. Разрешение по настоящему Договору предоставляется любому лицу на использование данного Программного обеспечения для любой цели, исключая коммерческое использование, которое ограничивается в соответствии с настоящим Договором. Программное обеспечение или Модификации должны использоваться исключительно в составе Приложений, доступных для бесплатного общедоступного использования. Использование Программного обеспечения или Модификаций для платных проектов или иных проектов, предполагающих ограничение доступа Конечных пользователей к Базам данных и/или Контенту, строго запрещается. В случае необходимости коммерческого использования, пожалуйста, обратитесь к Нам по следующему адресу api@2gis.ru. 5.3. Версии Программного обеспечения с открытым кодом («GPL Версия») могут лицензироваться в соответствии с Универсальной общедоступной лицензией версии 3.0., созданной в рамках проекта GNU («GPL»), а не в соответствии с настоящим Договором. Если Вы или иное третье лицо разработали полностью (или любую часть) Приложения(ий), используя GPL Версию, Вы не вправе объединять такое разработанное произведение с Программным обеспечением и обязаны лицензировать такое(ие) Приложение(я) (или любую их часть) в соответствии с Универсальной общедоступной лицензией версии 3.0., созданной в рамках проекта GNU, с которой можно ознакомиться по адресу http://www.gnu.org/copyleft/gpl.html. 6. ОГРАНИЧЕНИЯ 6.1. Кроме случаев, прямо разрешенных настоящим Договором, Лицензиат не вправе: (i) использовать Программное обеспечение, Базы данных, Исходный код или Контент любым способом, (который прямо не разрешен или не предоставлен по настоящему Договору; (ii) копировать Контент для целей, лежащих вне сферы действия лицензии, предоставленной по (настоящему Договору; (iii) использовать Контент для создания баз данных или любых компиляций Контента без Нашего (предварительного письменного разрешения; (iv) распространять, публиковать, продвигать, предоставлять право или разрешать доступ или (предоставлять ссылку на Контент или Базы данных из любого места или источника, кроме Вашего (Приложения; (v) использовать Контент для создания приложения, которое предлагает или рекламирует услуги, которые (порочат Наши услуги, наносят ущерб или являются конкурирующими по отношению к Нашим услугам или (иным образом вредят Нашим услугам; (vi) обходить, устанавливать спайдеры и индексы или любым способом сохранять информацию, полученную (из Контента кроме способов, предусмотренных настоящей ограниченной лицензией) или распространять (любые вирусы, «червей», троянские программы или иные программы, направленные на причинение вреда (любым системам или данным, отправлять или сохранять наносящие вред или незаконные материалы с (использованием Программного обеспечения; (vii) предоставлять Контент или Базы данных любым третьим сторонам способом, противоречащим условиям (использования, предусмотренным для пользователей нашего сайта; (viii) осуществлять коммерческое использование т.е. продавать, сдавать в аренду), копировать, (хранить или кэшировать Контент или Базы данных для иных целей, кроме разрешенных настоящим (Договором. 6.2. Ограничение сублицензирования. Кроме случаев, предусмотренных в настоящем разделе, все лицензионные права (в соответствии с применимым правом интеллектуальной собственности), предоставленные по настоящему Договору, не подлежат сублицензированию, передаче или уступке. При условии соблюдения положений ниже, Вы вправе сублицензировать Ваше право на показ Контента и Средств индивидуализации, как предусмотрено настоящим Договором, Конечным пользователям исключительно для того, чтобы они имели возможность показа Контента и Средств индивидуализации на экранах своих компьютеров и/или вебсайтах посредством Вашего Приложения. 7. ПРЕКРАЩЕНИЕ 7.1. Настоящий Договор и Ваше право на использование Программного обеспечения и Модификаций немедленно прекращается в случае Вашего несоблюдения любых условий настоящего Договора. После прекращения Вы должны немедленно прекратить использование и уничтожить Программное обеспечение и Модификации, включая все сопроводительные документы. 8. ОТКАЗ ОТ ПРЕДОСТАВЛЕНИЯ ГАРАНТИЙ 8.1. В МАКСИМАЛЬНОЙ СТЕПЕНИ, ДОПУСТИМОЙ ПРИМЕНИМЫМ ЗАКОНОДАТЕЛЬСТВОМ, МЫ ОТКАЗЫВАЕМСЯ ОТ ПРЕДОСТАВЛЕНИЯ ЛЮБЫХ ГАРАНТИЙ И УСЛОВИЙ, ПРЯМО ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, В ТОМ ЧИСЛЕ, ПОДРАЗУМЕВАЕМЫЕ ГАРАНТИИ ПРИГОДНОСТИ ДЛЯ ПРОДАЖИ, ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ, НАЛИЧИЯ ПРАВА СОБСТВЕННОСТИ И ОТСУТСТВИЯ НАРУШЕНИЙ В ОТНОШЕНИИ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ. МЫ НЕ ГАРАНТИРУЕМ, ЧТО РАБОТА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ИЛИ ЕГО КОДА, БУДЕТ БЕСПЕРЕБОЙНОЙ И БЕЗОШИБОЧНОЙ, И ВЫ ПРИЗНАЕТЕ, ЧТО ПРЕДОСТАВЛЕНИЕ ТАКИХ ГАРАНТИЙ ЯВЛЯЕТСЯ ТЕХНИЧЕСКИ НЕОСУЩЕСТВИМЫМ ДЛЯ НАС. 9. ОГРАНИЧЕНИЕ ОТВЕТСТВЕННОСТИ 9.1. В МАКСИМАЛЬНОЙ СТЕПЕНИ, ДОПУСТИМОЙ ПРИМЕНИМЫМ ЗАКОНОДАТЕЛЬСТВОМ, МЫ НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ НЕ ОТВЕЧАЕМ, НА ОСНОВАНИИ КАКИХ-ЛИБО ЗАКОНОВ, ЗА ЛЮБЫЕ ОСОБЫЕ, СЛУЧАЙНЫЕ, КОСВЕННЫЕ ИЛИ ВТОРИЧНЫЕ УБЫТКИ (ВКЛЮЧАЯ, В ТОМ ЧИСЛЕ, УБЫТКИ В ФОРМЕ УПУЩЕННОЙ ВЫГОДЫ, ПРИОСТАНОВЛЕНИЯ ДЕЯТЕЛЬНОСТИ, ПОТЕРИ КОММЕРЧЕСКОЙ ИНФОРМАЦИИ ИЛИ ЛЮБОЙ ИНОЙ ИМУЩЕСТВЕННЫЙ УЩЕРБ), ВОЗНИКШИЕ В РЕЗУЛЬТАТЕ ИСПОЛЬЗОВАНИЯ ИЛИ НЕВОЗМОЖНОСТИ ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ИЛИ ЕГО КОДА, ИЛИ ПО ЛЮБОЙ ПРИЧИНЕ, СВЯЗАННОЙ С ПРЕДМЕТОМ НАСТОЯЩЕГО ДОГОВОРА, ДАЖЕ В СЛУЧАЕ ЕСЛИ МЫ БЫЛИ ПРЕДУПРЕЖДЕНЫ О ВОЗМОЖНОСТИ ВОЗНИКНОВЕНИЯ ТАКИХ УБЫТКОВ. 10. БЕСПЛАТНОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ 10.1. Независимо от указанного выше, Мы признаем, что некоторые компоненты Программного обеспечения могут подпадать под действие лицензии на так называемое «программное обеспечение с открытым исходным кодом» («Компоненты с открытым кодом»). Мы обязуемся подготовить обзор соответствующего бесплатного программного обеспечения и предоставить Вам полный соответствующий исходный код, включая все изменения, произведенные нами (при наличии). Обзор будет включен в Дополнение А, вместе с копией условий лицензии, регулирующих предоставление соответствующего бесплатного программного обеспечения. 10.2. В степени, требуемой лицензиями, касающимися Компонентов с открытым кодом, условия таких лицензий будут применяться вместо условий настоящего Договора, и мы настоящим заявляем, что только Компоненты с открытым кодом, лицензируемые на основании лицензий, предоставляющих объем прав не уже, чем лицензия, предоставляемая по настоящему Договору, включены в Программное обеспечение. В той мере, в какой лицензии, применимые в отношении Компонентов с открытым кодом, запрещают какие-либо ограничения, содержащиеся в настоящем Договоре, такие ограничения не будут применяться в отношении Компонентов. 11. ИНТЕЛЛЕКТУАЛЬНАЯ СОБСТВЕННОСТЬ 11.1. Программное обеспечение содержит Наши товарные знаки, логотипы, патенты, секреты производства и/или материалы, охраняемые авторским правом. Вы обязуетесь не раскрывать и не предоставлять такие секреты производства и/или ноу-хау в любой форме любым третьим сторонам, не удалять уведомления о товарных знаках, уведомления об авторском праве, условия лицензии с Программного обеспечения или любых его компонентов. Право собственности и права интеллектуальной собственности на Наши товарные знаки или в отношении Наших товарных знаков и материалов, охраняемых авторским правом, которые отображаются или доступны посредством Программного обеспечения, принадлежат нам. 11.2. При условии соблюдения положений настоящего Договора и на период действия Договора Мы предоставляем Вам ограниченную, неисключительную, отзывную, сублицензируемую лицензию на отображение товарных знаков, торговых марок, знаков обслуживания, логотипов, уведомлений об авторских правах, доменных имен и иных Средств индивидуализации в соответствии с настоящим Договором и исключительно в целях указания на источник Программного обеспечения и для продвижения и/или рекламирования того факта, что Вы используете Программное обеспечение в Вашем Приложении, разработанном на его основе. 11.3. Никогда, в течение срока действия настоящего Договора или после его завершения, Вы не вправе оспаривать права на Средства индивидуализации или содействовать другим лицам в оспаривании таких прав, а также не вправе содействовать в регистрации любых Средств индивидуализации или опознавательных черт бренда (включая доменные имена), которые в любом виде схожи до степени смешения в любыми Средствами индивидуализации. 12. ГАРАНТИИ СТОРОН В ОТНОШЕНИИ ВОЗМЕЩЕНИЯ УБЫТКОВ 12.1. При условии соблюдения положений настоящего Договора, Вы обязаны защищать, освобождать от ответственности и возмещать убытки Нам, нашим аффилированным лицам, лицензиарам, каждому из наших сотрудников, должностных лиц, директоров, в отношении любых исков, ущерба, ответственности, затрат и сборов (включая разумные затраты за юридические услуги), возникших в результате или в связи с использованием Вами Программного обеспечения (включая любой Контент, предоставляемый по настоящему Договору) или в связи с нарушением настоящего Договора и/или любых заявлений или гарантий, включенных в настоящий Договор. Вы соглашаетесь с тем, что Мы не принимаем на себя обязательств по возмещению Вам убытков в связи с Вашим использованием Программного обеспечения или Контента. 13. ПРОЧИЕ УСЛОВИЯ 13.1. Лицензия, предоставляемая по настоящему Договору, применяется исключительно к версии Программного обеспечения, предоставляемой в соответствии с настоящим Договором, а также в отношении любых изменений и/или обновлений, на получение которых Вы можете иметь право. Во избежание сомнений, Мы не обязаны предоставлять Вам какую-либо поддержку, средства устранения ошибок, изменения и обновления Программного обеспечения. 13.2. Вы согласны соблюдать все применимые законы и подзаконные акты, относящиеся к Программному обеспечению. 13.3. При дальнейшем распространении Программного обеспечения или Модификаций в рамках Вашего Приложения, Вы вправе предлагать поддержку, гарантии, гарантии возмещения убытков и иные обязательства и/или права, соответствующие условиям настоящего Договора. Тем не менее, при принятии таких обязательств Вы вправе действовать исключительно от собственного имени и под свою ответственность, но не от нашего имени. Вы должны возмещать Нам убытки или, по нашему выбору, защищать нас от любых исков, претензий или судебных процессов, возбужденных против Нас (i) в связи с тем, что Вы приняли на себя такую поддержку, гарантии, гарантии возмещения убытков или дополнительную ответственность; или (ii) в связи с использованием, воспроизведением или распространением Вашего Приложения, кроме случаев когда такой иск основывается исключительно на включении Программного обеспечения в такое Приложение. 13.4. Более того, Вы должны распространять Программное обеспечение исключительно в соответствии с соглашением, которое включает все ограничения, предусмотренные настоящим Договором, и в той же степени защищает Нас и Программное обеспечение, как это делает настоящий Договор. 13.5. Вы признаете, что настоящий Договор является полным и единственным выражением нашего соглашения. Никакая устная или письменная информация, предоставленная Нами или предоставленная иным образом от Нашего имени, не создает каких-либо гарантий или дополнительных соглашений и никоим образом не расширяет сферу действия настоящего Договора, и Вы не вправе полагаться на любую такую устную или письменную информацию. 13.6. Настоящий Договор не предоставляет никаких подразумеваемых лицензий или подразумеваемых прав, и все иные права, кроме прямо предоставленных по настоящему Договору, сохраняются за Нами и нашими лицензиарами. Кроме того, никакие лицензии и привилегии не предоставляются в отношении комбинирования Программного обеспечения и/или Модификаций, в зависимости от ситуации, с любым иным программным обеспечением или аппаратными средствами, которые не были предоставлены Нами Вам по настоящему Договору. Ваши права по настоящему Договору применяются только в отношении Программного обеспечения, Модификаций и/или Приложений. 13.7. Если какие-либо положения настоящего Договора будут признаны недействительными, такие положения считаются исключенными из настоящего Договора; остальные условия сохраняют полную силу и действие. 13.8. Настоящий Договор регулируется законодательством соответствующей юрисдикции, в которой лицензия исполняется. Если набор прав по суперимперативным нормам применимого законодательства в соответствующей юрисдикции включает дополнительные права, не предусмотренные настоящей Лицензией, такие дополнительные права считаются предоставленными по настоящей Лицензии в соответствии с условиями настоящей Лицензии. Редакция от 30.06.2014 г. Дополнение А Уведомление об авторском праве Copyright © 2014 2GIS. Эксперт по городу. www.2gis.ru Ниже предоставляется перечень компонентов с открытым кодом, как предусмотрено настоящим документом. Данный перечень предоставляется для вашего удобства; пожалуйста, читайте далее, если желаете ознакомиться с уведомлением(ями) об авторском праве и полным текстом лицензии, связанной с каждым компонентом. https://github.com/Leaflet/Leaflet/blob/master/LICENSE https://github.com/linkedin/dustjs/blob/master/LICENSE https://github.com/gulpjs/gulp/blob/master/LICENSE https://github.com/mapbox/wellknown/blob/master/LICENSE ================================================ FILE: LICENSE_EN ================================================ THIS DOCUMENT IS A LEGAL AGREEMENT (the “Agreement”) BETWEEN DoubleGIS LLC ("We", "Us", "2GIS") AND YOU ("You") IN RELATION TO API SOFTWARE (the "Software"). BY DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING THE SOFTWARE, YOU ACCEPT THE FOLLOWING TERMS AND CONDITIONS. IF YOU DO NOT AGREE WITH ANY OF THE TERMS OR CONDITIONS OF THIS LICENSE AGREEMENT, DO NOT PROCEED WITH THE DOWNLOADING, COPYING, INSTALLATION OR ANY OTHER USE OF THE SOFTWARE OR ANY PORTION THEREOF AS YOU HAVE NO RIGHTS TO DO SO. THIS LICENSE AGREEMENT DESCRIBES YOUR RIGHTS AND RESTRICTIONS WITH RESPECT TO THE SOFTWARE AND ITS COMPONENTS. 1.DEFINITIONS "Application" means any software, application, or elements that You develop and operate using the Software or Modifications in accordance with this Agreement. "End User" means an end user of Your Application who acquires a license to such solely for their own internal use and not for distribution, resale, user interface design or software development purposes. "Modification" means: a) any addition to or deletion from the contents of a file included in the original Software or previous Modifications created by You, and/or b) any new file that leverages any part of the original Software or previous Modifications. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Hit Counter Script Code" means part of Source that is required for tracking, monitoring and registration of End Users activity. "API Software" ("Software") means DoubleGIS LLC application programming interface 2.0 version in the form provided by DoubleGIS LLC to You, including any libraries, source code, documentation, developer tools kit and other materials provided at https://github.com/2gis/maps-api-2.0 and http://api.2gis.ru/ designated for modification, adaptation and any other software changes. Software shall include any upgrades, updates, bug fixes or modified versions of the Software provided that We are entitled to change the Software, as well as to modify or revoke this license agreement to use the Software at Our sole discretion and at any time without giving You prior notice. The new version of the Agreement shall enter into force on the date of its posting on the http://law.2gis.ru/, unless otherwise provided in the new version of the agreement. In case of Your disagreement with the use of a modified or updated version of the Software, the Section 7 of the Agreement shall apply. "Logos" collectively means the DoubleGIS LLC trade names, trademarks, service marks, logos, copyright notices, domain names and other Our distinctive brands. "Databases" collectively means publicly accessible and displayed DoubleGIS LLC Databases of an electronic map, which includes GIS data on geographical locations and settlements within an area bounded by certain geographical coordinates. "Content" means included, but is not limited to any piece of information stored in and/or retrieved from the Databases and/or any other data or information DoubleGIS LLC chooses to include in its Software. The use of any Content by You is limited to concurrent use with the Software. 2. LICENSE GRANT 2.1. Subject to your compliance with all of the terms and conditions of this Agreement, We grant a perpetual for the duration of the applicable copyright, worldwide, non-exclusive, royalty-free and not-sublicensable license (i) for You to use, copy, modify, merge the Software in source and object forms to create Modifications and Applications; (ii) for You to publicly display, publicly perform and at no-charge distribute the Software and/or Modifications in source and object forms to End Users solely as integrated into the Applications; and (iii) for End Users to use the Software as integrated into Your Applications in accordance with the terms of this Agreement; (iv) for You to be enable Your Application to interact with the Databases and retrieve therefrom information necessary to facilitate the use permitted under this Agreement; (v) for You to make limited intermediate copies of the Content only as necessary to perform an activity permitted under this Agreement and to modify (solely in order to rearrange or reorganize) the Content within Application; (vi) for You to disclose to the public the structure of the Software and the Source Code, provided that You properly identify these by reference to Logo. We reserve the right to modify, change, update and/or enhance the Software, the Databases, the Source Code, and the Content at any time with or without notice to You Our sole and exclusive discretion. 2.2. You may modify the Source Code solely for the purposes of designing, developing and testing Your own Applications. However, You are permitted to use, copy, reproduce, distribute and redistribute Your modified Source Code only if all of the following conditions are met: (a) You include Our copyright notice (text is available in Exhibit A to this Agreement) with Your Application, including every location in which any other copyright notice appears in such Application; and (b) You do not otherwise use Our name, Logos or other of Our trademarks to market Your Application, unless otherwise agree by Us in writing. Except to the above, You may not modify remove or alter the Hit Counter Script Code contained in Software. 2.3. You will not owe Us any royalties for Your distribution of the Software in accordance with this Agreement. You will not owe Us any fees for Your use or distribution of Applications in accordance with this Agreement. 3.OWNERSHIP 3.1. This is a license agreement and not an agreement for sale. We reserve ownership of all intellectual property rights inherent in or relating to the Software, which include, but are not limited to, all copyright, patent rights, all rights in relation to registered and unregistered trademarks (service marks), confidential information (including trade secrets and know-how) and all rights other than those expressly granted by this Agreement. 3.2. We provide You with Source code so that You can create Modifications and Applications. While You retain all rights to any original work authored by You as part of the Modifications, We continue to own all copyright and other intellectual property rights in the Software, Source Code, Databases, Content, Hit Counter script code. 3.3. You must not remove, obscure or interfere with any copyright, acknowledgment, attribution, trademark, warning or disclaimer statement affixed to, incorporated in or otherwise applied in connection with the Software. 4.FEEDBACK 4.1. DoubleGIS shall have a royalty-free, worldwide, perpetual license to use or incorporate into the Software or Content any suggestions, ideas, enhancement requests, feedback, recommendations or other information and derivatives thereof provided by You. 5.PROHIBITED USES 5.1. You may not redistribute the Software or Modifications other than by including the Software or a portion thereof within Your Application. You may not change or remove the copyright notice from any of the files included in the Software or Modifications. 5.2. The permission hereby is granted to anyone to use this Software for any purpose, excluding commercial applications, which is subject to the restrictions of present Agreement. Software or Modifications shall be used only as integrated into the Applications available for free public use. Using of Software or Modifications for projects intending payment or otherwise restricted access of the End Users to Databases or/and Content are strictly prohibited. In case of commercial use is required, please contact us at api@2gis.ru. 5.3. Open Source versions of the Software (“GPL Version”) may be licensed under the terms of the GNU General Public License versions 3.0 (“GPL”) and not under this Agreement. If You, or another third party, has, at any time, developed all (or any portions of) the Application(s) using a GPL Version, You may not combine such development work with the Software and must license such Application(s) (or any portions derived there from) under the terms of the GNU General Public License version 3, a copy of which is located at http://www.gnu.org/copyleft/gpl.html. 6. RESTRICTIONS 6.1. Except as expressly authorized under this Agreement, Licensee shall not (i) use the Software, the Databases, the Source Code, or the Content in any way not expressly permitted or granted under this Agreement; (ii) copy the Content for purposes outside the scope of the license granted herein; (iii) use the Content to create databases or any other compilations of Content, without Our prior written consent; (iv)You shall not distribute, publish, facilitate, enable or allow access or linking to the Content or Database from any location or source other than Your Application; (v) use the Content to create an application that offers or promotes services that may be competitive with, damaging to, disparaging of or otherwise detrimental to the Our service; (vi) crawl, spider, index or in any way store information obtained from the Content (except for the limited license granted herein), or propagate any virus, worms, Trojan horses, or other programming routine intended to damage any system or data, send or store infringing or unlawful material using the Software; (vii) provide Content or Databases to any third parties in a manner contrary to the terms of use applicable to users of the our web site; (viii) commercialize (i.e., sell, rent, or lease), copy, store or cache the Content or Databases, other than for the purposes allowed by this Agreement. 6.2. Limits on Sublicensing. Except as set forth in this section, all license rights (under any applicable intellectual property right) granted herein are not sublicenseable, transferable or assignable. Subject to the terms and conditions below, You may sublicense Your right to display the Content and the Logos, as provided in this Agreement, to End Users solely to enable End Users to display Content and the Logos on their computer screens and/or websites through Your Application. 7.TERMINATION 7.1. This Agreement and Your right to use the Software and Modifications will terminate immediately if You fail to comply with any of the terms and conditions of this Agreement. Upon termination, You agree to immediately cease using and destroy the Software or Modifications, including all accompanying documents. 8.DISCLAIMER OF WARRANTIES 8.1. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, WE DISCLAIM ALL WARRANTIES AND CONDITIONS, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND TITLE AND NON-INFRINGEMENT, WITH REGARD TO THE SOFTWARE. WE DO NOT GUARANTEE THAT THE OPERATION OF THE SOFTWARE OR THE CODE IT PRODUCES WILL BE UNINTERRUPTED OR ERROR-FREE, AND YOU ACKNOWLEDGE THAT IT IS NOT TECHNICALLY PRACTICABLE FOR US TO DO SO. 9.LIMITATION OF LIABILITIES 9.1. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL WE BE LIABLE UNDER ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION OR ANY OTHER PECUNIARY LOSSES) ARISING OUT OF THE USE OF OR INABILITY TO USE THE SOFTWARE OR THE CODE IT PRODUCES OR ANY OTHER SUBJECT MATTER RELATING TO THIS AGREEMENT, EVEN IF WE HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 10.FREE SOFTWARE 10.1. Notwithstanding the foregoing, We acknowledges that certain components of the Software may be covered by so-called "open source" software licenses ("Open Source Components"). We will prepare an overview of the relevant free software and provide You with the complete corresponding source code, including any modification We have made to that code if so. The overview shall be included in Exhibit A, together with a copy of the license terms governing the relevant free software. 10.2. To the extent required by the licenses covering Open Source Components, the terms of such licenses will apply in lieu of the terms of this Agreement, and We hereby represent that only Open Source Components with licenses that intend to grant permissions no less broad than the license granted in this Agreement are included in the Software. To the extent which the licenses applicable to an Open Source Component prohibit any of the restrictions in this Agreement with respect to such Open Source Component, such restrictions will not apply regarding to these Components. 11. INTELLECTUAL PROPERTY 11.1. The Software contain Our trademarks, logos, patents, trade secrets and/or copyrighted materials. You shall not disclose or make available such trade secrets and/or know-how in any form to any third party nor remove any trademark notices, copyright notices, or licensing terms from the Software or any components therein. Title and intellectual property rights in and to Our trademarks and Our copyrighted material which appears in content displayed by or accessed through the Software belongs to Us. 11.2. Subject to the terms and conditions in, and during the term of, this Agreement, We grant you a limited, nonexclusive, revocable, sublicensable license to display the trade names, trademarks, service marks, logos, copyright notices, domain names and other Logos in accordance with this Agreement and solely for attributing the source of the Software and for the purpose of promoting and/or advertising that You use the Software and in your resulting Application. 11.3. At no time during or after the term of this Agreement shall you challenge or assist others to challenge the Logos or, nor shall you attempt to register any Logos or brand identifiers (including domain names) that are confusingly similar in any way to any of the Logos. 12.PARTIES INDEMNITY OBLIGATIONS 12.1 Subject to this Agreement, You shall defend, indemnify and hold Us, our affiliates, and licensors, and each of Our respective employees, officers, directors, harmless from and against any claims, damages, liabilities, costs and fees (including reasonable attorneys' fees) arising out of or related to Your use of the Software (including all Content provided therein) or for any breach of this Agreement and/or any of the representations and warranties made herein. You agrees that We shall have no indemnity obligations for any use You make of the Software or the Content. 13.MISCELANEOUS 13.1. The license granted herein applies only to the version of the Software available in connection with the terms of this Agreement, and to any updates and/or upgrades to which you may be entitled. For the avoidance of doubt, We are not obligated to provide You with any support, bug fixes, upgrades, or updates and/or upgrades to the Software. 13.2. You agree that you will comply with all applicable laws and regulations with respect to the Software. 13.3. While redistributing the Software or Modifications thereof as part of Your Application, You may choose to offer acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this Agreement. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on our behalf. You shall indemnify Us, or at Our option, defend Us against any claim, suit or proceeding brought against Us (i) arising by reason of Your accepting any such support, warranty, indemnity or additional liability; or (ii) arising out of the use, reproduction or distribution of Your Application, except to the extent such claim is solely based on the inclusion of the Software therein. 13.4. Further, You agree only to distribute the Software pursuant agreement that includes all the limitations and restrictions of this Agreement and is as protective of Us and Software as is this Agreement. 13.5. You acknowledge that this Agreement is complete and is the exclusive representation of our agreement. No oral or written information given by Us, or otherwise on Our behalf shall create a warranty or collateral contract, or in any way increase the scope of this Agreement in any way, and You may not rely on any such oral or written information. 13.6. There are no implied licenses or other implied rights granted under this Agreement, and all rights, save for those expressly granted hereunder, shall remain with Us and our licensors. In addition, no licenses or immunities are granted to the combination of the Software and/or Modifications, as applicable, with any other software or hardware not delivered by Us to You under this Agreement. Your rights under this Agreement apply only to Software, Modifications, and/or Applications. 13.7. If any provision in this Agreement shall be determined to be invalid, such provision shall be deemed omitted; the remainder of this Agreement shall continue in full force and effect. 13.8. This Agreement will be governed by the law s of the relevant jurisdiction in which the license terms are sought to be enforced. If the suite of rights granted under super imperative rules of applicable law in the relevant jurisdiction includes additional rights not granted under this License, these additional rights are granted in this License in order to meet the terms of this License. Date: 30.06.2014 Exhibit A Copyright notice Copyright © 2014 2GIS. The City Expert. www.2gis.ru The following is a listing of the open source components detailed in this document. This list is provided for your convenience; please read further if you wish to review the copyright notice(s) and the full text of the license associated with each component. https://github.com/Leaflet/Leaflet/blob/master/LICENSE https://github.com/linkedin/dustjs/blob/master/LICENSE https://github.com/gulpjs/gulp/blob/master/LICENSE https://github.com/mapbox/wellknown/blob/master/LICENSE ================================================ FILE: README.md ================================================ # API карт 2GIS [![npm][npm-badge]][npm-link] [npm-badge]: https://img.shields.io/npm/v/2gis-maps.svg [npm-link]: https://www.npmjs.com/package/2gis-maps При помощи API карт вы сможете: * создавать интерактивные карты на веб-странице; * показывать на карте различные объекты (маркеры, балуны, геометрические фигуры); * производить поиск на карте: определять координаты геообъектов по их названиям и названия по координатам. Чтобы начать использовать API карт нужно получить ключ, для этого напишите на почту api@2gis.com, далее перейдите в раздел [Быстрый старт](https://docs.2gis.com/ru/maps/others/rasterjs/). Если вы решили внести свой вклад в развитие продукта, ознакомьтесь с [инструкцией для контрибьюторов](https://github.com/2gis/maps-api-2.0/blob/master/CONTRIBUTING.md). Также мы открыты для общения и готовы ответить на ваши вопросы, чтобы связаться с нами перейдите в раздел [Обратная связь](https://help.2gis.ru/feedback/). Дополнительная информация: * текущая версия API карт — 2.0; * работает с использованием библиотеки [Leaflet](http://leafletjs.com); * правовая информация доступна [на сайте 2ГИС](http://law.2gis.ru/api-rules/#kart2). ================================================ FILE: app/config.js ================================================ /** * Build config */ var fs = require('fs'); var _ = require('lodash'); var basePath = __dirname + '/..'; // Set root application path var config = { mainAppConfig: basePath + '/config.main.json', localAppConfig: basePath + '/config.local.json', packages: require(basePath + '/gulp/deps/packs.js'), skins: ['dark', 'light'], source: { deps: require(basePath + '/gulp/deps/deps.js'), path: basePath + '/src/' }, testSource: { deps: require(basePath + '/gulp/deps/deps.js'), path: basePath + '/gulp/tmp/testJS/src/' }, leaflet: { deps: require(basePath + '/node_modules/leaflet/build/deps.js').deps, path: basePath + '/node_modules/leaflet/src/' }, tmpl: { dir: 'templates', pattern: '*.dust', ext: '.dust', varPostfix: '_TMPL' }, doc: { menu: './src/menu.json', input: './src/doc/', output: './dist/doc' }, copyright: fs.readFileSync('./src/copyright.js'), coreModules: ['DGCore', 'DGCustomization', 'DGAjax'] }; function getMainConfig() { return require(config.mainAppConfig); } function getLocalConfig() { try { return require(config.localAppConfig); } catch (e) { return {}; } } function getAppConfig() { return _.assign({}, getMainConfig(), getLocalConfig()); } config.mainConfig = getMainConfig(); config.localConfig = getLocalConfig(); config.appConfig = getAppConfig(); module.exports = config; ================================================ FILE: app/index.html ================================================ API карт 2ГИС
================================================ FILE: app/index.js ================================================ //Web app of 2GIS Maps API 2.0 var express = require('express'); var cors = require('cors'); var config = require('./config.js'); var _ = require('lodash'); var fs = require('fs'); // Init application var app = express(); app.disable('x-powered-by'); app.use(cors()); // Serve loader var loader = fs.readFileSync('./dist/loader.js', {encoding: 'utf8'}); app.get('/loader.js', function(req, res) { var localConfig = _.cloneDeep(config.localConfig); var protocol = config.appConfig.protocol; localConfig.protocol = protocol; res.set('Content-Type', 'application/javascript; charset=utf-8'); var result = loader .replace(/__LOCAL_CONFIG__/g, JSON.stringify(localConfig)) .replace(/__BASE_URL__/g, protocol + config.appConfig.baseUrl) .replace(/__QUERY__/g, JSON.stringify(req.query)); // Send loader with injected params res.send(result); }); // Load index file and inject base URL var indexFile = fs.readFileSync('./dist/index.html', {encoding: 'utf8'}); indexFile = indexFile.replace(/__BASE_URL__/g, config.appConfig.baseUrl); // Serve index file function serveIndexFile(req, res) { res.send(indexFile); } app.get('/', serveIndexFile); app.get('/index.html', serveIndexFile); app.get('/healthcheck', function(req, res) { res.sendStatus(200); }); function getParams(req) { var pkg = req.query.pkg; var skin = req.query.skin; var ie8 = req.query.ie8 === 'true'; if (Object.keys(config.packages).indexOf(pkg) === -1) { pkg = 'full'; } if (config.skins.indexOf(skin) === -1) { skin = config.appConfig.defaultSkin; } return { pkg: pkg, skin: skin, ie8: ie8 } } function loadDir(dirPath) { var files = {}; fs.readdirSync(dirPath).forEach(function(fileName) { files[fileName] = fs.readFileSync(dirPath + '/' + fileName); }); return files; } // Load and serve JS files var jsFiles = loadDir('./dist/js'); app.get('/js', function(req, res) { var params = getParams(req); var fileName = 'script.' + params.pkg + '.js'; res.set('Content-Type', 'application/javascript; charset=utf-8'); res.set('Cache-Control', 'public, max-age=84000'); res.send(jsFiles[fileName]); }); // Load and serve CSS files var cssFiles = loadDir('./dist/css'); app.get('/css', function(req, res) { var params = getParams(req); var fileName = 'styles.' + params.pkg + '.' + params.skin + '.' + (params.ie8 ? 'ie8' + '.' : '') + 'css'; res.set('Content-Type', 'text/css'); res.set('Cache-Control', 'public, max-age=84000'); res.send(cssFiles[fileName]); }); // Serve everything else app.use(express.static(__dirname + '/../dist')); // Start server var host = config.appConfig.host; var port = config.appConfig.port; app.listen(port, host, function() { console.log('Maps API 2.0 server listening on ' + (host ? host + ':' : '') + port); }); ================================================ FILE: app/loader.js ================================================ (function() { 'use strict'; var isJSRequested = false; var rejects = []; var version = 'v4.0.12'; var baseURL = '__BASE_URL__'; var query = __QUERY__; var isLazy = query.lazy === 'true'; var qs = getQueryString(); function getQueryString() { var params = { skin: query.skin, pkg: query.pkg, version: version }; if (/MSIE\x20(\d+\.\d+);/.test(navigator.userAgent) && parseInt(RegExp.$1, 10) < 9) { params.ie8 = true; } var qsComponents = []; for (var key in params) { var value = params[key]; if (value) { qsComponents.push(key + '=' + value); } } if (!qsComponents.length) { return ''; } return '?' + qsComponents.join('&'); } function requestJS() { isJSRequested = true; var script = document.createElement('script'); script.setAttribute('type', 'text/javascript'); script.setAttribute('src', baseURL + '/js/' + qs); script.onerror = function(evt) { runRejects(evt); }; document.getElementsByTagName('head')[0].appendChild(script); } // Returns a promise that resolves once the DOM is ready. Based on // https://github.com/addyosmani/jquery.parts/blob/master/jquery.documentReady.js function ensureDOMReady() { return new Promise(function(resolve, reject) { var isResolved = false; function resolveOnce() { // Clean up all listeners we added if (document.addEventListener) { document.removeEventListener('DOMContentLoaded', resolveOnce, false); window.removeEventListener('load', resolveOnce, false); } else { document.detachEvent('onreadystatechange', resolveOnce); window.detachEvent('onload', resolveOnce); } if (isResolved) { return; } isResolved = true; resolve(); } // Scroll check hack for IE8 function doScrollCheck() { if (isResolved) { return; } try { document.documentElement.doScroll('left'); } catch (e) { setTimeout(doScrollCheck, 50); return; } resolveOnce(); } // If the DOM is already ready, load JS immediately if (document.readyState !== 'loading') { return resolveOnce(); } // Adding event listeners. We also listen to window load event as a // 'better late than never' fallback. if (document.addEventListener) { document.addEventListener('DOMContentLoaded', resolveOnce, false); window.addEventListener('load', resolveOnce, false); } else if (document.attachEvent) { // IE8 document.attachEvent('onreadystatechange', resolveOnce); window.attachEvent('onload', resolveOnce); // Scroll check hack for IE8 var isTopLevel = false; try { isTopLevel = window.frameElement == null; } catch (e) {} if (document.documentElement.doScroll && isTopLevel) { doScrollCheck(); } } }); } function loadStylesheet() { var url = baseURL + '/css/' + qs; var style = document.createElement('style'); style.type = 'text/css'; return new Promise(function(resolve, reject) { DG.ajax(url, { type: 'get', dataType: 'html', success: function(data) { var head = document.getElementsByTagName('head')[0]; // Replace urls in CSS in case local config was changed // after build. originalBaseUrl contains URL value at the // moment application was built. baseUrl contains current // value. var originalBaseUrl = '__ORIGINAL_BASE_URL__'; // Replace if they don't match if (baseURL !== originalBaseUrl) { data = data.replace( new RegExp(originalBaseUrl, 'g'), baseURL ); } if (style.styleSheet) { head.appendChild(style); style.styleSheet.cssText = data; } else { style.appendChild(document.createTextNode(data)); head.appendChild(style); } resolve(); }, error: function() { reject(); } }); }); } function loadProjectList() { var url = DG.config.protocol + DG.config.webApiServer + '/' + DG.config.webApiVersion + '/region/list'; return new Promise(function(resolve) { DG.ajax(url, { type: DG.ajax.corsSupport ? 'get' : 'jsonp', data: { format: DG.ajax.corsSupport ? 'json' : 'jsonp', key: DG.config.webApiKey, fields: DG.config.regionListFields }, timeout: DG.config.loadProjectListTimeout, success: function(data) { var result = data.result; if (result && result.items && result.items.length) { DG.projectsList = result.items; } resolve(); }, error: function(err) { resolve(); } }); }); } function extendConfig() { DG.extend(DG.config, __LOCAL_CONFIG__); if (DG.customConfig) { DG.extend(DG.config, DG.customConfig); } } function prepareForInit() { return Promise.all([ loadStylesheet(), loadProjectList(), ensureDOMReady() ]); } function setReady() { DG.ready = true; } function runRejects() { for (var i = 0, l = rejects.length; i < l; i++) { if (typeof rejects[i] === 'function') { rejects[i](); } } } window.DG = window.DG || {}; window.DG.ready = false; window.__dgApi__ = { callbacks: [ [extendConfig, undefined], [prepareForInit, undefined], [setReady, undefined] ], version: version }; var loaderDgThen = window.DG.then = function(resolve, reject) { if (DG.then !== loaderDgThen) { return DG.then(resolve, reject); } window.__dgApi__.callbacks.push([resolve, reject]); if (isLazy && !isJSRequested) { requestJS(); } if (reject) { rejects.push(reject); } return this; }; if (!isLazy) { requestJS(); } })(); ================================================ FILE: assets/cluster_realworld.js ================================================ //An extract of address points from the LINZ bulk extract: http://www.linz.govt.nz/survey-titles/landonline-data/landonline-bde //Should be this data set: http://data.linz.govt.nz/#/layer/779-nz-street-address-electoral/ var addressPoints = [ [54.9210922667, 82.8209316333, "2"], [54.9210819833, 82.8213903167, "3"], [54.9210881833, 82.8215004833, "3A"], [54.9211946833, 82.8213655333, "1"], [54.9209458667, 82.8214051333, "5"], [54.9208292333, 82.8214374833, "7"], [54.9325816, 82.8238798667, "537"], [54.9315855167, 82.8279767, "454"], [54.9096336833, 82.8223743833, "176"], [54.90970685, 82.8221815833, "178"], [54.9102146667, 82.8211562833, "190"], [54.9088037167, 82.8242227, "156"], [54.9112330167, 82.8193425667, "210"], [54.9116368667, 82.8193005167, "212"], [54.90812645, 82.8255449333, "146"], [54.9080231333, 82.8286383167, "125"], [54.9089538667, 82.8222222333, "174"], [54.9080905833, 82.8275400667, "129"], [54.908811, 82.8227592833, "172"], [54.90832975, 82.8276898167, "131"], [54.9089395333, 82.8281710333, "133"], [54.9093421, 82.8274883167, "135"], [54.9084820833, 82.82601925, "137"], [54.90881015, 82.82622865, "139"], [54.9090947667, 82.8263585667, "141"], [54.9092962333, 82.8244872333, "147"], [54.9091016667, 82.8249140167, "145"], [54.9088785167, 82.8253611667, "143"], [54.90825965, 82.82530115, "148"], [54.90995685, 82.8238554333, "153"], [54.90975435, 82.8238417833, "151"], [54.90950755, 82.8237912, "149"], [54.9092772667, 82.8231980833, "170"], [54.9082753833, 82.80672975, "4"], [54.9078434833, 82.811822, "56"], [54.9083775667, 82.8090812333, "30B"], [54.9084588, 82.8058838167, "174"], [54.9088788333, 82.8062702833, "175"], [54.9091632833, 82.80514875, "182A"], [54.9094891167, 82.80384695, "202"], [54.9156715667, 82.8034881667, "277"], [54.9109189333, 82.8024631, "220"], [54.9108164333, 82.8039622, "219"], [54.9125773667, 82.8026079667, "238"], [54.9125799333, 82.8032824, "241A"], [54.9125869, 82.8037423833, "241C"], [54.9140266833, 82.8025706, "256"], [54.90932, 82.8051094333, "182B"], [54.9098799667, 82.8040444167, "197"], [54.9094298833, 82.80561245, "189"], [54.9172409333, 82.8035291167, "287"], [54.9232166667, 82.82452865, "2028"], [54.9225024333, 82.8249944667, "2022"], [54.92334135, 82.8244748667, "2030"], [54.9229725333, 82.8246809333, "2026"], [54.9224034667, 82.82507345, "2020"], [54.9227806, 82.8248285833, "2024"], [54.9178801, 82.8181871667, "6"], [54.91811315, 82.8180543667, "4"], [54.9181739833, 82.81851995, "1"], [54.91797515, 82.8186312, "3"], [54.9181787, 82.8176995, "2A"], [54.9183385333, 82.81812895, "2"], [54.9293053167, 82.8105357833, "31"], [54.9309444333, 82.81208735, "16"], [54.9306726667, 82.8115020833, "19"], [54.9300903, 82.8120791, "26"], [54.9289416167, 82.8113778333, "33"], [54.9274969167, 82.8113355167, "53"], [54.9199192667, 82.8173622833, "5A"], [54.9200392833, 82.8174100167, "3"], [54.9196328, 82.8167642, "18"], [54.91752585, 82.8155467667, "22C"], [54.91766615, 82.8153714167, "22B"], [54.9179022667, 82.8151616833, "22A"], [54.9191980333, 82.81664245, "20A"], [54.91799325, 82.81565925, "20C"], [54.9187486333, 82.8165228667, "20B"], [54.91964875, 82.8172874167, "7"], [54.91925545, 82.8171617, "11"], [54.9190491667, 82.8170928333, "13"], [54.9194515667, 82.8172147167, "9"], [54.91981045, 82.81733245, "5B"], [54.91876595, 82.8172445167, "15B"], [54.9185999167, 82.8172441, "17A"], [54.91816745, 82.81725905, "21B"], [54.9182157167, 82.8164626333, "24"], [54.9180109667, 82.8173984167, "23A"], [54.9179918, 82.817159, "23B"], [54.9188473167, 82.8170330333, "15"], [54.9186481333, 82.8169800667, "17"], [54.9184132, 82.8169327333, "19"], [54.9202288333, 82.8174746333, "1"], [54.918193, 82.8169955667, "21"], [54.9178000833, 82.81733275, "25"], [54.9176839, 82.8168488333, "26"], [54.9198172, 82.8204960667, "5"], [54.919986, 82.82049635, "3"], [54.9197666, 82.8200825, "4"], [54.9193835833, 82.8191669667, "10"], [54.9193426333, 82.8198626667, "11"], [54.9192171667, 82.8191711, "12"], [54.9192621333, 82.8196364167, "13"], [54.9195289667, 82.8193943167, "8"], [54.91946, 82.8201499167, "9"], [54.9196037833, 82.819674, "6"], [54.9194712, 82.8204032, "7A"], [54.9196381, 82.8203709333, "7"], [54.9200137667, 82.8201364333, "2"], [54.9191725167, 82.8193772833, "14"], [54.9214417333, 82.8256822167, "4"], [54.9210291, 82.8259429667, "8"], [54.9212328333, 82.8258132, "6"], [54.9216819833, 82.8253209, "3"], [54.9334697167, 82.8038651667, "326"], [54.9322603667, 82.8028621167, "317"], [54.9322013667, 82.8046802667, "1/341"], [54.9320576167, 82.8165535833, "435"], [54.9319540333, 82.80506915, "2/341"], [54.9316975667, 82.8053442333, "3/341"], [54.9328229833, 82.8062598, "346"], [54.93161565, 82.8074915, "355"], [54.93219305, 82.80629425, "347"], [54.9328549, 82.8080619667, "362"], [54.9321289667, 82.8084019333, "367"], [54.9322225167, 82.8120427667, "397"], [54.9321649, 82.81119325, "393"], [54.9321458833, 82.8131246333, "407"], [54.9327043833, 82.81377405, "416"], [54.9321267167, 82.8144058167, "417"], [54.93212555, 82.8096521333, "373"], [54.9331028667, 82.80928495, "366"], [54.92866875, 82.82177625, "563"], [54.9295602, 82.81924335, "582"], [54.9304707833, 82.8182986167, "590"], [54.93086, 82.8180687667, "592"], [54.9328604833, 82.8172892167, "618"], [54.9342575667, 82.8168357833, "638"], [54.9239713, 82.8245693667, "504"], [54.9365260167, 82.8170911, "673"], [54.9233928833, 82.8249669167, "492"], [54.9248650167, 82.8246300833, "509"], [54.9191798333, 82.8265331667, "435"], [54.9143243333, 82.8310940167, "368"], [54.91459255, 82.8320046, "363"], [54.91127515, 82.8356499167, "311"], [54.9126359667, 82.8340855167, "333"], [54.9096158333, 82.8375218167, "293"], [54.9315868667, 82.8177722833, "604"], [54.9160177667, 82.8299268333, "391"], [54.9204715667, 82.8265481833, "456"], [54.9206352, 82.8265670333, "458"], [54.9208412667, 82.8265323333, "460"], [54.9210184333, 82.82648325, "462"], [54.9212643833, 82.8270422167, "465"], [54.92119945, 82.8264274333, "464"], [54.92136485, 82.8263145667, "466"], [54.9215261, 82.82684075, "467"], [54.9215301833, 82.8262078, "468"], [54.9217701667, 82.8266360167, "1/471"], [54.9218376833, 82.82686725, "2/471"], [54.9217084667, 82.8260839667, "472"], [54.9219782333, 82.8265028333, "475"], [54.9218988833, 82.8259723, "476"], [54.9223939333, 82.8262447, "479"], [54.9223048667, 82.8256582833, "480"], [54.9226657, 82.8261230833, "481"], [54.9224199, 82.8255487833, "482"], [54.9229134167, 82.8259527833, "485"], [54.9226937833, 82.8253693167, "486"], [54.9231509667, 82.8258170333, "487"], [54.92295265, 82.8252571167, "488"], [54.9233779, 82.8256743833, "489"], [54.9232052667, 82.8251109333, "490"], [54.9236200333, 82.82553395, "493"], [54.92385775, 82.8253390833, "495"], [54.9203220167, 82.82650925, "454"], [54.9179795333, 82.8262826, "428"], [54.91038215, 82.8365298167, "303"], [54.9161746667, 82.8297239833, "393"], [54.9083635333, 82.833955, "294"], [54.92029495, 82.8214968167, "39"], [54.9204754333, 82.8247793333, "12B"], [54.9205440833, 82.82344905, "23"], [54.9195974333, 82.8254019333, "2"], [54.9210801, 82.8237748667, "20A"], [54.9209057333, 82.82389775, "18"], [54.9208016833, 82.8221582833, "32"], [54.9209372667, 82.8236919, "20"], [54.9210586833, 82.82351925, "22B"], [54.92092905, 82.8234855333, "22"], [54.9208587333, 82.8231887667, "24"], [54.9210241167, 82.8230882, "24B"], [54.9208547833, 82.8229410667, "26"], [54.9209917, 82.8228447667, "26B"], [54.92097645, 82.8227176167, "28B"], [54.9208099167, 82.8226765167, "28"], [54.9207666833, 82.8224338833, "30"], [54.9209508833, 82.8222094167, "32B"], [54.92076515, 82.8219195167, "34A"], [54.9207399667, 82.8218131667, "34B"], [54.9203075833, 82.8240482833, "19"], [54.9205368167, 82.8237746667, "21"], [54.9205025833, 82.8231658, "25A"], [54.920465, 82.8229733667, "27"], [54.92043535, 82.8227387, "29"], [54.9204582, 82.8225319667, "31"], [54.92024115, 82.8224347833, "31B"], [54.9203792333, 82.8222631667, "33"], [54.92034095, 82.8219843, "35"], [54.9201566167, 82.8219446, "35B"], [54.92030575, 82.8217594333, "37"], [54.9202966833, 82.8233158167, "25"], [54.9192714167, 82.8253842667, "1"], [54.91969695, 82.82516645, "4"], [54.9194904667, 82.82468815, "5"], [54.9198524333, 82.8249096667, "6"], [54.9200581833, 82.8247122, "8"], [54.9193447, 82.8244639667, "5C"], [54.9208238, 82.8241340167, "16"], [54.9193183667, 82.82515695, "1A"], [54.91940575, 82.8249383333, "3"], [54.9211855167, 82.8242545333, "18A"], [54.9207094833, 82.82430275, "14"], [54.92027725, 82.82488135, "10A"], [54.9202305833, 82.8245652667, "10"], [54.9205049667, 82.8244201333, "12"], [54.9196320333, 82.8255586, "22"], [54.9209711, 82.8250444667, "8"], [54.92120665, 82.8252942833, "5"], [54.9210184, 82.8254290333, "7"], [54.9213430333, 82.8252086167, "3"], [54.9207887833, 82.8251555667, "10"], [54.92060805, 82.8257042333, "13"], [54.9208330333, 82.82553905, "9"], [54.9216988833, 82.8249665667, "1"], [54.9215665833, 82.8246573333, "2"], [54.9213729, 82.8247789333, "4"], [54.9211700667, 82.8249324333, "6"], [54.9205967667, 82.8252867, "12"], [54.9204008833, 82.8254234667, "14"], [54.92043265, 82.82582195, "15"], [54.9202037333, 82.8255415833, "16"], [54.9200154333, 82.8256547667, "18"], [54.9197443167, 82.8256164833, "20"], [54.9202814333, 82.82590955, "17"], [54.9202967667, 82.81462555, "98"], [54.92204485, 82.81819735, "61B"], [54.9224241, 82.8179326667, "61C"], [54.9215043167, 82.8227943833, "24"], [54.9219082, 82.8255408167, "8"], [54.9216963, 82.8240856667, "14"], [54.9213418333, 82.8188135667, "55"], [54.9204966333, 82.8183406333, "54A"], [54.9221799833, 82.81122085, "139"], [54.9217387, 82.82431625, "12"], [54.9218650167, 82.8149734167, "107"], [54.9214083333, 82.8220152667, "30"], [54.9213738333, 82.8217301, "32"], [54.9221598167, 82.8247839333, "9"], [54.9216356, 82.8235610667, "18"], [54.9212188167, 82.8221387333, "30B"], [54.9200466667, 82.8166111, "84A"], [54.9216679333, 82.8238393333, "16"], [54.9211582833, 82.82031685, "34"], [54.9221918667, 82.8250378333, "7"], [54.9187410167, 82.8067290167, "170C"], [54.9206532, 82.8170745667, "81"], [54.9212348667, 82.8181024167, "67"], [54.9213057667, 82.8185351167, "57"], [54.9214571, 82.8145877333, "110"], [54.92207085, 82.8136727167, "121"], [54.92190125, 82.8123493, "130"], [54.9207519667, 82.8102467333, "150"], [54.9212159, 82.8096407, "159"], [54.9208313833, 82.8067756, "172"], [54.9214413333, 82.8222779833, "28"], [54.9206921333, 82.8182549, "54"], [54.92043975, 82.8181215, "56"], [54.9218791, 82.8252452167, "10"], [54.92029435, 82.8169818, "84"], [54.9215885167, 82.82308725, "22"], [54.9215897333, 82.8233113167, "20"], [54.92167455, 82.8183345, "61A"], [54.9217164667, 82.8179857333, "63"], [54.92147385, 82.82253565, "26"], [54.9206765333, 82.8160304333, "86"], [54.9188941, 82.8069437, "170A"], [54.9188068333, 82.8068104833, "170B"], [54.9193742667, 82.8085580333, "170"], [54.9214388167, 82.8200072, "45"], [54.9209547167, 82.8157149167, "92"], [54.92088565, 82.8164849333, "85"], [54.92136235, 82.8159546667, "97"], [54.9219607333, 82.8232987, "19"], [54.9210501, 82.8179753833, "69"], [54.9212466667, 82.8222175833, "28A"], [54.9213836167, 82.82300555, "22A"], [54.921339, 82.8227439167, "24A"], [54.9208144333, 82.8173117167, "77"], [54.9189363667, 82.8211582333, "25"], [54.9196676167, 82.8209947333, "26B"], [54.9194113, 82.8211991, "26"], [54.91883205, 82.8209747, "27"], [54.9186925833, 82.8207728833, "29"], [54.9199931833, 82.8240802167, "2"], [54.9191759333, 82.8208279333, "30"], [54.91835395, 82.8196571667, "39"], [54.9198807333, 82.8235938167, "6"], [54.9194567833, 82.82349015, "7"], [54.9200507833, 82.81933875, "58"], [54.9197902167, 82.8182408, "59A"], [54.91991635, 82.81797195, "59B"], [54.9198223833, 82.8179361833, "59C"], [54.9201049333, 82.8197347167, "60"], [54.9199380333, 82.81836645, "61A"], [54.92003775, 82.8182443833, "61B"], [54.9200944167, 82.81803015, "61C"], [54.9201259667, 82.8185610667, "63"], [54.92026275, 82.8188001167, "65"], [54.9188917833, 82.8203729333, "34"], [54.9184921333, 82.8203832, "33"], [54.9190387167, 82.8206181333, "32"], [54.91968705, 82.8224253667, "16"], [54.91981205, 82.823119, "10"], [54.9193882833, 82.8229798333, "11"], [54.9190901167, 82.8227829833, "13B"], [54.9193593, 82.8227247833, "13"], [54.91993935, 82.8226893333, "14B"], [54.91842725, 82.8201474167, "35"], [54.9187965833, 82.8200475333, "36"], [54.9183878167, 82.8198735667, "37"], [54.9188702167, 82.8196982333, "38B"], [54.92027885, 82.8209890667, "82"], [54.9199839667, 82.8190668, "56"], [54.9187008333, 82.81973745, "38A"], [54.9196820167, 82.82262455, "14"], [54.9186528333, 82.8191018, "42"], [54.9182912167, 82.81915535, "43"], [54.91870525, 82.81945675, "40"], [54.9195044333, 82.8214081833, "24"], [54.91857075, 82.8205925167, "31"], [54.9195656167, 82.8181396, "57"], [54.9198411667, 82.8213911167, "24A"], [54.9195851667, 82.8240869667, "3"], [54.9192829167, 82.8239720167, "3A"], [54.9193257, 82.8224725667, "15"], [54.9197290167, 82.8224129833, "16A"], [54.9196499333, 82.8221262667, "18"], [54.9196755333, 82.8243193333, "1"], [54.9192091667, 82.82166805, "21"], [54.91957585, 82.82166585, "22"], [54.9199106833, 82.8238436, "4"], [54.91953715, 82.82372785, "5A"], [54.9193377833, 82.82378105, "5"], [54.9189702833, 82.8184597333, "46"], [54.9185876167, 82.81821495, "47A"], [54.9185706333, 82.8178869167, "47B"], [54.9191945667, 82.81845965, "48"], [54.9188482167, 82.8176680833, "49"], [54.9194043667, 82.81852395, "50"], [54.9196233333, 82.8186248333, "52"], [54.91920055, 82.8179787167, "53"], [54.9198255, 82.8188011167, "54"], [54.9205994333, 82.8207248667, "81"], [54.9193045333, 82.8222075667, "17"], [54.9205621167, 82.8204520167, "79"], [54.9180799333, 82.8194407, "41A"], [54.9208301833, 82.8206735833, "81A"], [54.9202558, 82.8206809333, "80"], [54.91941275, 82.81804965, "55"], [54.9190239, 82.8179808833, "51"], [54.9187854, 82.8180712167, "47"], [54.9187476667, 82.8186516333, "44"], [54.9182977, 82.81889655, "45"], [54.91831675, 82.8194069833, "41"], [54.9192735167, 82.8219502167, "19"], [54.9196219167, 82.82189825, "20"], [54.91962665, 82.8216432667, "22A"], [54.9192782833, 82.8209942, "28"], [54.9208129833, 82.8209176833, "83A"], [54.9206351167, 82.8209705667, "83"], [54.9203109333, 82.8212402667, "84"], [54.91909575, 82.82139795, "23"], [54.9197787167, 82.8228814, "12"], [54.9195628333, 82.81791605, "57A"], [54.9198373833, 82.8233606833, "8"], [54.9194342167, 82.82322975, "9"] ]; ================================================ FILE: assets/heat_realworld.js ================================================ //An extract of address points from the LINZ bulk extract: http://www.linz.govt.nz/survey-titles/landonline-data/landonline-bde //Should be this data set: http://data.linz.govt.nz/#/layer/779-nz-street-address-electoral/ var addressPoints1 = [ [54.8839, 82.3745188667, "571"], [54.8869090667, 82.3657417333, "486"], [54.8894207167, 82.4015351167, "807"], [54.8927369333, 82.4087452333, "899"], [54.90585105, 82.4453463833, "1273"], [54.9064188833, 82.4441556833, "1258"], [54.90584715, 82.4463564333, "1279"], [54.9033391333, 82.4244005667, "1078"], [54.9061991333, 82.4492620333, "1309"], [54.9058955167, 82.4445613167, "1261"], [54.88888045, 82.39146475, "734"], [54.8950811333, 82.4107982, "928"], [54.88909235, 82.3922956333, "740"], [54.8889259667, 82.3938591667, "759"], [54.8876576333, 82.3859563833, "687"], [54.89027155, 82.3973178833, "778"], [54.8864473667, 82.3806136833, "631"], [54.9000262833, 82.4183242167, "1012"], [54.90036495, 82.4189457, "1024"], [54.9000976833, 82.4197312167, "1027"], [54.90239975, 82.42371165, "1067"], [54.9043379667, 82.42430325, "1080"], [54.9026441, 82.4231055167, "1068"], [54.8883536333, 82.3888573833, "718"], [54.9029948833, 82.4237386167, "1070"], [54.89824135, 82.4150421667, "982"], [54.8976067833, 82.41510265, "983"], [54.9023491333, 82.4225495, "1066"], [54.8856157167, 82.3775632833, "608"], [54.8963032667, 82.4132068, "951"], [54.8922813667, 82.4073402333, "1/898"], [54.88933345, 82.3956084333, "769"], [54.8936148833, 82.4090577, "906"], [54.8939398, 82.4094444833, "914"], [54.8857355333, 82.3722297667, "542"], [54.8931092167, 82.4083014, "898"], [54.9008253167, 82.4198128, "1030"], [54.9045052333, 82.4260735, "1100"], [54.9053927167, 82.42822265, "1130"], [54.90507935, 82.4313065, "1147"], [54.9055749667, 82.4319092167, "1154"], [54.9039034833, 82.4274736667, "1/1105"], [54.9037633, 82.4261181833, "1093"], [54.9038755, 82.42871045, "3/1105"], [54.90369555, 82.4285285, "2/1105"], [54.9056626, 82.4341078833, "1170"], [54.9018736833, 82.438852, "1/1213"], [54.9057596167, 82.4356650167, "1180"], [54.9053502, 82.4361049333, "1185"], [54.9053379167, 82.4366986167, "1195"], [54.9058892333, 82.4381450333, "1204"], [54.9060264167, 82.4400763167, "1220"], [54.9056766833, 82.4412592, "1233"], [54.9057312167, 82.4418380333, "1235"], [54.9061575833, 82.4421068667, "1242"], [54.9063946167, 82.4438004667, "1256"], [54.8996027667, 82.43995055, "4/1215"], [54.9006449667, 82.4395556833, "3/1215"], [54.9009138167, 82.4394061333, "2/1215"], [54.9034547, 82.4396315, "1219"], [54.9055243, 82.4396033, "1221"], [54.89952325, 82.4406619167, "5/1215"], [54.90561525, 82.4404853167, "1225"], [54.9045602333, 82.4477690333, "1285"], [54.9040051667, 82.4388491833, "1213"], [54.90588145, 82.4440349167, "1257"], [54.90595915, 82.4389286833, "1212"], [54.9059939667, 82.4398068833, "1218"], [54.8868631833, 82.37991055, "630"], [54.8878744833, 82.382179, "650"], [54.8880764, 82.3839845667, "670"], [54.8850457333, 82.3759821, "594"], [54.88446045, 82.3762872667, "587"], [54.8880782667, 82.38423415, "1/670"], [54.8863533833, 82.3690698667, "515"], [54.8861783167, 82.3710009833, "530"], [54.885424, 82.3716677833, "541"], [54.88524065, 82.3722141167, "547"], [54.9022371333, 82.47991035, "10"], [54.9020014833, 82.4799581667, "1"], [54.9020824, 82.4802630167, "2"], [54.9018589833, 82.4804760833, "3"], [54.9018211333, 82.4806769667, "4"], [54.9021543667, 82.4805538833, "5"], [54.9022658, 82.4807579333, "6"], [54.9024517833, 82.4806480667, "7"], [54.9024251167, 82.48041985, "8"], [54.9023317833, 82.4802119667, "9"], [54.9321212167, 82.4555088, "39"], [54.8956185167, 82.4719458667, "4"], [54.8954566, 82.4728120333, "20"], [54.8957231833, 82.4727906, "22A"], [54.8956085833, 82.4726702, "22"], [54.8956460167, 82.4718485167, "2"], [54.8953487167, 82.47202915, "5"], [54.8800121167, 82.4865467167, "9"], [54.8803487833, 82.48595255, "3"], [54.8802064167, 82.4861004, "5"], [54.8800705167, 82.4862671167, "7"], [54.8798887333, 82.4863712333, "7A"], [54.8801676667, 82.4866722667, "10"], [54.88029245, 82.4868499667, "8"], [54.8803302167, 82.4865822167, "6"], [54.88038715, 82.4864004167, "4"], [54.8805029333, 82.4862314167, "2"], [54.9127148667, 82.4710607833, "51"], [54.9118609667, 82.4668648, "20"], [54.9122010667, 82.47078695, "49A"], [54.91191245, 82.4682913833, "29"], [54.9112774333, 82.4668027333, "17A"], [54.91244995, 82.4700709833, "41"], [54.9149636, 82.4772568333, "98"], [54.9128421833, 82.4702103167, "42"], [54.91130515, 82.4650217667, "2"], [54.9140405333, 82.4754503833, "85"], [54.91155815, 82.4670938833, "21"], [54.9144416167, 82.4754564, "86"], [54.91149715, 82.4668828667, "19"], [54.9155068167, 82.4784839167, "116"], [54.9135311667, 82.4736794833, "69"], [54.9146717667, 82.4773664833, "103"], [54.913582667, 82.4724437333, "62"], [54.9117463, 82.4676612167, "23"], [54.9136108833, 82.47263915, "64"], [54.9118005167, 82.46788515, "25"], [54.9142630167, 82.4748833333, "80"], [54.9118481833, 82.4680930167, "27"], [54.91519165, 82.47727755, "100"], [54.9121701, 82.4679073167, "28"], [54.9152358167, 82.4780924833, "112"], [54.9122425667, 82.4681859167, "30"], [54.9150027167, 82.47843285, "107"], [54.91196865, 82.4684916833, "31"], [54.9132330333, 82.4726685333, "61"], [54.9123722, 82.4685087667, "32"], [54.915824667, 82.4790262, "113"], [54.9120319833, 82.46868985, "33"], [54.9151328167, 82.4788729, "111"], [54.9124617167, 82.4687799833, "34"], [54.9150617167, 82.4786454167, "109"], [54.9120926, 82.4688931667, "35"], [54.9132881333, 82.47285965, "63"], [54.9119984333, 82.4691844, "37A"], [54.9120311, 82.4673706667, "24"], [54.91214925, 82.46909885, "37"], [54.91408025, 82.4759690833, "91B"], [54.9125366, 82.4691343, "38"], [54.9134794833, 82.4739836167, "71A"], [54.9122081167, 82.4674649333, "26A"], [54.9140814333, 82.4736708667, "72A"], [54.9120801, 82.4675947333, "26"], [54.9113324167, 82.46512405, "4"], [54.91185795, 82.4686138167, "31A"], [54.9144403167, 82.4767387667, "101"], [54.9125054167, 82.46896025, "36A"], [54.9151334833, 82.4778022667, "106"], [54.9126167833, 82.4688409667, "36B"], [54.9111576, 82.4663765167, "13A"], [54.9112960833, 82.4662379, "13"], [54.9116252167, 82.46602135, "14"], [54.9113666167, 82.4664507833, "15"], [54.9117068333, 82.466336, "16"], [54.9114338333, 82.4666576, "17"], [54.9119338667, 82.4665694167, "18A"], [54.9117808333, 82.4665752, "18"], [54.9110205, 82.4652438667, "3"], [54.9110742833, 82.4654501167, "5"], [54.9111370833, 82.4656566833, "7"], [54.9111865833, 82.4658542667, "9"], [54.9112390333, 82.46602075, "11"], [54.9118135167, 82.46543705, "6A"], [54.9118572167, 82.46556135, "6B"], [54.91145615, 82.4655286, "6"], [54.9115389167, 82.4657957167, "8"], [54.9127748333, 82.4699760667, "40"], [54.9125127167, 82.4703133, "43"], [54.9129274, 82.4704172833, "44"], [54.9125759833, 82.4705303667, "45"], [54.9129758667, 82.4706118, "46"], [54.9126359667, 82.4707644, "47"], [54.91226225, 82.47106665, "49"], [54.9130937833, 82.4709588833, "50"], [54.9131644667, 82.4711523, "52"], [54.9132299667, 82.4713462167, "60"], [54.9127690833, 82.4712279667, "53"], [54.9133607167, 82.4730695833, "65"], [54.91367805, 82.4728816667, "66"], [54.9134211, 82.4732760667, "67"], [54.9137477833, 82.4731176, "68"], [54.9138932333, 82.4736511667, "70"], [54.9135950667, 82.4738879833, "71"], [54.9139430167, 82.4737982333, "72"], [54.9136486, 82.4740868667, "73"], [54.91400415, 82.4740125833, "74"], [54.9140350333, 82.4741693833, "76"], [54.91432385, 82.475081, "82"], [54.9139975333, 82.47523055, "83"], [54.9143889667, 82.47526065, "84"], [54.9137640333, 82.47575135, "87"], [54.91449875, 82.4756521167, "88"], [54.9141123, 82.4756848833, "89"], [54.9145492167, 82.4758458667, "90"], [54.9141779667, 82.4758650667, "91"], [54.9146104833, 82.4760345, "92"], [54.9142320333, 82.4760478833, "93"], [54.9146642167, 82.47621125, "94"], [54.9142896667, 82.4762277667, "95"], [54.9147136833, 82.4764402833, "96"], [54.9143434167, 82.47639805, "97"], [54.9143937167, 82.4765685, "99"], [54.91501315, 82.4774403667, "102"], [54.9154860667, 82.4774428167, "104"], [54.9149432667, 82.4782801, "105"], [54.9152651667, 82.47833035, "114"], [54.9299333167, 82.55909085, "128"], [54.9286782833, 82.5545978, "181"], [54.9300747333, 82.5497311333, "3/193"], [54.9276611167, 82.5543011333, "192"], [54.9305557833, 82.5594630333, "129"], [54.9280362, 82.5517895, "2/193"], [54.9284764, 82.5616764333, "103"], [54.93143935, 82.55390345, "165"], [54.9288132, 82.5647016167, "61"], [54.9275235, 82.5619954833, "94"], [54.93081245, 82.5577222333, "149"], [54.9300416667, 82.5566331333, "161"], [54.92921255, 82.5684947, "16"], [54.9304111667, 82.5673126333, "35"], [54.9291729667, 82.5653647333, "55"], [54.9289266333, 82.5656691333, "56"], [54.92751825, 82.5531413167, "1/193"], [54.9323321667, 82.5512635167, "1/165"], [54.9045377667, 82.4827770167, "3"], [54.9051343333, 82.4829339167, "10"], [54.9045625, 82.4832139167, "4"], [54.9052854167, 82.4828661667, "12"], [54.9045012833, 82.4825234, "3A"], [54.9054383, 82.4831963, "14"], [54.9048575167, 82.4826078167, "7"], [54.9050790667, 82.4825558167, "9A"], [54.90496205, 82.4830191667, "8"], [54.9050431833, 82.4823803833, "9B"], [54.9047063167, 82.4826914667, "5"], [54.9051649333, 82.4825182667, "11"], [54.9047697333, 82.4831092667, "6"], [54.9044120833, 82.4828407333, "1"], [54.8987653333, 82.4845873667, "12"], [54.89849935, 82.4843253333, "8"], [54.8989808833, 82.4835699333, "13"], [54.8982670333, 82.4839818167, "5"], [54.89792805, 82.4841291833, "1"], [54.8990696333, 82.48395625, "18"], [54.8983429167, 82.4837488833, "7A"], [54.8986908667, 82.4846387167, "10"], [54.8985086333, 82.48330895, "9A"], [54.8980756833, 82.4840675333, "3"], [54.8984572667, 82.4838707, "7"], [54.8988333833, 82.48411825, "16"], [54.89797735, 82.4845139167, "2"], [54.8988639833, 82.4832473, "9B"], [54.8985740667, 82.4844548333, "8A"], [54.8983953667, 82.4832022167, "9"], [54.898132, 82.48448765, "4"], [54.8983169333, 82.48441905, "6"], [54.898835, 82.4848386, "12A"], [54.8982524667, 82.4837739667, "5A"], [54.7992683667, 82.4068494, "44D"], [54.7973138333, 82.40680895, "37"], [54.79798795, 82.4063265667, "41"], [54.7983426667, 82.4060350833, "38"], [54.7981863, 82.40728095, "45"], [54.7985252667, 82.4070533167, "46"], [54.7991710833, 82.4079073667, "44A"], [54.7994488333, 82.4084595333, "44B"], [54.7998703833, 82.4089765833, "44C"], [54.7969343667, 82.4040572333, "15"], [54.7991115833, 82.406026, "44E"], [54.9108972667, 82.4737860333, "1"], [54.9109227833, 82.4740157167, "3"], [54.9110122167, 82.47419315, "5"], [54.91133475, 82.4740478833, "6"], [54.91125305, 82.4738936667, "4"], [54.9111422333, 82.4736767667, "2"], [54.9110952167, 82.47448295, "7"], [54.9112131667, 82.4741245667, "8"], [54.8804519333, 82.4809153167, "16A"], [54.8808188333, 82.4804471833, "8"], [54.8805619667, 82.4804252833, "10"], [54.8810451833, 82.4809865167, "11"], [54.8806955167, 82.4806394, "12"], [54.8808969, 82.48108405, "13"], [54.8806416, 82.4807763833, "14"], [54.8807567, 82.48110125, "15"], [54.8806444167, 82.4809707333, "16"], [54.8805414833, 82.4812062167, "17"], [54.8812994167, 82.4798864833, "1"], [54.8810411333, 82.4798769333, "2"], [54.8812669, 82.4801150167, "3"], [54.8810092333, 82.4800721333, "4"], [54.8811867333, 82.48041535, "5"], [54.8809235, 82.4802776833, "6"], [54.8811437833, 82.4806999667, "7"], [54.8811760167, 82.4808741333, "9"], [54.8778504833, 82.5246844167, "102"], [54.8819230667, 82.52038225, "37"], [54.8838481333, 82.5190955, "15"], [54.8825636667, 82.5211268, "42"], [54.8789988, 82.528298167, "79"], [54.8729074667, 82.5286693667, "167"], [54.8760724333, 82.52502585, "127"], [54.8745184833, 82.5278637167, "148"], [54.8744641, 82.5268869667, "145"], [54.8971449, 82.3967563, "82"], [54.8943781833, 82.3977300667, "44"], [54.9004613, 82.47640765, "13"], [54.9004093667, 82.4762205333, "11"], [54.9002790833, 82.4769703167, "16"], [54.9003597167, 82.4772565, "20"], [54.90090275, 82.4763007167, "15"], [54.90094715, 82.4764403167, "17"], [54.9006751333, 82.4771785333, "27"], [54.90107225, 82.4768541333, "25"], [54.9001119667, 82.4749271333, "1"], [54.9006160667, 82.4769211667, "23"], [54.9002628, 82.4757354, "3"], [54.9005473333, 82.4767056, "19"], [54.9002167333, 82.4750815167, "2"], [54.8998862167, 82.4772123833, "18"], [54.9003037333, 82.47596475, "9"], [54.9000952167, 82.4752010833, "2A"], [54.9006044167, 82.475943, "9A"], [54.9085414, 82.47102025, "1"], [54.90831215, 82.4705452333, "4"], [54.9085338333, 82.4706769667, "2"], [54.90815565, 82.470603, "5"], [54.9082244667, 82.4708460167, "6"], [54.9083062, 82.4711227667, "7"], [54.9084509833, 82.47045035, "3"], [54.8911392333, 82.4583220667, "8"], [54.891127, 82.4585561667, "10"], [54.8912095833, 82.4581187333, "7"], [54.8910674833, 82.4575599333, "2"], [54.8913220333, 82.4574411833, "1"], [54.89159775, 82.4573200333, "1A"], [54.8910451833, 82.4580652333, "6"], [54.8913072667, 82.4576702667, "3"], [54.8913322, 82.4579054333, "5"], [54.8910210167, 82.45784865, "4"], [54.8853014, 82.4629564833, "3"], [54.88554135, 82.4629736, "2"], [54.88541785, 82.46296925, "1"], [54.9193531833, 82.54385725, "354"], [54.9188882667, 82.5420886333, "355"], [54.9192738333, 82.5435102833, "356"], [54.9192985333, 82.5429392833, "358"], [54.9193181167, 82.54233135, "360"], [54.9192005, 82.5403558833, "130"], [54.9186817333, 82.5404104667, "109"], [54.9199342167, 82.5412764833, "260"], [54.9193768333, 82.5412782167, "223"], [54.91831485, 82.5400403333, "103"], [54.91961875, 82.5408546833, "200"], [54.9176805, 82.5413459167, "105"], [54.9190955, 82.5408870167, "171"], [54.9182861833, 82.5408937167, "107"], [54.9195153, 82.5433797, "352"], [54.92030865, 82.54192075, "264"], [54.920463, 82.5417725, "262"], [54.9197269667, 82.5432480167, "350"], [54.9197592167, 82.5415707667, "266"], [54.9195913167, 82.54231935, "348"], [54.9183186167, 82.5393124667, "2"], [54.9187989667, 82.53988695, "70"], [54.9185694, 82.5418133, "353"], [54.8994012, 82.3657659333, "821"], [54.89971895, 82.3645648833, "835"], [54.9139332167, 82.4090271667, "332"], [54.8988464667, 82.3659825667, "828"], [54.9022981, 82.38067085, "685"], [54.9065350333, 82.4018221167, "434"], [54.90028885, 82.3798328667, "697"], [54.9084945333, 82.4050759167, "410"], [54.89922135, 82.3740981833, "747"], [54.9232422167, 82.4145657333, "185"], [54.9245097667, 82.41242555, "187"], [54.9159503333, 82.40778185, "303"], [54.9094665, 82.4069157667, "388"], [54.9231998333, 82.4170489, "158"], [54.9102601, 82.4072221667, "383"], [54.9207001, 82.4065603167, "257"], [54.9102264, 82.4082195, "372"], [54.928280667, 82.4087488, "233"], [54.9021599833, 82.3911428167, "598"], [54.9229502667, 82.4127942667, "197"], [54.90296435, 82.3924815167, "583"], [54.9255960833, 82.4136194333, "2/187"], [54.9245176, 82.4278129833, "59"], [54.9249067167, 82.4263146667, "75"], [54.92534045, 82.4130770333, "1/187"], [54.9077678, 82.4038107833, "424"], [54.9244162333, 82.4258990667, "76"], [54.9237273333, 82.4194401833, "138"], [54.9019339833, 82.3879181167, "625"], [54.90920365, 82.4053418167, "397"], [54.9057407667, 82.39478875, "540"], [54.9243174333, 82.4220341833, "112"], [54.8992012333, 82.3666729333, "815"], [54.9110874833, 82.4102195833, "360"], [54.9027096, 82.3913196333, "591"], [54.9011183833, 82.38410915, "655"], [54.9234701333, 82.4155696333, "181"], [54.9025482, 82.3926162167, "582"], [54.92450575, 82.4246711167, "90"], [54.9242924167, 82.4289432833, "47"], [54.8986079833, 82.3685293333, "801"], [54.9030857, 82.3932839, "577"], [54.90235535, 82.3894401667, "613"], [54.9008578833, 82.3826145667, "675"], [54.90071405, 82.3818195, "681"], [54.8820639667, 82.4856738333, "4"], [54.8811382833, 82.4847224333, "17"], [54.8820705, 82.4859065167, "2"], [54.8822594167, 82.4854946333, "5"], [54.88230695, 82.4860176667, "1"], [54.8816572833, 82.4846057667, "14"], [54.8822931167, 82.4857413833, "3"], [54.8820614833, 82.4849636833, "10"], [54.8814784167, 82.4853259333, "20"], [54.8820341167, 82.4854254, "6"], [54.8814562667, 82.4855579, "22"], [54.8820407667, 82.4852060167, "8"], [54.88139725, 82.4857370167, "24"], [54.8819474, 82.4846312, "12"], [54.8812179833, 82.4855291833, "23"], [54.8811665833, 82.4849644, "19"], [54.8822871333, 82.4850344167, "9"], [54.8822664667, 82.4852611, "7"], [54.8813914667, 82.4847524, "16"], [54.8812347667, 82.4852638167, "21"], [54.8814556, 82.48509055, "18"], [54.8811484833, 82.4844946, "15"], [54.8823244833, 82.4848154333, "11"], [54.8823452833, 82.4845833667, "13"], [54.9599893167, 82.5018972167, "82"], [54.9618358833, 82.4874459667, "18"], [54.9618619, 82.50776785, "90"], [54.9616283333, 82.4929460167, "64"], [54.9611726167, 82.4984393667, "80"], [54.9607851, 82.5016190333, "86"], [54.9608416167, 82.4971466, "78"], [54.9614436333, 82.5080607667, "92"], [54.9643050333, 82.4953529167, "2/84"], [54.9610803, 82.4864609, "7"], [54.9606146667, 82.4939399, "83"], [54.9609926167, 82.4857235333, "3"], [54.96113465, 82.4948554, "84"], [54.9613254333, 82.5047791833, "88"], [54.8593059833, 82.5330650333, "10"], [54.8596072333, 82.533587, "19"], [54.90423375, 82.4844148, "107B"], [54.9020309333, 82.4769959167, "49A"], [54.9029281167, 82.4805014167, "81A"], [54.9016197667, 82.4756437833, "37"], [54.90101005, 82.4735379833, "21"], [54.9016823667, 82.4760847833, "39A"], [54.90178185, 82.4761837333, "41"], [54.9011922667, 82.4725514167, "8"], [54.9015593833, 82.4738315333, "26"], [54.9015446833, 82.473388, "18A"], [54.9024291, 82.4783928, "57"], [54.9010319, 82.4736316167, "23"], [54.9039576333, 82.4835641667, "103"], [54.9011953333, 82.4741573333, "29A"], [54.9042121, 82.4828802833, "100"], [54.9010152, 82.4741578667, "29B"], [54.9019761833, 82.4752665167, "34"], [54.90256225, 82.4788024667, "71"], [54.9031558833, 82.4793385, "68"], [54.9043412833, 82.48477025, "109A-109D"], [54.9030168667, 82.4803624833, "81"], [54.9054432333, 82.48740955, "114"], [54.9032955667, 82.4821555167, "93B"], [54.9052043, 82.4875160667, "118"], [54.9040282167, 82.4838154167, "105"], [54.90498365, 82.4875592167, "120"], [54.90388715, 82.4833244, "101"], [54.90156105, 82.47306285, "1/14-5/14"], [54.9028688, 82.4798400167, "77"], [54.908212, 82.4730746667, "16A"], [54.9034353833, 82.48239905, "95A"], [54.9018501333, 82.47294875, "16B"], [54.9065120667, 82.4873521833, "114A"], [54.9027523, 82.47799015, "58"], [54.9029325833, 82.4801074833, "79"], [54.9032525167, 82.4811784, "87"], [54.9031822833, 82.4809204, "85"], [54.9033394667, 82.4814522333, "89"], [54.9011077167, 82.4738625833, "25"], [54.9024641, 82.4756984333, "40"], [54.9044449, 82.4836965167, "104"], [54.9023471833, 82.47810245, "55"], [54.9029669667, 82.4787094167, "62"], [54.90442275, 82.4850982, "115"], [54.9026089, 82.47587495, "44"], [54.90264365, 82.4790681667, "73"], [54.9035878333, 82.4823534, "95"], [54.9024915, 82.4786270833, "67"], [54.9031010167, 82.4812452667, "87A"], [54.9030982, 82.47913305, "66"], [54.9035099167, 82.4821307, "93A"], [54.90079465, 82.4741973833, "33"], [54.9040185667, 82.48229025, "96"], [54.9023384167, 82.4765524833, "50"], [54.9022154167, 82.4786401833, "59"], [54.9018837333, 82.4765543333, "45"], [54.9029163333, 82.4785064167, "60"], [54.9022748167, 82.4763478167, "48"], [54.9041422, 82.4826398833, "98"], [54.9022017333, 82.4761212333, "46A"], [54.9034542333, 82.4818904, "91"], [54.9019505833, 82.4767386667, "47"], [54.9018310833, 82.4763711167, "43"], [54.9022245, 82.4761991, "46B"], [54.9022058833, 82.4776710667, "51"], [54.9011141167, 82.4738904667, "31"], [54.90381365, 82.48307595, "99"], [54.9013508667, 82.4731568833, "14"], [54.9026744667, 82.4776618667, "54"], [54.9013012667, 82.4729456, "12"], [54.9016709167, 82.4758279833, "39"], [54.9012509333, 82.4727291833, "10"], [54.902262, 82.4778573167, "53"], [54.9011626167, 82.4723885667, "6"], [54.9015607167, 82.4753714333, "35"], [54.9007910667, 82.47417145, "27"], [54.9020738833, 82.47565455, "36"], [54.9010502667, 82.4719555, "4"], [54.9036689667, 82.4826166, "97"], [54.90165275, 82.4742215833, "28"], [54.9043576, 82.4834127, "102"], [54.9014172833, 82.4734044167, "18"], [54.90310965, 82.4806441333, "83"], [54.90305305, 82.4810779, "85A"], [54.9041825833, 82.4842419667, "107A"], [54.9018864667, 82.4749266667, "32"], [54.9018503333, 82.47696095, "49"], [54.9030326167, 82.47892515, "64"], [54.9017621333, 82.4733169667, "20"], [54.89705485, 82.4732848667, "5"], [54.8972060833, 82.4727957833, "1A"], [54.8950392167, 82.47373745, "28B"], [54.8965514333, 82.4726139833, "6"], [54.8952181167, 82.4744414833, "33B"], [54.8952637167, 82.47354965, "26A"], [54.8951086667, 82.4742331167, "33A"], [54.8966904333, 82.4729455, "11A"], [54.8962754333, 82.4733100167, "17"], [54.8968641333, 82.4728138667, "1/3-5/3"], [54.8949580667, 82.4743396167, "35"], [54.8973106167, 82.4729746, "1B"], [54.8949376167, 82.47388345, "30"], [54.89572315, 82.4732895, "18"], [54.8958303167, 82.4731749333, "16"], [54.8969656167, 82.4732634, "7"], [54.896495, 82.4731159833, "13"], [54.8968125667, 82.4731199333, "11B"], [54.89640605, 82.4732035667, "15"], [54.8952445667, 82.4736735667, "26"], [54.8960091167, 82.47303035, "14"], [54.896205, 82.47289145, "10"], [54.8956152, 82.4738212833, "29"], [54.8950829667, 82.4737896, "28A"], [54.8955509167, 82.4734385333, "22"], [54.8972144833, 82.4729756, "1C"], [54.8970069167, 82.4727237833, "1D"], [54.8964112667, 82.4727309333, "8"], [54.89685155, 82.4723649167, "2"], [54.8959909833, 82.4735371333, "19"], [54.8968653333, 82.4732429833, "9"], [54.8952936, 82.4740853667, "31"], [54.8956491833, 82.47335855, "20"], [54.8971588833, 82.4725988, "1"], [54.95948505, 82.3813743167, "3/362"], [54.9267924667, 82.3947664833, "790"], [54.95374205, 82.3785110333, "417"], [54.9270906333, 82.3962139333, "802"], [54.95208085, 82.3790772833, "435"], [54.9537863833, 82.37916715, "418"], [54.9336977167, 82.3872475333, "660"], [54.9370890667, 82.3861055333, "610"], [54.9632177167, 82.37745245, "310"], [54.9552044167, 82.3775981, "391"], [54.95356905, 82.3785904167, "419"], [54.9658669167, 82.3737947167, "273"], [54.9591853, 82.37834395, "360"], [54.95818485, 82.3776341167, "1/362"], [54.9264044, 82.3933694833, "770"], [54.94279195, 82.3830579333, "541"], [54.9358610167, 82.3856405, "623"], [54.92604605, 82.39188825, "762"], [54.95893715, 82.3798225167, "2/362"], [54.9257693333, 82.3904065167, "750"], [54.9654268167, 82.3769618333, "308"], [54.9323014833, 82.3868321333, "743"], [54.93764955, 82.3850314, "599"], [54.9095889, 82.4694829333, "13"], [54.9099912333, 82.4694063167, "4"], [54.9101332, 82.4693430167, "2"], [54.90943375, 82.4691617333, "9"], [54.90960705, 82.46916755, "7"], [54.9100405, 82.4689760667, "1"], [54.9095270167, 82.4693311, "11"], [54.9098948167, 82.4690437, "3"], [54.9097340167, 82.4696952667, "10"], [54.9095571, 82.4697117833, "12"], [54.90975285, 82.4691024667, "5"], [54.9018515667, 82.47956045, "10"], [54.9025733333, 82.4796073833, "1A"], [54.90234615, 82.4792779, "4"], [54.9027908167, 82.4795601333, "1"], [54.9024103667, 82.47967745, "3"], [54.90205615, 82.4794369167, "8"], [54.89827985, 82.4664433333, "25"], [54.8990345167, 82.4670508, "11"], [54.8989251667, 82.4664513667, "17"], [54.8990204833, 82.4665540333, "15"], [54.8996123667, 82.4678836167, "10"], [54.89873215, 82.4672828, "18"], [54.89858465, 82.4666028667, "21"], [54.8990743833, 82.4675788, "12A"], [54.8984592, 82.4665057, "23"], [54.89889965, 82.467451, "12"], [54.9002081667, 82.46756315, "1"], [54.9001357167, 82.4679316667, "4"], [54.898277, 82.46726385, "24"], [54.89978315, 82.46793515, "8"], [54.8983929667, 82.4669553667, "26"], [54.8991940667, 82.4672154167, "9"], [54.8980936167, 82.4664998167, "27"], [54.8995042, 82.4674747167, "7"], [54.898334, 82.46731845, "22"], [54.8999632833, 82.4679440333, "6"], [54.89794665, 82.4665422333, "29"], [54.8988821167, 82.4669019167, "13"], [54.8980275167, 82.4668801333, "30"], [54.89871525, 82.4676048667, "14"], [54.8977558667, 82.4665362333, "31"], [54.8986535, 82.4675602667, "16"], [54.8979195833, 82.4667739667, "32"], [54.89979585, 82.4675336833, "5"], [54.8974943167, 82.46652485, "33"], [54.8987147333, 82.46672835, "19"], [54.8977257333, 82.4666500833, "34"], [54.8985690333, 82.4671123833, "20"], [54.9003081667, 82.46791995, "2"], [54.8981989167, 82.4668991, "28"], [54.8999918333, 82.4675733167, "3"], [54.9085979, 82.47228295, "6"], [54.9082979333, 82.4727952, "1"], [54.9084415, 82.4723396833, "4"], [54.9085185333, 82.4726990667, "3"], [54.90870765, 82.4724272833, "8"], [54.9082453167, 82.4725341667, "2"], [54.9087162, 82.4725830333, "5"], [54.8992527333, 82.4614825, "5A"], [54.8974537333, 82.4597499, "30"], [54.8990513167, 82.461357, "5"], [54.89854655, 82.4618827833, "2"], [54.8962418167, 82.4614646667, "69"], [54.89729515, 82.4597868833, "32"], [54.8986072, 82.4598125833, "18"], [54.8990041, 82.4601224, "17"], [54.8986801, 82.46007825, "16"], [54.8976013667, 82.4596983333, "28"], [54.8987992333, 82.4607934667, "10"], [54.8961486, 82.4612296167, "65"], [54.8987145333, 82.4602998667, "14"], [54.8986250667, 82.4616027833, "6"], [54.8985372, 82.4606703, "12A"], [54.8990944833, 82.4618171167, "3A"], [54.8987547833, 82.4605145833, "12"], [54.8989327667, 82.46174375, "3"], [54.89940475, 82.4614229833, "5B"], [54.8981109833, 82.4595815167, "22"], [54.8992761667, 82.4612548833, "7A"], [54.89858635, 82.4617420167, "4"], [54.89615355, 82.4610093667, "63"], [54.8960633167, 82.4614357, "67"], [54.8970480833, 82.4594701667, "47"], [54.8964719167, 82.4610726, "46"], [54.89942805, 82.4612639, "7B"], [54.8969129333, 82.4595048833, "49"], [54.8983810333, 82.4595983, "20"], [54.8966503, 82.4601548, "40"], [54.8965228167, 82.4605625667, "42"], [54.8979410167, 82.4596252, "24"], [54.89698365, 82.45986105, "36"], [54.89909445, 82.46094265, "9"], [54.8990747, 82.4611943333, "7"], [54.8968194333, 82.4598978167, "38"], [54.8990957833, 82.4607578667, "11"], [54.8993121167, 82.4605309833, "13A"], [54.8993347667, 82.4606526667, "11A"], [54.8977427333, 82.4596749667, "26"], [54.8964422833, 82.4608866833, "44"], [54.897148, 82.4598171667, "34"], [54.8964457667, 82.4614839667, "50"], [54.8965226, 82.4613232333, "48"], [54.89666225, 82.4616268167, "50A"], [54.8967215667, 82.4614938667, "48A"], [54.8961699833, 82.4606764833, "61"], [54.8990274167, 82.4594845333, "21A"], [54.8978044833, 82.4592938, "37"], [54.89765145, 82.45932785, "39"], [54.8972011167, 82.4594360833, "45"], [54.89748945, 82.45936165, "41"], [54.8973585333, 82.4594078333, "43"], [54.8989135833, 82.4593674167, "23A"], [54.8982502167, 82.4591910333, "31"], [54.8980929167, 82.4592136833, "33"], [54.8979576667, 82.4592540667, "35"], [54.8987865, 82.459442, "23"], [54.8983624667, 82.4591781333, "29"], [54.89859365, 82.4592542667, "25"], [54.8984648833, 82.4592043833, "27"], [54.89599285, 82.4605853833, "61A"], [54.8967193667, 82.4595488167, "51"], [54.89895945, 82.45991735, "19"], [54.8988903667, 82.4596039833, "21"], [54.8991762833, 82.4598346833, "19A"], [54.8990309833, 82.4603212, "15"], [54.8992306667, 82.4600061667, "17A"], [54.8990798333, 82.46053775, "13"], [54.8960234, 82.46042255, "59A"], [54.8961819167, 82.4595465333, "55A"], [54.8965562167, 82.4596334167, "53"], [54.8962467833, 82.4604475, "59"], [54.8961687167, 82.459936, "57A"], [54.8963601167, 82.4599881167, "57"], [54.8964266, 82.4598209333, "55"], [54.89876895, 82.4610164333, "8"], [54.89888655, 82.46191985, "1"], [54.8992657, 82.4618445667, "3B"], [54.89942775, 82.46177925, "3C"], [54.8994213333, 82.461939, "3D"], [54.8877845667, 82.4769104167, "15A"], [54.8884691333, 82.47652905, "9"], [54.8876236833, 82.4762465333, "14"], [54.8881092667, 82.4765359833, "11"], [54.8870282333, 82.47689615, "21"], [54.8878168667, 82.4761862, "12"], [54.8869641167, 82.4766908333, "20"], [54.88876965, 82.4761694167, "7"], [54.8866340667, 82.4762948167, "20D"], [54.8875209833, 82.4767726667, "17"], [54.8878835333, 82.4766054, "13"], [54.8870823167, 82.4763955, "18"], [54.8885070833, 82.4758756667, "6"], [54.8880108, 82.4760921833, "10"], [54.8888735667, 82.4758855333, "5"], [54.8879635, 82.4768245333, "13A"], [54.8890102, 82.4753934667, "1"], [54.887397, 82.4763382, "16"], [54.8867165333, 82.4763817833, "20C"], [54.8881819, 82.4760513167, "8"], [54.886801, 82.4764408667, "20B"], [54.8873439167, 82.4769787167, "19A"], [54.88688675, 82.47651985, "20A"], [54.8872187, 82.4769650667, "19"], [54.8874603333, 82.4770461667, "19B"], [54.8877107667, 82.4766732833, "15"], [54.9028793667, 82.4694345, "9"], [54.9027742, 82.4691508167, "5"], [54.9027706333, 82.46934705, "7"], [54.9030670833, 82.4689651833, "4"], [54.903068, 82.4692231333, "6"], [54.90282975, 82.4689251167, "2"], [54.9030033, 82.4694327333, "8"], [54.7979216167, 82.3709623333, "40"], [54.7901529, 82.3755824, "144"], [54.7907598333, 82.3744419, "134"], [54.7937929667, 82.3664199167, "59C"], [54.79439395, 82.3674624167, "59B"], [54.7944289667, 82.3725634167, "82A"], [54.7904513167, 82.3738425333, "131"], [54.794607, 82.3745403833, "82B"], [54.7921551167, 82.3768403, "132"], [54.7926399833, 82.3722763, "102"], [54.7967557, 82.3729791333, "60A"], [54.7921326333, 82.37322975, "110"], [54.8012874, 82.3703331, "14"], [54.7948232167, 82.3716246, "74"], [54.7979944667, 82.3703715167, "35"], [54.7956465, 82.3714636167, "66"], [54.7911951833, 82.3732412833, "123B"], [54.7987651833, 82.3708161667, "32"], [54.79171095, 82.3736367667, "112"], [54.7976371833, 82.3704513833, "41"], [54.7911877333, 82.3732945667, "123A"], [54.7913029167, 82.37306835, "121"], [54.7906186667, 82.3755869, "140"], [54.7931244667, 82.3712613167, "93A"], [54.7974290667, 82.3711039667, "42"], [54.7936148167, 82.3719375667, "84"], [54.8005517667, 82.3700387, "9"], [54.7938986667, 82.3710440333, "77"], [54.7965492333, 82.3713085167, "54"], [54.8001176167, 82.3701064333, "13"], [54.7930191667, 82.37129215, "93B"], [54.7926151667, 82.37155955, "99A"], [54.7950692833, 82.3686159167, "59A"], [54.7969088, 82.37462925, "60B"], [54.7951773167, 82.37087185, "75"], [54.7921505, 82.3713529333, "99B"], [54.7904565167, 82.3749809333, "138"], [54.8006982167, 82.3700011, "7"], [54.7991912, 82.3699700833, "29"], [54.7967847667, 82.3705662167, "47"], [54.792296, 82.3720602333, "99C"], [54.7980087167, 82.36967245, "31"], [54.7982152833, 82.3709274, "34"], [54.9155702167, 82.4723301167, "4"], [54.9159029, 82.4721897167, "8"], [54.9157610833, 82.4726929667, "3"], [54.9160956333, 82.4725375333, "7"], [54.9153328, 82.4724436667, "2"], [54.9164312667, 82.4723669167, "11"], [54.9165995, 82.4722833833, "13"], [54.9162671833, 82.4724523333, "9"], [54.9162124833, 82.4720273, "12"], [54.9160704833, 82.4720950333, "10"], [54.9170187667, 82.4717177667, "22"], [54.9164956667, 82.4718994167, "16"], [54.9163615667, 82.4719599333, "14"], [54.9155396833, 82.4728079667, "1"], [54.9157325833, 82.4722579833, "6"], [54.9159316, 82.47261835, "5"], [54.8914888167, 82.4620999667, "21"], [54.8837548, 82.4623328, "77B"], [54.8930618833, 82.4622745, "11"], [54.8852888667, 82.46116795, "76"], [54.8913069667, 82.4621727167, "23"], [54.8839160167, 82.4615298167, "75"], [54.8883285167, 82.4618738833, "47"], [54.8858521667, 82.46093185, "68B"], [54.8853005333, 82.4610670333, "76A"], [54.88383285, 82.4621270167, "75A"], [54.8823235167, 82.4605504833, "110A"], [54.8914899333, 82.46174725, "22"], [54.8818567333, 82.4608746167, "116"], [54.88353235, 82.4618320333, "77A"], [54.8813482, 82.4613161333, "95"], [54.8879809, 82.4618373667, "49"], [54.88152115, 82.46131485, "93"], [54.8885148667, 82.4618976167, "45"], [54.8872325667, 82.4613256333, "54"], [54.8877582, 82.4620199, "51A"], [54.8837208833, 82.4615252, "77"], [54.8879695167, 82.4611445833, "50A"], [54.8933130333, 82.46192685, "6"], [54.88794035, 82.46146015, "50"], [54.8911399667, 82.4621445, "25"], [54.8927127, 82.4625991167, "15"], [54.8898722833, 82.4620120667, "37"], [54.8817498333, 82.4605830833, "118A"], [54.8856498167, 82.4611874667, "70"], [54.8818152333, 82.4605837833, "118B"], [54.8834546167, 82.4619323333, "1/79-3/79"], [54.8817077833, 82.46087495, "120"], [54.88566165, 82.4608763667, "70B"], [54.8881064833, 82.4614714667, "48"], [54.8883276833, 82.4614909, "46"], [54.8900726, 82.4616307167, "34"], [54.8824921167, 82.4614109333, "85"], [54.8902574, 82.4620445833, "33"], [54.8821857333, 82.4613799, "89"], [54.8909901, 82.4620973667, "27"], [54.8906249333, 82.4624066333, "31A"], [54.8909031667, 82.4623998167, "27A"], [54.8823715333, 82.4609577, "110"], [54.8885618333, 82.4615104, "44"], [54.8907907, 82.4624375833, "29A"], [54.8911051167, 82.4615235333, "26A"], [54.8912843667, 82.46171725, "24"], [54.88775155, 82.4618187333, "51"], [54.88202465, 82.4608939, "114"], [54.8877833167, 82.4614137, "52"], [54.8907810833, 82.462108, "29"], [54.8910314667, 82.4617401833, "26"], [54.882292, 82.4613977333, "87"], [54.8906141333, 82.4621064667, "31"], [54.8892757667, 82.4615758167, "38"], [54.8904495, 82.4624898833, "33B"], [54.8868235333, 82.461296, "58"], [54.8904039167, 82.4622297, "33A"], [54.8826623167, 82.4609461833, "106"], [54.89295465, 82.4615430167, "14B"], [54.8907016, 82.46165145, "28"], [54.89291045, 82.4618812167, "14"], [54.8854757, 82.461181, "74"], [54.8930916667, 82.46189575, "12"], [54.8856999, 82.4605845, "70A"], [54.8928368667, 82.4622630833, "13"], [54.8899615833, 82.4616178167, "36"], [54.8925096667, 82.4618395167, "16A"], [54.8927205667, 82.4618461, "16"], [54.8925576333, 82.4622484333, "17"], [54.8887964167, 82.4615352, "42"], [54.8887897667, 82.4619157667, "43"], [54.8813160833, 82.46082205, "124"], [54.88148945, 82.46084125, "122"], [54.8822301, 82.4605952667, "112B"], [54.8821928667, 82.4609133167, "112A"], [54.8825255, 82.4609447167, "108"], [54.886356, 82.4607633833, "62A"], [54.88384855, 82.46107535, "84"], [54.8844810833, 82.46111955, "78"], [54.8865957833, 82.4612863167, "60"], [54.8870465333, 82.4613338333, "56"], [54.8840136833, 82.4610932, "82"], [54.8840612333, 82.4615617667, "73"], [54.8858403667, 82.4612416667, "68A"], [54.8863992833, 82.4612464333, "62"], [54.88602145, 82.4612203, "66"], [54.8862464, 82.4607918667, "64A"], [54.8859472, 82.4606057333, "66A"], [54.88617885, 82.4612264667, "64"], [54.8841155833, 82.4606926667, "82A"], [54.8842170667, 82.46156725, "71"], [54.8843494167, 82.4615815167, "69"], [54.8845482333, 82.4615789, "61"], [54.8832313667, 82.4614822, "81"], [54.8833854333, 82.46147585, "79"], [54.8842273333, 82.4610982667, "80"], [54.8842230833, 82.4607088333, "80A"], [54.88898595, 82.4619261, "41"], [54.8836924167, 82.4610583833, "86"], [54.88897595, 82.4615556167, "40"], [54.8835485833, 82.4610374, "88"], [54.8812029, 82.4608328833, "126"], [54.8834193333, 82.4610251833, "90"], [54.8174314833, 82.3761889833, "28"], [54.882173333, 82.3745060667, "41A"], [54.8189801, 82.3767644333, "19"], [54.81721685, 82.3746944667, "40A"], [54.8184217833, 82.3785756333, "7"], [54.81727655, 82.3739209, "41C"], [54.8169354333, 82.3751527667, "40B"], [54.8183142667, 82.3745782, "39"], [54.8177220333, 82.3774063833, "18"], [54.8181192333, 82.3734650333, "41B"], [54.8182567, 82.37774445, "15"], [54.8177787833, 82.3756114, "31"], [54.8171698, 82.37896375, "14"], [54.8179103833, 82.3762068167, "27"], [54.81816045, 82.3773152167, "17"], [54.8187562833, 82.3765890167, "21"], [54.81804885, 82.3788571, "6"], [54.8184971667, 82.3750758833, "49"], [54.8173303, 82.3796556667, "12"], [54.8177653667, 82.3776830167, "16"], [54.81610655, 82.3744603333, "40C"], [54.882659833, 82.3767630167, "24"], [54.8857427167, 82.4668167833, "6"], [54.8842291667, 82.46713325, "21"], [54.88552105, 82.46728075, "7"], [54.8822557833, 82.4671910833, "41A"], [54.88573115, 82.4665300333, "6A"], [54.8841256167, 82.4667261, "22"], [54.8855689, 82.4668563667, "8"], [54.8833609167, 82.4664140667, "30A"], [54.8819612833, 82.4662849167, "42A"], [54.8854916667, 82.4665621167, "8A"], [54.88355305, 82.4666830167, "28"], [54.8858997833, 82.46683345, "2"], [54.88529365, 82.4675717333, "9A"], [54.8853087167, 82.46724515, "9"], [54.8858362167, 82.4668311, "4"], [54.88501735, 82.4672261167, "13"], [54.88173245, 82.4665125833, "44"], [54.8819903833, 82.4669395333, "43"], [54.8819599, 82.46652035, "42"], [54.8821801667, 82.4669412, "41"], [54.8820951, 82.4665340833, "40"], [54.8822636667, 82.4665534167, "36"], [54.8836934333, 82.4671131833, "27"], [54.8817733333, 82.4669241, "45"], [54.8811819833, 82.46709535, "49A"], [54.8812991667, 82.4664858167, "48"], [54.8815565333, 82.4668967167, "47"], [54.8815367, 82.46651585, "46"], [54.8837635333, 82.4667121, "26"], [54.8811047333, 82.466856, "51"], [54.8810985833, 82.4664679167, "50"], [54.8813315833, 82.46687885, "49"], [54.8838189667, 82.4665006, "26A"], [54.8840672667, 82.46711675, "23"], [54.8838811667, 82.4670993333, "25"], [54.8839458833, 82.4667205667, "24"], [54.8832529, 82.4673047167, "33A"], [54.8835982, 82.4664604333, "28A"], [54.8830642667, 82.4666342167, "32"], [54.8835364167, 82.4675321, "29"], [54.8834683333, 82.4670743667, "31"], [54.883317, 82.4666640833, "30"], [54.8851499333, 82.4667468, "12"], [54.8851338167, 82.46723935, "11"], [54.8828958667, 82.4666283167, "34"], [54.88325825, 82.46707095, "33"], [54.8853570333, 82.4667731167, "10"], [54.88494775, 82.4672146833, "15"], [54.8854012333, 82.466548, "10A"], [54.88298215, 82.4670794667, "35"], [54.9137448167, 82.4769976167, "9"], [54.9139995, 82.4769421167, "1"], [54.9137195833, 82.4762766333, "5"], [54.9136874333, 82.4768144167, "8"], [54.9138555833, 82.4762229167, "4"], [54.9139553833, 82.4765034, "3"], [54.9139429833, 82.4767303, "2"], [54.91357485, 82.4763857833, "6"], [54.91363055, 82.47658545, "7"], [54.9070534333, 82.4673664667, "26"], [54.9051596, 82.4668419167, "13"], [54.9107910167, 82.4652498167, "70"], [54.9049454167, 82.4681745833, "8"], [54.9086697833, 82.466192, "46A"], [54.9049889333, 82.4680154333, "8A"], [54.90506145, 82.4674941833, "7"], [54.9106372333, 82.4652995167, "68"], [54.9083611333, 82.4663507667, "42"], [54.9062177333, 82.4681393167, "16B"], [54.91076535, 82.46463305, "71"], [54.90610465, 82.46785555, "16A"], [54.9054751167, 82.4677389667, "12"], [54.9058089833, 82.4680032167, "14A"], [54.9054853667, 82.4672854833, "17"], [54.90856345, 82.4665805333, "44"], [54.9088263, 82.4661217333, "48"], [54.9101238833, 82.4655415667, "62"], [54.908529, 82.4662483167, "46"], [54.9056721833, 82.46797, "12A"], [54.9057461833, 82.4675941167, "14"], [54.90600145, 82.4670439167, "23"], [54.9076178833, 82.4673104167, "34A"], [54.90463895, 82.46807945, "3"], [54.9049602667, 82.4669330833, "9"], [54.90673685, 82.4671040833, "22"], [54.907098, 82.4676191667, "32"], [54.9076081833, 82.46671515, "38"], [54.90916225, 82.4659552667, "52"], [54.90454345, 82.4684433, "1"], [54.90512805, 82.4671995667, "11A"], [54.9059193, 82.4674994, "16"], [54.9073133167, 82.4668277667, "34"], [54.9102952667, 82.4654520833, "64"], [54.9092774833, 82.46591125, "52A"], [54.9052165167, 82.4674315333, "11"], [54.9053672, 82.4671046, "17B"], [54.9048409833, 82.46859545, "4"], [54.905671, 82.46720995, "19"], [54.9048928333, 82.4683727167, "6"], [54.9058366833, 82.4671128, "21"], [54.9071612667, 82.4678683, "30"], [54.9089840667, 82.4660592667, "50"], [54.90527545, 82.4667925333, "15"], [54.90715615, 82.466917, "32A"], [54.9061779167, 82.4669647333, "25"], [54.9077133333, 82.4674576833, "36A"], [54.9104661667, 82.4653805167, "66"], [54.9051668667, 82.4678703167, "10"], [54.89370395, 82.47271155, "11"], [54.8921716167, 82.4721017, "26"], [54.8935424167, 82.4728224833, "13A"], [54.8935212, 82.4727174167, "13"], [54.8937888333, 82.4722797667, "12"], [54.8944482, 82.4723851667, "2"], [54.89426415, 82.4731979833, "8/7"], [54.8944458167, 82.4722873333, "1/2"], [54.8940236833, 82.4722967667, "8"], [54.8944464167, 82.47217745, "2/2"], [54.89289535, 82.4722046, "20"], [54.8940564, 82.4721777667, "1/8"], [54.89387485, 82.47305145, "9A"], [54.8941962833, 82.4734008333, "7/7"], [54.8940251167, 82.4729672167, "3/7"], [54.8940147167, 82.4733695833, "5/7"], [54.8927664833, 82.4726649, "21"], [54.8940957833, 82.4733820167, "6/7"], [54.8942063833, 82.47275275, "11/7"], [54.8938730167, 82.4727318667, "9"], [54.8940384833, 82.4727499833, "1/7"], [54.8916949833, 82.47255425, "29"], [54.8940345667, 82.4728609333, "2/7"], [54.8920309, 82.4720907167, "28"], [54.8942669167, 82.4723162, "6"], [54.8920657333, 82.4725813667, "27"], [54.8924789, 82.4721364167, "22"], [54.89162635, 82.4720620167, "34"], [54.89420475, 82.4728706, "10/7"], [54.8924279, 82.4726186167, "25"], [54.8942782, 82.4730613833, "9/7"], [54.8917478833, 82.4720685333, "32"], [54.89359425, 82.4722612333, "14"], [54.8919238167, 82.4717851167, "30A"], [54.89358685, 82.47297855, "11A"], [54.8917815667, 82.4717468667, "32A"], [54.8940195667, 82.4730878667, "4/7"], [54.89188475, 82.4720793833, "30"], [54.8766258167, 82.453827333, "63"], [54.8793250667, 82.4531694667, "33"], [54.87557575, 82.4531778333, "71"], [54.8649285167, 82.4537918667, "194"], [54.8758193333, 82.4536709167, "72"], [54.8730099333, 82.4536885167, "104"], [54.87537995, 82.4536875833, "76"], [54.866365, 82.4537908667, "182"], [54.8773983, 82.4531370667, "53"], [54.8663474333, 82.4540325167, "182A"], [54.8765353, 82.4536952667, "68"], [54.8633266833, 82.4532383833, "213"], [54.8748418833, 82.4536900667, "86"], [54.8723979667, 82.4536811667, "112"], [54.8789557167, 82.4531799167, "37"], [54.8744338333, 82.45543435, "88"], [54.8780606333, 82.4531695167, "49"], [54.8613876667, 82.4533495833, "1/233"], [54.8779126333, 82.449236, "4/51"], [54.86132765, 82.4526138667, "2/233"], [54.8779974333, 82.45063155, "3/51"], [54.8629783167, 82.4532700667, "215"], [54.8777104167, 82.4515755167, "2/51"], [54.8811745, 82.4555028167, "4"], [54.8779778833, 82.4521171, "1/51"], [54.8619675333, 82.4532946667, "227"], [54.8786639833, 82.4493194167, "5/51"], [54.88057795, 82.4544579, "18"], [54.86531615, 82.4531001833, "191"], [54.8655207167, 82.4536965333, "186"], [54.8646614333, 82.4537639667, "198"], [54.8647871333, 82.4541422833, "196"], [54.86771765, 82.4537268, "162"], [54.8711387333, 82.4536879167, "124"], [54.8611343167, 82.45330145, "235"], [54.8624900167, 82.4532548833, "221"], [54.86872715, 82.4532476, "151"], [54.8703843667, 82.4532525, "131"], [54.8692643833, 82.45371825, "150"], [54.8699453833, 82.4537083667, "142"], [54.88075845, 82.4546889, "14"], [54.8810108833, 82.45510075, "8"], [54.8808800833, 82.45486695, "12"], [54.8810951, 82.4553182, "6"], [54.8812414333, 82.4557114167, "2"], [54.8737279833, 82.4537149833, "90"], [54.8804315833, 82.4547993833, "2/16"], [54.8806571333, 82.4551276833, "2/10"], [54.8807296667, 82.4552756333, "1/10"], [54.8805078333, 82.4548978667, "1/16"], [54.8305417667, 82.4407137167, "106"], [54.8305758833, 82.4444438667, "78"], [54.8305754, 82.45156825, "18"], [54.83063965, 82.45322105, "2"], [54.8305728333, 82.4437875667, "82"], [54.8690497667, 82.4740093167, "7"], [54.86952375, 82.4790699, "60"], [54.8713118667, 82.4763685667, "42"], [54.8690602667, 82.4767549167, "47"], [54.8957648333, 82.4773709167, "4A"], [54.8971239167, 82.47716665, "16"], [54.89663135, 82.4774846833, "10"], [54.8972863333, 82.4770748833, "18"], [54.8969474167, 82.4772745667, "14"], [54.8963529167, 82.4776375333, "8"], [54.8982169667, 82.4746382667, "44"], [54.8958142, 82.4771743333, "4B"], [54.89577995, 82.4770061667, "4C"], [54.8956352667, 82.4772386167, "4"], [54.89679325, 82.4773878, "12"], [54.8956875333, 82.4769206, "4D"], [54.8955368, 82.4771246333, "2"], [54.9075869833, 82.4681207167, "5"], [54.9076935833, 82.4688911, "1"], [54.9078046833, 82.4683225333, "7"], [54.9077261333, 82.4681354833, "6"], [54.9078473333, 82.4685627833, "8"], [54.9075310167, 82.46846565, "3"], [54.9079180333, 82.46879245, "9"], [54.90762245, 82.4686683, "2"], [54.9074934833, 82.4682448, "4"], [54.8065385167, 82.3969116167, "26"], [54.8052316167, 82.3947853833, "1"], [54.8054979333, 82.3951090333, "5"], [54.8061355333, 82.3955903667, "12"], [54.8057016167, 82.3950258333, "6"], [54.8059893667, 82.3953958833, "10"], [54.8068311167, 82.3965807, "22"], [54.80583815, 82.3952011167, "8"], [54.8067129833, 82.3967156, "24"], [54.8062816833, 82.39578495, "14"], [54.8056595, 82.3953378, "7"], [54.80642775, 82.3959857667, "16"], [54.8067297167, 82.39640035, "20"], [54.8063663, 82.3962931167, "13"], [54.8053626333, 82.3949338333, "3"], [54.8065366, 82.3965265333, "15"], [54.80539065, 82.394573, "2"], [54.8065884, 82.39621225, "18"], [54.8055506833, 82.39481855, "4"], [54.8062047667, 82.3961045, "11"], [54.91218215, 82.4768794167, "8"], [54.9120288167, 82.4765747, "7B"], [54.9122875167, 82.4765784167, "3"], [54.9123338833, 82.4771329833, "6B"], [54.9120254167, 82.4764380167, "5"], [54.91246155, 82.4769255333, "4"], [54.9125897333, 82.4768015, "2"], [54.9121711333, 82.4767164667, "7"], [54.9122827167, 82.4769958667, "6A"], [54.8527505833, 82.53393255, "617"], [54.8826752167, 82.5025520333, "9"], [54.81291845, 82.5447496, "1161"], [54.8788362167, 82.510149, "1/88"], [54.81259405, 82.5447376, "1163"], [54.8763215167, 82.5110032333, "115"], [54.8751193167, 82.51276665, "134"], [54.86748695, 82.5219444167, "272"], [54.8793489167, 82.5093666167, "80"], [54.8249454833, 82.5459290333, "1021"], [54.87870795, 82.5090378667, "81"], [54.8802461667, 82.5019911, "1/37"], [54.8790009333, 82.5095332, "84"], [54.8675435167, 82.51850165, "243"], [54.8783544, 82.5094524833, "97"], [54.8785864667, 82.5105412333, "2/88"], [54.8565379167, 82.5340265667, "567"], [54.8790696167, 82.5117932, "98"], [54.8579882167, 82.5332226833, "557"], [54.8228546333, 82.5478497667, "1043"], [54.8111895167, 82.5446341667, "1177"], [54.8670294, 82.5209776667, "265"], [54.8111449, 82.5438866, "1179"], [54.8810532167, 82.50530935, "39"], [54.8107934667, 82.5438973833, "1183"], [54.8766940333, 82.51263885, "2/110"], [54.8094178833, 82.5439488333, "1195"], [54.8484587833, 82.5342090667, "663"], [54.81064835, 82.5445837167, "1187"], [54.8744863, 82.5115857333, "139"], [54.8099838, 82.54453645, "1191"], [54.8787071333, 82.5051437667, "2/39"], [54.8092644167, 82.54453125, "1199"], [54.8361982667, 82.5463852167, "890"], [54.8389412667, 82.5464548, "858"], [54.8789616667, 82.5121996833, "100"], [54.8336715167, 82.5454231, "919"], [54.8289189, 82.5478054833, "986"], [54.8323492833, 82.5460591, "928"], [54.8320521833, 82.5459855, "930"], [54.8251348833, 82.5480670667, "1016"], [54.8561845167, 82.5327450833, "581"], [54.8262207333, 82.5482595333, "996"], [54.8083614833, 82.5449377833, "1211"], [54.8172147667, 82.5457622333, "1107"], [54.8461716667, 82.5348015333, "688"], [54.8159882, 82.5454072833, "1119"], [54.8801261, 82.5011647833, "37"], [54.8788507333, 82.5071659, "5/39"], [54.86353225, 82.5262979167, "392"], [54.8087557667, 82.5460182, "1208"], [54.8799249, 82.50989025, "70"], [54.8087391167, 82.5453725167, "1206"], [54.8368114333, 82.5449542167, "881"], [54.8278101833, 82.5479474667, "990"], [54.8144593833, 82.5446729333, "1143"], [54.8763691667, 82.51261455, "1/110"], [54.8141157667, 82.5446296, "1145"], [54.8675668333, 82.5223205667, "276"], [54.86875635, 82.5151021667, "207"], [54.8785670167, 82.5058547667, "3/39"], [54.8766803833, 82.5140811167, "6/110"], [54.86696285, 82.5258656667, "302"], [54.81135475, 82.5425439833, "1/1181"], [54.8809864833, 82.5057107, "8/39"], [54.8788209, 82.5065659833, "4/39"], [54.8792938833, 82.5065692167, "7/39"], [54.8139674667, 82.5456240667, "1146"], [54.8611906333, 82.5269748, "432"], [54.8402324, 82.5411414667, "809"], [54.82010205, 82.5480512333, "1070"], [54.8771378833, 82.51029235, "1/103"], [54.8213269333, 82.54882125, "1052"], [54.8089942, 82.5452704833, "1202"], [54.8212039667, 82.5500653333, "1/1052"], [54.86704345, 82.5199686167, "257"], [54.8211860833, 82.55188125, "2/1052"], [54.8732234167, 82.51193365, "151"], [54.8231706667, 82.5483519, "1040"], [54.8129427333, 82.54544965, "1158"], [54.8398410833, 82.5429798, "817"], [54.8774619667, 82.5081401333, "4/103"], [54.8413094333, 82.5414880333, "796"], [54.8734242333, 82.5114266833, "149"], [54.8116329167, 82.54465065, "1173"], [54.8790814667, 82.505419, "6/39"], [54.8402537, 82.54399925, "830"], [54.87415495, 82.5111152667, "1/139"], [54.8090223833, 82.5446570333, "1201"], [54.8809561333, 82.5036574833, "35"], [54.8085440167, 82.5454961667, "1210"], [54.8413132, 82.5395747333, "773"], [54.87539025, 82.5146704167, "1/138"], [54.83847385, 82.54218775, "2/815"], [54.87580405, 82.5118973167, "126"], [54.86917495, 82.5157794167, "1/208"], [54.8082772667, 82.5455867333, "1212"], [54.8096694667, 82.5450804833, "1194"], [54.8787073667, 82.5083375, "79"], [54.8763409333, 82.51340955, "3/110"], [54.8080369167, 82.5450349667, "1213"], [54.8093666167, 82.5451384833, "1196"], [54.82245505, 82.5477440333, "1047"], [54.8775422667, 82.5104792, "2/103"], [54.8236463333, 82.5474525, "1033"], [54.8814960667, 82.50479415, "33"], [54.8245330667, 82.5471272667, "1023"], [54.8403625, 82.5402170167, "1/809"], [54.8678366667, 82.5195366167, "254"], [54.8790242333, 82.5103504333, "4/88"], [54.8218208, 82.5477814333, "1049"], [54.8789700833, 82.5084782833, "77/1"], [54.8704926333, 82.5137601667, "188"], [54.87878565, 82.5106821667, "3/88"], [54.871913, 82.5121444333, "163"], [54.87933595, 82.5101975333, "6/88"], [54.8748227833, 82.5121225, "136"], [54.87947495, 82.5108712167, "5/88"], [54.8753615167, 82.5127019833, "132"], [54.8109761333, 82.5426080167, "1181"], [54.8773393667, 82.5116264833, "104"], [54.8370667667, 82.5458885833, "879"], [54.8765559833, 82.5101962833, "103"], [54.8253379167, 82.5472683, "989"], [54.8793315833, 82.5086546167, "77"], [54.8661602, 82.52487915, "316"], [54.8776637333, 82.50929225, "3/103"], [54.8092819667, 82.5456565833, "2/1200"], [54.87534805, 82.5120049833, "128"], [54.81204605, 82.5446423333, "1169"], [54.8752625833, 82.5140794833, "138"], [54.8766464333, 82.5134206667, "4/110"], [54.8770230167, 82.5108992333, "113"], [54.8406207, 82.5394538167, "2/809"], [54.8770699833, 82.5116503167, "106"], [54.8122078667, 82.5440270833, "1165"], [54.87518925, 82.5112472667, "129"], [54.8507412333, 82.5347013833, "633"], [54.8759461833, 82.5110732833, "117"], [54.8210931833, 82.5477387333, "1055"], [54.87555235, 82.511829667, "127"], [54.8180744833, 82.5471867333, "1092"], [54.8761638, 82.5118200833, "120"], [54.8714445, 82.5188348833, "2/208"], [54.8738533, 82.5117649, "141"], [54.8083899, 82.5443001833, "1209"], [54.8672468667, 82.5243000167, "295"], [54.8395333333, 82.54262905, "1/815"], [54.8093977833, 82.5456164833, "1/1200"], [54.86778915, 82.5240579167, "290"], [54.8151683, 82.5450954333, "1133"], [54.8676913333, 82.5179285833, "235"], [54.87977015, 82.5090145833, "66"], [54.8785379333, 82.5043763, "1/39"], [54.8764341333, 82.51407215, "5/110"], [54.8740516, 82.5125295667, "146"], [54.87401495, 82.47760185, "16"], [54.8739528333, 82.4764705667, "31"], [54.8739846167, 82.4768385667, "33"], [54.8748585167, 82.4767720333, "11"], [54.8736880333, 82.4772042167, "37"], [54.8747492333, 82.4769483667, "9"], [54.87503235, 82.4775088667, "3"], [54.87489515, 82.4779213833, "6"], [54.8748158667, 82.4774378, "5"], [54.8750760667, 82.4779026, "4"], [54.8746501167, 82.4773401167, "7"], [54.8741460667, 82.4765724167, "27"], [54.8739166167, 82.477184, "35"], [54.8741975833, 82.4778215, "23"], [54.8738094, 82.47760075, "18"], [54.8749257833, 82.4765688833, "13"], [54.8741402667, 82.4763856, "29"], [54.8742506833, 82.4775977, "14"], [54.8741505, 82.47681925, "25"], [54.8747261167, 82.4778583667, "8"], [54.8745555, 82.4777541667, "10"], [54.8743982667, 82.4777232, "12"], [54.87440735, 82.4772111833, "21"], [54.8745958667, 82.47674675, "19"], [54.8747628333, 82.47645865, "15"], [54.8745715333, 82.4764928667, "17"], [54.9116880667, 82.4711713833, "3"], [54.9116604333, 82.4715114333, "1"], [54.9118500667, 82.4714183, "5"], [54.9122240667, 82.4713923, "11"], [54.9118788833, 82.4710693167, "7"], [54.9123174667, 82.4714676167, "10"], [54.91227905, 82.4716167167, "8"], [54.9117270667, 82.4718080667, "2"], [54.91205, 82.4713633167, "9"], [54.912161, 82.4717712, "6"], [54.8859179333, 82.4582119667, "1"], [54.8865885333, 82.4581321667, "6A"], [54.88640305, 82.45807455, "6"], [54.8860451667, 82.4578916833, "4D"], [54.8863091167, 82.45790615, "5"], [54.8861527, 82.4579021833, "4A"], [54.8859058833, 82.4578780333, "3"], [54.8861333333, 82.4577295167, "4B"], [54.8859079333, 82.45834695, "1A"], [54.8861985, 82.4582370667, "7"], [54.8860742333, 82.4577260833, "4C"], [54.8858135, 82.4580266333, "2"], [54.8856798, 82.4576616167, "3B"], [54.8857954333, 82.45773405, "3A"], [54.8039755167, 82.3924264333, "588"], [54.8024268333, 82.3891336167, "555"], [54.80621375, 82.3790952, "476A"], [54.8035793667, 82.3898201333, "565"], [54.8041731333, 82.3674844, "348"], [54.8035751833, 82.38904805, "559"], [54.8013125167, 82.390194, "569A"], [54.8039518333, 82.3880558333, "550"], [54.7993036333, 82.3774681, "447B"], [54.80163095, 82.39138825, "577"], [54.8035939833, 82.3922268667, "583"], [54.8034719167, 82.3864473333, "535A"], [54.80612815, 82.3786574833, "476C"], [54.80604375, 82.3653441833, "320"], [54.8030940833, 82.3837668333, "515"], [54.8017065167, 82.37966555, "471"], [54.8032808167, 82.3824573833, "496C"], [54.8023511333, 82.3675479833, "361"], [54.8029974167, 82.38875325, "553B"], [54.8013158, 82.3713298333, "400"], [54.8069269167, 82.38494245, "522A"], [54.8041518333, 82.3666512333, "342"], [54.8035926, 82.3904181, "569B"], [54.8022781333, 82.3782524667, "450A"], [54.8010726667, 82.3710681167, "395"], [54.80130715, 82.37668905, "445"], [54.8010362667, 82.3712212667, "399"], [54.8032196333, 82.36794415, "358"], [54.80095265, 82.3727210333, "409"], [54.8021615667, 82.3808655833, "481B"], [54.80149165, 82.3733540167, "418"], [54.8010327833, 82.3739455167, "419"], [54.8037261333, 82.3859318333, "530"], [54.8019531333, 82.36978095, "382"], [54.8035854333, 82.3674296167, "352"], [54.8035820667, 82.3681635, "358B"], [54.8044532833, 82.3898220167, "562A"], [54.8030543167, 82.3681729333, "360"], [54.80023085, 82.3753558333, "429B"], [54.8029366333, 82.3683441833, "362"], [54.8046987, 82.38796795, "548"], [54.80282455, 82.3684962, "364"], [54.8016347167, 82.3738360667, "420"], [54.8031052333, 82.3689649333, "366"], [54.8026689, 82.3687241167, "368"], [54.8025527333, 82.3689042333, "370"], [54.8037381333, 82.3672040667, "350B"], [54.8015959333, 82.37030475, "384"], [54.8037429667, 82.3861631667, "532"], [54.8056256, 82.3854121, "522D"], [54.8074032833, 82.37890055, "476D"], [54.8033627833, 82.3941313, "601"], [54.8035645833, 82.3885777333, "553A"], [54.8037265833, 82.3751864333, "438"], [54.80393295, 82.3820938333, "496B"], [54.8039961667, 82.3937407167, "600"], [54.8016335, 82.3785741333, "455B"], [54.8028840667, 82.3674978, "357"], [54.8009541833, 82.3783785, "455C"], [54.8061105, 82.3849712833, "518"], [54.8041071, 82.3675672667, "350A"], [54.8039732667, 82.3922047667, "586"], [54.7970054833, 82.3806949833, "475B"], [54.80154115, 82.3776200833, "455A"], [54.7968634833, 82.3813122667, "475C"], [54.8040230333, 82.3951761833, "610"], [54.8004082667, 82.3807690333, "475D"], [54.8020559, 82.3804593667, "481A"], [54.8029026667, 82.3814678667, "490"], [54.79877225, 82.3804673833, "475A"], [54.8024990833, 82.3803016, "478"], [54.80798195, 82.3848864167, "522B"], [54.8032268667, 82.3820611833, "496A"], [54.8039424333, 82.3900004667, "566"], [54.8055885667, 82.3849529667, "508"], [54.8039439833, 82.3902647333, "568"], [54.8044673167, 82.3791537667, "476B"], [54.8034701, 82.3861407833, "531"], [54.80394855, 82.3905212833, "570"], [54.8033434667, 82.3677650667, "356"], [54.8039541167, 82.3897445, "564"], [54.8044864833, 82.3894950833, "562B"], [54.8023883667, 82.3792474, "468"], [54.8037905667, 82.3868461833, "538"], [54.80376065, 82.3848380167, "516"], [54.8037788333, 82.3866195333, "536"], [54.8013236667, 82.3867703833, "535B"], [54.80376085, 82.3863884, "534"], [54.8038128667, 82.38531645, "524"], [54.8038359, 82.3875590667, "546"], [54.8053126, 82.3651698, "328"], [54.8038053833, 82.3870689, "540"], [54.80589585, 82.3892222167, "560"], [54.8035248667, 82.3876434167, "545"], [54.8037198, 82.3949872, "609"], [54.80381955, 82.3872982, "542"], [54.8075598333, 82.3855587, "522C"], [54.8039602167, 82.3917614333, "582"], [54.80139505, 82.3727005667, "414"], [54.8036690667, 82.3910398667, "575"], [54.8039518833, 82.3910117167, "574"], [54.80395405, 82.3914879333, "580"], [54.8002672167, 82.3771908, "447A"], [54.8039521833, 82.3907747167, "572"], [54.8036402667, 82.3914460167, "579"], [54.803952, 82.3912312333, "578"], [54.8015263667, 82.3694650333, "383"], [54.80400045, 82.3949203833, "608"], [54.8039955333, 82.3935219167, "598"], [54.8039738167, 82.3926465167, "590"], [54.8034657167, 82.3675994, "354"], [54.8039642833, 82.3919945, "584"], [54.8039832667, 82.3932899167, "596"], [54.7988289, 82.3754860833, "429C"], [54.80369095, 82.3927310167, "591"], [54.80233225, 82.3911433833, "571"], [54.8039846667, 82.3930810833, "594"], [54.8013068333, 82.37155805, "402"], [54.80397775, 82.3928504167, "592"], [54.8040068833, 82.3948069833, "608A"], [54.8037325167, 82.3941101167, "603"], [54.8021858833, 82.3685292167, "369"], [54.8039958, 82.3939723167, "602"], [54.8048039833, 82.3657911, "336"], [54.80368355, 82.39362055, "599"], [54.8039906833, 82.3668667833, "344"], [54.8037408333, 82.39457725, "607"], [54.8040022167, 82.3941957, "604"], [54.80357305, 82.3683457167, "358A"], [54.80400475, 82.3944321167, "606"], [54.8037340667, 82.3943487167, "605"], [54.8021156667, 82.3876556833, "543"], [54.8012321, 82.3754553833, "429A"], [54.8018551667, 82.3752511, "430"], [54.8038677333, 82.3670357333, "346"], [54.8037207167, 82.3857282667, "528"], [54.89186715, 82.4802623167, "40"], [54.8923304833, 82.4777135167, "13"], [54.8929612833, 82.4756593333, "1"], [54.8918642, 82.4800987833, "38"], [54.8926700333, 82.4763031833, "5"], [54.89194195, 82.47893395, "28A"], [54.8924575833, 82.4767435167, "9"], [54.8918917333, 82.47938125, "32"], [54.8922351667, 82.4796796333, "27"], [54.8916363333, 82.47957795, "34A"], [54.8922002833, 82.48006775, "29"], [54.8918962833, 82.4796114333, "34"], [54.8923002333, 82.4783952667, "21"], [54.89225505, 82.4790280833, "25"], [54.8920123333, 82.4773945167, "10"], [54.8919046167, 82.4791651833, "30"], [54.89170475, 82.4789158833, "28B"], [54.89166225, 82.4793545667, "32A"], [54.8919418833, 82.4787236, "26"], [54.89187395, 82.4798382833, "36"], [54.89226945, 82.4788097167, "23"], [54.8919833667, 82.47800955, "14"], [54.88193185, 82.4866305833, "1"], [54.8812478, 82.4878395, "20"], [54.8819307, 82.48686775, "3"], [54.8823734333, 82.4877629833, "8B"], [54.8821842833, 82.48700355, "4"], [54.8818976833, 82.4871309333, "5"], [54.8821982333, 82.4867615167, "2"], [54.8821772, 82.48722635, "6"], [54.8809340667, 82.4875154, "24"], [54.8815621333, 82.4870228333, "11B"], [54.88080855, 82.4873367167, "26"], [54.8810877167, 82.4876951, "22"], [54.8806647833, 82.4872178, "25"], [54.8815580667, 82.4875735333, "9"], [54.88050695, 82.48709835, "23"], [54.8823652833, 82.48799725, "10B"], [54.8817490333, 82.4878626667, "12"], [54.88214405, 82.4874454833, "8"], [54.8816923833, 82.4878766167, "14"], [54.8823520667, 82.4875880667, "8A"], [54.8814424167, 82.48790665, "16"], [54.8819485333, 82.48774405, "10"], [54.8813723833, 82.4878899, "18"], [54.8822010167, 82.4879131167, "10A"], [54.8825377667, 82.48796795, "8C"], [54.8808839, 82.4866251333, "17"], [54.8807889, 82.4868384833, "19"], [54.8806788833, 82.4869695333, "21"], [54.8818035, 82.48743315, "7"], [54.8810684667, 82.4871791, "13"], [54.8809503667, 82.4869225, "15"], [54.8812931167, 82.4874573167, "11"], [54.8812351167, 82.4869114833, "13A"], [54.8814375667, 82.4871747, "11A"], [54.8813577333, 82.4869692333, "13B"], [54.9359592833, 82.5576784333, "1/21"], [54.9380472167, 82.5564234833, "20"], [54.9388147833, 82.5583222333, "2/21"], [54.9370746333, 82.55679275, "21"], [54.9396807833, 82.5590516333, "4/21"], [54.9321653667, 82.5586632333, "15"], [54.93777925, 82.5607732333, "3/21"], [54.93261665, 82.5577030167, "22"], [54.9350610667, 82.5544772, "18"], [54.9324680333, 82.55825425, "17"], [54.93286725, 82.5580919667, "19"], [54.9655341, 82.48344125, "228"], [54.9662557833, 82.4823937167, "238"], [54.9551121167, 82.4819800167, "74"], [54.97145005, 82.4810869667, "298"], [54.96511045, 82.4842071167, "226"], [54.9597843, 82.4837558833, "1/144"], [54.9542875333, 82.4787352833, "46"], [54.96095, 82.4848569, "156"], [54.9608395667, 82.4825922167, "144"], [54.9665397, 82.4859805667, "227"], [54.9546337667, 82.4780326167, "44"], [54.9662588833, 82.48466365, "229"], [54.9774811333, 82.4827824167, "367"], [54.9532187667, 82.4778035833, "25"], [54.9779600167, 82.4820124333, "380"], [54.96688945, 82.4825700833, "244"], [54.9724996333, 82.4816797, "317"], [54.9551293333, 82.4882803333, "2/81"], [54.9544212167, 82.4829611333, "79"], [54.9552378333, 82.4835594, "3/81"], [54.9551674833, 82.4873534333, "1/81"], [54.8177678333, 82.36481165, "23"], [54.8176856667, 82.36528815, "21"], [54.81793065, 82.36431665, "24"], [54.8188466, 82.3655251167, "13"], [54.8183913167, 82.3654774833, "14"], [54.8186506667, 82.3663757833, "8"], [54.9091586833, 82.4806199667, "8"], [54.9097846667, 82.4804238833, "5"], [54.9095970833, 82.4803937333, "6"], [54.90949585, 82.48088805, "2"], [54.9097125667, 82.4807851667, "3"], [54.9090767333, 82.4810419167, "1"], [54.9098378, 82.4806015167, "4"], [54.9094125333, 82.48047265, "7"], [54.8987957167, 82.4867648167, "4"], [54.8993040833, 82.48608325, "13A"], [54.8986618667, 82.4863548, "3"], [54.8990157167, 82.4866799667, "8"], [54.8988486167, 82.48625515, "11"], [54.89940275, 82.48652375, "12"], [54.8990940333, 82.4857358333, "15"], [54.8994477, 82.4860294167, "13"], [54.8984905333, 82.4864897167, "1"], [54.8910458667, 82.4604486167, "4A"], [54.8909012833, 82.4603024667, "1"], [54.8912700667, 82.4604892667, "4B"], [54.8909202167, 82.4608893333, "3C"], [54.8912779333, 82.4605982333, "4C"], [54.8909172, 82.4610096, "3D"], [54.8910309833, 82.46058295, "4D"], [54.8909275167, 82.4607770667, "3B"], [54.8908830667, 82.46040695, "2"], [54.8907294667, 82.4603703, "2B"], [54.8909360167, 82.4606728333, "3A"], [54.8910318, 82.46011345, "5"], [54.9038995167, 82.4740167833, "1"], [54.9040010833, 82.4744881, "3"], [54.9039700667, 82.4742456667, "2"], [54.9041160333, 82.4738995667, "9"], [54.9042205, 82.4746609667, "5"], [54.90408835, 82.4746666167, "4"], [54.9043300333, 82.4745611833, "6"], [54.9042862667, 82.47435, "7"], [54.9041895, 82.4741327333, "8"], [54.8412972333, 82.51498905, "2/370"], [54.85380915, 82.5048969, "197"], [54.8393792167, 82.5185004833, "4/370"], [54.8356004, 82.5155473833, "1/446"], [54.8516975167, 82.5088596333, "230"], [54.83493705, 82.5162245, "2/446"], [54.8630868833, 82.5013258667, "77"], [54.8341336333, 82.5147212667, "454"], [54.838285167, 82.511789, "495"], [54.8378645667, 82.51179665, "422"], [54.8482979667, 82.5057717167, "2/277"], [54.8384529, 82.5107566, "1/413"], [54.8543168833, 82.5057733167, "200"], [54.8382859, 82.51004915, "2/413"], [54.8302591667, 82.51099635, "520"], [54.8430264833, 82.5117441667, "361"], [54.8569890167, 82.50014995, "145"], [54.8546612333, 82.51046255, "4/210"], [54.8291138167, 82.5100652833, "537"], [54.8644712, 82.5010749167, "57"], [54.8537165667, 82.5061015667, "1/210"], [54.8561494333, 82.5002218833, "151"], [54.8531273167, 82.50591205, "207"], [54.8661337333, 82.50044185, "39"], [54.8572501333, 82.50068855, "142"], [54.86749845, 82.4999983667, "31"], [54.8311046167, 82.5124198667, "504"], [54.8610681167, 82.5009140667, "99"], [54.86009745, 82.5013829333, "110"], [54.8635882333, 82.5025296333, "2/72"], [54.8381455333, 82.5095623833, "415"], [54.86345265, 82.5022295333, "1/72"], [54.8535591333, 82.5063429, "3/210"], [54.8428438667, 82.5239404333, "8/370"], [54.8425296667, 82.5133880833, "1/370"], [54.8415704667, 82.5230515333, "7/370"], [54.8607450167, 82.5008543833, "101"], [54.8402798167, 82.5220041667, "6/370"], [54.8540611833, 82.5052768833, "198"], [54.8457524833, 82.5094666, "314"], [54.8379597667, 82.51065885, "417"], [54.83947605, 82.5206863, "5/370"], [54.8301105, 82.5103759, "521"], [54.84097385, 82.5217665167, "9/370"], [54.8408829167, 82.5157633333, "3/370"], [54.8540650833, 82.5067036667, "2/210"], [54.8541100167, 82.5042267333, "191"], [54.8426532167, 82.5117339667, "365"], [54.8483104167, 82.50609355, "1/277"], [54.8610126167, 82.5014974, "98"], [54.8409556, 82.5110372667, "383"], [54.8563855167, 82.4999012333, "149"], [54.8591389167, 82.5012515167, "118"], [54.8622922667, 82.5017081, "86"], [54.8279955333, 82.5107170333, "548"], [54.8293633667, 82.5100288667, "535"], [54.87412315, 82.36871325, "20"], [54.8741985167, 82.3678984333, "25"], [54.8744552833, 82.36791385, "23"], [54.82354435, 82.3645601333, "31"], [54.81426245, 82.3697857667, "140B"], [54.8249820167, 82.36436295, "18A"], [54.8247545333, 82.3644630667, "18B"], [54.8196718, 82.3690864167, "74B"], [54.8141992167, 82.3685047667, "140D"], [54.8202965167, 82.3688420833, "74C"], [54.8180317333, 82.3670563833, "97"], [54.8166606, 82.3680389833, "116"], [54.81378495, 82.3674693667, "143"], [54.8140329833, 82.36750105, "141"], [54.8230129333, 82.36477085, "33"], [54.8181065333, 82.367528, "96A"], [54.822355, 82.3651528333, "43"], [54.8207430167, 82.37001735, "72"], [54.882852333, 82.36768535, "104"], [54.8240652167, 82.3643383167, "25"], [54.8208649167, 82.3708165167, "72C"], [54.8158759333, 82.3699935167, "124A"], [54.81611735, 82.3726213833, "124D"], [54.8141102833, 82.3710208167, "140E"], [54.8158552833, 82.3725671, "126C"], [54.8172870667, 82.3672759333, "105"], [54.8149043167, 82.3680942, "126A"], [54.8156860667, 82.3714600667, "126B"], [54.82234555, 82.3676551167, "58C"], [54.8229201, 82.3663306333, "42B"], [54.8217244667, 82.36615365, "56"], [54.82168065, 82.3671740333, "58A"], [54.8226533, 82.3656960667, "42A"], [54.81969495, 82.3671185, "74A"], [54.8139910833, 82.3680670333, "142"], [54.8222810667, 82.36812165, "58B"], [54.8160942833, 82.3717498333, "124C"], [54.8210101167, 82.3697359333, "72D"], [54.8199424667, 82.3700336667, "72A"], [54.8162840333, 82.36763115, "115"], [54.8169082, 82.3674243667, "109"], [54.8231334167, 82.3666729833, "42C"], [54.8211535833, 82.3664307, "66"], [54.8159958, 82.3710006, "124B"], [54.8230926333, 82.3654223667, "40"], [54.8142580167, 82.3692795333, "140C"], [54.8184104667, 82.3677529833, "96B"], [54.8232137667, 82.3664941667, "42D"], [54.8238653167, 82.3649438333, "30"], [54.8210668833, 82.3659746167, "59"], [54.8204322833, 82.3668945833, "70"], [54.814820667, 82.3703629167, "140A"], [54.8203761167, 82.3663, "69"], [54.8190875, 82.3666263, "83"], [54.8206303833, 82.37079745, "72B"], [54.8159921167, 82.36829495, "120"], [54.8702900833, 82.4823576, "129"], [54.8691575833, 82.4875552167, "174"], [54.8752810167, 82.4785701333, "29"], [54.8739353333, 82.4787035333, "71"], [54.8694349833, 82.4853619333, "150"], [54.86819925, 82.4904272667, "203"], [54.8739757333, 82.4791716, "36"], [54.8743164833, 82.47849545, "69"], [54.8764327833, 82.4784211167, "18"], [54.8772371, 82.47724965, "11"], [54.8711581167, 82.4812798, "99"], [54.8774015333, 82.4771253167, "9"], [54.8747281, 82.4786202833, "35"], [54.8769075, 82.47753225, "15"], [54.8764091, 82.4779333667, "21"], [54.8751066833, 82.47903655, "28"], [54.8755713333, 82.4789569333, "24"], [54.8767426833, 82.4776735667, "17"], [54.87754365, 82.4769945167, "7"], [54.8749176, 82.4790524, "30"], [54.86789545, 82.4922832833, "215"], [54.8762449333, 82.4780463833, "23"], [54.8746104333, 82.4786632333, "37"], [54.87535045, 82.4789887, "26"], [54.8690190833, 82.4889257667, "188"], [54.8766569, 82.4782477833, "16"], [54.8777791667, 82.4743660833, "3F"], [54.8760992833, 82.4781375667, "25"], [54.8735414833, 82.4792975667, "40"], [54.8749123833, 82.4786099333, "33"], [54.8778868667, 82.4755309333, "3B"], [54.8757382667, 82.4789290833, "22"], [54.8690839, 82.4882992333, "182"], [54.8778719167, 82.4752090167, "3C"], [54.8692440333, 82.487114, "168"], [54.87786735, 82.4759980333, "3A"], [54.8750885833, 82.4785857167, "31"], [54.8778593, 82.4767417, "1"], [54.8770541, 82.4774016167, "13"], [54.8693264333, 82.4864033167, "160"], [54.8776720667, 82.47687455, "5"], [54.87418305, 82.4791450333, "34"], [54.8772782167, 82.4778079333, "12"], [54.8694907, 82.48387845, "139"], [54.8737682833, 82.4792036833, "38"], [54.8780202167, 82.4743749, "3E"], [54.87657365, 82.4778033833, "19"], [54.8769227, 82.4780192833, "14"], [54.8778372, 82.4747625833, "3D"], [54.9058634167, 82.4818391833, "11"], [54.90651765, 82.4816564, "7"], [54.90600205, 82.4817922833, "10"], [54.9065382667, 82.4819836667, "6"], [54.9064549667, 82.48231495, "4"], [54.9065751, 82.4821868667, "5"], [54.9062895, 82.4822382667, "3"], [54.9061909, 82.4817668, "9"], [54.9058636333, 82.4821877667, "1"], [54.90609375, 82.48208955, "2"], [54.9063477667, 82.4818540833, "8"], [54.9028285, 82.4830620667, "10"], [54.9033403333, 82.4828242833, "4"], [54.9026557833, 82.4836036833, "11"], [54.9026651667, 82.4831392167, "12"], [54.9024793, 82.4836898833, "13"], [54.9024864833, 82.4832286333, "14"], [54.9022771167, 82.4837931167, "15"], [54.9023275333, 82.48331475, "16"], [54.9021481167, 82.4833864333, "18"], [54.9034164167, 82.48324155, "3"], [54.9020819667, 82.4837508833, "17"], [54.9032251, 82.4833323833, "5"], [54.9031833833, 82.4829241667, "6"], [54.9030398667, 82.4834288667, "7"], [54.9030060333, 82.4827531167, "8A"], [54.90303195, 82.4830065, "8"], [54.90285465, 82.48352545, "9"], [54.9030180333, 82.4855010667, "50"], [54.90297345, 82.4847805333, "52"], [54.90302055, 82.4852138333, "50A"], [54.9006098833, 82.4854521833, "33"], [54.9029307667, 82.485268, "48"], [54.9014686667, 82.48551475, "36"], [54.9017719833, 82.4853557833, "40"], [54.9016177667, 82.4854306833, "38"], [54.9023493667, 82.48468465, "47"], [54.9027064667, 82.4842364667, "51A"], [54.9019256667, 82.4852900333, "42"], [54.9016388667, 82.4849819167, "41"], [54.9014681667, 82.485061, "39"], [54.9033233167, 82.48461845, "56"], [54.9037893833, 82.4839462667, "63"], [54.9031498833, 82.4846976667, "54"], [54.9026018, 82.48495995, "44"], [54.9030769833, 82.4842938, "55"], [54.9027864167, 82.4848613, "46"], [54.9037959667, 82.4843982667, "62"], [54.90251565, 82.4845560333, "49"], [54.9039613167, 82.4843144, "64"], [54.9027125667, 82.4844694167, "51"], [54.9034637167, 82.4841226, "59"], [54.9028946833, 82.4843869, "53"], [54.9036489333, 82.4840298833, "61"], [54.90327315, 82.4842082833, "57"], [54.90046945, 82.4855198667, "29"], [54.9010344833, 82.4856939833, "34"], [54.9013283667, 82.4851346333, "37"], [54.9017672167, 82.4849186, "43"], [54.8611247, 82.4102509167, "82"], [54.8499004667, 82.4102191667, "47"], [54.86802365, 82.4100161, "251"], [54.8527479167, 82.4097375667, "82"], [54.84663775, 82.41026955, "13"], [54.8556193, 82.4102112167, "113"], [54.8623374833, 82.4096021667, "188"], [54.8570313833, 82.4097304667, "128"], [54.8508672833, 82.4096890333, "58"], [54.8633539667, 82.4102016833, "197"], [54.8624295167, 82.4113314833, "187"], [54.8643999167, 82.4142555167, "211A"], [54.8674836667, 82.4109264333, "245A"], [54.8645949333, 82.4142231333, "211B"], [54.863722, 82.4116543667, "203"], [54.8652689, 82.4102405667, "217"], [54.8674028167, 82.4119272333, "245B"], [54.8688986, 82.4071594333, "283"], [54.8626189667, 82.4102669333, "191"], [54.86890705, 82.4066821333, "285"], [54.8638613833, 82.4102196333, "205"], [54.8520415333, 82.4096858833, "74"], [54.85366185, 82.4103740333, "91"], [54.8541498167, 82.4102157, "99"], [54.8481882167, 82.4096517333, "32"], [54.8998180833, 82.4671585833, "1"], [54.8994876333, 82.46689395, "4"], [54.8995568833, 82.4671854, "2"], [54.89982245, 82.4669492, "3"], [54.8997823167, 82.4667780333, "5"], [54.8993499, 82.4665456333, "6"], [54.8994541, 82.4664421167, "8"], [54.8996415, 82.4667272333, "7"], [54.8916384833, 82.4630697, "40"], [54.8913306, 82.4610441333, "24"], [54.89161595, 82.4716677667, "133"], [54.8914569167, 82.4754211833, "149"], [54.89160835, 82.4718250167, "135"], [54.89234715, 82.4585814667, "9"], [54.8915247667, 82.4732450833, "137"], [54.8916493667, 82.4628682, "36"], [54.89127365, 82.4608001667, "1/20-3/20"], [54.8922152167, 82.4605929667, "17"], [54.89145415, 82.4607833333, "4/20-7/20"], [54.8917261333, 82.4624021, "32"], [54.8919335167, 82.45821125, "4C"], [54.8922107833, 82.4609609833, "21"], [54.8919453667, 82.4579664333, "4B"], [54.8915077, 82.4658864333, "66"], [54.8919506333, 82.4577320333, "4A"], [54.8916613167, 82.4626608667, "34"], [54.8919576833, 82.4575137, "2C"], [54.89126035, 82.4701749167, "92"], [54.8922950667, 82.4588386, "11"], [54.8921412333, 82.4623956833, "31"], [54.8918877167, 82.4588751167, "10"], [54.8912372, 82.4708680333, "98"], [54.8920993333, 82.4636887167, "43"], [54.89223965, 82.4603451, "15"], [54.8920777333, 82.4638900667, "43A"], [54.89235135, 82.4580704, "5"], [54.8916213667, 82.4634083333, "44"], [54.8913535, 82.4751499333, "147"], [54.8911645667, 82.4634580167, "46"], [54.89154565, 82.460355, "16A"], [54.8916286667, 82.4636265667, "48"], [54.8914890667, 82.4661530833, "68"], [54.8916243333, 82.46377045, "50A"], [54.8921945667, 82.4613726833, "25"], [54.8916212333, 82.4638566667, "50"], [54.898285833, 82.4617233333, "28"], [54.8916201, 82.4640203, "52"], [54.89219925, 82.46119465, "23"], [54.891597, 82.46425765, "54"], [54.8918353, 82.46017655, "14"], [54.8919748667, 82.4649644667, "53"], [54.8917905667, 82.4608055333, "22"], [54.89131955, 82.4756406, "153"], [54.8923704333, 82.4576240833, "3"], [54.8905614333, 82.4758690167, "154"], [54.8916816167, 82.4707503, "97"], [54.8913018667, 82.4759012333, "155"], [54.89253265, 82.4612154167, "23B"], [54.8909466833, 82.4760167333, "156"], [54.8920906167, 82.4634921, "41"], [54.8912217, 82.4774480833, "165"], [54.8921237833, 82.46277795, "35"], [54.8908697333, 82.477294, "162"], [54.8920948667, 82.4632665833, "39"], [54.8912003333, 82.47770905, "167"], [54.8914414833, 82.4678414, "76"], [54.8908453833, 82.4777106667, "168"], [54.8912160667, 82.4629456833, "38"], [54.8911874, 82.4779408167, "169"], [54.8919186333, 82.4584176833, "6"], [54.89118215, 82.4781761167, "171"], [54.8916446833, 82.4632172667, "42"], [54.8911654333, 82.4784059833, "173"], [54.8918217333, 82.4603906, "16"], [54.8911525333, 82.47862755, "82"], [54.8924511333, 82.4606313, "17B"], [54.8907954, 82.4784089, "176"], [54.8915381333, 82.46524225, "58"], [54.8911355667, 82.478864, "177"], [54.892167, 82.4617876833, "29"], [54.8911190667, 82.4790793167, "179"], [54.89148925, 82.47413605, "141"], [54.891102, 82.4793148833, "181"], [54.89174025, 82.4622023, "30"], [54.8910930167, 82.4795416333, "183"], [54.8923048, 82.4605938667, "17A"], [54.8907614, 82.4793265833, "184"], [54.8919164833, 82.45868485, "8"], [54.89108015, 82.4797723833, "185"], [54.8905659667, 82.4757830667, "152"], [54.8910595667, 82.4800169167, "187"], [54.8923372333, 82.4582542, "7"], [54.8917307333, 82.46930505, "83"], [54.8909663333, 82.4756883833, "150"], [54.8909111167, 82.47660485, "160"], [54.8916525667, 82.47116215, "129"], [54.8909366167, 82.4762755333, "158"], [54.8911956, 82.4715676333, "104"], [54.8915429, 82.4650714667, "56"], [54.8916859833, 82.45866365, "8A"], [54.8919523, 82.4651683833, "55"], [54.8915248667, 82.4654342167, "60"], [54.8917482, 82.4613051333, "26"], [54.89101255, 82.4753879, "148"], [54.8925110833, 82.4608349833, "19"], [54.89179885, 82.4605882333, "18"], [54.8918582667, 82.4680386, "79"], [54.8921763167, 82.461584, "27"], [54.8914747833, 82.4665362167, "70"], [54.8923905833, 82.4611956167, "23A"], [54.8919975333, 82.4651655, "55A-55E"], [54.8920026167, 82.45729865, "2B"], [54.8920162667, 82.4570673, "2A"], [54.8916384333, 82.4713722, "131"], [54.8912288333, 82.4711408333, "102"], [54.8915248167, 82.4656389833, "62"], [54.8917611667, 82.46114545, "26A"], [54.8921091, 82.4630288167, "37"], [54.8209873167, 82.3760669333, "191C"], [54.8249917, 82.3656036667, "91A"], [54.8190006167, 82.3860204167, "254B"], [54.818206, 82.38533, "254C"], [54.8061591667, 82.3983436, "462"], [54.8056489333, 82.3937574167, "423"], [54.79713005, 82.40084965, "545"], [54.79324805, 82.4048036667, "601"], [54.8186617833, 82.3815952, "248A"], [54.8090422833, 82.3906621333, "383B"], [54.8183971667, 82.3818555667, "248B"], [54.8027335833, 82.3963706167, "471"], [54.8167087, 82.380828333, "267D"], [54.7975265333, 82.4015703333, "548"], [54.8190651167, 82.3786646333, "229"], [54.7903981, 82.4069922833, "639B"], [54.8253436333, 82.3662536, "91B"], [54.8085089, 82.3916918167, "406"], [54.82507135, 82.36734685, "107A"], [54.8243141667, 82.3677190167, "107B"], [54.8240930167, 82.3684544333, "107C"], [54.82428045, 82.3692349, "107D"], [54.79320855, 82.4054745333, "606"], [54.8210957833, 82.3758549, "191A"], [54.8220672667, 82.3711244167, "155B"], [54.7905658333, 82.40715725, "639A"], [54.8219987167, 82.37182365, "155C"], [54.79282425, 82.4050586, "605"], [54.8217745833, 82.37222335, "155D"], [54.80515685, 82.3938695, "437"], [54.8076407333, 82.3900775, "397"], [54.8237106, 82.3712966333, "131"], [54.8015971, 82.3955181667, "479"], [54.8227929, 82.3730921167, "157"], [54.7961391167, 82.4003037, "549"], [54.8233609833, 82.37310895, "152"], [54.8219492667, 82.3745148667, "167"], [54.8247903833, 82.3685883333, "109"], [54.8248283, 82.3705193167, "126"], [54.8109710333, 82.3856751167, "341"], [54.82605485, 82.3651553667, "80"], [54.8107359, 82.3894516833, "368"], [54.8120085667, 82.3845064, "321"], [54.8128636833, 82.38379265, "310"], [54.81208235, 82.3843228, "319"], [54.8046513333, 82.3956590833, "452"], [54.8144067333, 82.3816008667, "275"], [54.8102773, 82.3874213, "345B"], [54.8144369, 82.38227185, "280"], [54.8164895333, 82.3782892333, "267C"], [54.8182382167, 82.3800216667, "240"], [54.8173681833, 82.3806125, "248C"], [54.8181792333, 82.3832736333, "254A"], [54.8095723, 82.3899326833, "383A"], [54.81761125, 82.3835261667, "254D"], [54.8028805167, 82.3962506667, "469"], [54.8185789, 82.3845444, "254"], [54.8163547167, 82.3812859833, "258"], [54.7930282167, 82.40572125, "608"], [54.821138, 82.38039485, "216D"], [54.81606355, 82.3793317167, "267B"], [54.81934515, 82.3785087833, "225"], [54.8050155667, 82.3943832667, "443A"], [54.81861015, 82.379036, "235A"], [54.8121421833, 82.3842917833, "317"], [54.7913696833, 82.4063793, "623"], [54.8205651167, 82.3768472333, "201"], [54.8205108, 82.37795785, "212"], [54.8231057, 82.3725295333, "155A"], [54.8046846167, 82.3939956333, "443B"], [54.7964915667, 82.40187745, "559"], [54.80485815, 82.39453205, "443C"], [54.8060723667, 82.3939798167, "428"], [54.8047227, 82.3946713167, "445"], [54.8048381667, 82.3949814667, "448"], [54.8045786833, 82.3947850833, "449"], [54.7981357, 82.3900883333, "461B"], [54.8099047, 82.39060605, "388"], [54.8043014333, 82.3950148, "453"], [54.8043075833, 82.3954701167, "456"], [54.79168895, 82.4068591833, "626"], [54.8021525833, 82.39678165, "481"], [54.8034197833, 82.39575665, "463"], [54.8032362167, 82.3959217833, "467"], [54.80216475, 82.3974925167, "484"], [54.8203596833, 82.3755115833, "191B"], [54.7993380667, 82.3999904667, "522"], [54.8085763833, 82.3912222, "391"], [54.7981168833, 82.4004628, "533"], [54.7969743333, 82.4013795333, "553"], [54.7970796333, 82.4021227667, "554"], [54.7943688833, 82.404582833, "590"], [54.8073738833, 82.39222815, "419"], [54.7955603667, 82.4027828667, "569"], [54.8102608, 82.3842148333, "345A"], [54.7958160167, 82.4031990833, "570"], [54.7924329333, 82.4084768167, "630"], [54.7956436833, 82.4033528333, "572"], [54.7960458333, 82.4022678, "563"], [54.8030297833, 82.3966600167, "472"], [54.7963875, 82.4000470667, "547"], [54.8052467, 82.39419005, "439"], [54.8103165333, 82.38810555, "345C"], [54.7987565833, 82.3998819167, "531A"], [54.7982830833, 82.40023825, "531B"], [54.79918855, 82.4000808833, "524"], [54.7944693667, 82.4027557167, "577"], [54.7950937833, 82.4031431333, "575"], [54.7927918333, 82.4046828167, "603"], [54.7947576333, 82.4034387833, "579"], [54.8117228167, 82.38764085, "346B"], [54.7911496667, 82.40664935, "629"], [54.81588535, 82.3807131667, "267A"], [54.7912028, 82.40724595, "634"], [54.7908960167, 82.4074944, "638"], [54.8108278167, 82.3873807333, "346A"], [54.8109458667, 82.3868272333, "346"], [54.8861902333, 82.4912457, "146"], [54.8868429667, 82.4923818, "242"], [54.8863162333, 82.4914635667, "150"], [54.8866134167, 82.4930928167, "281"], [54.8857069333, 82.49160115, "115"], [54.88701045, 82.4928565167, "282"], [54.8865745167, 82.4918085333, "196"], [54.8847997667, 82.49160355, "1"], [54.88530765, 82.49159645, "65"], [54.8858858, 82.4924325333, "195"], [54.88625505, 82.4922030167, "201"], [54.8858815167, 82.49117815, "140"], [54.8870972167, 82.4937585167, "370"], [54.8871422667, 82.4932273333, "330"], [54.8867199333, 82.4935654, "331"], [54.88711285, 82.4670386167, "6"], [54.8867336333, 82.4670516667, "3"], [54.8867436833, 82.4669519, "1"], [54.8869533833, 82.4669386667, "2"], [54.8869398667, 82.46704125, "4"], [54.887182, 82.46692505, "5"], [54.9008030333, 82.4861118167, "2"], [54.90075285, 82.4859038833, "1"], [54.9009336167, 82.4865805833, "4"], [54.9008800167, 82.4863431167, "3"], [54.90100455, 82.4868142, "5"], [54.9014235667, 82.4873154667, "7B"], [54.9010728, 82.4870406333, "6"], [54.9012685833, 82.4873578833, "7A"], [54.9011401833, 82.4872876833, "7"], [54.8158733667, 82.37666665, "18A"], [54.8161566833, 82.3760580333, "16"], [54.8161400333, 82.3766246833, "18B"], [54.81564025, 82.3760005833, "20"], [54.9147940667, 82.4781293167, "2"], [54.91445275, 82.477954, "5"], [54.91432165, 82.4780204333, "7"], [54.9142254833, 82.4781627667, "9"], [54.9142594833, 82.4783362167, "11"], [54.9140805833, 82.4785308167, "11A"], [54.9141151333, 82.47861905, "10A"], [54.91436635, 82.4784698833, "10"], [54.9144396667, 82.4784653667, "8"], [54.9147089667, 82.47783895, "1"], [54.9145894, 82.4778914333, "3"], [54.9146597833, 82.4781811833, "4"], [54.9145286, 82.4783673833, "6"], [54.9030873667, 82.47210575, "3"], [54.9032704833, 82.472054, "5"], [54.9032275333, 82.4724681, "4"], [54.9029155167, 82.4722868333, "1"], [54.9029878333, 82.4725947167, "2"], [54.9033794333, 82.4723403167, "6"], [54.9033877, 82.4721768833, "8"], [54.9026622333, 82.5342312833, "2/60"], [54.8962902167, 82.5377237833, "3/157"], [54.9056577833, 82.5300138, "24"], [54.8978118667, 82.53526435, "1/157"], [54.9036869333, 82.5324068, "46"], [54.8976678167, 82.5356030833, "2/157"], [54.9025187, 82.53438235, "3/60"], [54.8981575333, 82.5358635, "1/158"], [54.9027801667, 82.5340282833, "1/60"], [54.8979776333, 82.536204, "2/158"], [54.9023776667, 82.5345600167, "4/60"], [54.8853151833, 82.4743354167, "6"], [54.8839096667, 82.4747028, "17"], [54.8826408833, 82.4741236667, "44"], [54.8835314167, 82.4746655333, "21"], [54.88308945, 82.4737775333, "28"], [54.8814453833, 82.4749238167, "41"], [54.8829200333, 82.4741641167, "40"], [54.8804728833, 82.4739323833, "66"], [54.8824228667, 82.47455335, "33"], [54.8849254333, 82.4748141333, "9"], [54.8815074833, 82.4735321333, "54A"], [54.8829310333, 82.4736918167, "38"], [54.8836627167, 82.47426195, "20"], [54.8818192, 82.4745435833, "35"], [54.8816592833, 82.4740403, "48"], [54.8816905333, 82.4745296167, "37"], [54.8835084, 82.47420785, "22"], [54.8810922833, 82.4739643833, "58"], [54.8814526, 82.4737812167, "52"], [54.8813118333, 82.4739949167, "56"], [54.88347125, 82.4749025167, "21A"], [54.88493785, 82.4743158, "10"], [54.88273915, 82.4748604167, "29A"], [54.8837637667, 82.4746886167, "19"], [54.8833199667, 82.47417425, "24"], [54.8838467, 82.4742672333, "18"], [54.8833191167, 82.4746548333, "23"], [54.8845514833, 82.4742861, "14"], [54.8853397, 82.4748736833, "5"], [54.8847559333, 82.4748089167, "11"], [54.8829521167, 82.47379525, "36"], [54.88450605, 82.4747736667, "13"], [54.8851099333, 82.4747525667, "7"], [54.8847199, 82.4743100333, "12"], [54.8831416, 82.4741727333, "26"], [54.8808951333, 82.47394745, "60"], [54.8808293167, 82.4744251333, "49"], [54.8806857667, 82.4739440333, "62"], [54.8815219, 82.4745206667, "39"], [54.88054725, 82.47393465, "64"], [54.8851369667, 82.4743293333, "8"], [54.8829415167, 82.4735765833, "34"], [54.8813163167, 82.4745132667, "45"], [54.8825621, 82.4745672, "31"], [54.882743, 82.4745888, "29"], [54.8849588833, 82.4740735333, "10A"], [54.8830033833, 82.47362085, "32"], [54.8814134833, 82.4735401, "54"], [54.8829174167, 82.4746101833, "27"], [54.881329, 82.4749196167, "43"], [54.8818477833, 82.4741495167, "46"], [54.8806645833, 82.474444, "51"], [54.8835542, 82.4740686833, "22A"], [54.8815817333, 82.4735421833, "54B"], [54.884082333, 82.4742836, "16"], [54.8827733167, 82.4741382833, "42"], [54.8831040167, 82.4746167333, "25"], [54.88152945, 82.47402335, "50"], [54.8810197, 82.4744641667, "47"], [54.90035815, 82.4810595167, "6"], [54.9004626167, 82.4814882, "5"], [54.9004783333, 82.4807893167, "8"], [54.90053035, 82.48110305, "10"], [54.9001194333, 82.4813414167, "1"], [54.9002854167, 82.4813794, "3"], [54.9005929833, 82.4812279167, "12"], [54.9005808667, 82.4813900667, "7"], [54.90019795, 82.4810457333, "4"], [54.9000177833, 82.4810738667, "2"], [54.8970709833, 82.471412, "47"], [54.8962267, 82.4699139833, "25"], [54.8957546, 82.46976195, "14"], [54.8960248333, 82.4695108167, "15"], [54.8958360833, 82.4699171167, "16"], [54.8960595667, 82.4695834167, "17"], [54.8956411833, 82.46957925, "12"], [54.8955700333, 82.46945925, "10"], [54.8957725, 82.4690580833, "13"], [54.8957180833, 82.4689838167, "11"], [54.89593735, 82.4700870667, "18"], [54.8960019667, 82.4702152333, "20"], [54.8960897167, 82.4696367833, "21"], [54.8960816667, 82.4703379833, "22"], [54.8961728667, 82.4698312667, "23"], [54.89611545, 82.4703987167, "24"], [54.89616535, 82.4704619, "26"], [54.8965143333, 82.4704345833, "31"], [54.8965995, 82.4706005, "33"], [54.8952596167, 82.46889415, "2"], [54.8954856333, 82.4693051333, "8"], [54.8953389167, 82.4690297167, "4"], [54.8953875833, 82.469136, "6"], [54.9194040167, 82.4783079, "10"], [54.9197726333, 82.4782003, "12"], [54.9194026167, 82.4796128167, "133"], [54.9197761667, 82.47866625, "40"], [54.9199951833, 82.4798155667, "148"], [54.91981195, 82.47907645, "78"], [54.9194262833, 82.4788171833, "59"], [54.9196759333, 82.4798573833, "154"], [54.9193148667, 82.48000435, "155"], [54.9194418667, 82.479248, "95"], [54.91985945, 82.47946575, "114"], [54.8948282, 82.4632178833, "7"], [54.8948541333, 82.4634539, "11"], [54.8946653333, 82.46382725, "6A"], [54.8942238167, 82.4629336667, "1A"], [54.8942486167, 82.4635523667, "2"], [54.8942641667, 82.4631693, "1"], [54.8950186, 82.4640242, "8C"], [54.8944589, 82.4631798333, "3"], [54.8946294333, 82.4631902, "5"], [54.89450815, 82.4635785333, "4"], [54.8946479, 82.4635948, "6"], [54.89498065, 82.4637099667, "8B"], [54.8948863333, 82.4637035833, "8A"], [54.89496985, 82.46325115, "9"], [54.8947899667, 82.4637024167, "8"], [54.89513905, 82.4640248667, "8D"], [54.9428737167, 82.4654487167, "80"], [54.9435976167, 82.4662367333, "85"], [54.9406954, 82.4650713667, "60"], [54.9443210167, 82.466494, "91"], [54.9430113833, 82.4661685167, "79"], [54.9423613, 82.4660200167, "73"], [54.9217937167, 82.54130465, "1"], [54.9214646833, 82.5409056667, "41"], [54.9210630667, 82.5409307333, "86"], [54.9211853667, 82.5410841, "66"], [54.92096145, 82.5405598333, "83"], [54.9206217333, 82.54086065, "133"], [54.9216795, 82.5411416833, "21"], [54.9213075167, 82.5412473167, "48"], [54.9214208167, 82.54139905, "26"], [54.9204421, 82.5405807833, "127"], [54.8771340667, 82.4766456167, "17"], [54.87582545, 82.4764970667, "2"], [54.8772717167, 82.47651465, "19"], [54.87616025, 82.47643495, "6"], [54.87713215, 82.4761358333, "20"], [54.8763702833, 82.4764765, "10"], [54.8768617333, 82.4759845333, "18A"], [54.87599415, 82.4764346167, "4"], [54.8767086, 82.4760073, "18B"], [54.8762125167, 82.4761083833, "8"], [54.8771747, 82.4758428833, "22"], [54.8774091, 82.4763950167, "21"], [54.8764912333, 82.4760901, "18C"], [54.8775394167, 82.47599195, "25"], [54.8765312333, 82.47650495, "12"], [54.8774804667, 82.47621635, "23"], [54.8767157833, 82.4764832833, "14"], [54.8776499, 82.4754748667, "26B"], [54.8769073667, 82.4763486167, "16"], [54.8774781667, 82.4755253167, "26A"], [54.8769741333, 82.4767701, "15"], [54.8761039, 82.4768351333, "3"], [54.8767738333, 82.4768931333, "13"], [54.8775332833, 82.4757816833, "27"], [54.87661205, 82.4769204667, "11"], [54.8773297333, 82.4756777167, "24"], [54.8761442833, 82.47743145, "5B"], [54.8761289667, 82.4772156167, "5A"], [54.87642575, 82.47690055, "7"], [54.87587225, 82.4768522667, "1"], [54.8762655667, 82.4774301667, "5C"], [54.8765258167, 82.4771421167, "9"], [54.8775364167, 82.48049705, "9"], [54.87721065, 82.48073405, "3"], [54.8773645167, 82.48035315, "6"], [54.8769231833, 82.4805237833, "2"], [54.8776686, 82.4807239333, "7"], [54.87711275, 82.4803929167, "4"], [54.8774604167, 82.4807430667, "5"], [54.87709625, 82.4808098667, "1"], [54.8775519167, 82.48027995, "8"], [54.8028734167, 82.5544968333, "64"], [54.7908094, 82.55717225, "231"], [54.8020794667, 82.5538755, "79"], [54.8025875667, 82.5538326167, "73"], [54.8788754667, 82.4246207833, "26"], [54.8579076333, 82.423369, "257A"], [54.8799908833, 82.4247353667, "14"], [54.8576267333, 82.4217187, "257D"], [54.8792310833, 82.4241302167, "21"], [54.8560683833, 82.4248801833, "278"], [54.8737989833, 82.42415875, "79"], [54.8813433667, 82.42936065, "8/8"], [54.8734102333, 82.4246495, "86"], [54.8605645333, 82.42419905, "229"], [54.8719786333, 82.4241769, "91"], [54.8781270333, 82.4246374167, "34"], [54.8720274833, 82.4248217833, "94"], [54.8578687167, 82.4212873833, "257C"], [54.87800375, 82.4263720167, "40"], [54.8618965833, 82.4242119333, "213"], [54.8801869167, 82.42773835, "1/8"], [54.8779240167, 82.42463595, "36"], [54.8743793333, 82.4246104667, "76"], [54.8578661, 82.4218172, "257B"], [54.8539269833, 82.4240546833, "293"], [54.8767564, 82.4218264667, "49"], [54.8598008833, 82.4242299667, "235"], [54.8584386667, 82.42421145, "249"], [54.8570034667, 82.4213275, "265"], [54.8800888, 82.42631445, "10"], [54.8771395667, 82.4240152, "43"], [54.8781435167, 82.4240972, "33"], [54.8767499333, 82.4247563, "52"], [54.87567625, 82.42459055, "60"], [54.8807013, 82.4246087167, "6"], [54.8764337167, 82.42402455, "55"], [54.8645742, 82.4242096833, "183"], [54.88046835, 82.4241622833, "7"], [54.8700695833, 82.4241415, "109"], [54.87820565, 82.4227695333, "31"], [54.86436995, 82.42472575, "184"], [54.8712348833, 82.4199563167, "129"], [54.8655708833, 82.4241920833, "163"], [54.866108, 82.4247113333, "168"], [54.85758825, 82.4248484667, "258"], [54.8806747167, 82.4289119667, "3/8"], [54.8808697333, 82.429829167, "5/8"], [54.8805498667, 82.4315314333, "7/8"], [54.8805142333, 82.4283195667, "8"], [54.8642561, 82.4211131, "185B"], [54.8642016333, 82.4241768167, "185C"], [54.8584019167, 82.4247333, "254"], [54.8579075, 82.4247216333, "256"], [54.85733205, 82.4242334, "261"], [54.8572177833, 82.4231895, "263"], [54.8643650167, 82.4220877667, "185A"], [54.89998625, 82.4831132833, "33"], [54.9028015, 82.4824331833, "62A"], [54.9027069833, 82.4824823167, "60A"], [54.8999237833, 82.48395105, "28"], [54.8998797667, 82.4835940667, "30"], [54.9000587333, 82.4835154167, "32"], [54.9016412667, 82.48230395, "51"], [54.901574, 82.4827421167, "52"], [54.90194355, 82.4826111667, "54"], [54.90215485, 82.4824878833, "56"], [54.9003890667, 82.48224575, "41"], [54.9005753833, 82.4833095667, "42"], [54.9004801833, 82.4824322, "43"], [54.9007382, 82.48323555, "44"], [54.9007203833, 82.4827551667, "45"], [54.9008984833, 82.4831199, "46"], [54.9010707, 82.4830293333, "48"], [54.9010407167, 82.4825866833, "49"], [54.90236485, 82.4823782167, "58"], [54.9025425, 82.4818774167, "59"], [54.9025757167, 82.4822757667, "60"], [54.9029402833, 82.4816723667, "61"], [54.90278895, 82.4821800333, "62"], [54.9031374667, 82.4822319333, "64A"], [54.9030315833, 82.4820359667, "64"], [54.9032178667, 82.4819789333, "66"], [54.9019434, 82.48286115, "54A"], [54.8818104333, 82.4707039833, "12"], [54.8814851833, 82.4704820167, "9"], [54.8810768333, 82.4699034, "5B"], [54.8818488, 82.4702216, "1"], [54.8816215667, 82.47092875, "11"], [54.8816941833, 82.4701273667, "2"], [54.8811842333, 82.4704525667, "7"], [54.8813522667, 82.47002245, "4"], [54.88194605, 82.4707180167, "13"], [54.8813308, 82.4704956333, "8"], [54.88115305, 82.4702513333, "6"], [54.8811936167, 82.4700739, "5A"], [54.8815373167, 82.4700831, "3"], [54.8816521333, 82.4705540833, "10"], [54.8088981167, 82.36906915, "77"], [54.8088042833, 82.3655253833, "80"], [54.8066999167, 82.3689073333, "52"], [54.8042113, 82.3710341667, "21"], [54.8035833, 82.3699288833, "17"], [54.8043107833, 82.3697591667, "23"], [54.8108776667, 82.3698460833, "87B"], [54.8045451333, 82.3697163333, "25"], [54.8104246167, 82.365628, "94B"], [54.8047750833, 82.3692679333, "30"], [54.80400095, 82.3716803333, "19B"], [54.8025388833, 82.3693096833, "2"], [54.8032552333, 82.3718025, "19A"], [54.8027435333, 82.3695240333, "4"], [54.8105842, 82.3663406667, "94A"], [54.8028778167, 82.3696653833, "6"], [54.8095059667, 82.37026555, "81"], [54.8055475667, 82.3691296833, "36"], [54.8101165833, 82.3695157, "87A"], [54.8055532333, 82.3695431833, "41"], [54.8068988, 82.3688744333, "54"], [54.8059911667, 82.3690365333, "44"], [54.8074588333, 82.36921695, "59"], [54.8075005667, 82.3687474667, "60"], [54.80836585, 82.3685797833, "64"], [54.8060896833, 82.3724944167, "67A"], [54.8079139, 82.3722770833, "67B"], [54.8089385167, 82.3721465167, "67C"], [54.81012905, 82.3782445, "67D"], [54.8110090333, 82.3680073333, "96"], [54.8103251, 82.3687031333, "89"], [54.8101581667, 82.36820355, "88"], [54.8097519333, 82.36879765, "85"], [54.8084821, 82.37132025, "69"], [54.8818073167, 82.4679643, "6"], [54.8823003833, 82.4676866167, "1"], [54.8818464333, 82.4675593, "5"], [54.8822481333, 82.4679646833, "2"], [54.8817913833, 82.4677682167, "7"], [54.8821612333, 82.4674131167, "3A"], [54.8821403, 82.46766325, "3"], [54.8821458833, 82.4679535, "4"], [54.9077193667, 82.4708605833, "32"], [54.9105951, 82.4793621667, "98A"], [54.9066916333, 82.4685963, "19"], [54.9104376833, 82.4794448167, "98"], [54.9064596833, 82.4678557333, "11"], [54.9103041333, 82.479528, "100"], [54.9090584167, 82.477976, "83"], [54.9088679, 82.4779112, "81B"], [54.90751235, 82.4701317833, "26"], [54.9085779167, 82.4748978833, "57B"], [54.9077844167, 82.4710735, "34"], [54.9088840833, 82.4747589333, "60"], [54.9063916833, 82.4676261333, "9"], [54.9091791167, 82.47510015, "64A"], [54.9090063, 82.4778273167, "81"], [54.9094076667, 82.4749288167, "66"], [54.9104649333, 82.4812665333, "111"], [54.9094658167, 82.47513735, "66A"], [54.9106371667, 82.4806045833, "108"], [54.9085164667, 82.47469955, "57A"], [54.9065306333, 82.4680931667, "13B"], [54.90744655, 82.46992735, "24"], [54.90669875, 82.4675042833, "10"], [54.9063321167, 82.467451, "7"], [54.9068232667, 82.4690555333, "23"], [54.9064476333, 82.4682054167, "13A"], [54.90728695, 82.4687101167, "20A"], [54.90564665, 82.4665080833, "1B"], [54.9095425167, 82.4780996, "87"], [54.9055099333, 82.4665785667, "1C"], [54.9064278333, 82.4685453667, "17"], [54.9087755667, 82.4730346, "48A"], [54.9092946833, 82.4772395333, "77"], [54.9089289833, 82.4729708, "48B"], [54.9070766, 82.4680242167, "14A"], [54.9099299333, 82.4794760167, "97"], [54.9060196667, 82.4664193167, "3"], [54.9093701833, 82.4764340333, "78"], [54.9088882, 82.4759446333, "71"], [54.9071022833, 82.4688659833, "20"], [54.9087805333, 82.4732292667, "50A"], [54.9101438333, 82.4802177167, "103"], [54.9100409167, 82.4805634167, "105A"], [54.9103943, 82.4797851, "102"], [54.9097405333, 82.4787679167, "95"], [54.9093126667, 82.4762224667, "76"], [54.9076596, 82.4706490167, "30"], [54.9090636667, 82.4764674667, "75"], [54.9091701167, 82.47836235, "89"], [54.9089457333, 82.4761631167, "73"], [54.9085522833, 82.4736826, "52"], [54.9092411833, 82.4760100667, "74"], [54.9079714833, 82.4729381333, "45"], [54.9080979833, 82.4733453333, "49"], [54.9069515333, 82.4683180833, "16"], [54.9066421833, 82.4673182, "8"], [54.90937045, 82.47757155, "79"], [54.9081895333, 82.47364565, "51"], [54.9086237333, 82.4750583333, "59"], [54.9091840167, 82.4757918333, "72"], [54.9087522333, 82.47547835, "63"], [54.90689515, 82.46927105, "25"], [54.9078795, 82.4713550833, "36"], [54.9056039, 82.4664057333, "1A"], [54.9106886833, 82.4808305833, "110"], [54.9059434167, 82.4661582833, "1"], [54.90686465, 82.4680447333, "14"], [54.9100754167, 82.4799441333, "101"], [54.9096307667, 82.4784052167, "93"], [54.9103163333, 82.4807391667, "107"], [54.9099907833, 82.47967445, "99"], [54.9102545333, 82.4804980667, "105"], [54.9067854667, 82.46778495, "12"], [54.9087875, 82.4761555333, "73A"], [54.9088226667, 82.4757288667, "69"], [54.90860015, 82.4738656333, "54"], [54.9084004667, 82.4731332667, "48"], [54.9086524, 82.4734778333, "52A"], [54.9070271167, 82.4685905333, "18"], [54.9075912333, 82.47002045, "26A"], [54.9089373833, 82.4749522333, "62"], [54.90542545, 82.4648276667, "2"], [54.9075973667, 82.4703872167, "28"], [54.9084245, 82.4757077667, "65"], [54.90912645, 82.4755800667, "70"], [54.90927015, 82.4751967833, "68A"], [54.9094690167, 82.4778629667, "85"], [54.90713625, 82.4682970167, "16A"], [54.9084881667, 82.4734576333, "50"], [54.9071228167, 82.4684523333, "18A"], [54.9066047833, 82.4683209, "15"], [54.9086888833, 82.4752875667, "61"], [54.9092166833, 82.4785048333, "91"], [54.90675295, 82.4688188167, "21"], [54.9089505167, 82.4731089667, "50B"], [54.9090581667, 82.4753575833, "68"], [54.9086879167, 82.47334805, "50C"], [54.91039185, 82.48101575, "109"], [54.9091127833, 82.4786399833, "91A"], [54.90897975, 82.4751060667, "64"], [54.8717186833, 82.4615598167, "102"], [54.8620697167, 82.4558799667, "224"], [54.8767515, 82.4619986833, "42"], [54.8664140333, 82.4578848167, "168"], [54.8778354833, 82.46234395, "32"], [54.8624631167, 82.456142, "216"], [54.8639001667, 82.4568719667, "194"], [54.8719572167, 82.4602589, "100"], [54.87530725, 82.46140325, "60"], [54.86265385, 82.4563095333, "214"], [54.8736987167, 82.46078595, "80"], [54.8899623167, 82.4632323, "57A"], [54.8891142333, 82.4571846167, "4"], [54.8896277, 82.4633464833, "59"], [54.88913275, 82.4644998167, "60"], [54.8891977, 82.46335, "1/52"], [54.8902417, 82.4604661, "25A"], [54.8892224667, 82.4630494333, "50"], [54.8904468333, 82.4604248, "25"], [54.8899309167, 82.45755835, "7"], [54.8893669667, 82.4601698, "26"], [54.8891862667, 82.4573128833, "4B"], [54.8897543167, 82.4603741167, "27A"], [54.8895259333, 82.4573211667, "4A"], [54.8899523167, 82.4603841667, "27B"], [54.8887959333, 82.4610821833, "34"], [54.8901048833, 82.4603943833, "27C"], [54.8891028833, 82.4650312333, "64"], [54.88868315, 82.4633466833, "52B"], [54.8896881, 82.4624856667, "43"], [54.8899772333, 82.46296325, "53"], [54.8893557167, 82.4604985333, "28"], [54.8887644667, 82.46359225, "54A"], [54.8887913667, 82.46338915, "52A"], [54.8891714, 82.4635651833, "54B"], [54.8898920167, 82.4582737, "13"], [54.8891619167, 82.46382635, "56"], [54.8902644667, 82.4602963, "23B"], [54.8903580333, 82.4578762167, "9A"], [54.8895457333, 82.4571203833, "2"], [54.8899171667, 82.4577745667, "9"], [54.8891239833, 82.4610409833, "32"], [54.8886105167, 82.4627844833, "48A"], [54.8897850667, 82.4601521667, "23"], [54.8885782833, 82.4630716, "48B"], [54.8895879667, 82.4639701, "65"], [54.88875245, 82.4628892667, "48C"], [54.8897637667, 82.46090555, "29"], [54.8898831667, 82.4584686167, "15"], [54.8900645833, 82.4630566333, "57"], [54.8894477833, 82.4587900667, "20"], [54.8898162, 82.4597956833, "21"], [54.8903147667, 82.4585830833, "15A"], [54.8899451, 82.4573311, "5"], [54.8892625, 82.46226515, "42"], [54.88959655, 82.4636994833, "63"], [54.8888289, 82.4626433167, "46B"], [54.8897502167, 82.4611882333, "31"], [54.8890874833, 82.4653801667, "66"], [54.8896453667, 82.4629410333, "51"], [54.88871155, 82.4626789833, "46A"], [54.8889027, 82.4648962833, "64A"], [54.8888759167, 82.4633533167, "2/52"], [54.8903299167, 82.4581553, "13A"], [54.8890716, 82.4657335833, "68"], [54.8894647167, 82.4584316167, "16"], [54.8889404333, 82.4574026, "6B"], [54.8896737667, 82.4626918667, "45"], [54.8899074, 82.4580168, "11"], [54.8898575333, 82.4588148833, "17"], [54.8896982167, 82.46224375, "1/41-7/41"], [54.8895164167, 82.4575203, "6"], [54.8899765333, 82.4602187333, "23A"], [54.8891143, 82.4647213833, "62"], [54.8892440667, 82.46252665, "46"], [54.88890735, 82.4607073833, "30A"], [54.88930945, 82.4612971, "36"], [54.8892202667, 82.4574350833, "6A"], [54.8891678667, 82.4639653333, "58"], [54.8898663667, 82.4589170833, "19"], [54.88937355, 82.4599354833, "24"], [54.8893259833, 82.4609626833, "32A"], [54.8899845333, 82.4624851, "49"], [54.8700170667, 82.4425962167, "35"], [54.87002395, 82.4440538333, "45"], [54.8703417167, 82.4408183833, "19"], [54.8704475833, 82.44446245, "48"], [54.8705703667, 82.44211805, "32"], [54.8712876167, 82.4401329, "8"], [54.8706072, 82.4431831333, "40"], [54.88103245, 82.43996055, "74"], [54.8810238833, 82.44054185, "144"], [54.8819540833, 82.44341985, "444"], [54.8810368167, 82.4414257833, "218"], [54.8836569833, 82.4449454, "695"], [54.8805499, 82.44146635, "219"], [54.88153545, 82.4435217, "409"], [54.8805337667, 82.4422020167, "277"], [54.8810820333, 82.4423189667, "302"], [54.8826985333, 82.4431283833, "503"], [54.8825451667, 82.4439081167, "533"], [54.8834376, 82.4454858167, "694"], [54.8806721167, 82.44412345, "397"], [54.81387095, 82.45409265, "1"], [54.821195, 82.4616223833, "104"], [54.8211624833, 82.4682833, "181"], [54.8178846167, 82.4588240333, "65"], [54.8149536667, 82.4553629333, "15"], [54.8197732667, 82.4671436, "167"], [54.8161526333, 82.4563465, "35"], [54.8209648833, 82.4674674, "178"], [54.820487, 82.4606511167, "86"], [54.9711954833, 82.3673120333, "66"], [54.8927382667, 82.4630076, "2A"], [54.8930191833, 82.4631100333, "1"], [54.89302745, 82.4629626333, "1A"], [54.8927669333, 82.46308965, "2"], [54.8929038667, 82.46322235, "5"], [54.8926603333, 82.4633015, "3A"], [54.89273305, 82.4631913833, "3"], [54.8928261167, 82.4632172333, "4"], [54.8863257333, 82.3892431333, "29"], [54.8828649833, 82.3942711333, "76"], [54.88740485, 82.3880108167, "3"], [54.8816477833, 82.39495895, "85"], [54.9193026667, 82.46865615, "27"], [54.9191047667, 82.4689871, "21"], [54.9190031667, 82.4685222, "29"], [54.9191244667, 82.4666619167, "55"], [54.9187559333, 82.4673880833, "43"], [54.9191856, 82.4667804333, "49"], [54.9183846667, 82.4653317833, "75"], [54.9186045833, 82.46662185, "59"], [54.9191840167, 82.4678865167, "35"], [54.9191584333, 82.4662006333, "61"], [54.9188624, 82.4676419833, "39"], [54.9184419667, 82.4657698, "69"], [54.9178364167, 82.4627168667, "111"], [54.9185242667, 82.4661814167, "63"], [54.9191998, 82.4694479333, "17"], [54.9190388167, 82.4654450833, "71"], [54.91796485, 82.4632720833, "103"], [54.91880005, 82.4653678333, "73"], [54.9182357167, 82.4645811, "93"], [54.9177229333, 82.4619539, "119"], [54.91802955, 82.4624559167, "115"], [54.9176650833, 82.4616779667, "123"], [54.91870075, 82.4670770833, "45"], [54.9176143667, 82.4613274, "125"], [54.9189086667, 82.468155, "33"], [54.9174097167, 82.4613318833, "127"], [54.9190924, 82.4675234333, "41"], [54.8068523167, 82.3939250833, "5"], [54.8144720167, 82.4032648333, "122"], [54.8070121667, 82.3941206333, "7"], [54.8135841833, 82.40160315, "114"], [54.8071723, 82.39433025, "9"], [54.8073319667, 82.3945375, "13"], [54.8088248333, 82.39658935, "35"], [54.8150867, 82.4041908167, "138"], [54.8087098667, 82.39797025, "45"], [54.8153430833, 82.4043867333, "140"], [54.8113713333, 82.3997835833, "77"], [54.8128633667, 82.4026050333, "103"], [54.8153182333, 82.404702, "142"], [54.8136947667, 82.4026962667, "113"], [54.8146717833, 82.4042277167, "133"], [54.8132897167, 82.40224345, "105"], [54.87318525, 82.5752061, "783"], [54.87086625, 82.5605686167, "3/668"], [54.8736095333, 82.5759500667, "791"], [54.8846973333, 82.5128454333, "105"], [54.882909, 82.5284399, "295"], [54.8854251167, 82.50715345, "42"], [54.8730277, 82.5735052333, "768"], [54.8852305667, 82.5138063667, "116"], [54.8765950833, 82.5441586167, "457"], [54.8854819167, 82.51593135, "130"], [54.8793962333, 82.5400538, "398"], [54.8856814667, 82.5176310333, "146"], [54.8850541667, 82.5122725, "94"], [54.8859048, 82.5196622667, "158"], [54.8839926333, 82.5070946667, "44"], [54.8828246833, 82.5299873833, "300"], [54.8835640333, 82.5073463, "47"], [54.8812550167, 82.53308795, "338"], [54.87624165, 82.5468433, "472"], [54.8735672333, 82.5726554167, "2/766"], [54.8756854833, 82.5468615167, "483"], [54.8855889333, 82.5069699, "1/42"], [54.8764352833, 82.55027325, "508"], [54.88626155, 82.5222170833, "2/182"], [54.8739916667, 82.5532237833, "537"], [54.8790302167, 82.5397931667, "396"], [54.8750138, 82.5530649833, "542"], [54.8839209333, 82.5106114167, "79"], [54.8790556833, 82.5364847667, "371"], [54.8804106667, 82.5347674167, "348"], [54.8843208, 82.50806425, "50"], [54.8835448667, 82.50621025, "37"], [54.8789683667, 82.5407611667, "400"], [54.8819428333, 82.5302822333, "307"], [54.8838573833, 82.5041196833, "26"], [54.8728271833, 82.5730276667, "1/766"], [54.8862517333, 82.5218569167, "1/182"], [54.88592065, 82.52030825, "170"], [54.8804488333, 82.5336723833, "345"], [54.8724145667, 82.5722238833, "756"], [54.8710689167, 82.5600702167, "2/668"], [54.8749418667, 82.5762505333, "808"], [54.88330185, 82.5037989167, "25"], [54.8742985667, 82.5709469667, "766"], [54.8855461833, 82.5169524167, "138"], [54.8840771833, 82.5086316, "57"], [54.8799641333, 82.5345286833, "351"], [54.8747767833, 82.5703700833, "4/766"], [54.8712547, 82.5595212, "1/668"], [54.8852620333, 82.5203346333, "167"], [54.87846535, 82.5402971, "407"], [54.87451705, 82.5722616833, "3/766"], [54.8865716667, 82.5064284333, "2/42"], [54.8699697833, 82.5701625667, "725"], [54.8850022833, 82.5119347333, "92"], [54.9141589833, 82.4676254, "19"], [54.9155973833, 82.46772575, "11/2"], [54.91552955, 82.4660865, "36/2"], [54.9156190333, 82.4673462667, "9/2"], [54.9154039167, 82.4660434167, "35/2"], [54.9155738333, 82.4664463167, "5/2"], [54.91535915, 82.4658985167, "34/2"], [54.9155678833, 82.4667106333, "6/2"], [54.91544365, 82.4658299, "33/2"], [54.9160503333, 82.4675822, "21/2"], [54.9156064333, 82.4657751333, "32/2"], [54.9147495167, 82.4662775167, "5"], [54.9157566167, 82.46569785, "31/2"], [54.9154667667, 82.4679029167, "12/2"], [54.91585185, 82.4657343333, "30/2"], [54.9152016333, 82.4653091167, "1"], [54.9153522167, 82.4663997833, "4"], [54.9156452333, 82.4675400833, "10/2"], [54.9153521167, 82.4665981833, "4A"], [54.91558475, 82.4671245833, "8/2"], [54.9153486333, 82.4667996333, "6"], [54.9155721333, 82.4669092, "7/2"], [54.9152996667, 82.4669875833, "6A"], [54.9150243, 82.46636625, "5A"], [54.9162041333, 82.4675381333, "22/2"], [54.9162005, 82.4673120333, "23/2"], [54.9161440167, 82.4671061, "24/2"], [54.9160962667, 82.4669004667, "25/2"], [54.9160486333, 82.4666893333, "26/2"], [54.9159963833, 82.46648905, "27/2"], [54.91591785, 82.4662933333, "28/2"], [54.9157758667, 82.4662000667, "38/2"], [54.9157248667, 82.4659447167, "37/2"], [54.9158606, 82.46592755, "29/2"], [54.9159540833, 82.4673968833, "20/2"], [54.91578295, 82.4674348167, "17/2"], [54.91584205, 82.4677180167, "18/2"], [54.9156962333, 82.4664396833, "13/2"], [54.915699, 82.4667043333, "14/2"], [54.9157030167, 82.4669139, "15/2"], [54.9157118833, 82.4671016, "16/2"], [54.9158802833, 82.4671848, "19/2"], [54.9146419333, 82.4678385333, "16"], [54.9149667, 82.46605435, "3"], [54.9150279333, 82.4667922833, "7"], [54.9141704333, 82.4678512833, "21"], [54.9142653, 82.4673118833, "15"], [54.91450075, 82.4674330833, "13"], [54.9147242667, 82.46734925, "11"], [54.9148913167, 82.4671297667, "9"], [54.9151929833, 82.4672369167, "8"], [54.9144812833, 82.4679524833, "18"], [54.9149502167, 82.4675873667, "12"], [54.9147979333, 82.4677301167, "14"], [54.9140953833, 82.4682407667, "22"], [54.9143135333, 82.4679806667, "20"], [54.9139027667, 82.4673990667, "17"], [54.91508455, 82.46743825, "10"], [54.8207364833, 82.3925286333, "110"], [54.8140913167, 82.3867786167, "31"], [54.82388165, 82.3961648833, "164"], [54.8149241833, 82.3869723167, "38"], [54.8341317167, 82.4133935833, "364"], [54.8244762167, 82.39859475, "186"], [54.82108675, 82.3928284333, "112"], [54.8257318, 82.4028302167, "236"], [54.8213587333, 82.3930749333, "114"], [54.8245402667, 82.3979335833, "184"], [54.8216469333, 82.3939728667, "129"], [54.8287610333, 82.4083265833, "302"], [54.82049075, 82.3882675333, "92"], [54.8209210167, 82.3876718333, "90B"], [54.8243807167, 82.4009181, "207"], [54.8210754833, 82.3869467167, "90A"], [54.8142259167, 82.3862871667, "26"], [54.8142241, 82.3891889667, "43"], [54.8355967167, 82.4144058667, "382"], [54.8263508333, 82.4048937333, "251"], [54.8237985833, 82.3972016667, "173"], [54.82187925, 82.3941376333, "137"], [54.8159891667, 82.3862058833, "42"], [54.8233059333, 82.3950369833, "156"], [54.8224871333, 82.3939314167, "148"], [54.8194135833, 82.3914179833, "100"], [54.8149244, 82.38763835, "41"], [54.8192395667, 82.3919598167, "103"], [54.8202387167, 82.3879586, "90D"], [54.81610515, 82.3888637333, "59"], [54.8282481667, 82.4077297, "290"], [54.81714775, 82.3892465833, "68"], [54.8196078, 82.3887699667, "90"], [54.817284, 82.39001715, "77"], [54.81837465, 82.39045065, "86"], [54.8277749, 82.4071191667, "272"], [54.8265916333, 82.4056707167, "251A"], [54.8128841167, 82.3855143833, "11"], [54.8291297, 82.4098336167, "313"], [54.8329969667, 82.4126325333, "358"], [54.8322266, 82.4129321167, "347"], [54.8348266833, 82.4139054, "372"], [54.9099726167, 82.4757886667, "71"], [54.9101903333, 82.4760631833, "73"], [54.9152217167, 82.47371395, "131"], [54.9059390167, 82.47854405, "32"], [54.9097995667, 82.4753924833, "71B"], [54.9044269833, 82.4792423333, "12"], [54.9084252667, 82.4764496833, "49"], [54.9086711167, 82.4772269833, "52"], [54.9116987, 82.4759278667, "92"], [54.9098638167, 82.47581795, "69"], [54.9117964333, 82.4757621167, "94"], [54.90989485, 82.47559865, "71A"], [54.9073590833, 82.4778494167, "40A"], [54.91330765, 82.47552755, "108"], [54.9057401833, 82.4781938167, "25"], [54.911296, 82.4748848167, "89"], [54.9121108667, 82.4758530667, "98A"], [54.9043787833, 82.4787889167, "13"], [54.9083076667, 82.4766785667, "47A"], [54.9036909333, 82.4791402667, "3"], [54.91220345, 82.4755294, "100"], [54.9053728833, 82.4783509333, "1/23"], [54.90519915, 82.4784179, "21"], [54.9052690667, 82.4783896667, "21A"], [54.9114245, 82.4759148333, "88"], [54.9081505833, 82.4774655, "46"], [54.9142982833, 82.4745833, "120"], [54.9131166, 82.4751412333, "106"], [54.9083510667, 82.47694365, "47"], [54.9065192667, 82.4778253667, "31"], [54.9083240333, 82.47739375, "48"], [54.9149526833, 82.4742867833, "126"], [54.9103091667, 82.476032, "75"], [54.9118749833, 82.4749764833, "101A"], [54.9042161667, 82.4788623333, "11"], [54.9129278167, 82.4752157333, "104"], [54.9121256667, 82.4751926333, "103"], [54.9112547, 82.4755432667, "85"], [54.9142550667, 82.4741810667, "121"], [54.9106238667, 82.4759059667, "77A"], [54.9104479, 82.4759570167, "77"], [54.9114070667, 82.4754850833, "87"], [54.9113298833, 82.47516835, "87A"], [54.9148737833, 82.4738503833, "127"], [54.9112868667, 82.4759815833, "86"], [54.9111339667, 82.4760538, "82"], [54.91156375, 82.4758556833, "90"], [54.9151142, 82.4742192667, "128"], [54.9151403167, 82.4737436, "129"], [54.915375, 82.4740628167, "130"], [54.9144834167, 82.4745128333, "122"], [54.9144913, 82.4737651167, "123A"], [54.9144983167, 82.4740186167, "123"], [54.9146270167, 82.4744201833, "124"], [54.9126748, 82.4749461833, "105"], [54.9128134833, 82.4748703333, "107"], [54.9129492333, 82.4747718167, "109"], [54.9131005833, 82.4746998, "111"], [54.9132571833, 82.4746269833, "113"], [54.9135018833, 82.4749717, "114"], [54.91340395, 82.4745515, "115"], [54.9136698, 82.4748826167, "116"], [54.91356065, 82.4744797, "117"], [54.91379245, 82.4748357, "118"], [54.9136715833, 82.4744300167, "119"], [54.9085906833, 82.4768593, "53"], [54.9089448167, 82.47752235, "54A"], [54.9088353, 82.4771584333, "54"], [54.9087287167, 82.4767663333, "55"], [54.9090036667, 82.4770825167, "56"], [54.9065108833, 82.4773228833, "33"], [54.90671225, 82.4781606833, "34"], [54.90673975, 82.4777032, "35"], [54.9068835, 82.4780653833, "36"], [54.9067380833, 82.4772301167, "37"], [54.9070569167, 82.47798485, "38"], [54.9070025333, 82.4775753333, "39"], [54.90721945, 82.47790165, "40"], [54.9072522667, 82.4774842833, "41"], [54.9073576167, 82.47744775, "43"], [54.9055054167, 82.4782415167, "23"], [54.9146826833, 82.4739228, "125"], [54.9048823167, 82.4785375333, "17"], [54.9120084333, 82.4756561667, "98"], [54.9086973167, 82.4775292833, "52A"], [54.90495545, 82.4780925667, "19A"], [54.9115964667, 82.4754098667, "91"], [54.9117456333, 82.4753338667, "93"], [54.9047131167, 82.47861435, "15"], [54.9166350333, 82.47304345, "141"], [54.9119624833, 82.4752623, "101"], [54.9039384833, 82.4785719, "9A"], [54.9040451, 82.4789520667, "9"], [54.9159567333, 82.4733394833, "133"], [54.9133416833, 82.4750525833, "112"], [54.9164713167, 82.4731105667, "139"], [54.9162964833, 82.4731911, "137"], [54.91611805, 82.4732665833, "135"], [54.9050444167, 82.4785102333, "19"], [54.9084974833, 82.47730975, "50"], [54.9168131667, 82.4729816333, "143"], [54.9088890667, 82.47665875, "51"], [54.9169769833, 82.47291525, "145"], [54.91109855, 82.4756779833, "83"], [54.9036883833, 82.47891485, "5"], [54.9038746333, 82.4790332667, "7"], [54.9098547333, 82.4762237333, "67"], [54.9134471167, 82.47558925, "110"], [54.9091846167, 82.4769739333, "58"], [54.9041253333, 82.47834505, "67"], [54.9031156667, 82.47324245, "30"], [54.9039179333, 82.4771832667, "57"], [54.9027583833, 82.4732321833, "31"], [54.9039296333, 82.4759913167, "1/48-5/48"], [54.9031900333, 82.4735082833, "32"], [54.9034018667, 82.4743276167, "36"], [54.9023766833, 82.47196845, "7"], [54.9032458833, 82.47560575, "49A"], [54.9020863667, 82.4722218833, "9"], [54.9043371833, 82.4768388333, "56B"], [54.902459, 82.47222945, "15"], [54.9037351, 82.47533715, "44"], [54.9034826333, 82.4756647333, "51"], [54.9036591, 82.47507465, "42"], [54.90418945, 82.4769539167, "56"], [54.9032979333, 82.4750164, "45"], [54.9034232167, 82.47544545, "49"], [54.9033578, 82.4752311833, "47"], [54.9038201667, 82.4756474167, "46"], [54.9022973167, 82.4729606, "25"], [54.90414875, 82.4768183, "52"], [54.90349885, 82.4745345833, "38"], [54.9026894, 82.4730117167, "29"], [54.9021493667, 82.47246275, "17"], [54.9026062167, 82.47272955, "23"], [54.9025311667, 82.4725057, "21"], [54.9030380667, 82.47297935, "28"], [54.9024547167, 82.4734671, "33"], [54.9025374333, 82.4713386333, "2"], [54.9032365, 82.4747976667, "43"], [54.903545, 82.4758786333, "53"], [54.9036348667, 82.47615225, "55"], [54.9040838167, 82.4777189667, "61"], [54.9044308, 82.4778047833, "62A"], [54.9045770833, 82.4776408667, "62"], [54.9041435833, 82.4779421667, "63"], [54.9045395167, 82.4780827833, "64"], [54.9042280667, 82.4782127, "65"], [54.9046025833, 82.4783325333, "66"], [54.9027241, 82.4719824833, "6"], [54.9031429167, 82.4744526833, "41"], [54.90234395, 82.4730909833, "27"], [54.9035807667, 82.474814, "40"], [54.9024965667, 82.4735884667, "35"], [54.9028375333, 82.4735153, "37"], [54.90263765, 82.4716923333, "4"], [54.9021975, 82.47257235, "19"], [54.9043748667, 82.4775318, "60"], [54.90399325, 82.4774612167, "59"], [54.9042882333, 82.4772585333, "58"], [54.8844172167, 82.4672121, "84"], [54.88526725, 82.4677498167, "89"], [54.88475025, 82.4713889167, "129A"], [54.8850106, 82.4704196167, "119B"], [54.8848693167, 82.4653303833, "67A"], [54.8849946167, 82.47052095, "119A"], [54.8853588667, 82.4594981667, "21A"], [54.8840973667, 82.4733293833, "140"], [54.88468505, 82.4712750833, "127B"], [54.8848600667, 82.47296205, "141"], [54.8846001333, 82.4600292833, "26A"], [54.8836016167, 82.4733639667, "142"], [54.8834011333, 82.4735009333, "144A"], [54.8836620833, 82.4735234, "144"], [54.8836292333, 82.4677762333, "92A"], [54.8848011, 82.4732428833, "145"], [54.8848537, 82.4655050667, "67B"], [54.8840610333, 82.4737371333, "146"], [54.884338, 82.4684939, "106"], [54.8844335167, 82.4733986333, "147"], [54.88444615, 82.4731180167, "1/143"], [54.8840384, 82.4739760167, "148"], [54.8846361, 82.4730721, "2/143"], [54.8847583667, 82.4735201333, "149"], [54.8847493833, 82.4736688167, "151"], [54.8846399333, 82.4737421667, "153A"], [54.8844193833, 82.4737101333, "153"], [54.8844016, 82.4739577167, "155"], [54.8846051, 82.4703118167, "117"], [54.8842630167, 82.4702309167, "118"], [54.8845899833, 82.4706008833, "119"], [54.8839889, 82.4702975, "120"], [54.8845767833, 82.4708850333, "121"], [54.8848939667, 82.471153, "125"], [54.8845648, 82.4711997833, "127A"], [54.8845397333, 82.4714559833, "129"], [54.8845394, 82.4715708167, "131"], [54.88370185, 82.4681742833, "100A"], [54.8839465, 82.4681139833, "100"], [54.8839286333, 82.4682708, "102"], [54.8847414667, 82.4683697167, "101"], [54.8843311333, 82.4683495167, "104"], [54.8850005167, 82.468632, "105"], [54.8847132167, 82.4687043167, "107"], [54.88432375, 82.4686693, "108A"], [54.8841027333, 82.4686521333, "108B"], [54.8837668333, 82.4686217667, "108C"], [54.8843156167, 82.4690232667, "110"], [54.8844019333, 82.4676185833, "88"], [54.8839683, 82.4676575, "90"], [54.8839636333, 82.4677862833, "92"], [54.8847523333, 82.4678389667, "93"], [54.8843878667, 82.4678844833, "94"], [54.8843912, 82.46807835, "96"], [54.88488445, 82.4681411333, "97A"], [54.8847461167, 82.4681295167, "97"], [54.8850594333, 82.46849965, "103"], [54.88521615, 82.46866015, "105A"], [54.8852093833, 82.4680692333, "95B"], [54.8844562, 82.4666664667, "82"], [54.8844693167, 82.4664959833, "80"], [54.8850079167, 82.4663639833, "77"], [54.8850347667, 82.4662661667, "75A"], [54.8845094, 82.46511225, "70"], [54.8848360833, 82.46580235, "71"], [54.8845048333, 82.4652718333, "72"], [54.88484705, 82.4659848667, "73"], [54.8846077667, 82.4632926667, "56"], [54.8849583, 82.4636067667, "57"], [54.8849358667, 82.46389605, "59"], [54.8846143167, 82.4635059, "60"], [54.8849265833, 82.4640693333, "61"], [54.88458485, 82.4638039167, "62"], [54.8846887167, 82.4620028833, "40"], [54.8846763667, 82.4622161, "42"], [54.88439555, 82.46253885, "50A"], [54.8843140667, 82.4625245333, "50B"], [54.8846659833, 82.4626401167, "50"], [54.8843395, 82.4756649667, "165"], [54.8843288167, 82.4758768167, "167"], [54.8847458167, 82.4759882, "169"], [54.8839907333, 82.4754077667, "154"], [54.8832283833, 82.4761336167, "158A"], [54.8834749667, 82.4760305, "158"], [54.8839257333, 82.4761204333, "160"], [54.8839105, 82.4763266167, "162"], [54.8839068667, 82.4765393833, "164"], [54.8839006667, 82.4766556333, "166A"], [54.8838300333, 82.4766482833, "166B"], [54.8837648667, 82.4766430667, "166C"], [54.88370985, 82.4766495333, "166D"], [54.88450305, 82.4759053833, "167A"], [54.8843063833, 82.47627465, "173"], [54.88481905, 82.4593686833, "20"], [54.8848109, 82.4595419, "22"], [54.8847686333, 82.4602303333, "28"], [54.8847849, 82.4600010333, "26"], [54.8847695, 82.4604640833, "30"], [54.8847524167, 82.4606697667, "32A"], [54.8846032167, 82.4607054667, "32"], [54.8847437, 82.4609159, "34"], [54.8847367167, 82.4610480333, "36"], [54.8846226, 82.4597085, "24A"], [54.88480055, 82.4597682833, "24"], [54.8849988, 82.45680165, "4"], [54.88498305, 82.4570515667, "6"], [54.8852893167, 82.45737525, "9A"], [54.8856279667, 82.4573165333, "9"], [54.8852346167, 82.4583441167, "17"], [54.8846999, 82.46184155, "38"], [54.8842668333, 82.4699965667, "116"], [54.8849434, 82.4633167, "55"], [54.8849201333, 82.4582107833, "14"], [54.8841963333, 82.4680842833, "98"], [54.8850626333, 82.4680435333, "95A"], [54.8849265167, 82.4579232, "12"], [54.8849416333, 82.4576479667, "10"], [54.88464885, 82.4628154667, "52"], [54.88495495, 82.4630154, "53"], [54.8841566, 82.46306945, "54C"], [54.8843828833, 82.4631118167, "54B"], [54.8846277833, 82.4630559167, "54A"], [54.8852737333, 82.4576375667, "11"], [54.8849684, 82.4572897333, "8"], [54.8842156, 82.4664696, "80A"], [54.8852629167, 82.4609307833, "31A"], [54.88407215, 82.4664618, "80B"], [54.8853292833, 82.4658178167, "69D"], [54.8845638833, 82.4761256667, "171A"], [54.8843256167, 82.4761031333, "171"], [54.88461985, 82.4700835333, "115"], [54.8852249667, 82.4591643, "19"], [54.8850024667, 82.4655843667, "69A"], [54.8853347667, 82.4565859833, "3"], [54.8849291167, 82.4710324667, "123"], [54.8850487333, 82.46776055, "91"], [54.88518005, 82.4657751833, "69B"], [54.8847597, 82.4703240833, "117A"], [54.8838148667, 82.4733438, "140A"], [54.8852627, 82.4581414167, "15"], [54.8852686333, 82.4578723833, "13"], [54.8843833333, 82.4628765333, "52A"], [54.8846312667, 82.47258135, "135A"], [54.8841268, 82.4727441333, "134"], [54.8841223833, 82.4729087, "136"], [54.8844595167, 82.4725233833, "135"], [54.8844608, 82.4728356, "139"], [54.88411085, 82.4730945167, "138"], [54.8844061, 82.4674269333, "86"], [54.8846697, 82.4623996833, "44"], [54.8843516833, 82.4624326667, "46"], [54.8845218833, 82.4609426833, "34A"], [54.8845623833, 82.4649360333, "68"], [54.8852556667, 82.46580475, "69C"], [54.8853163833, 82.4638318667, "57A"], [54.8841402833, 82.4725588333, "132"], [54.8845058, 82.46627115, "78"], [54.88520865, 82.4594427, "21"], [54.88518675, 82.4597238, "23"], [54.88516405, 82.4602253833, "27A"], [54.8851860333, 82.4600092, "25"], [54.8851601667, 82.4603894167, "27B"], [54.8851518333, 82.4606064167, "29"], [54.8851348833, 82.4608605667, "31"], [54.8850809, 82.4610533333, "33"], [54.8856552, 82.4571406667, "7A"], [54.8853045167, 82.4571108167, "7"], [54.88540295, 82.4658220667, "69E"], [54.8853268167, 82.459619, "23A"], [54.8836866, 82.4760956667, "160A"], [54.8847632333, 82.4673442, "83"], [54.8847711333, 82.4675412167, "85"], [54.8848386167, 82.4661800667, "75"], [54.8845198, 82.4660549333, "76"], [54.8848257667, 82.46637395, "79"], [54.88481345, 82.4665570333, "81"], [54.8850432333, 82.4640734333, "61A"], [54.8854814333, 82.46382035, "57B"], [54.8853202, 82.45681275, "5"], [54.88467615, 82.4756712, "165A"], [54.8843590833, 82.4753791667, "163"], [54.8854775, 82.4568292667, "5A"], [54.8846230833, 82.4699498, "113"], [54.8840125667, 82.47500995, "150"], [54.8840018667, 82.4752078667, "152"], [54.8846837667, 82.4753169, "163A"], [54.8843619333, 82.4750396667, "161"], [54.8840304667, 82.4794188333, "2A"], [54.8807723833, 82.4785762167, "38"], [54.8832733667, 82.4785025167, "14"], [54.8805087833, 82.4795802, "39"], [54.8825106167, 82.4792898667, "22"], [54.8807048667, 82.4788063333, "40"], [54.88040735, 82.47993645, "41"], [54.8802707, 82.4795716333, "43"], [54.8806401833, 82.4791473833, "46"], [54.8805187667, 82.4791179667, "48"], [54.8803874167, 82.47910085, "52A"], [54.8832278833, 82.4793638667, "16"], [54.8830907167, 82.4793476833, "18"], [54.8821391833, 82.4796965667, "27"], [54.8822759, 82.4797246333, "25"], [54.88156645, 82.4792199667, "26"], [54.88154905, 82.4796941667, "29"], [54.8814046333, 82.4791842167, "28"], [54.8841534, 82.4798770333, "1"], [54.88124075, 82.47917795, "30"], [54.8811993833, 82.4787023, "32"], [54.8809580167, 82.4791391833, "34"], [54.8809750667, 82.4788466833, "34A"], [54.8835383667, 82.4798388, "9"], [54.8831311167, 82.4801495667, "15"], [54.88322745, 82.47980485, "13"], [54.8806638833, 82.4795858667, "37"], [54.88084555, 82.4786213833, "36"], [54.88399585, 82.4798779833, "3"], [54.8839041667, 82.4794138833, "2"], [54.8837673333, 82.4794031833, "4"], [54.8837132667, 82.4798593833, "7"], [54.8808555833, 82.47961625, "35"], [54.8835850167, 82.47938365, "8"], [54.8838495167, 82.4798612, "5"], [54.8837031833, 82.4801284167, "7A"], [54.8836938167, 82.47892395, "6"], [54.8833948833, 82.4788199167, "12"], [54.8832576167, 82.4787911, "14A"], [54.8834012333, 82.4798226333, "11"], [54.8834290167, 82.4793790167, "10"], [54.9152153667, 82.5551235833, "3/5"], [54.91650135, 82.5636650667, "82"], [54.9161045333, 82.5591854333, "41"], [54.9154124667, 82.5548626, "2/5"], [54.9166862333, 82.55784235, "32"], [54.91602365, 82.5560715, "21"], [54.91628925, 82.5653876833, "94"], [54.9160243833, 82.55493095, "1/5"], [54.9158285, 82.5660481167, "109"], [54.91440645, 82.5544777167, "9"], [54.9154713667, 82.56556335, "105"], [54.9123841333, 82.5769109, "1/239"], [54.9138841833, 82.5671444, "127"], [54.916035, 82.5569371167, "25"], [54.91497065, 82.5671545333, "1/114"], [54.9146378167, 82.5673035, "2/114"], [54.9176808667, 82.5727210167, "192"], [54.91296825, 82.57312245, "1/192"], [54.9165331, 82.56259155, "70"], [54.9128700167, 82.5676242167, "135"], [54.9127302333, 82.5677905167, "137"], [54.9138889, 82.57603805, "212"], [54.8834204167, 82.4653173333, "2/67"], [54.8829550167, 82.4680045, "93A"], [54.8815600333, 82.4786609667, "164C"], [54.8830218167, 82.4623102, "41"], [54.8817898333, 82.47891525, "166A"], [54.8827127167, 82.46177765, "40"], [54.8822979167, 82.4663795167, "74A"], [54.8828493167, 82.4591475, "16"], [54.88142475, 82.4786348833, "164D"], [54.88306005, 82.4616891167, "37"], [54.8820609167, 82.4740814833, "122"], [54.8826992167, 82.4619383167, "42"], [54.8821519667, 82.4815448333, "209A"], [54.883041, 82.4620756167, "39"], [54.8832654167, 82.4652926667, "1/67"], [54.88272565, 82.4616287, "38"], [54.8830076333, 82.4626069, "43"], [54.8831357, 82.4601246167, "27"], [54.8817307, 82.4761582, "146A"], [54.8831685833, 82.4596908, "25"], [54.8815906167, 82.4788964667, "166B"], [54.88278065, 82.4602865167, "26"], [54.8835589833, 82.4653321833, "3/67"], [54.8825282667, 82.4646378, "60"], [54.8813641333, 82.4755528333, "136A"], [54.8823392167, 82.4748610333, "155"], [54.8833277833, 82.46261325, "43A"], [54.8815676833, 82.4731547, "114B"], [54.8819471167, 82.4816728, "211"], [54.8829108333, 82.4730159, "139"], [54.8831197, 82.4654452, "69A"], [54.8827723, 82.4605280167, "28"], [54.8829114, 82.4647714833, "59"], [54.88250115, 82.4649823, "64"], [54.8829076, 82.46497065, "61"], [54.88293875, 82.4727218, "135"], [54.8824690167, 82.4726854833, "133"], [54.88310945, 82.4604659833, "31"], [54.8831059, 82.4608415833, "35"], [54.8827654333, 82.4607287333, "30"], [54.8831227667, 82.4602889167, "29"], [54.8825220833, 82.4621568833, "44A"], [54.88299765, 82.4628680167, "45"], [54.8832516833, 82.4628885167, "45A"], [54.8826944667, 82.46216875, "44"], [54.8825202167, 82.46254835, "48A"], [54.8833442667, 82.45699385, "5"], [54.8829708667, 82.4632570667, "51"], [54.8824811, 82.4725087833, "131"], [54.8829959833, 82.4630565833, "49"], [54.8826675833, 82.4625577, "48"], [54.88331805, 82.45745235, "9"], [54.8824531333, 82.47297485, "141"], [54.8827041833, 82.45734235, "8"], [54.8833336167, 82.4572248667, "7"], [54.8829612, 82.4728780167, "137"], [54.8823318333, 82.4686371167, "86"], [54.8824054833, 82.4672578333, "78"], [54.8823379667, 82.4683863333, "84A-84D"], [54.8823962167, 82.4674496167, "80"], [54.8824414833, 82.46633525, "74"], [54.8827537667, 82.4672953, "85"], [54.8822319333, 82.4661475333, "72"], [54.8824802, 82.4658691833, "70"], [54.8827660833, 82.4671242167, "83"], [54.8823372667, 82.47505315, "157"], [54.8826545167, 82.4751218167, "157A"], [54.8820193333, 82.4750065167, "128"], [54.8818626167, 82.4777718333, "152"], [54.8819736, 82.47592125, "140"], [54.8819698, 82.4757241667, "138"], [54.8823149, 82.4754510833, "165"], [54.8823264833, 82.4752907833, "163"], [54.8827581167, 82.4752805833, "161"], [54.8829257833, 82.4751779333, "159"], [54.8822762, 82.4760006333, "167"], [54.8821834, 82.4777217333, "177"], [54.8822236833, 82.4803508667, "199"], [54.8815487833, 82.4799515, "172A"], [54.8821390333, 82.4785808167, "185"], [54.8821657167, 82.4779489667, "179"], [54.8821615, 82.47814015, "181"], [54.8821482167, 82.4783480833, "183"], [54.88205545, 82.4801785, "197"], [54.8817139833, 82.48044315, "176"], [54.8817403667, 82.4799308667, "172"], [54.8817075, 82.4806324333, "176A"], [54.8816647167, 82.4814856333, "184"], [54.8817027333, 82.4808254167, "178"], [54.8816651167, 82.48128865, "182"], [54.8816775833, 82.4810764167, "180"], [54.8821253667, 82.4788135833, "187"], [54.88211265, 82.4790205167, "189"], [54.88210465, 82.4792012833, "191"], [54.8820355, 82.4804062667, "201"], [54.88222755, 82.4806704167, "203A"], [54.8820247167, 82.4806337333, "203"], [54.8821983833, 82.4809817, "205A"], [54.8820063, 82.4808974, "205"], [54.8819872, 82.4811870167, "207"], [54.88197265, 82.4814592667, "209"], [54.8831150167, 82.4606360833, "33"], [54.8827381667, 82.4614688333, "36"], [54.88168275, 82.4731685667, "114A"], [54.8825469333, 82.4624433, "46A"], [54.8827017167, 82.4623766, "46"], [54.8828950667, 82.4652071, "65"], [54.88223365, 82.4708144, "98"], [54.8826632333, 82.46886835, "99"], [54.88294545, 82.4574472333, "10"], [54.8820008, 82.47545635, "132"], [54.8815931167, 82.4754940333, "134"], [54.8815807333, 82.4756172833, "136"], [54.8820043167, 82.4752607833, "130"], [54.88218895, 82.4774782333, "82"], [54.88172165, 82.4801884, "174"], [54.8830567667, 82.4618380833, "37A"], [54.88330235, 82.4576792167, "11"], [54.8818654333, 82.4775383667, "150"], [54.8826391333, 82.4630505, "50C"], [54.8826306167, 82.4631781333, "50D"], [54.8822323333, 82.46476475, "62"], [54.8818249833, 82.4749363833, "128A"], [54.8826051333, 82.4701299167, "109"], [54.8822580667, 82.47622145, "169"], [54.8821165333, 82.4729660833, "112"], [54.8826087833, 82.4699331333, "107"], [54.8819629, 82.4761853, "146"], [54.882082833, 82.4748403667, "126"], [54.8825933333, 82.4704919167, "113"], [54.8825976, 82.4703054667, "111"], [54.8815316833, 82.4759537667, "142"], [54.8815485667, 82.4760951167, "144"], [54.8826667167, 82.4685696833, "97A"], [54.8823006, 82.4698174167, "90"], [54.8822800167, 82.4702989667, "96"], [54.8819513333, 82.47633525, "148"], [54.8828277833, 82.4687268667, "97"], [54.8822974333, 82.469983, "92"], [54.8828276667, 82.4593929667, "18"], [54.8823263167, 82.4688898, "88"], [54.8832137, 82.4589384833, "17"], [54.8822883667, 82.4701519667, "94"], [54.8826732, 82.4684589667, "97B"], [54.8822189833, 82.47111545, "100"], [54.8820588, 82.4799191833, "195"], [54.8817857167, 82.4791120667, "168"], [54.8815184167, 82.4779607667, "156"], [54.8831976333, 82.4593128167, "21"], [54.8823417833, 82.4681742167, "82"], [54.8827111, 82.4679744667, "93"], [54.8832019667, 82.4591213833, "19"], [54.8815556333, 82.4802543833, "174A"], [54.88215085, 82.4723449167, "108"], [54.8815176167, 82.4778254833, "154"], [54.8820986333, 82.4731788833, "114"], [54.8820722833, 82.47386775, "120"], [54.8821363667, 82.4725972667, "110"], [54.8818740833, 82.47394495, "120A"], [54.8820951167, 82.4734228167, "116"], [54.88208125, 82.4736554333, "118"], [54.8816796667, 82.4786736667, "164B"], [54.88313585, 82.4678512667, "91"], [54.8824046833, 82.4740707, "153"], [54.8829457667, 82.45767015, "12A"], [54.8825498667, 82.45756275, "12"], [54.8832922167, 82.4578983333, "13"], [54.8829356167, 82.4578815, "14"], [54.8832731833, 82.4580626167, "15"], [54.8833720833, 82.4564383833, "1"], [54.8833604167, 82.4567315167, "3"], [54.8828452833, 82.4659509, "75"], [54.88283615, 82.4661431333, "77"], [54.8828280833, 82.4662871833, "79"], [54.8831762333, 82.4650671667, "63A"], [54.8832807333, 82.4650862667, "63B"], [54.8828784, 82.4654325333, "69"], [54.88286845, 82.4656069833, "71"], [54.8828541167, 82.4657729833, "73"], [54.88225265, 82.4763298333, "171"], [54.88244025, 82.4731903833, "143"], [54.88277745, 82.4714596167, "123A"], [54.8825218833, 82.4714168, "123"], [54.8826166167, 82.4697419333, "105"], [54.88317465, 82.4595099667, "23"], [54.88146045, 82.47846145, "162"], [54.8818026833, 82.47869275, "164A"], [54.8825380333, 82.47125165, "121"], [54.8821686667, 82.4812678167, "207A"], [54.8825423167, 82.47107055, "119"], [54.8818212833, 82.4783825, "160"], [54.8825595667, 82.4708636, "117"], [54.8822055167, 82.4713504167, "104"], [54.8821969167, 82.4715105167, "106"], [54.88270855, 82.4681556333, "95"], [54.8818339, 82.4781130167, "158"], [54.88248225, 82.4723453, "129"], [54.8825806, 82.4706828667, "115"], [54.8824171833, 82.47368635, "149"], [54.8830100833, 82.4662410333, "77A"], [54.88294835, 82.4681855, "95A"], [54.8824262667, 82.4734592, "147"], [54.88256465, 82.4739109667, "151A"], [54.88265405, 82.4627631667, "50A"], [54.88273475, 82.4676983, "89"], [54.8826450667, 82.4629121333, "50B"], [54.8827506167, 82.4674962833, "87"], [54.8824087, 82.4738996167, "151"], [54.8752754167, 82.4687945, "5"], [54.8762403, 82.4685664667, "17"], [54.8754141333, 82.46920485, "7"], [54.87579005, 82.4687529833, "11B"], [54.8756581167, 82.4691656167, "9"], [54.8765213333, 82.4682912, "19D"], [54.8756935167, 82.46956425, "10"], [54.87642715, 82.46787445, "19B"], [54.8755152333, 82.4695951833, "8"], [54.8764289167, 82.46891995, "20"], [54.8753332833, 82.4696019833, "6"], [54.8751625833, 82.4692038167, "3"], [54.8751427, 82.4696164667, "4"], [54.8764386833, 82.46867495, "21"], [54.87496015, 82.4696499, "2"], [54.8756744167, 82.4688181667, "11A"], [54.8749777333, 82.4692451667, "1"], [54.8763775667, 82.4681980333, "19A"], [54.87626605, 82.46911145, "16"], [54.8765451333, 82.4678920167, "19C"], [54.87614825, 82.4692725667, "14"], [54.87655055, 82.4693377, "18"], [54.8760211, 82.4693800167, "12"], [54.87610675, 82.46867635, "15"], [54.8759566833, 82.4689563167, "13"], [54.8746548333, 82.4923337833, "108"], [54.8761834667, 82.4925171833, "86"], [54.8786149333, 82.4916796167, "61"], [54.8767351, 82.4913667333, "83"], [54.8802232333, 82.49233165, "48"], [54.8775048833, 82.4913709, "75"], [54.8754266, 82.4923112333, "98"], [54.8778063333, 82.4924615667, "72"], [54.8803238667, 82.49186235, "45"], [54.8723323333, 82.49117315, "131"], [54.8718419, 82.4924310167, "138"], [54.8711135, 82.4946030167, "148"], [54.8697698833, 82.4923552333, "166"], [54.8688831, 82.4922950167, "176"], [54.8789681333, 82.4925074, "58"], [54.8820738333, 82.4926333167, "30"], [54.8812172, 82.49178955, "37"], [54.88069745, 82.4925708333, "42"], [54.8787213167, 82.4903820667, "63"], [54.8789726667, 82.4909397833, "59"], [54.8796000667, 82.498281167, "53"], [54.8795261833, 82.49247645, "54"], [54.8736368167, 82.4923986833, "124"], [54.8727232333, 82.4924140333, "126"], [54.87437165, 82.4674392167, "27"], [54.8746732167, 82.4701863, "7"], [54.8744574833, 82.4691624667, "17"], [54.8743822167, 82.47024785, "9A"], [54.8749997667, 82.4700487, "12"], [54.8743498667, 82.4700893333, "9B"], [54.8752501333, 82.4707564333, "4"], [54.8746036167, 82.46989845, "11"], [54.8744127333, 82.4663752333, "33"], [54.87455375, 82.4696726333, "13"], [54.87442195, 82.4683011333, "21"], [54.87475005, 82.4704344167, "5"], [54.8747738, 82.4664531833, "32"], [54.8747376833, 82.4677991, "24"], [54.8748038833, 82.4662112833, "34"], [54.8743485, 82.4672374833, "29"], [54.87475315, 82.4683317, "22"], [54.8747034167, 82.4672897833, "28"], [54.8751725667, 82.4705402833, "6"], [54.8743703, 82.46656865, "31"], [54.8747061667, 82.4675099333, "26"], [54.8749663833, 82.4711516, "1"], [54.8750729167, 82.4702726833, "10"], [54.8747800333, 82.4687326833, "20"], [54.8747974333, 82.468992, "18"], [54.87484445, 82.4707471667, "3"], [54.8754537333, 82.47035305, "8A"], [54.8753716, 82.4710875, "2"], [54.8749196, 82.4697604667, "14"], [54.8744452, 82.4661277667, "35"], [54.8744961833, 82.46941455, "15"], [54.8747449667, 82.4666386167, "30"], [54.87482605, 82.4692223833, "16"], [54.8754105667, 82.4702048167, "8B"], [54.8743849167, 82.4676931, "25"], [54.8744337, 82.4689042667, "19"], [54.8743984167, 82.4679389167, "23"], [54.8778069667, 82.4712312167, "25"], [54.8763120333, 82.4717215833, "44"], [54.87672545, 82.4712506833, "41"], [54.8772550667, 82.471782167, "32"], [54.8668511333, 82.4718110667, "166"], [54.8767613667, 82.4717327167, "40"], [54.8733181333, 82.47092935, "81"], [54.86564525, 82.47179185, "172"], [54.866566, 82.47182225, "170"], [54.8709313833, 82.472052, "102"], [54.8773583833, 82.4709902333, "33A"], [54.8718238, 82.4719052833, "100"], [54.8636636, 82.4713474333, "185"], [54.8639432, 82.4718744833, "180"], [54.87639895, 82.4712276333, "43"], [54.86320725, 82.47180795, "190"], [54.87736335, 82.4707706667, "33B"], [54.8635744667, 82.4721996167, "1/186"], [54.8770291667, 82.4712897833, "37"], [54.8744578833, 82.4712959833, "63"], [54.87760745, 82.4717249167, "30"], [54.8748192, 82.47130365, "59"], [54.8647013333, 82.4717920833, "174"], [54.8754668167, 82.4712709333, "55"], [54.8748770833, 82.478243167, "62"], [54.863631, 82.4717906, "186"], [54.8759205833, 82.4712616667, "51"], [54.86283285, 82.4713374833, "195"], [54.8773474667, 82.4713414333, "35"], [54.87610145, 82.4712462667, "47"], [54.8736575, 82.4709245667, "75"], [54.8743432333, 82.4718551833, "66"], [54.86451155, 82.47179665, "176"], [54.8735859667, 82.4719257333, "74"], [54.8734058167, 82.47132365, "79"], [54.8742359, 82.4712991333, "67"], [54.87358325, 82.4713242167, "77"], [54.87305765, 82.4719396833, "82"], [54.8727949333, 82.4719115167, "86"], [54.8722028667, 82.4741686, "90"], [54.8675567167, 82.4711739833, "137"], [54.8725890333, 82.46970215, "2/95"], [54.8726248333, 82.4710150833, "1/95"], [54.8702623, 82.4720475333, "116"], [54.8780759667, 82.4717211333, "24"], [54.8738727167, 82.4713038, "73"], [54.8739672333, 82.4710486167, "71"], [54.8935260167, 82.4748064, "10"], [54.89273555, 82.4747373, "16"], [54.8919345833, 82.4746388833, "24"], [54.89328595, 82.4747852667, "12"], [54.8938477333, 82.47430505, "8A"], [54.8936160833, 82.47481635, "8"], [54.8920694833, 82.4757293833, "23A"], [54.89206575, 82.4752388667, "23"], [54.8923724, 82.4746924667, "18"], [54.89353315, 82.47444375, "10A"], [54.8899805167, 82.4750166667, "41"], [54.89167325, 82.4757043333, "27A"], [54.89028415, 82.47505045, "39"], [54.892463, 82.47526755, "17"], [54.8918398667, 82.4752066, "25"], [54.8908128167, 82.4750707333, "33"], [54.8904636333, 82.4750504333, "37"], [54.8906359833, 82.47507655, "35"], [54.8916253, 82.47516515, "27"], [54.8909492333, 82.47507265, "31"], [54.8905761667, 82.4744542167, "1/30-5/30"], [54.8881462333, 82.4754198167, "57"], [54.88850555, 82.47524575, "53"], [54.8894041667, 82.47498115, "45"], [54.9014205, 82.4676039667, "9"], [54.905282667, 82.4691138833, "53"], [54.90503895, 82.46905685, "51"], [54.90533595, 82.4686957333, "55"], [54.90163855, 82.46769255, "17"], [54.9033958, 82.4683840167, "35"], [54.9053689667, 82.46858075, "57"], [54.9012599667, 82.4679458667, "12"], [54.9014051333, 82.4680825, "14"], [54.9015679, 82.4680723333, "16"], [54.9031653, 82.4679986833, "31A"], [54.9007696333, 82.46734585, "1"], [54.9017356333, 82.4681344333, "18"], [54.9019312333, 82.46780625, "19"], [54.9019026, 82.4682113333, "20"], [54.9023515833, 82.4679880667, "23"], [54.9025247833, 82.4680511, "25"], [54.9019499, 82.46872425, "26"], [54.9027011167, 82.4680964167, "27"], [54.90322595, 82.4683034667, "33"], [54.9022090667, 82.46834225, "28"], [54.9028740333, 82.4681630167, "29"], [54.9009473167, 82.4678397833, "2"], [54.9030474, 82.46823325, "31"], [54.9024255333, 82.4684154833, "32"], [54.9024751, 82.4690537, "34A"], [54.9025607, 82.4684754, "34"], [54.9047760167, 82.4688679333, "49"], [54.9035690833, 82.46844705, "37"], [54.9032248, 82.4687414833, "38"], [54.9037398833, 82.4685398, "39"], [54.90425835, 82.4687235833, "45"], [54.9039185, 82.4686071, "41"], [54.9040853333, 82.4686607667, "43"], [54.9044377833, 82.46879205, "47"], [54.9027932167, 82.4685815833, "36"], [54.90099425, 82.46709335, "3"], [54.90111195, 82.4678951333, "4"], [54.9010127333, 82.4674434667, "5"], [54.9012417333, 82.4675368333, "7"], [54.9054492167, 82.4684984667, "59"], [54.9055391, 82.4685278333, "61"], [54.90550535, 82.46878055, "63"], [54.9054566667, 82.46921805, "65"], [54.90230745, 82.4676206667, "21A"], [54.9021682, 82.4679036667, "21"], [54.8808262333, 82.4773818, "55A"], [54.8830005833, 82.4767448167, "16"], [54.8828296667, 82.4767286, "18"], [54.88259875, 82.4772334333, "31"], [54.8824754, 82.47721195, "33"], [54.8831398167, 82.4779190333, "17"], [54.8825963167, 82.4777829, "29"], [54.8842646833, 82.4768462333, "2"], [54.8810851333, 82.476127, "36"], [54.8806964, 82.47760075, "57"], [54.8805952167, 82.4775984333, "59"], [54.8813687667, 82.4765958833, "32"], [54.8824115167, 82.4772049833, "35"], [54.8811797, 82.4765765833, "34"], [54.8815471667, 82.4766046333, "30"], [54.88417235, 82.4773933667, "3"], [54.88174695, 82.4772075667, "39"], [54.8809885833, 82.47654575, "38"], [54.8814635333, 82.4771838167, "43"], [54.8816058667, 82.4771958, "41"], [54.88064845, 82.4765253, "42"], [54.8808178333, 82.4765337333, "40"], [54.883982, 82.4773589667, "5"], [54.8834955667, 82.4767355667, "10"], [54.88350755, 82.4765409, "10A"], [54.8836987667, 82.47736385, "7"], [54.88321935, 82.4767625833, "12"], [54.8833260667, 82.4773372, "13"], [54.8830089, 82.4772931833, "19A"], [54.8831393167, 82.4773106833, "19"], [54.88264695, 82.47671705, "20"], [54.88292945, 82.4775952333, "21"], [54.8824614333, 82.4767002833, "22"], [54.8828817167, 82.4779039, "23"], [54.8823059167, 82.4766897833, "24"], [54.8827997667, 82.4772721833, "25A"], [54.8828034167, 82.4775536833, "25B"], [54.8827016667, 82.4777941, "27"], [54.8828062, 82.47779805, "27A"], [54.8817341833, 82.4766062333, "28"], [54.8813136167, 82.4771594167, "45"], [54.8811630667, 82.4771457, "47"], [54.8809942833, 82.4776755833, "51"], [54.8804464667, 82.4764969833, "44"], [54.8810737, 82.4776356667, "49"], [54.8809778333, 82.4774265, "53A"], [54.8810030333, 82.4771406667, "53"], [54.88079105, 82.47712645, "55"], [54.8835414333, 82.4773520667, "9"], [54.8805955667, 82.4771014667, "61"], [54.8804778167, 82.4770884667, "63"], [54.8802896833, 82.4770558, "65"], [54.8834467833, 82.4778119333, "11"], [54.8878083, 82.4623779167, "49A"], [54.8872817833, 82.45737585, "10"], [54.8877537333, 82.4595533, "27A"], [54.8884375167, 82.45748685, "11B"], [54.8878958, 82.4596416167, "27B"], [54.88824535, 82.45746395, "11A"], [54.8875099833, 82.4575973667, "14"], [54.8866716167, 82.4603215333, "36B"], [54.8871296333, 82.4604902833, "36C"], [54.8873681333, 82.4599526667, "30"], [54.8880297, 82.4601033833, "31A"], [54.8881606833, 82.4601333667, "31B"], [54.8869335833, 82.4608386833, "40A"], [54.8873096333, 82.4609038, "40"], [54.8878578167, 82.4576188333, "13"], [54.8871150667, 82.4574956333, "12"], [54.8878406333, 82.45785455, "15"], [54.8871478667, 82.4578061667, "16A"], [54.8869680833, 82.4578044667, "16B"], [54.8874965167, 82.4577967, "16"], [54.8872507333, 82.4580158333, "18A"], [54.88747815, 82.4580365167, "18"], [54.8880638833, 82.45810725, "19A"], [54.88784345, 82.4580772667, "19"], [54.8877572333, 82.45932705, "25"], [54.8879145667, 82.45669455, "1"], [54.8873702833, 82.4595467333, "26"], [54.8879238167, 82.4569262833, "1A"], [54.8874736, 82.4582577833, "20"], [54.8878260333, 82.4583038167, "21"], [54.8873656333, 82.4597425833, "28"], [54.8879435667, 82.4597720333, "29A"], [54.8881376167, 82.45977945, "29B"], [54.8883413667, 82.4597758333, "29C"], [54.8884945333, 82.45978905, "29D"], [54.8877360167, 82.45978725, "29"], [54.8871679167, 82.4598937333, "30A"], [54.8877368167, 82.45999715, "31"], [54.8873456, 82.4602082167, "32"], [54.8877073333, 82.4602192333, "33"], [54.88687805, 82.4602032667, "34A"], [54.8866636, 82.4602061833, "34B"], [54.8868802667, 82.4603641333, "36A"], [54.8877013333, 82.4604213, "35"], [54.8875414167, 82.4568279333, "2"], [54.8873298167, 82.4604643167, "36"], [54.8876929833, 82.4606236833, "37"], [54.8869503167, 82.4606911333, "38A"], [54.8873173833, 82.46064935, "38"], [54.8880788167, 82.46095015, "39A"], [54.8876923833, 82.4607943167, "39"], [54.88767155, 82.4610391833, "41"], [54.8876050833, 82.4618428, "43"], [54.8876116333, 82.4619894, "45"], [54.88820765, 82.4571291333, "3A"], [54.88840855, 82.4571648833, "3B"], [54.8875992833, 82.4621293167, "47"], [54.88757835, 82.4622876333, "49"], [54.8875702, 82.4625005667, "51"], [54.8875504, 82.46284035, "53"], [54.8875351833, 82.46302475, "55"], [54.88811905, 82.4635122, "57E"], [54.88825965, 82.46351715, "57F"], [54.8882625, 82.4633885, "57G"], [54.8882589333, 82.4632448167, "57H"], [54.8875218833, 82.4632180167, "57"], [54.8875030667, 82.4634566667, "59"], [54.8871363, 82.4643333667, "64"], [54.88744265, 82.4645542333, "65"], [54.8871286333, 82.4645791667, "66"], [54.8876065667, 82.4648085833, "67A"], [54.8874482, 82.4647992167, "67"], [54.88711895, 82.4648136, "68"], [54.8885710333, 82.4571354, "5A"], [54.8886647667, 82.4571676667, "5B"], [54.8874510667, 82.4649796333, "69A"], [54.8875224833, 82.4649906833, "69B"], [54.8878563833, 82.4571620833, "7A"], [54.8880328667, 82.4571656833, "7B"], [54.8875264167, 82.4573541, "8"], [54.88804485, 82.4574312167, "9B"], [54.8875345667, 82.4570015833, "6"], [54.8878647667, 82.45740435, "9A"], [54.8879745833, 82.4634900667, "57D"], [54.8878037333, 82.4633596833, "57B"], [54.8878387167, 82.4631928333, "57A"], [54.8878102333, 82.46349065, "57C"], [54.9019538167, 82.4671126833, "7A"], [54.903244, 82.4676256333, "14A"], [54.9020871667, 82.4668353167, "7"], [54.9027623667, 82.4671213167, "11"], [54.9025892667, 82.4670505333, "10"], [54.9024684667, 82.4672691667, "10A"], [54.90241945, 82.4669742667, "9"], [54.9029300667, 82.4671840333, "12"], [54.90311145, 82.4672579333, "13"], [54.9032782833, 82.4673314833, "14"], [54.9036218833, 82.4674643167, "16"], [54.9037919667, 82.46753785, "17"], [54.90344895, 82.4673941667, "15"], [54.9039705667, 82.4676045333, "18"], [54.9041435833, 82.467671, "19"], [54.9010125167, 82.4664210333, "1A"], [54.9007809667, 82.4663229167, "1"], [54.9043140333, 82.4677303167, "20"], [54.90448985, 82.46780755, "21"], [54.9046493333, 82.4670530667, "23"], [54.9048533833, 82.4675182833, "24"], [54.9012388167, 82.46653205, "2"], [54.9014534667, 82.46660645, "4"], [54.9017320167, 82.4669518333, "5"], [54.9018944667, 82.4667655333, "6"], [54.9022384667, 82.46689735, "8"], [54.90570045, 82.46976825, "72/91"], [54.9051381333, 82.4722857333, "96"], [54.9032204, 82.4703621333, "53"], [54.9053162167, 82.4723414, "98"], [54.9037962833, 82.4711215833, "5/91"], [54.9055880667, 82.4707876167, "108/91"], [54.9045404333, 82.4699855167, "46/91"], [54.9016813667, 82.4703439167, "17"], [54.9047542667, 82.4700433333, "48/91"], [54.9038862333, 82.4703755167, "31/91"], [54.9046661667, 82.4695472667, "56/91"], [54.9033795167, 82.4706831, "10/91"], [54.9049449167, 82.4696617167, "54/91"], [54.90342665, 82.4705010167, "26/91"], [54.9042283333, 82.4698824, "43/91"], [54.9034820167, 82.4702482, "27/91"], [54.9041029833, 82.471257, "3/91"], [54.9035045167, 82.47071685, "11/91"], [54.9034292833, 82.4709543667, "8/91"], [54.9035455167, 82.4705136333, "25/91"], [54.9044278, 82.4696974167, "52/91"], [54.9036199667, 82.4702949333, "28/91"], [54.9050604833, 82.4696742167, "53/91"], [54.9035777167, 82.4701138, "29/91"], [54.9047726833, 82.46981425, "49/91"], [54.9037153, 82.4701772333, "30/91"], [54.90366135, 82.4710693333, "6/91"], [54.9036912333, 82.4708029167, "12/91"], [54.9039544333, 82.4701398833, "39/91"], [54.90384865, 82.4708670667, "13/91"], [54.90441965, 82.4694715667, "58/91"], [54.9039537167, 82.4709042667, "14/91"], [54.9048014667, 82.46941845, "66/91"], [54.90397155, 82.4704078333, "32/91"], [54.9046743167, 82.4697731167, "50/91"], [54.9040982, 82.4709554167, "15/91"], [54.9049822333, 82.4694750833, "67/91"], [54.9042064833, 82.4709969, "16/91"], [54.9039450167, 82.4711861667, "4/91"], [54.9043704167, 82.47106545, "17/91"], [54.9045624167, 82.4693054333, "64/91"], [54.90449515, 82.4711117167, "18/91"], [54.9040047, 82.46996625, "40/91"], [54.9038797333, 82.4706635, "24/91"], [54.9035451833, 82.4710177667, "7/91"], [54.9039780833, 82.4707046333, "23/91"], [54.9045066833, 82.46972115, "51/91"], [54.9041615833, 82.4707864333, "22/91"], [54.9060640333, 82.4699358833, "91/91"], [54.9042534333, 82.47082315, "21/91"], [54.9047130333, 82.4693776833, "65/91"], [54.9044305, 82.47089635, "20/91"], [54.9043041167, 82.46989765, "44/91"], [54.9041919167, 82.4691500833, "61/91"], [54.9044746667, 82.46996645, "45/91"], [54.9042904667, 82.4691828667, "62/91"], [54.9040487167, 82.4697756833, "41/91"], [54.90415055, 82.4693699833, "60/91"], [54.90446065, 82.46926835, "63/91"], [54.9042810333, 82.46945405, "59/91"], [54.9032851, 82.4708958667, "9/91"], [54.90451895, 82.4709371333, "19/91"], [54.9045116833, 82.4694999333, "57/91"], [54.9040854167, 82.4704954667, "33/91"], [54.9043916, 82.4713621667, "1/91"], [54.9041970167, 82.4705370833, "34/91"], [54.9050893833, 82.46956665, "68/91"], [54.9043310833, 82.4706087333, "35/91"], [54.9040848, 82.4696433167, "42/91"], [54.90443305, 82.4706374667, "36/91"], [54.90476785, 82.4695885167, "55/91"], [54.9045282833, 82.4706701333, "37/91"], [54.9042286667, 82.471303, "2/91"], [54.90462665, 82.4707112667, "38/91"], [54.9046719667, 82.4700236667, "47/91"], [54.9063787833, 82.47006835, "93/91"], [54.9052918833, 82.4698329167, "76/91"], [54.9052114833, 82.4700221833, "77/91"], [54.9050883833, 82.4701973667, "79/91"], [54.9053839167, 82.4698613, "75/91"], [54.9052999333, 82.47006295, "78/91"], [54.9051933667, 82.47023875, "80/91"], [54.9052919167, 82.4702715333, "81/91"], [54.9055609, 82.4699386667, "74/91"], [54.9056495333, 82.4699711, "73/91"], [54.9054736, 82.4701402167, "82/91"], [54.9063660167, 82.4715132167, "102/91"], [54.9062675667, 82.4719148667, "118/91"], [54.9062345, 82.4720598833, "134/91"], [54.9061993167, 82.4712732833, "104/91"], [54.9061410333, 82.4715093, "117/91"], [54.90608265, 82.4717494667, "119/91"], [54.9060274833, 82.47199395, "133/91"], [54.9059191, 82.4719566333, "132/91"], [54.9059778667, 82.47169975, "120/91"], [54.90603625, 82.4714595667, "116/91"], [54.9061060667, 82.4711529667, "105/91"], [54.9053162667, 82.4716843, "137/91"], [54.9055131833, 82.478282167, "136/91"], [54.9055088, 82.471073, "112/91"], [54.9056170833, 82.4711144833, "113/91"], [54.9057647667, 82.4711699333, "114/91"], [54.9058762667, 82.4712157167, "115/91"], [54.9054861167, 82.4707589, "109/91"], [54.9055522167, 82.4701764667, "83/91"], [54.9057089833, 82.4702698167, "84/91"], [54.9058203833, 82.4703197833, "85/91"], [54.90590455, 82.4701097667, "89/91"], [54.9059963, 82.4701506667, "88/91"], [54.90573235, 82.4708471167, "107/91"], [54.9061820167, 82.4702237333, "87/91"], [54.9062864333, 82.4702866167, "86/91"], [54.9058177667, 82.47087525, "106/91"], [54.9064954833, 82.4701769667, "94/91"], [54.9065182667, 82.4703407, "95/91"], [54.90647405, 82.4705396167, "96/91"], [54.906434, 82.4707011, "97/91"], [54.9064003667, 82.47087115, "98/91"], [54.9065184833, 82.4709171667, "100/91"], [54.9053462, 82.4696260167, "69/91"], [54.9054348333, 82.46965845, "70/91"], [54.9056151167, 82.4697359333, "71/91"], [54.9065477667, 82.4707929167, "99/91"], [54.9063361667, 82.4716625167, "103/91"], [54.9064024833, 82.47136415, "101/91"], [54.9062771167, 82.4700270833, "92/91"], [54.90561825, 82.4717954167, "135/91"], [54.9052021167, 82.4714629667, "127/91"], [54.9053039667, 82.4714958833, "128/91"], [54.9055797833, 82.4715935333, "130/91"], [54.9057338, 82.4716617333, "131/91"], [54.9054388, 82.47153415, "129/91"], [54.90521165, 82.4711876167, "126/91"], [54.9053168167, 82.47122065, "125/91"], [54.9054577833, 82.4712800167, "124/91"], [54.9055496333, 82.47131675, "123/91"], [54.9057004333, 82.47138065, "122/91"], [54.9057989, 82.4714176167, "121/91"], [54.9052758833, 82.4709810667, "110/91"], [54.9053744333, 82.4710138667, "111/91"], [54.9029642833, 82.4708119167, "49"], [54.9013200667, 82.47020055, "9"], [54.9059721, 82.4699033333, "90/91"], [54.9009692833, 82.4700359167, "1"], [54.9020093333, 82.4704903167, "25"], [54.9028505, 82.4713808167, "42"], [54.9026220667, 82.4707023167, "41"], [54.9030775167, 82.47144105, "44"], [54.9032627, 82.4715188333, "46"], [54.90279945, 82.4707535, "47"], [54.9034596333, 82.4715854667, "48"], [54.9046305667, 82.4720644, "90"], [54.9048369667, 82.472151, "92"], [54.9049919, 82.4722146, "94"], [54.9036494333, 82.4716701167, "50"], [54.90358525, 82.4846141, "12"], [54.9037579, 82.4852529, "6"], [54.9038024667, 82.4850978, "7"], [54.9037217667, 82.4849037333, "8"], [54.90347035, 82.4850285667, "2"], [54.9032276333, 82.48546265, "3"], [54.9035196167, 82.4852706167, "4"], [54.9036445667, 82.4853146167, "5"], [54.893842, 82.4658828667, "14"], [54.8942232167, 82.4658869, "10"], [54.8942694, 82.4655608, "10A"], [54.8939012167, 82.46629055, "11"], [54.89414105, 82.46563135, "12A"], [54.8940382, 82.4658608667, "12"], [54.8928791667, 82.4657609, "18"], [54.8920411833, 82.4656866167, "26"], [54.8947138333, 82.46562585, "4A"], [54.89482635, 82.4656405333, "4B"], [54.8943928667, 82.4659067667, "8"], [54.89417895, 82.4666384333, "7A"], [54.8941652333, 82.4663256, "7"], [54.8930164333, 82.4657825333, "16"], [54.8945337167, 82.46636655, "3"], [54.8947049667, 82.4662976667, "1"], [54.8943467167, 82.4663510667, "5"], [54.8945939667, 82.46589925, "6A"], [54.8946026667, 82.4655432, "6B"], [54.89400605, 82.4666357, "9A"], [54.89400415, 82.4663002333, "9"], [54.8947237, 82.4659225, "4"], [54.8948905833, 82.4659464167, "2"], [54.8926863, 82.465739, "20"], [54.8923385, 82.4654623833, "24B"], [54.89249375, 82.4657308833, "22"], [54.8923111667, 82.4657147167, "24"], [54.8815449167, 82.4655157, "12"], [54.8822096833, 82.4655813667, "2"], [54.88233595, 82.4651839667, "1"], [54.8816413667, 82.4648852333, "9B"], [54.8828295, 82.4651827, "3"], [54.8816216167, 82.4650913833, "9A"], [54.8814350167, 82.4653094667, "13"], [54.8813971333, 82.4649169833, "11B"], [54.8814120833, 82.4650868167, "11A"], [54.8819977833, 82.4651571333, "5"], [54.8818037833, 82.46516125, "7"], [54.9272509333, 82.5707935167, "17"], [54.92487165, 82.5688565167, "50"], [54.9279805, 82.5715888167, "2/4"], [54.9281482167, 82.57159225, "3/4"], [54.9277371667, 82.5716141833, "1/4"], [54.9283277667, 82.5715995333, "4/4"], [54.9259907667, 82.5697310833, "41"], [54.9139028667, 82.4794934333, "16"], [54.9131072667, 82.4784122, "5"], [54.913859, 82.4793484, "14"], [54.9137596833, 82.4789706167, "10"], [54.9129783833, 82.4779572167, "1"], [54.9134818333, 82.4796230333, "13"], [54.9134313, 82.47942965, "11"], [54.9130481833, 82.4781893667, "3"], [54.9136100333, 82.4785928, "8"], [54.9137780667, 82.47816635, "6A"], [54.9134069333, 82.4779523167, "2"], [54.9134797167, 82.4781646167, "4"], [54.9135479833, 82.4783853833, "6"], [54.9074968667, 82.4759960667, "26"], [54.90790835, 82.4788683333, "53"], [54.9077523333, 82.47593355, "26A"], [54.9075665667, 82.47624025, "30"], [54.9073841167, 82.47837545, "45"], [54.90830365, 82.4786741167, "52"], [54.9087247333, 82.4801247333, "64"], [54.9075075667, 82.478882333, "51"], [54.9088166, 82.4804266333, "66"], [54.9082595167, 82.4801578667, "65"], [54.9082304, 82.47843325, "50"], [54.90781645, 82.4785779, "49"], [54.9083352333, 82.48044785, "67"], [54.9065845333, 82.4744138667, "15"], [54.9069974, 82.47423525, "12"], [54.9065571167, 82.4727805333, "2"], [54.9066387833, 82.47305845, "4"], [54.9068011, 82.4735746167, "8"], [54.90669225, 82.47329415, "6"], [54.9072826667, 82.4752864833, "18"], [54.9081420333, 82.47812825, "44"], [54.9076585, 82.47803815, "43"], [54.9079773, 82.4776514, "42"], [54.9080697, 82.4779212, "42A"], [54.90758785, 82.4777916167, "41"], [54.90774285, 82.4783192, "47"], [54.9085469333, 82.47804035, "46"], [54.907853, 82.4771642833, "40"], [54.90694245, 82.4762600833, "27A"], [54.90714115, 82.4762523167, "27"], [54.9085940333, 82.4781931, "48"], [54.90842915, 82.4807205833, "69"], [54.90889165, 82.4806537667, "68"], [54.9090825167, 82.4813461833, "72"], [54.9085069833, 82.48098455, "71"], [54.9091493333, 82.4815615167, "74"], [54.9085867333, 82.4812446833, "73"], [54.90638345, 82.4737115833, "9"], [54.9073718833, 82.4770443667, "35"], [54.9076616333, 82.4765182, "34"], [54.9070147167, 82.4757612667, "19"], [54.9080529667, 82.4794295333, "61"], [54.9081081167, 82.4796110667, "63"], [54.9067812333, 82.4766508667, "29"], [54.90727425, 82.4767382167, "33"], [54.9080598, 82.4763364, "32"], [54.9080013, 82.4761604, "32A"], [54.9072168667, 82.4765151833, "31"], [54.9069078, 82.47611375, "21A"], [54.9070925167, 82.4759961167, "21"], [54.9073595833, 82.4755532, "20"], [54.9078311, 82.47552015, "22"], [54.9066715333, 82.4762365333, "23"], [54.9074292167, 82.4757909, "24"], [54.9067200667, 82.4763614333, "25"], [54.9079507667, 82.47594195, "28"], [54.9077839333, 82.4769487333, "38"], [54.9087032167, 82.478581, "54"], [54.9075582, 82.4791360667, "55"], [54.9087507167, 82.47871815, "56"], [54.9075607333, 82.4792694833, "57"], [54.9085885667, 82.4789704, "58A"], [54.908387, 82.47897535, "58"], [54.9078259667, 82.4793328833, "59A"], [54.90801855, 82.47915195, "59"], [54.90845065, 82.4792147, "60"], [54.9086727, 82.4815190333, "75"], [54.9092022333, 82.4817325833, "76"], [54.9087436333, 82.4817835, "77"], [54.9068335333, 82.475831, "19A"], [54.9064835, 82.4740658167, "11"], [54.9068924667, 82.4738985333, "10"], [54.90772245, 82.47673845, "36"], [54.9153057833, 82.4700439333, "8"], [54.9151920167, 82.470103, "7"], [54.9154897833, 82.4704254667, "4"], [54.91544255, 82.4701449833, "6"], [54.9152406333, 82.4705098833, "3"], [54.9155660833, 82.47067085, "2"], [54.9153145667, 82.470762, "1"], [54.915152, 82.4703036833, "5"], [54.8753657, 82.4666292833, "7"], [54.8752355833, 82.4664042833, "5"], [54.8751239167, 82.4667343, "3"], [54.8749005333, 82.4667724833, "1"], [54.8759491, 82.4666146833, "13"], [54.8761423333, 82.4666642667, "15"], [54.8757443667, 82.46657535, "11"], [54.8755500833, 82.4665719333, "9"], [54.8762191, 82.4673812833, "18"], [54.8764603333, 82.4671767333, "22"], [54.87631595, 82.4667095833, "17"], [54.8765421, 82.4670481833, "23"], [54.8764974333, 82.4666557, "19"], [54.8765351667, 82.46685605, "21"], [54.8763332, 82.4671934833, "20"], [54.8761136667, 82.4670612333, "16"], [54.8759115833, 82.4670291, "14"], [54.8757069333, 82.4669862167, "12"], [54.87555015, 82.4673181667, "10"], [54.8754323167, 82.4670474333, "8"], [54.8752163333, 82.4671320667, "6"], [54.8750437, 82.4671685, "4"], [54.87486615, 82.4671727833, "2"], [54.8836992833, 82.4725036, "23A"], [54.8827955833, 82.47167325, "34"], [54.88383525, 82.47247865, "21B"], [54.8836711, 82.4721970333, "23"], [54.88384845, 82.4721985333, "21A"], [54.8832467333, 82.4721379, "31"], [54.8852774167, 82.4718275333, "10"], [54.8841115833, 82.4722314667, "17"], [54.882555, 82.4720817333, "41"], [54.8814569667, 82.4715107167, "46"], [54.8826952667, 82.4720762667, "39"], [54.8834193, 82.4725388, "27"], [54.8834190667, 82.47216485, "29"], [54.8835037667, 82.4725855, "25"], [54.88308205, 82.4721211333, "33"], [54.88081245, 82.47212895, "67A"], [54.8808169167, 82.4719355833, "67"], [54.8854703, 82.4715485833, "8A"], [54.8854802667, 82.4723117333, "7"], [54.8819775333, 82.4720601833, "45"], [54.8820338, 82.4715768333, "38"], [54.88505425, 82.4725552, "11A"], [54.8816020167, 82.4715219833, "44"], [54.8818502167, 82.4715604167, "40"], [54.8817451, 82.4715327167, "42"], [54.8817693333, 82.4720335, "47"], [54.8826490167, 82.4716679, "36"], [54.882937, 82.4720998667, "35"], [54.8828116667, 82.4720924167, "37"], [54.8851022, 82.4718166333, "12"], [54.8817387667, 82.47236985, "49"], [54.8812409667, 82.4710926333, "50"], [54.8815675333, 82.4723074, "51A"], [54.8816046833, 82.4720110833, "51"], [54.8812419, 82.4709490833, "52"], [54.8811635333, 82.4709188667, "54"], [54.8814256833, 82.47197785, "55"], [54.8811236333, 82.4712705167, "56"], [54.8811993, 82.4719696333, "57"], [54.88108405, 82.4714977167, "58"], [54.8809842667, 82.4719474833, "59"], [54.8809340167, 82.4725577, "61"], [54.8808571667, 82.47147535, "62A"], [54.8808698167, 82.4712961833, "62B"], [54.88095885, 82.4727073167, "63"], [54.8805953667, 82.471471, "64"], [54.8808394, 82.4727179833, "65"], [54.8856441667, 82.4723274, "5"], [54.8856559833, 82.47193445, "6A"], [54.8858045667, 82.4719521, "6"], [54.8854608833, 82.4718410833, "8"], [54.8852512333, 82.4722922833, "9"], [54.8812897833, 82.47150895, "48"], [54.8846497167, 82.4717921833, "18"], [54.8850509167, 82.4722740667, "11"], [54.8849657833, 82.4718045667, "14"], [54.8863145, 82.47202075, "4"], [54.8863136833, 82.4724193333, "3"], [54.8848130833, 82.4725039833, "13A"], [54.8848266333, 82.47225735, "13"], [54.8839960167, 82.4722167, "19"], [54.8848076833, 82.47180565, "16"], [54.8847455833, 82.4722526833, "15"], [54.8850477, 82.4726911167, "11B"], [54.8941738167, 82.4707689, "84D"], [54.8940840667, 82.4708939333, "84C"], [54.8941785, 82.4709219, "84B"], [54.8941324333, 82.47094385, "84A"], [54.8935136, 82.4612187667, "11"], [54.8939243167, 82.4608987333, "10"], [54.8933340667, 82.4717043167, "100"], [54.8936952, 82.4650319333, "42"], [54.8932683, 82.4655177833, "41"], [54.8936863667, 82.46521985, "44"], [54.8936738833, 82.4655087667, "46"], [54.8938362667, 82.4624257833, "22"], [54.8937817, 82.4635414833, "30"], [54.8938118, 82.4643993167, "40A"], [54.8937340833, 82.4643627, "40"], [54.8935297167, 82.4682022667, "68"], [54.8932907833, 82.4653249667, "39"], [54.8935900167, 82.4670001333, "54"], [54.89330695, 82.4650841, "37"], [54.8927154833, 82.4709052, "65B"], [54.8927901, 82.4708936667, "65A"], [54.8927898667, 82.4705552833, "63A"], [54.8930308333, 82.461289, "13A"], [54.8932869167, 82.46127415, "13"], [54.89365705, 82.4657872833, "48"], [54.8939401, 82.46390025, "32A"], [54.8936144167, 82.4665801333, "52"], [54.89383355, 82.4665993833, "52A"], [54.8932530667, 82.47349375, "120"], [54.8934369833, 82.4623886667, "19"], [54.8942868333, 82.4610974, "12"], [54.89390075, 82.46130575, "14"], [54.8934877, 82.4615844, "15"], [54.89438475, 82.4619340667, "16A"], [54.89440795, 82.46167145, "16"], [54.89348165, 82.4617730167, "17"], [54.8938709333, 82.46165795, "18"], [54.8933871167, 82.4633617, "27"], [54.8934256333, 82.46270255, "21"], [54.8934101, 82.4630095833, "23"], [54.8938231667, 82.4626998167, "24"], [54.8938185, 82.4629043667, "26"], [54.8933327, 82.4599851667, "1"], [54.8938655, 82.4619277667, "20"], [54.8933737667, 82.4636349, "29"], [54.8933599167, 82.4638405667, "31"], [54.8937605833, 82.4638030667, "32"], [54.8933501333, 82.4640728, "33"], [54.89409735, 82.4639711333, "34"], [54.89333535, 82.46433465, "35"], [54.8937382833, 82.4641705, "36"], [54.8938094833, 82.46310885, "28"], [54.8937422833, 82.4642690333, "38"], [54.8932706, 82.46028355, "3A"], [54.8934162167, 82.4602382333, "3"], [54.8935366333, 82.4605623667, "5"], [54.8935312, 82.4607884833, "7"], [54.89396845, 82.4602069333, "8"], [54.8935128167, 82.4609781167, "9"], [54.8932981167, 82.47301005, "108"], [54.8932691667, 82.4732267667, "110"], [54.8936267667, 82.47335325, "112A"], [54.8938256167, 82.4733656, "112B"], [54.8936103333, 82.4733669833, "112"], [54.8937215333, 82.4735637667, "114"], [54.89365715, 82.4738653167, "116"], [54.8935390333, 82.4735507333, "118"], [54.8934577667, 82.4693120833, "70"], [54.8929881833, 82.4703184667, "59"], [54.8929812667, 82.4706668833, "63"], [54.8929615667, 82.47086305, "65"], [54.8929371167, 82.4712434167, "69"], [54.8929520667, 82.47105645, "67"], [54.89367425, 82.46743525, "58A"], [54.8937744667, 82.4673928, "58B"], [54.8935667833, 82.46736855, "58"], [54.89367375, 82.4675524167, "60A"], [54.8937666333, 82.4676028333, "60B"], [54.8935516833, 82.46756615, "60"], [54.8935477333, 82.4677751333, "62"], [54.8935387833, 82.4679283333, "64"], [54.8935372333, 82.4680373167, "66"], [54.8934518, 82.4694155833, "72"], [54.8934506167, 82.4695295167, "74"], [54.8934785833, 82.4697087167, "76"], [54.8934174, 82.4705130167, "82"], [54.8934133, 82.4707143833, "84"], [54.89339765, 82.4708925667, "86"], [54.8937520167, 82.4710181667, "88"], [54.8933705, 82.47113315, "90"], [54.8934223167, 82.4702347833, "78"], [54.8933635, 82.4712602167, "92"], [54.8933623333, 82.4713753167, "94"], [54.89334455, 82.4715971333, "98"], [54.8933610333, 82.4714828333, "96"], [54.89307625, 82.4690541333, "2/53"], [54.8930733667, 82.46912325, "3/53"], [54.8930706333, 82.4691856, "4/53"], [54.89306775, 82.4692547333, "5/53"], [54.8930755833, 82.4687906833, "47"], [54.8930806333, 82.4689783167, "1/53"], [54.8937726, 82.46406345, "36A"], [54.8940399167, 82.4626443667, "24A"], [54.89306665, 82.4694318, "57A"], [54.8929485833, 82.4694292, "57B"], [54.893691, 82.4662858833, "50"], [54.892929, 82.4695717833, "57C"], [54.8818993667, 82.48831235, "10"], [54.8819047, 82.4884493667, "9"], [54.8818925167, 82.4887367833, "8"], [54.8817909833, 82.4886448, "7"], [54.88156225, 82.4884151333, "5"], [54.8816410667, 82.4884968833, "6"], [54.8817882667, 82.4881434333, "12"], [54.8820450667, 82.4880255, "14"], [54.8820399833, 82.4881601833, "13"], [54.8817013833, 82.48815045, "11"], [54.8814522333, 82.4882864667, "4"], [54.88135345, 82.4881963833, "3"], [54.89047955, 82.3660982833, "48"], [54.8939863833, 82.3676102167, "84"], [54.8908236333, 82.3668215167, "57"], [54.8927242667, 82.3669994667, "72"], [54.89707325, 82.3696241833, "111"], [54.8951834, 82.3681841167, "96"], [54.8891679333, 82.3661342, "25"], [54.8990757167, 82.4813831667, "12"], [54.8990598, 82.4826089667, "27"], [54.8996862, 82.48382855, "34"], [54.8998746167, 82.4868621833, "99"], [54.9001283, 82.4864203833, "97"], [54.9002882, 82.4875789833, "111"], [54.9004845333, 82.4875032167, "113"], [54.9005451667, 82.4877341667, "115"], [54.8987095167, 82.48150085, "15"], [54.8987892, 82.4817609, "17"], [54.8991357, 82.48159105, "14"], [54.89891375, 82.4808869667, "10"], [54.8985199667, 82.4808965667, "11"], [54.8985627833, 82.4811206333, "13"], [54.8992842667, 82.4821156167, "18-20"], [54.8988612333, 82.48195285, "19"], [54.8993973833, 82.4824338, "22"], [54.8989453833, 82.48216625, "23"], [54.8994684833, 82.4826182833, "24"], [54.8989983, 82.48239085, "25"], [54.8995365667, 82.4828116833, "26"], [54.8982566833, 82.4800233833, "1"], [54.8995900333, 82.48303525, "28"], [54.8991642833, 82.4829475167, "29"], [54.8996510167, 82.4832267667, "30"], [54.899284, 82.4832051333, "31"], [54.8983305, 82.4802590667, "3"], [54.8985982333, 82.4800186167, "2"], [54.8995170333, 82.4845078667, "49"], [54.8987404667, 82.4802334667, "4"], [54.89943635, 82.4849588167, "77"], [54.8983839667, 82.4804605, "5"], [54.8987906833, 82.4804517, "6"], [54.8997182, 82.4849414, "81"], [54.8984425333, 82.4806757, "7"], [54.8988546833, 82.4806650333, "8"], [54.8982073167, 82.4808983833, "9"], [54.9002304333, 82.4868039667, "101"], [54.8997452667, 82.48737465, "103"], [54.9001569667, 82.4873521333, "105A"], [54.90035675, 82.4871693, "105"], [54.89977645, 82.4853644833, "85"], [54.8998911833, 82.4857328667, "93"], [54.89830875, 82.4810073667, "11A"], [54.8991998, 82.4818039833, "16"], [54.9000736, 82.48765565, "109"], [54.8998738833, 82.4877091, "107"], [54.8584179167, 82.3917306, "28C"], [54.8604560167, 82.3943771, "27"], [54.8594062, 82.39328765, "22"], [54.8602464667, 82.3945281333, "25"], [54.8580738, 82.3913907167, "28B"], [54.8588583833, 82.3948410167, "10"], [54.8597253167, 82.3943257167, "20"], [54.8594598667, 82.3949546667, "17"], [54.85742675, 82.3934756833, "28D"], [54.85779025, 82.3909575667, "28A"], [54.8602461333, 82.39392145, "24"], [54.8615513167, 82.3930931833, "30"], [54.8615702833, 82.3936576333, "41"], [54.8648762167, 82.391556, "85"], [54.8669371833, 82.38969465, "116"], [54.8656294833, 82.39053055, "96"], [54.8627939333, 82.3928152833, "57"], [54.8642163, 82.3938465167, "63B"], [54.8633075167, 82.3925197167, "63A"], [54.8752946833, 82.47600165, "16"], [54.8752789, 82.4745710667, "26"], [54.8752698667, 82.474182667, "30"], [54.8752788833, 82.4747855667, "24"], [54.8753729833, 82.4773013667, "4"], [54.8752503333, 82.47339515, "36"], [54.8753239, 82.4768918333, "8"], [54.8752590667, 82.4736461333, "34"], [54.8756213167, 82.4747827833, "25"], [54.8752682333, 82.4738759333, "32"], [54.8752943, 82.47621685, "14"], [54.8755946667, 82.4783229167, "2"], [54.8757436, 82.47737735, "7"], [54.8758519, 82.4778569167, "3"], [54.8756174833, 82.4745228, "27"], [54.8756574833, 82.4762356, "15"], [54.8756050833, 82.4734895, "33"], [54.875302, 82.4766701833, "10"], [54.8756027333, 82.4736947333, "31"], [54.8752780667, 82.4758057, "18"], [54.8757905833, 82.477583, "5"], [54.8756395833, 82.4758414333, "19"], [54.8756402, 82.4760084333, "17"], [54.8752715833, 82.4751979, "20"], [54.8757130167, 82.4771411333, "9"], [54.8752756833, 82.47501635, "22"], [54.87527695, 82.47433525, "28"], [54.8756425833, 82.4752112667, "21"], [54.8752937833, 82.4764377, "12"], [54.87559675, 82.4732172, "35"], [54.8753504333, 82.477108, "6"], [54.8755737333, 82.4729657167, "37"], [54.8756244333, 82.4743205667, "29"], [54.8755172667, 82.4727099833, "39"], [54.8756327333, 82.4750188, "23"], [54.8754463333, 82.4724567833, "41"], [54.8753804667, 82.4721916167, "43"], [54.8753413, 82.4719123167, "45"], [54.8751775167, 82.4728065, "40"], [54.87523985, 82.4731198167, "38"], [54.9129636333, 82.47354695, "15"], [54.9129915667, 82.4741582833, "10"], [54.9130924, 82.4741147667, "12"], [54.91301345, 82.4738697833, "14"], [54.9125089, 82.47363755, "3"], [54.9126150667, 82.4743185833, "4"], [54.9126618333, 82.4735482833, "5"], [54.9125892, 82.47392305, "6"], [54.9127883167, 82.47388245, "8"], [54.9126731333, 82.473192, "7"], [54.91275485, 82.47314795, "9"], [54.9128106333, 82.4733799667, "11"], [54.9123932, 82.4739944667, "2"], [54.9123316833, 82.4737106167, "1"], [54.9838611667, 82.5750239333, "209"], [54.9690023333, 82.5700330333, "12"], [54.9711171, 82.5702027833, "25"], [54.9779899, 82.570433, "1/122"], [54.97820695, 82.57005845, "2/122"], [54.9800575, 82.5723918333, "153"], [54.9811843, 82.5731835, "177"], [54.9754233167, 82.57078555, "95"], [54.8838929167, 82.4818853167, "12"], [54.8837344667, 82.4818862, "14"], [54.8835817667, 82.4818741, "16"], [54.8834241, 82.4818550667, "18"], [54.8832506167, 82.48183555, "20"], [54.8830817667, 82.4818428833, "22"], [54.8828965167, 82.48182015, "24"], [54.8827122833, 82.4817928, "26"], [54.8814133667, 82.4817274333, "44"], [54.8813040833, 82.48171155, "46"], [54.8810746667, 82.4817141833, "48"], [54.8809023, 82.4816841, "50"], [54.8807272167, 82.4816891167, "52"], [54.8805686833, 82.4816589167, "54"], [54.8803979167, 82.4816530833, "56"], [54.8801843833, 82.48158535, "58"], [54.8825403667, 82.4813836167, "32A"], [54.88253505, 82.4817773, "32"], [54.8825069167, 82.48115065, "34"], [54.88240895, 82.4812873333, "36"], [54.8823411, 82.4817443167, "38"], [54.8822324, 82.4817659167, "40"], [54.8852853, 82.4825293667, "1"], [54.8852325667, 82.4820864167, "2"], [54.8856616, 82.4830290667, "3"], [54.8851546, 82.4819058667, "4"], [54.8853310833, 82.4831131333, "5"], [54.8851287833, 82.4816127333, "6"], [54.8827869667, 82.4815392833, "26B"], [54.88484925, 82.4820581167, "8"], [54.9024855, 82.4814230667, "6"], [54.9027508667, 82.48132635, "2"], [54.90267385, 82.4810493833, "3"], [54.902509, 82.4810477333, "4"], [54.90239855, 82.4812007, "5"], [54.8861399167, 82.4659005167, "2A"], [54.8858972, 82.4701092167, "36"], [54.8867484667, 82.4678494333, "19"], [54.8861574833, 82.46575525, "2"], [54.8864493167, 82.4662703167, "3"], [54.88622685, 82.47015215, "39"], [54.88624375, 82.4699778833, "37"], [54.8863943167, 82.4703065667, "39A"], [54.8858773667, 82.4704395333, "38"], [54.8866652833, 82.4663845667, "3A"], [54.8862623667, 82.4706270167, "41"], [54.8856218833, 82.4704532333, "40"], [54.8854065833, 82.4706356333, "42B"], [54.88625425, 82.4707564167, "43"], [54.88541165, 82.4704709667, "42A"], [54.8861368333, 82.47271145, "55"], [54.886122, 82.4661553833, "4"], [54.8863355167, 82.4685020667, "27"], [54.8865969667, 82.4687519167, "29A"], [54.8865831, 82.4689422667, "31A"], [54.8860333167, 82.46789315, "20"], [54.8858932167, 82.4702396667, "36A"], [54.88643745, 82.4660770167, "1"], [54.8857492, 82.46868685, "30A"], [54.8855154167, 82.4686515333, "30B"], [54.8856861, 82.46828205, "24A"], [54.8860060667, 82.4682543333, "24"], [54.8863518833, 82.4681365167, "23"], [54.8860244, 82.4680726833, "22"], [54.8860988667, 82.4665564833, "10"], [54.8863865333, 82.4673575, "11"], [54.8863826833, 82.4675404, "13"], [54.8863788667, 82.4677124167, "15"], [54.8860585833, 82.4674608333, "14"], [54.8856044667, 82.46749745, "16A"], [54.8857502, 82.46754885, "16"], [54.8864570833, 82.4677168333, "17"], [54.8860457333, 82.4676692, "18"], [54.8867451667, 82.4680089167, "19A"], [54.8858168333, 82.4717908, "58"], [54.8866057333, 82.4666266833, "5A"], [54.8864473333, 82.4665519333, "5"], [54.88573305, 82.4662191833, "6"], [54.8861234333, 82.4729670667, "57"], [54.8861040833, 82.4732588, "59"], [54.8857812833, 82.4727290333, "62"], [54.8860733167, 82.47367975, "63"], [54.8853214167, 82.47302445, "64A"], [54.8857647, 82.4729568833, "64"], [54.8860630667, 82.4741376333, "65"], [54.8855514167, 82.4731432833, "66A"], [54.8857605333, 82.4732639667, "66"], [54.88604615, 82.4744234333, "67"], [54.8857253333, 82.4734757667, "68"], [54.8860271667, 82.4749003, "71"], [54.8864273833, 82.4668194167, "7"], [54.8861134167, 82.4663483833, "8"], [54.88530955, 82.4734951667, "72A"], [54.8853649167, 82.4735031333, "72"], [54.8857145667, 82.47370235, "74"], [54.88570935, 82.4738793833, "76"], [54.8856962833, 82.4740871833, "78"], [54.8855425, 82.4740492667, "80"], [54.8855359667, 82.47421665, "82"], [54.8856920333, 82.4742632667, "84"], [54.88567285, 82.4743871833, "86"], [54.8856348, 82.47498665, "88"], [54.8864008667, 82.4671270833, "9"], [54.8859601833, 82.47522375, "73"], [54.8859930167, 82.4754003167, "75"], [54.88563045, 82.4752063667, "90"], [54.8856196667, 82.4754834167, "94"], [54.8855985333, 82.4757720333, "98"], [54.8852094333, 82.4756059333, "96"], [54.8856225333, 82.4706336667, "44"], [54.8863443167, 82.4711711167, "45A"], [54.8862241333, 82.47112885, "45"], [54.8858591, 82.4707636333, "46"], [54.8862151, 82.4713376833, "47"], [54.88584785, 82.4710055, "48"], [54.8863784667, 82.4716221167, "49A"], [54.88619305, 82.4716161667, "49"], [54.8854010167, 82.4710779333, "50A"], [54.8855194, 82.4710888, "50"], [54.8861586167, 82.4718484, "51"], [54.8855134333, 82.4712143833, "52"], [54.8858417833, 82.4713232833, "54"], [54.8858254, 82.4715816333, "56"], [54.8859913, 82.4685190667, "28"], [54.8863223167, 82.4686848833, "29"], [54.8859773333, 82.46879095, "30"], [54.8863225167, 82.4688814167, "31"], [54.8859628333, 82.4690224667, "32"], [54.8863278333, 82.4690195667, "33"], [54.8860351333, 82.4746824, "69"], [54.88563915, 82.4684005167, "26"], [54.8863489, 82.4683084, "25"], [54.8866069, 82.4673016, "11A"], [54.8868120167, 82.4673208833, "11B"], [54.88578115, 82.4680634667, "22A"], [54.8863727, 82.4679364, "21"], [54.8858363, 82.4659994, "4A"], [54.88658795, 82.4674919167, "13A"], [54.92234345, 82.4747052, "199"], [54.92177305, 82.4769218333, "2"], [54.9221347833, 82.47694995, "1"], [54.9222941667, 82.47512075, "165"], [54.9219244667, 82.4755311667, "126"], [54.92194885, 82.4751084333, "164"], [54.92227225, 82.4756573333, "109"], [54.9226473833, 82.47590455, "105"], [54.9217738833, 82.4766539667, "38"], [54.9226126333, 82.4765605333, "45"], [54.9221432333, 82.4762786, "51"], [54.92185925, 82.4759778667, "80"], [54.9219880167, 82.4744712833, "230"], [54.9213271, 82.4744695667, "200"], [54.9210363333, 82.4743909167, "210"], [54.9206876333, 82.4744863, "220"], [54.9212772667, 82.4748825167, "184"], [54.9213329, 82.4754072167, "194"], [54.92179965, 82.4763127667, "50"], [54.9226488667, 82.4760626667, "101"], [54.9224377167, 82.4742912, "231"], [54.9222663833, 82.4741209667, "253"], [54.9220891, 82.4742094833, "250"], [54.8763709833, 82.4737251167, "6"], [54.8762928, 82.4740830833, "7"], [54.8757872, 82.47372185, "2"], [54.8759274833, 82.4737143667, "4"], [54.8761889833, 82.4744309833, "5B"], [54.8760917667, 82.4744256833, "5A"], [54.8760035, 82.47408515, "3"], [54.8758006, 82.4741481167, "1"], [54.8945807833, 82.4731283, "92"], [54.8952838, 82.4659743667, "9"], [54.8945913667, 82.47286075, "88"], [54.8948307167, 82.4678840833, "26"], [54.8946495333, 82.4715883833, "68"], [54.8955784167, 82.4666195833, "17"], [54.8950308833, 82.4707890333, "55"], [54.8950268333, 82.4708643, "57"], [54.8950210333, 82.4709645333, "59"], [54.8950726167, 82.4692980667, "35"], [54.8948167167, 82.4681206667, "28"], [54.89480715, 82.4683576167, "30"], [54.89448235, 82.47392275, "100"], [54.8949025833, 82.4736886667, "101"], [54.8944604833, 82.4740989333, "102"], [54.8940345667, 82.4741795333, "104"], [54.8948037, 82.4748156667, "105"], [54.8944383833, 82.4744140333, "106"], [54.8949698833, 82.4659329667, "10"], [54.8949612167, 82.4663892333, "12"], [54.8949153, 82.46660965, "14"], [54.8948991667, 82.46678365, "16"], [54.8947661, 82.46694865, "18A"], [54.8944432333, 82.4669301, "18B"], [54.8948852, 82.4669605667, "18"], [54.8948780167, 82.46712785, "20"], [54.8944023, 82.4672810833, "22B"], [54.8947610167, 82.46729965, "22A"], [54.8948679667, 82.46733215, "22"], [54.8948783833, 82.46748345, "1/24-7/24"], [54.8947230167, 82.4702766667, "42"], [54.8946909667, 82.4707959333, "54"], [54.8946726833, 82.4711023333, "60"], [54.8946703833, 82.4712066833, "62"], [54.8946656, 82.4712626667, "64"], [54.8949888833, 82.4656431, "6"], [54.8949382, 82.4729810833, "93"], [54.8945739333, 82.47341895, "94"], [54.8949277, 82.4731673, "95"], [54.89438165, 82.4736724333, "96A"], [54.8945503667, 82.4736765833, "96"], [54.8949105333, 82.47340155, "97A"], [54.8942335833, 82.4737639667, "98"], [54.8946295667, 82.4718361, "72"], [54.89462675, 82.4719766167, "74"], [54.8949939167, 82.4719069333, "77"], [54.8946185167, 82.4722803667, "82"], [54.8949549, 82.4725255167, "87"], [54.8949826333, 82.4657729, "8"], [54.8952739667, 82.4662657333, "11"], [54.8954714167, 82.4664023833, "13A"], [54.8955781667, 82.46640275, "13B"], [54.8952808167, 82.4663722, "13"], [54.89527365, 82.4665192833, "15"], [54.8956551167, 82.4661953667, "11B"], [54.8953330833, 82.4650771, "1"], [54.8950785667, 82.469182167, "33"], [54.8950110333, 82.4654238667, "2"], [54.8950599167, 82.4704818, "45"], [54.8950526167, 82.4705562667, "47"], [54.8950517333, 82.4706304167, "49"], [54.8950748667, 82.4694276667, "41"], [54.8953314667, 82.4653118333, "3"], [54.8950057833, 82.46551395, "4"], [54.8950353, 82.4734756833, "97"], [54.8950013, 82.4717792, "75"], [54.8950426833, 82.4706778167, "51"], [54.89503905, 82.4707278833, "53"], [54.8950147333, 82.4710415167, "61"], [54.8950166833, 82.4711306, "63"], [54.8950141, 82.4712134833, "65"], [54.8950130833, 82.4712694167, "67"], [54.8950105, 82.4713271, "69"], [54.8950101667, 82.4713877667, "71"], [54.8950061333, 82.4714993167, "73"], [54.8953044, 82.4655703333, "5"], [54.8953043, 82.4657896167, "7"], [54.8948314667, 82.46896985, "36"], [54.8944233667, 82.4670945167, "20B"], [54.89476705, 82.4671119, "20A"], [54.8948155167, 82.46873695, "34"], [54.8785435, 82.4391193, "108"], [54.85482825, 82.43943885, "372"], [54.8843674667, 82.44077705, "44"], [54.8514708333, 82.44301855, "414"], [54.8786210833, 82.4386722333, "107"], [54.8536346167, 82.43854, "2/377"], [54.88482555, 82.43861845, "37"], [54.85393405, 82.4384665833, "1/377"], [54.87792065, 82.43870995, "115"], [54.8616766, 82.43942835, "296"], [54.8758269167, 82.439114, "136"], [54.8611102167, 82.4393358, "302"], [54.8630311167, 82.4365396167, "279"], [54.8653560833, 82.4373495833, "253"], [54.8757949833, 82.4386379333, "137"], [54.8786179833, 82.4342996333, "2/105"], [54.8874004, 82.4391212667, "1/10-2/10"], [54.8447363167, 82.43930545, "482"], [54.88403545, 82.4386151333, "45"], [54.8717442667, 82.4349390667, "183"], [54.8767875333, 82.4386578667, "127"], [54.8797060833, 82.4386293833, "93"], [54.8866638167, 82.4390628, "18"], [54.8791973, 82.4386315, "97"], [54.88585575, 82.4362985167, "19"], [54.8790987667, 82.4391399833, "100"], [54.8771662, 82.43926595, "124"], [54.8838361, 82.4391195833, "48"], [54.8857025667, 82.4423457333, "30"], [54.8854774667, 82.4423092, "3/30"], [54.8449495333, 82.43932215, "480"], [54.8540070333, 82.4394581833, "376"], [54.8831838833, 82.4385145, "55"], [54.8588749833, 82.4393561333, "326"], [54.86279375, 82.4385341667, "281"], [54.8445601333, 82.43930445, "484"], [54.84437095, 82.43930065, "486"], [54.8788133833, 82.4351573667, "1/105"], [54.8800643333, 82.4356186, "1/93"], [54.87918835, 82.4355875333, "2/93"], [54.88086735, 82.4358693833, "83"], [54.88697085, 82.4385406333, "15"], [54.8505857167, 82.4386953333, "425"], [54.8857656333, 82.4386266333, "21"], [54.8517299333, 82.43952155, "404"], [54.8859354667, 82.4391316833, "20"], [54.8643110167, 82.43852915, "269"], [54.8638944167, 82.4352222, "271"], [54.8629044167, 82.4394276667, "280"], [54.8636698333, 82.4384519167, "273"], [54.87065885, 82.4387204333, "197"], [54.870552, 82.4392104333, "198"], [54.86847865, 82.4362560333, "215"], [54.8682894833, 82.4387331667, "221"], [54.8723437333, 82.4386659167, "179"], [54.8713473833, 82.4386830333, "191"], [54.8803684, 82.4391223, "84"], [54.8801818167, 82.4386532333, "89"], [54.8795138833, 82.4391232667, "98"], [54.88233015, 82.4385688167, "67"], [54.8822730833, 82.439127, "68"], [54.8815140333, 82.4385229167, "75"], [54.88161725, 82.43921275, "76"], [54.88298115, 82.4391210167, "60"], [54.88356985, 82.44183935, "54"], [54.88688885, 82.4390723333, "16"], [54.8854630667, 82.44062525, "1/30"], [54.8857315833, 82.4406345667, "2/30"], [54.8850814333, 82.4391024667, "32"], [54.85615335, 82.4394051333, "358"], [54.8484322833, 82.4386304333, "451"], [54.849595, 82.4395278833, "438"], [54.8685579333, 82.43929385, "222"], [54.8673376667, 82.4387301333, "231"], [54.8672263, 82.4391822833, "234"], [54.8658104, 82.4384541833, "249"], [54.8650818333, 82.4384285833, "257"], [54.8572850833, 82.4388435667, "345"], [54.8695889833, 82.4385987333, "207"], [54.8444514833, 82.4388799167, "483"], [54.8828889333, 82.4356993, "51"], [54.8832340833, 82.4358504, "1/51"], [54.8573635, 82.4392901833, "342"], [54.86163445, 82.43881845, "295"], [54.8624819833, 82.438809, "287"], [54.84347995, 82.4385449833, "495"], [54.85704685, 82.4422632333, "346"], [54.8881785167, 82.4536787833, "11"], [54.8876931833, 82.4532197833, "5"], [54.887782833, 82.4536870667, "7"], [54.8883681, 82.4535562333, "2/10"], [54.88862675, 82.4537201667, "4/10"], [54.88857235, 82.4536184167, "3/10"], [54.88834935, 82.45339255, "1/10"], [54.8880737833, 82.4534382833, "9"], [54.88862905, 82.4582377167, "8"], [54.888388, 82.4577553167, "5A"], [54.8890413167, 82.4584074, "10A"], [54.8890455167, 82.45818135, "10"], [54.8893714, 82.4579083667, "1"], [54.8891550333, 82.4579009333, "2"], [54.8889156, 82.45789245, "3"], [54.8887209667, 82.4578687833, "4"], [54.8885121, 82.45785425, "5"], [54.8884355167, 82.4579579333, "6"], [54.8884670667, 82.4581608667, "7"], [54.88885115, 82.4581993167, "9"], [54.88829695, 82.4581456, "7A"], [54.89493095, 82.50293945, "2/207"], [54.8939846833, 82.4919359167, "1/143"], [54.9326599333, 82.5720857333, "946"], [54.8940428667, 82.4929087, "2/143"], [54.93985015, 82.5776648, "1006"], [54.9234984333, 82.5621109333, "816"], [54.9374057, 82.57533755, "1004"], [54.92045495, 82.5594362667, "773"], [54.9370037333, 82.5752245333, "1002"], [54.9233134, 82.5619061667, "814"], [54.9247701333, 82.5642938333, "838"], [54.9091874667, 82.5318147333, "504"], [54.90968075, 82.53436585, "525"], [54.9100798667, 82.53351915, "518"], [54.9137304333, 82.5349179, "560"], [54.9131590333, 82.53488155, "558"], [54.9072097667, 82.5257719, "458"], [54.89594205, 82.4996267667, "178"], [54.9372702, 82.57594035, "1013"], [54.89638255, 82.5065894833, "246"], [54.8968645833, 82.50876055, "259"], [54.8980340833, 82.5096747833, "276"], [54.8986749667, 82.5105449167, "280"], [54.89924075, 82.5129982667, "295"], [54.9015737, 82.515433, "324"], [54.91571275, 82.5534373, "705"], [54.9162442833, 82.5534827, "706"], [54.9148016833, 82.54767885, "648"], [54.9148501, 82.5499118333, "673"], [54.9151485667, 82.5495203167, "660"], [54.9197264, 82.5575957333, "748"], [54.9212959167, 82.5604435167, "787"], [54.9255722167, 82.5660694167, "852"], [54.9026268333, 82.5172354667, "356"], [54.8950368333, 82.5025268833, "1/207"], [54.9122779833, 82.5393717167, "2/573"], [54.9114679667, 82.5398593333, "3/573"], [54.91540075, 82.5527015167, "699"], [54.9012012167, 82.51619825, "335"], [54.9168711667, 82.5553676, "719"], [54.982395667, 82.5561893167, "723"], [54.9180392833, 82.5566833, "739"], [54.9130946167, 82.5474586167, "637"], [54.8940036333, 82.4831404833, "29"], [54.8943207667, 82.4865820833, "69"], [54.8943952833, 82.4886118, "71"], [54.8951511833, 82.4905976667, "112"], [54.90356905, 82.5202661333, "379"], [54.9042539, 82.5213877833, "391"], [54.9058724667, 82.5242790667, "427"], [54.9355250333, 82.57499645, "987"], [54.9134563333, 82.5426692667, "603"], [54.9135913667, 82.54315755, "607"], [54.91401355, 82.5428852833, "608"], [54.9106131167, 82.5359661167, "539"], [54.9111353167, 82.53571595, "542"], [54.9113920167, 82.5360293167, "546"], [54.9121793167, 82.5377621, "568"], [54.9346634, 82.5743922333, "979"], [54.9374423833, 82.5674758833, "972"], [54.9156359, 82.55118655, "692"], [54.9155415167, 82.5508029, "690"], [54.90281625, 82.51905675, "373"], [54.9027791333, 82.582252833, "358"], [54.8958690833, 82.5018481167, "190"], [54.9789857333, 82.4405075667, "168"], [54.9695422, 82.4324544167, "23"], [54.9694634, 82.4313197333, "12"], [54.9734056167, 82.4391843667, "105"], [54.9748037833, 82.4419470833, "123"], [54.9775236, 82.4415263333, "155"], [54.9782757667, 82.44079755, "166"], [54.9718126167, 82.4347789833, "54"], [54.8974829, 82.4523839667, "11"], [54.896949, 82.4538974333, "10"], [54.8973599167, 82.4533428167, "3"], [54.89717915, 82.4544804167, "4"], [54.8973309833, 82.45308765, "5"], [54.8972213833, 82.4542655167, "6"], [54.8972975167, 82.452858, "7"], [54.8971736167, 82.4540106333, "8"], [54.8972301333, 82.4525011667, "9"], [54.8962831, 82.4514132833, "40"], [54.8962904167, 82.4509267333, "42"], [54.8964889167, 82.4515006167, "44"], [54.8966648, 82.4514576667, "46"], [54.8963241333, 82.4516917333, "38"], [54.8971486, 82.4537583167, "12"], [54.8974914833, 82.4522686333, "13"], [54.8968280167, 82.4517962167, "32"], [54.8965602833, 82.4518541, "34"], [54.8963553, 82.4518366333, "36"], [54.8972173667, 82.4551419333, "2"], [54.8970665667, 82.45323925, "14"], [54.8971966, 82.4522688167, "15"], [54.8968064, 82.4532278167, "16"], [54.8967456833, 82.4531232333, "18"], [54.8974595167, 82.4539856833, "1"], [54.89702105, 82.4529966167, "20"], [54.89697325, 82.4525840667, "22"], [54.8966754833, 82.45262025, "24"], [54.8965024, 82.4525581333, "26"], [54.8967277167, 82.4524711167, "28"], [54.8969411167, 82.4523854, "30"], [54.8971252667, 82.4517190167, "17"], [54.8973954333, 82.4516434667, "19"], [54.89734885, 82.4512056667, "27"], [54.8975603333, 82.4513639167, "23"], [54.8975662667, 82.45155165, "21"], [54.89758735, 82.45118755, "25"], [54.8976514, 82.4505551833, "25A"], [54.93618265, 82.4679452833, "99"], [54.9364427, 82.47434405, "47"], [54.93602995, 82.4635648833, "143"], [54.9363754167, 82.4732709667, "55"], [54.9364611, 82.47575415, "37"], [54.9362570167, 82.4694700833, "89"], [54.9356639667, 82.4542221333, "225"], [54.9365317333, 82.4564987833, "201"], [54.9357644333, 82.45652615, "1/201"], [54.9356391667, 82.4555529667, "209"], [54.9359229, 82.4614506167, "157"], [54.9354519, 82.4510958, "245"], [54.8043647667, 82.3646767, "9"], [54.8033645333, 82.3644417333, "14"], [54.8041373, 82.3641572833, "11"], [54.9559902833, 82.4358548667, "1/3116"], [54.9541933, 82.43567675, "3126"], [54.9159823833, 82.4458315667, "2/3627"], [54.91406535, 82.4497318167, "3668"], [54.9555601667, 82.4360378833, "2/3116"], [54.9139425833, 82.4497730667, "3666"], [54.9160902, 82.4453786667, "1/3627"], [54.9619189333, 82.4331309167, "3032"], [54.9609963833, 82.4328218833, "3039"], [54.9616219333, 82.4333006833, "3036"], [54.9329983333, 82.4291615333, "3361"], [54.9152040667, 82.4487561167, "3654"], [54.9319928333, 82.430282167, "3384"], [54.91578065, 82.4478569, "3642"], [54.9157454833, 82.4465326333, "3635"], [54.9151056, 82.4479749833, "3643"], [54.91545865, 82.4473662167, "3639"], [54.9155843167, 82.4470310167, "3637"], [54.9027715667, 82.45210165, "3794"], [54.9032760833, 82.4549883, "3784"], [54.9748930833, 82.4242103667, "2855"], [54.9773033833, 82.42065365, "2829"], [54.9444458667, 82.4188207667, "3217"], [54.9012992833, 82.4500824333, "3807"], [54.9127339333, 82.4503371, "3682"], [54.90071495, 82.4536467833, "3829"], [54.9048702167, 82.45171675, "2/3774"], [54.9001265, 82.4627736833, "3910"], [54.8984810667, 82.4580702, "2/3879"], [54.8987156833, 82.45782225, "3/3879"], [54.8996284833, 82.4598028333, "3886"], [54.91662675, 82.4488524167, "3648"], [54.9105417167, 82.4505777, "3714"], [54.9047285333, 82.458219, "1/3774"], [54.98387015, 82.4128784667, "2/2724"], [54.9836752333, 82.4125610667, "1/2724"], [54.8997874, 82.4596524, "2/3886"], [54.8999206167, 82.4595150667, "3/3886"], [54.9052384833, 82.4516238333, "3/3774"], [54.9009602667, 82.4546291667, "3846"], [54.89997485, 82.4588545167, "3890"], [54.9160101833, 82.4469321333, "3636"], [54.9504464333, 82.43548145, "3164"], [54.90139465, 82.4518174, "3808"], [54.9003306333, 82.4547485333, "3831"], [54.9150642, 82.4457459, "3631"], [54.9700292833, 82.4302066, "2954"], [54.9719347833, 82.4284579333, "2920"], [54.9684611833, 82.4302354667, "2959"], [54.9638249667, 82.4310026333, "3011"], [54.9635499667, 82.4311723667, "3013"], [54.9621262833, 82.4321201167, "3025"], [54.9599553667, 82.4336584667, "3059"], [54.9593913167, 82.4346581667, "3072"], [54.9671775, 82.4315904833, "2978"], [54.9654828167, 82.4323972833, "2996"], [54.9304655333, 82.4298457167, "3403"], [54.9397400667, 82.4320840667, "3292"], [54.9397871333, 82.4311546, "3299"], [54.93902, 82.4299714, "3301"], [54.93884655, 82.4297564667, "3311"], [54.9378664, 82.42977575, "3320"], [54.9375432, 82.42891805, "3321"], [54.9370408, 82.4289005833, "3331"], [54.9364621167, 82.4289989833, "3337"], [54.9358432667, 82.4290959667, "3339"], [54.95477045, 82.4310178833, "3103"], [54.9508932667, 82.4345944, "3163"], [54.9502843833, 82.4345016333, "3169"], [54.9476339333, 82.4348761333, "1/3200"], [54.9459382167, 82.4300649167, "3215"], [54.9294075333, 82.4304862, "3414"], [54.9292768667, 82.4300710167, "3415"], [54.9481910333, 82.43494365, "2/3200"], [54.9276201333, 82.4302237167, "3433"], [54.9263022167, 82.4323864333, "3456"], [54.9577552167, 82.43514095, "3090"], [54.9559199, 82.4356498167, "3110"], [54.9556312, 82.4352157667, "3111"], [54.9541667833, 82.4350528333, "3127"], [54.924353, 82.43477375, "3488"], [54.92140285, 82.4361990333, "3521"], [54.9216205, 82.4367220333, "3522"], [54.9199150167, 82.4372039667, "3537"], [54.9191848333, 82.4377457167, "3553"], [54.91800785, 82.4398907667, "3571"], [54.982554, 82.4427753167, "3596"], [54.9167918667, 82.4434860333, "3611"], [54.9154718333, 82.4484893833, "3650"], [54.91254, 82.4489284667, "3693"], [54.9096463167, 82.4500162167, "3715"], [54.9095109, 82.45076725, "3718"], [54.90312135, 82.4513793, "3791"], [54.9025248833, 82.4514848833, "3797"], [54.9027026, 82.4521118333, "3796"], [54.9012756, 82.4523393333, "3809"], [54.9000247833, 82.4550734667, "3847"], [54.8996109167, 82.45623955, "3853"], [54.8990466, 82.4570460167, "3861"], [54.8982341833, 82.4584695333, "1/3879"], [54.9037354333, 82.4513122, "3783"], [54.9164707667, 82.4457016833, "3626"], [54.9005404, 82.4554475167, "3838"], [54.92350345, 82.4354481833, "3498"], [54.92093435, 82.4372154, "3528"], [54.9733884167, 82.4270654167, "2900"], [54.9735011833, 82.426221, "2883"], [54.9737880333, 82.4258421667, "2881"], [54.9736479167, 82.4268099667, "2882"], [54.8857180167, 82.4319128667, "1/1699"], [54.8762356, 82.4124507167, "1498"], [54.8760383833, 82.4119469333, "1494"], [54.8881260667, 82.4328696, "2/1715"], [54.8866376, 82.4333463667, "1/1715"], [54.8884282, 82.4323350167, "1714"], [54.8881726667, 82.44522875, "1835A"], [54.8828618833, 82.42668015, "1643"], [54.8875062667, 82.4321305667, "1713"], [54.8891637, 82.4487508333, "1863"], [54.8890458667, 82.4450934833, "1835"], [54.8893503667, 82.4505826167, "1881"], [54.8892833167, 82.4493800333, "1871"], [54.88967995, 82.44903065, "1866"], [54.8897650833, 82.45173775, "1894"], [54.88972655, 82.4509517833, "1886"], [54.8893972, 82.4519753167, "1895"], [54.8893728833, 82.4515209833, "1891"], [54.8893832667, 82.458283333, "1893"], [54.88975065, 82.4512729833, "1888"], [54.8897555167, 82.4524542333, "1896"], [54.8789651833, 82.4203288667, "1567"], [54.8891086, 82.4330816833, "1716"], [54.8749076, 82.4095179667, "1466"], [54.8766546833, 82.41371075, "1510"], [54.87762145, 82.4159128833, "1532"], [54.8778396333, 82.41638935, "1534"], [54.8784475833, 82.482476, "1544"], [54.8789228667, 82.4189449833, "1560"], [54.8838774833, 82.4277925667, "1659"], [54.8865829, 82.4310726667, "2/1699"], [54.8869873, 82.4315526833, "1705"], [54.8887145167, 82.4342103167, "1735"], [54.8886082667, 82.4386434, "1786"], [54.8888977833, 82.4397067833, "1788"], [54.8889447833, 82.4399386, "1790"], [54.8891184, 82.4403393, "1800"], [54.8886052167, 82.44114285, "1811"], [54.8890688833, 82.4442045667, "1829"], [54.8894286667, 82.4442416167, "1830"], [54.8894495167, 82.4447870333, "1832"], [54.8894350833, 82.4526888167, "1903"], [54.8898216167, 82.45284305, "1902"], [54.8898244333, 82.45305355, "1906"], [54.8895077667, 82.4534430333, "1907"], [54.8895153, 82.4539427833, "1913"], [54.8820731, 82.4246370667, "1/1628"], [54.8829790333, 82.42515415, "2/1628"], [54.8829182333, 82.42331235, "3/1628"], [54.8846927167, 82.4287510833, "1669"], [54.8857990667, 82.4293535333, "1682"], [54.8859693167, 82.4303029167, "1/1689"], [54.8861213333, 82.4304782, "1689"], [54.9054227833, 82.4822613, "5"], [54.90567515, 82.4819121167, "6"], [54.9058446667, 82.4825176167, "10"], [54.9057151167, 82.4832514, "11"], [54.9059177, 82.4827449333, "12"], [54.9062382833, 82.48278225, "14"], [54.9059932667, 82.4830166333, "16"], [54.90537935, 82.4821119, "3"], [54.9055974, 82.4816880167, "4"], [54.9055800167, 82.4827762667, "7"], [54.9053443333, 82.4819134167, "1"], [54.9056483167, 82.4830068333, "9"], [54.9687541667, 82.5740302667, "1149"], [54.9203192833, 82.5148173833, "4/319"], [54.9566814833, 82.5624372, "1/978"], [54.95688745, 82.5621776167, "2/978"], [54.9580920167, 82.5647472333, "995"], [54.92775475, 82.5378236667, "2/568"], [54.92609085, 82.5347061333, "1/542"], [54.9266186167, 82.5349056333, "2/542"], [54.9269626167, 82.5353566167, "3/542"], [54.9208396833, 82.5299344667, "422"], [54.9207653333, 82.5242669667, "387"], [54.9178039333, 82.49454775, "140"], [54.9456599, 82.5548334167, "2/836"], [54.9455115167, 82.5542481167, "1/836"], [54.9194724833, 82.5061424833, "238"], [54.9193864333, 82.5055969833, "232"], [54.982102167, 82.49730755, "159"], [54.9307227667, 82.53812715, "1/618-10/618"], [54.9369806, 82.5416204833, "648A"], [54.93400485, 82.5405088167, "648"], [54.9352812167, 82.5418752167, "656"], [54.9261541333, 82.5367970667, "564"], [54.9276279, 82.5381303167, "1/568"], [54.9461318333, 82.5545134167, "842"], [54.94315595, 82.5537148, "806"], [54.9464287167, 82.5549129667, "844"], [54.9713060833, 82.57780675, "1198"], [54.9403528, 82.5492173333, "748"], [54.9406445667, 82.5496667833, "1/750"], [54.9282707, 82.5363209167, "7/568"], [54.9188207333, 82.505113, "225"], [54.9388163333, 82.5467693, "714"], [54.9405476, 82.5503991667, "749"], [54.94102555, 82.55021985, "750"], [54.94425745, 82.5552436333, "819"], [54.9459448333, 82.55501645, "838"], [54.9465835833, 82.5559441, "845"], [54.9472323167, 82.5550552833, "850"], [54.9479511833, 82.5562512667, "1/861"], [54.9481898667, 82.55635715, "2/861"], [54.9500993333, 82.5559819167, "888"], [54.95089095, 82.5580154, "899"], [54.9289862833, 82.5364012833, "6/568"], [54.9653755, 82.5702818667, "1099"], [54.9299398667, 82.5377803667, "3/610"], [54.9297131333, 82.5382649, "2/610"], [54.92950415, 82.5389677333, "1/610"], [54.9285464333, 82.53936505, "601"], [54.92981565, 82.5365770833, "568"], [54.9335473333, 82.5403341667, "646"], [54.9331034167, 82.5400956, "642"], [54.9327759167, 82.538732, "640"], [54.9334526333, 82.5387036667, "638"], [54.93320675, 82.5383744833, "636"], [54.9336129167, 82.5375626, "634"], [54.93288865, 82.5381226667, "632"], [54.9327198833, 82.53720065, "630"], [54.93255565, 82.53790585, "628"], [54.93178035, 82.5394509333, "626"], [54.9186410667, 82.5002110833, "182"], [54.9172343667, 82.4951996667, "139"], [54.9180053667, 82.5002946167, "183"], [54.9174022167, 82.4964858167, "151"], [54.9234301333, 82.5355513833, "516"], [54.9434775667, 82.5532109833, "808"], [54.93984305, 82.5484721667, "742"], [54.9705266833, 82.57732895, "182"], [54.9272626167, 82.53717615, "3/568"], [54.9532905667, 82.5580751833, "926"], [54.9528798333, 82.5576940667, "924"], [54.9659760333, 82.5710443833, "1/1111"], [54.9396966667, 82.5481831, "740"], [54.9128371, 82.4832793167, "19"], [54.9140123833, 82.4838446333, "26"], [54.9172423167, 82.4912675833, "106"], [54.91736885, 82.4918037833, "110"], [54.9824985, 82.4930980167, "120"], [54.9169178833, 82.4926386, "121"], [54.9163286667, 82.4889877833, "85"], [54.9169649167, 82.4891728833, "86"], [54.9165898167, 82.4905852833, "97"], [54.9139972667, 82.4850735, "37"], [54.9158482667, 82.48707945, "68"], [54.9195504667, 82.5065384833, "240"], [54.9197355333, 82.5077362, "256"], [54.9187252667, 82.5091617167, "263"], [54.9196476833, 82.5108055333, "277"], [54.9202849333, 82.5111623667, "300"], [54.9206995667, 82.5135292833, "1/314"], [54.9207361, 82.5138259667, "2/314"], [54.9562101, 82.5616106, "972"], [54.9204318667, 82.5155629167, "1/319"], [54.9203768167, 82.5151516333, "2/319"], [54.91788475, 82.51599185, "3/319"], [54.9208983667, 82.5150343667, "322"], [54.9207446167, 82.5174052333, "355"], [54.9213706667, 82.5182903833, "364"], [54.9209673667, 82.5228385667, "381"], [54.9121427, 82.48111095, "1"], [54.9210744167, 82.526721, "398"], [54.92060065, 82.5267811333, "421"], [54.9203042167, 82.53031625, "441"], [54.9205438667, 82.5322192667, "472"], [54.95440025, 82.5603198167, "949"], [54.9549745833, 82.5610077, "955"], [54.9557622833, 82.5620862333, "971"], [54.95699575, 82.56162575, "976"], [54.96071475, 82.5671597833, "1043"], [54.95945125, 82.5654647667, "1048"], [54.9618459333, 82.56799375, "1/1049"], [54.9616152833, 82.5678077833, "2/1049"], [54.9661303667, 82.5708020833, "2/1111"], [54.9667493333, 82.57131025, "1115"], [54.96711415, 82.5715806667, "1117"], [54.9675804833, 82.5719935, "1121"], [54.9684296167, 82.5727105333, "1133"], [54.9470393333, 82.5592361, "859"], [54.91908795, 82.5034454, "1/222"], [54.9190107333, 82.5030951833, "2/222"], [54.9182063667, 82.4975724833, "162"], [54.9215276333, 82.5398657167, "338"], [54.9214903, 82.5403513167, "347"], [54.9192073833, 82.5385113667, "60"], [54.9194124167, 82.53863005, "70"], [54.9202965333, 82.5390272333, "170"], [54.9202201333, 82.5394256333, "187"], [54.9200427667, 82.5393355, "165"], [54.9196745333, 82.5387265333, "110"], [54.9196443833, 82.5391287333, "113"], [54.9200210333, 82.5388776, "148"], [54.9198508167, 82.5392385667, "139"], [54.9198443833, 82.53880195, "130"], [54.92078415, 82.5393372, "240"], [54.9203728, 82.5395211833, "205"], [54.92054995, 82.5391807, "218"], [54.9207016833, 82.53928345, "222"], [54.9204983167, 82.5396219333, "225"], [54.9206377, 82.5392380167, "220"], [54.9209028833, 82.53941765, "1/258"], [54.9206256667, 82.5397483667, "243"], [54.92098855, 82.5394799, "2/258"], [54.9211211, 82.54010905, "303"], [54.9207808, 82.5398586, "261"], [54.9209433167, 82.5399736333, "285"], [54.9210710833, 82.53953355, "3/258"], [54.9213220667, 82.54020665, "325"], [54.9213740167, 82.5397642, "320"], [54.9216746167, 82.5399703333, "356"], [54.9217735667, 82.5401128333, "370"], [54.9216458, 82.5405448833, "373"], [54.92187255, 82.54025525, "386"], [54.9219284333, 82.5408441667, "401"], [54.9103304833, 82.4721328333, "10"], [54.9102787167, 82.4719914, "11"], [54.9108774833, 82.4715148, "1"], [54.91067615, 82.4716186, "3"], [54.9107711833, 82.4719261333, "4"], [54.9105010667, 82.4716637167, "5"], [54.9106344833, 82.4720128, "6"], [54.9103480333, 82.4717653333, "7"], [54.91015655, 82.4718258167, "9"], [54.9104869167, 82.47212505, "8"], [54.8164228, 82.5139775667, "1"], [54.8062942167, 82.5133165, "174"], [54.8153860333, 82.5132536167, "21"], [54.8101489667, 82.5102431, "70"], [54.81422025, 82.5124331667, "36"], [54.8662685833, 82.38685585, "101"], [54.8696932667, 82.3909689667, "156"], [54.86591225, 82.38439815, "82"], [54.8665148, 82.3851989333, "100"], [54.8672423833, 82.385944, "102"], [54.8633081833, 82.3778155667, "18"], [54.8628883333, 82.3783555833, "20"], [54.8633668167, 82.3794526667, "34"], [54.8687968833, 82.3875604333, "124"], [54.87375745, 82.4073473, "309"], [54.871102, 82.3963777667, "206"], [54.8643377167, 82.3813198167, "48A"], [54.8647317667, 82.38235055, "62"], [54.8653946, 82.3839015333, "72"], [54.8691804167, 82.3885183, "136"], [54.8695428667, 82.3900536333, "150"], [54.8708532667, 82.3954820167, "200"], [54.8696376833, 82.3931483, "165"], [54.8708364167, 82.3980991167, "221"], [54.8769260167, 82.3983096333, "256B"], [54.8739190333, 82.4060778667, "298"], [54.8736307833, 82.4070128, "307"], [54.8743770667, 82.4077305, "316"], [54.8703100667, 82.3894640833, "146"], [54.8697010667, 82.39052375, "154"], [54.8641413167, 82.3808931667, "48E"], [54.8673080333, 82.3779883667, "48B"], [54.8673718333, 82.3785550833, "48C"], [54.8674977833, 82.3793694333, "48D"], [54.86895095, 82.3799414833, "66B"], [54.8626150667, 82.3776425167, "14"], [54.87166565, 82.3986665667, "254A"], [54.8723313833, 82.4007501, "256A"], [54.8728116833, 82.4024396333, "276A"], [54.8735445333, 82.4044031333, "276B"], [54.8788183833, 82.3998753, "276C"], [54.8700288, 82.39251035, "170"], [54.8700618833, 82.3926480833, "172"], [54.87032565, 82.3935790167, "182"], [54.87129395, 82.3971019667, "210"], [54.8684687167, 82.3787688, "66A"], [54.86917345, 82.3816180667, "66"], [54.8994036333, 82.46781995, "2"], [54.89908445, 82.46789945, "3"], [54.8992924, 82.46819555, "4"], [54.8990193667, 82.4681169167, "5"], [54.8994638333, 82.46840135, "6"], [54.8988995167, 82.4683006333, "7"], [54.8992033, 82.46852295, "8"], [54.8866583833, 82.4532039667, "33F"], [54.8864233833, 82.4521969667, "32"], [54.8866203333, 82.4534927833, "33E"], [54.8874682, 82.45179065, "24A"], [54.8826686, 82.4521089833, "48"], [54.8871881167, 82.4517683, "26A"], [54.8891620833, 82.4522299333, "2A"], [54.8870288833, 82.458263333, "28A"], [54.8847421333, 82.4521349667, "46"], [54.8866198667, 82.4517700333, "30A"], [54.8847517, 82.4530716833, "49"], [54.8864979167, 82.4517625333, "32A"], [54.8877413167, 82.4522157, "22"], [54.8875273, 82.4522017833, "24"], [54.8886485, 82.4522158667, "10"], [54.8863276167, 82.4526999167, "39"], [54.8872459167, 82.4521917333, "26"], [54.8869694333, 82.4521850167, "28"], [54.8884949833, 82.4526693667, "11"], [54.8884365167, 82.4522167833, "12"], [54.8883604667, 82.45266065, "13"], [54.88909265, 82.4527732833, "1A"], [54.8890918, 82.4526509167, "1"], [54.8892247667, 82.4522300833, "2"], [54.8889543167, 82.4526548333, "3"], [54.88878835, 82.4526679667, "5"], [54.8879826333, 82.4526516667, "17"], [54.8879732333, 82.4522717, "18"], [54.8876465167, 82.4529919333, "21"], [54.8874666333, 82.4526953333, "23"], [54.88718005, 82.45269155, "27"], [54.88667215, 82.4527091167, "35"], [54.8865333667, 82.452713, "37"], [54.8869211167, 82.4527025667, "31"], [54.8889064667, 82.45167665, "6"], [54.8887104, 82.4530365333, "7"], [54.8888331333, 82.45221635, "8"], [54.8886320167, 82.4530411167, "9"], [54.8866415, 82.4537552833, "33D"], [54.8868032, 82.4537838167, "33C"], [54.8868312167, 82.45354015, "33B"], [54.8868582, 82.4532279333, "33A"], [54.8867126, 82.4521915667, "30"], [54.89138475, 82.4647044, "31"], [54.8884147667, 82.4636648, "60B"], [54.8944636333, 82.4644644833, "10A"], [54.8944416833, 82.4645756833, "10"], [54.8941219, 82.46491495, "11"], [54.8943222167, 82.4642833333, "12A"], [54.8930367667, 82.4648168, "15A"], [54.8931255, 82.4648136167, "15B"], [54.8931035167, 82.4644127333, "18"], [54.89292315, 82.4648254167, "19"], [54.8942371, 82.4645572667, "12"], [54.89397735, 82.4649136, "13"], [54.89409845, 82.4643458667, "14"], [54.89391375, 82.4645277333, "16"], [54.8929680833, 82.4643951, "20"], [54.8927348833, 82.46480795, "21"], [54.8928157667, 82.46437875, "22A"], [54.8927337833, 82.4643644833, "22"], [54.8925561167, 82.46478985, "23"], [54.8923608833, 82.4647155, "25A"], [54.8924641833, 82.46493565, "25"], [54.8949511, 82.4649854, "1A"], [54.8922117333, 82.4647047167, "27"], [54.8915681667, 82.4646986833, "29"], [54.8913701667, 82.4642759667, "30A-30D"], [54.8913990167, 82.4642620667, "30"], [54.8913092333, 82.46425895, "32"], [54.8912003667, 82.46469755, "33"], [54.8911230333, 82.4642383333, "34A"], [54.8911486667, 82.46399235, "34B"], [54.8911019, 82.4642380167, "34"], [54.89098895, 82.4646725333, "35"], [54.89084255, 82.4642192333, "36A"], [54.8909496167, 82.46422895, "36B"], [54.8908606333, 82.4642211667, "36"], [54.8948280833, 82.46498935, "3"], [54.8908666333, 82.4646632833, "37"], [54.8907759333, 82.4646549833, "39A"], [54.8907216667, 82.4646473167, "39B"], [54.8906578833, 82.4646450333, "39C"], [54.8905375667, 82.4646237167, "41"], [54.8904761833, 82.4646328667, "43"], [54.8902941833, 82.4641657667, "44A"], [54.8902406833, 82.46415805, "44B"], [54.8903436667, 82.4641675667, "44"], [54.89028625, 82.46460345, "45"], [54.8901877167, 82.4641515667, "46A"], [54.89013315, 82.4641537667, "46B"], [54.8949605167, 82.4645740333, "4"], [54.8900607167, 82.4645841333, "47"], [54.8900176, 82.4641449833, "48"], [54.8899419667, 82.464572, "49A"], [54.88987475, 82.4645733833, "49B"], [54.8898110667, 82.4645667333, "49C"], [54.8896632167, 82.4645695333, "49D"], [54.8898541333, 82.46475255, "49E"], [54.8897567333, 82.4647629, "49F"], [54.8896634667, 82.4647669667, "49G"], [54.8898924167, 82.4641263833, "50"], [54.8897574667, 82.4641326833, "52"], [54.8889242333, 82.4640623167, "54"], [54.88865535, 82.4644431167, "55"], [54.8887946833, 82.4638054667, "56A"], [54.8946296667, 82.4649645, "5"], [54.8887812167, 82.4640600833, "56"], [54.8884208167, 82.46442915, "57"], [54.8886385667, 82.4637760833, "58A"], [54.8886053667, 82.4640482, "58"], [54.8882043667, 82.4644158333, "59"], [54.8885028333, 82.463677, "60A"], [54.88839355, 82.4640293333, "60"], [54.8879652167, 82.4644074, "61"], [54.8877446333, 82.46437685, "63"], [54.8881502667, 82.4640036667, "64"], [54.8879700167, 82.4639859333, "66"], [54.8878033167, 82.4639686667, "68"], [54.8947931167, 82.4646081167, "6A"], [54.8948649333, 82.4643251333, "6"], [54.8944518833, 82.4649523167, "7"], [54.8946088333, 82.4645449667, "8"], [54.89429465, 82.4649376, "9"], [54.8951769667, 82.4645875167, "2"], [54.88757625, 82.46390195, "70"], [54.8940272667, 82.4652238, "11A"], [54.8929316167, 82.4651907833, "19A"], [54.8910516167, 82.4651865667, "35A"], [54.8950131667, 82.4649995667, "1"], [54.8946681667, 82.4642288167, "8A"], [54.8950832, 82.4643562167, "2A"], [54.89289445, 82.4639297667, "1/22-11/22"], [54.8839810833, 82.4856866167, "3"], [54.8839609167, 82.4862087667, "4"], [54.8813706667, 82.4859932667, "25"], [54.8815762, 82.4860593167, "23"], [54.88176925, 82.48611695, "21"], [54.8819291833, 82.4861440667, "19"], [54.8812535167, 82.48626755, "28"], [54.8814419833, 82.486341, "26"], [54.8816454, 82.486407, "24"], [54.8817836833, 82.4864573167, "22"], [54.8823392667, 82.4866145167, "20"], [54.8824710167, 82.4866385333, "18"], [54.8823897, 82.4862189833, "17"], [54.8810208833, 82.4857673833, "27"], [54.8809241333, 82.4860744, "32"], [54.8810838833, 82.4862027833, "30"], [54.8807501667, 82.4855223, "35"], [54.8809029, 82.48565165, "33"], [54.88077235, 82.4859607667, "34"], [54.8805942833, 82.48538215, "37"], [54.8806738833, 82.48500715, "39"], [54.8804429167, 82.4856392833, "36"], [54.8806746667, 82.48474885, "41"], [54.8802171333, 82.4854475, "38"], [54.8800456167, 82.4853260167, "40"], [54.8805906167, 82.4847991833, "43"], [54.8803164833, 82.4846505, "49"], [54.8803990833, 82.4851850833, "45"], [54.8802597333, 82.4850626167, "47"], [54.8800347333, 82.4849136333, "53"], [54.88023585, 82.4846241, "51"], [54.87911725, 82.4844298333, "63"], [54.8793032, 82.4845327167, "61"], [54.8794998, 82.48456245, "59"], [54.8796728333, 82.48464225, "57"], [54.8798386, 82.4844502667, "55B"], [54.87985855, 82.4847564333, "55"], [54.8798501167, 82.4851561333, "42"], [54.8792051, 82.48470885, "65"], [54.8796635, 82.4850343667, "44"], [54.8834352333, 82.4858534667, "5"], [54.8832857667, 82.4859341667, "7"], [54.88359745, 82.4863355833, "8"], [54.8830905833, 82.4860275333, "9"], [54.88377265, 82.48624865, "6"], [54.8826329333, 82.4866849167, "16"], [54.8825409333, 82.4862091167, "15"], [54.8827294333, 82.4862135, "13"], [54.8834279333, 82.4864298333, "10"], [54.8832412, 82.4865308833, "12"], [54.883058, 82.4865957667, "14"], [54.8828529667, 82.4861158333, "11"], [54.8834473167, 82.3733817, "7"], [54.8821477, 82.3739511333, "17"], [54.8835727833, 82.3742963167, "4"], [54.8829996167, 82.37376495, "11"], [54.8799677333, 82.3744603833, "49"], [54.8801634167, 82.37443835, "43"], [54.8131783667, 82.38169875, "10"], [54.8129868833, 82.3819189, "8"], [54.8122474333, 82.3825065833, "6C"], [54.8130850833, 82.3823078833, "6A"], [54.8124561333, 82.38300715, "6B"], [54.81348525, 82.3804658333, "12"], [54.81168165, 82.3801314, "16B"], [54.8110145667, 82.3801371167, "16C"], [54.8106325333, 82.3808725167, "16D"], [54.8105196, 82.379982, "16E"], [54.8134586333, 82.37986425, "16A"], [54.8608434833, 82.4499011, "43"], [54.8612150667, 82.44990305, "45"], [54.8618689167, 82.4498981167, "47"], [54.86239125, 82.4505662333, "49"], [54.8626794667, 82.4498931333, "51"], [54.86272035, 82.4492676833, "53"], [54.86160045, 82.4492898833, "55"], [54.8830900667, 82.48706325, "2"], [54.8833400667, 82.4873493167, "3"], [54.88330455, 82.4870247333, "4"], [54.8835654833, 82.4872303, "5"], [54.8835200667, 82.48693185, "6"], [54.8837668167, 82.4872335833, "7"], [54.88372005, 82.48686615, "8"], [54.88385335, 82.4870479667, "9"], [54.8831409167, 82.4873846167, "1"], [54.8838673, 82.4868328833, "10"], [54.88305215, 82.4682743333, "2"], [54.8832460833, 82.4683237, "3"], [54.8833727333, 82.4683497167, "4"], [54.8833539333, 82.4684306333, "5"], [54.8832353667, 82.4684359833, "6"], [54.8356606333, 82.4259896, "44"], [54.8361144333, 82.4254149667, "39"], [54.8298011333, 82.4247086333, "97"], [54.8328783, 82.4254824333, "73"], [54.8326006333, 82.42427305, "71"], [54.831938, 82.42577585, "85"], [54.8296909667, 82.4253358667, "98A"], [54.8304079333, 82.42640705, "98B"], [54.9136688833, 82.47027315, "11"], [54.9136547333, 82.47069685, "10"], [54.9138316333, 82.4708094833, "12"], [54.9137826667, 82.4703954167, "16"], [54.91318695, 82.4705625333, "1"], [54.913282333, 82.4701367, "3"], [54.9134621167, 82.47077345, "4"], [54.9134043833, 82.47044285, "5"], [54.9136208, 82.4710819333, "6"], [54.91350565, 82.47029995, "7"], [54.9137004667, 82.4710525667, "8"], [54.9135834833, 82.4699601167, "9"], [54.8994691333, 82.46256515, "2"], [54.8995118667, 82.4628252833, "2A"], [54.8995123, 82.4630041667, "2B"], [54.8994579333, 82.4622181667, "1"], [54.8974378833, 82.4617671667, "28"], [54.8974075167, 82.4619900333, "26"], [54.89761855, 82.4608725333, "25"], [54.8977565167, 82.4606562, "27"], [54.8979072833, 82.4605283333, "29"], [54.89808565, 82.4603934333, "31"], [54.8982804333, 82.46037375, "33"], [54.89837375, 82.4602651333, "35"], [54.89802395, 82.46003665, "50"], [54.8978844167, 82.4601356167, "48"], [54.8977532, 82.4602402333, "46"], [54.8976160167, 82.4603286167, "44"], [54.89819545, 82.4599255167, "52"], [54.8974890167, 82.4604333667, "42"], [54.8973825833, 82.46056285, "40"], [54.8984307833, 82.4623306333, "14"], [54.8993176, 82.46225845, "3"], [54.8982570167, 82.4622604, "16"], [54.89807915, 82.4621847167, "18"], [54.8979096167, 82.46211465, "20"], [54.8977295167, 82.4620442, "22"], [54.8983868833, 82.4619344833, "11"], [54.8982446, 82.4618734, "13"], [54.8980852, 82.46182235, "15"], [54.8979221167, 82.4617471667, "17"], [54.8977388167, 82.4616313167, "19"], [54.8975900833, 82.4619512333, "24"], [54.8976432833, 82.4613693, "21"], [54.8976362833, 82.4611184667, "23"], [54.8973338667, 82.4610383, "34"], [54.89734735, 82.46128405, "32"], [54.8973671167, 82.4615326833, "30"], [54.8983740833, 82.4600625, "37"], [54.8973341333, 82.46074505, "38"], [54.8971390333, 82.46087135, "36"], [54.8986548667, 82.4624186833, "12"], [54.89883265, 82.462497, "10"], [54.8990063167, 82.46257255, "8"], [54.8991676833, 82.4626289833, "6"], [54.8993200333, 82.4626184667, "4"], [54.8990043833, 82.4621885667, "7"], [54.8988871333, 82.4621417, "9"], [54.8991505333, 82.4622658, "5"], [54.9839604, 82.45833975, "21"], [54.9833674167, 82.4588416833, "15"], [54.8359882667, 82.4393378167, "84"], [54.81988195, 82.4304131333, "303"], [54.8180250667, 82.4265244667, "359"], [54.8183922667, 82.42604195, "361"], [54.8176359333, 82.4250678167, "377"], [54.8345467667, 82.4387839833, "99"], [54.83385615, 82.4387189, "107"], [54.80686185, 82.4025271167, "621E"], [54.8072254833, 82.4031670833, "621F"], [54.8157959333, 82.4221578, "401B"], [54.8061875667, 82.401462, "621A"], [54.8058821833, 82.4010980167, "621B"], [54.81469335, 82.4231989, "406"], [54.8174082667, 82.4176129667, "413"], [54.8141161167, 82.4226544167, "416"], [54.8138467167, 82.4215990833, "419"], [54.8135359833, 82.4220777667, "424"], [54.81227475, 82.4238289333, "426"], [54.81351715, 82.4209686667, "431"], [54.8344727, 82.43943635, "100"], [54.8341482167, 82.4394138833, "102"], [54.8335249, 82.4387248167, "111"], [54.8332444167, 82.4386937167, "113"], [54.8258899667, 82.4354216333, "201"], [54.8207155167, 82.4310458, "287"], [54.82205395, 82.4322644, "273"], [54.82211345, 82.4333285833, "268"], [54.8116728667, 82.4194537167, "440A"], [54.8113214333, 82.4130010333, "491A"], [54.8163042833, 82.4288074167, "348B"], [54.81563165, 82.4286594, "348A"], [54.8059561833, 82.41024335, "566"], [54.8054795833, 82.3996853333, "621D"], [54.8049338667, 82.4001146333, "621C"], [54.8194743833, 82.42997115, "315"], [54.8179959833, 82.4296346167, "328"], [54.8184434333, 82.4287788333, "327"], [54.8064376833, 82.406161, "597B"], [54.8062919333, 82.4056468333, "597C"], [54.8165707167, 82.4301424, "336B"], [54.8172738, 82.4285947167, "336A"], [54.8189469333, 82.4303026167, "312A"], [54.81940555, 82.4307701833, "312B"], [54.8199143667, 82.4312459, "300"], [54.882767667, 82.4291582, "334"], [54.8152067667, 82.4162956667, "441B"], [54.8142325667, 82.4148164667, "441D"], [54.8149509, 82.4159546667, "441C"], [54.815999, 82.482927333, "441A"], [54.80413515, 82.4042530167, "612"], [54.8036285, 82.4024796333, "627B"], [54.8014316833, 82.4040596333, "636"], [54.8026355333, 82.4024570667, "638"], [54.8046866167, 82.4038756333, "613"], [54.8028006833, 82.4016926167, "639A"], [54.8015622167, 82.408231, "652"], [54.8004875333, 82.4008727667, "670"], [54.7997891, 82.40002805, "676"], [54.8083442333, 82.4139592833, "509"], [54.8074935333, 82.4139840667, "532"], [54.8072659167, 82.4124669333, "543"], [54.8081279, 82.40823995, "567A"], [54.8087099667, 82.4071535667, "567C"], [54.804962, 82.4071512, "586"], [54.8046189167, 82.4061273333, "598"], [54.8052894167, 82.4083249, "576"], [54.8060052167, 82.4083508333, "571"], [54.8053679167, 82.4062368, "597A"], [54.8051049667, 82.4051947167, "607"], [54.8089437667, 82.4076931167, "567B"], [54.8113679833, 82.4200005667, "440B"], [54.8112042667, 82.482891, "463"], [54.8114033, 82.4191389167, "442"], [54.81667955, 82.4240415167, "387"], [54.8160871, 82.4248795, "390"], [54.81503135, 82.4226562, "401A"], [54.8158879667, 82.42335465, "393"], [54.8104159333, 82.41701115, "477"], [54.84176295, 82.4387852167, "25"], [54.8394856333, 82.43871765, "53"], [54.84315575, 82.4396268667, "4"], [54.8382764833, 82.4387401333, "65"], [54.8365486833, 82.4387233, "81"], [54.83550145, 82.4387130167, "91"], [54.8063373333, 82.40984385, "565A"], [54.8068884167, 82.4101122333, "553"], [54.8073266833, 82.40938595, "565B"], [54.8022880667, 82.4015246833, "647"], [54.8032717167, 82.3994722333, "649"], [54.8125184833, 82.4206463, "432A"], [54.8131087167, 82.4214898833, "432D"], [54.81219155, 82.4220903333, "432B"], [54.8123494833, 82.4226102667, "432C"], [54.8323999167, 82.4388484167, "113/1"], [54.8137884667, 82.4184721333, "439B"], [54.8128705833, 82.4202196333, "439A"], [54.8030845, 82.4029651, "634"], [54.80229035, 82.4038689333, "634A"], [54.8016416, 82.4044987167, "634B"], [54.8040659833, 82.4028728333, "627A"], [54.8039385667, 82.4012164167, "627C"], [54.8041331833, 82.4011953333, "627D"], [54.8104539833, 82.4114936333, "501"], [54.8095276, 82.41551535, "491C"], [54.8104942333, 82.4142607333, "491B"], [54.8118822333, 82.4251615167, "426A"], [54.9146426833, 82.46333945, "8"], [54.9146966667, 82.4641698333, "12"], [54.9148385667, 82.4646229167, "14"], [54.9145846833, 82.4637018, "10"], [54.9148759167, 82.4632119667, "6"], [54.9150353667, 82.4631399, "4"], [54.8791983833, 82.48491125, "1"], [54.8794456833, 82.4852828333, "4"], [54.8795405, 82.4855742333, "6"], [54.8796772167, 82.4856965, "8"], [54.87980185, 82.4857916833, "10"], [54.8796864, 82.4861288, "15"], [54.8797264167, 82.4859489333, "12"], [54.8795614, 82.4860496167, "13"], [54.8794049667, 82.4858653167, "11"], [54.8792908167, 82.4856798667, "9"], [54.8791893, 82.4854042167, "5"], [54.879194, 82.4855697, "7"], [54.87919295, 82.4851510333, "3"], [54.9021503333, 82.4819923833, "1"], [54.9020893333, 82.4817469667, "2"], [54.90202325, 82.4814764333, "3"], [54.90189885, 82.4813368167, "4"], [54.9017681, 82.4813746667, "5"], [54.9017408667, 82.4815826667, "6"], [54.9018523, 82.4818607167, "7"], [54.90192475, 82.4821145, "8"], [54.9122682, 82.46593575, "11"], [54.9122654667, 82.4666392333, "2"], [54.9124824333, 82.4664875, "1"], [54.9126646667, 82.4661762167, "3"], [54.9121691, 82.4663371, "4"], [54.9126312167, 82.4661364333, "5"], [54.9121084167, 82.46614215, "6"], [54.91239705, 82.46620525, "7"], [54.912165, 82.4659997167, "8"], [54.91234125, 82.4659673167, "9"], [54.8640527833, 82.4896800333, "1/239"], [54.8637439833, 82.4893278333, "2/239"], [54.8399393, 82.4691242833, "563"], [54.8403040167, 82.4695932333, "555"], [54.8626741167, 82.4890199667, "250"], [54.86235545, 82.4877547333, "263"], [54.8621190833, 82.4881775833, "260"], [54.8697908333, 82.4976855333, "2/143"], [54.8696097167, 82.50222845, "109"], [54.8650994667, 82.4906942667, "217"], [54.8587062667, 82.4842270833, "308"], [54.8585393667, 82.4832368167, "323"], [54.856982, 82.4821791333, "337"], [54.8557220333, 82.4813075, "357"], [54.87269675, 82.51109805, "9"], [54.86818685, 82.4965807167, "154"], [54.8391881333, 82.4691244833, "570"], [54.8392424167, 82.4682793833, "573"], [54.8384787167, 82.4682486667, "580"], [54.8380699833, 82.4677177667, "586"], [54.83591845, 82.4652008167, "1/620"], [54.8356297, 82.4656015333, "2/620"], [54.85443655, 82.48126465, "362"], [54.8543465667, 82.4803770667, "363"], [54.8533677, 82.4796417833, "383"], [54.8400570333, 82.4693165167, "559"], [54.8701502, 82.5066921333, "58"], [54.8688167, 82.5031792667, "94"], [54.8633276833, 82.48971255, "240"], [54.84499075, 82.47397555, "489"], [54.8390078667, 82.4675286, "579"], [54.8615817667, 82.4874484667, "272"], [54.8611261, 82.48692335, "1/276"], [54.8609821, 82.48677485, "2/276"], [54.8443942167, 82.4735167, "491"], [54.84453425, 82.4741157833, "490"], [54.8728439333, 82.5114111333, "5"], [54.8479137833, 82.47588805, "449"], [54.8694130667, 82.5004653167, "118"], [54.8381128333, 82.4689194667, "578"], [54.8387493167, 82.4686557833, "576"], [54.834946, 82.4616395, "648"], [54.8355279667, 82.4648596667, "626"], [54.8352287, 82.46082495, "670"], [54.84359945, 82.4735256167, "500"], [54.8437138833, 82.4730056833, "501"], [54.8433661667, 82.4727594167, "511"], [54.8429640667, 82.4725448333, "513"], [54.8424090833, 82.4720656833, "517"], [54.8419261, 82.4716311333, "529"], [54.84138045, 82.4707106667, "535"], [54.8407243, 82.4700550167, "551"], [54.84032605, 82.4702964, "552"], [54.8397895, 82.46968935, "562"], [54.83966945, 82.4688137833, "567"], [54.8458821833, 82.4743360167, "479"], [54.8523557667, 82.4795548667, "394"], [54.8519909833, 82.4785619833, "401"], [54.85128865, 82.4790768167, "408"], [54.8505837, 82.4777973667, "419"], [54.8494416833, 82.4767902167, "429"], [54.8501747833, 82.478082, "422"], [54.8487495333, 82.477303, "446"], [54.8613924167, 82.4866768333, "275"], [54.8612592667, 82.48651665, "277"], [54.8606625, 82.4863779, "280"], [54.8602587667, 82.4860168333, "288"], [54.8662275, 82.4932509, "192"], [54.8656668, 82.4925030333, "206"], [54.8718011, 82.50936105, "31"], [54.871327, 82.50837775, "41"], [54.8481012833, 82.4755436333, "455"], [54.8662202833, 82.4971715833, "2/164"], [54.8665327833, 82.4968656167, "1/164"], [54.87262005, 82.5101317, "11"], [54.8407464167, 82.4693628, "553"], [54.8687301, 82.50368985, "92"], [54.8576066333, 82.4826215667, "331"], [54.867679, 82.4952846833, "164"], [54.8698948833, 82.4990379333, "133"], [54.8639344, 82.49046205, "230"], [54.8645916667, 82.4912248333, "224"], [54.8710460833, 82.50036065, "125"], [54.8694796667, 82.4976021667, "1/143"], [54.8733131, 82.4691004333, "3A"], [54.87406055, 82.4694125667, "6A"], [54.8735341167, 82.469327, "5"], [54.8735109667, 82.46960345, "7"], [54.87351105, 82.4698807333, "11"], [54.8735358667, 82.47009225, "13"], [54.8736709667, 82.4702864167, "17"], [54.8737941667, 82.47025885, "16"], [54.8738211333, 82.4693453167, "4"], [54.8737987667, 82.46968045, "8"], [54.8738769167, 82.4699632, "10"], [54.8739402833, 82.4701521167, "12"], [54.8732443833, 82.4692419333, "3B"], [54.8740679833, 82.4695514833, "6B"], [54.8739830167, 82.4704122667, "14"], [54.8735580667, 82.4702317, "15"], [54.87328745, 82.4697687167, "9"], [54.8738628167, 82.46909085, "2"], [54.8735833, 82.4690007, "1"], [54.9140601833, 82.4734438833, "1"], [54.91414235, 82.4726753, "7A"], [54.9148196333, 82.4729240333, "4"], [54.9145959167, 82.4727449, "5"], [54.9144294, 82.4728081667, "6"], [54.9142862333, 82.4729454, "7"], [54.9140804667, 82.4729594, "8"], [54.91442545, 82.4732771, "2A"], [54.9146292, 82.47320695, "3"], [54.9142898833, 82.4733283333, "2"], [54.8924708, 82.4694829667, "3"], [54.8921866833, 82.4690726, "4-6"], [54.8744290667, 82.4729675333, "16"], [54.8747743333, 82.4729266667, "17"], [54.8743306833, 82.4749814667, "2"], [54.8743712167, 82.4747777167, "4"], [54.8743979833, 82.4745281667, "6"], [54.8744096167, 82.47429405, "8"], [54.8744245167, 82.4740094333, "10"], [54.8744545333, 82.4736160667, "12"], [54.8742322333, 82.47382395, "10A"], [54.87422675, 82.47369315, "12A"], [54.8742394, 82.4730406667, "16A"], [54.8742450667, 82.4731634667, "14A"], [54.8744790667, 82.4732784833, "14"], [54.8747754833, 82.4731559, "15"], [54.8747613167, 82.4734085833, "13"], [54.8747389, 82.4736529667, "11"], [54.8747211167, 82.47387885, "9"], [54.8747006167, 82.4741313, "7"], [54.8746909667, 82.4743708167, "5"], [54.8746798167, 82.4746769, "3"], [54.8748711167, 82.4748117167, "3A"], [54.8748328833, 82.4749142833, "1A"], [54.874621, 82.4750391, "1"], [54.8755351667, 82.4795168667, "6A"], [54.8754681, 82.4798997667, "6"], [54.8756842833, 82.4798735833, "8"], [54.8756412167, 82.4794951833, "8A"], [54.8758023167, 82.4803141667, "5"], [54.8757598667, 82.4801058, "7"], [54.8757471833, 82.4799721833, "9"], [54.8755322, 82.4802420833, "3"], [54.8753549833, 82.47993535, "4"], [54.888292, 82.4617109667, "4A"], [54.8820907333, 82.4622059833, "5"], [54.8815066, 82.4617161667, "4B"], [54.888234333, 82.4618948333, "6A"], [54.8815026667, 82.46184895, "6B"], [54.8815932167, 82.46217415, "10A"], [54.8817450167, 82.46226225, "10"], [54.8818722667, 82.4626555167, "11"], [54.8817309, 82.4624690333, "12"], [54.8821211333, 82.4617608833, "1"], [54.8817646833, 82.4615252167, "2A"], [54.8815099, 82.4615357667, "2B"], [54.88209615, 82.4619084, "3"], [54.8820657333, 82.4624910833, "7"], [54.8817491333, 82.4620671833, "8A"], [54.8814882667, 82.4620343, "8B"], [54.8820256333, 82.4626954, "9"], [54.9011387, 82.4845455833, "11A"], [54.9004465667, 82.4842316167, "6"], [54.9006268333, 82.4836419, "1"], [54.9005414333, 82.4845609667, "10"], [54.9009292833, 82.4847187667, "11"], [54.9009982, 82.48493945, "13"], [54.900608, 82.4848214333, "14"], [54.9002908667, 82.4835936167, "2"], [54.9003859333, 82.4839906667, "4"], [54.9007548667, 82.4840674, "5"], [54.9008090833, 82.4842714333, "7"], [54.90027845, 82.4844867667, "8"], [54.90087325, 82.4844819167, "9"], [54.9010882333, 82.4852001, "15"], [54.9007465833, 82.4850981333, "16"], [54.9008384, 82.48536275, "18"], [54.9009003833, 82.4836903667, "3A"], [54.9006948, 82.48386545, "3"], [54.8352114167, 82.3932620667, "614"], [54.8358616, 82.3932373667, "607"], [54.8527932167, 82.4481416, "66"], [54.8535776833, 82.4477748333, "59"], [54.8513053333, 82.4468875167, "88"], [54.8367923167, 82.39439545, "597"], [54.8356857333, 82.39511535, "594"], [54.8338485, 82.3905351667, "644"], [54.8342344833, 82.3914293833, "636"], [54.8349352, 82.39110985, "631"], [54.8340942167, 82.3894187167, "647"], [54.8361288, 82.3943564333, "603"], [54.835456, 82.3923533167, "621"], [54.8316758833, 82.3851704333, "690"], [54.82606465, 82.3729124, "823A"], [54.8360247333, 82.40845075, "472"], [54.8367576167, 82.4058547167, "499"], [54.8307850333, 82.3833224167, "716"], [54.8297911333, 82.3838338167, "722A"], [54.82856305, 82.3853371, "722B"], [54.8366530833, 82.4158296167, "407"], [54.8343563333, 82.3899946667, "645"], [54.83378605, 82.3887814833, "649"], [54.8383438833, 82.4167502667, "403A"], [54.8269138333, 82.3707719, "823B"], [54.8262433167, 82.37126425, "823C"], [54.8278735833, 82.3745076, "791C"], [54.82803615, 82.3751116833, "791B"], [54.8284354167, 82.3743400333, "791D"], [54.8283312333, 82.3722626167, "803H"], [54.8308135833, 82.3857800333, "700A"], [54.83039575, 82.3861873667, "700B"], [54.8297918, 82.3866039833, "700C"], [54.8323622833, 82.3869592167, "680A"], [54.8317271833, 82.3872918333, "680B"], [54.8320544167, 82.3863078833, "680C"], [54.8265114833, 82.3737262, "811A"], [54.8268406667, 82.37269475, "811B"], [54.8272920833, 82.3716203, "811C"], [54.8537437333, 82.4489413667, "62"], [54.83192005, 82.3841341833, "695"], [54.8368657833, 82.4028889833, "525"], [54.83376425, 82.3968886333, "590B"], [54.8299130333, 82.3859233667, "702C"], [54.8305810833, 82.38512625, "702B"], [54.8360455333, 82.4081179333, "474"], [54.8276760833, 82.3808082167, "756C"], [54.8283299333, 82.3802092167, "756B"], [54.85043345, 82.4461019, "100"], [54.8297131833, 82.38286445, "724A"], [54.82929325, 82.383521, "724B"], [54.8369757, 82.3983033667, "571"], [54.8376989333, 82.4166211, "403B"], [54.8368311167, 82.4050104667, "505"], [54.8412127667, 82.4050228833, "491A"], [54.83852105, 82.4062947, "491B"], [54.8338348833, 82.3934827333, "622B"], [54.8330032, 82.3939467333, "622C"], [54.8282068, 82.376844, "775A"], [54.8295163167, 82.3755049667, "775B"], [54.828404, 82.37718215, "775C"], [54.8362426, 82.39711805, "578"], [54.8361603, 82.39675875, "580"], [54.8424267833, 82.4340512167, "232"], [54.84114775, 82.4311295833, "272"], [54.82872315, 82.3709866833, "803A"], [54.8285930667, 82.3703004167, "803B"], [54.8294768667, 82.3691337, "803C"], [54.8292017, 82.36888125, "803D"], [54.8285291333, 82.36580345, "803E"], [54.8298995333, 82.3673114167, "803F"], [54.8302568833, 82.36760835, "803G"], [54.8267714167, 82.3742385167, "807"], [54.83126665, 82.3844291833, "702A"], [54.83016355, 82.3818740833, "734"], [54.8296635167, 82.3807643167, "742"], [54.82974665, 82.3798092, "747"], [54.829114, 82.3799039833, "752"], [54.8288072833, 82.3779985667, "765"], [54.8278203667, 82.3760339333, "789"], [54.8274609333, 82.3753562, "791A"], [54.8320049, 82.39796425, "592B"], [54.8304380667, 82.3993220667, "592C"], [54.8323366667, 82.3982387333, "592D"], [54.8332103167, 82.39666495, "590A"], [54.8362232667, 82.4049506333, "504"], [54.83689715, 82.4034307333, "523"], [54.8362677, 82.4030851833, "522"], [54.8363718333, 82.4003976167, "548"], [54.836423, 82.3953457167, "585"], [54.83596855, 82.3959414667, "586"], [54.8392194, 82.4133888333, "439"], [54.8367003667, 82.4102236167, "461"], [54.83586315, 82.412182333, "442"], [54.8387438833, 82.4244664667, "318"], [54.8382094333, 82.42266185, "346"], [54.8366223667, 82.4173578167, "396"], [54.8405799833, 82.4294097167, "284"], [54.8409799, 82.4286117333, "289"], [54.8404157, 82.4273133667, "291"], [54.8448297, 82.4386074, "188"], [54.8445996333, 82.4385307833, "190"], [54.8445953833, 82.4381869167, "192"], [54.8462362333, 82.4406972, "162"], [54.8453950333, 82.4394750167, "180"], [54.8561178167, 82.4522334, "11"], [54.8560307, 82.4511923667, "17"], [54.8361288, 82.4061807167, "492"], [54.83609445, 82.40683275, "490"], [54.8545275667, 82.44950565, "40"], [54.8375230333, 82.4199872333, "372"], [54.8388781167, 82.4226393667, "343"], [54.83701825, 82.41844345, "378"], [54.8371192833, 82.4187303167, "376"], [54.8373785667, 82.4194973167, "374"], [54.8367387167, 82.4085570167, "473"], [54.8318677333, 82.3858444, "688"], [54.8327873167, 82.3878064833, "674"], [54.83304365, 82.3883507667, "664"], [54.8366133333, 82.4130614667, "427"], [54.8508733333, 82.44641935, "94"], [54.8433085667, 82.4359371667, "212"], [54.8376679667, 82.3994774833, "549"], [54.8388004167, 82.3998009833, "549C"], [54.8369648167, 82.40033875, "549B"], [54.8376661833, 82.3999770333, "549A"], [54.8368055667, 82.3968196667, "575"], [54.8369513667, 82.39729965, "573"], [54.836328, 82.3975344167, "576"], [54.8419685667, 82.4332863667, "240"], [54.83147865, 82.3703224333, "781A"], [54.8302962167, 82.3727004833, "781B"], [54.8300511833, 82.3734676833, "781C"], [54.9155750333, 82.4788872333, "103"], [54.9080710333, 82.4815503833, "39C"], [54.9081354167, 82.48171275, "39B"], [54.90819845, 82.4819203833, "39A"], [54.9165609667, 82.4784770333, "115"], [54.91497395, 82.4792572167, "99"], [54.9096164833, 82.4817164167, "49"], [54.9116786667, 82.48074935, "69"], [54.9140226, 82.479658, "85"], [54.9069150833, 82.4829900333, "27A"], [54.9069469833, 82.4828211667, "27B"], [54.9141799333, 82.4796010667, "87"], [54.9148269, 82.4793132333, "95"], [54.9148061667, 82.47892315, "97"], [54.9052287833, 82.4834456667, "7A"], [54.9157397167, 82.4785532167, "107A"], [54.9164115167, 82.4783404167, "113"], [54.9162113333, 82.4786140333, "109"], [54.9159243667, 82.4787397833, "107B"], [54.91564195, 82.4783057333, "107"], [54.9095836167, 82.48142755, "49A"], [54.9097563, 82.4813824667, "51A"], [54.9142505167, 82.4798245, "89A"], [54.9143203667, 82.4795241, "89"], [54.9143582167, 82.4791171833, "91A"], [54.90809605, 82.4820482833, "37A"], [54.9080426833, 82.4818123, "37B"], [54.9079928333, 82.4816048, "37C"], [54.9144982167, 82.4794426833, "91"], [54.9146732833, 82.4793797, "93"], [54.9046052333, 82.48406395, "1"], [54.90479665, 82.4839646833, "3"], [54.9049845333, 82.4838759833, "5"], [54.9061106, 82.4833581667, "17"], [54.9062431667, 82.4833112333, "19"], [54.9063920333, 82.4832255333, "21"], [54.9065708, 82.48314765, "23"], [54.9067455333, 82.4830679333, "25"], [54.90686575, 82.4825972667, "29"], [54.9053759667, 82.4837128167, "11"], [54.9055325, 82.4836456167, "13"], [54.9057146333, 82.4835634667, "15"], [54.9080300333, 82.4824985, "35"], [54.9081798333, 82.4824187833, "37"], [54.90842625, 82.4822687667, "39"], [54.90871305, 82.4821525333, "43"], [54.9071454167, 82.4828962333, "31"], [54.90945405, 82.4818068167, "47"], [54.9097787167, 82.4816407833, "51"], [54.9101221667, 82.48147745, "55"], [54.9099619333, 82.4815613833, "53"], [54.9108703, 82.48113905, "57"], [54.9111010167, 82.4810227833, "61"], [54.9113033333, 82.4806476167, "63A"], [54.9113063333, 82.4809305333, "63"], [54.9113486333, 82.48054435, "65"], [54.9115162333, 82.4808384167, "67"], [54.9118321, 82.4806828667, "71"], [54.912005, 82.4805931333, "73"], [54.9126924, 82.4801856167, "75"], [54.9128904333, 82.48013955, "77"], [54.91306105, 82.4801038667, "79"], [54.91323275, 82.4800307667, "81"], [54.90504305, 82.48350075, "7"], [54.9161411, 82.4791161, "104"], [54.9052017167, 82.4837928833, "9"], [54.9048593333, 82.4837002833, "5A"], [54.9134008167, 82.4799760333, "83"], [54.91608025, 82.4781871, "111A"], [54.9159769333, 82.4778862, "111B"], [54.91609255, 82.4778227833, "111C"], [54.9162477333, 82.4781089667, "111D"], [54.8954434833, 82.47689195, "1"], [54.7968509833, 82.4409205333, "218"], [54.7967954, 82.4415974333, "226"], [54.79061135, 82.4311808833, "105"], [54.7936930167, 82.4323678167, "144"], [54.7936793, 82.4341171833, "169"], [54.7906754167, 82.4300550333, "101"], [54.7923387667, 82.4305234833, "114"], [54.7921506667, 82.4312033333, "119"], [54.79638115, 82.44350555, "244"], [54.9026378, 82.4249371167, "6"], [54.9018287167, 82.4251090167, "15"], [54.9005140167, 82.4267575167, "32"], [54.90030005, 82.4272810167, "36"], [54.9000367833, 82.4266413167, "1/45"], [54.8999172167, 82.4269248667, "2/45"], [54.8998128167, 82.42722285, "3/45"], [54.8997664167, 82.4278138333, "46"], [54.89874045, 82.42933485, "47"], [54.90246715, 82.4251130833, "8"], [54.98415945, 82.5440391833, "1/398"], [54.9842023, 82.5446759833, "398"], [54.9673053833, 82.5493618, "1/200"], [54.9595488167, 82.5503643667, "2/94"], [54.9548066833, 82.5547442167, "41"], [54.975043, 82.5502804667, "288"], [54.9674483333, 82.54948405, "2/200"], [54.9675936167, 82.54960055, "3/200"], [54.9536896833, 82.5558200833, "21"], [54.9537523333, 82.5551846667, "24"], [54.9758721, 82.55151395, "297"], [54.9715911333, 82.5505416, "246"], [54.97615305, 82.5531409833, "1/299"], [54.9759959833, 82.553822167, "2/299"], [54.9762314333, 82.5517778833, "3/299"], [54.9789959667, 82.5511051167, "1/317"], [54.9791978667, 82.5509703167, "2/317"], [54.97016405, 82.5511682333, "233"], [54.9840100667, 82.5422511833, "3/398"], [54.9832081667, 82.5409176, "4/398"], [54.9626150333, 82.5485202333, "1/142"], [54.9620708667, 82.5493090333, "139"], [54.9646945333, 82.5484742, "164"], [54.95884865, 82.5515776333, "91"], [54.9588039667, 82.5510064, "1/94"], [54.9794108833, 82.5497014333, "332"], [54.9806783167, 82.5477771, "352"], [54.8757744167, 82.46972585, "1"], [54.8758043667, 82.4700843, "3"], [54.8758559833, 82.4703261667, "5"], [54.8759855667, 82.4703921667, "7"], [54.8761207333, 82.4703036833, "9"], [54.8763731833, 82.4703581, "8B"], [54.8763879, 82.4701746167, "8A"], [54.8760971833, 82.4699428, "6"], [54.8763947, 82.46978015, "4"], [54.8760231167, 82.4695721, "2"], [54.84887105, 82.5612401333, "268"], [54.8480716667, 82.5605471, "1/271"], [54.8481743833, 82.5599216, "2/271"], [54.8475651333, 82.5602482833, "273"], [54.8549548833, 82.5645155167, "187"], [54.8590531333, 82.56929455, "111"], [54.8579502, 82.5697828667, "1/128"], [54.8577433333, 82.5697812167, "2/128"], [54.8663423167, 82.5687757833, "25"], [54.8659378833, 82.5701593333, "1/32"], [54.8656144667, 82.5703594167, "2/32"], [54.9075306667, 82.4735409, "8"], [54.90741835, 82.4736250333, "12"], [54.9077710167, 82.4736747, "3"], [54.90756245, 82.4735306833, "7"], [54.90776065, 82.4736345167, "4"], [54.9076790833, 82.4734552333, "6"], [54.90770165, 82.4734532167, "5"], [54.90742555, 82.4736053833, "11"], [54.9074725833, 82.4739170833, "14"], [54.9074575333, 82.47388525, "13"], [54.90752205, 82.4737226167, "10"], [54.9075427667, 82.4737034667, "9"], [54.9078406167, 82.4738848333, "1"], [54.9078192667, 82.4738328667, "2"], [54.907982667, 82.4742687333, "19"], [54.9076409333, 82.4739459, "15"], [54.9077643333, 82.4742689, "18"], [54.9077539833, 82.4742287, "17"], [54.9076577333, 82.47400055, "16"], [54.9079030333, 82.4742141667, "20"], [54.9156256167, 82.4748749833, "78"], [54.9146128333, 82.4721344167, "56A"], [54.9151661833, 82.4733835167, "66"], [54.9140138, 82.4694897, "30"], [54.9140857167, 82.46969035, "32"], [54.9144033, 82.4695158, "33"], [54.91414165, 82.4698978167, "34"], [54.91444875, 82.4697295833, "35"], [54.9142653833, 82.4703260667, "38"], [54.9142211667, 82.4701128667, "36"], [54.9155440833, 82.4732913, "65"], [54.9134283, 82.4674369333, "14"], [54.9155934667, 82.4735220833, "67"], [54.9151737667, 82.4721487333, "57"], [54.9155787333, 82.4746912167, "76"], [54.9143332167, 82.4693118167, "29"], [54.9151155, 82.4718793167, "55"], [54.9134783167, 82.4676862167, "16"], [54.91350365, 82.4678403, "18"], [54.9135371667, 82.4680652, "20"], [54.9135827167, 82.4682467, "22"], [54.9136676, 82.4684140667, "24"], [54.91375, 82.4685284833, "26"], [54.9144983333, 82.4699386333, "39"], [54.9145579833, 82.4701247833, "41"], [54.9146344333, 82.4703215833, "43"], [54.9140692167, 82.4706085833, "46"], [54.91469445, 82.47051275, "47"], [54.9143359333, 82.4705744833, "48"], [54.9147432833, 82.47069995, "49"], [54.9146982, 82.4717894167, "54"], [54.9147643333, 82.47204645, "56"], [54.91485235, 82.4723157167, "58"], [54.9149395167, 82.4725939833, "60"], [54.9144000333, 82.4707812, "50"], [54.9148043167, 82.4709096, "51"], [54.9157513167, 82.4752532333, "82"], [54.9158039333, 82.47545195, "84"], [54.9156901667, 82.4750640167, "80"], [54.9158563833, 82.4756482667, "86"], [54.91508355, 82.4731087, "64"], [54.9154807667, 82.4730812167, "63"], [54.9154616667, 82.4742882833, "72"], [54.9155282, 82.47449895, "74"], [54.9790357333, 82.4624267667, "19"], [54.9791358667, 82.4611471, "6"], [54.9797030333, 82.4636025333, "30"], [54.9790060167, 82.4621910833, "17"], [54.9786417667, 82.4608476833, "5"], [54.9804888333, 82.4691719, "83"], [54.9793757333, 82.4644864667, "37"], [54.9794654667, 82.4649678833, "39"], [54.9815936, 82.4721696167, "104"], [54.9806346333, 82.46753305, "62"], [54.9801957667, 82.4694512667, "1/83"], [54.9813943, 82.4789249667, "2/172"], [54.9811831333, 82.4791219167, "1/172"], [54.9815603333, 82.4787492833, "3/172"], [54.9817079333, 82.4785843667, "4/172"], [54.98098455, 82.4692836, "84"], [54.9797661167, 82.4828635833, "209"], [54.9819302167, 82.4751814833, "130"], [54.9810331167, 82.4792768333, "172"], [54.9791101833, 82.4807109667, "193"], [54.9211995833, 82.54297615, "118"], [54.9213446, 82.5421832, "105"], [54.9211681167, 82.54216685, "107"], [54.9209082667, 82.5425332333, "111"], [54.9208103667, 82.542655, "113"], [54.92117155, 82.5424739667, "109"], [54.9206148667, 82.5429439167, "119"], [54.9207782667, 82.5431801, "117"], [54.9210005833, 82.542809, "115"], [54.9223620333, 82.5419011, "44"], [54.9221513667, 82.5414861833, "22"], [54.9220122833, 82.54171955, "48"], [54.9214541667, 82.5419499167, "103"], [54.9216856333, 82.54226385, "110"], [54.92188255, 82.54189345, "70"], [54.9216037833, 82.5417236667, "79"], [54.9217873667, 82.5420768833, "90"], [54.9207292667, 82.5435594333, "127"], [54.9215061833, 82.5424147833, "112"], [54.9214096333, 82.5425683833, "114"], [54.9212674167, 82.5427841667, "116"], [54.9211160833, 82.5431952167, "120"], [54.9210373167, 82.5434004167, "122"], [54.9209575167, 82.5435602167, "124"], [54.9206745667, 82.5433710667, "125"], [54.92082745, 82.54361115, "128"], [54.9209216, 82.5437402667, "126"], [54.9205988167, 82.5431733333, "123"], [54.9204654167, 82.54300295, "121"], [54.9059849833, 82.4685779333, "10"], [54.9063778167, 82.4688591, "11"], [54.9057737333, 82.4693218333, "2"], [54.9064842, 82.4693450167, "7"], [54.9060801333, 82.46881255, "12"], [54.9060230333, 82.46940395, "1"], [54.9060816167, 82.4691977833, "3"], [54.90581185, 82.4691003833, "4"], [54.9063729333, 82.4693653667, "5"], [54.9058748833, 82.4689197333, "6"], [54.90586325, 82.46860955, "8"], [54.9064269833, 82.4690855667, "9"], [54.8955635667, 82.4714488333, "3"], [54.89574055, 82.4716702667, "6"], [54.8760291333, 82.4752209667, "4"], [54.8761012667, 82.4756677333, "5"], [54.8761172, 82.4749063833, "6A"], [54.8762485667, 82.4748657167, "6B"], [54.8765363167, 82.4750690167, "10"], [54.87633255, 82.4751297667, "8"], [54.8767972333, 82.4754502, "13"], [54.8767630833, 82.4749863833, "12"], [54.87581215, 82.4752698833, "2"], [54.8757609167, 82.4757446833, "1"], [54.8774312833, 82.4746756833, "25"], [54.87757445, 82.4749078, "23"], [54.8773315167, 82.4749104, "21"], [54.8772196833, 82.4750822833, "19"], [54.8771222167, 82.47521495, "17"], [54.8769752, 82.4753515167, "15"], [54.8766353, 82.47550835, "11"], [54.8764627667, 82.4755687833, "9"], [54.8762885333, 82.4756105, "7"], [54.8759247333, 82.4757173667, "3"], [54.8769794333, 82.4747672167, "14"], [54.97891525, 82.4601520333, "772"], [54.9464645333, 82.4822205167, "329"], [54.9470361333, 82.4829135, "337"], [54.9713491167, 82.4612835833, "684"], [54.9615547167, 82.4636732, "578"], [54.9642195, 82.4617228, "606"], [54.9214648167, 82.4783231833, "49"], [54.9212708833, 82.47781485, "1/49"], [54.9230265, 82.478089, "65"], [54.9669955167, 82.46143295, "653"], [54.9801441, 82.4596936833, "784"], [54.91909305, 82.4782088, "27"], [54.9278700667, 82.4760814333, "122"], [54.9393246667, 82.4798381833, "256"], [54.98099395, 82.4594168167, "788"], [54.9235198, 82.4765764833, "76"], [54.9838248833, 82.4507092333, "885"], [54.9840650667, 82.4492086167, "893"], [54.9819271833, 82.4584667833, "812"], [54.97680425, 82.4605180667, "746"], [54.9772555, 82.4612509, "751"], [54.9553357833, 82.4689185833, "484"], [54.9549016, 82.4705773167, "469"], [54.9549819, 82.4681984167, "492"], [54.95610765, 82.4687586833, "495"], [54.9558325167, 82.4681527833, "496"], [54.9563786, 82.4673479667, "506"], [54.9588897333, 82.4662872333, "549"], [54.9374805167, 82.4792935833, "232"], [54.9385204667, 82.4796240833, "250"], [54.9418827167, 82.48053625, "282"], [54.9422215667, 82.4814613667, "291"], [54.9452781, 82.4815002, "318"], [54.9482466667, 82.4790639833, "372"], [54.9497215167, 82.47691875, "396"], [54.9341688833, 82.4782591167, "196"], [54.9265146833, 82.4765383667, "109"], [54.93050445, 82.4778804333, "151"], [54.9283181, 82.4771124167, "129"], [54.9251162, 82.4762160667, "98"], [54.92343355, 82.4771558167, "73"], [54.9239441667, 82.4794231667, "75"], [54.9241087667, 82.4769972833, "83"], [54.9222823667, 82.4774759333, "61"], [54.9199369167, 82.4774060333, "34"], [54.9203899333, 82.475518, "36"], [54.9203777167, 82.4773256, "40"], [54.9206612167, 82.4765307833, "42"], [54.9210448, 82.4771433833, "44"], [54.9220389167, 82.47755095, "57"], [54.91929535, 82.4775611167, "26"], [54.9216718667, 82.4775874667, "55"], [54.98317275, 82.4515617, "874"], [54.9834542667, 82.449681, "890"], [54.94112955, 82.48040145, "278"], [54.9511382833, 82.4768400333, "401"], [54.9529536833, 82.4734404167, "447"], [54.9818127667, 82.4589793667, "794"], [54.9216345833, 82.4771334167, "50"], [54.9817718333, 82.4597500333, "789"], [54.8840469167, 82.4595505333, "3A"], [54.8836735833, 82.4604158333, "4B"], [54.88403835, 82.4600429333, "5"], [54.8834882, 82.4601379, "1A"], [54.88367125, 82.4597893667, "1"], [54.8835863, 82.4604458167, "2A"], [54.8835968, 82.4601401333, "2"], [54.88386135, 82.4597867, "3"], [54.88376075, 82.4601527667, "4"], [54.8838918833, 82.4601641667, "6"], [54.8842726667, 82.4597851667, "5A"], [54.8840725833, 82.4598049333, "3B"], [54.8976647333, 82.4710761333, "3"], [54.8975512333, 82.4708644667, "7"], [54.8973241167, 82.4703941833, "15"], [54.8972415667, 82.4702575667, "17"], [54.8973903333, 82.4705850167, "13"], [54.8974731667, 82.4707213, "9"], [54.8976014, 82.4709784167, "5"], [54.8973658833, 82.4713826333, "1"], [54.88263055, 82.4789374667, "2"], [54.88295785, 82.4787557167, "3"], [54.88262705, 82.4787408333, "4"], [54.8828655833, 82.47856665, "5"], [54.8826968, 82.4785708667, "6"], [54.8829381167, 82.4790952, "1"], [54.8829405833, 82.4789477, "1A"], [54.9471062833, 82.4443811, "285"], [54.9482693333, 82.4618783667, "129"], [54.9477489, 82.4616306833, "134"], [54.94778825, 82.4623992333, "120"], [54.9476318333, 82.4527723667, "205"], [54.9487271, 82.47377555, "22"], [54.9483278667, 82.4699560333, "64"], [54.9505486833, 82.475507, "3"], [54.9471956833, 82.45408385, "192"], [54.9474878167, 82.4494432167, "241"], [54.9465419167, 82.4494655333, "240"], [54.8980432167, 82.4818800667, "20"], [54.8980799167, 82.4813788167, "11"], [54.8979071, 82.4814689833, "11A"], [54.8976527, 82.4820540667, "10"], [54.8978225833, 82.48198855, "12"], [54.8980157833, 82.4823010833, "14"], [54.8981133, 82.4825153333, "18"], [54.8972657167, 82.48179755, "1"], [54.8982001167, 82.4818174667, "22"], [54.89831945, 82.48166055, "26"], [54.8974300667, 82.4821601, "2"], [54.8976037833, 82.4823142833, "6"], [54.8975959167, 82.4816213167, "7"], [54.8977532667, 82.48153515, "9"], [54.8985379, 82.4825481, "24"], [54.8966536667, 82.4826586833, "25A"], [54.8984072, 82.48528765, "54A"], [54.8960960167, 82.4812310167, "5"], [54.8976620167, 82.4837889667, "38"], [54.8957596833, 82.4808671833, "1"], [54.896049, 82.4808353333, "1A"], [54.89630705, 82.4808317833, "3"], [54.8980094, 82.4834140167, "34"], [54.89804835, 82.4835438167, "36"], [54.8978337, 82.483244, "30"], [54.8977234667, 82.4828271167, "26"], [54.8974671333, 82.4832206833, "28"], [54.89729555, 82.4826933167, "22"], [54.8982734, 82.4859548167, "60"], [54.8993387167, 82.4873577333, "76"], [54.8971479167, 82.4808783833, "10"], [54.8959557167, 82.48164725, "11"], [54.8973392833, 82.4807942, "12"], [54.8973916333, 82.4808756, "14"], [54.8966921833, 82.4822478333, "21"], [54.89642605, 82.4824713833, "23"], [54.8967609167, 82.4825135833, "25"], [54.8971820833, 82.4809704667, "16"], [54.89693775, 82.4814169833, "18A"], [54.8968612333, 82.4812093333, "18"], [54.8968348, 82.4827666333, "27"], [54.8969158833, 82.4829914167, "29"], [54.8969838333, 82.4832029333, "31"], [54.89760075, 82.4835397, "32"], [54.8970568167, 82.48351615, "33"], [54.8967365, 82.4807273, "2"], [54.8979339167, 82.4848533, "44"], [54.8967854, 82.4809565833, "4"], [54.8958402333, 82.481278, "7"], [54.8964383667, 82.4812642667, "9"], [54.8980381167, 82.4851460667, "48"], [54.8985301167, 82.4851492, "52"], [54.8981529, 82.4855380167, "54"], [54.8986448333, 82.4855899833, "56"], [54.8985807833, 82.4870328333, "66"], [54.8986987667, 82.4873079333, "68"], [54.8987788167, 82.4875430667, "74"], [54.89890085, 82.4879704667, "80"], [54.8966231333, 82.4820502667, "17A"], [54.8964502667, 82.4821239667, "17B"], [54.896275, 82.48221365, "17"], [54.8964864333, 82.4816180167, "15"], [54.89829765, 82.4849233667, "48A"], [54.8983503, 82.4862882, "62"], [54.8963564333, 82.4817611, "15A"], [54.8961816167, 82.4819250833, "15B"], [54.8838324667, 82.4758307667, "1"], [54.8836433833, 82.4758399333, "2"], [54.8833977167, 82.47575535, "3"], [54.8833314667, 82.4755896167, "4"], [54.8834651, 82.4752073, "5A"], [54.8833988833, 82.4754131, "5"], [54.8836138833, 82.4754014333, "6"], [54.88376315, 82.4754688833, "7"], [54.8453489, 82.4520246, "12"], [54.8453374333, 82.44998695, "30"], [54.8456579, 82.4496963667, "33"], [54.84527125, 82.4440318, "40"], [54.8447595167, 82.4494073667, "38"], [54.8453093333, 82.4489722667, "40"], [54.8453195333, 82.4515149667, "16"], [54.8833522167, 82.4662158833, "2/13"], [54.8838213, 82.46524815, "10A"], [54.88380855, 82.46613485, "7A"], [54.8832769, 82.4662041167, "1/13"], [54.88379275, 82.4654513833, "10"], [54.88377815, 82.4658082667, "11"], [54.88342395, 82.4662276833, "3/13"], [54.883518, 82.4662264667, "4/13"], [54.8836896667, 82.4656703833, "14"], [54.8834471333, 82.4658730667, "15"], [54.88344295, 82.46574735, "16"], [54.8843819333, 82.4658316167, "1"], [54.8844031667, 82.4655400167, "2"], [54.8841441667, 82.4660546, "3A"], [54.8841592333, 82.46611295, "3B"], [54.8842008167, 82.4658206, "3"], [54.8841960167, 82.4655438833, "4"], [54.8840714, 82.4658066333, "5"], [54.8840438, 82.4655440333, "6"], [54.8839425167, 82.46582275, "7"], [54.8839567167, 82.4654131167, "8"], [54.8837516, 82.4660999833, "9"], [54.883711, 82.4655393167, "12"], [54.9413734667, 82.4995142833, "306"], [54.9264553167, 82.4927426, "101"], [54.9263942667, 82.495421, "93"], [54.9367796667, 82.49396525, "218"], [54.9306420333, 82.4927391167, "147"], [54.9314740333, 82.4922045333, "156"], [54.9346698333, 82.4939321167, "195"], [54.9210469167, 82.49473535, "45"], [54.9244517667, 82.4930819833, "76"], [54.92482195, 82.4937379833, "85"], [54.9278428667, 82.49133405, "116"], [54.928097, 82.4920060333, "117"], [54.9259406, 82.4921851333, "98"], [54.9432639333, 82.5024320833, "321"], [54.9478774167, 82.50590725, "360"], [54.9006717, 82.3709368333, "24"], [54.90793765, 82.3650150333, "121"], [54.9056018833, 82.3671315333, "89"], [54.9073516833, 82.3655189333, "119"], [54.8986494833, 82.4611173667, "1"], [54.8984617833, 82.4610480667, "3"], [54.8983073667, 82.4609003333, "5"], [54.8985554833, 82.4614893833, "2"], [54.8983680333, 82.4614087, "4"], [54.8981331333, 82.4608315333, "7"], [54.8982140167, 82.4613434833, "6"], [54.8979873167, 82.4611021667, "10"], [54.8980203833, 82.4609355833, "9"], [54.89806, 82.4612782333, "8"], [54.9028616833, 82.4335225667, "29"], [54.9031164833, 82.4331062, "27"], [54.908270667, 82.4336130833, "43"], [54.9018962667, 82.4342030167, "42"], [54.9035645333, 82.4334544, "21"], [54.8997075167, 82.4313605167, "63"], [54.9028940667, 82.4339966333, "28"], [54.90126025, 82.43430315, "54"], [54.9009420667, 82.4335351333, "57"], [54.8997543667, 82.4328163667, "67"], [54.9042664833, 82.4334384833, "9"], [54.9004958, 82.4365008, "56"], [54.8999357667, 82.4364970167, "58"], [54.9193787167, 82.4035627667, "29"], [54.9187184, 82.40134295, "50"], [54.91970595, 82.4043742667, "21"], [54.93012645, 82.3979479333, "179"], [54.9287776167, 82.3984838, "167"], [54.9244404833, 82.40003235, "125"], [54.9182969, 82.4015440667, "46"], [54.9198358, 82.4009195, "62"], [54.9214928833, 82.4003147333, "82"], [54.9276005833, 82.3979560333, "156"], [54.9090980833, 82.47152255, "112B"], [54.9100087667, 82.47027605, "121A"], [54.90817245, 82.47139345, "103"], [54.90884805, 82.4719748, "108A"], [54.9089414167, 82.4722395833, "108B"], [54.9084711833, 82.47177935, "104"], [54.90863345, 82.47171425, "106"], [54.9083213167, 82.47131235, "105"], [54.9090004, 82.472447, "108C"], [54.9028464833, 82.4753390167, "26B"], [54.9078277833, 82.4723944833, "4/96"], [54.90357775, 82.4740898333, "36"], [54.90385065, 82.473554, "35A"], [54.9035803667, 82.47369605, "35"], [54.90815455, 82.4719365833, "100"], [54.91190955, 82.4702316833, "138"], [54.90756, 82.4722275333, "7/96"], [54.9089549167, 82.47103335, "111"], [54.9044076167, 82.4737216, "42"], [54.9011103, 82.4747561, "13"], [54.9113504333, 82.46916605, "135B"], [54.90916025, 82.4717170833, "112A"], [54.9104814167, 82.4713397667, "124B"], [54.9113419667, 82.4696552833, "133A"], [54.9116247167, 82.4707302833, "134A"], [54.9118128833, 82.4706304, "134B"], [54.9117777333, 82.46919275, "139A"], [54.91172915, 82.4689741333, "139B"], [54.9091821167, 82.47238525, "110C"], [54.9112748167, 82.46989875, "131A"], [54.9112112333, 82.46968315, "131B"], [54.9018407333, 82.474509, "17"], [54.9021059167, 82.4747859167, "18"], [54.9022214333, 82.4747533667, "20"], [54.9021081667, 82.4743658667, "21"], [54.9024045833, 82.4746604333, "22"], [54.90227905, 82.4742904, "23"], [54.9025434333, 82.4745909167, "24"], [54.9033884667, 82.4737883, "33"], [54.9029568833, 82.4739659833, "31"], [54.90244755, 82.4742011333, "25"], [54.9026128, 82.4741282667, "27"], [54.9027832333, 82.4740469833, "29"], [54.9027372833, 82.4744949833, "30"], [54.9028963667, 82.4744151167, "32"], [54.9039784167, 82.4735005167, "39"], [54.9041466, 82.47341055, "41"], [54.9043180167, 82.4733317667, "43"], [54.9044306, 82.4732717, "45"], [54.9002813333, 82.4746537333, "3A"], [54.9003363333, 82.4746345833, "3B"], [54.9003208833, 82.4742427, "3C"], [54.9004106, 82.47457215, "3D"], [54.9008182333, 82.4749564333, "7"], [54.9008622667, 82.4745689333, "9A"], [54.9087553333, 82.47168745, "108"], [54.9087847167, 82.47111335, "109"], [54.9090482, 82.4718688667, "110A"], [54.9089821833, 82.47162705, "110"], [54.9097564, 82.47064845, "117"], [54.90991065, 82.4711398333, "118"], [54.9098192, 82.4703204, "119A"], [54.9100781833, 82.4710667, "120"], [54.9102616, 82.4713288833, "120A"], [54.91019675, 82.4704249667, "121"], [54.9102786333, 82.47095955, "122"], [54.91061325, 82.47114525, "124A"], [54.9104595333, 82.4709259167, "124"], [54.9103273167, 82.4703685833, "125"], [54.9009658333, 82.47489005, "9"], [54.9106314167, 82.47081795, "126"], [54.9105098833, 82.4702934833, "127"], [54.9115283, 82.47038715, "132"], [54.9114078, 82.4698388833, "133"], [54.9117353833, 82.4702887167, "136"], [54.91165515, 82.4697282333, "137"], [54.91209905, 82.4701214833, "140"], [54.91192095, 82.46961505, "141"], [54.91209585, 82.4695346667, "143"], [54.91223925, 82.4694837833, "145"], [54.9129544, 82.46972655, "148"], [54.9127850833, 82.46918905, "149"], [54.9131046167, 82.4696231333, "150"], [54.9129241667, 82.4691591333, "151"], [54.9133420333, 82.4695050167, "152"], [54.9134355667, 82.4694691333, "154"], [54.9136254167, 82.4688124833, "155"], [54.9135736667, 82.4693978333, "156"], [54.9137485167, 82.4693549667, "158"], [54.9144754, 82.46902505, "164"], [54.9147488833, 82.4695174667, "166"], [54.9147467167, 82.4689613833, "168"], [54.9053532, 82.4735344167, "44A"], [54.9052717667, 82.4733045167, "44"], [54.90506265, 82.4729767833, "49"], [54.9052035667, 82.4729156167, "51"], [54.9053496, 82.4728617833, "53"], [54.9054862667, 82.47279975, "55"], [54.9071557, 82.47249445, "88"], [54.9011584833, 82.47587265, "10"], [54.9012260167, 82.4757750333, "12"], [54.9011779333, 82.47526505, "14"], [54.9024628, 82.4750374833, "22A"], [54.9024647, 82.4751844167, "22B"], [54.9004774333, 82.4751149333, "1"], [54.9028335, 82.4750389333, "28"], [54.9004664333, 82.4755579667, "2"], [54.9005692, 82.4755242167, "4"], [54.9006539333, 82.4750368333, "5"], [54.9010841833, 82.4755968, "8A"], [54.9008984167, 82.4753584833, "8"], [54.9091240667, 82.4721442833, "110B"], [54.9097632833, 82.47034635, "117A"], [54.9082253333, 82.4719109833, "102"], [54.9114097833, 82.4693441333, "135A"], [54.9112057333, 82.4692141667, "135C"], [54.91167365, 82.4687884833, "139D"], [54.9112668833, 82.4694056333, "135"], [54.9111444667, 82.4690280333, "135D"], [54.9115951667, 82.4692708167, "139"], [54.9115359, 82.4690900833, "139C"], [54.9106014, 82.4702607333, "129"], [54.9076115833, 82.4723767833, "98"], [54.9075872333, 82.4722996, "8/96"], [54.9076397833, 82.4724662167, "10/96"], [54.9076588167, 82.4725362667, "11/96"], [54.9076818333, 82.47261165, "12/96"], [54.90787275, 82.4725516833, "6/96"], [54.9078548167, 82.4724749, "5/96"], [54.9078033833, 82.47231415, "3/96"], [54.9077763833, 82.4722320833, "2/96"], [54.9077493833, 82.4721500167, "1/96"], [54.9027466667, 82.4750991167, "26A"], [54.9013304167, 82.4746607667, "13A"], [54.9012675, 82.4744082333, "13B"], [54.9010857333, 82.4744788167, "13C"], [54.91033795, 82.47011845, "125A"], [54.90225545, 82.4739976167, "23A"], [54.9099696333, 82.4705395667, "119"], [54.9152684167, 82.4687266333, "176"], [54.8767274167, 82.4498122333, "31"], [54.8753801, 82.4141292833, "347"], [54.8749301667, 82.4229940833, "269"], [54.8780543667, 82.4318462667, "2/193"], [54.87844965, 82.4315496667, "4/193"], [54.877916, 82.4313673167, "3/193"], [54.8772684667, 82.4313525833, "1/193"], [54.8745261, 82.41460525, "336"], [54.8730149167, 82.4139278833, "348"], [54.8749023333, 82.4133807833, "357"], [54.8748893, 82.4158492, "331"], [54.87500415, 82.4305876333, "199"], [54.8762052667, 82.4298853667, "209"], [54.876837, 82.4272319333, "231"], [54.8750526167, 82.4337470333, "173"], [54.8750786167, 82.4326617667, "185"], [54.8765961833, 82.4422767333, "1/101"], [54.8765928833, 82.44146825, "2/101"], [54.8766094667, 82.4450663167, "1/75"], [54.8751227667, 82.4479436, "47"], [54.8785082667, 82.4463698333, "59"], [54.8749291833, 82.42188625, "275"], [54.8750447, 82.4367026, "145"], [54.8746106333, 82.4284329, "218"], [54.8745961333, 82.4294403, "210"], [54.8729241167, 82.4301093, "204"], [54.8730751833, 82.4315361667, "192"], [54.8764695333, 82.4360706167, "2/151"], [54.8750668667, 82.4352073833, "161"], [54.8745754667, 82.4496806333, "32"], [54.87504855, 82.4370912, "141"], [54.8745623, 82.4221763333, "276"], [54.8745616667, 82.4217338333, "278"], [54.8749560667, 82.4206555833, "291"], [54.87457185, 82.42039215, "292"], [54.8749318, 82.4195155667, "297"], [54.8749193167, 82.4189609333, "301"], [54.8745523667, 82.4178998833, "314"], [54.87555895, 82.4169412167, "317"], [54.8727607, 82.4172541833, "320"], [54.87489075, 82.41689625, "325"], [54.8762137833, 82.4211919167, "283"], [54.8773094667, 82.4190741833, "295"], [54.8766782167, 82.4177899333, "307"], [54.87495795, 82.4292900167, "211"], [54.87496815, 82.4277122333, "229"], [54.87496315, 82.4270601833, "235"], [54.87495715, 82.4262284667, "243"], [54.87466625, 82.4340618833, "166"], [54.8731281333, 82.43353715, "176"], [54.8746368667, 82.43285965, "180"], [54.8746353667, 82.4320823333, "188"], [54.8746651833, 82.43837135, "134"], [54.8746581, 82.4361343333, "152"], [54.8766056667, 82.4444213667, "2/75"], [54.8750381333, 82.4425046833, "95"], [54.8758251333, 82.4478232833, "49"], [54.8751582, 82.4469793167, "51"], [54.8771227333, 82.4464864167, "57"], [54.8750768, 82.445912, "61"], [54.8750693833, 82.4452335333, "71"], [54.8765724333, 82.4321372667, "191"], [54.876819, 82.4318101833, "1/191"], [54.8750694, 82.4518701667, "15"], [54.8750833, 82.4512497167, "21"], [54.87511365, 82.449825667, "37"], [54.8744741833, 82.4113393, "372"], [54.87448925, 82.4111035167, "374"], [54.8749085333, 82.4183780667, "309"], [54.8748987, 82.4119560833, "371"], [54.8754877, 82.4485419667, "43"], [54.87489105, 82.4142969333, "1/347"], [54.87509285, 82.4505922, "23"], [54.8746456667, 82.4350032667, "162"], [54.8817882333, 82.46555605, "1"], [54.8817762333, 82.4657047, "2"], [54.88177495, 82.4658300167, "3"], [54.8818317167, 82.4659088333, "4"], [54.8818769833, 82.4658514167, "5"], [54.881892, 82.4657157833, "6"], [54.8819030667, 82.4655528667, "7"], [54.8249572667, 82.3822644167, "62C"], [54.8241013167, 82.3830562833, "62B"], [54.8235533667, 82.3836837833, "62A"], [54.8232282333, 82.38113915, "42"], [54.8216185167, 82.3801976167, "24"], [54.8233693667, 82.3818881167, "50"], [54.8238237167, 82.38163785, "48"], [54.8223544167, 82.3807860167, "34"], [54.8221907167, 82.38064385, "32"], [54.798240833, 82.4757575167, "369"], [54.7917070167, 82.4768378667, "371"], [54.7976220833, 82.4791485667, "310"], [54.8026816667, 82.4738649167, "241"], [54.8063079833, 82.4719216833, "198"], [54.8127222, 82.46321975, "88"], [54.79851905, 82.4782582, "298"], [54.7982161667, 82.4784413833, "300"], [54.7979628667, 82.4785954333, "304"], [54.7989472167, 82.4770213333, "289"], [54.8124759, 82.46149895, "66"], [54.80813105, 82.4692921667, "133"], [54.80903515, 82.4695616333, "164"], [54.81169535, 82.4617913167, "77"], [54.7931904667, 82.4771456167, "359"], [54.90154435, 82.4820577833, "17A"], [54.9023211333, 82.4866221333, "50"], [54.9029791167, 82.4860176833, "43"], [54.9018640167, 82.4839159667, "29"], [54.9017065667, 82.4845584, "32"], [54.9013472667, 82.4832850333, "20"], [54.9022597667, 82.4852180667, "37"], [54.90235635, 82.4855437333, "39"], [54.9020226167, 82.48626825, "48A"], [54.90219835, 82.4862075833, "48"], [54.9028144833, 82.4859300667, "41A"], [54.9019145833, 82.4857036333, "38"], [54.9012494167, 82.4836438333, "22A"], [54.90117625, 82.4832889167, "20A"], [54.9013004333, 82.4831083, "18A"], [54.9018345667, 82.48310725, "23A"], [54.9014717833, 82.4845211, "30A"], [54.9011141833, 82.4813179833, "11"], [54.9012595833, 82.4829706167, "18"], [54.9012063333, 82.4815285167, "13"], [54.90106015, 82.48224675, "14"], [54.9014018333, 82.4835019, "22"], [54.90164195, 82.4831019333, "23"], [54.9014562667, 82.4837066, "24"], [54.9017002833, 82.48331585, "25"], [54.9013501333, 82.4820586167, "17"], [54.9017979167, 82.48370115, "27A"], [54.9017437333, 82.4834995, "27"], [54.9015959833, 82.4841416, "28"], [54.9016565333, 82.4843582167, "30"], [54.9019526833, 82.4841925, "31"], [54.90202855, 82.4844477667, "33"], [54.9008982667, 82.4817133, "8"], [54.9024487833, 82.4858792167, "41"], [54.9020930667, 82.4858615167, "42"], [54.9025991167, 82.4863993167, "49"], [54.9021011667, 82.4846921667, "35"], [54.9014189333, 82.4823503167, "19"], [54.90126485, 82.4817892167, "15"], [54.9015360333, 82.4839226833, "26"], [54.83531625, 82.4933037333, "196"], [54.8352276167, 82.4927147833, "195"], [54.8360773, 82.4912368, "187"], [54.8346867167, 82.49328105, "201"], [54.82529725, 82.5052682333, "361"], [54.8370500167, 82.4896684, "163"], [54.8396963333, 82.4849568, "1/133"], [54.8292152667, 82.4972928333, "281"], [54.8293017833, 82.4982716333, "300"], [54.8282765333, 82.4989055, "307"], [54.8274501333, 82.5007519833, "333"], [54.8273441167, 82.5024751333, "2/336"], [54.8261453167, 82.5047067667, "360"], [54.8301054, 82.4958695333, "275"], [54.8271283667, 82.5028555, "1/336"], [54.8369560667, 82.4905711833, "172"], [54.81904615, 82.5025335167, "7/369"], [54.8218408167, 82.50377335, "4/369"], [54.8209456333, 82.5022760833, "6/369"], [54.8208349667, 82.5044007, "5/369"], [54.8238658, 82.50523275, "2/369"], [54.8190694, 82.5003232333, "8/369"], [54.8120237667, 82.5010552833, "10/369"], [54.8118820833, 82.50392555, "11/369"], [54.8356394, 82.4927849, "192"], [54.8452920167, 82.4770441167, "6"], [54.8332265167, 82.4939223333, "232"], [54.8297708, 82.4960635, "253"], [54.8393579167, 82.4857046667, "2/133"], [54.83878395, 82.48766725, "142"], [54.8379286333, 82.4890502, "152"], [54.8364941, 82.4914751, "186"], [54.8248432833, 82.5066992833, "369"], [54.82553745, 82.5068898833, "380"], [54.83202985, 82.4941239333, "240"], [54.82194035, 82.5057576833, "3/369"], [54.8227608167, 82.5063209333, "1/369"], [54.8141088167, 82.5037792333, "9/369"], [54.8382942833, 82.48852635, "148"], [54.8603913833, 82.4492696, "57"], [54.8592938167, 82.42099095, "308C"], [54.85984295, 82.42067725, "308B"], [54.8598229167, 82.4210151667, "308A"], [54.8598344333, 82.3976947833, "508"], [54.8603243333, 82.4140272833, "369"], [54.8603184, 82.4123881167, "385"], [54.86106375, 82.4477743833, "67"], [54.861365, 82.4476857667, "73"], [54.8613431833, 82.4479565167, "69"], [54.86191185, 82.44788405, "71"], [54.8603987333, 82.4502737667, "53"], [54.86045645, 82.4319935167, "209"], [54.8603551333, 82.4258720333, "263"], [54.8599289833, 82.4315900833, "210"], [54.8604198833, 82.4334522667, "195"], [54.8627496167, 82.42078385, "309B"], [54.8609723167, 82.4515878667, "37"], [54.8603717833, 82.4514413333, "39"], [54.8609809, 82.4517044667, "35"], [54.86096795, 82.45250335, "27"], [54.8604741333, 82.4530975833, "17"], [54.8603852667, 82.451807, "33"], [54.8572038, 82.42770555, "246"], [54.8604631667, 82.4363373667, "171"], [54.8591713833, 82.4484903833, "62"], [54.8604119667, 82.4340429333, "191"], [54.8603663667, 82.4354625167, "179"], [54.8603935, 82.4373993667, "161"], [54.8600009, 82.44318935, "108"], [54.8599224167, 82.4265426167, "256"], [54.8612047333, 82.4464131333, "81B"], [54.8599028667, 82.4231039167, "288"], [54.8602706, 82.4220058333, "295"], [54.8602638667, 82.4191497333, "323"], [54.8609657667, 82.4187969, "327"], [54.8602931, 82.4179491333, "329"], [54.8598848667, 82.4176532167, "338"], [54.8632475167, 82.4173751333, "339"], [54.8599251667, 82.4255647333, "1/264"], [54.8599279667, 82.4253799333, "2/264"], [54.86045495, 82.4383567333, "157"], [54.8604267333, 82.4421660333, "113"], [54.8617114333, 82.4414719167, "125"], [54.8603943167, 82.43982245, "143"], [54.8604978, 82.4449393667, "89"], [54.8603957167, 82.4488193667, "59"], [54.8599959167, 82.4481568167, "64"], [54.8603463333, 82.4481201667, "65"], [54.8603207833, 82.44708855, "75"], [54.8617075, 82.4464497667, "85"], [54.8603354667, 82.4458761167, "87"], [54.8603924833, 82.4529279333, "21"], [54.8603805, 82.4522459167, "31"], [54.8603894333, 82.4465241, "81"], [54.8624513667, 82.4464558667, "2/85"], [54.8603426, 82.42038605, "309A"], [54.8597382167, 82.4030150833, "468"], [54.8600008333, 82.4468853333, "78"], [54.8600151833, 82.4476529333, "70"], [54.8619444167, 82.4473194667, "77"], [54.8604090333, 82.4206673167, "309"], [54.8599482667, 82.4450833833, "90"], [54.8599667333, 82.4439503167, "102"], [54.8599639167, 82.4443829333, "98"], [54.8604016667, 82.4435244167, "107"], [54.8602872667, 82.4157777167, "357C"], [54.8619551667, 82.4154903667, "357B"], [54.8602759333, 82.41535695, "357"], [54.8599460833, 82.4464074167, "82"], [54.8585100167, 82.4461918667, "84"], [54.8604238667, 82.4437588667, "105"], [54.86030515, 82.4229068167, "289"], [54.9165466667, 82.5400699667, "47"], [54.9163835, 82.5395208667, "52"], [54.9162024833, 82.5415235333, "4/35"], [54.9138618, 82.5389959167, "20"], [54.9147363, 82.5367299167, "4"], [54.9171924833, 82.5398619667, "53"], [54.9156216333, 82.5400467167, "1/35"], [54.9156090167, 82.5406467667, "2/35"], [54.9155483, 82.54130355, "3/35"], [54.9161911333, 82.5412111333, "5/35"], [54.9177019333, 82.5406090667, "57"], [54.9172073167, 82.5390771667, "56"], [54.8413934333, 82.3669168333, "185"], [54.8417850333, 82.3689200833, "199"], [54.8428339667, 82.3706989, "216"], [54.8416074, 82.36479145, "164"], [54.8409904167, 82.3645986833, "157"], [54.84092815, 82.3644066167, "161"], [54.8749487833, 82.4757354167, "4"], [54.8748824667, 82.4752927333, "3"], [54.8746354, 82.475246, "5"], [54.8742075167, 82.4755986333, "10"], [54.8743622667, 82.4759894667, "8A"], [54.8744567667, 82.4756695333, "8"], [54.8748683833, 82.4760352167, "4A"], [54.8742254333, 82.47601205, "10A"], [54.8747158167, 82.4760297167, "6A"], [54.8746737833, 82.4757186333, "6"], [54.9465236167, 82.3809737667, "672"], [54.9005455, 82.4730509333, "22"], [54.9003672167, 82.4684980833, "17"], [54.9003614667, 82.4682696667, "13"], [54.9009926333, 82.4714326, "18B"], [54.9004931, 82.4733237333, "24"], [54.90023555, 82.4663222333, "3"], [54.9003731333, 82.4738848333, "30"], [54.90041915, 82.4736641333, "28A"], [54.9008516833, 82.47143275, "18A"], [54.9009989333, 82.4716885333, "18C"], [54.9011166833, 82.4715942833, "18D"], [54.9013468667, 82.4716314833, "18E"], [54.9013142333, 82.4713999333, "18F"], [54.9007320667, 82.4678888833, "12"], [54.9007490333, 82.4682728833, "14"], [54.9002906, 82.4672436333, "11"], [54.9005921667, 82.4728228833, "20"], [54.9012265333, 82.4713549, "18G"], [54.8998487333, 82.4663062167, "1"], [54.9004667833, 82.4734721, "26"], [54.9007287833, 82.4668388, "4"], [54.9002529667, 82.4665572, "5"], [54.9002680333, 82.4668009667, "7"], [54.9002738833, 82.4670198667, "9"], [54.90052665, 82.4737441167, "28B"], [54.9202440833, 82.4647199333, "59"], [54.9186491, 82.4631960333, "74"], [54.9197376, 82.46404755, "63"], [54.9209585333, 82.4715133667, "31"], [54.92198325, 82.4719067667, "32"], [54.9200168333, 82.4637374167, "64"], [54.9199907667, 82.4714465333, "9"], [54.91941015, 82.4649217833, "65"], [54.9196411667, 82.4633694333, "66"], [54.91916365, 82.4639929833, "67A"], [54.9194144667, 82.4637018833, "67"], [54.9193556833, 82.4631293833, "70"], [54.9191286667, 82.4630976, "72"], [54.9189485833, 82.4635427667, "69"], [54.9201641167, 82.4662894167, "55"], [54.9211940333, 82.4656174833, "56A"], [54.920671, 82.4657966667, "56"], [54.92006415, 82.4658042, "57A"], [54.9213706, 82.4727426833, "23"], [54.9214441667, 82.4732278667, "24"], [54.9202821667, 82.4732763833, "18"], [54.9204884667, 82.4729263, "19"], [54.9211967, 82.47098555, "33"], [54.92094835, 82.4706909167, "35"], [54.9219078167, 82.47147535, "34"], [54.9197843667, 82.46309625, "68"], [54.9210935333, 82.46484215, "60A"], [54.9212236167, 82.4704147167, "40"], [54.9197908, 82.4659149333, "55A"], [54.92033405, 82.4655102, "57"], [54.9211895167, 82.46547285, "58A"], [54.9207404, 82.46524515, "58"], [54.91857275, 82.4635986167, "71"], [54.9182674667, 82.46367495, "73"], [54.9195246333, 82.4715611, "11"], [54.9216761833, 82.4729861167, "26"], [54.92162375, 82.4721619667, "27"], [54.9218544, 82.4726169833, "28"], [54.9215389333, 82.4715153167, "29"], [54.9219467167, 82.4722808333, "30"], [54.9193754, 82.4726740833, "12"], [54.9195867667, 82.4721921667, "13"], [54.9196743333, 82.4735581167, "14A"], [54.91978385, 82.4729767167, "14"], [54.9200549833, 82.4726106667, "15"], [54.9197512333, 82.4737709, "16"], [54.9204467, 82.4722458667, "17"], [54.9199559, 82.4736553667, "18A"], [54.9193368833, 82.4700432833, "1"], [54.9218013667, 82.4711677833, "36"], [54.9204076, 82.4708148667, "37"], [54.928217833, 82.4702188667, "38A"], [54.9215826, 82.4708205333, "38"], [54.9207000333, 82.4703961167, "39"], [54.9205687167, 82.4700339833, "41"], [54.9208976, 82.46987095, "42"], [54.92033355, 82.4687946, "45"], [54.91982325, 82.4679912667, "47A"], [54.9209613833, 82.4677278167, "48A"], [54.92131875, 82.4676346167, "48B"], [54.9205986, 82.4680208, "48"], [54.9196399667, 82.4679596667, "49B"], [54.9202544833, 82.4681937167, "47"], [54.9198937833, 82.4678851833, "49A"], [54.9205374667, 82.46738275, "50"], [54.9213241, 82.4675107, "50B"], [54.9201188667, 82.4669429, "51"], [54.92103205, 82.4665559333, "52A"], [54.9205449167, 82.4668373833, "52"], [54.9198923833, 82.46667, "53"], [54.9210808167, 82.4664227833, "54A"], [54.920561, 82.4662841333, "54"], [54.91946705, 82.4707291667, "5"], [54.9193920833, 82.47035955, "3"], [54.9195288167, 82.4710633833, "7"], [54.92069515, 82.4648828167, "60"], [54.9209773667, 82.4675400333, "50A"], [54.9201842667, 82.46752845, "49"], [54.9200461167, 82.4643875333, "61"], [54.9205402833, 82.4644506333, "62"], [54.9196651333, 82.4646621833, "63A"], [54.9211008833, 82.4733943, "22"], [54.9207025167, 82.4734697333, "20"], [54.9209406667, 82.47297795, "21"], [54.9211156333, 82.4720907167, "25"], [54.9221545333, 82.4731278833, "26A"], [54.8946718167, 82.4691448667, "53"], [54.8945620667, 82.46918055, "55"], [54.8942623667, 82.4697152833, "52"], [54.894203, 82.4688735167, "65"], [54.89425415, 82.4689361333, "63"], [54.89414905, 82.4688349167, "67"], [54.8939181333, 82.4694227167, "64"], [54.8938391333, 82.4693460667, "66"], [54.8907021167, 82.4667148333, "93"], [54.8906039, 82.4666683167, "95"], [54.8902027167, 82.4664942833, "103"], [54.8905652, 82.4673196167, "92"], [54.8898694, 82.4663493333, "107"], [54.8897077333, 82.4662881167, "113"], [54.8897784833, 82.4663228, "111"], [54.8956830333, 82.4710189333, "32"], [54.8955352667, 82.4709092833, "36"], [54.8954734333, 82.4708266833, "38"], [54.8960418333, 82.47138995, "28"], [54.8820345667, 82.46329545, "3/201"], [54.8822174333, 82.46335335, "1/201"], [54.8821085167, 82.4633248, "2/201"], [54.8823766667, 82.4634171667, "197"], [54.8841371, 82.46403415, "82A"], [54.8841525333, 82.4636656, "82B"], [54.8864762667, 82.4645354333, "151"], [54.8863782833, 82.4644388833, "153"], [54.8862153, 82.4648985833, "155"], [54.8860901, 82.4648409833, "157"], [54.8880628167, 82.4656834833, "133"], [54.8878619333, 82.4655976667, "135"], [54.8906979667, 82.4673655, "90"], [54.8907991, 82.4667608667, "91"], [54.8961849167, 82.4707743833, "25"], [54.8836823667, 82.4638652167, "181"], [54.8836385667, 82.4632253833, "183"], [54.8838402, 82.4639201167, "179"], [54.8982437333, 82.4734017333, "1"], [54.8849776167, 82.46438955, "171"], [54.8843719833, 82.4641355167, "173"], [54.8839963167, 82.4632512833, "177"], [54.88393085, 82.4634884, "179B"], [54.8837384333, 82.4634720333, "181A"], [54.8834786833, 82.4638174667, "185"], [54.8834804667, 82.46322915, "187"], [54.8833056667, 82.4637555833, "189"], [54.88310485, 82.4633649667, "191A"], [54.8831340833, 82.4636871, "191"], [54.8830253167, 82.4636718333, "193"], [54.8819504, 82.4632695667, "203"], [54.88170725, 82.4631031, "205"], [54.88149825, 82.4630156833, "207"], [54.8813178333, 82.4626260667, "209A"], [54.8813002167, 82.4629425167, "209"], [54.8810862833, 82.4628550167, "211"], [54.8884475, 82.46494685, "125A"], [54.88836565, 82.4649932, "127A"], [54.88680255, 82.4645032, "145"], [54.8866910333, 82.4647031667, "147A"], [54.8863981167, 82.4649715167, "149"], [54.8859491, 82.4647828333, "159"], [54.8857348333, 82.4647021333, "161"], [54.8856289833, 82.4642462833, "163"], [54.8854787333, 82.4646066833, "165"], [54.8853169667, 82.4645344833, "167"], [54.8851657167, 82.4644626667, "169"], [54.89008265, 82.4664379167, "105"], [54.8888476167, 82.4659953167, "117"], [54.88862475, 82.4659086167, "121"], [54.8884613833, 82.4658299, "123"], [54.8884445167, 82.4652906, "125"], [54.8883496833, 82.46527395, "127"], [54.8882554833, 82.46575415, "129"], [54.8881798833, 82.4652017833, "131"], [54.8876298667, 82.4655107667, "137"], [54.8874722667, 82.4654312667, "139"], [54.8870441833, 82.4652550333, "141"], [54.8868197, 82.46516795, "143"], [54.8865865, 82.46503135, "147"], [54.8944378167, 82.4698605333, "48"], [54.8943299667, 82.4697972167, "50"], [54.8946586167, 82.46927655, "51"], [54.8942089833, 82.4696627, "54"], [54.89410215, 82.46963495, "56"], [54.8944861833, 82.4691251333, "57"], [54.89410185, 82.4695671167, "58"], [54.89440395, 82.4690316833, "59"], [54.8940363833, 82.4695254833, "60"], [54.8943071333, 82.4689793333, "61"], [54.8939694333, 82.4694826, "62"], [54.8937483667, 82.4692441333, "68"], [54.8940153, 82.4687127667, "69"], [54.8936944333, 82.4691774333, "70"], [54.8939444833, 82.4686454167, "71"], [54.8914311167, 82.4676565833, "78"], [54.8914605833, 82.4668025833, "81"], [54.8911125833, 82.467531, "82"], [54.8913374667, 82.46691925, "83"], [54.8909541667, 82.4674899167, "84"], [54.8912424167, 82.4668760167, "85"], [54.89086865, 82.4674540833, "86"], [54.8911290333, 82.46682535, "87"], [54.8908065333, 82.4674188167, "88"], [54.8909961333, 82.4667623333, "89"], [54.89043345, 82.4672657667, "98"], [54.8976105333, 82.47313585, "10"], [54.8975240667, 82.47213955, "17"], [54.8964341, 82.4719897, "18"], [54.8965768167, 82.4718193667, "20"], [54.8964536167, 82.47098525, "21"], [54.8965168, 82.4717821667, "22"], [54.8963066833, 82.4708868167, "23"], [54.8964117, 82.4716877833, "24"], [54.8973729833, 82.4718744167, "19"], [54.8961056167, 82.4707024167, "27"], [54.89606105, 82.4706588333, "29"], [54.8957499, 82.4710900333, "30"], [54.8960081167, 82.4706084667, "31"], [54.89595535, 82.4705515167, "33"], [54.8962650667, 82.4715582333, "26"], [54.8977395833, 82.4736163833, "2A"], [54.8976182167, 82.4734736333, "2"], [54.8950879167, 82.4697355, "49"], [54.8953451167, 82.47080125, "40"], [54.8952480833, 82.4706864833, "42"], [54.8953311333, 82.4699905167, "43"], [54.8951690167, 82.4705682833, "44"], [54.8952598667, 82.4699087, "45"], [54.8951447333, 82.4705209333, "46"], [54.8951409333, 82.4698058667, "47"], [54.8954689333, 82.4701014167, "41A"], [54.8958601667, 82.4704608833, "35"], [54.8957632833, 82.4703618, "37"], [54.89565655, 82.4702728333, "39"], [54.8955528, 82.4701858833, "41"], [54.8976127167, 82.4736873167, "4A"], [54.8974748, 82.4735857667, "4"], [54.8973855833, 82.4735356667, "6"], [54.8974473167, 82.4733615667, "8"], [54.8896038, 82.4662530833, "115"], [54.8938700833, 82.46857325, "73"], [54.8913213333, 82.4676180667, "80"], [54.89351535, 82.4690702167, "76"], [54.8936501, 82.4683802833, "77"], [54.8937599333, 82.4684853667, "75"], [54.8935794833, 82.4691255, "72"], [54.88384375, 82.4636547333, "179A"], [54.8877088, 82.4661684833, "104"], [54.8853223833, 82.4655525667, "128B"], [54.88438085, 82.4648718667, "136C"], [54.8841924667, 82.46482515, "138"], [54.8840040333, 82.4647229667, "140"], [54.8838259833, 82.4646471667, "142"], [54.8836846833, 82.4645814167, "144"], [54.8833978167, 82.4647726167, "146A"], [54.88347465, 82.46450515, "146"], [54.8832495667, 82.4646684333, "148B"], [54.8833107333, 82.4644183167, "148A"], [54.8830987333, 82.4643600833, "150"], [54.88243095, 82.4641342, "152"], [54.8822347333, 82.4643721667, "154A"], [54.88231865, 82.4640810833, "154"], [54.8820192, 82.4644994833, "156"], [54.8820541833, 82.46428995, "158A"], [54.8821268, 82.4640207, "158"], [54.88190465, 82.4639371333, "160"], [54.8817260167, 82.4638787833, "162"], [54.8814407667, 82.4640942167, "164A"], [54.8815740333, 82.46375875, "164"], [54.8814061667, 82.4637101333, "166"], [54.8812219167, 82.4636397667, "168"], [54.8810714, 82.4635707167, "170"], [54.8849612333, 82.4651687333, "134"], [54.8867657833, 82.46587165, "116"], [54.8873525667, 82.4663687, "108A"], [54.8875141333, 82.46643145, "108B"], [54.88740205, 82.4660429667, "108"], [54.8872605, 82.46600665, "110"], [54.8870516667, 82.4659278333, "114"], [54.8859261833, 82.4657479333, "122A"], [54.8859050667, 82.4659105167, "122B"], [54.8859588, 82.4655614, "122"], [54.88575615, 82.4657199833, "124A"], [54.8857864167, 82.4655019333, "124"], [54.8855956333, 82.46541875, "126"], [54.8854599, 82.4652737833, "128"], [54.8852678333, 82.46529905, "130"], [54.8850946667, 82.4652269667, "132"], [54.8878558833, 82.4662192833, "100"], [54.88434005, 82.4648704833, "136B"], [54.88430585, 82.4648585667, "136A"], [54.9102085667, 82.47267125, "50B"], [54.9116658, 82.4774299167, "86A"], [54.91171815, 82.4771741167, "82A"], [54.90942125, 82.47189105, "37"], [54.91030625, 82.47526205, "63B"], [54.9104127167, 82.4752166, "63A"], [54.9095648833, 82.47290545, "49A"], [54.9093032333, 82.4714794833, "35A"], [54.90934235, 82.47164185, "35B"], [54.9093857333, 82.4728978167, "47B"], [54.9095356333, 82.4723232833, "43"], [54.9094703333, 82.4721117667, "39"], [54.9096594333, 82.4715342167, "40"], [54.9080098833, 82.4672010667, "5"], [54.9083293833, 82.4682696833, "13"], [54.9089423167, 82.4690827667, "20"], [54.9089409167, 82.4702961167, "29"], [54.9081540667, 82.46658445, "2"], [54.9097415167, 82.478228833, "42"], [54.9101694333, 82.4746051167, "57"], [54.9080884, 82.4674672833, "7"], [54.91215875, 82.4797119167, "102"], [54.9118344667, 82.4799542, "103"], [54.9106944, 82.4744461, "62A"], [54.9113962667, 82.4772112333, "82"], [54.90982995, 82.4733563, "51A"], [54.9115914833, 82.4801362333, "107A"], [54.9092558833, 82.4696357, "26B"], [54.91002055, 82.4726635167, "50A"], [54.90847515, 82.46755925, "10"], [54.9082532667, 82.4680019333, "11"], [54.9088822833, 82.4688571833, "18"], [54.9086208167, 82.4692152333, "19"], [54.9085374333, 82.4677686333, "12"], [54.9086063833, 82.4679739333, "14"], [54.9086596833, 82.4681819, "16"], [54.9086889667, 82.4694297167, "21"], [54.9089948667, 82.4692835833, "22"], [54.9087513667, 82.4696475333, "23"], [54.9090557667, 82.4694965167, "24"], [54.9088116333, 82.4698680667, "25"], [54.9091091, 82.46969345, "26"], [54.907833, 82.4666559167, "1"], [54.9091789833, 82.4699557667, "28"], [54.9096087, 82.4713450667, "38"], [54.9092433833, 82.4701392333, "30"], [54.9090019833, 82.47051235, "31"], [54.9093068333, 82.4703555833, "32"], [54.9090940833, 82.4707707667, "33"], [54.90938145, 82.4705582833, "34"], [54.9094346667, 82.4707651333, "36"], [54.9088761167, 82.47007805, "27"], [54.9098069333, 82.4719604833, "44"], [54.9098796833, 82.4721707667, "46"], [54.909607, 82.4725725667, "45"], [54.90920615, 82.4729688333, "47A"], [54.9093402667, 82.4728171, "47"], [54.9099493833, 82.4724105167, "48"], [54.9096936333, 82.47284265, "49"], [54.9079234833, 82.4669311833, "3"], [54.9082463667, 82.4668155333, "4"], [54.9097714167, 82.4731308333, "51"], [54.9100506833, 82.4729631167, "52"], [54.9101362833, 82.473234, "54"], [54.9105130333, 82.4743347667, "60"], [54.91028125, 82.4747888167, "59"], [54.9105830167, 82.4745966167, "62"], [54.9106531, 82.4748493333, "64"], [54.90835855, 82.4671917333, "8"], [54.9081653833, 82.4677261, "9"], [54.9120752833, 82.4794866167, "100"], [54.9117925167, 82.47970425, "101"], [54.91190545, 82.4801769333, "105"], [54.9122550333, 82.4799224833, "106"], [54.9116940333, 82.48024145, "107"], [54.9124476, 82.4801052833, "108"], [54.9117246833, 82.4803671833, "109"], [54.9103405167, 82.4750005667, "61"], [54.9104726833, 82.4754203667, "65"], [54.9107200333, 82.47506155, "66"], [54.91053305, 82.4756331, "67"], [54.9111229833, 82.476363, "74"], [54.9114657833, 82.4764926, "76A"], [54.911183, 82.4765541167, "76"], [54.91150505, 82.47660575, "78A"], [54.9112499833, 82.4767965667, "78"], [54.9115982333, 82.4769201167, "80A"], [54.911382167, 82.4769843333, "80"], [54.91152935, 82.4777795, "88"], [54.9117877, 82.4784990667, "92"], [54.9118644667, 82.4787878833, "94"], [54.9121825833, 82.4787955833, "96A"], [54.9119467333, 82.47904265, "96"], [54.9119913167, 82.4792895833, "98"], [54.9117365667, 82.47948695, "99"], [54.9107912667, 82.4752822833, "68"], [54.9108477833, 82.4754937167, "70"], [54.9118233, 82.4773533, "86B"], [54.9119954167, 82.47727035, "86C"], [54.9115303833, 82.4774913167, "86"], [54.9082149, 82.4684349833, "13A"], [54.8870698333, 82.4663411167, "1-13"], [54.8871554667, 82.4663601, "2-12"], [54.9016082667, 82.4806621, "30"], [54.9010984667, 82.4803028833, "22"], [54.9012443833, 82.4808339333, "24"], [54.9013056667, 82.4802206, "26"], [54.90149895, 82.4805675833, "28"], [54.9015629833, 82.4800562667, "32"], [54.90147835, 82.4797437167, "45"], [54.8996289167, 82.4806158667, "2A"], [54.89956085, 82.4797871333, "11"], [54.9009366167, 82.4793407667, "37"], [54.9010581667, 82.4795131167, "39"], [54.8992862833, 82.4802488833, "5"], [54.90020145, 82.4797472, "10"], [54.9003469333, 82.47964355, "12"], [54.89972725, 82.47967295, "13"], [54.9006396, 82.4794276, "14"], [54.8998769167, 82.47947625, "15"], [54.9007610667, 82.4795863833, "16"], [54.9008528833, 82.47974655, "18"], [54.9009693167, 82.4799194, "20"], [54.90002065, 82.47947515, "17"], [54.9001685333, 82.4793572, "19"], [54.8993512667, 82.4806693, "1"], [54.9003158833, 82.479241, "21"], [54.9004667167, 82.4791244167, "23"], [54.9006037, 82.4790302167, "25"], [54.90070445, 82.4786061667, "27"], [54.9007410667, 82.4788370167, "29"], [54.9008196333, 82.4791513333, "31"], [54.901124, 82.4788828667, "33"], [54.90119195, 82.4790490333, "35"], [54.9013381833, 82.4794026, "41"], [54.8997734, 82.4805030333, "2"], [54.8992978333, 82.4804472333, "3"], [54.9012097667, 82.4797523667, "43"], [54.8996789, 82.48033335, "4"], [54.8998323667, 82.4800290167, "6"], [54.8993387167, 82.4800615833, "7"], [54.9000414667, 82.4798654, "8"], [54.8994266333, 82.47991435, "9"], [54.8172086167, 82.36975015, "17"], [54.8189982167, 82.3714596333, "28C"], [54.8174889333, 82.3716284333, "35"], [54.8180339667, 82.3717238667, "36"], [54.8172767, 82.3702897333, "25"], [54.8183033167, 82.3704190333, "28A"], [54.8177806167, 82.3709889833, "30"], [54.8184724667, 82.3714858167, "34"], [54.8172573833, 82.3723560333, "37"], [54.882974333, 82.3697317, "18"], [54.8189201833, 82.3708153, "28B"], [54.8170975, 82.3688759833, "7"], [54.8174008333, 82.3711639167, "31"], [54.8177271333, 82.3719905167, "39"], [54.9105104667, 82.4696305667, "29"], [54.9105738333, 82.4698784833, "33"], [54.9119496333, 82.4744651, "75"], [54.9124263667, 82.4747625167, "76"], [54.9120037833, 82.47464375, "77A"], [54.9103653167, 82.4676619667, "20"], [54.9108393333, 82.4707173, "41"], [54.91176765, 82.4719875333, "58A"], [54.9116183, 82.4720772, "58"], [54.9128712, 82.4761248167, "86"], [54.9124839333, 82.47629265, "85"], [54.9104650167, 82.4694600667, "27"], [54.9109299, 82.4697178333, "40"], [54.9109971667, 82.4699570333, "42"], [54.9097695, 82.4672281333, "11"], [54.9100539667, 82.4665771, "10"], [54.91041835, 82.4666636, "12A"], [54.9101176333, 82.4667979833, "12"], [54.90983315, 82.4674340333, "13"], [54.9104875, 82.4669176667, "14A"], [54.9101736833, 82.4670051, "14"], [54.9098833833, 82.46762845, "15"], [54.9102367667, 82.4672218833, "16"], [54.9099549667, 82.46780795, "17"], [54.9105899, 82.46737165, "18A"], [54.9102941833, 82.4674259333, "18"], [54.91020335, 82.4685710333, "21"], [54.9102757167, 82.4688396333, "23"], [54.9105438167, 82.46821955, "22"], [54.9105772667, 82.4685320333, "26"], [54.9104076167, 82.4692623833, "25"], [54.9094199667, 82.4660506333, "1"], [54.9106404167, 82.4687469667, "28"], [54.9107060667, 82.4689637167, "30"], [54.9103114167, 82.4698414333, "31"], [54.9110137167, 82.4690528333, "34A"], [54.9107613667, 82.4691689333, "34"], [54.91081495, 82.4693474, "36A"], [54.9110468333, 82.46924275, "36B"], [54.9108736, 82.4695344167, "38A"], [54.9111242, 82.46941945, "38B"], [54.9098216167, 82.4658393167, "2"], [54.91088605, 82.4708887833, "43"], [54.9112278167, 82.4705661167, "44"], [54.9109336667, 82.47106555, "45"], [54.91129165, 82.4707536333, "46"], [54.9109882333, 82.4712586667, "47"], [54.9113449167, 82.47095045, "48"], [54.9110579667, 82.4714307833, "49"], [54.9094612667, 82.4662574167, "3"], [54.9114052833, 82.4711525333, "50"], [54.9114515333, 82.4713499667, "52"], [54.9111246333, 82.47187335, "51"], [54.9117082, 82.4723085667, "60"], [54.918221667, 82.4724906333, "62"], [54.91170015, 82.47359465, "63"], [54.9182395, 82.4737979833, "65"], [54.9120630333, 82.4735410667, "66A"], [54.9122263, 82.47353625, "66B"], [54.9118108167, 82.4740034667, "67"], [54.9113339, 82.4743958833, "69"], [54.90952435, 82.4664596667, "5"], [54.90970875, 82.4670344667, "9"], [54.91152875, 82.4743488, "71"], [54.9123023, 82.47433295, "72"], [54.9118344167, 82.4742989833, "73A"], [54.9118896667, 82.4742717333, "73"], [54.9123685833, 82.4745438, "74"], [54.91204505, 82.4747885167, "77B"], [54.9124726167, 82.4749395667, "78"], [54.9120965167, 82.47493145, "79"], [54.9099235167, 82.46615755, "6"], [54.9099866, 82.4663651333, "8"], [54.9126461, 82.4754722667, "80"], [54.9123464833, 82.4758373333, "81"], [54.9124222167, 82.4761109333, "83"], [54.9129424833, 82.47629755, "88A"], [54.91334525, 82.4762585833, "90A"], [54.9134976667, 82.4761915, "90B"], [54.9133118333, 82.47629305, "90"], [54.9127142, 82.4769782833, "87"], [54.9127630833, 82.4771701667, "89"], [54.9131761, 82.47644985, "92A"], [54.9131949667, 82.47653455, "92B"], [54.9130077167, 82.4766852167, "94"], [54.9131084667, 82.4770053833, "96"], [54.9133594333, 82.4770784833, "98"], [54.91309155, 82.4760073833, "86B"], [54.9127336333, 82.4757125833, "82"], [54.9128152667, 82.4759342833, "84"], [54.9129075333, 82.4763391333, "88"], [54.8906112, 82.4636290667, "8"], [54.8906010667, 82.4641357833, "1A"], [54.8905902667, 82.4639329, "4"], [54.8905940833, 82.4640698, "2"], [54.8906316167, 82.4632836667, "13"], [54.8907058, 82.4633735833, "17"], [54.8905923, 82.4640024833, "3"], [54.8907071833, 82.4634437667, "18"], [54.8906947667, 82.4635948667, "20"], [54.8906874333, 82.4636836833, "21"], [54.890681, 82.4637655167, "22"], [54.8906765333, 82.4638413833, "23"], [54.8906641, 82.4639166833, "24"], [54.8906549, 82.4639912667, "25"], [54.8906532333, 82.4640676833, "26"], [54.8906518667, 82.46414095, "27"], [54.8906011167, 82.4638605167, "5"], [54.8906079667, 82.4637939167, "6"], [54.8906326167, 82.4634340333, "11"], [54.8906169667, 82.4635610833, "9"], [54.8906290333, 82.46349725, "10"], [54.8906352333, 82.4633559333, "12"], [54.8906300833, 82.4632139167, "14"], [54.8906897167, 82.4632274, "15"], [54.8905997667, 82.46420885, "1"], [54.8906515667, 82.4642292333, "28"], [54.8905993833, 82.4637104667, "7"], [54.8905424667, 82.4641317333, "1B"], [54.8906997833, 82.4632963667, "16"], [54.89069985, 82.4635183333, "19"], [54.82488245, 82.3937114333, "107"], [54.82511735, 82.3936415, "105"], [54.8241600833, 82.3938937, "115"], [54.8257229, 82.3934403167, "95"], [54.8311935833, 82.39119285, "34"], [54.8312837167, 82.3938057, "44"], [54.8302991667, 82.3911272833, "39"], [54.8298778833, 82.38838305, "33"], [54.8260734, 82.3947714167, "94C"], [54.8263358833, 82.3938421667, "94A"], [54.8279937667, 82.394307, "72C"], [54.8246244833, 82.3942836667, "110"], [54.82928665, 82.3931185833, "58"], [54.8239608833, 82.3939572, "117"], [54.8307863167, 82.3929875333, "46B"], [54.83183475, 82.3898969167, "19"], [54.82823865, 82.3933544333, "72A"], [54.82829215, 82.3941929833, "72B"], [54.8278144167, 82.3934866833, "72D"], [54.8263441833, 82.3946904167, "94B"], [54.8258577167, 82.3939724833, "94D"], [54.8252182667, 82.3953295167, "108"], [54.8301352667, 82.3922486833, "46A"], [54.8325430167, 82.3898667667, "14"], [54.8327221167, 82.3897138833, "12"], [54.91482215, 82.4749911167, "3"], [54.9154439833, 82.4755851833, "12"], [54.9151334833, 82.4758027, "13"], [54.9152983167, 82.4757077333, "14"], [54.9150524833, 82.4746568833, "2"], [54.9147571833, 82.4747972, "1"], [54.9151202833, 82.4748550667, "4"], [54.9149427, 82.4758335, "11"], [54.91488335, 82.4751902167, "5"], [54.9149361833, 82.4753859667, "7"], [54.9149649167, 82.475589, "9"], [54.9153104333, 82.4754419667, "10"], [54.9151775667, 82.4750489, "6"], [54.91523395, 82.4752497167, "8"], [54.8190687333, 82.3738382833, "23"], [54.8189306833, 82.3733703333, "25"], [54.8190215667, 82.37468215, "15"], [54.8191251667, 82.3740887167, "21"], [54.81873305, 82.3726976833, "27A-27C"], [54.8806986667, 82.4693562667, "63"], [54.8809032, 82.46938395, "61"], [54.88419255, 82.4697289167, "25"], [54.8840685833, 82.4692688833, "26A"], [54.8849148667, 82.4692615167, "24"], [54.8847644833, 82.4697682667, "23"], [54.8813066833, 82.4696684167, "55A"], [54.8841734833, 82.4692622667, "26"], [54.8840862833, 82.46972585, "27"], [54.883927, 82.46906515, "28A"], [54.8838748833, 82.4692541667, "28"], [54.8838499, 82.4696946333, "29"], [54.88359805, 82.4692251167, "30"], [54.8837043833, 82.4696835, "31"], [54.8834259333, 82.4692035833, "32"], [54.88355905, 82.4696786667, "33"], [54.8832160667, 82.4691627833, "34"], [54.8834721833, 82.4701433, "35"], [54.8829353667, 82.4691514, "36"], [54.8833598667, 82.4701280667, "37"], [54.8821233833, 82.4690720167, "44"], [54.8818720333, 82.4690515667, "46"], [54.8816436667, 82.4690230167, "48"], [54.8815636667, 82.4686263, "50"], [54.8818555333, 82.4695200333, "51"], [54.8812979333, 82.4689347, "52A"], [54.8814706833, 82.46880395, "52"], [54.8816095333, 82.46944925, "53"], [54.8816625, 82.4696671833, "53A"], [54.8811724833, 82.46894365, "54"], [54.8833521, 82.46965845, "39"], [54.882727, 82.4691108167, "40"], [54.88320755, 82.4696409167, "41"], [54.8830678333, 82.4696227833, "43"], [54.8828830167, 82.4695893333, "45"], [54.8827233167, 82.4695686167, "47"], [54.88095035, 82.4689156, "56"], [54.8811470667, 82.4694376833, "57"], [54.8807286167, 82.4689006167, "58"], [54.8809772667, 82.4695997, "59"], [54.8855099667, 82.4700903333, "11A"], [54.8863533667, 82.4694588667, "10"], [54.8855251167, 82.46980435, "11"], [54.8858918167, 82.4693764333, "12"], [54.88541135, 82.46981195, "13"], [54.8857694833, 82.4693831333, "14"], [54.8853156333, 82.4697983, "15"], [54.88556005, 82.4693647167, "16"], [54.8851626, 82.4697849833, "17"], [54.8853764833, 82.4693362333, "18"], [54.8850294167, 82.4700537333, "19A"], [54.8850045667, 82.4697427167, "19"], [54.88522955, 82.4692991667, "20"], [54.8869080667, 82.4699470333, "1"], [54.8866734833, 82.4699262833, "3"], [54.8868586667, 82.46949025, "4"], [54.8866564167, 82.4694635, "6"], [54.8864874833, 82.4690444333, "8A"], [54.8864948, 82.4694661333, "8"], [54.8857426, 82.4698434167, "9"], [54.8813893667, 82.46946355, "55"], [54.8757085833, 82.4720279333, "14"], [54.8760134667, 82.4732799333, "4"], [54.8762548333, 82.4722784667, "9"], [54.87627795, 82.47290345, "5"], [54.8759331333, 82.4720918833, "16"], [54.8759628833, 82.47273515, "8"], [54.8762970167, 82.4732576833, "3"], [54.8762245833, 82.47260565, "7"], [54.8760141333, 82.4735054833, "2"], [54.87599385, 82.4730087667, "6"], [54.8759230167, 82.4724739333, "10"], [54.8762960167, 82.4734868833, "1"], [54.8760504333, 82.4719608, "18"], [54.8759146, 82.4722788167, "12"], [54.8741210833, 82.4688841833, "4"], [54.874194, 82.4684628667, "3"], [54.8738320667, 82.467738, "7C"], [54.8739506833, 82.4677262667, "7B"], [54.8738354667, 82.4680554, "7D"], [54.8739794167, 82.4680445667, "7A"], [54.8738342833, 82.46848195, "9"], [54.8740206, 82.4684673, "5"], [54.8739604167, 82.4688864, "6"], [54.8735957167, 82.4683405333, "11"], [54.8734235667, 82.4681024, "13"], [54.87339585, 82.4678321167, "15"], [54.8733727667, 82.46763935, "17"], [54.8728499833, 82.46814045, "18B"], [54.8728848, 82.468283, "18A"], [54.8730660667, 82.4686787667, "12B"], [54.8734160167, 82.4687180167, "10"], [54.87312285, 82.4687848, "12A"], [54.8730669833, 82.4679829333, "20"], [54.8731389833, 82.4682574833, "16"], [54.8732649167, 82.4684832833, "14"], [54.8732605833, 82.4675842167, "19"], [54.8729366833, 82.4674852167, "24"], [54.8730152333, 82.4677481333, "22"], [54.87312065, 82.4675707, "21"], [54.7940869167, 82.4650218, "53"], [54.7987550833, 82.46275265, "10"], [54.7930822167, 82.4661922833, "60"], [54.9811612, 82.51623075, "170"], [54.980836, 82.5157299167, "171"], [54.9807136667, 82.5162809333, "172"], [54.8615888667, 82.47847875, "25"], [54.8612666833, 82.4791558, "31"], [54.86047605, 82.48172545, "60"], [54.8620611333, 82.4774431167, "13"], [54.8607505167, 82.4799311167, "41"], [54.8611511833, 82.4794658167, "35"], [54.86108515, 82.4796282, "37"], [54.8604406, 82.48091835, "55"], [54.8595911333, 82.483664, "72"], [54.8582950167, 82.4794636833, "1/55"], [54.8599109167, 82.4805425167, "49"], [54.86081285, 82.4790711333, "33"], [54.9125544667, 82.4795344, "6A"], [54.9129032667, 82.479114, "8"], [54.9131012, 82.4790179333, "10"], [54.9132466667, 82.4789829167, "11"], [54.9130141, 82.4787519333, "1"], [54.9128543833, 82.4788087167, "2"], [54.9126783167, 82.47889955, "3"], [54.9125031333, 82.47905685, "4"], [54.91254025, 82.4792764833, "5"], [54.9127399333, 82.4793322333, "7"], [54.9130969667, 82.47952775, "9"], [54.9126911167, 82.4796185, "6"], [54.8188045667, 82.445279, "356B"], [54.8182903167, 82.4447447333, "356A"], [54.8086473833, 82.4195512167, "27"], [54.8137567, 82.4426504333, "299"], [54.8131862167, 82.4434878167, "297"], [54.8157127333, 82.43953285, "300A"], [54.8094742167, 82.4189907, "19"], [54.80933355, 82.4191978667, "23"], [54.8084224833, 82.4207951, "41"], [54.8095742167, 82.43605105, "226"], [54.81325255, 82.4410722, "291"], [54.8149016667, 82.44148445, "310"], [54.8155769667, 82.44213865, "316"], [54.8161747167, 82.4426252167, "326A"], [54.81712155, 82.4417707667, "326B"], [54.8169698833, 82.4434206167, "332"], [54.81770375, 82.4442239833, "346"], [54.81930575, 82.4457899333, "370"], [54.82310865, 82.4495740167, "422"], [54.8103162667, 82.4344773833, "224B"], [54.8100267333, 82.4348309167, "224A"], [54.8072155167, 82.4256129167, "88B"], [54.8070962167, 82.42278495, "59"], [54.8044940333, 82.4270097, "105"], [54.8046275667, 82.4276069, "110"], [54.8047349, 82.43229485, "165"], [54.8073398, 82.4232142167, "68"], [54.8064126167, 82.4330381167, "188"], [54.8063987833, 82.4339707667, "209"], [54.8103206333, 82.4378506833, "241"], [54.8117777667, 82.4393874, "269"], [54.8074375833, 82.43233545, "192"], [54.8099668167, 82.4365891667, "236"], [54.8038524, 82.4307279167, "156"], [54.808759, 82.4183171167, "17"], [54.805885, 82.4246946333, "81"], [54.8072272, 82.4225943333, "57"], [54.8056120333, 82.4262290333, "98"], [54.80400575, 82.4287991167, "122"], [54.8162936333, 82.43817215, "300B"], [54.80809795, 82.4212756, "49"], [54.8102496667, 82.4184802, "8"], [54.8057899167, 82.43198855, "174"], [54.8060113, 82.4256459333, "88A"], [54.8183982, 82.4416558, "336"], [54.8108804, 82.4393530667, "257"], [54.81106865, 82.4386178, "255"], [54.816436, 82.4370654, "298"], [54.8152743833, 82.4390058833, "298A"], [54.8136452667, 82.44031535, "288"], [54.8123581, 82.44091935, "285"], [54.81283995, 82.4401099833, "283"], [54.8198763333, 82.4462982, "382"], [54.8164479167, 82.4439082, "331"], [54.80775795, 82.4225746667, "62"], [54.8039981833, 82.43163845, "161"], [54.81343775, 82.4401047167, "286"], [54.92047495, 82.46336425, "9"], [54.9203008333, 82.4618285667, "10"], [54.9198670667, 82.4617700333, "6"], [54.9207259667, 82.4627925167, "18"], [54.9204614, 82.4619784833, "12"], [54.9205793667, 82.4621705667, "14"], [54.9207471167, 82.463665, "22"], [54.9208443, 82.4640230833, "24"], [54.9207801667, 82.4632019667, "20"], [54.919291, 82.4622796167, "1"], [54.92066135, 82.4624384833, "16"], [54.9203523333, 82.4637463, "11"], [54.9192657167, 82.4618642833, "2"], [54.9197237333, 82.4622129, "3"], [54.91957955, 82.4618272333, "4"], [54.9201776333, 82.4622242, "5"], [54.9203935, 82.4628145667, "7"], [54.9201192, 82.46174985, "8"], [54.9031613333, 82.4779369333, "8"], [54.90302285, 82.47799245, "9"], [54.9033285333, 82.4778655833, "7"], [54.90346695, 82.4777957167, "6B"], [54.9031769667, 82.4783186167, "1"], [54.9034699667, 82.47848295, "2A"], [54.90334345, 82.4782583833, "2"], [54.9035249833, 82.4781788667, "3"], [54.9037982667, 82.4780497167, "4A"], [54.9037089833, 82.4781017333, "4"], [54.9035266667, 82.4777643667, "6A"], [54.9036756833, 82.4778188333, "5"], [54.9129985333, 82.4689246333, "3"], [54.9132911, 82.4686436333, "4"], [54.9127876667, 82.4680122167, "13"], [54.9126336667, 82.46802445, "13A"], [54.91304995, 82.4678746833, "10"], [54.91280555, 82.4681958333, "11"], [54.9127504833, 82.4677229167, "15"], [54.9133710167, 82.4688942167, "2"], [54.9129377, 82.4687422333, "5"], [54.9128397333, 82.4683664833, "9"], [54.9125584, 82.4677322333, "15A"], [54.9132129833, 82.4683870333, "6"], [54.9128774667, 82.4685356, "7"], [54.9131322833, 82.4681105167, "8"], [54.9164839667, 82.4695277167, "2/205"], [54.9167949333, 82.4782119333, "287"], [54.9086755, 82.4537326833, "37"], [54.91527815, 82.4546945333, "2/88"], [54.9142658167, 82.4551371, "1/88"], [54.9145371, 82.4555229667, "88"], [54.9167784167, 82.4698118167, "209"], [54.91671315, 82.4695459, "207"], [54.916654, 82.4692565, "203"], [54.9168566667, 82.4764833167, "269"], [54.9170098667, 82.4835371333, "332"], [54.9109654167, 82.455206, "60"], [54.9170810333, 82.4814135167, "310"], [54.9168965667, 82.4758632667, "263"], [54.9154102833, 82.46304445, "149"], [54.9154961, 82.4634764667, "153"], [54.9152487667, 82.4638892333, "157"], [54.9156422333, 82.4641169833, "159"], [54.9158050167, 82.4648025333, "165"], [54.91375215, 82.4584178167, "106"], [54.9147696833, 82.4594047833, "114"], [54.91474835, 82.46019985, "121"], [54.9158845167, 82.4586385833, "112"], [54.9150857, 82.459884, "120"], [54.9126885833, 82.4573289333, "82"], [54.91648165, 82.4694261333, "1/205"], [54.9168508333, 82.4701398833, "211"], [54.9169940167, 82.4708593833, "219"], [54.9170359, 82.4710790167, "221"], [54.91708375, 82.4713339, "223"], [54.9170401, 82.4721885167, "231"], [54.9170336667, 82.4724657667, "233"], [54.9169188667, 82.4749939667, "249"], [54.9168660833, 82.4760673333, "265"], [54.91686435, 82.4768689833, "271"], [54.9166818667, 82.4769821, "273"], [54.9168443333, 82.4772235167, "275"], [54.9166369667, 82.4773580167, "277"], [54.9165761667, 82.4777388, "279"], [54.9168418833, 82.47757295, "281"], [54.9168319167, 82.47791855, "283"], [54.9165834833, 82.47804975, "285"], [54.91697015, 82.4853758167, "344"], [54.9180125667, 82.4811616, "316"], [54.9169954833, 82.48221265, "318"], [54.9157653333, 82.4543129833, "3/88"], [54.9154571667, 82.4552445, "4/88"], [54.8827312167, 82.4872892833, "5"], [54.8831903667, 82.4877676167, "8"], [54.8828024333, 82.4875113, "7"], [54.8831045, 82.4875104167, "6"], [54.8828241, 82.4877701, "9"], [54.88302025, 82.4867592333, "2"], [54.8827238667, 82.4870656, "3"], [54.8832792333, 82.48802495, "10"], [54.88271135, 82.4868632, "1"], [54.8830189167, 82.4869722, "4"], [54.8828316667, 82.4879782167, "11"], [54.8831031667, 82.4879840167, "12"], [54.8829747, 82.4879948833, "13"], [54.88274605, 82.48484915, "21"], [54.8834571667, 82.4855031833, "4"], [54.8834955333, 82.4856944167, "2"], [54.8838132333, 82.4854477333, "3"], [54.8835369833, 82.4848281833, "11"], [54.88336725, 82.48485965, "13"], [54.8831959833, 82.48485645, "15"], [54.8828621167, 82.48476675, "19"], [54.8838400833, 82.4849657333, "7"], [54.8837638167, 82.4848016167, "9"], [54.8829594167, 82.4854216, "10"], [54.8827830667, 82.4855451, "12"], [54.88274165, 82.4853534, "14"], [54.8827611667, 82.4850917, "16"], [54.8830644, 82.48501895, "17"], [54.8838288, 82.4856380833, "1"], [54.8838275, 82.4852247167, "5"], [54.883443, 82.4852514667, "6"], [54.8831229667, 82.4853610833, "8"], [54.8145997, 82.4058182333, "13"], [54.8147182333, 82.4078123, "28"], [54.81457405, 82.4067919, "23"], [54.8140701667, 82.4071422833, "27"], [54.8142806667, 82.4076163167, "29"], [54.8149311167, 82.4068842833, "22"], [54.8150038333, 82.4059631, "16"], [54.7951609167, 82.3942458333, "200"], [54.7911471333, 82.3929187167, "159B"], [54.7905987667, 82.3938164667, "159C"], [54.7912155833, 82.3932714167, "159A"], [54.79397065, 82.3941075167, "190"], [54.7944302667, 82.3943967333, "196"], [54.7902842667, 82.3925200667, "151"], [54.79289115, 82.3931896, "174"], [54.7936966833, 82.3937764, "188"], [54.7941318167, 82.3948274667, "191"], [54.7978721333, 82.3984214333, "249"], [54.7981105667, 82.39574825, "232A"], [54.7938025333, 82.3924897, "178"], [54.7985639333, 82.3952936333, "232B"], [54.7918765, 82.3926438167, "162"], [54.7908330333, 82.39227155, "154"], [54.7962404, 82.3968673, "225"], [54.7923051, 82.3933906333, "171A"], [54.7927951833, 82.3942652333, "171B"], [54.7901405833, 82.3919332833, "146"], [54.7965292833, 82.396445, "226"], [54.7989539333, 82.3987508667, "258"], [54.7975085, 82.3942399167, "218A"], [54.7982403667, 82.3938506167, "218B"], [54.7947115833, 82.3953049, "203"], [54.7925679167, 82.3935303833, "171C"], [54.7951510667, 82.3951699667, "206"], [54.7942058167, 82.39426, "192"], [54.8151522, 82.3671718, "2"], [54.8124476333, 82.3641774667, "38C"], [54.8142324833, 82.3640258333, "36"], [54.8147477833, 82.3658554333, "18"], [54.8149241, 82.3663270333, "14"], [54.8127630333, 82.3645959667, "38D"], [54.8802473333, 82.4761364833, "161"], [54.8803540333, 82.4775673167, "169A"], [54.8808955167, 82.4678431, "87A"], [54.8812967167, 82.45925645, "22A"], [54.8801625833, 82.4788012833, "181"], [54.8801798667, 82.4784953, "179"], [54.8805060333, 82.4783115333, "82"], [54.8802037167, 82.4779421333, "171"], [54.8802002, 82.4782253667, "173"], [54.88066575, 82.4696257, "105"], [54.88142225, 82.4685359, "99D"], [54.880149, 82.4790061333, "183"], [54.8807033, 82.4684905333, "99A"], [54.8811922, 82.4685214167, "99C"], [54.8809802667, 82.4685055, "99B"], [54.88134225, 82.4657706, "69"], [54.8807472167, 82.46754285, "83"], [54.8802148333, 82.4776531667, "169"], [54.8802820833, 82.4763336, "163"], [54.8802558333, 82.4772608667, "165"], [54.8806246667, 82.4705465167, "113"], [54.88113685, 82.4643511667, "53A"], [54.88095905, 82.4643489, "53"], [54.88154715, 82.4657577833, "67"], [54.8809616167, 82.4639502667, "49"], [54.8802025833, 82.48084275, "191A"], [54.8806056333, 82.47098625, "117"], [54.88044865, 82.47329545, "127"], [54.8804726333, 82.47306075, "125"], [54.8806984167, 82.4686680667, "101"], [54.8805955167, 82.4711419833, "117A"], [54.8806145167, 82.4707781333, "115"], [54.88164575, 82.45804455, "16B"], [54.88036875, 82.4755842, "153"], [54.8806508333, 82.4700866667, "109"], [54.8815960333, 82.4577537, "14"], [54.88151485, 82.4579781667, "16A"], [54.8813847833, 82.4644447333, "55"], [54.8813670167, 82.4645692667, "57"], [54.8809571333, 82.4641156833, "51"], [54.8816293, 82.45738225, "10"], [54.8818759333, 82.4575147, "12A"], [54.8820464833, 82.4575854833, "12B"], [54.8820319167, 82.4576747167, "12C"], [54.8818586167, 82.4576652167, "12D"], [54.8810945667, 82.46145875, "36"], [54.8810898, 82.46167115, "38"], [54.8810809667, 82.461937, "40"], [54.8810701667, 82.4621895167, "42"], [54.8812240833, 82.45898385, "20"], [54.88121955, 82.45918975, "22"], [54.8811737667, 82.45983295, "24"], [54.88115855, 82.46004515, "26"], [54.8811441, 82.46023075, "28"], [54.8814057333, 82.4604056667, "30"], [54.8811296167, 82.4604632667, "32"], [54.88144325, 82.4580904667, "18"], [54.88168545, 82.4564695667, "2"], [54.8809346833, 82.4645998167, "59"], [54.8809249833, 82.4648314, "61"], [54.8810648667, 82.4624290833, "44"], [54.8816609833, 82.4570327667, "8"], [54.8804975333, 82.4721639167, "119"], [54.8804971667, 82.4724005167, "121"], [54.8806352, 82.4729319167, "123A"], [54.8804951667, 82.4726299167, "123"], [54.8806614, 82.4698499833, "107"], [54.8806724167, 82.4731077667, "125A"], [54.8808698667, 82.47335925, "129"], [54.8808554167, 82.4735094333, "131"], [54.8804224667, 82.4735332333, "133"], [54.8804913, 82.47469655, "137B"], [54.8803901, 82.4747040167, "137"], [54.8803887333, 82.47486625, "139"], [54.8807482167, 82.46714865, "77A"], [54.8807597833, 82.4669996167, "77"], [54.8807607667, 82.4673298667, "79"], [54.88104675, 82.46741105, "81"], [54.8812452833, 82.4676640333, "85"], [54.8809039167, 82.4650308333, "63"], [54.88112735, 82.4652241167, "65A"], [54.8808660833, 82.4654164833, "65"], [54.8811361, 82.4657563, "71"], [54.8808503, 82.4658921167, "73"], [54.8808297667, 82.4661495833, "75"], [54.8807330167, 82.4677691667, "87"], [54.8811556833, 82.46787915, "89"], [54.88071555, 82.4680383167, "91A"], [54.8807704167, 82.46804005, "91B"], [54.88083325, 82.4680391667, "91C"], [54.8809986, 82.4680511, "91"], [54.8807155167, 82.46826605, "93"], [54.8809702167, 82.4682232667, "95"], [54.8807815333, 82.4750173333, "143"], [54.8803783667, 82.4751021, "145"], [54.88035755, 82.4753576667, "147"], [54.8807471667, 82.47541785, "149"], [54.8807513667, 82.4755767167, "151"], [54.8803393, 82.4758476333, "159"], [54.8802462333, 82.4774083333, "167"], [54.8800620667, 82.4804408, "189"], [54.8800557667, 82.48072595, "191"], [54.88004135, 82.481018, "193"], [54.8807389667, 82.47578795, "155"], [54.88007905, 82.4799234833, "185"], [54.88086485, 82.4703347667, "111A"], [54.8806350333, 82.4703154167, "111"], [54.8800789, 82.4801471833, "187"], [54.8800045833, 82.4815507667, "197"], [54.8800214333, 82.4812237167, "195"], [54.8939151167, 82.4701667, "27"], [54.8936762, 82.4701298, "31"], [54.8924783167, 82.4700222667, "47"], [54.8918865167, 82.469973, "51"], [54.89367495, 82.4697996667, "24"], [54.8943151667, 82.4702028667, "7"], [54.8941286667, 82.4702044, "23"], [54.8942378667, 82.4698431, "2"], [54.8945567833, 82.47024855, "1/1-3/1"], [54.8935522667, 82.4697719, "28"], [54.8939433, 82.4703330667, "25"], [54.8937860667, 82.4701428667, "29"], [54.8935538167, 82.4701164833, "41"], [54.8941460167, 82.46983875, "14"], [54.8938438167, 82.46980825, "18"], [54.8937419667, 82.4698073167, "22"], [54.8944316, 82.4702330333, "3"], [54.8943035167, 82.4704350167, "9"], [54.8926233833, 82.4700377333, "43"], [54.8922256167, 82.47000115, "49"], [54.8917971667, 82.46961, "54"], [54.8926854, 82.469645, "40"], [54.8921227167, 82.4696225333, "48"], [54.8939403167, 82.4698126, "16"], [54.8909714667, 82.4681493667, "33"], [54.89113605, 82.4681601333, "31"], [54.8912736333, 82.4686223167, "26"], [54.892202, 82.4686328333, "16"], [54.8921055833, 82.46861625, "18"], [54.8912406833, 82.4681574833, "27"], [54.89073535, 82.4685119833, "32"], [54.89037515, 82.4686127333, "36"], [54.8907882833, 82.4681261167, "37-39"], [54.8905470833, 82.46806415, "41"], [54.8928384833, 82.4687398333, "4"], [54.8927622667, 82.46885875, "8"], [54.8926823333, 82.4687259, "10"], [54.89258095, 82.4687121167, "12"], [54.89248485, 82.4687019167, "14"], [54.9064365333, 82.4541838333, "29"], [54.9065554833, 82.4549096667, "1/35"], [54.9060750333, 82.4550532833, "3/35"], [54.9058351667, 82.4555274667, "5/35"], [54.9055143333, 82.4559182333, "7/35"], [54.9065810667, 82.4558807167, "36"], [54.9065682333, 82.4553069, "37"], [54.9064074667, 82.4522252167, "9"], [54.9059521, 82.45592445, "2/35"], [54.9108997167, 82.4805822667, "3"], [54.9109122833, 82.47947205, "6A"], [54.9109177167, 82.47936065, "8"], [54.911182, 82.4797094, "10"], [54.9113005167, 82.4794321333, "12"], [54.9111916333, 82.4793347333, "12A"], [54.9112471833, 82.4797754667, "14"], [54.9112473667, 82.4800788167, "11"], [54.9113031333, 82.479914, "13"], [54.91063835, 82.4803100333, "1"], [54.9104951, 82.4800418667, "2"], [54.9107454333, 82.4798887833, "4"], [54.9108743667, 82.4802328833, "5"], [54.9109565333, 82.4797847, "6"], [54.9110407167, 82.4801576333, "7"], [54.9112238167, 82.4804073167, "9"], [54.921572, 82.4690554667, "8"], [54.9210102667, 82.4691739667, "1"], [54.9209054, 82.4687952333, "2"], [54.92139265, 82.4695081333, "3"], [54.9212156833, 82.4688233667, "4"], [54.92161785, 82.4693603333, "5"], [54.9215667, 82.4686771667, "6"], [54.8971280667, 82.3833620167, "104"], [54.8928069667, 82.3849023833, "58"], [54.8960316833, 82.3834830167, "1/84"], [54.8904228167, 82.38549425, "28"], [54.8953458333, 82.3837370167, "84"], [54.82145425, 82.3649986833, "7"], [54.81972895, 82.3640394833, "24"], [54.8211835333, 82.3645971667, "11"], [54.8207776167, 82.3647366833, "14"], [54.8209467167, 82.3640718167, "15"], [54.8203904333, 82.3652387, "12"], [54.9137399667, 82.3922778167, "2/73"], [54.91124595, 82.39246205, "46"], [54.9139008833, 82.3922517333, "3/73"], [54.91350815, 82.39233345, "1/73"], [54.9176178167, 82.4598785667, "19"], [54.9184013833, 82.4603797833, "14"], [54.9186543333, 82.4622474833, "6"], [54.9173606667, 82.46006885, "19B"], [54.9174988, 82.4603532, "19C"], [54.9177378167, 82.4601680667, "19D"], [54.91904695, 82.4627864167, "1"], [54.9187282, 82.46300145, "2"], [54.91901275, 82.46243355, "3"], [54.9186912, 82.46265345, "4"], [54.91856195, 82.4613744167, "10"], [54.91851535, 82.4609194, "12"], [54.9189516833, 82.4617426667, "5"], [54.9188849, 82.4613117333, "7"], [54.9186173667, 82.4618227833, "8"], [54.9188575667, 82.4608533167, "9"], [54.9173323833, 82.4597201333, "19A"], [54.9178891, 82.4598711167, "17"], [54.9180202833, 82.46025785, "16"], [54.9016754833, 82.4689591, "10"], [54.9008128667, 82.4686879833, "2"], [54.9009759333, 82.46843985, "1"], [54.9014464, 82.4685093167, "5"], [54.90130095, 82.4688850167, "6"], [54.9016211667, 82.4685312667, "7"], [54.9014644167, 82.4690226833, "8"], [54.9014864167, 82.4687479667, "9"], [54.9010720333, 82.4687982333, "4"], [54.9011746, 82.4685293333, "3"], [54.9013743333, 82.4862629167, "3"], [54.9017248, 82.48698725, "6"], [54.9012848, 82.4859531833, "2"], [54.9016014833, 82.4860586167, "10"], [54.9014527667, 82.4865486167, "4"], [54.90159855, 82.48677855, "5"], [54.90183005, 82.4869517667, "7"], [54.9017713833, 82.4866214167, "8"], [54.9016935, 82.4863532333, "9"], [54.90753, 82.46902475, "11"], [54.9095893167, 82.4677886667, "39B"], [54.9109792833, 82.4682655, "46A"], [54.91108275, 82.4685749667, "46B"], [54.91115625, 82.4686338833, "48C"], [54.9110050167, 82.46807085, "48A"], [54.91095895, 82.46781955, "48"], [54.9108204, 82.4678798667, "46"], [54.9110788833, 82.4683501, "48B"], [54.9113655167, 82.4678862333, "52B"], [54.9108344833, 82.4674433667, "45"], [54.9080208833, 82.4692374833, "22"], [54.9083263167, 82.4686353333, "27"], [54.90844025, 82.4697672333, "26"], [54.90818025, 82.4691643, "22A"], [54.91258895, 82.4673144833, "64"], [54.9123684167, 82.4671105167, "62"], [54.9127896, 82.4663434833, "67"], [54.91150695, 82.46757075, "54"], [54.9098419667, 82.4683599167, "40"], [54.91097155, 82.4673723, "47"], [54.9078617667, 82.4693023667, "20"], [54.9089053833, 82.4683338, "29"], [54.9099875333, 82.46828695, "42"], [54.9113045167, 82.4682282833, "50A"], [54.9107373, 82.4665437833, "47C"], [54.9108713, 82.4665006167, "49B"], [54.9129575833, 82.4665350833, "69"], [54.9108057333, 82.4667861, "47B"], [54.9108904167, 82.4670609667, "47A"], [54.9110041, 82.4668838667, "49A"], [54.9111488833, 82.4673072667, "49"], [54.9127369333, 82.46653495, "65"], [54.91122205, 82.46770665, "52"], [54.9113599, 82.467657, "52A"], [54.9075002667, 82.4694598, "12"], [54.9076741, 82.46939185, "14"], [54.9078864833, 82.4699014333, "16"], [54.9079676667, 82.46986515, "18"], [54.90833225, 82.4695654167, "24"], [54.9084313667, 82.4690023, "28"], [54.9096631167, 82.46843925, "38"], [54.9096189, 82.4680248667, "39"], [54.911315, 82.4684015667, "50"], [54.9073078333, 82.4691221167, "9"], [54.9093386167, 82.4686052333, "34"], [54.9091743667, 82.4682295833, "35"], [54.90945425, 82.4681136333, "37"], [54.90950645, 82.4685246333, "36"], [54.9091745333, 82.4686900667, "32"], [54.9127273333, 82.4669306667, "66"], [54.913043, 82.4669127667, "68"], [54.9113586333, 82.4672288167, "51"], [54.9113531667, 82.4670099667, "51A"], [54.9127951, 82.46667535, "71"], [54.884095, 82.4568770667, "69A"], [54.8838324333, 82.4568632333, "73A"], [54.8866347667, 82.4565719833, "43"], [54.8906992, 82.4569129667, "5"], [54.8905596667, 82.4568912833, "7"], [54.8892758333, 82.456777, "13A"], [54.8901881167, 82.45687625, "1/11-11/11"], [54.89070845, 82.4565194333, "1/4-3/4"], [54.8902009333, 82.4563996667, "1/6-32/6"], [54.8880562333, 82.4552566667, "26A"], [54.8844905833, 82.4563941, "65"], [54.8840861833, 82.45635875, "69"], [54.8863777, 82.45685, "45A"], [54.8909978167, 82.4569555833, "3"], [54.8863633167, 82.4571221667, "45B"], [54.8864835667, 82.4565624833, "45"], [54.8881257667, 82.4569633333, "25A"], [54.8905126667, 82.4574578833, "5A"], [54.8907166167, 82.4575558333, "5B"], [54.8866317167, 82.4572218, "41A"], [54.8873822167, 82.4566324, "33"], [54.8872964167, 82.4566407167, "35"], [54.8866143833, 82.4569883667, "41"], [54.8837334333, 82.45685885, "75A"], [54.8860936, 82.4570698167, "49"], [54.8855037167, 82.4564867333, "57"], [54.8847617833, 82.4564164833, "59"], [54.8844513167, 82.4566735333, "65A"], [54.88419435, 82.45689485, "67A"], [54.8842829333, 82.4563860333, "67"], [54.88391675, 82.4563527, "73"], [54.8837116667, 82.4563469333, "75"], [54.889394, 82.4567865833, "13"], [54.8890782333, 82.4567699333, "15"], [54.8888433833, 82.4567615833, "17"], [54.8886293333, 82.45674825, "19"], [54.8884455333, 82.4567414833, "21"], [54.8882809333, 82.45673085, "23"], [54.8881163667, 82.456655, "25"], [54.8880094667, 82.4562455667, "26"], [54.89142225, 82.4569765, "1"], [54.8914418, 82.4565121, "2"], [54.8870694, 82.4566186333, "37"], [54.8868689667, 82.45709495, "39A"], [54.8868342167, 82.4565953333, "39"], [54.8863517167, 82.4573732167, "45C"], [54.8861983667, 82.4570712667, "47A"], [54.8862286, 82.4568411833, "47B"], [54.8880125833, 82.4547576833, "26B"], [54.8860945833, 82.4565352167, "49A"], [54.8904199167, 82.4568860167, "1/9-12/9"], [54.8857833, 82.4565171833, "53"], [54.8856455167, 82.45651885, "55"], [54.8817373833, 82.4556858833, "72"], [54.88593655, 82.45653005, "51"], [54.8862765833, 82.4565127, "47"], [54.8775379833, 82.4825127167, "28A"], [54.87727315, 82.482376, "28"], [54.87729155, 82.4821068667, "26"], [54.8769019667, 82.4786293, "4C"], [54.8767004333, 82.4787606, "4B"], [54.8772910833, 82.4818029333, "24"], [54.8771890667, 82.48153255, "22"], [54.87708045, 82.4812278, "20"], [54.8775351, 82.4826397667, "30A"], [54.8772534167, 82.4827040167, "30"], [54.877579, 82.4818970667, "24A"], [54.876712, 82.4812017667, "21"], [54.8773884333, 82.4832404167, "36"], [54.8769804167, 82.4824093, "27"], [54.8766636667, 82.482704, "31B"], [54.8769937167, 82.4830107167, "31"], [54.8767516667, 82.479482, "8A"], [54.8769705667, 82.4818533667, "23"], [54.8766017167, 82.48246365, "29A"], [54.8764641833, 82.4825834, "29B"], [54.8769964667, 82.4820980833, "25"], [54.8769606333, 82.4826863833, "29"], [54.87679475, 82.4828674667, "31A"], [54.8770826, 82.4832520333, "33"], [54.8772377, 82.48334835, "35"], [54.8775367167, 82.48363695, "36A"], [54.8775890833, 82.4831116, "34"], [54.8773408667, 82.4829609, "32"], [54.8762828667, 82.4801149667, "11"], [54.87597055, 82.4792251167, "3"], [54.8760466167, 82.4794375833, "5"], [54.8761314, 82.4796617, "7"], [54.8764699833, 82.48058085, "15"], [54.8765455167, 82.4808159833, "17"], [54.8767292667, 82.48028335, "14"], [54.8765539833, 82.4798159833, "10"], [54.87646245, 82.4795675, "8"], [54.8763712167, 82.4793057167, "6"], [54.8776228167, 82.481266, "20B"], [54.8775729667, 82.482055, "26A"], [54.8776195833, 82.4814085333, "22B"], [54.8765414, 82.4790666667, "6A"], [54.8773585333, 82.48356815, "38A"], [54.8762120667, 82.4798686667, "9"], [54.8766452667, 82.4800751167, "12"], [54.8763675, 82.48034475, "13"], [54.8766347833, 82.4810402667, "19"], [54.8774052167, 82.4812147167, "20A"], [54.8774057667, 82.4814070167, "22A"], [54.8762723167, 82.479009, "4"], [54.8761971167, 82.4787850833, "2"], [54.8767849, 82.4796004667, "10A"], [54.87648555, 82.47892075, "4A"], [54.8767848, 82.4788595833, "6B"], [54.8997092333, 82.4818082, "7"], [54.8999472667, 82.4825543, "15"], [54.8999358167, 82.4815958167, "4"], [54.9000434833, 82.4825363833, "17"], [54.9002215333, 82.4828014167, "16"], [54.90002095, 82.4818578, "6"], [54.9000853167, 82.48210025, "8"], [54.8997820833, 82.4820087333, "9"], [54.8998240167, 82.4822147833, "11"], [54.8998576333, 82.48247455, "13"], [54.8996422833, 82.4815878833, "5"], [54.9002942833, 82.482764, "14"], [54.9001676167, 82.4824792667, "12"], [54.89953345, 82.4811912333, "1"], [54.8997866833, 82.4810307833, "2"], [54.8995802333, 82.4813792333, "3"], [54.9001401333, 82.4822942333, "10"], [54.8914648833, 82.4772108167, "7"], [54.8919011833, 82.47723515, "1"], [54.89187105, 82.4768182, "2"], [54.8913584, 82.4765354167, "3/6"], [54.8897734833, 82.47664395, "22"], [54.8913508, 82.47668445, "1/6"], [54.8915273667, 82.4762602, "12/6"], [54.8916285, 82.4772315333, "5"], [54.8913796, 82.4761122167, "7/6"], [54.8915023833, 82.4767099333, "8/6"], [54.89152, 82.4763519333, "11/6"], [54.8915372, 82.4760592333, "14/6"], [54.89153065, 82.4761616667, "13/6"], [54.8915142333, 82.4764663667, "10/6"], [54.8913717333, 82.4763199333, "5/6"], [54.8905254833, 82.4766904, "14"], [54.8903609333, 82.4766834833, "16"], [54.88999105, 82.4766566833, "20"], [54.8898741167, 82.4770700667, "21"], [54.88946535, 82.4766037667, "24"], [54.8890790333, 82.4764705833, "28"], [54.88883405, 82.4767525667, "29"], [54.8886383, 82.47663365, "31"], [54.8913739667, 82.47622135, "6/6"], [54.8913652833, 82.47641835, "4/6"], [54.8901779667, 82.4766671167, "18"], [54.8843281, 82.4794198167, "104"], [54.88535045, 82.4866782167, "184"], [54.8854485333, 82.4864475167, "182"], [54.8867971833, 82.4705084167, "34"], [54.8873998833, 82.4682775833, "20"], [54.8873415667, 82.46844545, "22"], [54.884267, 82.4871188333, "189"], [54.8843410333, 82.4813043, "114A"], [54.8836708667, 82.47833265, "90A"], [54.88402285, 82.4784176667, "2/92"], [54.8841246, 82.4784325, "1/92"], [54.8874953667, 82.4680249333, "18"], [54.8882076333, 82.4665346667, "2"], [54.8847749, 82.4777212667, "89"], [54.8847129167, 82.4883360167, "198"], [54.8852412667, 82.4950174167, "258"], [54.8851558333, 82.4809135167, "111A"], [54.88425915, 82.490565, "219"], [54.8843227167, 82.4792336667, "102"], [54.8853703333, 82.47613215, "70"], [54.8841992667, 82.4963818333, "267"], [54.8839456333, 82.47862415, "96"], [54.8849404833, 82.4785609167, "91B"], [54.8834439167, 82.5003043667, "309"], [54.8859648333, 82.4880242333, "2/194"], [54.88679165, 82.4708238833, "36"], [54.8846928333, 82.4966356667, "270"], [54.8843265, 82.4790500333, "100"], [54.8847626167, 82.48078795, "109"], [54.88474565, 82.4788347167, "93"], [54.8843263, 82.4786463833, "94"], [54.8847555167, 82.4792519167, "95"], [54.8847507833, 82.4802669333, "103"], [54.8877261667, 82.4675846667, "1/14-8/14"], [54.884759, 82.4805435333, "105"], [54.8843192, 82.4802557667, "108"], [54.8847632167, 82.4813335333, "113"], [54.8880664667, 82.4668566667, "4"], [54.8843192833, 82.4781745833, "88"], [54.8842179667, 82.4927192667, "239"], [54.8842136333, 82.4948947333, "257"], [54.8841869, 82.4971351, "275"], [54.8842592167, 82.487337, "191"], [54.8842746, 82.4896256667, "213"], [54.8842726, 82.4898100833, "1/213"], [54.8846939167, 82.49589215, "264"], [54.8847557667, 82.480013, "101"], [54.8847654333, 82.488289833, "117"], [54.8843088167, 82.4819155, "120"], [54.88495845, 82.4760208167, "74A"], [54.8858546833, 82.48954395, "1/214"], [54.8847226333, 82.49078585, "222"], [54.8853824333, 82.4904875333, "220"], [54.8851609, 82.4769312833, "75"], [54.8832135333, 82.4966401667, "273"], [54.8871125333, 82.4687638667, "24A"], [54.8836533833, 82.49965535, "303"], [54.8847623833, 82.4784197, "91"], [54.8853003167, 82.4812587, "113B"], [54.8839543333, 82.4780861333, "86"], [54.8846811667, 82.49516135, "260"], [54.8856284667, 82.4877555167, "1/194"], [54.88470535, 82.4899576833, "1/218"], [54.8858448, 82.4898961, "2/218"], [54.8857487667, 82.4882389667, "3/194"], [54.8858920833, 82.4886561833, "4/194"], [54.8854131167, 82.4885925, "202"], [54.8852231333, 82.48536035, "174"], [54.88721395, 82.4674219167, "12A"], [54.8850944, 82.4812663333, "113A"], [54.8858759667, 82.4852820333, "172"], [54.8843297167, 82.4777121167, "80"], [54.8867259833, 82.4716590667, "42"], [54.8841291333, 82.4812217833, "114"], [54.8878423667, 82.46733415, "10"], [54.8873731, 82.46722755, "12"], [54.8873645167, 82.4677444, "16A"], [54.8873792, 82.4676194833, "16B"], [54.8871674667, 82.4675664, "16C"], [54.8871631333, 82.4677062, "16D"], [54.88761885, 82.4678307833, "16"], [54.8872513, 82.4677940833, "18A"], [54.8868627833, 82.4703096167, "32"], [54.8866729333, 82.4725751667, "46"], [54.8866649333, 82.4727545667, "48"], [54.8866508833, 82.4729862833, "50"], [54.8866308167, 82.4733044333, "52"], [54.8866201167, 82.4735912, "54"], [54.8866046, 82.4738994833, "56"], [54.8867646333, 82.4710940833, "38"], [54.8867434167, 82.4713738, "40"], [54.8865795333, 82.471651, "42A"], [54.8867192167, 82.4718726833, "44"], [54.8879124167, 82.4671744, "8"], [54.8847677333, 82.48104275, "111"], [54.8842908, 82.4810946667, "112"], [54.8847655167, 82.48152025, "115"], [54.8842992333, 82.4815339, "116"], [54.8843125167, 82.488239167, "118"], [54.8847685333, 82.4795402167, "97"], [54.8847615667, 82.4797710333, "99"], [54.8849925167, 82.48009295, "101A"], [54.8850730167, 82.4803513167, "103A"], [54.8850517667, 82.4806989167, "107"], [54.8842659667, 82.4776982667, "80A"], [54.8843255167, 82.4779083833, "82"], [54.88372445, 82.4779537667, "84A"], [54.88391925, 82.4779436333, "84"], [54.8839372667, 82.4783140167, "90"], [54.8849343833, 82.47834135, "91A"], [54.8843215, 82.47842775, "92"], [54.88379995, 82.4786243333, "96A"], [54.8843308167, 82.47886585, "98"], [54.8846524333, 82.4766493167, "76"], [54.8845290833, 82.4764747667, "78A"], [54.8845141833, 82.47672525, "78"], [54.8847249, 82.4874558833, "192"], [54.88422795, 82.4880656333, "197"], [54.8842586167, 82.4888764, "205"], [54.8847152, 82.4891847, "206"], [54.8847452333, 82.48597775, "180"], [54.8842725667, 82.4862342167, "181"], [54.8842734167, 82.4864492, "183"], [54.88427415, 82.4866713, "185"], [54.8847306167, 82.48657095, "186"], [54.88426915, 82.48689685, "187"], [54.8842773667, 82.4856398, "179"], [54.8852212833, 82.4924678, "236"], [54.8854883167, 82.4880036333, "194"], [54.8854214333, 82.48956085, "212"], [54.8853153667, 82.4872245, "190"], [54.8841928667, 82.4931503833, "241"], [54.8844711667, 82.4984144, "290"], [54.8842522667, 82.4992926333, "296"], [54.88368415, 82.4993789667, "299"], [54.8852287833, 82.49615515, "268"], [54.8859148667, 82.4897217, "214"], [54.8872887667, 82.4686820167, "24"], [54.8862459167, 82.47553185, "66"], [54.884721, 82.48537045, "176"], [54.88427605, 82.4851847833, "82"], [54.8842737833, 82.4854139833, "177"], [54.88469795, 82.4945610167, "252"], [54.8853844667, 82.47677695, "73"], [54.8850111333, 82.4763984, "74"], [54.8847382167, 82.4869962333, "188"], [54.8872426333, 82.4689359833, "26"], [54.8847101833, 82.4880854667, "196"], [54.8850733, 82.4902483167, "218"], [54.8865769333, 82.4741854167, "58"], [54.8865507, 82.4747159333, "62"], [54.88798625, 82.46700445, "6"], [54.8865659, 82.4744709833, "60"], [54.8865476667, 82.4748834667, "64"], [54.8871864333, 82.4691891, "28"], [54.8871582, 82.4693788167, "30"], [54.8869467833, 82.4687736667, "26A"], [54.8856446167, 82.4771148167, "71"], [54.8851925333, 82.4762547833, "72"], [54.8869292167, 82.4689437, "26B"], [54.88426605, 82.48474735, "171"], [54.884281, 82.4849628667, "173"], [54.8847245167, 82.4848834667, "170"], [54.8680607667, 82.4844529, "318"], [54.86322315, 82.477174, "229"], [54.86023885, 82.47171045, "177"], [54.86190065, 82.4739293333, "200"], [54.8673314333, 82.4835841, "306"], [54.8671325167, 82.4839981167, "307"], [54.8657566333, 82.4825140333, "287"], [54.85661605, 82.4580103167, "35"], [54.8584986667, 82.4693192667, "151"], [54.86640715, 82.4833253333, "293"], [54.8662972, 82.48401185, "301"], [54.8615068, 82.4740312667, "197"], [54.86248105, 82.4746844667, "208"], [54.8654257333, 82.4789157833, "256"], [54.86815405, 82.4856843833, "327"], [54.8559617833, 82.4538523, "5"], [54.8560217167, 82.4541485167, "7"], [54.8545882, 82.4628883167, "73"], [54.8623530667, 82.4756642667, "211"], [54.8571193833, 82.46393905, "91"], [54.8612014833, 82.47249975, "184"], [54.8409288167, 82.37611985, "48"], [54.8396866, 82.3762834833, "52"], [54.840238, 82.3744657333, "75"], [54.84304635, 82.3783802167, "24"], [54.8407690333, 82.3753619333, "59"], [54.8447812333, 82.3774333333, "5"], [54.83956405, 82.3732069667, "82"], [54.84004855, 82.3731001333, "83"], [54.8401183167, 82.3739726667, "77B"], [54.8406453, 82.3751587333, "63"], [54.8435605667, 82.3793269333, "20"], [54.848291667, 82.3760676667, "49"], [54.8413693, 82.3763867167, "46"], [54.8399756833, 82.3748775, "74"], [54.8421274167, 82.3758927833, "47"], [54.8433708, 82.37858675, "22"], [54.8410302333, 82.3737431833, "77A"], [54.7912387167, 82.4809981333, "33"], [54.7921037167, 82.48244855, "34"], [54.7931116833, 82.4894669167, "108"], [54.7922422833, 82.4888664333, "109"], [54.8904655, 82.4340570833, "16"], [54.8912684167, 82.4347386333, "38"], [54.8918202833, 82.4356853333, "41"], [54.9076504833, 82.4808292167, "2"], [54.9077122167, 82.4810869667, "3"], [54.9078427, 82.4811889667, "4"], [54.9079905333, 82.4810739167, "5"], [54.9079955, 82.4808534333, "6"], [54.9078875833, 82.48062165, "7"], [54.8624973167, 82.3995043333, "1302"], [54.86458815, 82.3984334333, "1302B"], [54.8495279667, 82.3855142, "1105"], [54.8409388, 82.3715485333, "965"], [54.8497607833, 82.3787181667, "1048D"], [54.8474886167, 82.3815213, "1071"], [54.8692470333, 82.4060449833, "1399"], [54.86903025, 82.4050720333, "1410"], [54.8720073, 82.4080915167, "1435"], [54.8472647, 82.3801392333, "1050"], [54.8484202, 82.37745075, "1048B"], [54.8501358167, 82.37656745, "1048C"], [54.8464420667, 82.3786923167, "1048A"], [54.8636343667, 82.3989099167, "1302A"], [54.86024445, 82.39640055, "1262B"], [54.8455550167, 82.3768668, "1032"], [54.8498453667, 82.3860935167, "1113"], [54.8508258833, 82.3877938167, "1129"], [54.8538246333, 82.3925789833, "1193"], [54.8560212667, 82.3943255167, "1209"], [54.8600963167, 82.39687755, "1262A"], [54.8619671667, 82.398902, "1292"], [54.8647795167, 82.4015556333, "1328A"], [54.8641711, 82.40119575, "1328B"], [54.8653665667, 82.4021896833, "1328"], [54.8664159, 82.4057836, "1343"], [54.8487010667, 82.3828026833, "1084B"], [54.8487082, 82.3838392667, "1095"], [54.84854995, 82.3826141833, "1084A"], [54.8614933, 82.3962749667, "1262C"], [54.8941389333, 82.4685426667, "1A"], [54.8940808333, 82.46863395, "1C"], [54.8941101167, 82.46858455, "1B"], [54.8828690833, 82.4756987833, "2"], [54.8829161167, 82.4758464333, "3"], [54.8828703333, 82.47600365, "4"], [54.8826165, 82.4759774167, "5"], [54.8827374, 82.4756385167, "1"], [54.8987844, 82.5778468, "196"], [54.894548, 82.5752196167, "249"], [54.8985254833, 82.5770166167, "3/207"], [54.8979621333, 82.5725676167, "1/207"], [54.9028557167, 82.5775770667, "1/159"], [54.8968063833, 82.5714292167, "2/209"], [54.8982935667, 82.5770144167, "4/207"], [54.9069320167, 82.5687670833, "57"], [54.89817425, 82.5708251167, "2/207"], [54.90506995, 82.5738151167, "103"], [54.9103484333, 82.57042275, "15"], [54.8938830167, 82.57586675, "1/253"], [54.8936416667, 82.5760817333, "2/253"], [54.90255875, 82.5776407833, "2/159"], [54.9004225167, 82.57797105, "178"], [54.8969604, 82.5723327, "1/209"], [54.8767003833, 82.4818637833, "31"], [54.8757476333, 82.4817359, "21A"], [54.87485205, 82.4797409167, "8"], [54.87404295, 82.47989395, "5B"], [54.8752598667, 82.4811949, "15A"], [54.8760220833, 82.4807411167, "18A"], [54.8743084667, 82.4802727, "7A"], [54.8738682667, 82.4797568167, "3C"], [54.8742434333, 82.47987315, "5A"], [54.8759584333, 82.4806079667, "16A"], [54.87510295, 82.48015575, "12"], [54.8748438833, 82.48075465, "11A"], [54.8763291167, 82.4819017667, "27"], [54.8763574333, 82.4822859833, "29A"], [54.8751449333, 82.48070945, "13"], [54.8761885667, 82.4822191333, "27A"], [54.8746679833, 82.4804258667, "9A"], [54.87496675, 82.4808899333, "13A"], [54.8757570833, 82.4808296833, "16"], [54.8758986833, 82.4809562833, "18"], [54.87612285, 82.4811980333, "20"], [54.87624255, 82.4813098333, "22"], [54.8748282667, 82.47948305, "4"], [54.875127, 82.47954055, "6"], [54.8765282333, 82.4819416667, "29"], [54.87591735, 82.48192895, "23"], [54.8759485667, 82.4815328667, "21"], [54.87574945, 82.4813294167, "19"], [54.8742483167, 82.4796583833, "3A"], [54.8745132, 82.4795744833, "3"], [54.8744832833, 82.4792603167, "1"], [54.8745364667, 82.4798557, "5"], [54.8746295, 82.4801628, "7"], [54.8747969, 82.480295, "9"], [54.8745014333, 82.48041985, "9B"], [54.8740439, 82.4796883833, "3B"], [54.8764163833, 82.48148435, "24"], [54.8753753333, 82.4813299167, "17A"], [54.8749682667, 82.4800068, "10"], [54.8761475667, 82.481741, "25"], [54.8755644, 82.4811591833, "17"], [54.8753512333, 82.4809225, "15"], [54.87494615, 82.4804919833, "11"], [54.87563925, 82.4816151667, "19A"], [54.8755416, 82.4806192667, "14"], [54.9307413833, 82.4305783833, "8"], [54.9316973167, 82.4500289833, "174"], [54.9312246333, 82.4509272167, "183"], [54.9317041167, 82.4519870667, "192"], [54.9309645833, 82.4455487, "131"], [54.9313707333, 82.4417409833, "106"], [54.93144905, 82.4439987167, "124"], [54.9312471833, 82.44044115, "90"], [54.9310525167, 82.4572123333, "249"], [54.9304025833, 82.4600948, "271"], [54.9313988167, 82.4667548167, "330"], [54.9317416, 82.4711342333, "370"], [54.9311057, 82.4496502333, "171"], [54.9307743333, 82.46711525, "333"], [54.8983426, 82.4726432167, "6"], [54.8982667833, 82.4723224167, "10"], [54.8981903, 82.4719677667, "14"], [54.8981034667, 82.478259, "16"], [54.8979483667, 82.47163995, "18"], [54.8978498167, 82.4718887667, "9"], [54.89804025, 82.4727496, "1"], [54.8978692667, 82.4717117333, "11"], [54.8982294833, 82.4721665, "12"], [54.8983239333, 82.4724718833, "8"], [54.89833275, 82.4728329, "4"], [54.89817045, 82.4730263833, "2"], [54.8979749667, 82.4721439333, "7"], [54.8978645167, 82.4723602833, "5"], [54.8980527833, 82.4724426, "3"], [54.9118492167, 82.4777301333, "75"], [54.9071599667, 82.48024025, "27A"], [54.9070499833, 82.4802823167, "27"], [54.9133935, 82.477312, "101"], [54.9109577667, 82.4792493167, "58A"], [54.907982667, 82.4798474167, "35"], [54.9057049167, 82.48129845, "18"], [54.9045409833, 82.4821761, "8A"], [54.9132981167, 82.47734815, "99"], [54.9151731167, 82.4762851667, "115A"], [54.9159149667, 82.4765031667, "128A"], [54.9160620833, 82.4770954, "126"], [54.91362925, 82.4775332333, "96"], [54.9161206833, 82.47737745, "124"], [54.9138744167, 82.4774362833, "98"], [54.9159982167, 82.4768568, "126A"], [54.9045271167, 82.4818595, "8"], [54.9088441167, 82.4798303833, "40"], [54.9080257833, 82.4798009667, "37"], [54.9118080833, 82.4780394667, "73"], [54.9120441667, 82.4783650167, "80"], [54.9142880667, 82.4768798167, "107B"], [54.9159508833, 82.4774919167, "122A"], [54.9050646333, 82.4819231333, "14A"], [54.9066002, 82.4808875, "28A"], [54.90519225, 82.4815441667, "16"], [54.91452115, 82.477165, "106"], [54.90746095, 82.4804961333, "32"], [54.91248555, 82.47814135, "86"], [54.9158230167, 82.4760962167, "123"], [54.9159919, 82.47604385, "125"], [54.91623445, 82.4763621, "130"], [54.90872535, 82.4791772, "41A"], [54.9044587, 82.4821471167, "6A"], [54.9075026667, 82.4797328167, "33A"], [54.9109141167, 82.4788989667, "58"], [54.9048600833, 82.4817091833, "12"], [54.9156691333, 82.4761731833, "121"], [54.9159156667, 82.4772401333, "120"], [54.9158559667, 82.4770386667, "118"], [54.9153897167, 82.4763100667, "117"], [54.9155261333, 82.4762367333, "119"], [54.9143680667, 82.4772159833, "104"], [54.9091816833, 82.4799197, "44A"], [54.9063697833, 82.4811747, "26B"], [54.9055854667, 82.4813526667, "18B"], [54.9140346667, 82.4774023333, "100"], [54.9160233167, 82.4772866833, "122B"], [54.9046896833, 82.4817846667, "10"], [54.9078630333, 82.4802907167, "34"], [54.9074586667, 82.4800447667, "31"], [54.90766965, 82.4799655333, "33"], [54.9121775667, 82.4782823667, "82"], [54.91233785, 82.4782158167, "84"], [54.9135061167, 82.47759595, "92"], [54.9141940333, 82.4769194, "107A"], [54.9047462167, 82.4820914167, "10A"], [54.9071456333, 82.4806193333, "30"], [54.9126591, 82.4780602, "88"], [54.9043394833, 82.4819642167, "6"], [54.9136969, 82.47784185, "96A"], [54.9162752167, 82.4761951167, "132"], [54.9120850833, 82.4778879333, "77"], [54.9072933667, 82.48012235, "29"], [54.9058775167, 82.4812227667, "20"], [54.9060436, 82.48114975, "22"], [54.90620285, 82.4810768167, "24"], [54.9063685833, 82.4809921833, "26"], [54.9065447667, 82.4809131167, "28"], [54.91495335, 82.47652165, "111"], [54.9087348, 82.4794214667, "41"], [54.9089801333, 82.47978555, "42"], [54.9089057333, 82.4793457667, "43"], [54.9095931667, 82.4790578, "51"], [54.9123723167, 82.4777452667, "81"], [54.9126095167, 82.47765015, "91"], [54.91277265, 82.4775717667, "93"], [54.91509955, 82.4768812333, "110"], [54.9152698333, 82.476794, "112"], [54.9154395, 82.4767326333, "114"], [54.91572125, 82.4765971833, "116"], [54.9102388667, 82.47919135, "50"], [54.9048902, 82.4819941833, "12A"], [54.9091995333, 82.47891055, "47A"], [54.9150900667, 82.4764547333, "113"], [54.91524275, 82.4763963833, "115"], [54.9094314833, 82.4791159333, "49"], [54.9096957667, 82.4794569, "48A"], [54.9091736667, 82.4796928333, "44"], [54.9104137167, 82.4791214333, "52"], [54.9095526333, 82.47951535, "48"], [54.9092440667, 82.4791909833, "47"], [54.905025, 82.4816333, "14"], [54.91218695, 82.4778348667, "77A"], [54.9105796, 82.4790363667, "54"], [54.9142164167, 82.4773281, "102"], [54.9093673833, 82.4796006833, "46"], [54.9107540667, 82.4789564333, "56"], [54.9090764333, 82.4792701333, "45"], [54.9122119833, 82.4774975, "79"], [54.9051519, 82.4770494, "5/37B"], [54.9072341833, 82.4812645, "74"], [54.90539015, 82.47753615, "21/37B"], [54.9064404833, 82.4786360667, "52"], [54.9053830667, 82.4751337333, "28"], [54.9053326, 82.4740749833, "20A"], [54.9055134833, 82.4740488, "20C"], [54.90547225, 82.4739782, "20B"], [54.9053470167, 82.4742053667, "20D"], [54.9069486333, 82.4814998167, "73"], [54.9051562667, 82.4778512167, "17/37B"], [54.9052251333, 82.4746236833, "24"], [54.9053746, 82.4777257833, "19/37B"], [54.9071479667, 82.4809996833, "72"], [54.9050343167, 82.47739, "24/37B"], [54.9049808, 82.4775142667, "25/37B"], [54.9051211333, 82.4773504667, "23/37B"], [54.9068252833, 82.4810905167, "69"], [54.9047089333, 82.4739594, "19"], [54.9040900833, 82.4718856167, "1"], [54.9048747833, 82.4744885333, "23"], [54.90479065, 82.4742263667, "21"], [54.905018, 82.47392355, "16"], [54.9063578667, 82.4783819333, "50"], [54.9049504167, 82.4747584333, "25"], [54.9050288833, 82.47502195, "27"], [54.9072899333, 82.48271985, "85"], [54.9054541333, 82.4776966667, "20/37B"], [54.90488845, 82.4772389833, "27/37B"], [54.9047877333, 82.4775819667, "13/37B"], [54.9049796, 82.4771942833, "28/37B"], [54.9073132333, 82.4815289167, "76"], [54.9050827, 82.47699535, "6/37B"], [54.9061134667, 82.4770216167, "40A"], [54.90611365, 82.4768269667, "38B"], [54.9076197, 82.4825873167, "84"], [54.9070038333, 82.4817050667, "75"], [54.9047039333, 82.47730165, "11/37B"], [54.9075484833, 82.4823327833, "82"], [54.9054264167, 82.4753033833, "30"], [54.9069885833, 82.47905425, "58"], [54.906228, 82.477926, "48"], [54.9058200667, 82.4765282833, "32"], [54.9046413667, 82.4737464333, "17"], [54.9050075333, 82.4778885167, "16/37B"], [54.90499485, 82.4768944167, "7/37B"], [54.9046556167, 82.4771346, "10/37B"], [54.90527195, 82.47690975, "1/37B"], [54.9052758833, 82.4771711833, "3/37B"], [54.9052169, 82.4771015167, "4/37B"], [54.90529785, 82.4770102333, "2/37B"], [54.9058489333, 82.47780495, "45"], [54.9048925167, 82.4769351667, "8/37B"], [54.9043826, 82.4728787667, "15"], [54.9049060333, 82.47352905, "12"], [54.9056042667, 82.47696875, "37"], [54.9049538167, 82.47372635, "14"], [54.9048069667, 82.4730782, "10"], [54.90405505, 82.4727157833, "11"], [54.9043442, 82.4726702333, "13"], [54.9039020833, 82.4723256667, "5"], [54.9046807667, 82.4726619167, "6"], [54.9047340667, 82.47286755, "8"], [54.9050737, 82.4741203667, "18"], [54.90621865, 82.47643995, "34"], [54.9055253667, 82.4767246667, "35"], [54.9062645167, 82.4765613333, "36"], [54.9059193, 82.4768274667, "38"], [54.90570735, 82.4773252333, "39"], [54.9059801833, 82.4770579, "40"], [54.9062604167, 82.4772333833, "42B"], [54.9057853667, 82.4775903, "43"], [54.9061028167, 82.4774772667, "44"], [54.90589465, 82.47796755, "47"], [54.9068853333, 82.48130165, "71"], [54.9071345833, 82.4821319833, "79"], [54.9074696333, 82.4820778, "80A"], [54.90765195, 82.4820632833, "80B"], [54.9071948, 82.4823366167, "81"], [54.90725725, 82.4825442, "83"], [54.9042386667, 82.4723893667, "7"], [54.9049427667, 82.47739025, "26/37B"], [54.9048325667, 82.4777169, "14/37B"], [54.9048868, 82.4778717167, "15/37B"], [54.9052664833, 82.4777734333, "18/37B"], [54.9053551, 82.4774051333, "22/37B"], [54.90398685, 82.4726027167, "9"], [54.9047089333, 82.4770192, "9/37B"], [54.9061652333, 82.4777069667, "46"], [54.9067892667, 82.4808744667, "67"], [54.9068334667, 82.47996825, "66"], [54.9067120833, 82.4795692, "60"], [54.9041594, 82.4721355, "3"], [54.9046192333, 82.4724616667, "4"], [54.9050749, 82.47524375, "29"], [54.9068698, 82.4786657833, "54"], [54.9057202, 82.4762706, "32B"], [54.9051451333, 82.4743827, "22"], [54.90625565, 82.4769934167, "40B"], [54.90604295, 82.4772728667, "42A"], [54.9047528, 82.4774456167, "12/37B"], [54.9073914, 82.4817937167, "78"], [54.9070766667, 82.4819295333, "77"], [54.8755341, 82.4678237, "7"], [54.87529185, 82.467879, "5"], [54.8751691333, 82.4682586333, "6"], [54.8759656, 82.4679058667, "13"], [54.87506995, 82.4678763667, "3"], [54.8749979833, 82.46825515, "4"], [54.8748353667, 82.4678732833, "1"], [54.8755232, 82.4682126833, "10"], [54.87481615, 82.4682566167, "2"], [54.8759362, 82.4677101333, "11"], [54.8756999, 82.4681576833, "12"], [54.87587545, 82.4680599833, "14"], [54.8753491, 82.4682464333, "8"], [54.8757606333, 82.46762115, "9"], [54.8187813333, 82.5099677833, "62"], [54.81924235, 82.5087604667, "49"], [54.8177396167, 82.5119011167, "86"], [54.8178875667, 82.51156545, "84"], [54.8174387167, 82.51263255, "90"], [54.83408825, 82.55531685, "1/1101"], [54.882450333, 82.51885165, "150"], [54.8077506333, 82.541635, "400"], [54.8136809, 82.5290861, "265"], [54.8110874, 82.53251965, "304"], [54.8095875, 82.5753655167, "2/729"], [54.83343, 82.5554701333, "1101"], [54.8173373833, 82.5201625167, "160"], [54.80918625, 82.5753678333, "1/729"], [54.8101949167, 82.5340213667, "320"], [54.8114688333, 82.5313781167, "299"], [54.8110666833, 82.5317111833, "301"], [54.8174875833, 82.5162427833, "126"], [54.8121336833, 82.5303464167, "289"], [54.8180013167, 82.5178742, "2/138"], [54.81761695, 82.51742335, "1/138"], [54.8074874667, 82.5440482, "430"], [54.80752155, 82.5425832333, "416"], [54.8366309333, 82.5496806333, "1173"], [54.8169579833, 82.5214218667, "179"], [54.8298305, 82.5634204, "1007"], [54.8149217167, 82.5283630333, "247"], [54.8217308333, 82.5663090333, "910"], [54.81460935, 82.5745359167, "797"], [54.8234203333, 82.5658778, "924"], [54.8319167167, 82.5559498, "1086"], [54.8306048167, 82.5616193833, "1023"], [54.8828865, 82.57007665, "851"], [54.8329407, 82.55562365, "1099"], [54.81693675, 82.5123568167, "95"], [54.8182193, 82.5131360833, "88"], [54.8130308833, 82.5297032667, "273"], [54.8095776, 82.55597085, "544"], [54.8072376833, 82.5452215833, "443"], [54.81966705, 82.5090003167, "48"], [54.8169615333, 82.5198118833, "159"], [54.8169314, 82.51421915, "112"], [54.8080136167, 82.5463236, "452"], [54.807907, 82.5458772167, "448"], [54.80796455, 82.5461119167, "450"], [54.8168847833, 82.5220721833, "181"], [54.8354269, 82.5522720333, "1145"], [54.83545425, 82.5543820167, "1129"], [54.8082469167, 82.5385727167, "376"], [54.8076848, 82.5419475167, "408"], [54.8162252667, 82.5265092167, "225"], [54.8166361333, 82.52144, "1/179"], [54.8070565833, 82.5441373667, "429"], [54.8075943333, 82.5444878167, "432"], [54.8221778667, 82.5667572, "911"], [54.8179158667, 82.5105938667, "73"], [54.807556, 82.5460459333, "447"], [54.8080632333, 82.5465634, "454"], [54.8070305833, 82.54991865, "483"], [54.80831265, 82.5514465667, "526"], [54.80744605, 82.5634000833, "603"], [54.8164026833, 82.5278071167, "234"], [54.80656415, 82.5705962833, "665"], [54.81898205, 82.5685284167, "862"], [54.8236973167, 82.56648815, "927"], [54.8256295833, 82.5653636167, "965"], [54.8142507167, 82.57521965, "789"], [54.8094723167, 82.5346592, "349"], [54.8098434333, 82.5333155167, "319"], [54.8292230167, 82.5635525167, "1005"], [54.8173514167, 82.5221399167, "180"], [54.83840865, 82.5469221167, "1213"], [54.8379536333, 82.5475567833, "1201"], [54.81720545, 82.5149902333, "116"], [54.8085928833, 82.5380488, "370"], [54.80779995, 82.5386938833, "379"], [54.8204958333, 82.50876015, "34"], [54.82623815, 82.56358455, "970"], [54.81448725, 82.5734910333, "804"], [54.8222833167, 82.5659173667, "912"], [54.8170449333, 82.5277756167, "1/232"], [54.8176035333, 82.5269654167, "2/232"], [54.8323760333, 82.5575159333, "1078"], [54.83021075, 82.5612354667, "1024"], [54.9305489, 82.5017878333, "90"], [54.93116365, 82.5055481833, "122"], [54.9319767167, 82.5109385, "168"], [54.93029815, 82.4998441167, "72"], [54.9291897167, 82.4957679, "35"], [54.92986625, 82.4972463167, "50"], [54.9290868833, 82.4948005167, "25"], [54.9296040667, 82.4987881667, "63"], [54.9309512167, 82.5043885167, "110"], [54.9296868833, 82.4958722667, "38"], [54.9295072167, 82.4977275833, "51"], [54.9303624833, 82.5006042333, "74"], [54.9319759, 82.5106025, "166"], [54.9306431833, 82.5024661, "96"], [54.9299079167, 82.4976426667, "52"], [54.9312659333, 82.5064569833, "132"], [54.93082875, 82.50372585, "106"], [54.9320732833, 82.5108069, "167"], [54.8443465167, 82.36530835, "32"], [54.8448259333, 82.3650265167, "36"], [54.8425576167, 82.3664466333, "8"], [54.8925954833, 82.45710755, "3"], [54.8930169167, 82.45739025, "13"], [54.89310595, 82.4574966167, "17"], [54.8931706667, 82.4571386, "19"], [54.8930694833, 82.45792925, "15"], [54.892484, 82.4570883333, "1"], [54.8926542167, 82.4574440667, "5"], [54.89269795, 82.4575341667, "7"], [54.8926711333, 82.4579661, "9"], [54.8929884833, 82.4571287, "11"], [54.883121, 82.4810597, "11"], [54.8827995833, 82.4808762167, "15"], [54.8827993, 82.4810446833, "15A"], [54.88305445, 82.4806939167, "14"], [54.8832812833, 82.4806736333, "12"], [54.8829723, 82.4809516, "13"], [54.8836668, 82.4806524333, "8"], [54.88350115, 82.4806812167, "10"], [54.8838327667, 82.4806120333, "6"], [54.8836368, 82.4810848667, "5"], [54.8840162333, 82.4806070667, "4"], [54.8841447, 82.4806001167, "2"], [54.8837898, 82.4810769333, "3"], [54.8834789167, 82.4810792167, "7"], [54.8832999833, 82.4810661333, "9"], [54.8839425333, 82.4810822667, "1"], [54.8741644333, 82.466663, "1"], [54.8741701833, 82.4671011667, "2"], [54.8734758833, 82.4661548667, "11B"], [54.8730602167, 82.4660412333, "17B"], [54.8732532833, 82.4669407833, "12"], [54.8736860667, 82.4670495333, "8"], [54.8738914, 82.4662481167, "5B"], [54.8740275667, 82.46708325, "4"], [54.8728965, 82.4668399167, "16"], [54.87401705, 82.4666682333, "3"], [54.8740028333, 82.4662564, "5A"], [54.8734885167, 82.467, "10"], [54.8738630833, 82.4670664333, "6"], [54.8737826, 82.4666489667, "7"], [54.8735874, 82.46617485, "11A"], [54.8736024167, 82.4666129, "9"], [54.8730790167, 82.4668945167, "14"], [54.8729272167, 82.4664146833, "19"], [54.8733468333, 82.4665393167, "13"], [54.8731517, 82.4664815167, "15"], [54.8731441167, 82.4660683, "17A"], [54.8825944667, 82.4798169833, "2"], [54.8826055167, 82.4805495667, "10"], [54.8825809333, 82.4800131333, "4"], [54.8825441333, 82.4804278333, "8"], [54.8828469, 82.4800110667, "3"], [54.882842, 82.4802305333, "5"], [54.8825584833, 82.4801972667, "6"], [54.8828376, 82.4804269167, "7"], [54.88275275, 82.4805278667, "9"], [54.8828507833, 82.4798377667, "1"], [54.8747543667, 82.3655736, "277"], [54.8779646667, 82.3771985, "389"], [54.8791017167, 82.3701385167, "1/326"], [54.8809893667, 82.38422785, "458"], [54.8801277667, 82.3840239333, "459"], [54.8814240333, 82.3849688833, "468"], [54.8806415333, 82.38358955, "452"], [54.8785101, 82.3802812167, "409"], [54.8796759167, 82.3830951167, "445"], [54.8803115167, 82.3830208833, "446"], [54.8778165333, 82.3759684833, "373"], [54.88137445, 82.3862355333, "473"], [54.8782752833, 82.3789725, "397"], [54.8808287667, 82.3851571, "469"], [54.87896095, 82.3695827167, "326"], [54.8765604833, 82.3662541167, "288"], [54.8818931667, 82.38581595, "474"], [54.8775986, 82.3747133333, "2/359"], [54.8769582833, 82.3713375, "331"], [54.8843103667, 82.3914426833, "531"], [54.87595675, 82.3649699833, "271"], [54.8781325, 82.3739238833, "356"], [54.8763472667, 82.36476045, "270"], [54.87676475, 82.3676648667, "298"], [54.8769505833, 82.36918955, "310"], [54.8766704667, 82.36975, "313"], [54.8777166, 82.3720850333, "334"], [54.8773668333, 82.3733521333, "349"], [54.8772966667, 82.3744940833, "1/359"], [54.87831085, 82.3791264167, "399"], [54.8778886833, 82.37662545, "377"], [54.8784267667, 82.3770323833, "388"], [54.8790059333, 82.3798270667, "408"], [54.91994325, 82.4698456167, "5"], [54.9200047, 82.4693797833, "6"], [54.9195710333, 82.4694752833, "2"], [54.9203742667, 82.4697562833, "7"], [54.9196343, 82.4699295667, "3"], [54.9198162, 82.4690209, "4"], [54.8824037833, 82.4600990333, "5"], [54.88208185, 82.4598317167, "9"], [54.8826121667, 82.4600836333, "3"], [54.8826033333, 82.45961605, "2"], [54.8822431167, 82.4600865, "7"], [54.8821465833, 82.4595746, "8"], [54.8823125667, 82.45958745, "6"], [54.8824702667, 82.4595934167, "4"], [54.9092579167, 82.46735845, "6A"], [54.9089322167, 82.4674924, "10"], [54.90894585, 82.4672735167, "12"], [54.9089078333, 82.46711725, "11"], [54.9089631667, 82.4669939667, "9"], [54.90904455, 82.4673255, "8"], [54.9094559, 82.4668010167, "1"], [54.9093255, 82.4673469667, "4A"], [54.9093457833, 82.46717355, "4"], [54.9095302167, 82.4670570667, "2"], [54.9090935, 82.4664936667, "3"], [54.90917125, 82.4672602333, "6"], [54.90908325, 82.4669295667, "7"], [54.9092908333, 82.4668895333, "5"], [54.8593663833, 82.4539760167, "251"], [54.8754824, 82.4604578167, "63"], [54.8750289833, 82.4602931333, "67"], [54.7985084167, 82.4478579333, "941"], [54.842417, 82.4531796833, "443"], [54.8085080333, 82.45099665, "810"], [54.79048555, 82.44243815, "1063"], [54.8492731667, 82.4532494833, "355"], [54.8094198833, 82.4503523667, "819"], [54.8728692167, 82.4594153667, "91"], [54.8522977333, 82.4539347833, "344"], [54.8484041333, 82.45409895, "372"], [54.8479726833, 82.45304965, "387"], [54.7948086, 82.4476616833, "994"], [54.7914089, 82.4452872333, "1027"], [54.8080105, 82.4498779333, "835"], [54.8722349333, 82.459282167, "99"], [54.8091485667, 82.45085495, "821"], [54.8594542833, 82.4549678833, "5/246"], [54.8230668667, 82.4541309833, "660"], [54.8316753333, 82.4539613167, "562"], [54.8387429833, 82.4531928, "475"], [54.8545740667, 82.4540875333, "294"], [54.7900112167, 82.4442665, "1045"], [54.8172833167, 82.4539773167, "724"], [54.83503155, 82.453934, "542"], [54.8607128667, 82.4548002, "2/241"], [54.8380142833, 82.45391425, "490"], [54.8275037167, 82.4529093833, "589"], [54.8596196, 82.4542151, "249"], [54.8595530167, 82.45479165, "3/246"], [54.85959605, 82.45471705, "2/246"], [54.8592503167, 82.4544837333, "252"], [54.8713457667, 82.4587725833, "111"], [54.8595053, 82.4548791833, "4/246"], [54.79668195, 82.4482608333, "958"], [54.8227231, 82.4540730167, "670"], [54.8750904833, 82.4593735333, "71"], [54.8190378833, 82.4540990167, "702"], [54.86957775, 82.4580359, "129"], [54.8662393833, 82.4567130667, "169"], [54.8687158167, 82.4577150333, "141"], [54.86791495, 82.4573792167, "151"], [54.8089932167, 82.4507184167, "823"], [54.8666422833, 82.4569389667, "167"], [54.8738722833, 82.4598649833, "81"], [54.8169442833, 82.4534629333, "727"], [54.8185275, 82.4534621333, "709"], [54.8059395833, 82.44899615, "859"], [54.8327434833, 82.4540100333, "550"], [54.8604312833, 82.4546856333, "1/241"], [54.8610548833, 82.4549434167, "3/241"], [54.8596720667, 82.4547582, "244"], [54.8603010167, 82.4551234333, "238"], [54.874473, 82.4600767667, "75"], [54.8192958833, 82.4546863, "698"], [54.80070935, 82.4483520333, "917"], [54.8595345, 82.4546793167, "250"], [54.8395576167, 82.4538942167, "470"], [54.8600606333, 82.4551961167, "242"], [54.8587876, 82.45357305, "261"], [54.8202505167, 82.454168, "692"], [54.83062305, 82.4541314, "574"], [54.85965015, 82.4546251667, "1/246"], [54.87094345, 82.4585491667, "115"], [54.82367025, 82.4541148167, "654"], [54.8761585333, 82.4607254667, "55"], [54.8650849833, 82.4562546333, "183"], [54.8104551333, 82.45176685, "803"], [54.8601735167, 82.4545659833, "247"], [54.8072936667, 82.4501624667, "842"], [54.81121545, 82.4523795667, "795"], [54.8082023667, 82.4500136333, "833"], [54.8088097833, 82.4505667167, "825"], [54.8073512333, 82.4494723833, "841"], [54.8180043167, 82.45347675, "713"], [54.8034810667, 82.44930745, "884A"], [54.8133904167, 82.4533446667, "767"], [54.7906012833, 82.4456008, "1032"], [54.8036063333, 82.44934055, "884"], [54.8086218, 82.4503990167, "827"], [54.7990523833, 82.4480464, "931"], [54.8435690667, 82.40554535, "296A"], [54.84511005, 82.4057523167, "282"], [54.8456481333, 82.4283544, "93"], [54.8452106, 82.4213902167, "154"], [54.8456685667, 82.4217703833, "151"], [54.8450910333, 82.4066185167, "296B"], [54.84556515, 82.3859519, "471"], [54.8456769, 82.4356176167, "29"], [54.8452146333, 82.4326596167, "54"], [54.8456379667, 82.4318747833, "59"], [54.8451947667, 82.4291500167, "82"], [54.8456449667, 82.42712405, "103"], [54.8452215333, 82.4202044833, "166"], [54.84562355, 82.4192034833, "173"], [54.84520295, 82.4171995667, "190"], [54.8451047667, 82.4159582, "204"], [54.84557985, 82.4160677, "201"], [54.8451894667, 82.4139933167, "218"], [54.8455275833, 82.4075856833, "277"], [54.8455757667, 82.40668145, "281"], [54.8451309667, 82.4038956667, "308"], [54.8455923333, 82.40336095, "313"], [54.8451457333, 82.4006193, "332"], [54.8456046667, 82.3996052667, "345"], [54.8450766, 82.3979973833, "362A"], [54.8450326167, 82.3961487833, "376"], [54.84556585, 82.3949421167, "389"], [54.84503405, 82.3928639333, "406"], [54.8450819, 82.3938952833, "398"], [54.8449702833, 82.39000315, "430"], [54.8455388, 82.3929698833, "403"], [54.8455067667, 82.389923, "431"], [54.8449729167, 82.38231105, "498"], [54.8449880833, 82.38162075, "502"], [54.8432495, 82.3824779667, "496"], [54.8441658167, 82.4248163667, "122"], [54.84258355, 82.3809411333, "512"], [54.8451205833, 82.41321575, "228"], [54.8454313833, 82.3813477333, "509"], [54.8449337333, 82.3830211333, "494"], [54.8456650333, 82.4344218333, "1/41"], [54.8450306667, 82.3974560667, "362C"], [54.8463207667, 82.4343822167, "2/42"], [54.8450416833, 82.3967473667, "372"], [54.8455358167, 82.4085091, "267"], [54.8451470333, 82.4076077167, "276"], [54.84420195, 82.39791495, "362B"], [54.8452185667, 82.4259005667, "114"], [54.8456212833, 82.4347298667, "39"], [54.8452003167, 82.40904765, "262"], [54.8451996667, 82.4122621833, "234"], [54.84515415, 82.4098542167, "256"], [54.8455715833, 82.4139006833, "223"], [54.8455915333, 82.4136348333, "225"], [54.8455279667, 82.3870696, "463"], [54.8457080167, 82.4225169667, "145"], [54.8450449333, 82.3784177833, "536"], [54.8441582, 82.3843482, "480"], [54.8441567667, 82.38280735, "494A"], [54.8450534333, 82.3804865833, "516"], [54.845458, 82.3819993833, "503"], [54.8416720667, 82.4161419167, "202"], [54.84561615, 82.4169546167, "193"], [54.8456090833, 82.4248031, "127"], [54.8452347167, 82.4210866, "156"], [54.8452366333, 82.4236209667, "136"], [54.8420864167, 82.3808174, "514"], [54.9352309167, 82.4932222, "138"], [54.9344554333, 82.48793725, "92"], [54.93352515, 82.48479765, "59"], [54.9333442833, 82.4806992167, "30"], [54.9333265, 82.4832372833, "43"], [54.9338463667, 82.4867482, "81"], [54.9349315333, 82.4913314333, "109"], [54.9335968833, 82.4853604, "63"], [54.9316883, 82.48456045, "53"], [54.9338528333, 82.4839506, "52"], [54.8310454167, 82.5756857833, "775"], [54.8312273667, 82.5775630667, "757"], [54.8293654833, 82.5685721667, "851"], [54.8285495833, 82.56486995, "881"], [54.8309590333, 82.5733609, "801"], [54.8305305333, 82.5736851833, "790"], [54.8295682333, 82.56931885, "841"], [54.83130275, 82.5782757167, "753"], [54.8283176167, 82.5655312333, "879"], [54.8540068167, 82.37670555, "34"], [54.85430545, 82.3768498167, "32"], [54.8549918167, 82.3798488333, "5"], [54.85449605, 82.37689005, "33"], [54.8547125333, 82.3802214167, "4"], [54.8545867833, 82.3781517833, "28"], [54.8547440667, 82.37743325, "31"], [54.85420255, 82.3773112333, "30"], [54.8879053333, 82.5233262333, "1/18"], [54.8881771333, 82.5232950167, "2/18"], [54.8834455333, 82.45836535, "92"], [54.8863947167, 82.4586610667, "58B"], [54.8866006667, 82.45961975, "55A"], [54.8867239167, 82.4592584167, "55"], [54.88667, 82.4586812, "56"], [54.8817044333, 82.4588333167, "113"], [54.8815483333, 82.4587898667, "115"], [54.8814229167, 82.4587740833, "117"], [54.8913856667, 82.4590918167, "18"], [54.8915707667, 82.4591145167, "16"], [54.8868740833, 82.4599066167, "53C"], [54.88889255, 82.4599269833, "37B"], [54.89262475, 82.4600617167, "7A"], [54.8889847167, 82.4594067667, "37A"], [54.8925890833, 82.4585589, "10B"], [54.8824604, 82.4588691333, "105"], [54.8836036333, 82.4583701, "90"], [54.8908670667, 82.4585197333, "24A"], [54.8826975167, 82.4583391, "98"], [54.8835235167, 82.4590010333, "95"], [54.8838230333, 82.4583829333, "88"], [54.8845143667, 82.4579167, "80A"], [54.8828394333, 82.4583557667, "96"], [54.88251835, 82.4583208667, "100"], [54.8926768167, 82.4583797667, "10C"], [54.88716595, 82.4586927333, "50"], [54.8883195667, 82.4593362333, "43"], [54.8864967833, 82.4592373833, "59"], [54.8871386833, 82.4592945833, "51"], [54.8836205667, 82.4589701333, "91"], [54.8870057667, 82.4587382167, "52"], [54.8823566667, 82.4583266833, "102"], [54.8867508, 82.45831015, "2/54"], [54.88680585, 82.4583326167, "54B"], [54.8869064, 82.4592745833, "53"], [54.8836770667, 82.45788765, "90A"], [54.88377685, 82.45896945, "91A"], [54.8844059167, 82.4593669667, "83A"], [54.8843895833, 82.4590283, "83"], [54.88413765, 82.4580580833, "84A"], [54.8909576167, 82.4590556833, "22"], [54.8932342, 82.4592408833, "4"], [54.8929272167, 82.45863745, "8B"], [54.8929735167, 82.4583677333, "8C"], [54.8859658167, 82.4592039, "71"], [54.8881317333, 82.4593295333, "45"], [54.88894835, 82.45890335, "36"], [54.88873325, 82.4588844167, "38"], [54.8885017167, 82.45935385, "41A"], [54.8888022667, 82.4593873, "39"], [54.88814385, 82.4586047333, "44A"], [54.8854610167, 82.4585890667, "66"], [54.89301925, 82.4597807333, "3"], [54.8888152167, 82.4597877833, "37C"], [54.88442445, 82.4579215333, "82A"], [54.8841846833, 82.4584516, "84"], [54.8858883833, 82.4596244167, "71A"], [54.8911121167, 82.4596169167, "21"], [54.8882564333, 82.4588584167, "42"], [54.8839837, 82.4584101, "86"], [54.8862705, 82.4595605667, "63"], [54.8878208, 82.4588156833, "46"], [54.8891674833, 82.4594178, "35"], [54.8884817, 82.4588827667, "40"], [54.8845497667, 82.4584736333, "80"], [54.8908341667, 82.45958975, "23"], [54.8926482, 82.4588475667, "10A"], [54.8846152, 82.4590487333, "81"], [54.8868875833, 82.4597079333, "53B"], [54.8867661667, 82.4580206, "1/54"], [54.8923631167, 82.4601005833, "11A"], [54.8880116333, 82.4588415167, "44"], [54.88179955, 82.4582856667, "108"], [54.8819699667, 82.4588568833, "109"], [54.8906476667, 82.4590157667, "28"], [54.8846581333, 82.4584694833, "78"], [54.8843345167, 82.4584402833, "82"], [54.8841375167, 82.4590033, "85"], [54.88394965, 82.4578898667, "86A"], [54.88396905, 82.45758895, "86B"], [54.8837848667, 82.4578930833, "88A"], [54.8839426667, 82.4589834333, "89"], [54.8923547333, 82.4596697667, "11"], [54.8916483333, 82.45965705, "13"], [54.89177585, 82.4591300667, "14"], [54.8914522167, 82.459646, "15"], [54.8912940833, 82.4596277667, "17"], [54.8923723833, 82.4592214, "12"], [54.8907689667, 82.4590306667, "24"], [54.8904437833, 82.4595327, "25A"], [54.8906071167, 82.4595718167, "25"], [54.8902158167, 82.4595238167, "27"], [54.8911627, 82.4590753167, "20"], [54.8886534333, 82.4593824833, "41"], [54.8930344167, 82.4600257833, "3A-3F"], [54.8865167167, 82.4586738833, "58"], [54.8863451667, 82.4592180667, "61"], [54.88626165, 82.45980935, "65"], [54.8862540167, 82.4586216, "60"], [54.8858030167, 82.4586246, "62"], [54.8856375333, 82.4586118667, "64"], [54.89284255, 82.4600622333, "5A"], [54.8928040667, 82.4597492333, "5"], [54.8861293, 82.4592111833, "69"], [54.8858680333, 82.4598526167, "71B"], [54.885777, 82.4599270167, "71C"], [54.8857422667, 82.4597478167, "71D"], [54.88574365, 82.45918075, "73"], [54.8855746833, 82.4591693833, "75"], [54.8930622167, 82.4592157833, "6"], [54.8925581, 82.4603171, "7B"], [54.8926518167, 82.46025555, "7C"], [54.8929233, 82.4588164167, "8A"], [54.8928556667, 82.4592156833, "8"], [54.8924033, 82.4602587333, "9"], [54.8826857833, 82.4589041167, "103"], [54.8868134333, 82.4586863667, "54"], [54.8821768333, 82.4588641833, "107"], [54.8925898333, 82.4596910333, "7"], [54.8862095667, 82.46007345, "67"], [54.8893183667, 82.4594386167, "33"], [54.88182795, 82.4588519167, "111"], [54.8853995, 82.4591325167, "77"], [54.8819874833, 82.4582899, "106"], [54.8868931667, 82.4594645667, "53A"], [54.89067275, 82.4587377333, "28A"], [54.88729905, 82.45870125, "48"], [54.8872955667, 82.4593124, "49"], [54.8926355167, 82.4591491667, "10"], [54.8821580833, 82.45830775, "104"], [54.8581124833, 82.3783852167, "535"], [54.8652348667, 82.3746078, "454"], [54.8528962667, 82.3764204333, "591C"], [54.8658603333, 82.3777156333, "466B"], [54.8561505333, 82.3796002833, "563"], [54.8574877833, 82.3782657333, "557"], [54.8648613667, 82.3759225833, "466A"], [54.8680267, 82.3758790667, "422"], [54.8679018667, 82.3731075, "420"], [54.85081775, 82.3829343167, "643"], [54.8671912, 82.36468055, "352"], [54.86727615, 82.36543555, "360"], [54.8501304, 82.3806456, "637"], [54.8673357333, 82.3661331333, "366A"], [54.8673979333, 82.3667809, "366B"], [54.8526604333, 82.3775103333, "591B"], [54.8590671, 82.3777331, "525"], [54.8604441333, 82.37691195, "511A"], [54.8674681167, 82.3678874333, "374"], [54.8677148833, 82.3698444833, "402"], [54.8666863, 82.3663322333, "365"], [54.8675554, 82.3754905167, "424A"], [54.8676465167, 82.37623815, "424"], [54.86661535, 82.37609495, "442"], [54.8598401833, 82.3771549167, "511B"], [54.8661314333, 82.3647742667, "353"], [54.8666274333, 82.3736697167, "434"], [54.8662379333, 82.3738677667, "438"], [54.8520614, 82.3823100833, "613"], [54.8521965167, 82.3812996167, "607"], [54.85242245, 82.3821009333, "605"], [54.8520654833, 82.3761835667, "591A"], [54.8547938667, 82.3751005167, "591D"], [54.8600232, 82.3780412167, "516"], [54.8504624833, 82.3807091333, "635B"], [54.86694425, 82.3698350167, "387"], [54.8512808, 82.3826955167, "635A"], [54.8626598333, 82.3763083833, "480"], [54.8631832667, 82.3759811, "478"], [54.8597738, 82.3758612333, "511"], [54.8669354833, 82.3734885833, "432"], [54.8660254333, 82.3741769333, "440"], [54.8677621333, 82.3708737667, "418"], [54.86470325, 82.3749985333, "456"], [54.8496086167, 82.3843649167, "660"], [54.8533389167, 82.3814388333, "599"], [54.8513108, 82.3833057167, "636"], [54.8582031333, 82.3789229667, "536"], [54.8049091167, 82.4582433833, "111"], [54.79217, 82.4610993667, "235"], [54.7912009, 82.46131515, "243"], [54.8073855167, 82.4519374833, "17"], [54.7901330667, 82.4618390333, "259"], [54.7979543, 82.46169615, "186"], [54.7953406667, 82.4605087333, "199"], [54.8075016167, 82.4517328833, "15"], [54.7944439333, 82.4604859167, "221"], [54.8960575333, 82.47501025, "14"], [54.8979342, 82.4745448, "31A"], [54.8968049167, 82.47448785, "24A"], [54.8974204333, 82.475026, "25"], [54.8977612, 82.47473925, "29"], [54.89678435, 82.4748293, "20"], [54.89589205, 82.4749720833, "12"], [54.8966669, 82.4743795667, "22"], [54.8958911333, 82.4761947, "5"], [54.8971542833, 82.4752421167, "21"], [54.8960713, 82.4760678, "7"], [54.8971206833, 82.47398845, "30"], [54.8959413333, 82.4751180667, "10A"], [54.89774365, 82.4741330667, "40"], [54.8964759167, 82.4757599833, "13"], [54.8956967, 82.4756972333, "6"], [54.8969728167, 82.4746339333, "24"], [54.8975985667, 82.4742274833, "38"], [54.8964206167, 82.4764929, "9"], [54.89591475, 82.4748164, "14A"], [54.8963322333, 82.4747763333, "18A"], [54.8962043333, 82.4746025333, "18B"], [54.8969914833, 82.47434705, "26A"], [54.8975744667, 82.4748792167, "27"], [54.8979075667, 82.4740015333, "42"], [54.89599185, 82.4754597167, "10"], [54.89628205, 82.4758701, "11"], [54.8966986167, 82.4755950667, "15"], [54.8954172667, 82.4758408833, "2"], [54.8955642833, 82.47581195, "4"], [54.8957927167, 82.4756119833, "8"], [54.8974439333, 82.4743467667, "36"], [54.8954518167, 82.4753103, "6A"], [54.89718045, 82.4745253167, "26"], [54.89567315, 82.4763134667, "1"], [54.8957657667, 82.4763043333, "3"], [54.8965164667, 82.4750518, "18"], [54.89807905, 82.47440185, "31"], [54.8968958, 82.4754382833, "17"], [54.89631735, 82.4752079667, "16"], [54.8972125833, 82.4741699833, "34"], [54.8970015667, 82.47401225, "28"], [54.9133573833, 82.4717484667, "287"], [54.9048133167, 82.47635, "104"], [54.9049925, 82.4762745167, "106"], [54.90467735, 82.4753654167, "107"], [54.90048465, 82.4783948167, "58"], [54.8992426833, 82.4793293167, "42"], [54.9046434667, 82.4764180667, "102"], [54.91292555, 82.47197745, "285"], [54.9061096167, 82.4751589833, "127"], [54.9059487333, 82.4760527167, "120B"], [54.9058349, 82.4758649667, "120A"], [54.9046025333, 82.47507605, "107A"], [54.9043145167, 82.4765927167, "98"], [54.9026473833, 82.4773607333, "80"], [54.8985112833, 82.4791536, "37"], [54.90029415, 82.4779031333, "57"], [54.9157889333, 82.4706511667, "307"], [54.9161504167, 82.4698894, "317"], [54.9162483333, 82.47040295, "315"], [54.9119694833, 82.4724158167, "273"], [54.9127305, 82.4727451167, "280A"], [54.910892, 82.4729321833, "257"], [54.91104955, 82.4723925167, "261"], [54.91155295, 82.4731748833, "260"], [54.9104050667, 82.4728724167, "249"], [54.91055955, 82.4730871, "251"], [54.9074686167, 82.4751091833, "188"], [54.9079151, 82.4751543167, "192A"], [54.9060373, 82.4757691167, "136"], [54.90429105, 82.4760343833, "97"], [54.9123212333, 82.4728413167, "276"], [54.91122575, 82.4733142333, "240"], [54.9028192, 82.4767472833, "83"], [54.8979333667, 82.4794421167, "31"], [54.8977516, 82.4801524833, "28"], [54.89934065, 82.4785610667, "47"], [54.9103580667, 82.4731422667, "247"], [54.9106933167, 82.4735704667, "238"], [54.90118205, 82.4774954833, "65"], [54.9051274833, 82.4765782667, "106A"], [54.9001666333, 82.4786251833, "54"], [54.8996917833, 82.4776611333, "53A"], [54.9157449833, 82.4701549667, "311"], [54.8998454833, 82.47809685, "53"], [54.8999531167, 82.4780619, "55"], [54.9123259333, 82.4731539833, "274"], [54.91203635, 82.4729645833, "262"], [54.9025673667, 82.4766802, "79A"], [54.8995076667, 82.4784470167, "49"], [54.9160592167, 82.4710586333, "316"], [54.9045513333, 82.4752828833, "105"], [54.901886, 82.4778055167, "74B"], [54.9007665833, 82.4782302, "60"], [54.9027685, 82.4767654333, "81"], [54.9042667667, 82.47545395, "99"], [54.90210725, 82.4776131, "76"], [54.914356, 82.4712761333, "299"], [54.9037502167, 82.4768480333, "94"], [54.8975508667, 82.48021795, "22"], [54.9126604333, 82.4720775, "281"], [54.90140745, 82.4783687833, "66"], [54.9008916333, 82.4774276833, "63"], [54.91678785, 82.47071965, "322"], [54.9088462667, 82.4738790833, "227"], [54.9123182167, 82.4722337, "277"], [54.90000635, 82.47873665, "52"], [54.9015533, 82.47851885, "70"], [54.9015025333, 82.4779211333, "72"], [54.9159910833, 82.4705165167, "313"], [54.9138507667, 82.4715170333, "293"], [54.9090778667, 82.4737512667, "229"], [54.9128195833, 82.4726191, "282"], [54.9131350667, 82.4724749667, "286"], [54.913967, 82.4720198833, "294"], [54.9129905, 82.4725340833, "284"], [54.90123535, 82.4772228667, "67"], [54.9143479, 82.4719130833, "298"], [54.9126444833, 82.4726878, "280"], [54.9165660167, 82.4702721167, "323"], [54.8989755, 82.4782464167, "45"], [54.9093448667, 82.47364355, "233"], [54.91447635, 82.4712330833, "301"], [54.9095208333, 82.4735786833, "235"], [54.9096743333, 82.4741524, "232"], [54.89939865, 82.47921515, "44"], [54.9151960833, 82.4709698167, "305"], [54.9097280833, 82.4745849333, "228"], [54.9013794667, 82.47741285, "69"], [54.9162268667, 82.47098265, "318"], [54.8990613333, 82.4787713333, "43"], [54.89780295, 82.4806196167, "26"], [54.91541455, 82.4713506833, "306"], [54.9097875333, 82.4748558667, "228A"], [54.9081311333, 82.4748058, "196A"], [54.9150421333, 82.4709822167, "303"], [54.9053254667, 82.47610225, "114"], [54.9065445333, 82.4749703667, "173"], [54.9098205333, 82.4741548833, "234"], [54.9081538667, 82.4750639167, "196"], [54.9096973, 82.4748021167, "226A"], [54.9093885667, 82.4742162667, "224A"], [54.9091188, 82.4743508333, "222A"], [54.90953665, 82.4733968, "235A"], [54.90795735, 82.4748888667, "194"], [54.9014723, 82.47869265, "68"], [54.9095686833, 82.4733282167, "237A"], [54.9090926833, 82.47436235, "222"], [54.9012697667, 82.4780105833, "64"], [54.9165941667, 82.4699768667, "325"], [54.8983101833, 82.4790199333, "35A"], [54.8989313833, 82.4795513167, "38"], [54.9020688, 82.4782522167, "74"], [54.91629055, 82.4698086667, "321"], [54.90362685, 82.4769062, "92"], [54.8978983167, 82.480096, "30"], [54.9095879, 82.4744869833, "226"], [54.8988477333, 82.4788966333, "41"], [54.9144792667, 82.47185395, "300"], [54.90345575, 82.4769852667, "90"], [54.90295525, 82.4772238333, "84"], [54.9155634, 82.47150915, "308A"], [54.9077980667, 82.4749606833, "192B"], [54.9024718333, 82.47689145, "79"], [54.9010265333, 82.4781286667, "62"], [54.9051546167, 82.4761810167, "108"], [54.9027743667, 82.4772973, "82"], [54.9113692333, 82.4732625, "242"], [54.906182, 82.4761095667, "140"], [54.9126536833, 82.4718492, "283"], [54.89984655, 82.47884775, "50"], [54.8996625, 82.4783593833, "51"], [54.9096838, 82.4734820333, "237"], [54.9163971333, 82.4703382333, "319"], [54.9019659333, 82.47801565, "74C"], [54.9017677, 82.4778972667, "74A"], [54.9082934833, 82.4747193, "198"], [54.9124935167, 82.4721662833, "279"], [54.9112822667, 82.4727057, "263"], [54.9088314833, 82.4744561333, "220"], [54.9140193667, 82.4723065, "294A"], [54.9151048833, 82.4715047667, "302"], [54.9155721667, 82.4712705333, "308"], [54.91564375, 82.4698925833, "309"], [54.9157315333, 82.4712060333, "310"], [54.9158956833, 82.4711298667, "312"], [54.9044821667, 82.4765082167, "100"], [54.9045073333, 82.4759204333, "101"], [54.9046759167, 82.4758561667, "103"], [54.8983034667, 82.4792230333, "35"], [54.8987899833, 82.4796567167, "36"], [54.89867985, 82.4790447, "39"], [54.8990768667, 82.47943105, "40"], [54.8981085333, 82.4793068333, "33"], [54.89915065, 82.4781128333, "45A"], [54.8995490167, 82.4791011167, "46"], [54.8997315333, 82.47899365, "48"], [54.900319, 82.4785061, "56"], [54.9056642333, 82.4759370167, "118"], [54.9063413, 82.4756213333, "150"], [54.8988354833, 82.47962055, "36A"], [54.9029526, 82.4760132333, "87"], [54.90312265, 82.4771544, "86"], [54.9034438667, 82.4764194333, "91"], [54.91418395, 82.4719746167, "296"], [54.9140091667, 82.4714322, "295"], [54.9141795833, 82.4713487, "297"], [54.9138469333, 82.4720815833, "292"], [54.91351575, 82.4716747833, "289"], [54.9136813667, 82.4716021833, "291"], [54.9139259667, 82.4722800333, "292A"], [54.9136332, 82.4722156, "290"], [54.9093265, 82.4742351667, "224"], [54.8977406167, 82.4806423167, "24"], [54.9048411167, 82.4757695667, "109"], [54.9032051, 82.4765243833, "89"], [54.91528, 82.4714141667, "304"], [54.9032850667, 82.4770679, "88"], [54.9158238167, 82.4703065333, "313A"], [54.9064744333, 82.4758051, "150A"], [54.9046115, 82.4767234667, "100A"], [54.9076618833, 82.4744580667, "197"], [54.9076246167, 82.4750397167, "190"], [54.9026504333, 82.4768196167, "79B"], [54.9051801167, 82.4756040167, "115"], [54.89852955, 82.47974005, "34"], [54.9075004, 82.47452445, "187"], [54.90501535, 82.4756865333, "111"], [54.9068534667, 82.4753966333, "180"], [54.9029671, 82.4766338333, "85"], [54.9065173667, 82.4755659333, "158"], [54.9066938833, 82.4754834833, "166"], [54.9061558333, 82.4757093333, "142"], [54.90567525, 82.4753235167, "119"], [54.9124889333, 82.4727737833, "278"] ]; ================================================ FILE: config.main.json ================================================ { "host": null, "port": 3000, "defaultSkin": "dark", "defaultLang": "ru", "trafficLayerMinZoom": 10, "trafficLayerUpdateInterval": 300000, "ppLink2gis": "{gislink}/directions/tab/{rsType}/points/|{point}?m={center}%2F{zoom}&routeLink=true", "openLink2gis": "{gislink}/?m={center}%2F{zoom}&openLink=true", "ppnotLink": "http://2gis.{domain}/{projectCode}/center/{center}/zoom/{zoom}/routeTab/rsType/{rsType}/to/{point}╎{name}", "photosLink": "http://2gis.{domain}/photos/{id}", "poiLayerMinZoom": 0, "detectRetina": false, "webApiKey": "ruregt3044", "webApiVersion": "2.0", "catalogVersion": "3.0", "regionListFields": "items.bounds,items.zoom_level,items.time_zone,items.code,items.flags,items.country_code,items.domain,items.default_pos", "firmInfoFields": "items.reviews,items.links,items.external_content", "geoAdditionalFields": "items.geometry.selection,items.links,items.adm_div,items.address,items.floors,items.description", "geoclickerCatalogApiKey": "ruregt3044", "projectLeaveMaxZoom": 16, "flampUrl": "http://flamp.ru/r/", "flampGoogleAnalytics": "utm_source=api2gis&utm_medium=api&utm_campaign=geoclicker", "protocol": "http:", "secureProtocol": "https:", "baseUrl": "//maps.api.2gis.ru/2.0", "key": "c5e4d7ec-f9d0-470f-b7f0-278f622f20e2", "keyServer": "https://keys.api.2gis.com/public/v1/keys/", "keyServices": "/services/tiles-raster-api", "tileServer": "//tile{s}-sdk.maps.2gis.com/v2/tiles?x={x}&y={y}&z={z}&v=1&ts=online_sd&key={key}", "retinaTileServer": "//tile{s}-sdk.maps.2gis.com/v2/tiles?x={x}&y={y}&z={z}&v=1&ts=online_hd&key={key}", "previewTileServer": "//tile{s}-sdk.maps.2gis.com/v2/tiles?x={x}&y={y}&z={z}&v=1&size=64&ts=online_sd&key={key}", "previewRetinaTileServer": "//tile{s}-sdk.maps.2gis.com/v2/tiles?x={x}&y={y}&z={z}&v=1&size=64&ts=online_hd&key={key}", "arabicTileServer": "//tile{s}-sdk.maps.2gis.com/v2/tiles?x={x}&y={y}&z={z}&v=1&ts=online_sd_ar&key={key}", "arabicRetinaTileServer": "//tile{s}-sdk.maps.2gis.com/v2/tiles?x={x}&y={y}&z={z}&v=1&ts=online_hd_ar&key={key}", "arabicPreviewTileServer": "//tile{s}-sdk.maps.2gis.com/v2/tiles?x={x}&y={y}&z={z}&v=1&size=64&ts=online_sd_ar&key={key}", "arabicPreviewRetinaTileServer": "//tile{s}-sdk.maps.2gis.com/v2/tiles?x={x}&y={y}&z={z}&v=1&size=64&ts=online_hd_ar&key={key}", "trafficTileServer": "//traffic{s}.maps.2gis.com/{projectCode}/traffic/{z}/{x}/{y}/speed/{period}/{timestampString}", "retinaTrafficTileServer": "//traffic{s}.maps.2gis.com/{projectCode}/traffic/{z}/{x}/{y}/speed/{period}/retina/{timestampString}", "trafficMetaServer": "//meta{s}.maps.2gis.com/{projectCode}/meta/{z}/{x}/{y}/graph_speed/{period}/{timestampString}", "retinaTrafficMetaServer": "//meta{s}.maps.2gis.com/{projectCode}/meta/{z}/{x}/{y}/graph_speed/{period}/retina/{timestampString}", "trafficTimestampServer": "//traffic{s}.maps.2gis.com/{projectCode}/meta/speed/time/", "trafficScoreServer": "//traffic{s}.maps.2gis.com/{projectCode}/meta/score/0/", "poiMetaServer": "//tile{s}.maps.2gis.com/poi?x={x}&y={y}&z={z}&v=1&ts=online_sd", "retinaPoiMetaServer": "//tile{s}.maps.2gis.com/poi?x={x}&y={y}&z={z}&v=1&ts=online_hd", "arabicPoiMetaServer": "//tile{s}.maps.2gis.com/poi?x={x}&y={y}&z={z}&v=1&ts=online_sd_ar", "arabicRetinaPoiMetaServer": "//tile{s}.maps.2gis.com/poi?x={x}&y={y}&z={z}&v=1&ts=online_hd_ar", "webApiServer": "//catalog.api.2gis.ru", "loadProjectListTimeout": 5000 } ================================================ FILE: functional-tests/.gitignore ================================================ ## Project ### nosetests.xml nosetests-*.xml run_my.sh .noseids ### Python ### *.py[cod] ### Virtualenv ### .env/ ### Tox ### .tox/ ### IDE ### .idea/ ================================================ FILE: functional-tests/README.md ================================================ ### Подготовка и запуск 1. Устанавливаем python 2. Устанавливаем virtualenv ``` $ pip install -U virtualenv ``` 3. Готовим локальный environment ``` $ ./prepare.sh ``` Если используется PyCharm удобно добавить локальный env. File -> Settings -> Project -> Шестеренка -> Добавить локальный env -> выбрать ./.env/bin/python2.7 4. Устанавливаем [selenium-launchers](https://github.com/bayandin/selenium-launchers): ```bash # скачать zip-архив и распаковать куда-нибудь на свою машину cd selenium-launchers/ ./start_linux.sh (./start_mac.sh | ./start_win.sh) # запустит selenuim-сервер на порту 4455 ``` 5. Тесты используют шаблоны страниц. Для их генерации нужно выполнить: ``` $ ./template_render.sh ``` 6. Если не поднят, поднять сервер MapsAPI 7. Запустить тесты ``` $ ./run.sh ``` Чтобы запускать только конкретные тесты, необходимо скопировать файл run.sh в run_my.sh и добавить файл, класс и метод теста, например: ```bash #!/usr/bin/env bash source .env/bin/activate PYTHONPATH=$(pwd) .env/bin/lode_runner -v tests/firm_callout_test.py:FirmCallout.firm_photo_test --with-xunit exit 0; ``` ### Содержимое проекта * В пакете classes хранятся компоненты (сomponents), исключения (exceptions), утилиты (util) * В пакете config хранится конфиг для contesto * В пакете tests хранятся тесты и пакеты тестов #### Исключения Бывает необходимо поднять и обработать исключение. Все типы исключений для карты, взаимодействия с WebApi и т.д. описываются в classes.exceptioins.exceptions. Наследуются от базового типа исключений contesto, а затем от базового типа исключения API карт. #### Утилиты В данном пакете описываются утилиты и базовые классы тестов для API карт. На данный момент там содержится базовый класс для тестов MapsAPIBaseTest унаследованный от UnittestContestoTestCase, с переопределенным методом setUp. #### Компоненты В данном пакете описываются компоненты страницы, страница и базовой компонент. Базовый компонент наследуется от класса BaseComponent contesto. В нем определяются черты (свойства и методы) свойственные всем компонентам проекта. ### Code style * Так как используется паттерн pageObject, в тестах не должно быть обращения к драйверу, за исключением пользовательских элементов (кнопки, ползунки и все что не входит в API карт) * Для проверки кода перед коммитом рекомендуется создать или добавить в pre-commit git hook содержимое pep8-hook.sh. Для работы хука должен иметься pep8. * Имена файлов с тестами `<название>_test.py` * Имена классов оформляются в `CapitalizedWords` * Имена тестовых методов `<объект тестирования>_<что тестируется>_test(self, *args, **kwargs)` * Допускается использование нескольких assert`ов в тесте если они связаны с тестируемым функционалом * Использовать только assert`ы contesto ================================================ FILE: functional-tests/classes/WAPI/__init__.py ================================================ ================================================ FILE: functional-tests/classes/WAPI/dataWorker.py ================================================ # -*- coding: utf-8 -*- from classes.WAPI.request import * import itertools # TODO: Сделать хэлпер для выпиливания html entities из ответа API class GeoData(object): def __init__(self, cords, zoom): request = GeoSearch() self.response = request.get(cords, zoom) def get_value_by_key(self, key_name, key_value, key_return): """ :param key_name: Key name, that want use (example: 'subtype') :param key_value: Value that element with key_name should be equal (example: 'city') :param key_return: Key name that should be returned (example: 'name') :return: string or list (depends on field) """ for elem in self.response['items']: if elem.get(key_name) == key_value: return elem.get(key_return) @property def city_name(self): return self.get_value_by_key('subtype', 'city', 'name') @property def district_name(self): return self.get_value_by_key('subtype', 'district', 'name') @property def place_address(self): adm_divs = self.get_value_by_key('subtype', 'district', 'adm_div') adm_divs.reverse() dist_addr = adm_divs.pop(0)['name'] for div in adm_divs: dist_addr = "%s, %s" % (dist_addr, div['name']) return dist_addr.replace(u'\xa0', ' ') @property def build_name(self): address_name = self.get_value_by_key('subtype', None, 'address_name') building_name = self.get_value_by_key('subtype', None, 'building_name') if building_name is None: return address_name else: return building_name @property def street_name(self): return self.get_value_by_key('type', 'street', 'name').replace(u'\xa0', ' ') @property def street_address(self): return self.get_value_by_key('type', 'street', 'adm_div')[0]['name'].replace(u'\xa0', ' ') @property def attraction_name(self): subtype_name = self.get_value_by_key('type', 'attraction', 'subtype_name') name = self.get_value_by_key('type', 'attraction', 'name') if not name: return subtype_name else: return name @property def attraction_description(self): return self.get_value_by_key('type', 'attraction', 'description') class FirmData(object): def __init__(self, firm_id): request = FirmInfo() self.response = request.get(firm_id) @property def firm_name(self): return self.response['items'][0]['name'] @property def review_count(self): return self.response['items'][0]['reviews']['review_count'] @property def rating(self): return self.response['items'][0]['reviews']['rating'] @property def address_name(self): return self.response['items'][0]['address_name'].replace(u'\xa0', ' ') @property def address_comment(self): return self.response['items'][0]['address_comment'].replace(u'\xa0', ' ') def _contacts_by_type(self, contact_type): contacts = list() contact_groups = self.response['items'][0]['contact_groups'] for group in contact_groups: for item in group['contacts']: if item['type'] == contact_type: contacts.append(item) return contacts def get_phones(self): return self._contacts_by_type('phone') def get_websites(self): return self._contacts_by_type('website') def get_emails(self): return self._contacts_by_type('email') def get_rubrics_primary(self): primary = list() rubrics = self.response['items'][0]['rubrics'] for rubric in rubrics: if rubric['kind'] == 'primary': primary.append(rubric) return primary def get_rubrics_additional(self): additional = list() rubrics = self.response['items'][0]['rubrics'] for rubric in rubrics: if rubric['kind'] == 'additional': additional.append(rubric) return additional def photo_count(self): try: externals = self.response['items'][0]['external_content'] for item in externals: if item['subtype'] == 'common': return item['count'] except KeyError: return 0 class GalleryData(object): def __init__(self, gallery_id): request = GalleryInfo() self.response = request.get(gallery_id) @property def gallery_name(self): return self.response['items'][0]['name'] ================================================ FILE: functional-tests/classes/WAPI/request.py ================================================ # -*- coding: utf-8 -*- import urllib2 import urllib import json from config import config from classes.exceptions.exceptions import WebAPIException class BaseReq(object): def __init__(self): self.api_url = '%s/%s' % (config.wapi['url'], config.wapi['version']) self.base_params = { 'key': config.wapi['key'] } def request(self, url, params): """ :type url: str or unicode :type params: dict :rtype: dict """ data = urllib.urlencode(params) req = urllib2.Request('%s?%s' % (url, data)) # GET-method response = urllib2.urlopen(req).read() try: result = json.loads(response) except ValueError: raise WebAPIException('Response not in json') else: if not result['meta']['code'] == 200 and not result['meta']['code'] == 404: raise WebAPIException('Response code is %s, API response:\n%s' % (result['meta']['code'], result)) return result['result'] class GeoSearch(BaseReq): def __init__(self): super(GeoSearch, self).__init__() def get(self, coord, zoom): """ :param coord: diсt of lat and lng :param zoom: int or str :return: dict """ method = '/geo/search' params = { 'key': self.base_params['key'], 'point': '%s,%s' % (coord['lng'], coord['lat']), 'zoom_level': str(zoom), 'fields': 'items.geometry.selection,items.links,items.adm_div,items.address,items.floors,items.description', 'type': 'adm_div.settlement,adm_div.city,adm_div.division,adm_div.district,' 'street,building,adm_div.place,poi,attraction' } url = self.api_url + method return self.request(url, params) class FirmList(BaseReq): def __init__(self): super(FirmList, self).__init__() def get(self, build_id, page=1): """ :param build_id: int or str :param page: int or str :return: dict """ method = '/catalog/branch/list' params = { 'key': self.base_params['key'], 'building_id': str(build_id), 'page': str(page) } url = "%s%s" % (self.api_url, method) return self.request(url, params) class FirmInfo(BaseReq): def __init__(self): super(FirmInfo, self).__init__() def get(self, firm_id): """ :param firm_id: int or str :return: dict """ method = '/catalog/branch/get' params = { 'key': self.base_params['key'], 'id': str(firm_id), 'type': 'filial', 'fields': 'items.reviews,items.links,items.external_content' } url = "%s%s" % (self.api_url, method) return self.request(url, params) class GalleryInfo(BaseReq): def __init__(self): super(GalleryInfo, self).__init__() def get(self, id): """ :param id: int or str :return: dict """ method = '/geo/get' params = { 'key': self.base_params['key'], 'id': str(id), 'type': 'filial', 'fields': 'items.geometry.selection,items.links,items.adm_div,items.address,items.floors,items.description' } url = "%s%s" % (self.api_url, method) return self.request(url, params) ================================================ FILE: functional-tests/classes/__init__.py ================================================ ================================================ FILE: functional-tests/classes/components/__init__.py ================================================ ================================================ FILE: functional-tests/classes/components/balloon.py ================================================ # -*- coding: utf-8 -*- from classes.components.component import Component from config import config from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from time import time from contesto.exceptions import ElementNotFound from time import sleep from classes.util.decorators import catches_not_found class Balloon(Component): selectors = { 'self': '.leaflet-popup', 'content': '.dg-popup__container', 'scroll': '.dg-scroller__bar' } def wait_present(self): WebDriverWait(self.driver, config.timeout['normal']).until( EC.visibility_of(self.driver.find_element(By.CSS_SELECTOR, self.selectors['self'])) ) def wait_close(self, timeout=0.5, polling=0.1): start = time() end = start + timeout present = True step = start + polling while time() < end and present: if time() > step: step += polling try: self.driver.find_element_by_css_selector(['self']) except ElementNotFound: present = False else: sleep(polling) def count(self): return len(self.driver.find_elements_by_css_selector(self.selectors['self'])) def get_content(self): return self.driver.find_element_by_css_selector(self.selectors['content']) @property def width(self): return self.driver.find_element_by_css_selector(self.selectors['self']).value_of_css_property('width') @property def height(self): return self.driver.find_element_by_css_selector(self.selectors['self']).value_of_css_property('height') @property @catches_not_found() def scroll(self): return self.driver.find_element_by_css_selector(self.selectors['scroll']) class BalloonCrossed(Balloon): selectors = { 'self': '.leaflet-popup', 'header': '.dg-popup__header-title', 'X': '.leaflet-popup-close-button' } def close(self): self.element.find_element_by_css_selector(self.selectors['X']).click() ================================================ FILE: functional-tests/classes/components/callout.py ================================================ # -*- coding: utf-8 -*- from classes.util.unescape import unescape_text from classes.util.decorators import catches_not_found from classes.components.balloon import BalloonCrossed class Callout(BalloonCrossed): pass class UnknownPlace(Callout): """ Unknown place callout """ selectors = { 'self': '.leaflet-popup', 'header': '.dg-popup__header-title', 'X': '.leaflet-popup-close-button' } @property def header(self): """ :return: str """ return self.element.find_element_by_css_selector(self.selectors['header']).text.strip() class Place(Callout): """ Base place callout (example: city callout) """ selectors = { 'self': '.leaflet-popup', 'header': '.dg-popup__header-title', 'X': '.leaflet-popup-close-button', 'purpose': '.dg-map-geoclicker__purpose' } @property def header(self): """ :return: str """ return self.element.find_element_by_css_selector(self.selectors['header']).text.strip() @property def purpose(self): """ :return: str """ return self.element.find_element_by_css_selector(self.selectors['purpose']).text.strip() class AddressPlace(Place): """ Addressed place callout (example: district) """ selectors = { 'self': '.leaflet-popup', 'header': '.dg-popup__header-title', 'X': '.leaflet-popup-close-button', 'purpose': '.dg-map-geoclicker__purpose', 'drilldown': '.dg-map-geoclicker__drilldown' } @property def drilldown(self): """ :return: str """ return unescape_text(self.element.find_element_by_css_selector(self.selectors['drilldown']).text.strip()) class Attraction(Callout): """ Attraction callout without text (example: sandboxes, toilets, attractions) """ selectors = { 'self': '.leaflet-popup', 'header': '.dg-popup__header-title', 'X': '.leaflet-popup-close-button', 'purpose': '.dg-map-geoclicker__purpose' } @property def header(self): """ :return: str """ return self.element.find_element_by_css_selector(self.selectors['header']).text.strip() @property def purpose(self): """ :return: str """ return self.element.find_element_by_css_selector(self.selectors['purpose']).text.strip() class AttractionWrapped(Attraction): """ Attraction callout with text (example: monuments etc.) """ selectors = { 'self': '.leaflet-popup', 'header': '.dg-popup__header-title', 'X': '.leaflet-popup-close-button', 'purpose': '.dg-map-geoclicker__purpose', 'wrapper': '.dg-map-geoclicker__show-more-sights-link', 'text': '.dg-map-geoclicker__sight-description' } @property def text(self): """ :return: str """ return self.element.find_element_by_css_selector(self.selectors['text']).text.strip() @catches_not_found(False) def wrapper(self): return self.element.find_element_by_css_selector(self.selectors['wrapper']) def unwrap(self): self.element.find_element_by_css_selector(self.selectors['wrapper']).click() class Build(Callout): """ Base build callout """ selectors = { 'self': '.leaflet-popup', 'header': '.dg-popup__header-title', 'X': '.leaflet-popup-close-button', 'firm': '.dg-popup__link', 'firm_list': '.dg-popup__button_name_all' } # TODO добавить конструктор route-ссылок @property def header(self): """ :return: str """ return self.element.find_element_by_css_selector(self.selectors['header']).text.strip() def open_firm_by_index(self, index): self.driver.find_elements_by_css_selector(self.selectors['firm'])[index].click() @catches_not_found() def open_firm_list(self): self.driver.find_element_by_css_selector(self.selectors['firm_list']).click() @catches_not_found() def open_firm_by_id(self, firm_id): self.driver.find_element_by_id(str(firm_id)).click() class FirmList(Callout): """ Firm list callout """ selectors = { 'self': '.leaflet-popup', 'header': '.dg-popup__header-title', 'X': '.leaflet-popup-close-button', 'list': '.dg-building-callout__list' } def list_present(self): return self.driver.find_element_by_css_selector(self.selectors['list']).is_displayed() class Firm(Callout): """ Firm and common poi callout """ selectors = { 'self': '.leaflet-popup', 'header': '.dg-popup__header-title', 'X': '.leaflet-popup-close-button', 'photo': '.dg-popup__link_type_photos', 'reviews': '.dg-popup__link_type_flamp_reviews', 'stars': '.dg-popup__rating-stars', 'back': '.dg-popup__button_name_firm-card-back', 'route': '.dg-popup__button_name_goto', 'address': '.dg-firm-card__address', 'phones': '.dg-firm-card__phone-num', 'websites': '.dg-firm-card__site', 'email': '.dg-firm-card__email > a', 'primary': '.dg-firm-card__rubrics-list_type_primary > .dg-firm-card__rubrics-list-item', 'additional': '.dg-firm-card__rubrics-list_type_additional > .dg-firm-card__rubrics-list-item' } @property def callout(self): return self.driver.find_element_by_css_selector(self.selectors['self']) @property def header(self): """ :return: str """ return self.element.find_element_by_css_selector(self.selectors['header']).text.strip() @property @catches_not_found() def photo(self): """ :return: web_element """ return self.element.find_element_by_css_selector(self.selectors['photo']) @property @catches_not_found() def reviews(self): """ :return: web_element """ return self.element.find_element_by_css_selector(self.selectors['reviews']) @property @catches_not_found() def stars(self): """ :return: web_element """ return self.element.find_element_by_css_selector(self.selectors['stars']) @catches_not_found() def back(self): return self.element.find_element_by_css_selector(self.selectors['back']).click() @property def route_link(self): return self.element.find_element_by_css_selector(self.selectors['route']) @property def address(self): return self.driver.find_element_by_css_selector(self.selectors['address']) def phones(self): return self.driver.find_elements_by_css_selector(self.selectors['phones']) def websites(self): return self.driver.find_elements_by_css_selector(self.selectors['websites']) @property def email(self): return self.driver.find_element_by_css_selector(self.selectors['email']) @property def primary_rubrics(self): return self.driver.find_elements_by_css_selector(self.selectors['primary']) @property def additional_rubrics(self): return self.driver.find_elements_by_css_selector(self.selectors['additional']) ================================================ FILE: functional-tests/classes/components/component.py ================================================ from contesto.basis.component import BaseComponent from selenium.webdriver.common.action_chains import ActionChains class Component(BaseComponent): def __init__(self, test, element): """ :type test: InfoPortalDriver :type element: InfoPortalWebElement """ super(Component, self).__init__(test, element) self.test = self.driver def hover(self): ActionChains(self.driver).move_to_element(self.element).perform() @property def is_visible(self): return self.element.is_displayed() ================================================ FILE: functional-tests/classes/components/map.py ================================================ # -*- coding: utf-8 -*- from selenium.webdriver import ActionChains from selenium.webdriver.common.keys import Keys from component import Component from classes.util.scripts import GetScripts from classes.util.scripts import SetScripts from time import time import math from time import sleep class Map(Component): selectors = { 'self': '#map', 'info': '#info' } def zoom_selection(self): center = self.driver.execute_script(GetScripts.getContainerCenter) actions = ActionChains(self.driver) actions.move_to_element_with_offset(self.element, int(center['x']), int(center['y'])) actions.key_down(Keys.SHIFT) actions.click_and_hold() actions.move_by_offset(300, 300) actions.release() actions.perform() def center_click(self): center = self.driver.execute_script(GetScripts.getContainerCenter) actions = ActionChains(self.driver) actions.move_to_element_with_offset(self.element, int(center['x']), int(center['y'])) actions.click().perform() def center_dbclick(self): center = self.driver.execute_script(GetScripts.getContainerCenter) actions = ActionChains(self.driver) actions.move_to_element_with_offset(self.element, int(center['x']), int(center['y'])) actions.double_click().perform() def set_zoom(self, level): self.driver.execute_script(SetScripts.set_zoom(level)) def wait_init(self, timeout=3, polling=0.5): """ :param timeout: timeout to rise exception :param polling: how often check map init :return: None """ request_num = math.ceil(timeout / polling) tries = 0 tries_out = False map_inited = False start = time() while not tries_out and not map_inited: if time() > (start + tries * polling): map_inited = self.driver.execute_script('return !!map.getZoom') tries_out = tries >= request_num tries += 1 def drag(self, x_offset, y_offset): center = self.driver.execute_script(GetScripts.getContainerCenter) actions = ActionChains(self.driver) actions.move_to_element_with_offset(self.element, int(center['x']), int(center['y'])) actions.click_and_hold() actions.move_by_offset(x_offset, y_offset) actions.release().perform() def info_elem(self): return self.driver.find_element_by_css_selector(self.selectors['info']) ================================================ FILE: functional-tests/classes/components/mapsapi_sources.py ================================================ from component import Component from classes.util.decorators import catches_not_found class Source(Component): selectors = { 'loader': '[src*="loader"]', 'app_js': 'script[src*="/js/?"]' } @property @catches_not_found(False) def loader_present(self): return bool(self.driver.find_element_by_css_selector(self.selectors['loader'])) @property @catches_not_found(False) def app_js_present(self): return bool(self.driver.find_element_by_css_selector(self.selectors['app_js'])) ================================================ FILE: functional-tests/classes/components/marker.py ================================================ from classes.components.component import Component from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.action_chains import ActionChains from config import config class Marker(Component): selectors = { 'self': 'div.leaflet-pane.leaflet-marker-pane > div.dg-customization__marker', 'label': 'div.dg-label > div.dg-label__content' } def click(self, index=0): self.driver.find_elements_by_css_selector(self.selectors['self'])[index].click() def wait_present(self): WebDriverWait(self.driver, config.timeout['normal']).until( EC.visibility_of(self.driver.find_element(By.CSS_SELECTOR, self.selectors['self'])) ) def drag_marker(self, x_offset, y_offset, index=0): actions = ActionChains(self.driver) marker = self.driver.find_elements_by_css_selector(self.selectors['self'])[index] actions.drag_and_drop_by_offset(marker, x_offset, y_offset).perform() def get_lat(self, name='marker'): return self.driver.execute_script('return %s._latlng.lat.toFixed(3)' % name) def get_lng(self, name='marker'): return self.driver.execute_script('return %s._latlng.lng.toFixed(3)' % name) def get_labels(self): return self.driver.find_elements_by_css_selector(self.selectors['label']) def get_markers(self): return self.driver.find_elements_by_css_selector(self.selectors['self']) def hover_marker(self, index=0): actions = ActionChains(self.driver) actions.move_to_element(self.get_markers()[index]).perform() def count(self): return len(self.driver.find_elements_by_css_selector(self.selectors['self'])) ================================================ FILE: functional-tests/classes/components/page.py ================================================ from contesto.basis.page import BasePage from time import sleep class Page(BasePage): def __init__(self, test): """ :type test: Mapsapi driver """ self.test = test super(Page, self).__init__(test) def refresh(self): super(Page, self).refresh() self.__init__(self.test) def forward(self): super(Page, self).forward() self.__init__(self.test) def back(self): super(Page, self).back() self.__init__(self.test) @property def new_window_url(self): win_count = len(self.test.window_handles) self.test.switch_to_window(self.test.window_handles[win_count - 1]) return self.test.current_url def click(self): """ Left-clicks the current cursor position """ from selenium.webdriver.common.action_chains import ActionChains act = ActionChains(self.test) act.click().perform() @property def map(self): """ :return: MapContainer """ from classes.components.map import Map return Map(self.test, self.test.find_element_by_css_selector(Map.selectors['self'])) @property def zoom_control_in(self): """ :rtype: ZoomControlIn """ from classes.components.zoom_control import ZoomControlIn return ZoomControlIn(self.test, self.test.find_element_by_css_selector(ZoomControlIn.selectors['self'])) @property def zoom_control_out(self): """ :rtype: ZoomControlOut """ from classes.components.zoom_control import ZoomControlOut return ZoomControlOut(self.test, self.test.find_element_by_css_selector(ZoomControlOut.selectors['self'])) @property def balloon(self): """ :return: Callout """ from classes.components.balloon import Balloon return Balloon(self.test, self.test.find_element_by_css_selector(Balloon.selectors['self'])) @property def balloon_crossed(self): """ :return: CalloutCrossed """ from classes.components.callout import BalloonCrossed return BalloonCrossed(self.test, self.test.find_element_by_css_selector(BalloonCrossed.selectors['self'])) @property def unkown_place(self): """ :return: UnknownPlace """ from classes.components.callout import UnknownPlace return UnknownPlace(self.test, self.test.find_element_by_css_selector(UnknownPlace.selectors['self'])) @property def place_callout(self): """ :return: PlaceCallout """ from classes.components.callout import Place return Place(self.test, self.test.find_element_by_css_selector(Place.selectors['self'])) @property def addresed_place_callout(self): """ :return: AddressPlaceCallout """ from classes.components.callout import AddressPlace return AddressPlace(self.test, self.test.find_element_by_css_selector(AddressPlace.selectors['self'])) @property def build_callout(self): """ :return: BuildCallout """ from classes.components.callout import Build return Build(self.test, self.test.find_element_by_css_selector(Build.selectors['self'])) @property def attraction_callout(self): """ :return: AttractionCallout """ from classes.components.callout import Attraction return Attraction(self.test, self.test.find_element_by_css_selector(Attraction.selectors['self'])) @property def attraction_callout_wrapped(self): """ :return: AttractionCallout """ from classes.components.callout import AttractionWrapped return AttractionWrapped(self.test, self.test.find_element_by_css_selector(AttractionWrapped.selectors['self'])) @property def firm_callout(self): """ :return: FirmCallout """ from classes.components.callout import Firm return Firm(self.test, self.test.find_element_by_css_selector(Firm.selectors['self'])) @property def marker(self): """ :return: Marker """ from classes.components.marker import Marker return Marker(self.test, self.test.find_element_by_css_selector(Marker.selectors['self'])) def console(self, script, timeout=0): result = self.test.execute_script(script) sleep(timeout) return result @property def firm_list(self): """ :return: FirmList callout """ from classes.components.callout import FirmList return FirmList(self.test, self.test.find_element_by_css_selector(FirmList.selectors['self'])) @property def sources(self): """ :return: Source """ from classes.components.mapsapi_sources import Source return Source(self.test, self.test.find_element_by_css_selector(Source.selectors['loader'])) ================================================ FILE: functional-tests/classes/components/zoom_control.py ================================================ # -*- coding: utf-8 -*- from component import Component class ZoomControlIn(Component): selectors = { 'self': '.dg-zoom__in > div' } def zoom_in_click(self): self.element.click() class ZoomControlOut(Component): selectors = { 'self': '.dg-zoom__out > div' } def zoom_out_click(self): self.element.click() ================================================ FILE: functional-tests/classes/exceptions/__init__.py ================================================ ================================================ FILE: functional-tests/classes/exceptions/exceptions.py ================================================ from contesto.exceptions import BaseError class MapsApiException(BaseError): pass class ElementNotFoundException(MapsApiException): pass class UnknownElementException(MapsApiException): pass class WebAPIException(MapsApiException): pass class CommonException(MapsApiException): pass class NoPageIsSelected(MapsApiException): pass class NotTransportTypeError(MapsApiException): pass class NotGeoTypeError(MapsApiException): pass class NotFirmTypeError(MapsApiException): pass ================================================ FILE: functional-tests/classes/mapsapi_base_test.py ================================================ # -*- coding: utf-8 -*- from classes.components.page import Page from contesto.basis.test_case import UnittestContestoTestCase from config import config # TODO: Переопределить логгер из contesto, чтоб не падать при пустых логах class MapsAPIBaseTest(UnittestContestoTestCase): def setUp(self): super(MapsAPIBaseTest, self).setUp() self.page = Page(self.driver) if self.driver.browser != 'opera' or self.driver.browser != 'phantomjs': self.driver.maximize_window() self.driver.set_script_timeout(config.timeout["normal"]) self._webAPI = None self._baseWAPI = None def tearDown(self): # log.info("JS Errors: %s" % self.driver.js_errors) super(MapsAPIBaseTest, self).tearDown() ================================================ FILE: functional-tests/classes/util/__init__.py ================================================ # -*- coding: utf-8 -*- ================================================ FILE: functional-tests/classes/util/decorators.py ================================================ # -*- coding: utf-8 -*- from contesto import config from contesto.exceptions import ElementNotFound from selenium.webdriver.support.wait import WebDriverWait import functools def catches_not_found(if_not_found=None): def wrapper(f): @functools.wraps(f) def decorated(self, *args, **kwargs): try: return f(self, *args, **kwargs) except ElementNotFound: return if_not_found return decorated return wrapper def waits_for(selectors, appear=False): def wrap(f): def decorate(self, *args, **kwargs): f(self, *args, **kwargs) for selector in selectors: try: driver = self.test if 'test' in self.__class__.__dict__ else self.driver wait = WebDriverWait(driver, float(config.timeout['normal'])) if appear: wait.until(lambda dr: dr.find_element_by_css_selector(selector).is_displayed()) else: wait.until_not(lambda dr: dr.find_element_by_css_selector(selector).is_displayed()) except ElementNotFound: continue return decorate return wrap def try_x_times(x, exceptions_to_catch, exception_to_raise, fn): """ :param x: int :param exceptions_to_catch: tuple of Exception :param exception_to_raise: tuple of Exception :param fn: function """ @functools.wraps(fn) # keeps name and docstring of old function def new_fn(*args, **kwargs): for i in xrange(x): try: return fn(*args, **kwargs) except exceptions_to_catch: pass raise exception_to_raise return new_fn ================================================ FILE: functional-tests/classes/util/geo_types_map.py ================================================ # -*- coding: utf-8 -*- """ Взято из models/geo.js """ geo_type = { 'street': u'Улица', 'house': u'Дом', 'district': u'Район', 'division': u'Округ', 'city': u'Город', 'settlement': u'Населенный пункт', 'station': u'Остановка', 'station_platform': u'Остановочная платформа', 'living_area': u'Микрорайон', 'place': u'Место', 'sight': u'Достопримечательность', 'crossroad': u'Перекресток', 'metro': u'Станция метро', } ================================================ FILE: functional-tests/classes/util/link_generator.py ================================================ def photo_link(firm_id): return "http://2gis.ru/photos/%s" % firm_id def reviews_link(firm_id): return "http://flamp.ru/r/%s?utm_source=api2gis&utm_medium=api&utm_campaign=geoclicker" % firm_id ================================================ FILE: functional-tests/classes/util/misc.py ================================================ # -*- coding: utf-8 -*- import urllib def extend(extension, base): """ :param base: dict of dicts :param extension: dict :return: dict Extend each base dict from key of extension """ for part in base: for default_prop in extension: if default_prop not in base[part]: base[part][default_prop] = extension[default_prop] return base def comment_equals(comment, wapi_comment): """ :type comment: str or unicode :type wapi_comment: str or unicode :rtype: bool """ return comment == '— '.decode('utf-8') + wapi_comment def unicode_print(s): """ Prints unicode strings :type s: unicode """ s = to_unicode(s) print u'%s' % s, def to_unicode(s): """ Converts string to unicode if necessary :type s: str or unicode :rtype: unicode """ try: s = str(s) return s.decode('utf-8') except UnicodeEncodeError: return s def rprint(item): """ Prints list or dict recursively. :type item: list, dict """ if isinstance(item, list): print '[', for i in item: rprint(i) print ', ', print ']', elif isinstance(item, dict): print '{', for key, val in item.iteritems(): unicode_print(key) print ': ', rprint(val) print ', ', print '}', else: unicode_print(item) class AttrDict(dict): """ Wraps a dict object or literal to access values like object properties: my_dict = AttrDict( {'a': 1} ) assert my_dict.a == 1 """ def __init__(self, *args, **kwargs): super(AttrDict, self).__init__(*args, **kwargs) self.__dict__ = self def to_str(s): """ Converts unicode to string if necessary :type s: str or unicode :rtype: str """ try: return s.encode('utf-8') except UnicodeDecodeError: return s def to_int(s): """ Return first number from string :param s: strin or unicode :return: int """ out = '' started = False for x in s: if x.isdigit(): out += x started = True if started and not x.isdigit(): return int(out) return int(out) def address_and_comment(address, comment): return u"%s— %s" % (address, comment) def phone_and_comment(phone, comment): return u"%s— %s" % (phone, comment) def check_route(link, check_part): """ :param link: string with route link :param check_part: list of fixture base parts of route link :return: bool Remove protocol and unquote url Split route link by '/', split last part by '╎', split coordinates part by ',' Save each parts in 'parts' list with original order. Round coordinates and check equal part in parts and check_part, save result in 'check' list Return all True of check list. """ # unquote link = urllib.unquote(to_str(link[7:])) # make parts list parts = link.split('/') coords = parts[len(parts) - 1].split('╎')[0] address = parts[len(parts) - 1].split('╎')[1] parts.remove(parts[len(parts) - 1]) parts.append(coords) parts.append(address) center = parts[3].split(',') baloon = parts[len(parts) - 2].split(',') parts[3] = center[0] parts.insert(4, center[1]) parts[len(parts) - 2] = baloon[0] parts.insert(len(parts) - 1, baloon[1]) # check equals i = 0 check = list() while i < len(parts): if isinstance(check_part[i], float): check_part[i] = round(check_part[i], 2) parts[i] = round(float(parts[i]), 2) check.append(check_part[i] == parts[i]) i += 1 return all(item for item in check) def coord_equals(expected, got, precision): """ :param expected: Expected coordinate value :param got: Got coordinate value :param precision: Precision for round latitude and longitude :return: bool Check part by part coordinate equals with precision """ checks = list() checks.append(round(expected['lat'], precision) == round(got['lat'], precision)) checks.append(round(expected['lng'], precision) == round(got['lng'], precision)) print(round(expected['lat'], precision)) print(round(got['lat'], precision)) print(round(expected['lng'], precision)) print(round(got['lng'], precision)) return all(check for check in checks) def coord_string_to_dict(coord_str): """ :param coord_str: string like 'lat, lng' :return: dict from coord_string content lat and lng respectively """ parts = coord_str.split(', ') return {'lat': float(parts[0]), 'lng': float(parts[1])} ================================================ FILE: functional-tests/classes/util/scripts.py ================================================ class GetScripts: getZoom = 'return map.getZoom();' getCenter = 'return map.getCenter();' getContainerCenter = 'return map.latLngToContainerPoint(map.getCenter());' class SetScripts: @staticmethod def set_zoom(level=10): return 'map.setZoom(%s, {animate: false});' % str(level) @staticmethod def pan_to(lat, lng): return 'map.panTo([%s, %s], {animate: false});' % (str(lat), str(lng)) @staticmethod def set_lang(lang): return 'map.setLang("%s");' % str(lang) @staticmethod def open_marker(name='marker'): return '%s.openPopup();' % name @staticmethod def dg_then(cb=''): return 'DG.then(%s);' % cb ================================================ FILE: functional-tests/classes/util/transport_types_map.py ================================================ # -*- coding: utf-8 -*- route_type = { 'bus': u'Автобус', 'trolleybus': u'Троллейбус', 'tram': u'Трамвай', 'shuttle_bus': u'Маршрутное такси', 'metro': u'Метро', 'suburban_train': u'Электропоезд', 'funicular_railway': u'Фуникулер', 'monorail': u'Монорельс', 'river_transport': u'Речной транспорт', 'cable_car': u'Канатная дорога', 'light_rail': u'Скоростной трамвай', 'premetro': u'Метротрам', 'light_metro': u'Лёгкое метро', } ================================================ FILE: functional-tests/classes/util/unescape.py ================================================ # -*- coding: utf-8 -*- def unescape_text(text): """ АПИ передает в выдаче эскейп-символы. Метод преобразовывает их в нормальный вид см tests/search/firms_minicard/ """ import HTMLParser return HTMLParser.HTMLParser().unescape(text) ================================================ FILE: functional-tests/config/__init__.py ================================================ import os import contesto from contesto import config as cfg contesto.config.add_config_file(os.path.abspath(os.path.dirname(__file__)) + "/config.ini") contesto.config.add_config_file(os.path.abspath(os.path.dirname(__file__)) + "/config.my.ini") config = cfg ================================================ FILE: functional-tests/config/config.ini ================================================ [AUT] local: http://127.0.0.1:3000/pages [Selenium] host: localhost port: 4455 browser: chrome [Timeout] normal: 5 [Session] shared: 0 [WAPI] url: http://catalog.api.2gis.ru key: ruregt3044 version: 2.0 ================================================ FILE: functional-tests/config/config.my.ini ================================================ ;[AUT] ;local: http://maps.test.webmaps.ostack.test/2.0/pages ; ; ;[Selenium] ;host: vmmaster.auto.ostack.test ;port: 9000 ;platform: ubuntu-14.04-x64 ;browser: chrome ;user: webmaps ;token: d2cf4ace-b964-4d39-9df7-5b676d35a6b7 ; ;[Timeout] ;normal: 10 ;loading: 10 ; ;[Session] ;shared: 0 ; ;[WAPI] ;url: http://catalog.api.2gis.ru ;key: ruregt3044 ;version: 2.0 ================================================ FILE: functional-tests/pep8 ================================================ [pep8] ignore=E501 ================================================ FILE: functional-tests/pep8-hook.sh ================================================ #!/bin/sh py_files=$(git diff `git merge-base master HEAD`..HEAD --name-only | grep ".py$") if [ "$py_files" = "" ]; then exit 0 fi pass=true echo "\nValidating python source files:\n" for file in ${py_files}; do result=$(pep8 --format=pylint --config=functional-tests/pep8 ${file}) if [ "$result" != "" ]; then echo "\t\033[31mpep8 Failed: ${file}\033[0m" echo "$result" pass=false else echo "\t\033[32mpep8 Passed: ${file}\033[0m" fi done echo "\nPython validation complete\n" if ! $pass; then echo "\033[41mCOMMIT FAILED:\033[0m Your commit contains files that should pass pep8 but do not. Please fix the pep8 errors and try again.\n" exit 1 else echo "\033[42mCOMMIT SUCCEEDED\033[0m\n" fi ================================================ FILE: functional-tests/prepare.sh ================================================ #!/usr/bin/env bash virtualenv --python=python .env source .env/bin/activate pip install -U git+https://github.com/2gis/contesto.git@53ff11259171a8fca74cbc04bf83bbdec668424d pip install -U git+https://github.com/2gis/lode_runner.git@7cbd608328058b4c622fcd8795a8804ef121cae7 pip install -U selenium pip install -U pep8 pip install -U jinja2 ================================================ FILE: functional-tests/run.sh ================================================ #!/usr/bin/env bash source .env/bin/activate PYTHONPATH=$(pwd) .env/bin/lode_runner -v tests/ --with-xunit exit 0; ================================================ FILE: functional-tests/template_render.sh ================================================ #!/usr/bin/python # -*- coding: utf-8 -*- from jinja2 import Template from templates.content import pages import codecs import os if not os.path.exists('../dist/pages'): os.mkdir('../dist/pages') base = open('templates/base.html', 'r') template = Template(base.read()) base.close() parts = pages() for page in parts: out = codecs.open("../dist/pages/%s.html" % parts[page]['title'], 'w', 'utf-8') out.write(template.render(parts[page])) out.close() ================================================ FILE: functional-tests/templates/__init__.py ================================================ ================================================ FILE: functional-tests/templates/base.html ================================================ {{title}} {{info}}
{{controls}} ================================================ FILE: functional-tests/templates/content.py ================================================ # -*- coding: utf-8 -*- from classes.util.misc import extend def pages(): parts = dict( base={ 'title': u'base', 'mapInit': u""" DG.then(function() { map = DG.map('map', { center: [54.98, 82.89], zoom: 13, geoclicker: true, worldCopyJump: true, zoomAnimation: false }); DG.control.location({position: 'bottomright'}).addTo(map); DG.control.scale().addTo(map); DG.control.ruler({position: 'bottomleft'}).addTo(map); DG.control.traffic().addTo(map); });""" }, demo={ 'title': u'demo', 'mapInit': u""" var options, balloonHTML; DG.then(function () { map = DG.map('map', { center: [54.980156831455, 82.897440725094], zoom: 13, geoclicker: true, worldCopyJump: true, zoomControl: false, fullscreenControl: false, zoomAnimation: false }); // change control position on touch devices if (DG.Browser.touch) { options = { position: 'bottomright' }; } DG.control.zoom(options).addTo(map); DG.control.traffic(options).addTo(map); DG.control.location(options).addTo(map); DG.control.ruler(options).addTo(map); if (DG.screenfull.isAvailable()) { DG.control.fullscreen(options).addTo(map); } balloonHTML = '\\n\\ 2GIS\\n\\

Компания «ДубльГИС»

Тел.: (383) 363-05-55
Адрес: г. Новосибирск, Карла Маркса площадь, 7
\\n\\ (МФК «Сан Сити»), 13 этаж'; marker = DG.marker([54.980156831455, 82.897440725094]).addTo(map).bindPopup(balloonHTML).openPopup(); }); """, 'headStyle': u""" html,body { height: 100%; margin: 0; padding: 0; } .leaflet-touch .leaflet-bottom .dg-attribution { margin-top: 70px; } .leaflet-touch .leaflet-bottom .dg-zoom {margin: 40px 10px 40px 0; } """ }, draggableMarker={ 'title': u'draggableMarker', 'mapInit': u""" DG.then(function () { map = DG.map('map', { center: [54.981, 82.891], zoom: 15, zoomAnimation: false }); marker = DG.marker([54.981, 82.891], { draggable: true }).addTo(map); }); """ }, groupBalloon={ 'title': u'groupBalloon', 'mapInit': u""" DG.then(function() { var map, popups = DG.featureGroup(), coordinates = []; map = DG.map('map', { center: [54.98, 82.89], zoom: 13, zoomAnimation: false }); for (var i = 0; i < 10; i++) { coordinates[0] = 54.98 - Math.random(); coordinates[1] = 82.89 + Math.random(); DG.popup() .setLatLng(coordinates) .setContent('Я балун №' + i) .addTo(popups); } popups.addTo(map); map.fitBounds(popups.getBounds()); }); """ }, groupMarkerEvent={ 'title': u'groupMarkerEvent', 'mapInit': u""" DG.then(function() { map = DG.map('map', { center: [54.98, 82.89], zoom: 10, zoomAnimation: false }); marker1 = DG.marker([54.96, 82.889]).addTo(map); marker2 = DG.marker([54.98, 82.893]).addTo(map); marker3 = DG.marker([54.847182907052186, 83.06230008602144]).addTo(map); group = DG.featureGroup([marker1, marker2, marker3]); group.addTo(map); group.on('click', function(e) { map.setView([e.latlng.lat, e.latlng.lng],{animate: false}); }); }); """ }, markerLabels={ 'title': u'markerLabels', 'mapInit': u""" DG.then(function() { map = DG.map('map', { center: [54.98, 82.89], zoom: 15, zoomAnimation: false }); DG.marker([54.98, 82.89]) .addTo(map) .bindLabel("static", { static: true }); DG.marker([54.98, 82.88]) .addTo(map) .bindLabel('default'); }); """ }, openBalloons={ 'title': u'openBalloons', 'mapInit': u""" DG.then(function() { map = DG.map('map', { center: [54.98, 82.89], zoom: 13, zoomAnimation: false }); DG.popup([54.98, 82.89]) .setLatLng([54.98, 82.89]) .setContent('default') .openOn(map); myPopUp = DG.popup() .setLatLng([54.98, 82.89]) .setContent('request'); }); function openPopUp() {myPopUp.openOn(map)}; """, 'controls': u""" """ }, sprawlingBalloon={ 'title': u'sprawlingBalloon', 'mapInit': u""" DG.then(function () { latLng = DG.latLng([54.98, 82.89]); map = DG.map('map', { center: latLng, zoom: 13, fullscreenControl: false, zoomControl: false, zoomAnimation: false }); document.getElementById('sprawling').onclick = function () { DG.popup({ maxWidth: 350, sprawling: true }) .setLatLng(latLng) .setContent('Я балун!') .openOn(map); }; document.getElementById('no-sprawling').onclick = function () { DG.popup({ maxWidth: 350 }) .setLatLng(latLng) .setContent('Я балун!') .openOn(map); }; document.getElementById('minWidth').onclick = function () { DG.popup({ maxWidth: 350, minWidth: 320 }) .setLatLng(latLng) .setContent('Я балун!') .openOn(map); }; }); function resize(pixels){ document.getElementById('map').style.width = pixels + "px"; map.invalidateSize(false); } """, 'controls': u"""





""", 'style': u"""width: 300px; height: 150px;""" }, scrollBarBaloon={ 'title': u'scrollBarBalloon', 'mapInit': u""" DG.then(function () { latLng = DG.latLng([54.98, 82.89]); map = DG.map('map', { center: latLng, zoom: 13, fullscreenControl: false, zoomControl: false, zoomAnimation: false }); document.getElementById('scrollBar').onclick = function () { DG.popup({ maxHeight: 300, }) .setLatLng(latLng) .setContent('Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ducimus ipsam itaque velit aut error ipsa sunt neque, ut molestiae. Omnis officia architecto similique, enim et voluptates sunt doloremque error repudiandae, iure est a quisquam, nulla voluptatibus quis nostrum voluptas vel ipsa consequatur ipsum velit. Nam laudantium, nemo iste enim ut soluta et explicabo amet nulla impedit sequi animi consectetur alias repellendus, laboriosam dolor dolorum tenetur quod modi sunt sapiente recusandae, pariatur! Delectus nihil provident hic perferendis veniam atque id, ad ipsum error laudantium, quo praesentium qui! Odit saepe distinctio aperiam autem dolor beatae nam, nostrum voluptate, reprehenderit tenetur quidem aspernatur!') .openOn(map); }; document.getElementById('noMaxHeight').onclick = function () { DG.popup() .setLatLng(latLng) .setContent('Lorem ipsum dolor sit amet, consectetur adipisicing elit. Facere, perspiciatis corrupti? Minima beatae sed delectus obcaecati, officia eos! Sint, excepturi facere iusto, sapiente facilis repellat. Eum facere, illo necessitatibus voluptatibus, illum quas. Cumque nisi incidunt, facere laboriosam asperiores nihil fugiat dolor dolorum sequi soluta consectetur non nulla vel praesentium omnis.') .openOn(map); }; document.getElementById('noScrollBar').onclick = function () { DG.popup({ maxHeight: 300 }) .setLatLng(latLng) .setContent('Lorem ipsum dolor sit amet, consectetur adipisicing elit. Voluptas numquam distinctio impedit, quod totam eveniet dolorum qui? Corporis praesentium ipsum officiis impedit quas, inventore laboriosam ipsam nobis soluta maxime delectus quasi voluptatem, tenetur obcaecati laudantium error. Velit expedita, reprehenderit natus nihil cupiditate doloribus quis? In obcaecati cupiditate vero laudantium maiores.') .openOn(map); }; }); """, 'controls': u"""



""", 'style': u"""width: 300px; height: 500px;""" }, boundsNsk={ 'title': u'boundsNsk', 'mapInit': u""" DG.then(function() { map = DG.map('map', { center: [54.98, 82.89], zoom: 10, maxBounds: [ [54.8220, 82.4304], [55.1372, 83.3505] ], minZoom: 10, maxZoom: 15, zoomAnimation: false }); }); """, 'style': 'width: 670px; height: 400px;' }, clickEvent={ 'title': u'clickEvent', 'mapInit': u""" DG.then(function() { var clickedElement = document.getElementById('info'), coords = [ [54.99, 82.88], [54.985, 82.94], [54.984, 82.925], [54.981, 82.928] ]; map = DG.map('map', { center: [54.98, 82.89], zoom: 13, zoomAnimation: false }); map.on('click', function(e) { clickedElement.innerHTML = 'map ' + e.latlng.lat + ', ' + e.latlng.lng; }); DG.marker([54.98, 82.89]) .on('click', function() { clickedElement.innerHTML = 'marker'; }) .addTo(map); DG.polygon(coords) .on('click', function() { clickedElement.innerHTML = 'polygon'; }) .addTo(map); }); """, 'style': u"width: 100%; height: 400px;" }, lazyLoad={ 'title': u'lazyLoad', 'getParams': u'?lazy=true' }, notLazyLoad={ 'title': u'notLazyLoad', 'getParams': u'?lazy=false' } ) defaults = dict( style='width: 1000px; height: 600px;', loaderPath='..', dgLoader='data-id="dgLoader"' ) return extend(defaults, parts) ================================================ FILE: functional-tests/tests/__init__.py ================================================ # -*- coding: utf-8 -*- import os import contesto from contesto import config as cfg contesto.config.add_config_file(os.path.abspath(os.path.dirname(__file__)) + "/config.ini") contesto.config.add_config_file(os.path.abspath(os.path.dirname(__file__)) + "/config.my.ini") config = cfg ================================================ FILE: functional-tests/tests/balloon_test.py ================================================ # -*- coding: utf-8 -*- from classes.mapsapi_base_test import MapsAPIBaseTest from config import config from lode_runner.dataprovider import dataprovider class Balloons(MapsAPIBaseTest): """ Тесты балунов """ @dataprovider([ config.aut['local'] + u'/demo.html' ]) def balloon_to_marker_test(self, url): """ :param url: Адрес страницы Проверка появления маркера при закрытии балуна 1.Кликаем в контрол закрытия балуна 2.Проверяем видимость маркера """ self.driver.get(url) self.page.map.wait_init() self.page.balloon_crossed.wait_present() self.page.balloon_crossed.close() self.assertTrue(self.page.marker.is_visible) @dataprovider([ config.aut['local'] + u'/openBalloons.html' ]) def balloon_default_open_test(self, url): """ :param url: Адрес страницы Проверка програмного открытия балуна. 1.Проверяем что открыт балун по умолчанию """ self.driver.get(url) self.page.map.wait_init() balloon_text = self.page.balloon.get_content().text self.assertEqual('default', balloon_text) @dataprovider([ config.aut['local'] + u'/openBalloons.html' ]) def balloon_program_open_test(self, url): """ :param url: Адрес страницы Проверка програмного открытия балуна. 1.Проверяем что открыт балун по умолчанию 2.Кликаем по кнопке "Открыть балун" 3.Проверяем что открыт один новый балун """ self.driver.get(url) self.page.map.wait_init() self.driver.find_element_by_css_selector('#showPopup').click() self.page.balloon.wait_close() self.page.balloon.wait_present() balloon = self.page.balloon.get_content() self.assertEqual(1, self.page.balloon.count()) self.assertEqual('request', balloon.text) @dataprovider([ config.aut['local'] + u'/groupBalloon.html' ]) def balloon_group_open_test(self, url): """ :param url: Проверка открытия группы балунов 1.Проверяем количество открытых балунов на карте """ self.driver.get(url) self.page.map.wait_init() self.page.balloon.wait_present() self.assertEqual(10, self.page.balloon.count()) @dataprovider([ (config.aut['local'] + u'/sprawlingBalloon.html', 'large', '350px'), (config.aut['local'] + u'/sprawlingBalloon.html', 'mid', '290px'), (config.aut['local'] + u'/sprawlingBalloon.html', 'small', '190px'), ]) def balloon_sprawling_test(self, url, size, width): """ :param url: Адрес страницы :param size: Размер карты(large - 500px, mid - 300px, small - 200px) :param width: Ширина балуна Проверка размера балуна с параметром sprawling на карте 1.Выставляем размер карты 2.Кликаем в создать балун 3.Проверяем ширину """ self.driver.get(url) self.page.map.wait_init() self.driver.find_element_by_css_selector("input#%s" % size).click() self.driver.find_element_by_css_selector('input#sprawling').click() balloon_width = self.page.balloon.width self.assertEqual(balloon_width, width) @dataprovider([ (config.aut['local'] + u'/sprawlingBalloon.html', 'small', 'large', '350px'), (config.aut['local'] + u'/sprawlingBalloon.html', 'small', 'mid', '290px'), (config.aut['local'] + u'/sprawlingBalloon.html', 'large', 'small', '190px'), ]) def balloon_sprawling_resize_test(self, url, start, end, width): """ :param url: Адрес страницы :param start: С какого размера переключаемся (размеры в описаны balloon_sprawling_test) :param end: На какой переключаемся :param width: Какой размер должен принять балун Проверка размера балуна с параметром sprawling на большой карте 1.Выставляем ширину карты 2.Создаем балун 3.Меняем ширину карты 4.Приверяем ширину балуна """ self.driver.get(url) self.page.map.wait_init() self.driver.find_element_by_css_selector("input#%s" % start).click() self.driver.find_element_by_css_selector('input#sprawling').click() self.driver.find_element_by_css_selector("input#%s" % end).click() balloon_width = self.page.balloon.width self.assertEqual(balloon_width, width) @dataprovider([ (config.aut['local'] + u'/scrollBarBalloon.html', 'scrollBar', True), (config.aut['local'] + u'/scrollBarBalloon.html', 'noMaxHeight', False), (config.aut['local'] + u'/scrollBarBalloon.html', 'noScrollBar', False), ]) def balloon_scroll_bar_test(self, url, type_, scroll_bar): """ Проверка скроллбара :param url: Адрес страницы :param type_: Какой балун :param scroll_bar: Есть ли скролбар 1.Кликаем в создать балун 2.Проверяем наличие скролбара """ self.driver.get(url) self.page.map.wait_init() self.driver.find_element_by_css_selector("input#%s" % type_).click() self.assertEqual(bool(self.page.balloon.scroll), scroll_bar) @dataprovider([ (config.aut['local'] + u'/scrollBarBalloon.html', 'scrollBar', 300), (config.aut['local'] + u'/scrollBarBalloon.html', 'noScrollBar', 240), ]) def balloon_max_height_test(self, url, type_, height): """ Проверка скроллбара :param url: Адрес страницы :param type_: Какой балун :param height: Высота 1.Кликаем в создать балун 2.Проверяем высоту балуна """ self.driver.get(url) self.page.map.wait_init() self.driver.find_element_by_css_selector("input#%s" % type_).click() balloon_height = self.page.balloon.height self.assertEqual(balloon_height, "%dpx" % height) ================================================ FILE: functional-tests/tests/bounds_test.py ================================================ # -*- coding: utf-8 -*- from classes.mapsapi_base_test import MapsAPIBaseTest from config import config from lode_runner.dataprovider import dataprovider from classes.util import scripts class Bounds(MapsAPIBaseTest): """ Тесты на ограничение зума и границ """ @dataprovider([ config.aut['local'] + u'/boundsNsk.html' ]) def bound_min_zoom_script_test(self, url): """ :param url: Адрес страницы Проверка ограничения минимального зума 1.Выставляем зум меньше ограничения 2.Проверяем что зум равен ограничению """ self.driver.get(url) self.page.map.wait_init() self.page.console(scripts.SetScripts.set_zoom(9)) zoom = self.page.console(scripts.GetScripts.getZoom) self.assertEqual(10, zoom) @dataprovider([ config.aut['local'] + u'/boundsNsk.html' ]) def bound_max_zoom_script_test(self, url): """ :param url: Адрес страницы Проверка ограничения максимального зума 1.Выставляем зум больше ограничения 2.Проверяем что зум равен ограничению """ self.driver.get(url) self.page.map.wait_init() self.page.console(scripts.SetScripts.set_zoom(16)) zoom = self.page.console(scripts.GetScripts.getZoom) self.assertEqual(15, zoom) @dataprovider([ config.aut['local'] + u'/boundsNsk.html' ]) def bound_max_zoom_control_test(self, url): """ :param url: Адрес страницы Проверка ограничения максимального зума 1.Выставляем зум равный ограничению 2.Кликаем в контрол zoom in 3.Проверяем что зум равен ограничению """ self.driver.get(url) self.page.map.wait_init() self.page.console(scripts.SetScripts.set_zoom(15)) self.page.zoom_control_in.zoom_in_click() zoom = self.page.console(scripts.GetScripts.getZoom) self.assertEqual(15, zoom) @dataprovider([ config.aut['local'] + u'/boundsNsk.html' ]) def bound_min_zoom_control_test(self, url): """ :param url: Адрес страницы Проверка ограничения минимального зума 1.Выставляем зум равный ограничения 2.Кликаем 3.Проверяем что зум равен ограничению """ self.driver.get(url) self.page.map.wait_init() self.page.console(scripts.SetScripts.set_zoom(10)) self.page.zoom_control_out.zoom_out_click() zoom = self.page.console(scripts.GetScripts.getZoom) self.assertEqual(10, zoom) ================================================ FILE: functional-tests/tests/event_test.py ================================================ # -*- coding: utf-8 -*- from classes.mapsapi_base_test import MapsAPIBaseTest from config import config from lode_runner.dataprovider import dataprovider from classes.util.scripts import SetScripts from classes.util import misc class EventHandlers(MapsAPIBaseTest): @dataprovider([ (config.aut['local'] + u'/clickEvent.html') ]) def click_marker_test(self, url): """ Проверка события click для маркера :param url: Адрес страницы 1.Открываем страницу 2.Кликаем в маркер 3.Проверяем содержимое info """ self.driver.get(url) self.page.map.wait_init() self.page.marker.click() info = self.page.map.info_elem() self.assertEqual(info.text, 'marker') @dataprovider([ (config.aut['local'] + u'/clickEvent.html', {'lat': 54.99, 'lng': 82.73}) ]) def click_map_test(self, url, point): """ Проверка события click для карты :param url: Адрес страницы :param point: Координаты на карте 1.Открываем страницу 2.Кликаем в координаты 3.Проверяем содержимое info """ self.driver.get(url) self.page.map.wait_init() info = self.page.map.info_elem() self.page.console(SetScripts.set_zoom(17)) self.page.console(SetScripts.pan_to(point['lat'], point['lng'])) self.page.map.center_click() self.assertEqual(info.text.split(' ')[0], 'map') coords = misc.coord_string_to_dict(info.text[4:]) self.assertTrue(misc.coord_equals(point, coords, 2)) @dataprovider([ (config.aut['local'] + u'/clickEvent.html', {'lat': 54.985, 'lng': 82.911}) ]) def click_polygon_test(self, url, point): """ Проверка события click для карты :param url: Адрес страницы :param point: Координаты на карте внутри полигона 1.Открываем страницу 2.Кликаем в координаты 3.Проверяем содержимое info """ self.driver.get(url) self.page.map.wait_init() info = self.page.map.info_elem() self.page.console(SetScripts.set_zoom(17)) self.page.console(SetScripts.pan_to(point['lat'], point['lng'])) self.page.map.center_click() self.assertEqual(info.text, 'polygon') ================================================ FILE: functional-tests/tests/firm_callout_test.py ================================================ # -*- coding: utf-8 -*- from classes.mapsapi_base_test import MapsAPIBaseTest from config import config from lode_runner.dataprovider import dataprovider from classes.util import scripts from classes.WAPI.dataWorker import FirmData import classes.util.misc as misc import classes.util.link_generator as links class FirmCallout(MapsAPIBaseTest): """ Тесты на сallout фирмы """ @dataprovider([( config.aut['local'] + u'/base.html', 54.980678320392336, 82.89860486984254, 141265770417218 ) ]) def firm_name_test(self, url, lat, lng, firm_id): """ Проверка заголовка фирмы 1.Открываем калаут фирмы 2.Проверяем заголовок """ self.driver.get(url) self.page.map.wait_init() self.page.console(scripts.SetScripts.pan_to(lat, lng)) self.page.console(scripts.SetScripts.set_zoom(17)) self.page.map.center_click() self.page.build_callout.wait_present() self.page.build_callout.open_firm_list() self.page.build_callout.open_firm_by_id(firm_id) callout_text = self.page.firm_callout.header f = FirmData(firm_id) self.assertEqual(f.firm_name, callout_text) @dataprovider([( config.aut['local'] + u'/base.html', 54.980678320392336, 82.89860486984254 ) ]) def firm_back_list_test(self, url, lat, lng): """ Проверка кнопки назад (в здании с мн. организаций) 1.Открываем калаут фирмы 2.Нажимаем назад 3.Проверяем наличие списка организаций """ self.driver.get(url) self.page.map.wait_init() self.page.console(scripts.SetScripts.pan_to(lat, lng)) self.page.console(scripts.SetScripts.set_zoom(17)) self.page.map.center_click() self.page.build_callout.wait_present() self.page.build_callout.open_firm_list() self.page.build_callout.open_firm_by_index(1) self.page.firm_callout.back() self.assertTrue(self.page.firm_list.list_present()) @dataprovider([( config.aut['local'] + u'/base.html', 54.987722587459736, 82.88787066936494 ) ]) def firm_back_build_test(self, url, lat, lng): """ Проверка кнопки назад (к зданию) 1.Открываем калаут фирмы 2.Нажимаем назад 3.Проверяем наличие колаута здания """ self.driver.get(url) self.page.map.wait_init() self.page.console(scripts.SetScripts.pan_to(lat, lng)) self.page.console(scripts.SetScripts.set_zoom(17)) self.page.map.center_click() self.page.build_callout.wait_present() self.page.build_callout.open_firm_by_index(1) self.page.firm_callout.back() self.assertTrue(self.page.build_callout.is_visible) @dataprovider([( config.aut['local'] + u'/base.html', 54.987722587459736, 82.88787066936494, 17, ['2gis.ru', 'novosibirsk', 'center', 82.89, 54.99, 'zoom', '17', 'routeTab', 'rsType', 'bus', 'to', 82.89, 54.99, 'Новосибирск, Ватутина, 16'] ), ( config.aut['local'] + u'/base.html', -33.44449709158904, -70.6516680121422, 18, ['2gis.cl', 'santiago', 'center', -70.65, -33.44, 'zoom', '18', 'routeTab', 'rsType', 'bus', 'to', -70.65, -33.44, 'Santiago, Avenida Libertador Bernardo O\'Higgins, 1112'] ) ]) def firm_route_to(self, url, lat, lng, zoom, parts): """ Проверка ссылки на проехать до 1.Открываем калаут фирмы 2.Проверяем атирибут ссылки "Проехать сюда" """ self.driver.get(url) self.page.map.wait_init() self.page.console(scripts.SetScripts.pan_to(lat, lng)) self.page.console(scripts.SetScripts.set_zoom(zoom)) self.page.map.center_click() self.page.build_callout.wait_present() self.page.build_callout.open_firm_by_index(1) route = self.page.firm_callout.route_link self.assertTrue(misc.check_route(route.get_attribute('href'), parts)) @dataprovider([( config.aut['local'] + u'/base.html', 54.980678320392336, 82.89860486984254, 141265770417218 ) ]) def firm_photo_test(self, url, lat, lng, firm_id): """ Проверка наличия фото у фирмы 1.Открыть фирму с фото 2.Проверить наличие ссылки 3.Проверить url ссылки 4.Проверить количество фото """ self._open_firm(url, lat, lng, firm_id) photo = self.page.firm_callout.photo self.assertTrue(photo.is_displayed()) f = FirmData(firm_id) num = misc.to_int(photo.text) self.assertEqual(f.photo_count(), num) link = links.photo_link(firm_id) self.assertEqual(link, photo.get_attribute('href')) @dataprovider([( config.aut['local'] + u'/base.html', 54.980678320392336, 82.89860486984254, 141265771060872 ) ]) def firm_rating_test(self, url, lat, lng, firm_id): """ Проверка наличия рейтинга у фирмы 1.Открыть фирму с рейтингом 2.Проверить наличие рейтинга 3.Проверить url ссылки 4.Проверить количество отзывов """ self._open_firm(url, lat, lng, firm_id) stars = self.page.firm_callout.stars reviews = self.page.firm_callout.reviews f = FirmData(firm_id) self.assertTrue(stars.is_displayed()) self.assertEqual(reviews.get_attribute('href'), links.reviews_link(firm_id)) reviews_count = misc.to_int(reviews.text) self.assertEqual(reviews_count, f.review_count) @dataprovider([( config.aut['local'] + u'/base.html', 54.97883, 82.872775, 141265769707278 ) ]) def firm_address_test(self, url, lat, lng, firm_id): """ Проверка наличия адреса 1.Открыть фирму 2.Проверить наличие адреса 3.Проверить адрес """ self._open_firm(url, lat, lng, firm_id) f = FirmData(firm_id) self.assertTrue(self.page.firm_callout.address.is_displayed()) self.assertEqual(self.page.firm_callout.address.text, f.address_name) @dataprovider([( config.aut['local'] + u'/base.html', 54.980678320392336, 82.89860486984254, 141265771060872 ) ]) def firm_address_comment_test(self, url, lat, lng, firm_id): """ Проверка наличия комментария к адресу 1.Открыть фирму с комментарием 2.Праверить наличие комментария """ self._open_firm(url, lat, lng, firm_id) f = FirmData(firm_id) self.assertTrue(self.page.firm_callout.address.is_displayed()) full_adress = misc.address_and_comment(f.address_name, f.address_comment) self.assertEqual(self.page.firm_callout.address.text, full_adress) @dataprovider([( config.aut['local'] + u'/base.html', 54.980678320392336, 82.89860486984254, 141265771060872 ), ( config.aut['local'] + u'/base.html', 54.9810307939813, 82.87442207336427, 141265769728580 ) ]) def firm_telephone_count_test(self, url, lat, lng, firm_id): """ Проверка наличия и количества телефонов 1.Открывем фирму 2.Получаем количество телефонов (из API) 3.Проверяем количество телефонов """ self._open_firm(url, lat, lng, firm_id) f = FirmData(firm_id) phones_wapi = f.get_phones() phones_num = len(phones_wapi) phones_callout = self.page.firm_callout.phones() self.assertEqual(phones_num, len(phones_callout)) @dataprovider([( config.aut['local'] + u'/base.html', 54.980678320392336, 82.89860486984254, 141265771060872 ) ]) def firm_telephone_comment_test(self, url, lat, lng, firm_id): """ Проверка наличия комментария к телефону 1.Открываем фирму 2.Проверяем наличия комментария к телефону """ self._open_firm(url, lat, lng, firm_id) f = FirmData(firm_id) phones_wapi = f.get_phones() phones_callout = self.page.firm_callout.phones() phone_and_comment = misc.phone_and_comment(phones_wapi[0]['text'], phones_wapi[0]['comment']) self.assertEqual(phones_callout[0].text, phone_and_comment) @dataprovider([( config.aut['local'] + u'/base.html', 54.980678320392336, 82.89860486984254, 141265770417218 ), ( config.aut['local'] + u'/base.html', 54.980678320392336, 82.89860486984254, 141265770847007 ) ]) def firm_website_count_test(self, url, lat, lng, firm_id): """ Проверка наличия ссылки на вебсайт 1.Открываем фирму 2.Проверяем наличие ссылки на вебсайт 3.Проверяем количество ссылок """ self._open_firm(url, lat, lng, firm_id) f = FirmData(firm_id) websites_wapi = f.get_websites() websites_callout = self.page.firm_callout.websites() self.assertEqual(len(websites_callout), len(websites_wapi)) self.assertEqual(websites_callout[0].text, websites_wapi[0]['text']) @dataprovider([( config.aut['local'] + u'/base.html', 54.980678320392336, 82.89860486984254, 141265771881838 )]) def firm_email_test(self, url, lat, lng, firm_id): """ Проверка наличия email 1.Открываем фирму 2.Проверяем наличие email 3.Проверяем ссыль на мейл """ self._open_firm(url, lat, lng, firm_id) f = FirmData(firm_id) email = self.page.firm_callout.email self.assertEqual(email.text, f.get_emails()[0]['text']) self.assertEqual(email.get_attribute('href'), "mailto:%s" % f.get_emails()[0]['value']) # для простого, списка и таблицы def firm_schedule(self): """ Проверка наличия расписания 1.Открываем фирму 2.Проверяем наличие расписания 3.Проверяем наличие подсказки """ pass def firm_schedule_wrapper_list(self): """ Проверка расписания-списка 1.Открываем фирму 2.Проверяем расписание на сегодня (для всех языков) 3.Кликаем в врапер 4.Проверяем наличие списка 5.Отсутсвие посдсказки на сегодня """ pass def firm_schedule_wrapper_table(self): """ Проверка расписания-таблицы 1.Открываем фирму 2.Проверяем расписание на сегодня (для всех языков) 3.Кликаем в врапер 4.Проверяем наличие таблицы 5.Отсутсвие посдсказки на сегодня """ pass @dataprovider([( config.aut['local'] + u'/base.html', 54.980678320392336, 82.89860486984254, 141265771060872 ) ]) def firm_rubrics_test(self, url, lat, lng, firm_id): """ Проверка рубрик 1.Открываем фирму 2.Проверяем количество рубрик 3.Проверяем порядок(первая, последняя, в сеередине с учетом primary) """ self._open_firm(url, lat, lng, firm_id) f = FirmData(firm_id) primary = self.page.firm_callout.primary_rubrics self.assertEqual(primary[0].text, f.get_rubrics_primary()[0]['name']) primary_last = len(f.get_rubrics_primary()) - 1 self.assertEqual(primary[primary_last].text, f.get_rubrics_primary()[primary_last]['name']) additional = self.page.firm_callout.additional_rubrics self.assertEqual(additional[0].text, f.get_rubrics_additional()[0]['name']) additional_last = len(f.get_rubrics_additional()) - 1 self.assertEqual(additional[additional_last].text, f.get_rubrics_additional()[additional_last]['name']) @dataprovider([( config.aut['local'] + u'/base.html', 54.980678320392336, 82.89860486984254, 141265771060872 ) ]) def firm_scroll_bar_test(self, url, lat, lng, firm_id): """ Проверка наличия скролл-бара 1.Открываем фирму со скроллбаром 2.Проверяем его наличия """ self._open_firm(url, lat, lng, firm_id) self.assertTrue(self.page.firm_callout.scroll.is_displayed()) def _open_firm(self, url, lat, lng, firm_id): self.driver.get(url) self.page.map.wait_init() self.page.console(scripts.SetScripts.pan_to(lat, lng)) self.page.console(scripts.SetScripts.set_zoom(17)) self.page.map.center_click() self.page.build_callout.wait_present() self.page.build_callout.open_firm_list() self.page.build_callout.open_firm_by_id(firm_id) ================================================ FILE: functional-tests/tests/geo_clicker_test.py ================================================ # -*- coding: utf-8 -*- from classes.mapsapi_base_test import MapsAPIBaseTest from config import config from lode_runner.dataprovider import dataprovider from classes.util.scripts import SetScripts from classes.util.scripts import GetScripts from classes.WAPI.dataWorker import GeoData from classes.WAPI.dataWorker import FirmData from classes.WAPI.dataWorker import GalleryData class GeoClicker(MapsAPIBaseTest): """ Тесты геокликера. В данных тестах проверяется открытие нужных колаутов в соответствии с координатами и зумом. Кроме того для описания переводов используются словари с ключами языков. """ not_found = { 'ru': u"Это место мы ещё не успели изучить", 'en': u"We haven't collected info about this place yet", 'cs': u"O tomto místě zatím nemáme informace", 'es': u"Todavía no hemos recopilado la información sobre este lugar", 'it': u"Non disponiamo ancora di informazioni su questo posto" } city = { 'ru': u"Город", 'en': u"City", 'cs': u"Město", 'es': u"Ciudad", 'it': u"Сittà" } district = { 'ru': u"Район", 'en': u"District", 'cs': u"Městská část", 'es': u"Comuna", 'it': u"Municipalità" } street = { 'ru': u"Улица", 'en': u"Street", 'cs': u"Ulice", 'es': u"Calle", 'it': u"Via" } @dataprovider([ (config.aut['local'] + u'/base.html', 54.98, 82.32) ]) def callout_unknown_place_test(self, url, lat, lng): """ :param url: Адрес страницы :param lat: Широта :param lng: Долгота Тест на проверку колаута неизвестного места. 1.Перемещаемся к координатам 2.Кликаем в центр 3.Проверяем открытие калаута 4.Проверяем содержимое колаута для всех языков """ self.driver.get(url) self.page.map.wait_init() self.driver.execute_script(SetScripts.pan_to(lat, lng)) self.page.map.center_click() self.page.unkown_place.wait_present() self.assertTrue(self.page.unkown_place.is_visible) for lang in self.not_found: self.driver.execute_script(SetScripts.set_lang(lang)) header = self.page.unkown_place.header self.assertEqual(self.not_found[lang], header) @dataprovider([ config.aut['local'] + u'/base.html' ]) def callout_city_place_test(self, url): """ :param url: Адрес страницы Тест на проверку колаута города. 1.Изменяем изначальный зум к 8 2.Кликаем в центр 3.Проверяем открытие калаута 4.Проверяем название города 5.Проверяем информацию о геообъекте на всех языках """ self.driver.get(url) self.page.map.wait_init() self.driver.execute_script(SetScripts.set_zoom(8)) center = self.driver.execute_script(GetScripts.getCenter) g = GeoData(center, 8) self.page.map.center_click() self.page.place_callout.wait_present() self.assertEqual(self.page.place_callout.header, g.city_name) for lang in self.city: self.driver.execute_script(SetScripts.set_lang(lang)) purpose = self.page.place_callout.purpose self.assertEqual(self.city[lang], purpose) @dataprovider([ config.aut['local'] + u'/base.html' ]) def callout_district_place_test(self, url): """ :param url: Адрес страницы Тест на проверку колаута района. 1.Кликаем в центр 2.Проверяем открытие калаута 3.Проверяем название района 4.Проверяем адрес района 5.Проверяем информацию о геообъекте на всех языках """ self.driver.get(url) self.page.map.wait_init() center = self.driver.execute_script(GetScripts.getCenter) self.page.map.center_click() self.page.addresed_place_callout.wait_present() zoom = self.driver.execute_script(GetScripts.getZoom) g = GeoData(center, zoom) district_addr = g.place_address callout_addr = self.page.addresed_place_callout.drilldown self.assertEqual(self.page.addresed_place_callout.header, g.district_name) self.assertEqual(callout_addr, district_addr) for lang in self.district: self.driver.execute_script(SetScripts.set_lang(lang)) purpose = self.page.addresed_place_callout.purpose self.assertEqual(self.district[lang], purpose) @dataprovider([ (config.aut['local'] + u'/base.html', 54.9802611969944, 82.89837956428528) ]) def callout_building_name_test(self, url, lat, lng): """ :param url: Адрес страницы :param lat: Широта :param lng: Долгота Проверка здания с названием. 1.Перемещаемся к координатам 2.Изменяем изначальный зум к 18 3.Кликаем в центр 4.Проверяем наличие названия в заголовке """ self.driver.get(url) self.page.map.wait_init() self.driver.execute_script(SetScripts.pan_to(lat, lng)) self.driver.execute_script(SetScripts.set_zoom(18)) self.page.map.center_click() center = self.driver.execute_script(GetScripts.getCenter) self.page.build_callout.wait_present() g = GeoData(center, 18) self.assertEqual(g.build_name, self.page.build_callout.header) @dataprovider([ (config.aut['local'] + u'/base.html', 54.98511556781472, 82.85259425640108) ]) def callout_building_without_name_test(self, url, lat, lng): """ :param url: Адрес страницы :param lat: Широта :param lng: Долгота Проверка здания без названия. 1.Перемещаемся к координатам 2.Изменяем изначальный зум к 18 3.Кликаем в центр 4.Проверяем наличие адреса в заголовке """ self.driver.get(url) self.page.map.wait_init() self.page.console(SetScripts.set_zoom(18)) self.page.console(SetScripts.pan_to(lat, lng)) self.page.map.center_click() center = self.page.console(GetScripts.getCenter) g = GeoData(center, 18) self.page.build_callout.wait_present() self.assertEqual(g.build_name, self.page.build_callout.header) @dataprovider([ (config.aut['local'] + u'/base.html', 54.98127706190138, 82.88240969181062) ]) def callout_attraction_test(self, url, lat, lng): """ :param url: Адрес страницы :param lat: Широта :param lng: Долгота Проверка калаута достопремичательности. 1.Перемещаемся к координатам 2.Изменяем изначальный зум к 18 3.Кликаем в центр 4.Проверяем наличие калаута 6.Проверяем заголовок калаута """ self.driver.get(url) self.page.map.wait_init() self.page.console(SetScripts.pan_to(lat, lng)) self.page.console(SetScripts.set_zoom(18)) self.page.map.center_click() self.page.attraction_callout.wait_present() center = self.page.console(GetScripts.getCenter) g = GeoData(center, 18) self.assertTrue(self.page.attraction_callout.is_visible) self.assertEqual(g.attraction_name, self.page.attraction_callout.header) @dataprovider([ (config.aut['local'] + u'/base.html', 54.9833825909448, 82.89679169654848) ]) def callout_street_test(self, url, lat, lng): """ :param url: Адрес страницы :param lat: Широта :param lng: Долгота Проверка калаута улицы. 1.Перемещаемся к координатам 2.Изменяем изначальный зум к 18 3.Кликаем в центр 4.Проверяем наличие калаута 5.Проверяем название улицы 6.Проверяем расположение улицы 7.Проверяем информацию о геообъекте на всех языках """ self.driver.get(url) self.page.map.wait_init() self.page.console(SetScripts.pan_to(lat, lng)) self.page.console(SetScripts.set_zoom(18)) self.page.map.center_click() center = self.page.console(GetScripts.getCenter) g = GeoData(center, 18) self.page.addresed_place_callout.wait_present() self.assertTrue(self.page.addresed_place_callout.is_visible) self.assertEqual(g.street_name, self.page.addresed_place_callout.header) self.assertEqual(self.page.addresed_place_callout.drilldown, g.street_address) for lang in self.street: self.page.console(SetScripts.set_lang(lang)) self.assertEqual(self.page.addresed_place_callout.purpose, self.street[lang]) @dataprovider([ (config.aut['local'] + u'/base.html', '54.986870015252265', '82.8704744636') ]) def callout_attraction_text_test(self, url, lat, lng): """ :param url: Адрес страницы :param lat: Широта :param lng: Долгота Проверка калаута памятника с текстом. 1.Перемещаемся к координатам 2.Изменяем изначальный зум к 18 3.Кликаем в центр 4.Проверяем наличие калаута 6.Проверяем заголовок калаута 7.Проверяем наличие враппера 8.Проверяем текст 9.Кликаем во враппер 10.Проверяем отсутствие враппера """ self.driver.get(url) self.page.map.wait_init() self.page.console(SetScripts.set_zoom(18)) self.page.console(SetScripts.pan_to(lat, lng)) self.page.map.center_click() self.page.attraction_callout_wrapped.wait_present() center = self.page.console(GetScripts.getCenter) g = GeoData(center, 18) self.assertTrue(self.page.attraction_callout_wrapped.is_visible) self.assertEqual(g.attraction_name, self.page.attraction_callout.header) self.assertTrue(self.page.attraction_callout_wrapped.wrapper()) self.assertEqual(g.attraction_description, self.page.attraction_callout_wrapped.text) self.page.attraction_callout_wrapped.unwrap() self.assertFalse(self.page.attraction_callout_wrapped.wrapper()) @dataprovider([ (config.aut['local'] + u'/base.html', '54.98088611087379', '82.89719912975313', 141265770417218) ]) def callout_poi_test(self, url, lat, lng, firm_id): """ :param url: Адрес страницы :param lat: Широта :param lng: Долгота :param firm_id: Проверка калаута POI. 1.Перемещаемся к координатам 2.Изменяем изначальный зум к 18 3.Кликаем в центр 4.Проверяем наличие калаута 6.Проверяем заголовок калаута """ self.driver.get(url) self.page.map.wait_init() self.page.console(SetScripts.set_zoom(18)) self.page.console(SetScripts.pan_to(lat, lng)) self.page.map.center_click() self.page.firm_callout.wait_present() f = FirmData(firm_id) self.assertEqual(self.page.firm_callout.header, f.firm_name) @dataprovider([ (config.aut['local'] + u'/base.html', '-33.44692090822703', '-70.65750718116762', 14215121979385186) ]) def callout_poi_gallery_test(self, url, lat, lng, firm_id): """ :param url: Адрес страницы :param lat: Широта :param lng: Долгота :param firm_id: Проверка калаута памятника с текстом. 1.Перемещаемся к координатам 2.Изменяем изначальный зум к 18 3.Кликаем в центр 4.Проверяем наличие калаута 6.Проверяем заголовок калаута """ self.driver.get(url) self.page.map.wait_init() self.page.console(SetScripts.pan_to(lat, lng)) self.page.console(SetScripts.set_zoom(19)) self.page.map.center_click() self.page.build_callout.wait_present() g = GalleryData(firm_id) self.assertEqual(self.page.build_callout.header, g.gallery_name) ================================================ FILE: functional-tests/tests/loader_test.py ================================================ # -*- coding: utf-8 -*- from classes.mapsapi_base_test import MapsAPIBaseTest from config import config from lode_runner.dataprovider import dataprovider from classes.util.scripts import SetScripts class LoaderTest(MapsAPIBaseTest): """ Тесты параметров лоадера mapsapi """ @dataprovider([ (config.aut['local'] + u'/lazyLoad.html') ]) def loader_dg_then_add_app_test(self, url): """ :param url: Адрес страницы Тест на проверку ленивой загрузки 1.Открываем страницу 2.Проверяем отсутсвие скрипта 3.Выполняем DG.then 4.Проверяем наличие скрипта """ self.driver.get(url) self.assertTrue(not self.page.sources.app_js_present) self.driver.execute_script(SetScripts.dg_then()) self.assertTrue(self.page.sources.app_js_present) @dataprovider([ (config.aut['local'] + u'/notLazyLoad.html') ]) def loader_lazy_false_add_app_test(self, url): """ :param url: Адрес страницы Тест на проверку ленивой загрузки 1.Открываем страницу 4.Проверяем наличие скрипта """ self.driver.get(url) self.assertTrue(self.page.sources.app_js_present) ================================================ FILE: functional-tests/tests/marker_test.py ================================================ # -*- coding: utf-8 -*- from classes.mapsapi_base_test import MapsAPIBaseTest from config import config from lode_runner.dataprovider import dataprovider from classes.util.scripts import SetScripts from classes.util.scripts import GetScripts class Marker(MapsAPIBaseTest): @dataprovider([ config.aut['local'] + u'/demo.html' ]) def marker_to_balloon_test(self, url): """ :param url: Адрес страницы Проверка появления балуна при клике в маркер 1.Кликаем в контрол закрытия балуна 2.Кликаем в маркер 3.Проверяем наличие балуна """ self.driver.get(url) self.page.map.wait_init() self.page.balloon_crossed.wait_present() self.page.balloon_crossed.close() self.page.marker.wait_present() self.page.marker.click() self.page.balloon_crossed.wait_present() self.assertTrue(self.page.balloon_crossed.is_visible) @dataprovider([ config.aut['local'] + u'/draggableMarker.html' ]) def marker_drag_test(self, url): """ :param url: Адрес страницы Проверка изменения координат маркера 1.Драгаем маркер на 10px вниз и вправо 2.Проверяем значение абзацев с координатами """ self.driver.get(url) self.page.map.wait_init() self.page.marker.drag_marker(10, 10) lat = self.page.marker.get_lat() lng = self.page.marker.get_lng() self.assertEqual(lat, '54.981') self.assertEqual(lng, '82.891') @dataprovider([ config.aut['local'] + u'/markerLabels.html' ]) def marker_static_label_test(self, url): """ :param url: Адрес страницы Проверка наличия статического лэйбла у маркера 1.Проверяем наличие лейбла у маркера """ self.driver.get(url) self.page.map.wait_init() self.assertEqual(self.page.marker.get_labels()[0].text, u'static') @dataprovider([ config.aut['local'] + u'/markerLabels.html' ]) def marker_dynamic_label_test(self, url): """ :param url: Адрес страницы Проверка наличия стандартного лейбла у маркера 1.Наводим мышь на маркер 2.Проверяем наличие лейбла """ self.driver.get(url) self.page.map.wait_init() self.page.marker.hover_marker(1) text = self.page.marker.get_labels()[1].text self.assertEqual(text, u'default') @dataprovider([ config.aut['local'] + u'/demo.html' ]) def marker_program_open_test(self, url): """ :param url: Адрес страницы Проверка возможности програмного открытия маркеров 1.Закрываем колаут 2.Открываем его программно """ self.driver.get(url) self.page.map.wait_init() self.page.balloon_crossed.close() self.page.console(SetScripts.open_marker()) self.assertTrue(self.page.balloon_crossed.is_visible) @dataprovider([ config.aut['local'] + u'/groupMarkerEvent.html' ]) def marker_group_events_test(self, url): """ :param url: Адрес страницы Проверка обработки событиев у маркеров 1.Кликаем в маркер 3 2.Проверяем изменение координат карты """ self.driver.get(url) self.page.map.wait_init() self.page.marker.click(2) center = self.page.console(GetScripts.getCenter) lat = '%.3f' % center['lat'] lng = '%.3f' % center['lng'] self.assertEqual(lat, self.page.marker.get_lat('marker3')) self.assertEqual(lng, self.page.marker.get_lng('marker3')) @dataprovider([ config.aut['local'] + u'/groupMarkerEvent.html' ]) def marker_group_bounds_test(self, url): """ :param url: Адрес страницы Проверка подстройки границ под положение маркеров 1.Выставляем большой зум 2.Выполняем fitBounds по маркерам 2.Проверяем изменение координат карты и зума """ self.driver.get(url) self.page.map.wait_init() self.page.map.set_zoom(17) self.page.console('map.fitBounds(group.getBounds())') center = self.page.console(GetScripts.getCenter) lat = '%.3f' % center['lat'] lng = '%.3f' % center['lng'] self.assertEqual(lat, '54.914') self.assertEqual(lng, '82.976') ================================================ FILE: functional-tests/tests/ruler_test.py ================================================ # -*- coding: utf-8 -*- from classes.mapsapi_base_test import MapsAPIBaseTest from config import config from lode_runner.dataprovider import dataprovider from classes.util import scripts class Ruler(MapsAPIBaseTest): """ Тесты на линейку """ def ruler_control(self): """ Проверка контрола линеки 1.Кликаем в контрол линейки 2.Кликаем в центр карты 3.Проверяем наличие вершин линейки 4.Кликаем в контрол линейки 5.Проверяем отсутсвие вершин линейки """ pass def ruler_two_vertexes(self): """ Проверка появления ребер линейки 1.Кликаем в контрол 2.Кликаем в центр карты 3.Кликаем левее на 150px 4.Проверяем наличие 2х вершин 5.Проверяем расстояние 5.Проверяем наличие ребра """ pass def ruler_vertex_in_middle(self): """ Проверка добаления не крайних вершин 1.Кликаем в контрол линейки 2.Кликаем в центр карты 3.Кликаем на 300px левее 4.Кликаем на 150px правее 5.Проверяем наличие 3х вершин 6.Проверяем что узел добавился в середину """ pass def ruler_vertex_in_end(self): """ Проверка добаления точки в конце 1.Кликаем в контрол линейки 2.Кликаем в центр карты 3.Кликаем на 150px левее 4.Кликаем на 150px левее 5.Проверяем наличие 3х вершин 6.Проверяем что узел добавился в конец """ pass def ruler_hover_vertex(self): """ Проверка ховера не полседнего узла 1.Кликаем в контрол линейки 2.Кликаем в центр карты 3.Кликаем на 150px левее 4.Кликаем на 150px левее 5.Перемещаем курсор на 150px правее 6.Проверяем появление маркера 7.Проверяем расстояние 8.Перемещаем на 150px правее 9.Провяем наличие маркера 10.Проверяем расстояние на 0 """ pass def ruler_hover_line(self): """ Проверка ховера линии 1.Кликаем в контрол линейки 2.Кликаем в центр карты 3.Кликаем на 300px левее 4.Перемещаем на 150px правее 5.Проверяем наличе маркера """ pass def ruler_delete_last(self): """ Проверка удаления единственного узла 1.Кликаем в контрол линейки 2.Кликаем в центр карты 3.Ховерим узел 4.Кликаем в крест в маркере 5.Проверяем отсутствие узлов """ pass def ruler_delete_first_in_two(self): """ Проверка удаления первого в случае двух узлов 1.Кликаем в контрол линейки 2.Кликаем в центр карты 3.Кликам на 150px левее 4.Удаляем первый узел 5.Проверяем что остался только один узел 6.Проверяем что узел остался на месте 2го 7.Проверяем наличие маркера и значение в '0м' """ pass def ruler_delete_last_in_two(self): """ Проверка удаления первого в случае двух узлов 1.Кликаем в контрол линейки 2.Кликаем в центр карты 3.Кликам на 150px левее 4.Удаляем второй узел 5.Проверяем что остался только один узел 6.Проверяем что узел остался на месте 1го 7.Проверяем наличие маркера и значение в '0м' """ pass def ruler_delete_last_in_many(self): """ Проверка удаления последнего (3 и более узла) 1.Кликам в контрол линейки 2.Кликаем в центр карты 3.Кликам на 150px левее 4.Кликам на 150px левее 5.Удаляем последний 6.Проверяем что маркер появился на втором """ pass def ruler_delete_first_in_many(self): """ Проверка удаления первого (3 и более узла) 1.Кликам в контрол линейки 2.Кликаем в центр карты 3.Кликам на 150px левее 4.Кликам на 150px левее 5.Удаляем первый 6.Ховерим второй 7.Проверяем маркер и '0м' """ pass def ruler_delete_middle_in_many(self): """ Проверка удаления среднего 1.Кликаем в контрол линейки 2.Кликаем в центр карты 3.Кликаем на 150px левее и 150px выше 4.Кликаем на 150px левее и 150px ниже 5.Удаляем второй узел 6.Проверяем что вершины 2 7.Проверяем что ребро 1 8.Проверяем расстояние в маркере последней вершины """ pass def ruler_drag_last(self): """ Проверка драга последнего 1.Кликам в контрол линейки 2.Кликаем в центр карты 3.Кликам на 150px левее 4.Кликам на 150px левее 5.Перемещаем последний узел на 100px 6.Проверяем что переместился нужный узел 7.Проверяем значения расстояния в последнем маркере """ pass def ruler_drag_first(self): """ Проверка драга первого 1.Кликам в контрол линейки 2.Кликаем в центр карты 3.Кликам на 150px левее 4.Кликам на 150px левее 5.Перемещаем первий узел на 100px 6.Проверяем что переместился нужный узел 7.Проверяем значения расстояния в последнем 8.Проверяем значение расстояния в первом на 0 """ pass def ruler_drag_middle(self): """ Проверка драга среднего 1.Кликам в контрол линейки 2.Кликаем в центр карты 3.Кликам на 150px левее 4.Кликам на 150px левее 5.Перемещаем средний узел на 100px вверх 6.Проверяем что переместился нужный узел 7.Проверяем значения расстояния """ pass ================================================ FILE: functional-tests/tests/zoom_test.py ================================================ # -*- coding: utf-8 -*- from classes.mapsapi_base_test import MapsAPIBaseTest from config import config from lode_runner.dataprovider import dataprovider from classes.util.scripts import GetScripts class Zoom(MapsAPIBaseTest): @dataprovider([ config.aut['local'] + u'/base.html' ]) def zoomIn_click_test(self, url): """ :param url: Адрес страницы Проверка контрола зума +. 1.Получаем зум страницы 2.Кликаем в контрол + 3.Проверяем что зум стал на единицу больше """ self.driver.get(url) self.page.map.wait_init() zoom_start = self.page.console(GetScripts.getZoom) self.page.zoom_control_in.zoom_in_click() zoom_end = self.page.console(GetScripts.getZoom) self.assertEqual(zoom_end - zoom_start, 1) @dataprovider([ config.aut['local'] + u'/base.html' ]) def zoomOut_click_test(self, url): """ :param url: Адрес страницы Проерка контрола зума -. 1.Получаем зум страницы 2.Кликаем в контрол - 3.Проверяем что зум стал на единицу меньше """ self.driver.get(url) self.page.map.wait_init() zoom_start = self.page.console(GetScripts.getZoom) self.page.zoom_control_out.zoom_out_click() zoom_end = self.page.console(GetScripts.getZoom) self.assertEqual(zoom_end - zoom_start, -1) @dataprovider([ config.aut['local'] + u'/base.html' ]) def zoomIn_dbclick_test(self, url): """ :param url: Адрес страницы Проверка зума даблкликом. 1.Получаем зум страницы 2.Кликаем в контрол - 3.Проверяем что зум стал на единицу меньше """ self.driver.get(url) self.page.map.wait_init() zoom_start = self.page.console(GetScripts.getZoom) self.page.map.center_dbclick() zoom_end = self.page.console(GetScripts.getZoom) self.assertEqual(zoom_end - zoom_start, 1) @dataprovider([ config.aut['local'] + u'/base.html' ]) def zoomIn_shift_select_test(self, url): """ :param url: Адрес страницы Проверка зума селектом с shift. 1.Получаем зум страницы 2.Выделяем облость с зажатым shift и отпускаем 3.Проверяем изменение зума """ self.driver.get(url) self.page.map.wait_init() zoom_start = self.page.console(GetScripts.getZoom) self.page.map.zoom_selection() zoom_end = self.page.console(GetScripts.getZoom) self.assertEqual(zoom_end - zoom_start, 1) ================================================ FILE: gulp/deps/build.html ================================================ Maps API 2.0 Build Helper

Maps API 2.0 Build Helper

Select All | Deselect All

Building local Maps API 2.0 using Node and Gulp

  1. Download and install Node
  2. Run this in the command line:
    npm install -g gulp
    npm install
  3. Run this command inside the app directory:

Get URL of custom build Maps API 2.0:

  1. URL:
================================================ FILE: gulp/deps/deps.js ================================================ var deps = { DGCore: { desc: 'Main module', src: [ '../vendors/polyfills/es5.js', '../vendors/polyfills/promise.js', 'DGCore/src/DGCore.js', 'DGCore/src/DGthen.js', 'DGCore/src/DGplugin.js' ], less: { all: [ '../node_modules/leaflet/dist/leaflet.css', 'DGCore/skin/basic/less/dg-core.less' ] }, heading: '2GIS modules' }, DGAjax: { desc: '2GIS Ajax module', src: ['DGAjax/src/DGAjax.js'], deps: ['DGCore'] }, DGLabel: { desc: '2GIS Label module', src: [ 'DGLabel/src/DGLabel.js', 'DGLabel/src/Marker.DGLabel.js', 'DGLabel/src/Path.DGLabel.js', 'DGLabel/src/Entrance.DGLabel.js' ], less: { all: ['DGLabel/skin/{skin}/less/dg-label.less'] }, deps: ['DGCore', 'DGEntrance'] }, DGWkt: { desc: 'WKT parser module', src: [ 'DGWkt/DGWkt.js' ], deps: ['DGCore'] }, DGPopup: { desc: '2GIS Popup module', src: [ 'DGPopup/skin/basic/skin.config.js', 'DGPopup/src/DGPopup.js' ], less: { all: [ 'DGPopup/skin/{skin}/less/leaflet.less', '../vendors/baron/baron.css', 'DGPopup/skin/{skin}/less/scroller.less', 'DGPopup/skin/{skin}/less/dg-popup.less' ], ie: [ 'DGPopup/skin/{skin}/less/leaflet.ie.less', 'DGPopup/skin/{skin}/less/dg-popup.ie.less' ] }, deps: ['DGCore'] }, DGCustomization: { desc: 'LeafLet customization module', src: [ 'DGCustomization/skin/basic/skin.config.js', 'DGCustomization/src/DGCustomization.js', 'DGCustomization/src/DGMap.js', 'DGCustomization/src/DGMap.BaseLayer.js', 'DGCustomization/src/DGMap.ApiKeyValidator.js', 'DGCustomization/src/DGMap.TilesCheck.js', 'DGCustomization/src/DGMap.Drag.js', 'DGCustomization/src/DGPolyUtil.js', 'DGCustomization/src/DGMobileImprove.js' ], less: { all: [ 'DGCustomization/skin/{skin}/less/leaflet.less', '../vendors/baron/baron.css', 'DGCustomization/skin/{skin}/less/scroller.less', 'DGCustomization/skin/{skin}/less/dg-customization.less' ], ie: [ 'DGCustomization/skin/{skin}/less/leaflet.ie.less', 'DGCustomization/skin/{skin}/less/dg-customization.ie.less' ] }, deps: ['DGCore', 'DGLocale', 'DGRoundControl', 'DGProjectDetector', 'DGMuseum'] }, DGZoomControl: { desc: '2GIS zoom control module', src: [ 'DGZoomControl/src/DGZoomControl.js', 'DGZoomControl/lang/ru.js', 'DGZoomControl/lang/it.js', 'DGZoomControl/lang/cs.js', 'DGZoomControl/lang/en.js', 'DGZoomControl/lang/es.js', 'DGZoomControl/lang/ar.js' ], less: { all: [ 'DGZoomControl/skin/{skin}/less/dg-zoom-control.less' ] }, deps: ['DGCore', 'DGLocale', 'DGRoundControl'] }, DGAttribution: { desc: '2GIS copyright', src: [ 'DGAttribution/src/DGAttribution.js', 'DGAttribution/lang/ru.js', 'DGAttribution/lang/it.js', 'DGAttribution/lang/cs.js', 'DGAttribution/lang/en.js', 'DGAttribution/lang/es.js', 'DGAttribution/lang/ar.js' ], less: { all: [ 'DGAttribution/skin/{skin}/less/dg-mapcopyright.less' ] }, deps: ['DGCore', 'DGDust', 'DGLocale'] }, DGLocale: { desc: 'Localization module', src: [ 'DGLocale/src/DGDictionary.js', 'DGLocale/src/DGLocale.js' ], deps: ['DGCore', 'DGProjectDetector'] }, DGLocation: { desc: 'Location control module', src: [ 'DGLocation/src/DGLocation.js', 'DGLocation/lang/ru.js', 'DGLocation/lang/it.js', 'DGLocation/lang/cs.js', 'DGLocation/lang/en.js', 'DGLocation/lang/es.js', 'DGLocation/lang/ar.js' ], less: { all: [ 'DGLocation/skin/{skin}/less/dg-location.less', 'DGLocation/skin/{skin}/less/dg-control-round.less' ] }, deps: ['DGCore', 'DGLocale', 'DGLabel', 'DGRoundControl'] }, DGFullScreen: { desc: 'Full screen module', src: [ 'DGFullScreen/src/DGScreenfull.js', 'DGFullScreen/src/DGFullScreen.js', 'DGFullScreen/lang/ru.js', 'DGFullScreen/lang/it.js', 'DGFullScreen/lang/cs.js', 'DGFullScreen/lang/en.js', 'DGFullScreen/lang/es.js', 'DGFullScreen/lang/ar.js' ], less: { all: [ 'DGFullScreen/skin/{skin}/less/dg-fullscreen.less', 'DGFullScreen/skin/{skin}/less/dg-control-round.less' ], ie: ['DGFullScreen/skin/{skin}/less/dg-fullscreen.ie.less'] }, deps: ['DGCore', 'DGLocale', 'DGRoundControl'] }, DGProjectDetector: { desc: '2GIS project detector module', src: ['DGProjectDetector/src/DGProjectDetector.js'], deps: ['DGCore', 'DGWkt'] }, DGMeta: { desc: '2GIS additional metalayers support', src: [ 'DGMeta/src/DGMeta.Layer.js', 'DGMeta/src/DGMeta.Origin.js' ], deps: ['DGAjax', 'DGCore', 'DGCustomization', 'DGWkt', 'DGProjectDetector'] }, DGPoi: { desc: '2GIS POI module', src: ['DGPoi/src/DGPoi.js'], deps: ['DGMeta', 'DGLabel'] }, DGGeoclicker: { desc: '2GIS Geoclicker', less: { all: [ 'DGGeoclicker/skin/{skin}/less/dg-building-callout.less', 'DGGeoclicker/skin/{skin}/less/dg-map-geoclicker.less', 'DGGeoclicker/skin/{skin}/less/dg-preloader.less', 'DGGeoclicker/skin/{skin}/less/dg-popup.less', 'DGGeoclicker/skin/{skin}/less/dg-firm-card.less', 'DGGeoclicker/skin/{skin}/less/dg-schedule.less', 'DGGeoclicker/skin/{skin}/less/dg-link.less' ], ie: [ 'DGGeoclicker/skin/{skin}/less/dg-popup.ie.less', 'DGGeoclicker/skin/{skin}/less/dg-schedule.ie.less' ] }, src: [ 'DGGeoclicker/src/DGGeoclicker.js', 'DGGeoclicker/src/ClampHelper.js', 'DGGeoclicker/src/provider/Provider.js', 'DGGeoclicker/src/provider/CatalogApi.js', 'DGGeoclicker/src/handler/Handler.js', 'DGGeoclicker/src/handler/Default.js', 'DGGeoclicker/src/handler/ApiError.js', 'DGGeoclicker/src/handler/CityArea.js', 'DGGeoclicker/src/handler/House.js', 'DGGeoclicker/src/handler/House.View.js', 'DGGeoclicker/src/handler/POI.js', 'DGGeoclicker/src/handler/Sight.js', 'DGGeoclicker/src/View.js', 'DGGeoclicker/src/Controller.js', 'DGGeoclicker/lang/it.js', 'DGGeoclicker/lang/ru.js', 'DGGeoclicker/lang/en.js', 'DGGeoclicker/lang/cs.js', 'DGGeoclicker/lang/es.js', '../vendors/firmcard/src/FirmCard.js', '../vendors/firmcard/src/FirmCard.DataHelper.js', '../vendors/firmcard/src/FirmList.js', '../vendors/firmcard/src/Schedule.js', '../vendors/firmcard/src/Dictionary.js' ], deps: ['DGAjax', 'DGCore', 'DGDust', 'DGLocale', 'DGPoi', 'DGEntrance', 'DGProjectDetector', 'DGPopup'] }, DGDust: { desc: '2GIS Template', src: [ 'DGDust/src/DGDust.js' ], deps: ['DGCore'] }, DGEntrance: { desc: '2GIS Entrances', src: [ 'DGEntrance/src/DGMetric.js', 'DGEntrance/src/DGVertexTransform.js', 'DGEntrance/src/DGArrowPathTransform.js', 'DGEntrance/src/DGArrowTipTransform.js', 'DGEntrance/src/DGComplexPath.js', 'DGEntrance/src/DGRenderer.js', 'DGEntrance/src/DGBezierCurves.js', 'DGEntrance/src/DGAnimation.js', 'DGEntrance/src/DGEntrance.js', 'DGEntrance/src/DGEntranceArrow.js', 'DGEntrance/src/DGEntranceArrowShape.js' ], deps: ['DGCore', 'DGWkt', 'DGProjectDetector'] }, DGRoundControl: { desc: 'Control helper', src: ['DGRoundControl/src/DGRoundControl.js'], less: { all: ['DGRoundControl/skin/{skin}/less/dg-control-round.less'] }, deps: ['DGCore', 'DGLocale'] }, DGTraffic: { desc: 'Traffic', src: [ 'DGTraffic/src/DGTraffic.js', 'DGTraffic/lang/ru.js', 'DGTraffic/lang/it.js', 'DGTraffic/lang/cs.js', 'DGTraffic/lang/es.js', 'DGTraffic/lang/en.js', 'DGTraffic/lang/ar.js' ], deps: ['DGMeta', 'DGLabel', 'DGLocale'] }, DGTrafficControl: { desc: 'Traffic control module', src: [ 'DGTrafficControl/src/Control.Traffic.js', 'DGTrafficControl/lang/ru.js', 'DGTrafficControl/lang/it.js', 'DGTrafficControl/lang/cs.js', 'DGTrafficControl/lang/es.js', 'DGTrafficControl/lang/en.js', 'DGTrafficControl/lang/ar.js' ], less: { all: [ 'DGTrafficControl/skin/{skin}/less/dg-control-round.less', 'DGTrafficControl/skin/{skin}/less/dg-traffic-control.less' ], ie: ['DGTrafficControl/skin/{skin}/less/dg-traffic-control.ie.less'] }, deps: ['DGTraffic', 'DGRoundControl'] }, DGRuler: { desc: 'Ruler module', src: [ 'DGRuler/src/Ruler.js', 'DGRuler/src/LayeredMarker.js', 'DGRuler/src/GeometryStyles.js', 'DGRuler/lang/ru.js', 'DGRuler/lang/it.js', 'DGRuler/lang/cs.js', 'DGRuler/lang/es.js', 'DGRuler/lang/en.js', 'DGRuler/lang/ar.js' ], less: { all: ['DGRuler/skin/{skin}/less/dg-ruler.less'], ie: ['DGRuler/skin/{skin}/less/dg-ruler.ie.less'] }, deps: ['DGCore', 'DGLocale'] }, DGRulerControl: { desc: 'Ruler control module', src: [ 'DGRulerControl/src/Control.Ruler.js', 'DGRulerControl/lang/ru.js', 'DGRulerControl/lang/it.js', 'DGRulerControl/lang/cs.js', 'DGRulerControl/lang/es.js', 'DGRulerControl/lang/en.js', 'DGRulerControl/lang/ar.js' ], less: { all: ['DGRulerControl/skin/{skin}/less/dg-control-round.less'] }, deps: ['DGRuler', 'DGRoundControl'] }, DGMuseum: { desc: 'Museum module', src: [ 'DGMuseum/src/DGMuseum.js' ], less: { all: ['DGMuseum/skin/{skin}/less/dg-museum.less'] } } }; if (typeof module !== 'undefined' && module.exports) { module.exports = deps; } ================================================ FILE: gulp/deps/index.js ================================================ var fs = require('fs'); var glob = require('glob'); var path = require('path'); var imageSize = require('image-size'); var init = function(config) { var packages = config.packages; // Generates a list of modules by pkg function getModulesList(pkg, modules, isLeaflet) { //(String|Null)->Array modules = modules || config.source.deps; var modulesListOrig = []; var modulesListRes = []; var loadedModules = {}; if (typeof pkg === 'boolean') { throw new Error('pkg param can\'t be empty'); } // Package name with no empty modules list on packs.js (example: 'base') if (pkg && pkg in packages && packages[pkg].modules.length > 0) { modulesListOrig = packages[pkg].modules; // Modules list (example: 'Core,JSONP,TileLayer') } else if (pkg && pkg.indexOf(',') !== -1) { modulesListOrig = pkg.split(','); // Modules single (example: 'Core') } else if (pkg && pkg in modules) { modulesListOrig.push(pkg); // Others (null / full package) } else { modulesListOrig = modulesListOrig.concat(Object.keys(modules)); } if (!isLeaflet) { modulesListOrig = modulesListOrig.concat(config.coreModules); } function processModule(name) { var module = modules[name]; if (module && module.deps) { module.deps.forEach(processModule); } if (!loadedModules[name]) { modulesListRes.push(name); loadedModules[name] = true; } } modulesListOrig.forEach(processModule); return modulesListRes; } function getJSFiles(options) { options = options || {}; var source = config[options.source || 'source']; var modules = source.deps; var sourcePath = source.path; var isLeaflet = options.source === 'leaflet'; return getModulesList(options.pkg, modules, isLeaflet) .map(function(name) { return modules[name]; }) .map(function(module) { return module.src; }) .reduce(function(array, items) { return array.concat(items); }) .filter(function(item, index, list) { //filter dublicates return list.indexOf(item) == index; }) .map(function(file) { return sourcePath + file; }); } function getCSSFiles(options) { options = options || {}; var source = config[options.source || 'source']; var modules = source.deps; var sourcePath = source.path; var skin = options.skin || config.appConfig.defaultSkin; return getModulesList(options.pkg, modules) .map(function(name) { return modules[name]; }) .map(function(module) { return module[options.type || 'less']; }) .filter(Boolean) .reduce(function(array, item) { var items = []; if (!options.excludeBaseCss && item.all) { items.push(item.all); } if (options.ie8 && item.ie) { items.push(item.ie); } return array.concat(items); }, []) .reduce(function(array, items) { return array.concat(items); }, []) .reduce(function(array, item) { // if css have skin, we add basic theme if (item.indexOf('{skin}') !== -1) { array.push(item.replace('{skin}', 'basic')); } return array.concat(item); }, []) .map(function(file) { // add selected theme return file.replace('{skin}', skin); }) .map(function(file) { return sourcePath + file; }) .filter(fs.existsSync); } function getImgGlob(options) { options = options || {}; var source = config[options.source || 'source']; var modules = source.deps; return getModulesList(options.pkg, modules) .map(function(name) { return 'src/' + name + '/**/img/**/*.{png,gif,jpg,jpeg,svg}'; }); } // Build string with Less variables and imports function lessHeader(options) { options = options || {}; var header = ''; if (options.variables) { Object.keys(options.variables).forEach(function(varableName) { header = header + '\n' + '@' + varableName + ': ' + options.variables[varableName] + ';'; }); } var importsBase = ''; if (typeof options.importsBase === 'string' && options.importsBase.length) { importsBase = options.importsBase.replace(/\/*$/, '/'); } if (options.imports) { for (var i = 0, type = '', imoportPath = ''; i < options.imports.length; i++) { type = options.imports[i].replace(/^.*\:/, ''); imoportPath = options.imports[i].replace(/\:.*$/, ''); header = header + '\n' + '@import (' + type + ') \'' + importsBase + imoportPath + '\';'; } } return header; } // Scans the project for skins directories to get skins names function getSkinsList() { var skinsDirectories = glob.sync(__dirname + '/../../src/**/skin/*'); var skins = []; skinsDirectories.forEach(function(directory) { var skinName = path.basename(directory); if (skins.indexOf(skinName) === -1) { skins.push(skinName); } }); return skins; } // Gets images per skin formats statistics function getImagesFilesStats(skins) { skins = skins || getSkinsList(); var perSkinStats = {}; var imgModulesGlobs = getImgGlob(); imgModulesGlobs.forEach(function(imgGlob) { glob.sync(imgGlob).forEach(function(imagePath) { var skinName = imagePath.split('/')[3]; var extname = path.extname(imagePath); var name = path.basename(imagePath, extname); var imageDimensions; if (skins.indexOf(skinName) === -1) { return; // continue } if (!(skinName in perSkinStats)) { perSkinStats[skinName] = {}; } if (!(name in perSkinStats[skinName])) { perSkinStats[skinName][name] = {}; } if (extname === '.svg') { perSkinStats[skinName][name].hasVectorVersion = true; } else { perSkinStats[skinName][name].extension = extname.replace('.', ''); imageDimensions = imageSize(imagePath); perSkinStats[skinName][name].width = imageDimensions.width; perSkinStats[skinName][name].height = imageDimensions.height; } }); }); return perSkinStats; } // Analyzes Less, gets images usage statistics per skin function getImagesUsageStats(skins) { skins = skins || getSkinsList(); var perSkinStats = {}; skins.forEach(function(skinName) { var stats = {}; var statsFilePath = __dirname + '/../tmp/less/images-usage-statistics.' + skinName + '.less'; var statsFileContent = fs.readFileSync(statsFilePath).toString(); var preparedStatsFileContent = statsFileContent.slice(6).replace(/\;/g, ','); // 6 is 'stats '.length var rawStats = Function('return ' + preparedStatsFileContent + ';')(); stats.repeatable = rawStats.repeatable.split(','); stats.notRepeatableSprited = rawStats.notRepeatableSprited.split(','); stats.notRepeatableNotSprited = rawStats.notRepeatableNotSprited.split(','); // Repeatable images can be used as no-repeatable images, // so we should exclude repeatable images from no-repeatable images list stats.notRepeatableSprited = rawStats.notRepeatableSprited.split(',').filter(function(name) { return stats.repeatable.indexOf(name) === -1; }); perSkinStats[skinName] = stats; }); return perSkinStats; } return { getModulesList: getModulesList, getJSFiles: getJSFiles, getCSSFiles: getCSSFiles, lessHeader: lessHeader, getSkinsList: getSkinsList, getImagesFilesStats: getImagesFilesStats, getImagesUsageStats: getImagesUsageStats, getImgGlob: getImgGlob }; }; if (typeof module !== 'undefined' && module.exports) { module.exports = init; } ================================================ FILE: gulp/deps/packs.js ================================================ var packages = { basic: { name: 'Basic package', desc: 'Provides basic functionality: map, markers, popups, geometries', modules: ['DGCustomization', 'DGFullScreen', 'DGAttribution', 'DGAjax', 'DGPopup', 'DGZoomControl'] }, full: { name: 'Full package', desc: 'Complete package. Includes all the features of 2GIS Maps API', modules: [] } }; if (typeof module !== 'undefined' && module.exports) { module.exports = packages; } ================================================ FILE: gulp/sprite-template.mustache ================================================ {{#items}} .spriteData('{{name}}') { @backgroundImage: '{{{escaped_image}}}'; @backgroundPosition: {{px.offset_x}} {{px.offset_y}}; @backgroundPositionLeft: {{px.offset_x}}; @backgroundPositionTop: {{px.offset_y}}; @width: {{px.width}}; @height: {{px.height}}; @totalWidth: {{px.total_width}}; @totalHeight: {{px.total_height}}; } .isSprited(@name) when (@name = '{{name}}') { @isSprited: true; } {{/items}} ================================================ FILE: gulp/tasks/build.js ================================================ var { buildEnd } = require('../util/buildEnd.js'); var config = require('../../app/config.js'); var argv = require('minimist')(process.argv.slice(2)); var gulp = require('gulp'); var { clean } = require('./clean'); var { buildStyles } = require('./buildStyles'); var { buildScripts } = require('./buildScripts'); var { doc } = require('./doc'); var { loader } = require('./loader'); var { copyAssets } = require('./copyAssets'); var { copyIndexPage } = require('./copyIndexPage'); function npmConfigModify(done) { if (argv.npm) { // Disable local config for npm builds config.appConfig = config.mainConfig; // Make npm builds https-only config.appConfig.protocol = 'https:'; } done(); } exports.build = gulp.series(npmConfigModify, clean, buildStyles, gulp.parallel( buildScripts, doc, loader, copyAssets, copyIndexPage ), buildEnd); ================================================ FILE: gulp/tasks/buildLeaflet.js ================================================ var concat = require('gulp-concat'); var gulp = require('gulp'); var log = require('fancy-log'); var argv = require('minimist')(process.argv.slice(2)); var path = require('path'); var config = require('../../app/config.js'); var deps = require('../deps')(config); function getLeafletFiles(compsBase32) { var memo = {}, deps = require('leaflet/build/deps.js').deps, comps; if (compsBase32) { comps = parseInt(compsBase32, 32).toString(2).split(''); log('Managing dependencies...'); } function addFiles(srcs) { for (var j = 0, len = srcs.length; j < len; j++) { memo[srcs[j]] = true; } } for (var i in deps) { if (comps) { if (parseInt(comps.pop(), 2) === 1) { log(' * ' + i); addFiles(deps[i].src); } else { log(' ' + i); } } else { addFiles(deps[i].src); } } log('\n'); var files = []; for (var src in memo) { files.push('src/' + src); } return files; } // leaflet-custom-build parameter for set id of leaflet build. See more in leaflet/build/build.html exports.buildLeaflet = function buildLeaflet() { var leafletCustomBuild = argv['leaflet-custom-build']; return (leafletCustomBuild ? gulp.src(getLeafletFiles(leafletCustomBuild).map(function (file) { return path.resolve(path.join(__dirname, '../../node_modules/leaflet/', file)) })) : gulp.src(deps.getJSFiles({source: 'leaflet'}))) .pipe(concat('leaflet-src.js')) .pipe(gulp.dest('node_modules/leaflet/dist/')); }; ================================================ FILE: gulp/tasks/buildScripts.js ================================================ var config = require('../../app/config.js'); var stat = require('../util/stat'); var source = require('vinyl-source-stream'); var derequire = require('gulp-derequire'); var browserify = require('browserify'); var buffer = require('vinyl-buffer'); var uglify = require('gulp-uglify'); var header = require('gulp-header'); var mergeStream = require('merge-stream'); var gulpif = require('gulp-if'); var argv = require('minimist')(process.argv.slice(2)); var gulp = require('gulp'); var path = require('path'); var map = require('map-stream'); var insert = require('gulp-insert'); var sourcemaps = require('gulp-sourcemaps'); var { concatScripts } = require('./concatScripts'); function buildScripts() { var isCustom = argv.pkg || argv.skin; var packages; if (global.isTestBuild) { packages = ['full']; } else if (isCustom) { packages = [argv.pkg || 'full']; } else { packages = Object.keys(config.packages); } return mergeStream(packages.map(function(pkg) { var name = 'script.' + (!isCustom ? pkg + '.' : '') + 'js'; var src = path.join('gulp', 'tmp', 'js', name); var bundler = browserify(src, { debug: !argv.release, entry: true, standalone: argv.npm ? 'DG': false, cache: {}, packageCache: {}, sourceMaps: argv.release }); bundler.transform('browserify-css', { autoInject: true, minify: true }); return bundler.bundle() .pipe(source(name)) .pipe(buffer()) .pipe(derequire()) .pipe(gulpif(argv.release, sourcemaps.init())) .pipe(gulpif(argv.release, uglify())) .pipe(gulpif(argv.release, header(config.copyright))) .pipe(gulpif( Boolean(argv['leaflet-custom-build']), insert.prepend('// leaflet-custom-build: ' + argv['leaflet-custom-build'] + '\n') )) .pipe(gulpif(argv.release, sourcemaps.write('./'))) .pipe(map(stat.save)) .pipe(gulp.dest('dist/js/')); })); } exports.buildScripts = gulp.series(concatScripts, buildScripts); ================================================ FILE: gulp/tasks/buildStyles.js ================================================ var gulp = require('gulp'); var { destCSS } = require('../util/destCSS'); var { collectImagesStats } = require('./collectImagesStats'); var { generateSprites } = require('./generateSprites'); var { imageMinify } = require('./imageMinify'); exports.buildStyles = gulp.series(gulp.parallel( collectImagesStats, generateSprites, imageMinify ), destCSS); ================================================ FILE: gulp/tasks/buildTest.js ================================================ var gulp = require('gulp'); var { buildEnd } = require('../util/buildEnd.js'); var { buildStyles } = require('./buildStyles'); var { buildScripts } = require('./buildScripts'); var { doc } = require('./doc'); var { clean } = require('./clean'); var { loader } = require('./loader'); var { copyAssets } = require('./copyAssets'); var { copyIndexPage } = require('./copyIndexPage'); function enableTestBuild(done) { global.isTestBuild = true; done(); } exports.buildTest = gulp.series(enableTestBuild, clean, gulp.parallel( buildScripts, buildStyles, doc, loader, copyAssets, copyIndexPage ), buildEnd); ================================================ FILE: gulp/tasks/clean.js ================================================ var del = require('del'); exports.clean = function clean() { return del(['dist', 'gulp/tmp']); }; ================================================ FILE: gulp/tasks/collectImagesStats.js ================================================ var gulp = require('gulp'); var fs = require('fs'); var mkdirp = require('mkdirp'); var config = require('../../app/config'); var deps = require('../deps')(config); var { copyImg } = require('./copyImg'); function collectImagesStats(cb) { var skins = deps.getSkinsList(); var imagesStatsPerSkin = deps.getImagesFilesStats(skins); mkdirp.sync('./gulp/tmp'); mkdirp.sync('./gulp/tmp/less'); skins.forEach(function(skinName) { var skinImagesFilesStats = imagesStatsPerSkin[skinName]; var statisticsObject; var statisticsString = ''; var imageExtension; var originalImageName; var originalImageStatisticObject; for (var imageName in skinImagesFilesStats) { originalImageName = imageName.replace(/@\d+(\.\d+)?x/, ''); statisticsObject = skinImagesFilesStats[imageName]; originalImageStatisticObject = skinImagesFilesStats[originalImageName]; imageExtension = (typeof statisticsObject.extension === 'undefined') ? 'svg' : statisticsObject.extension; statisticsString += '.imageData(\'' + imageName + '\') { ' + '@filename: \'' + imageName + '\'; ' + '@extension: \'' + imageExtension + '\'; ' + '@hasVectorVersion: ' + !!statisticsObject.hasVectorVersion + '; ' + '@width: ' + statisticsObject.width + 'px; ' + '@height: ' + statisticsObject.height + 'px; ' + '@originalWidth: ' + originalImageStatisticObject.width + 'px; ' + '@originalHeight: ' + originalImageStatisticObject.height + 'px; ' + '}\n'; } fs.writeFileSync('./gulp/tmp/less/images-files-statistics.' + skinName + '.less', statisticsString); }); cb(); } exports.collectImagesStats = gulp.series(copyImg, collectImagesStats); ================================================ FILE: gulp/tasks/collectImagesUsageStats.js ================================================ var header = require('gulp-header'); var rename = require('gulp-rename'); var mergeStream = require('merge-stream'); var less = require('gulp-less'); var gulp = require('gulp'); var path = require('path'); var glob = require('glob'); var error = require('../util/error'); var config = require('../../app/config'); var deps = require('../deps')(config); exports.collectImagesUsageStats = function collectImagesUsageStats() { var skins = deps.getSkinsList(); var imagesBasePath = path.resolve(__dirname + '/../../dist/img'); var statisticsStreams = skins.map(function(skinName) { var skinLessFiles = glob.sync('./src/**/' + skinName + '/less/*.less'); skinLessFiles.unshift('./src/less/mixins.images-usage-statistics.less'); skinLessFiles.unshift('./src/less/mixins.ie8.less'); skinLessFiles = skinLessFiles.map(function(lessFilePath) { return lessFilePath + ':reference'; }); return gulp.src('src/less/images-usage-statistics.less') .pipe(error.handle()) .pipe(header(deps.lessHeader({ variables: { baseURL: '\'__BASE_URL__\'', spritesURL: '\'__BASE_URL__\'', ie8: true, useSprites: true, mobile: false, retina: false, skinName: skinName, imagesBasePath: '\'' + imagesBasePath + '\'' }, imports: skinLessFiles }))) .pipe(less()) .pipe(rename('images-usage-statistics.' + skinName + '.less')) .pipe(gulp.dest('gulp/tmp/less/')); }); return mergeStream(statisticsStreams); }; ================================================ FILE: gulp/tasks/concatScripts.js ================================================ var sourcemaps = require('gulp-sourcemaps'); var streamqueue = require('streamqueue'); var concat = require('gulp-concat'); var footer = require('gulp-footer'); var mergeStream = require('merge-stream'); var gulpif = require('gulp-if'); var argv = require('minimist')(process.argv.slice(2)); var gulp = require('gulp'); var config = require('../../app/config.js'); var deps = require('../deps')(config); var templateStream = require('../util/templateStream'); var projectList = require('../util/projectList'); var error = require('../util/error'); var { loadProjectList } = require('./loadProjectList'); var { buildLeaflet } = require('./buildLeaflet'); function getStyleRequireStatement(pack, skin) { return 'require("../../../dist/css/styles.' + pack + '.' + skin + '.css");'; } function concatScripts() { var isCustom = argv.pkg || argv.skin; var packages; if (global.isTestBuild) { packages = ['full']; } else if (isCustom) { packages = [argv.pkg || 'full']; } else { packages = Object.keys(config.packages); } if (global.isTestBuild) { // Disable tile loading in test build config.appConfig.tileServer = ''; } return mergeStream(packages.map(function(pkg) { var stream = streamqueue( {objectMode: true}, gulp.src(deps.getJSFiles({pkg: pkg}), {base: '.'}), templateStream(pkg) ) .pipe(error.handle()) .pipe(gulpif(!argv.release, sourcemaps.init())) .pipe(concat('script.' + (!isCustom ? pkg + '.' : '') + 'js')) .pipe(footer(projectList.get())) .pipe(footer('DG.config = ' + JSON.stringify(config.appConfig) + ';')); if (argv.npm) { stream = stream.pipe(footer(getStyleRequireStatement(pkg, 'dark'))); } return stream .pipe(gulpif(!argv.release, sourcemaps.write())) .pipe(gulp.dest('gulp/tmp/js')); })); } const projectListTask = argv['project-list'] !== false ? [loadProjectList] : []; exports.concatScripts = gulp.series(gulp.parallel( ...projectListTask, buildLeaflet ), concatScripts); ================================================ FILE: gulp/tasks/copyAssets.js ================================================ var gulp = require('gulp'); var error = require('../util/error'); exports.copyAssets = function copyAssets() { return gulp.src(['assets/**/*']) .pipe(error.handle()) .pipe(gulp.dest('dist')); }; ================================================ FILE: gulp/tasks/copyImg.js ================================================ var rename = require('gulp-rename'); var argv = require('minimist')(process.argv.slice(2)); var gulp = require('gulp'); var error = require('../util/error'); var config = require('../../app/config'); var deps = require('../deps')(config); exports.copyImg = function copyImg() { return gulp.src(deps.getImgGlob(argv)) .pipe(error.handle()) .pipe(rename(function(p) { p.dirname = ''; })) .pipe(gulp.dest('dist/img')); }; ================================================ FILE: gulp/tasks/copyIndexPage.js ================================================ var gulp = require('gulp'); var error = require('../util/error'); exports.copyIndexPage = function copyIndexPage() { return gulp.src(['app/index.html']) .pipe(error.handle()) .pipe(gulp.dest('dist')); }; ================================================ FILE: gulp/tasks/dev.js ================================================ var gulp = require('gulp'); var { build } = require('./build'); var { server } = require('./server'); var { watch } = require('./watch'); exports.dev = gulp.series(build, server, watch); ================================================ FILE: gulp/tasks/doc.js ================================================ var gendoc = require('../util/gendoc'); var config = require('../../app/config'); exports.doc = function doc(done) { var doc = config.doc; gendoc.generateDocumentation(doc.menu, doc.input, doc.output); done(); }; ================================================ FILE: gulp/tasks/generateSprites.js ================================================ var spritesmith = require('gulp.spritesmith'); var mergeStream = require('merge-stream'); var gulp = require('gulp'); var error = require('../util/error'); var config = require('../../app/config'); var deps = require('../deps')(config); var { collectImagesUsageStats } = require('./collectImagesUsageStats'); function generateSprites() { var skins = deps.getSkinsList(); var stats = deps.getImagesUsageStats(skins); var statisticsStreams = skins.map(function(skinName) { // Adds comma to make glob’s {} working properly, // even there is only one should be excluded var filesToExclude = stats[skinName].repeatable.join(',') + ',' + stats[skinName].notRepeatableNotSprited.join(','); var pngList = [ 'src/**/' + skinName + '/img/**/*.png', '!src/**/' + skinName + '/img/**/*@2x.png', '!src/**/' + skinName + '/img/**/{' + filesToExclude + '}.png' ]; var png2xList = [ 'src/**/' + skinName + '/img/**/*@2x.png', '!src/**/' + skinName + '/img/**/{' + filesToExclude + '}@2x.png' ]; var spriteData = gulp.src(pngList) .pipe(error.handle()) .pipe(spritesmith({ cssTemplate: 'gulp/sprite-template.mustache', imgName: 'sprite.' + skinName + '.png', cssName: 'sprite.' + skinName + '.less', engine: 'pixelsmith' })); var spriteData2x = gulp.src(png2xList) .pipe(error.handle()) .pipe(spritesmith({ cssTemplate: 'gulp/sprite-template.mustache', //padding: 1, // генерирует неправильные смещения :( imgName: 'sprite@2x.' + skinName + '.png', cssName: 'sprite@2x.' + skinName + '.less', engine: 'pixelsmith' })); return mergeStream( spriteData.img .pipe(gulp.dest('dist/img/')), spriteData2x.img .pipe(gulp.dest('dist/img/')), spriteData.css .pipe(gulp.dest('gulp/tmp/less/')), spriteData2x.css .pipe(gulp.dest('gulp/tmp/less/')) ); }); return mergeStream(statisticsStreams); } exports.generateSprites = gulp.series(collectImagesUsageStats, generateSprites); ================================================ FILE: gulp/tasks/imageMinify.js ================================================ var imagemin = require('gulp-imagemin'); var argv = require('minimist')(process.argv.slice(2)); var gulpif = require('gulp-if'); var gulp = require('gulp'); var { copyAssets } = require('./copyAssets'); var { copyImg } = require('./copyImg'); var { generateSprites } = require('./generateSprites'); function imageMinify() { return gulp.src('dist/img/**/*.{png,gif,jpg,jpeg}') .pipe(gulpif(argv.release, imagemin())) .pipe(gulp.dest('dist/img')); } exports.imageMinify = gulp.series( gulp.parallel( copyAssets, copyImg, generateSprites ), imageMinify, ); ================================================ FILE: gulp/tasks/lint.js ================================================ var gulp = require('gulp'); var { lintJS } = require('./lintJS'); var { lintCSS } = require('./lintCSS'); exports.lint = gulp.parallel(lintJS, lintCSS); ================================================ FILE: gulp/tasks/lintCSS.js ================================================ var gulp = require('gulp'); var csslint = require('../util/csslint/gulp-csslint'); var error = require('../util/error'); var {buildStyles} = require('./buildStyles'); function lintCSS() { return gulp.src('dist/css/**.css') .pipe(error.handle()) .pipe(csslint({ 'adjoining-classes': false, 'box-model': false, 'box-sizing': false, 'compatible-vendor-prefixes': false, 'empty-rules': false, 'display-property-grouping': false, 'duplicate-background-images': false, 'fallback-colors': false, 'font-sizes': false, 'gradients': false, 'important': false, 'overqualified-elements': false, 'outline-none': false, 'regex-selectors': false, 'vendor-prefix': false, 'unqualified-attributes': false, 'zero-units': false })) .pipe(csslint.reporter()); } exports.lintCSS = gulp.series(buildStyles, lintCSS); ================================================ FILE: gulp/tasks/lintJS.js ================================================ var eslint = require('gulp-eslint'); var gulp = require('gulp'); var error = require('../util/error'); exports.lintJS = function lintJS() { return gulp.src('src/**/src/**/*.js') .pipe(error.handle()) .pipe(eslint()) .pipe(eslint.format()) .pipe(eslint.failAfterError()); }; ================================================ FILE: gulp/tasks/loadProjectList.js ================================================ var request = require('request'); var PluginError = require('plugin-error'); var projectList = require('../util/projectList'); var config = require('../../app/config.js'); var errorNotifier = require('../util/error'); exports.loadProjectList = function loadProjectList(cb) { if (projectList.get()) { return cb(); } var fields = [ 'items.bounds', 'items.zoom_level', 'items.time_zone', 'items.code', 'items.flags', 'items.country_code', 'items.domain' ].join(','); var protocol = config.appConfig.protocol; var apiServer = config.appConfig.webApiServer; var apiVersion = config.appConfig.webApiVersion; var apiKey = config.appConfig.webApiKey; var url = protocol + apiServer + '/' + apiVersion + '/region/list?key=' + apiKey + '&fields=' + fields; request(url, function(err, res, body) { if (err) { var error = new PluginError({ plugin: 'loadProjectList', message: err }); errorNotifier.notify(error); return cb(); } var data = JSON.parse(body); var projects = data.result.items; var projectListString = 'DG.fallbackProjectsList = JSON.parse(\'' + JSON.stringify(projects) + '\');'; projectList.set(projectListString); cb(); }); }; ================================================ FILE: gulp/tasks/loader.js ================================================ var gulp = require('gulp'); var argv = require('minimist')(process.argv.slice(2)); var gulpif = require('gulp-if'); var uglify = require('gulp-uglify'); var replace = require('gulp-replace'); var error = require('../util/error'); var config = require('../../app/config.js'); exports.loader = function loader() { var originalBaseUrl = config.appConfig.protocol + config.appConfig.baseUrl; return gulp.src('app/loader.js') .pipe(error.handle()) .pipe(replace(/__ORIGINAL_BASE_URL__/g, originalBaseUrl)) .pipe(gulpif(argv.release, uglify())) .pipe(gulp.dest('dist')); }; ================================================ FILE: gulp/tasks/rebuildStyles.js ================================================ var { destCSS } = require('../util/destCSS'); exports.rebuildStyles = destCSS; ================================================ FILE: gulp/tasks/server.js ================================================ var spawn = require('child_process').spawn; var nodeServer = null; exports.server = function server(cb) { function start() { nodeServer = spawn('node', ['app'], {stdio: 'inherit'}); cb(); } if (nodeServer) { nodeServer.once('close', start); nodeServer.kill(); } else { start(); } }; process.on('exit', function() { if (nodeServer) { nodeServer.kill(); } }); ================================================ FILE: gulp/tasks/test.js ================================================ var Server = require('karma').Server; var argv = require('minimist')(process.argv.slice(2)); var gulp = require('gulp'); var path = require('path'); var glob = require('glob'); var log = require('fancy-log'); var _ = require('lodash'); var { buildTest } = require('./buildTest'); var test = require('../../test/test'); var excludedTests = require('../../test/excludedTests.js') || []; var isTestDebug = argv.d || argv.debug; var testRequirements = isTestDebug ? [] : [buildTest]; var itemsInChunk = 10; // items in chunk by default function performTest(done) { var cliOptions = _.cloneDeep(argv); var modulesToTest = []; var currentChunk = 0; var sourcesList = [ 'dist/js/script.full.js', 'node_modules/leaflet/spec/after.js', 'node_modules/happen/happen.js', 'node_modules/prosthetic-hand/dist/prosthetic-hand.js', 'node_modules/leaflet/spec/suites/SpecHelper.js', 'node_modules/mock-geolocation/dist/geolocate.js', 'test/after.js' ]; if ('m' in cliOptions) { modulesToTest = cliOptions.m.split(','); } if ('module' in cliOptions) { modulesToTest = cliOptions.module.split(','); } var modulesToTestSourceList = []; if (modulesToTest.length) { modulesToTest.forEach(function(moduleName) { modulesToTestSourceList = modulesToTestSourceList.concat(glob.sync('src/' + moduleName + '/test/*Spec.js')); }); } else { modulesToTestSourceList = modulesToTestSourceList.concat(glob.sync('src/**/test/*Spec.js')); } modulesToTestSourceList = modulesToTestSourceList.concat(glob.sync('node_modules/leaflet/spec/suites/**/*Spec.js')); modulesToTestSourceList = _.difference(modulesToTestSourceList, excludedTests); var splittedModules = _.chunk(modulesToTestSourceList, itemsInChunk); var numberOfChunks = splittedModules.length; log('\nITEMS IN CHUNK: ' + itemsInChunk); log('NUMBER OF CHUNKS: ' + numberOfChunks); // Flag of existing errors. var totalErr = false; // Function will be run recursive, because need execute chunks in order. function startServer(err) { totalErr = err || totalErr; log('\nCHUNK #' + currentChunk.toString()); var localeSourceList = sourcesList.concat(splittedModules[currentChunk]); currentChunk++; localeSourceList.push('node_modules/leaflet/spec/suites/SpecHelper.js'); function localDone(errDone) { totalErr = errDone || totalErr; done(totalErr); } new Server({ files: localeSourceList, configFile: path.join(__dirname, '../../test/karma.conf.js'), browsers: test.getBrowsers(), reporters: test.getReporters(isTestDebug), junitReporter: test.getJunitReporter(), action: 'run', preprocessors: { 'gulp/tmp/testJS/src/**/*.js': ['coverage'] }, singleRun: true // Function localDone will be executed in the last iteration. }, currentChunk === numberOfChunks ? localDone : startServer).start(); } startServer(); } exports.test = gulp.series(...testRequirements, performTest); ================================================ FILE: gulp/tasks/watch.js ================================================ var gulp = require('gulp'); var { doc } = require('./doc'); var { copyAssets } = require('./copyAssets'); var { server } = require('./server'); var { buildScripts } = require('./buildScripts'); var { rebuildStyles } = require('./rebuildStyles'); var { build } = require('./build'); var { loader } = require('./loader'); var { copyIndexPage } = require('./copyIndexPage'); exports.watch = function watch() { gulp.watch('src/doc/**/*.*', doc); gulp.watch('assets/**/*', gulp.series(copyAssets, server)); gulp.watch([ 'src/**/*.js', 'vendors/leaflet/src/**/*.*' ], gulp.series(buildScripts, server)); gulp.watch('src/**/*.less', gulp.series(rebuildStyles, server)); gulp.watch('config.main.json', gulp.series(build, server)); gulp.watch(['app/index.js', 'config.local.json'], server); gulp.watch('app/loader.js', gulp.series(loader, server)); gulp.watch('app/index.html', gulp.series(copyIndexPage, server)); }; ================================================ FILE: gulp/util/buildCSS.js ================================================ var autoprefixer = require('gulp-autoprefixer'); var clean = require('gulp-clean-css'); var remember = require('gulp-remember'); var concat = require('gulp-concat'); var header = require('gulp-header'); var cache = require('gulp-cached'); var gulpif = require('gulp-if'); var less = require('gulp-less'); var argv = require('minimist')(process.argv.slice(2)); var map = require('map-stream'); var gulp = require('gulp'); var path = require('path'); var fs = require('fs'); var config = require('../../app/config.js'); var deps = require('../deps')(config); var stat = require('../util/stat'); var error = require('./error'); exports.buildCSS = function(options) { var imagesBasePath = path.resolve(__dirname + '/../../dist/img'); var baseURL = config.appConfig.protocol + config.appConfig.baseUrl; var lessList = deps.getCSSFiles(options); var lessHeaderImports; if (options.isTest) { lessHeaderImports = [ './src/less/mixins.less:reference', './src/less/mixins.ie8.less:reference' ]; } else { lessHeaderImports = [ './gulp/tmp/less/sprite.basic.less:reference', './gulp/tmp/less/sprite@2x.basic.less:reference', './gulp/tmp/less/sprite.' + options.skin + '.less:reference', './gulp/tmp/less/sprite@2x.' + options.skin + '.less:reference', './gulp/tmp/less/images-files-statistics.basic.less:reference', './gulp/tmp/less/images-files-statistics.' + options.skin + '.less:reference', './src/less/mixins.less:reference', './src/less/mixins.ie8.less:reference' ]; } lessHeaderImports = lessHeaderImports.filter(function(src) { var lessFileSrc = src.split(':')[0]; try { return fs.readFileSync(path.join(__dirname, '../..', lessFileSrc)); } catch (e) { return false; } }); var lessPrerequirements = deps.lessHeader({ variables: { baseURL: "'" + baseURL + "'", skinName: options.skin, ie8: options.ie8, imagesBasePath: "'" + imagesBasePath + "'" }, imports: lessHeaderImports }); return gulp.src(lessList) .pipe(error.handle()) .pipe(cache('css.' + options.suffix)) .pipe(header(lessPrerequirements)) .pipe(less()) .pipe(autoprefixer({browsers: ['last 2 version', 'safari 5', 'ie 8', 'ie 9', 'opera 12.1', 'ios 6', 'android 4']})) .pipe(remember('css.' + options.suffix)) .pipe(concat('styles.' + (options.suffix ? options.suffix + '.' : '') + 'css')) .pipe(gulpif(argv.release, clean())) .pipe(header(config.copyright)) .pipe(map(stat.save)); }; ================================================ FILE: gulp/util/buildEnd.js ================================================ var argv = require('minimist')(process.argv.slice(2)); var log = require('fancy-log'); var stat = require('./stat'); var config = require('../../app/config'); var deps = require('../deps')(config); exports.buildEnd = function buildEnd(done) { log('Build contains the next modules:'); deps.getModulesList(argv.pkg).forEach(function(module) { log('- ' + module); }); if (argv.sprite == 'true') { log('Builded with sprites'); } else if (argv.base64 != 'false' && typeof argv.base64 != 'undefined') { log('Builded with base64 encode'); } log('\nDist files statistic:'); var statValues = stat.get(); Object.keys(statValues).forEach(function(file) { log('- ' + file + ': ' + statValues[file]); }); log('Build successfully complete'); done(); }; ================================================ FILE: gulp/util/csslint/gulp-csslint.js ================================================ var log = require('fancy-log'); var PluginError = require('plugin-error'); var es = require('event-stream'); var fs = require('fs'); var csslint = require('./lib/csslint').CSSLint; var formatOutput = function (report, file, options) { if (!report.messages.length) { return { success: true }; } var filePath = file.path || 'stdin'; // Handle errors var results = report.messages.map(function (err) { if (!err) { return; } return { file: filePath, error: err }; }).filter(function (err) { return err; }); var output = { errorCount: results.length, success: false, results: results, options: options }; return output; }; var cssLintPlugin = function (options) { if (!options) { options = {}; } var ruleset = {}; // Read CSSLint options from a specified csslintrc file. if (typeof options == 'string') { // Don't catch readFile errors, let them bubble up var externalOptions = fs.readFileSync('./' + options); try { options = JSON.parse(externalOptions); } catch(err) { throw new Error('Error parsing csslintrc: ' + err); } } // Build a list of all available rules csslint.getRules().forEach(function (rule) { ruleset[rule.id] = 1; }); for (var rule in options) { if (!options[rule]) { // Remove rules that are turned off delete ruleset[rule]; } else { ruleset[rule] = options[rule]; } } return es.map(function (file, cb) { var report = csslint.verify(String(file.contents), ruleset); // send status down-stream file.csslint = formatOutput(report, file, options); cb(null, file); }); }; var defaultReporter = function (file) { var errorCount = file.csslint.errorCount; var plural = errorCount == 1 ? '' : 's'; log(errorCount + ' error' + plural + ' found in ' + file.path); file.csslint.results.forEach(function (result) { var message = result.error; log('[' + (typeof message.line != 'undefined' ? 'L' + message.line + ':' + 'C' + message.col : 'GENERAL' ) + '] ' + message.message + ' ' + message.rule.desc + ' (' + message.rule.id + ')' ); }); }; cssLintPlugin.reporter = function (customReporter) { var reporter = defaultReporter; if (typeof customReporter == 'function') { reporter = customReporter; } if (typeof reporter == 'undefined') { throw new Error('Invalid reporter'); } return es.map(function (file, cb) { // Only report if CSSLint was ran and errors were found if (file.csslint && !file.csslint.success) { reporter(file); } return cb(null, file); }); }; cssLintPlugin.failReporter = function () { return es.map(function (file, cb) { // Nothing to report or no errors if (!file.csslint || file.csslint.success) { return cb(null, file); } return cb(new PluginError('gulp-csslint', 'CSSLint failed for ' + file.relative), file); }); }; module.exports = cssLintPlugin; ================================================ FILE: gulp/util/csslint/lib/csslint.js ================================================ /*! CSSLint Copyright (c) 2013 Nicole Sullivan and Nicholas C. Zakas. All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* Build: v0.10.0 15-August-2013 01:07:22 */ var parserlib = require("./parserlib"); /** * Main CSSLint object. * @class CSSLint * @static * @extends parserlib.util.EventTarget */ /*global parserlib, Reporter*/ var CSSLint = (function(){ var rules = [], formatters = [], embeddedRuleset = /\/\*csslint([^\*]*)\*\//, api = new parserlib.util.EventTarget(); api.version = "0.10.0"; //------------------------------------------------------------------------- // Rule Management //------------------------------------------------------------------------- /** * Adds a new rule to the engine. * @param {Object} rule The rule to add. * @method addRule */ api.addRule = function(rule){ rules.push(rule); rules[rule.id] = rule; }; /** * Clears all rule from the engine. * @method clearRules */ api.clearRules = function(){ rules = []; }; /** * Returns the rule objects. * @return An array of rule objects. * @method getRules */ api.getRules = function(){ return [].concat(rules).sort(function(a,b){ return a.id > b.id ? 1 : 0; }); }; /** * Returns a ruleset configuration object with all current rules. * @return A ruleset object. * @method getRuleset */ api.getRuleset = function() { var ruleset = {}, i = 0, len = rules.length; while (i < len){ ruleset[rules[i++].id] = 1; //by default, everything is a warning } return ruleset; }; /** * Returns a ruleset object based on embedded rules. * @param {String} text A string of css containing embedded rules. * @param {Object} ruleset A ruleset object to modify. * @return {Object} A ruleset object. * @method getEmbeddedRuleset */ function applyEmbeddedRuleset(text, ruleset){ var valueMap, embedded = text && text.match(embeddedRuleset), rules = embedded && embedded[1]; if (rules) { valueMap = { "true": 2, // true is error "": 1, // blank is warning "false": 0, // false is ignore "2": 2, // explicit error "1": 1, // explicit warning "0": 0 // explicit ignore }; rules.toLowerCase().split(",").forEach(function(rule){ var pair = rule.split(":"), property = pair[0] || "", value = pair[1] || ""; ruleset[property.trim()] = valueMap[value.trim()]; }); } return ruleset; } //------------------------------------------------------------------------- // Formatters //------------------------------------------------------------------------- /** * Adds a new formatter to the engine. * @param {Object} formatter The formatter to add. * @method addFormatter */ api.addFormatter = function(formatter) { // formatters.push(formatter); formatters[formatter.id] = formatter; }; /** * Retrieves a formatter for use. * @param {String} formatId The name of the format to retrieve. * @return {Object} The formatter or undefined. * @method getFormatter */ api.getFormatter = function(formatId){ return formatters[formatId]; }; /** * Formats the results in a particular format for a single file. * @param {Object} result The results returned from CSSLint.verify(). * @param {String} filename The filename for which the results apply. * @param {String} formatId The name of the formatter to use. * @param {Object} options (Optional) for special output handling. * @return {String} A formatted string for the results. * @method format */ api.format = function(results, filename, formatId, options) { var formatter = this.getFormatter(formatId), result = null; if (formatter){ result = formatter.startFormat(); result += formatter.formatResults(results, filename, options || {}); result += formatter.endFormat(); } return result; }; /** * Indicates if the given format is supported. * @param {String} formatId The ID of the format to check. * @return {Boolean} True if the format exists, false if not. * @method hasFormat */ api.hasFormat = function(formatId){ return formatters.hasOwnProperty(formatId); }; //------------------------------------------------------------------------- // Verification //------------------------------------------------------------------------- /** * Starts the verification process for the given CSS text. * @param {String} text The CSS text to verify. * @param {Object} ruleset (Optional) List of rules to apply. If null, then * all rules are used. If a rule has a value of 1 then it's a warning, * a value of 2 means it's an error. * @return {Object} Results of the verification. * @method verify */ api.verify = function(text, ruleset){ var i = 0, len = rules.length, reporter, lines, report, parser = new parserlib.css.Parser({ starHack: true, ieFilters: true, underscoreHack: true, strict: false }); // normalize line endings lines = text.replace(/\n\r?/g, "$split$").split('$split$'); if (!ruleset){ ruleset = this.getRuleset(); } if (embeddedRuleset.test(text)){ ruleset = applyEmbeddedRuleset(text, ruleset); } reporter = new Reporter(lines, ruleset); ruleset.errors = 2; //always report parsing errors as errors for (i in ruleset){ if(ruleset.hasOwnProperty(i) && ruleset[i]){ if (rules[i]){ rules[i].init(parser, reporter); } } } //capture most horrible error type try { parser.parse(text); } catch (ex) { reporter.error("Fatal error, cannot continue: " + ex.message, ex.line, ex.col, {}); } report = { messages : reporter.messages, stats : reporter.stats, ruleset : reporter.ruleset }; //sort by line numbers, rollups at the bottom report.messages.sort(function (a, b){ if (a.rollup && !b.rollup){ return 1; } else if (!a.rollup && b.rollup){ return -1; } else { return a.line - b.line; } }); return report; }; //------------------------------------------------------------------------- // Publish the API //------------------------------------------------------------------------- return api; })(); /*global CSSLint*/ /** * An instance of Report is used to report results of the * verification back to the main API. * @class Reporter * @constructor * @param {String[]} lines The text lines of the source. * @param {Object} ruleset The set of rules to work with, including if * they are errors or warnings. */ function Reporter(lines, ruleset){ /** * List of messages being reported. * @property messages * @type String[] */ this.messages = []; /** * List of statistics being reported. * @property stats * @type String[] */ this.stats = []; /** * Lines of code being reported on. Used to provide contextual information * for messages. * @property lines * @type String[] */ this.lines = lines; /** * Information about the rules. Used to determine whether an issue is an * error or warning. * @property ruleset * @type Object */ this.ruleset = ruleset; } Reporter.prototype = { //restore constructor constructor: Reporter, /** * Report an error. * @param {String} message The message to store. * @param {int} line The line number. * @param {int} col The column number. * @param {Object} rule The rule this message relates to. * @method error */ error: function(message, line, col, rule){ this.messages.push({ type : "error", line : line, col : col, message : message, evidence: this.lines[line-1], rule : rule || {} }); }, /** * Report an warning. * @param {String} message The message to store. * @param {int} line The line number. * @param {int} col The column number. * @param {Object} rule The rule this message relates to. * @method warn * @deprecated Use report instead. */ warn: function(message, line, col, rule){ this.report(message, line, col, rule); }, /** * Report an issue. * @param {String} message The message to store. * @param {int} line The line number. * @param {int} col The column number. * @param {Object} rule The rule this message relates to. * @method report */ report: function(message, line, col, rule){ this.messages.push({ type : this.ruleset[rule.id] == 2 ? "error" : "warning", line : line, col : col, message : message, evidence: this.lines[line-1], rule : rule }); }, /** * Report some informational text. * @param {String} message The message to store. * @param {int} line The line number. * @param {int} col The column number. * @param {Object} rule The rule this message relates to. * @method info */ info: function(message, line, col, rule){ this.messages.push({ type : "info", line : line, col : col, message : message, evidence: this.lines[line-1], rule : rule }); }, /** * Report some rollup error information. * @param {String} message The message to store. * @param {Object} rule The rule this message relates to. * @method rollupError */ rollupError: function(message, rule){ this.messages.push({ type : "error", rollup : true, message : message, rule : rule }); }, /** * Report some rollup warning information. * @param {String} message The message to store. * @param {Object} rule The rule this message relates to. * @method rollupWarn */ rollupWarn: function(message, rule){ this.messages.push({ type : "warning", rollup : true, message : message, rule : rule }); }, /** * Report a statistic. * @param {String} name The name of the stat to store. * @param {Variant} value The value of the stat. * @method stat */ stat: function(name, value){ this.stats[name] = value; } }; //expose for testing purposes CSSLint._Reporter = Reporter; /*global CSSLint*/ /* * Utility functions that make life easier. */ CSSLint.Util = { /* * Adds all properties from supplier onto receiver, * overwriting if the same name already exists on * reciever. * @param {Object} The object to receive the properties. * @param {Object} The object to provide the properties. * @return {Object} The receiver */ mix: function(receiver, supplier){ var prop; for (prop in supplier){ if (supplier.hasOwnProperty(prop)){ receiver[prop] = supplier[prop]; } } return prop; }, /* * Polyfill for array indexOf() method. * @param {Array} values The array to search. * @param {Variant} value The value to search for. * @return {int} The index of the value if found, -1 if not. */ indexOf: function(values, value){ if (values.indexOf){ return values.indexOf(value); } else { for (var i=0, len=values.length; i < len; i++){ if (values[i] === value){ return i; } } return -1; } }, /* * Polyfill for array forEach() method. * @param {Array} values The array to operate on. * @param {Function} func The function to call on each item. * @return {void} */ forEach: function(values, func) { if (values.forEach){ return values.forEach(func); } else { for (var i=0, len=values.length; i < len; i++){ func(values[i], i, values); } } } }; /*global CSSLint*/ /* * Rule: Don't use adjoining classes (.foo.bar). */ CSSLint.addRule({ //rule information id: "adjoining-classes", name: "Disallow adjoining classes", desc: "Don't use adjoining classes.", browsers: "IE6", //initialization init: function(parser, reporter){ var rule = this; parser.addListener("startrule", function(event){ var selectors = event.selectors, selector, part, modifier, classCount, i, j, k; for (i=0; i < selectors.length; i++){ selector = selectors[i]; for (j=0; j < selector.parts.length; j++){ part = selector.parts[j]; if (part.type == parser.SELECTOR_PART_TYPE){ classCount = 0; for (k=0; k < part.modifiers.length; k++){ modifier = part.modifiers[k]; if (modifier.type == "class"){ classCount++; } if (classCount > 1){ reporter.report("Don't use adjoining classes.", part.line, part.col, rule); } } } } } }); } }); /*global CSSLint*/ /* * Rule: Don't use width or height when using padding or border. */ CSSLint.addRule({ //rule information id: "box-model", name: "Beware of broken box size", desc: "Don't use width or height when using padding or border.", browsers: "All", //initialization init: function(parser, reporter){ var rule = this, widthProperties = { border: 1, "border-left": 1, "border-right": 1, padding: 1, "padding-left": 1, "padding-right": 1 }, heightProperties = { border: 1, "border-bottom": 1, "border-top": 1, padding: 1, "padding-bottom": 1, "padding-top": 1 }, properties, boxSizing = false; function startRule(){ properties = {}; boxSizing = false; } function endRule(){ var prop, value; if (!boxSizing) { if (properties.height){ for (prop in heightProperties){ if (heightProperties.hasOwnProperty(prop) && properties[prop]){ value = properties[prop].value; //special case for padding if (!(prop == "padding" && value.parts.length === 2 && value.parts[0].value === 0)){ reporter.report("Using height with " + prop + " can sometimes make elements larger than you expect.", properties[prop].line, properties[prop].col, rule); } } } } if (properties.width){ for (prop in widthProperties){ if (widthProperties.hasOwnProperty(prop) && properties[prop]){ value = properties[prop].value; if (!(prop == "padding" && value.parts.length === 2 && value.parts[1].value === 0)){ reporter.report("Using width with " + prop + " can sometimes make elements larger than you expect.", properties[prop].line, properties[prop].col, rule); } } } } } } parser.addListener("startrule", startRule); parser.addListener("startfontface", startRule); parser.addListener("startpage", startRule); parser.addListener("startpagemargin", startRule); parser.addListener("startkeyframerule", startRule); parser.addListener("property", function(event){ var name = event.property.text.toLowerCase(); if (heightProperties[name] || widthProperties[name]){ if (!/^0\S*$/.test(event.value) && !(name == "border" && event.value == "none")){ properties[name] = { line: event.property.line, col: event.property.col, value: event.value }; } } else { if (/^(width|height)/i.test(name) && /^(length|percentage)/.test(event.value.parts[0].type)){ properties[name] = 1; } else if (name == "box-sizing") { boxSizing = true; } } }); parser.addListener("endrule", endRule); parser.addListener("endfontface", endRule); parser.addListener("endpage", endRule); parser.addListener("endpagemargin", endRule); parser.addListener("endkeyframerule", endRule); } }); /*global CSSLint*/ /* * Rule: box-sizing doesn't work in IE6 and IE7. */ CSSLint.addRule({ //rule information id: "box-sizing", name: "Disallow use of box-sizing", desc: "The box-sizing properties isn't supported in IE6 and IE7.", browsers: "IE6, IE7", tags: ["Compatibility"], //initialization init: function(parser, reporter){ var rule = this; parser.addListener("property", function(event){ var name = event.property.text.toLowerCase(); if (name == "box-sizing"){ reporter.report("The box-sizing property isn't supported in IE6 and IE7.", event.line, event.col, rule); } }); } }); /* * Rule: Use the bulletproof @font-face syntax to avoid 404's in old IE * (http://www.fontspring.com/blog/the-new-bulletproof-font-face-syntax) */ /*global CSSLint*/ CSSLint.addRule({ //rule information id: "bulletproof-font-face", name: "Use the bulletproof @font-face syntax", desc: "Use the bulletproof @font-face syntax to avoid 404's in old IE (http://www.fontspring.com/blog/the-new-bulletproof-font-face-syntax).", browsers: "All", //initialization init: function(parser, reporter){ var rule = this, count = 0, fontFaceRule = false, firstSrc = true, ruleFailed = false, line, col; // Mark the start of a @font-face declaration so we only test properties inside it parser.addListener("startfontface", function(event){ fontFaceRule = true; }); parser.addListener("property", function(event){ // If we aren't inside an @font-face declaration then just return if (!fontFaceRule) { return; } var propertyName = event.property.toString().toLowerCase(), value = event.value.toString(); // Set the line and col numbers for use in the endfontface listener line = event.line; col = event.col; // This is the property that we care about, we can ignore the rest if (propertyName === 'src') { var regex = /^\s?url\(['"].+\.eot\?.*['"]\)\s*format\(['"]embedded-opentype['"]\).*$/i; // We need to handle the advanced syntax with two src properties if (!value.match(regex) && firstSrc) { ruleFailed = true; firstSrc = false; } else if (value.match(regex) && !firstSrc) { ruleFailed = false; } } }); // Back to normal rules that we don't need to test parser.addListener("endfontface", function(event){ fontFaceRule = false; if (ruleFailed) { reporter.report("@font-face declaration doesn't follow the fontspring bulletproof syntax.", line, col, rule); } }); } }); /* * Rule: Include all compatible vendor prefixes to reach a wider * range of users. */ /*global CSSLint*/ CSSLint.addRule({ //rule information id: "compatible-vendor-prefixes", name: "Require compatible vendor prefixes", desc: "Include all compatible vendor prefixes to reach a wider range of users.", browsers: "All", //initialization init: function (parser, reporter) { var rule = this, compatiblePrefixes, properties, prop, variations, prefixed, i, len, inKeyFrame = false, arrayPush = Array.prototype.push, applyTo = []; // See http://peter.sh/experiments/vendor-prefixed-css-property-overview/ for details compatiblePrefixes = { "animation" : "webkit moz", "animation-delay" : "webkit moz", "animation-direction" : "webkit moz", "animation-duration" : "webkit moz", "animation-fill-mode" : "webkit moz", "animation-iteration-count" : "webkit moz", "animation-name" : "webkit moz", "animation-play-state" : "webkit moz", "animation-timing-function" : "webkit moz", "appearance" : "webkit moz", "border-end" : "webkit moz", "border-end-color" : "webkit moz", "border-end-style" : "webkit moz", "border-end-width" : "webkit moz", "border-image" : "webkit moz o", "border-radius" : "webkit", "border-start" : "webkit moz", "border-start-color" : "webkit moz", "border-start-style" : "webkit moz", "border-start-width" : "webkit moz", "box-align" : "webkit moz ms", "box-direction" : "webkit moz ms", "box-flex" : "webkit moz ms", "box-lines" : "webkit ms", "box-ordinal-group" : "webkit moz ms", "box-orient" : "webkit moz ms", "box-pack" : "webkit moz ms", "box-sizing" : "webkit moz", "box-shadow" : "webkit moz", "column-count" : "webkit moz ms", "column-gap" : "webkit moz ms", "column-rule" : "webkit moz ms", "column-rule-color" : "webkit moz ms", "column-rule-style" : "webkit moz ms", "column-rule-width" : "webkit moz ms", "column-width" : "webkit moz ms", "hyphens" : "epub moz", "line-break" : "webkit ms", "margin-end" : "webkit moz", "margin-start" : "webkit moz", "marquee-speed" : "webkit wap", "marquee-style" : "webkit wap", "padding-end" : "webkit moz", "padding-start" : "webkit moz", "tab-size" : "moz o", "text-size-adjust" : "webkit ms", "transform" : "webkit moz ms o", "transform-origin" : "webkit moz ms o", "transition" : "webkit moz o", "transition-delay" : "webkit moz o", "transition-duration" : "webkit moz o", "transition-property" : "webkit moz o", "transition-timing-function" : "webkit moz o", "user-modify" : "webkit moz", "user-select" : "webkit moz ms", "word-break" : "epub ms", "writing-mode" : "epub ms" }; for (prop in compatiblePrefixes) { if (compatiblePrefixes.hasOwnProperty(prop)) { variations = []; prefixed = compatiblePrefixes[prop].split(' '); for (i = 0, len = prefixed.length; i < len; i++) { variations.push('-' + prefixed[i] + '-' + prop); } compatiblePrefixes[prop] = variations; arrayPush.apply(applyTo, variations); } } parser.addListener("startrule", function () { properties = []; }); parser.addListener("startkeyframes", function (event) { inKeyFrame = event.prefix || true; }); parser.addListener("endkeyframes", function (event) { inKeyFrame = false; }); parser.addListener("property", function (event) { var name = event.property; if (CSSLint.Util.indexOf(applyTo, name.text) > -1) { // e.g., -moz-transform is okay to be alone in @-moz-keyframes if (!inKeyFrame || typeof inKeyFrame != "string" || name.text.indexOf("-" + inKeyFrame + "-") !== 0) { properties.push(name); } } }); parser.addListener("endrule", function (event) { if (!properties.length) { return; } var propertyGroups = {}, i, len, name, prop, variations, value, full, actual, item, propertiesSpecified; for (i = 0, len = properties.length; i < len; i++) { name = properties[i]; for (prop in compatiblePrefixes) { if (compatiblePrefixes.hasOwnProperty(prop)) { variations = compatiblePrefixes[prop]; if (CSSLint.Util.indexOf(variations, name.text) > -1) { if (!propertyGroups[prop]) { propertyGroups[prop] = { full : variations.slice(0), actual : [], actualNodes: [] }; } if (CSSLint.Util.indexOf(propertyGroups[prop].actual, name.text) === -1) { propertyGroups[prop].actual.push(name.text); propertyGroups[prop].actualNodes.push(name); } } } } } for (prop in propertyGroups) { if (propertyGroups.hasOwnProperty(prop)) { value = propertyGroups[prop]; full = value.full; actual = value.actual; if (full.length > actual.length) { for (i = 0, len = full.length; i < len; i++) { item = full[i]; if (CSSLint.Util.indexOf(actual, item) === -1) { propertiesSpecified = (actual.length === 1) ? actual[0] : (actual.length == 2) ? actual.join(" and ") : actual.join(", "); reporter.report("The property " + item + " is compatible with " + propertiesSpecified + " and should be included as well.", value.actualNodes[0].line, value.actualNodes[0].col, rule); } } } } } }); } }); /* * Rule: Certain properties don't play well with certain display values. * - float should not be used with inline-block * - height, width, margin-top, margin-bottom, float should not be used with inline * - vertical-align should not be used with block * - margin, float should not be used with table-* */ /*global CSSLint*/ CSSLint.addRule({ //rule information id: "display-property-grouping", name: "Require properties appropriate for display", desc: "Certain properties shouldn't be used with certain display property values.", browsers: "All", //initialization init: function(parser, reporter){ var rule = this; var propertiesToCheck = { display: 1, "float": "none", height: 1, width: 1, margin: 1, "margin-left": 1, "margin-right": 1, "margin-bottom": 1, "margin-top": 1, padding: 1, "padding-left": 1, "padding-right": 1, "padding-bottom": 1, "padding-top": 1, "vertical-align": 1 }, properties; function reportProperty(name, display, msg){ if (properties[name]){ if (typeof propertiesToCheck[name] != "string" || properties[name].value.toLowerCase() != propertiesToCheck[name]){ reporter.report(msg || name + " can't be used with display: " + display + ".", properties[name].line, properties[name].col, rule); } } } function startRule(){ properties = {}; } function endRule(){ var display = properties.display ? properties.display.value : null; if (display){ switch(display){ case "inline": //height, width, margin-top, margin-bottom, float should not be used with inline reportProperty("height", display); reportProperty("width", display); reportProperty("margin", display); reportProperty("margin-top", display); reportProperty("margin-bottom", display); reportProperty("float", display, "display:inline has no effect on floated elements (but may be used to fix the IE6 double-margin bug)."); break; case "block": //vertical-align should not be used with block reportProperty("vertical-align", display); break; case "inline-block": //float should not be used with inline-block reportProperty("float", display); break; default: //margin, float should not be used with table if (display.indexOf("table-") === 0){ reportProperty("margin", display); reportProperty("margin-left", display); reportProperty("margin-right", display); reportProperty("margin-top", display); reportProperty("margin-bottom", display); reportProperty("float", display); } //otherwise do nothing } } } parser.addListener("startrule", startRule); parser.addListener("startfontface", startRule); parser.addListener("startkeyframerule", startRule); parser.addListener("startpagemargin", startRule); parser.addListener("startpage", startRule); parser.addListener("property", function(event){ var name = event.property.text.toLowerCase(); if (propertiesToCheck[name]){ properties[name] = { value: event.value.text, line: event.property.line, col: event.property.col }; } }); parser.addListener("endrule", endRule); parser.addListener("endfontface", endRule); parser.addListener("endkeyframerule", endRule); parser.addListener("endpagemargin", endRule); parser.addListener("endpage", endRule); } }); /* * Rule: Disallow duplicate background-images (using url). */ /*global CSSLint*/ CSSLint.addRule({ //rule information id: "duplicate-background-images", name: "Disallow duplicate background images", desc: "Every background-image should be unique. Use a common class for e.g. sprites.", browsers: "All", //initialization init: function(parser, reporter){ var rule = this, stack = {}; parser.addListener("property", function(event){ var name = event.property.text, value = event.value, i, len; if (name.match(/background/i)) { for (i=0, len=value.parts.length; i < len; i++) { if (value.parts[i].type == 'uri') { if (typeof stack[value.parts[i].uri] === 'undefined') { stack[value.parts[i].uri] = event; } else { reporter.report("Background image '" + value.parts[i].uri + "' was used multiple times, first declared at line " + stack[value.parts[i].uri].line + ", col " + stack[value.parts[i].uri].col + ".", event.line, event.col, rule); } } } } }); } }); /* * Rule: Duplicate properties must appear one after the other. If an already-defined * property appears somewhere else in the rule, then it's likely an error. */ /*global CSSLint*/ CSSLint.addRule({ //rule information id: "duplicate-properties", name: "Disallow duplicate properties", desc: "Duplicate properties must appear one after the other.", browsers: "All", //initialization init: function(parser, reporter){ var rule = this, properties, lastProperty; function startRule(event){ properties = {}; } parser.addListener("startrule", startRule); parser.addListener("startfontface", startRule); parser.addListener("startpage", startRule); parser.addListener("startpagemargin", startRule); parser.addListener("startkeyframerule", startRule); parser.addListener("property", function(event){ var property = event.property, name = property.text.toLowerCase(); if (properties[name] && (lastProperty != name || properties[name] == event.value.text)){ reporter.report("Duplicate property '" + event.property + "' found.", event.line, event.col, rule); } properties[name] = event.value.text; lastProperty = name; }); } }); /* * Rule: Style rules without any properties defined should be removed. */ /*global CSSLint*/ CSSLint.addRule({ //rule information id: "empty-rules", name: "Disallow empty rules", desc: "Rules without any properties specified should be removed.", browsers: "All", //initialization init: function(parser, reporter){ var rule = this, count = 0; parser.addListener("startrule", function(){ count=0; }); parser.addListener("property", function(){ count++; }); parser.addListener("endrule", function(event){ var selectors = event.selectors; if (count === 0){ reporter.report("Rule is empty.", selectors[0].line, selectors[0].col, rule); } }); } }); /* * Rule: There should be no syntax errors. (Duh.) */ /*global CSSLint*/ CSSLint.addRule({ //rule information id: "errors", name: "Parsing Errors", desc: "This rule looks for recoverable syntax errors.", browsers: "All", //initialization init: function(parser, reporter){ var rule = this; parser.addListener("error", function(event){ reporter.error(event.message, event.line, event.col, rule); }); } }); /*global CSSLint*/ CSSLint.addRule({ //rule information id: "fallback-colors", name: "Require fallback colors", desc: "For older browsers that don't support RGBA, HSL, or HSLA, provide a fallback color.", browsers: "IE6,IE7,IE8", //initialization init: function(parser, reporter){ var rule = this, lastProperty, propertiesToCheck = { color: 1, background: 1, "border-color": 1, "border-top-color": 1, "border-right-color": 1, "border-bottom-color": 1, "border-left-color": 1, border: 1, "border-top": 1, "border-right": 1, "border-bottom": 1, "border-left": 1, "background-color": 1 }, properties; function startRule(event){ properties = {}; lastProperty = null; } parser.addListener("startrule", startRule); parser.addListener("startfontface", startRule); parser.addListener("startpage", startRule); parser.addListener("startpagemargin", startRule); parser.addListener("startkeyframerule", startRule); parser.addListener("property", function(event){ var property = event.property, name = property.text.toLowerCase(), parts = event.value.parts, i = 0, colorType = "", len = parts.length; if(propertiesToCheck[name]){ while(i < len){ if (parts[i].type == "color"){ if ("alpha" in parts[i] || "hue" in parts[i]){ if (/([^\)]+)\(/.test(parts[i])){ colorType = RegExp.$1.toUpperCase(); } if (!lastProperty || (lastProperty.property.text.toLowerCase() != name || lastProperty.colorType != "compat")){ reporter.report("Fallback " + name + " (hex or RGB) should precede " + colorType + " " + name + ".", event.line, event.col, rule); } } else { event.colorType = "compat"; } } i++; } } lastProperty = event; }); } }); /* * Rule: You shouldn't use more than 10 floats. If you do, there's probably * room for some abstraction. */ /*global CSSLint*/ CSSLint.addRule({ //rule information id: "floats", name: "Disallow too many floats", desc: "This rule tests if the float property is used too many times", browsers: "All", //initialization init: function(parser, reporter){ var rule = this; var count = 0; //count how many times "float" is used parser.addListener("property", function(event){ if (event.property.text.toLowerCase() == "float" && event.value.text.toLowerCase() != "none"){ count++; } }); //report the results parser.addListener("endstylesheet", function(){ reporter.stat("floats", count); if (count >= 10){ reporter.rollupWarn("Too many floats (" + count + "), you're probably using them for layout. Consider using a grid system instead.", rule); } }); } }); /* * Rule: Avoid too many @font-face declarations in the same stylesheet. */ /*global CSSLint*/ CSSLint.addRule({ //rule information id: "font-faces", name: "Don't use too many web fonts", desc: "Too many different web fonts in the same stylesheet.", browsers: "All", //initialization init: function(parser, reporter){ var rule = this, count = 0; parser.addListener("startfontface", function(){ count++; }); parser.addListener("endstylesheet", function(){ if (count > 5){ reporter.rollupWarn("Too many @font-face declarations (" + count + ").", rule); } }); } }); /* * Rule: You shouldn't need more than 9 font-size declarations. */ /*global CSSLint*/ CSSLint.addRule({ //rule information id: "font-sizes", name: "Disallow too many font sizes", desc: "Checks the number of font-size declarations.", browsers: "All", //initialization init: function(parser, reporter){ var rule = this, count = 0; //check for use of "font-size" parser.addListener("property", function(event){ if (event.property == "font-size"){ count++; } }); //report the results parser.addListener("endstylesheet", function(){ reporter.stat("font-sizes", count); if (count >= 10){ reporter.rollupWarn("Too many font-size declarations (" + count + "), abstraction needed.", rule); } }); } }); /* * Rule: When using a vendor-prefixed gradient, make sure to use them all. */ /*global CSSLint*/ CSSLint.addRule({ //rule information id: "gradients", name: "Require all gradient definitions", desc: "When using a vendor-prefixed gradient, make sure to use them all.", browsers: "All", //initialization init: function(parser, reporter){ var rule = this, gradients; parser.addListener("startrule", function(){ gradients = { moz: 0, webkit: 0, oldWebkit: 0, o: 0 }; }); parser.addListener("property", function(event){ if (/\-(moz|o|webkit)(?:\-(?:linear|radial))\-gradient/i.test(event.value)){ gradients[RegExp.$1] = 1; } else if (/\-webkit\-gradient/i.test(event.value)){ gradients.oldWebkit = 1; } }); parser.addListener("endrule", function(event){ var missing = []; if (!gradients.moz){ missing.push("Firefox 3.6+"); } if (!gradients.webkit){ missing.push("Webkit (Safari 5+, Chrome)"); } if (!gradients.oldWebkit){ missing.push("Old Webkit (Safari 4+, Chrome)"); } if (!gradients.o){ missing.push("Opera 11.1+"); } if (missing.length && missing.length < 4){ reporter.report("Missing vendor-prefixed CSS gradients for " + missing.join(", ") + ".", event.selectors[0].line, event.selectors[0].col, rule); } }); } }); /* * Rule: Don't use IDs for selectors. */ /*global CSSLint*/ CSSLint.addRule({ //rule information id: "ids", name: "Disallow IDs in selectors", desc: "Selectors should not contain IDs.", browsers: "All", //initialization init: function(parser, reporter){ var rule = this; parser.addListener("startrule", function(event){ var selectors = event.selectors, selector, part, modifier, idCount, i, j, k; for (i=0; i < selectors.length; i++){ selector = selectors[i]; idCount = 0; for (j=0; j < selector.parts.length; j++){ part = selector.parts[j]; if (part.type == parser.SELECTOR_PART_TYPE){ for (k=0; k < part.modifiers.length; k++){ modifier = part.modifiers[k]; if (modifier.type == "id"){ idCount++; } } } } if (idCount == 1){ reporter.report("Don't use IDs in selectors.", selector.line, selector.col, rule); } else if (idCount > 1){ reporter.report(idCount + " IDs in the selector, really?", selector.line, selector.col, rule); } } }); } }); /* * Rule: Don't use @import, use instead. */ /*global CSSLint*/ CSSLint.addRule({ //rule information id: "import", name: "Disallow @import", desc: "Don't use @import, use instead.", browsers: "All", //initialization init: function(parser, reporter){ var rule = this; parser.addListener("import", function(event){ reporter.report("@import prevents parallel downloads, use instead.", event.line, event.col, rule); }); } }); /* * Rule: Make sure !important is not overused, this could lead to specificity * war. Display a warning on !important declarations, an error if it's * used more at least 10 times. */ /*global CSSLint*/ CSSLint.addRule({ //rule information id: "important", name: "Disallow !important", desc: "Be careful when using !important declaration", browsers: "All", //initialization init: function(parser, reporter){ var rule = this, count = 0; //warn that important is used and increment the declaration counter parser.addListener("property", function(event){ if (event.important === true){ count++; reporter.report("Use of !important", event.line, event.col, rule); } }); //if there are more than 10, show an error parser.addListener("endstylesheet", function(){ reporter.stat("important", count); if (count >= 10){ reporter.rollupWarn("Too many !important declarations (" + count + "), try to use less than 10 to avoid specificity issues.", rule); } }); } }); /* * Rule: Properties should be known (listed in CSS3 specification) or * be a vendor-prefixed property. */ /*global CSSLint*/ CSSLint.addRule({ //rule information id: "known-properties", name: "Require use of known properties", desc: "Properties should be known (listed in CSS3 specification) or be a vendor-prefixed property.", browsers: "All", //initialization init: function(parser, reporter){ var rule = this; parser.addListener("property", function(event){ var name = event.property.text.toLowerCase(); // the check is handled entirely by the parser-lib (https://github.com/nzakas/parser-lib) if (event.invalid) { reporter.report(event.invalid.message, event.line, event.col, rule); } }); } }); /* * Rule: outline: none or outline: 0 should only be used in a :focus rule * and only if there are other properties in the same rule. */ /*global CSSLint*/ CSSLint.addRule({ //rule information id: "outline-none", name: "Disallow outline: none", desc: "Use of outline: none or outline: 0 should be limited to :focus rules.", browsers: "All", tags: ["Accessibility"], //initialization init: function(parser, reporter){ var rule = this, lastRule; function startRule(event){ if (event.selectors){ lastRule = { line: event.line, col: event.col, selectors: event.selectors, propCount: 0, outline: false }; } else { lastRule = null; } } function endRule(event){ if (lastRule){ if (lastRule.outline){ if (lastRule.selectors.toString().toLowerCase().indexOf(":focus") == -1){ reporter.report("Outlines should only be modified using :focus.", lastRule.line, lastRule.col, rule); } else if (lastRule.propCount == 1) { reporter.report("Outlines shouldn't be hidden unless other visual changes are made.", lastRule.line, lastRule.col, rule); } } } } parser.addListener("startrule", startRule); parser.addListener("startfontface", startRule); parser.addListener("startpage", startRule); parser.addListener("startpagemargin", startRule); parser.addListener("startkeyframerule", startRule); parser.addListener("property", function(event){ var name = event.property.text.toLowerCase(), value = event.value; if (lastRule){ lastRule.propCount++; if (name == "outline" && (value == "none" || value == "0")){ lastRule.outline = true; } } }); parser.addListener("endrule", endRule); parser.addListener("endfontface", endRule); parser.addListener("endpage", endRule); parser.addListener("endpagemargin", endRule); parser.addListener("endkeyframerule", endRule); } }); /* * Rule: Don't use classes or IDs with elements (a.foo or a#foo). */ /*global CSSLint*/ CSSLint.addRule({ //rule information id: "overqualified-elements", name: "Disallow overqualified elements", desc: "Don't use classes or IDs with elements (a.foo or a#foo).", browsers: "All", //initialization init: function(parser, reporter){ var rule = this, classes = {}; parser.addListener("startrule", function(event){ var selectors = event.selectors, selector, part, modifier, i, j, k; for (i=0; i < selectors.length; i++){ selector = selectors[i]; for (j=0; j < selector.parts.length; j++){ part = selector.parts[j]; if (part.type == parser.SELECTOR_PART_TYPE){ for (k=0; k < part.modifiers.length; k++){ modifier = part.modifiers[k]; if (part.elementName && modifier.type == "id"){ reporter.report("Element (" + part + ") is overqualified, just use " + modifier + " without element name.", part.line, part.col, rule); } else if (modifier.type == "class"){ if (!classes[modifier]){ classes[modifier] = []; } classes[modifier].push({ modifier: modifier, part: part }); } } } } } }); parser.addListener("endstylesheet", function(){ var prop; for (prop in classes){ if (classes.hasOwnProperty(prop)){ //one use means that this is overqualified if (classes[prop].length == 1 && classes[prop][0].part.elementName){ reporter.report("Element (" + classes[prop][0].part + ") is overqualified, just use " + classes[prop][0].modifier + " without element name.", classes[prop][0].part.line, classes[prop][0].part.col, rule); } } } }); } }); /* * Rule: Headings (h1-h6) should not be qualified (namespaced). */ /*global CSSLint*/ CSSLint.addRule({ //rule information id: "qualified-headings", name: "Disallow qualified headings", desc: "Headings should not be qualified (namespaced).", browsers: "All", //initialization init: function(parser, reporter){ var rule = this; parser.addListener("startrule", function(event){ var selectors = event.selectors, selector, part, i, j; for (i=0; i < selectors.length; i++){ selector = selectors[i]; for (j=0; j < selector.parts.length; j++){ part = selector.parts[j]; if (part.type == parser.SELECTOR_PART_TYPE){ if (part.elementName && /h[1-6]/.test(part.elementName.toString()) && j > 0){ reporter.report("Heading (" + part.elementName + ") should not be qualified.", part.line, part.col, rule); } } } } }); } }); /* * Rule: Selectors that look like regular expressions are slow and should be avoided. */ /*global CSSLint*/ CSSLint.addRule({ //rule information id: "regex-selectors", name: "Disallow selectors that look like regexs", desc: "Selectors that look like regular expressions are slow and should be avoided.", browsers: "All", //initialization init: function(parser, reporter){ var rule = this; parser.addListener("startrule", function(event){ var selectors = event.selectors, selector, part, modifier, i, j, k; for (i=0; i < selectors.length; i++){ selector = selectors[i]; for (j=0; j < selector.parts.length; j++){ part = selector.parts[j]; if (part.type == parser.SELECTOR_PART_TYPE){ for (k=0; k < part.modifiers.length; k++){ modifier = part.modifiers[k]; if (modifier.type == "attribute"){ if (/([\~\|\^\$\*]=)/.test(modifier)){ reporter.report("Attribute selectors with " + RegExp.$1 + " are slow!", modifier.line, modifier.col, rule); } } } } } } }); } }); /* * Rule: Total number of rules should not exceed x. */ /*global CSSLint*/ CSSLint.addRule({ //rule information id: "rules-count", name: "Rules Count", desc: "Track how many rules there are.", browsers: "All", //initialization init: function(parser, reporter){ var rule = this, count = 0; //count each rule parser.addListener("startrule", function(){ count++; }); parser.addListener("endstylesheet", function(){ reporter.stat("rule-count", count); }); } }); /* * Rule: Warn people with approaching the IE 4095 limit */ /*global CSSLint*/ CSSLint.addRule({ //rule information id: "selector-max-approaching", name: "Warn when approaching the 4095 selector limit for IE", desc: "Will warn when selector count is >= 3800 selectors.", browsers: "IE", //initialization init: function(parser, reporter) { var rule = this, count = 0; parser.addListener('startrule', function(event) { count += event.selectors.length; }); parser.addListener("endstylesheet", function() { if (count >= 3800) { reporter.report("You have " + count + " selectors. Internet Explorer supports a maximum of 4095 selectors per stylesheet. Consider refactoring.",0,0,rule); } }); } }); /* * Rule: Warn people past the IE 4095 limit */ /*global CSSLint*/ CSSLint.addRule({ //rule information id: "selector-max", name: "Error when past the 4095 selector limit for IE", desc: "Will error when selector count is > 4095.", browsers: "IE", //initialization init: function(parser, reporter){ var rule = this, count = 0; parser.addListener('startrule',function(event) { count += event.selectors.length; }); parser.addListener("endstylesheet", function() { if (count > 4095) { reporter.report("You have " + count + " selectors. Internet Explorer supports a maximum of 4095 selectors per stylesheet. Consider refactoring.",0,0,rule); } }); } }); /* * Rule: Use shorthand properties where possible. * */ /*global CSSLint*/ CSSLint.addRule({ //rule information id: "shorthand", name: "Require shorthand properties", desc: "Use shorthand properties where possible.", browsers: "All", //initialization init: function(parser, reporter){ var rule = this, prop, i, len, propertiesToCheck = {}, properties, mapping = { "margin": [ "margin-top", "margin-bottom", "margin-left", "margin-right" ], "padding": [ "padding-top", "padding-bottom", "padding-left", "padding-right" ] }; //initialize propertiesToCheck for (prop in mapping){ if (mapping.hasOwnProperty(prop)){ for (i=0, len=mapping[prop].length; i < len; i++){ propertiesToCheck[mapping[prop][i]] = prop; } } } function startRule(event){ properties = {}; } //event handler for end of rules function endRule(event){ var prop, i, len, total; //check which properties this rule has for (prop in mapping){ if (mapping.hasOwnProperty(prop)){ total=0; for (i=0, len=mapping[prop].length; i < len; i++){ total += properties[mapping[prop][i]] ? 1 : 0; } if (total == mapping[prop].length){ reporter.report("The properties " + mapping[prop].join(", ") + " can be replaced by " + prop + ".", event.line, event.col, rule); } } } } parser.addListener("startrule", startRule); parser.addListener("startfontface", startRule); //check for use of "font-size" parser.addListener("property", function(event){ var name = event.property.toString().toLowerCase(), value = event.value.parts[0].value; if (propertiesToCheck[name]){ properties[name] = 1; } }); parser.addListener("endrule", endRule); parser.addListener("endfontface", endRule); } }); /* * Rule: Don't use properties with a star prefix. * */ /*global CSSLint*/ CSSLint.addRule({ //rule information id: "star-property-hack", name: "Disallow properties with a star prefix", desc: "Checks for the star property hack (targets IE6/7)", browsers: "All", //initialization init: function(parser, reporter){ var rule = this; //check if property name starts with "*" parser.addListener("property", function(event){ var property = event.property; if (property.hack == "*") { reporter.report("Property with star prefix found.", event.property.line, event.property.col, rule); } }); } }); /* * Rule: Don't use text-indent for image replacement if you need to support rtl. * */ /*global CSSLint*/ CSSLint.addRule({ //rule information id: "text-indent", name: "Disallow negative text-indent", desc: "Checks for text indent less than -99px", browsers: "All", //initialization init: function(parser, reporter){ var rule = this, textIndent, direction; function startRule(event){ textIndent = false; direction = "inherit"; } //event handler for end of rules function endRule(event){ if (textIndent && direction != "ltr"){ reporter.report("Negative text-indent doesn't work well with RTL. If you use text-indent for image replacement explicitly set direction for that item to ltr.", textIndent.line, textIndent.col, rule); } } parser.addListener("startrule", startRule); parser.addListener("startfontface", startRule); //check for use of "font-size" parser.addListener("property", function(event){ var name = event.property.toString().toLowerCase(), value = event.value; if (name == "text-indent" && value.parts[0].value < -99){ textIndent = event.property; } else if (name == "direction" && value == "ltr"){ direction = "ltr"; } }); parser.addListener("endrule", endRule); parser.addListener("endfontface", endRule); } }); /* * Rule: Don't use properties with a underscore prefix. * */ /*global CSSLint*/ CSSLint.addRule({ //rule information id: "underscore-property-hack", name: "Disallow properties with an underscore prefix", desc: "Checks for the underscore property hack (targets IE6)", browsers: "All", //initialization init: function(parser, reporter){ var rule = this; //check if property name starts with "_" parser.addListener("property", function(event){ var property = event.property; if (property.hack == "_") { reporter.report("Property with underscore prefix found.", event.property.line, event.property.col, rule); } }); } }); /* * Rule: Headings (h1-h6) should be defined only once. */ /*global CSSLint*/ CSSLint.addRule({ //rule information id: "unique-headings", name: "Headings should only be defined once", desc: "Headings should be defined only once.", browsers: "All", //initialization init: function(parser, reporter){ var rule = this; var headings = { h1: 0, h2: 0, h3: 0, h4: 0, h5: 0, h6: 0 }; parser.addListener("startrule", function(event){ var selectors = event.selectors, selector, part, pseudo, i, j; for (i=0; i < selectors.length; i++){ selector = selectors[i]; part = selector.parts[selector.parts.length-1]; if (part.elementName && /(h[1-6])/i.test(part.elementName.toString())){ for (j=0; j < part.modifiers.length; j++){ if (part.modifiers[j].type == "pseudo"){ pseudo = true; break; } } if (!pseudo){ headings[RegExp.$1]++; if (headings[RegExp.$1] > 1) { reporter.report("Heading (" + part.elementName + ") has already been defined.", part.line, part.col, rule); } } } } }); parser.addListener("endstylesheet", function(event){ var prop, messages = []; for (prop in headings){ if (headings.hasOwnProperty(prop)){ if (headings[prop] > 1){ messages.push(headings[prop] + " " + prop + "s"); } } } if (messages.length){ reporter.rollupWarn("You have " + messages.join(", ") + " defined in this stylesheet.", rule); } }); } }); /* * Rule: Don't use universal selector because it's slow. */ /*global CSSLint*/ CSSLint.addRule({ //rule information id: "universal-selector", name: "Disallow universal selector", desc: "The universal selector (*) is known to be slow.", browsers: "All", //initialization init: function(parser, reporter){ var rule = this; parser.addListener("startrule", function(event){ var selectors = event.selectors, selector, part, modifier, i, j, k; for (i=0; i < selectors.length; i++){ selector = selectors[i]; part = selector.parts[selector.parts.length-1]; if (part.elementName == "*"){ reporter.report(rule.desc, part.line, part.col, rule); } } }); } }); /* * Rule: Don't use unqualified attribute selectors because they're just like universal selectors. */ /*global CSSLint*/ CSSLint.addRule({ //rule information id: "unqualified-attributes", name: "Disallow unqualified attribute selectors", desc: "Unqualified attribute selectors are known to be slow.", browsers: "All", //initialization init: function(parser, reporter){ var rule = this; parser.addListener("startrule", function(event){ var selectors = event.selectors, selector, part, modifier, i, j, k; for (i=0; i < selectors.length; i++){ selector = selectors[i]; part = selector.parts[selector.parts.length-1]; if (part.type == parser.SELECTOR_PART_TYPE){ for (k=0; k < part.modifiers.length; k++){ modifier = part.modifiers[k]; if (modifier.type == "attribute" && (!part.elementName || part.elementName == "*")){ reporter.report(rule.desc, part.line, part.col, rule); } } } } }); } }); /* * Rule: When using a vendor-prefixed property, make sure to * include the standard one. */ /*global CSSLint*/ CSSLint.addRule({ //rule information id: "vendor-prefix", name: "Require standard property with vendor prefix", desc: "When using a vendor-prefixed property, make sure to include the standard one.", browsers: "All", //initialization init: function(parser, reporter){ var rule = this, properties, num, propertiesToCheck = { "-webkit-border-radius": "border-radius", "-webkit-border-top-left-radius": "border-top-left-radius", "-webkit-border-top-right-radius": "border-top-right-radius", "-webkit-border-bottom-left-radius": "border-bottom-left-radius", "-webkit-border-bottom-right-radius": "border-bottom-right-radius", "-o-border-radius": "border-radius", "-o-border-top-left-radius": "border-top-left-radius", "-o-border-top-right-radius": "border-top-right-radius", "-o-border-bottom-left-radius": "border-bottom-left-radius", "-o-border-bottom-right-radius": "border-bottom-right-radius", "-moz-border-radius": "border-radius", "-moz-border-radius-topleft": "border-top-left-radius", "-moz-border-radius-topright": "border-top-right-radius", "-moz-border-radius-bottomleft": "border-bottom-left-radius", "-moz-border-radius-bottomright": "border-bottom-right-radius", "-moz-column-count": "column-count", "-webkit-column-count": "column-count", "-moz-column-gap": "column-gap", "-webkit-column-gap": "column-gap", "-moz-column-rule": "column-rule", "-webkit-column-rule": "column-rule", "-moz-column-rule-style": "column-rule-style", "-webkit-column-rule-style": "column-rule-style", "-moz-column-rule-color": "column-rule-color", "-webkit-column-rule-color": "column-rule-color", "-moz-column-rule-width": "column-rule-width", "-webkit-column-rule-width": "column-rule-width", "-moz-column-width": "column-width", "-webkit-column-width": "column-width", "-webkit-column-span": "column-span", "-webkit-columns": "columns", "-moz-box-shadow": "box-shadow", "-webkit-box-shadow": "box-shadow", "-moz-transform" : "transform", "-webkit-transform" : "transform", "-o-transform" : "transform", "-ms-transform" : "transform", "-moz-transform-origin" : "transform-origin", "-webkit-transform-origin" : "transform-origin", "-o-transform-origin" : "transform-origin", "-ms-transform-origin" : "transform-origin", "-moz-box-sizing" : "box-sizing", "-webkit-box-sizing" : "box-sizing", "-moz-user-select" : "user-select", "-khtml-user-select" : "user-select", "-webkit-user-select" : "user-select" }; //event handler for beginning of rules function startRule(){ properties = {}; num=1; } //event handler for end of rules function endRule(event){ var prop, i, len, standard, needed, actual, needsStandard = []; for (prop in properties){ if (propertiesToCheck[prop]){ needsStandard.push({ actual: prop, needed: propertiesToCheck[prop]}); } } for (i=0, len=needsStandard.length; i < len; i++){ needed = needsStandard[i].needed; actual = needsStandard[i].actual; if (!properties[needed]){ reporter.report("Missing standard property '" + needed + "' to go along with '" + actual + "'.", properties[actual][0].name.line, properties[actual][0].name.col, rule); } else { //make sure standard property is last if (properties[needed][0].pos < properties[actual][0].pos){ reporter.report("Standard property '" + needed + "' should come after vendor-prefixed property '" + actual + "'.", properties[actual][0].name.line, properties[actual][0].name.col, rule); } } } } parser.addListener("startrule", startRule); parser.addListener("startfontface", startRule); parser.addListener("startpage", startRule); parser.addListener("startpagemargin", startRule); parser.addListener("startkeyframerule", startRule); parser.addListener("property", function(event){ var name = event.property.text.toLowerCase(); if (!properties[name]){ properties[name] = []; } properties[name].push({ name: event.property, value : event.value, pos:num++ }); }); parser.addListener("endrule", endRule); parser.addListener("endfontface", endRule); parser.addListener("endpage", endRule); parser.addListener("endpagemargin", endRule); parser.addListener("endkeyframerule", endRule); } }); /* * Rule: You don't need to specify units when a value is 0. */ /*global CSSLint*/ CSSLint.addRule({ //rule information id: "zero-units", name: "Disallow units for 0 values", desc: "You don't need to specify units when a value is 0.", browsers: "All", //initialization init: function(parser, reporter){ var rule = this; //count how many times "float" is used parser.addListener("property", function(event){ var parts = event.value.parts, i = 0, len = parts.length; while(i < len){ if ((parts[i].units || parts[i].type == "percentage") && parts[i].value === 0 && parts[i].type != "time"){ reporter.report("Values of 0 shouldn't have units specified.", parts[i].line, parts[i].col, rule); } i++; } }); } }); /*global CSSLint*/ (function() { /** * Replace special characters before write to output. * * Rules: * - single quotes is the escape sequence for double-quotes * - & is the escape sequence for & * - < is the escape sequence for < * - > is the escape sequence for > * * @param {String} message to escape * @return escaped message as {String} */ var xmlEscape = function(str) { if (!str || str.constructor !== String) { return ""; } return str.replace(/[\"&><]/g, function(match) { switch (match) { case "\"": return """; case "&": return "&"; case "<": return "<"; case ">": return ">"; } }); }; CSSLint.addFormatter({ //format information id: "checkstyle-xml", name: "Checkstyle XML format", /** * Return opening root XML tag. * @return {String} to prepend before all results */ startFormat: function(){ return ""; }, /** * Return closing root XML tag. * @return {String} to append after all results */ endFormat: function(){ return ""; }, /** * Returns message when there is a file read error. * @param {String} filename The name of the file that caused the error. * @param {String} message The error message * @return {String} The error message. */ readError: function(filename, message) { return ""; }, /** * Given CSS Lint results for a file, return output for this format. * @param results {Object} with error and warning messages * @param filename {String} relative file path * @param options {Object} (UNUSED for now) specifies special handling of output * @return {String} output for results */ formatResults: function(results, filename, options) { var messages = results.messages, output = []; /** * Generate a source string for a rule. * Checkstyle source strings usually resemble Java class names e.g * net.csslint.SomeRuleName * @param {Object} rule * @return rule source as {String} */ var generateSource = function(rule) { if (!rule || !('name' in rule)) { return ""; } return 'net.csslint.' + rule.name.replace(/\s/g,''); }; if (messages.length > 0) { output.push(""); CSSLint.Util.forEach(messages, function (message, i) { //ignore rollups for now if (!message.rollup) { output.push(""); } }); output.push(""); } return output.join(""); } }); }()); /*global CSSLint*/ CSSLint.addFormatter({ //format information id: "compact", name: "Compact, 'porcelain' format", /** * Return content to be printed before all file results. * @return {String} to prepend before all results */ startFormat: function() { return ""; }, /** * Return content to be printed after all file results. * @return {String} to append after all results */ endFormat: function() { return ""; }, /** * Given CSS Lint results for a file, return output for this format. * @param results {Object} with error and warning messages * @param filename {String} relative file path * @param options {Object} (Optional) specifies special handling of output * @return {String} output for results */ formatResults: function(results, filename, options) { var messages = results.messages, output = ""; options = options || {}; /** * Capitalize and return given string. * @param str {String} to capitalize * @return {String} capitalized */ var capitalize = function(str) { return str.charAt(0).toUpperCase() + str.slice(1); }; if (messages.length === 0) { return options.quiet ? "" : filename + ": Lint Free!"; } CSSLint.Util.forEach(messages, function(message, i) { if (message.rollup) { output += filename + ": " + capitalize(message.type) + " - " + message.message + "\n"; } else { output += filename + ": " + "line " + message.line + ", col " + message.col + ", " + capitalize(message.type) + " - " + message.message + "\n"; } }); return output; } }); /*global CSSLint*/ CSSLint.addFormatter({ //format information id: "csslint-xml", name: "CSSLint XML format", /** * Return opening root XML tag. * @return {String} to prepend before all results */ startFormat: function(){ return ""; }, /** * Return closing root XML tag. * @return {String} to append after all results */ endFormat: function(){ return ""; }, /** * Given CSS Lint results for a file, return output for this format. * @param results {Object} with error and warning messages * @param filename {String} relative file path * @param options {Object} (UNUSED for now) specifies special handling of output * @return {String} output for results */ formatResults: function(results, filename, options) { var messages = results.messages, output = []; /** * Replace special characters before write to output. * * Rules: * - single quotes is the escape sequence for double-quotes * - & is the escape sequence for & * - < is the escape sequence for < * - > is the escape sequence for > * * @param {String} message to escape * @return escaped message as {String} */ var escapeSpecialCharacters = function(str) { if (!str || str.constructor !== String) { return ""; } return str.replace(/\"/g, "'").replace(/&/g, "&").replace(//g, ">"); }; if (messages.length > 0) { output.push(""); CSSLint.Util.forEach(messages, function (message, i) { if (message.rollup) { output.push(""); } else { output.push(""); } }); output.push(""); } return output.join(""); } }); /*global CSSLint*/ CSSLint.addFormatter({ //format information id: "junit-xml", name: "JUNIT XML format", /** * Return opening root XML tag. * @return {String} to prepend before all results */ startFormat: function(){ return ""; }, /** * Return closing root XML tag. * @return {String} to append after all results */ endFormat: function() { return ""; }, /** * Given CSS Lint results for a file, return output for this format. * @param results {Object} with error and warning messages * @param filename {String} relative file path * @param options {Object} (UNUSED for now) specifies special handling of output * @return {String} output for results */ formatResults: function(results, filename, options) { var messages = results.messages, output = [], tests = { 'error': 0, 'failure': 0 }; /** * Generate a source string for a rule. * JUNIT source strings usually resemble Java class names e.g * net.csslint.SomeRuleName * @param {Object} rule * @return rule source as {String} */ var generateSource = function(rule) { if (!rule || !('name' in rule)) { return ""; } return 'net.csslint.' + rule.name.replace(/\s/g,''); }; /** * Replace special characters before write to output. * * Rules: * - single quotes is the escape sequence for double-quotes * - < is the escape sequence for < * - > is the escape sequence for > * * @param {String} message to escape * @return escaped message as {String} */ var escapeSpecialCharacters = function(str) { if (!str || str.constructor !== String) { return ""; } return str.replace(/\"/g, "'").replace(//g, ">"); }; if (messages.length > 0) { messages.forEach(function (message, i) { // since junit has no warning class // all issues as errors var type = message.type === 'warning' ? 'error' : message.type; //ignore rollups for now if (!message.rollup) { // build the test case seperately, once joined // we'll add it to a custom array filtered by type output.push(""); output.push("<" + type + " message=\"" + escapeSpecialCharacters(message.message) + "\">"); output.push(""); tests[type] += 1; } }); output.unshift(""); output.push(""); } return output.join(""); } }); /*global CSSLint*/ CSSLint.addFormatter({ //format information id: "lint-xml", name: "Lint XML format", /** * Return opening root XML tag. * @return {String} to prepend before all results */ startFormat: function(){ return ""; }, /** * Return closing root XML tag. * @return {String} to append after all results */ endFormat: function(){ return ""; }, /** * Given CSS Lint results for a file, return output for this format. * @param results {Object} with error and warning messages * @param filename {String} relative file path * @param options {Object} (UNUSED for now) specifies special handling of output * @return {String} output for results */ formatResults: function(results, filename, options) { var messages = results.messages, output = []; /** * Replace special characters before write to output. * * Rules: * - single quotes is the escape sequence for double-quotes * - & is the escape sequence for & * - < is the escape sequence for < * - > is the escape sequence for > * * @param {String} message to escape * @return escaped message as {String} */ var escapeSpecialCharacters = function(str) { if (!str || str.constructor !== String) { return ""; } return str.replace(/\"/g, "'").replace(/&/g, "&").replace(//g, ">"); }; if (messages.length > 0) { output.push(""); CSSLint.Util.forEach(messages, function (message, i) { if (message.rollup) { output.push(""); } else { output.push(""); } }); output.push(""); } return output.join(""); } }); /*global CSSLint*/ CSSLint.addFormatter({ //format information id: "text", name: "Plain Text", /** * Return content to be printed before all file results. * @return {String} to prepend before all results */ startFormat: function() { return ""; }, /** * Return content to be printed after all file results. * @return {String} to append after all results */ endFormat: function() { return ""; }, /** * Given CSS Lint results for a file, return output for this format. * @param results {Object} with error and warning messages * @param filename {String} relative file path * @param options {Object} (Optional) specifies special handling of output * @return {String} output for results */ formatResults: function(results, filename, options) { var messages = results.messages, output = ""; options = options || {}; if (messages.length === 0) { return options.quiet ? "" : "\n\ncsslint: No errors in " + filename + "."; } output = "\n\ncsslint: There are " + messages.length + " problems in " + filename + "."; var pos = filename.lastIndexOf("/"), shortFilename = filename; if (pos === -1){ pos = filename.lastIndexOf("\\"); } if (pos > -1){ shortFilename = filename.substring(pos+1); } CSSLint.Util.forEach(messages, function (message, i) { output = output + "\n\n" + shortFilename; if (message.rollup) { output += "\n" + (i+1) + ": " + message.type; output += "\n" + message.message; } else { output += "\n" + (i+1) + ": " + message.type + " at line " + message.line + ", col " + message.col; output += "\n" + message.message; output += "\n" + message.evidence; } }); return output; } }); exports.CSSLint = CSSLint; ================================================ FILE: gulp/util/csslint/lib/parserlib.js ================================================ /*! Parser-Lib Copyright (c) 2009-2011 Nicholas C. Zakas. All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* Version v0.2.5, Build time: 7-May-2014 03:37:38 */ var parserlib = {}; (function(){ /** * A generic base to inherit from for any object * that needs event handling. * @class EventTarget * @constructor */ function EventTarget(){ /** * The array of listeners for various events. * @type Object * @property _listeners * @private */ this._listeners = {}; } EventTarget.prototype = { //restore constructor constructor: EventTarget, /** * Adds a listener for a given event type. * @param {String} type The type of event to add a listener for. * @param {Function} listener The function to call when the event occurs. * @return {void} * @method addListener */ addListener: function(type, listener){ if (!this._listeners[type]){ this._listeners[type] = []; } this._listeners[type].push(listener); }, /** * Fires an event based on the passed-in object. * @param {Object|String} event An object with at least a 'type' attribute * or a string indicating the event name. * @return {void} * @method fire */ fire: function(event){ if (typeof event == "string"){ event = { type: event }; } if (typeof event.target != "undefined"){ event.target = this; } if (typeof event.type == "undefined"){ throw new Error("Event object missing 'type' property."); } if (this._listeners[event.type]){ //create a copy of the array and use that so listeners can't chane var listeners = this._listeners[event.type].concat(); for (var i=0, len=listeners.length; i < len; i++){ listeners[i].call(this, event); } } }, /** * Removes a listener for a given event type. * @param {String} type The type of event to remove a listener from. * @param {Function} listener The function to remove from the event. * @return {void} * @method removeListener */ removeListener: function(type, listener){ if (this._listeners[type]){ var listeners = this._listeners[type]; for (var i=0, len=listeners.length; i < len; i++){ if (listeners[i] === listener){ listeners.splice(i, 1); break; } } } } }; /** * Convenient way to read through strings. * @namespace parserlib.util * @class StringReader * @constructor * @param {String} text The text to read. */ function StringReader(text){ /** * The input text with line endings normalized. * @property _input * @type String * @private */ this._input = text.replace(/\n\r?/g, "\n"); /** * The row for the character to be read next. * @property _line * @type int * @private */ this._line = 1; /** * The column for the character to be read next. * @property _col * @type int * @private */ this._col = 1; /** * The index of the character in the input to be read next. * @property _cursor * @type int * @private */ this._cursor = 0; } StringReader.prototype = { //restore constructor constructor: StringReader, //------------------------------------------------------------------------- // Position info //------------------------------------------------------------------------- /** * Returns the column of the character to be read next. * @return {int} The column of the character to be read next. * @method getCol */ getCol: function(){ return this._col; }, /** * Returns the row of the character to be read next. * @return {int} The row of the character to be read next. * @method getLine */ getLine: function(){ return this._line ; }, /** * Determines if you're at the end of the input. * @return {Boolean} True if there's no more input, false otherwise. * @method eof */ eof: function(){ return (this._cursor == this._input.length); }, //------------------------------------------------------------------------- // Basic reading //------------------------------------------------------------------------- /** * Reads the next character without advancing the cursor. * @param {int} count How many characters to look ahead (default is 1). * @return {String} The next character or null if there is no next character. * @method peek */ peek: function(count){ var c = null; count = (typeof count == "undefined" ? 1 : count); //if we're not at the end of the input... if (this._cursor < this._input.length){ //get character and increment cursor and column c = this._input.charAt(this._cursor + count - 1); } return c; }, /** * Reads the next character from the input and adjusts the row and column * accordingly. * @return {String} The next character or null if there is no next character. * @method read */ read: function(){ var c = null; //if we're not at the end of the input... if (this._cursor < this._input.length){ //if the last character was a newline, increment row count //and reset column count if (this._input.charAt(this._cursor) == "\n"){ this._line++; this._col=1; } else { this._col++; } //get character and increment cursor and column c = this._input.charAt(this._cursor++); } return c; }, //------------------------------------------------------------------------- // Misc //------------------------------------------------------------------------- /** * Saves the current location so it can be returned to later. * @method mark * @return {void} */ mark: function(){ this._bookmark = { cursor: this._cursor, line: this._line, col: this._col }; }, reset: function(){ if (this._bookmark){ this._cursor = this._bookmark.cursor; this._line = this._bookmark.line; this._col = this._bookmark.col; delete this._bookmark; } }, //------------------------------------------------------------------------- // Advanced reading //------------------------------------------------------------------------- /** * Reads up to and including the given string. Throws an error if that * string is not found. * @param {String} pattern The string to read. * @return {String} The string when it is found. * @throws Error when the string pattern is not found. * @method readTo */ readTo: function(pattern){ var buffer = "", c; /* * First, buffer must be the same length as the pattern. * Then, buffer must end with the pattern or else reach the * end of the input. */ while (buffer.length < pattern.length || buffer.lastIndexOf(pattern) != buffer.length - pattern.length){ c = this.read(); if (c){ buffer += c; } else { throw new Error("Expected \"" + pattern + "\" at line " + this._line + ", col " + this._col + "."); } } return buffer; }, /** * Reads characters while each character causes the given * filter function to return true. The function is passed * in each character and either returns true to continue * reading or false to stop. * @param {Function} filter The function to read on each character. * @return {String} The string made up of all characters that passed the * filter check. * @method readWhile */ readWhile: function(filter){ var buffer = "", c = this.read(); while(c !== null && filter(c)){ buffer += c; c = this.read(); } return buffer; }, /** * Reads characters that match either text or a regular expression and * returns those characters. If a match is found, the row and column * are adjusted; if no match is found, the reader's state is unchanged. * reading or false to stop. * @param {String|RegExp} matchter If a string, then the literal string * value is searched for. If a regular expression, then any string * matching the pattern is search for. * @return {String} The string made up of all characters that matched or * null if there was no match. * @method readMatch */ readMatch: function(matcher){ var source = this._input.substring(this._cursor), value = null; //if it's a string, just do a straight match if (typeof matcher == "string"){ if (source.indexOf(matcher) === 0){ value = this.readCount(matcher.length); } } else if (matcher instanceof RegExp){ if (matcher.test(source)){ value = this.readCount(RegExp.lastMatch.length); } } return value; }, /** * Reads a given number of characters. If the end of the input is reached, * it reads only the remaining characters and does not throw an error. * @param {int} count The number of characters to read. * @return {String} The string made up the read characters. * @method readCount */ readCount: function(count){ var buffer = ""; while(count--){ buffer += this.read(); } return buffer; } }; /** * Type to use when a syntax error occurs. * @class SyntaxError * @namespace parserlib.util * @constructor * @param {String} message The error message. * @param {int} line The line at which the error occurred. * @param {int} col The column at which the error occurred. */ function SyntaxError(message, line, col){ /** * The column at which the error occurred. * @type int * @property col */ this.col = col; /** * The line at which the error occurred. * @type int * @property line */ this.line = line; /** * The text representation of the unit. * @type String * @property text */ this.message = message; } //inherit from Error SyntaxError.prototype = new Error(); /** * Base type to represent a single syntactic unit. * @class SyntaxUnit * @namespace parserlib.util * @constructor * @param {String} text The text of the unit. * @param {int} line The line of text on which the unit resides. * @param {int} col The column of text on which the unit resides. */ function SyntaxUnit(text, line, col, type){ /** * The column of text on which the unit resides. * @type int * @property col */ this.col = col; /** * The line of text on which the unit resides. * @type int * @property line */ this.line = line; /** * The text representation of the unit. * @type String * @property text */ this.text = text; /** * The type of syntax unit. * @type int * @property type */ this.type = type; } /** * Create a new syntax unit based solely on the given token. * Convenience method for creating a new syntax unit when * it represents a single token instead of multiple. * @param {Object} token The token object to represent. * @return {parserlib.util.SyntaxUnit} The object representing the token. * @static * @method fromToken */ SyntaxUnit.fromToken = function(token){ return new SyntaxUnit(token.value, token.startLine, token.startCol); }; SyntaxUnit.prototype = { //restore constructor constructor: SyntaxUnit, /** * Returns the text representation of the unit. * @return {String} The text representation of the unit. * @method valueOf */ valueOf: function(){ return this.toString(); }, /** * Returns the text representation of the unit. * @return {String} The text representation of the unit. * @method toString */ toString: function(){ return this.text; } }; /*global StringReader, SyntaxError*/ /** * Generic TokenStream providing base functionality. * @class TokenStreamBase * @namespace parserlib.util * @constructor * @param {String|StringReader} input The text to tokenize or a reader from * which to read the input. */ function TokenStreamBase(input, tokenData){ /** * The string reader for easy access to the text. * @type StringReader * @property _reader * @private */ this._reader = input ? new StringReader(input.toString()) : null; /** * Token object for the last consumed token. * @type Token * @property _token * @private */ this._token = null; /** * The array of token information. * @type Array * @property _tokenData * @private */ this._tokenData = tokenData; /** * Lookahead token buffer. * @type Array * @property _lt * @private */ this._lt = []; /** * Lookahead token buffer index. * @type int * @property _ltIndex * @private */ this._ltIndex = 0; this._ltIndexCache = []; } /** * Accepts an array of token information and outputs * an array of token data containing key-value mappings * and matching functions that the TokenStream needs. * @param {Array} tokens An array of token descriptors. * @return {Array} An array of processed token data. * @method createTokenData * @static */ TokenStreamBase.createTokenData = function(tokens){ var nameMap = [], typeMap = {}, tokenData = tokens.concat([]), i = 0, len = tokenData.length+1; tokenData.UNKNOWN = -1; tokenData.unshift({name:"EOF"}); for (; i < len; i++){ nameMap.push(tokenData[i].name); tokenData[tokenData[i].name] = i; if (tokenData[i].text){ typeMap[tokenData[i].text] = i; } } tokenData.name = function(tt){ return nameMap[tt]; }; tokenData.type = function(c){ return typeMap[c]; }; return tokenData; }; TokenStreamBase.prototype = { //restore constructor constructor: TokenStreamBase, //------------------------------------------------------------------------- // Matching methods //------------------------------------------------------------------------- /** * Determines if the next token matches the given token type. * If so, that token is consumed; if not, the token is placed * back onto the token stream. You can pass in any number of * token types and this will return true if any of the token * types is found. * @param {int|int[]} tokenTypes Either a single token type or an array of * token types that the next token might be. If an array is passed, * it's assumed that the token can be any of these. * @param {variant} channel (Optional) The channel to read from. If not * provided, reads from the default (unnamed) channel. * @return {Boolean} True if the token type matches, false if not. * @method match */ match: function(tokenTypes, channel){ //always convert to an array, makes things easier if (!(tokenTypes instanceof Array)){ tokenTypes = [tokenTypes]; } var tt = this.get(channel), i = 0, len = tokenTypes.length; while(i < len){ if (tt == tokenTypes[i++]){ return true; } } //no match found, put the token back this.unget(); return false; }, /** * Determines if the next token matches the given token type. * If so, that token is consumed; if not, an error is thrown. * @param {int|int[]} tokenTypes Either a single token type or an array of * token types that the next token should be. If an array is passed, * it's assumed that the token must be one of these. * @param {variant} channel (Optional) The channel to read from. If not * provided, reads from the default (unnamed) channel. * @return {void} * @method mustMatch */ mustMatch: function(tokenTypes, channel){ var token; //always convert to an array, makes things easier if (!(tokenTypes instanceof Array)){ tokenTypes = [tokenTypes]; } if (!this.match.apply(this, arguments)){ token = this.LT(1); throw new SyntaxError("Expected " + this._tokenData[tokenTypes[0]].name + " at line " + token.startLine + ", col " + token.startCol + ".", token.startLine, token.startCol); } }, //------------------------------------------------------------------------- // Consuming methods //------------------------------------------------------------------------- /** * Keeps reading from the token stream until either one of the specified * token types is found or until the end of the input is reached. * @param {int|int[]} tokenTypes Either a single token type or an array of * token types that the next token should be. If an array is passed, * it's assumed that the token must be one of these. * @param {variant} channel (Optional) The channel to read from. If not * provided, reads from the default (unnamed) channel. * @return {void} * @method advance */ advance: function(tokenTypes, channel){ while(this.LA(0) !== 0 && !this.match(tokenTypes, channel)){ this.get(); } return this.LA(0); }, /** * Consumes the next token from the token stream. * @return {int} The token type of the token that was just consumed. * @method get */ get: function(channel){ var tokenInfo = this._tokenData, reader = this._reader, value, i =0, len = tokenInfo.length, found = false, token, info; //check the lookahead buffer first if (this._lt.length && this._ltIndex >= 0 && this._ltIndex < this._lt.length){ i++; this._token = this._lt[this._ltIndex++]; info = tokenInfo[this._token.type]; //obey channels logic while((info.channel !== undefined && channel !== info.channel) && this._ltIndex < this._lt.length){ this._token = this._lt[this._ltIndex++]; info = tokenInfo[this._token.type]; i++; } //here be dragons if ((info.channel === undefined || channel === info.channel) && this._ltIndex <= this._lt.length){ this._ltIndexCache.push(i); return this._token.type; } } //call token retriever method token = this._getToken(); //if it should be hidden, don't save a token if (token.type > -1 && !tokenInfo[token.type].hide){ //apply token channel token.channel = tokenInfo[token.type].channel; //save for later this._token = token; this._lt.push(token); //save space that will be moved (must be done before array is truncated) this._ltIndexCache.push(this._lt.length - this._ltIndex + i); //keep the buffer under 5 items if (this._lt.length > 5){ this._lt.shift(); } //also keep the shift buffer under 5 items if (this._ltIndexCache.length > 5){ this._ltIndexCache.shift(); } //update lookahead index this._ltIndex = this._lt.length; } /* * Skip to the next token if: * 1. The token type is marked as hidden. * 2. The token type has a channel specified and it isn't the current channel. */ info = tokenInfo[token.type]; if (info && (info.hide || (info.channel !== undefined && channel !== info.channel))){ return this.get(channel); } else { //return just the type return token.type; } }, /** * Looks ahead a certain number of tokens and returns the token type at * that position. This will throw an error if you lookahead past the * end of input, past the size of the lookahead buffer, or back past * the first token in the lookahead buffer. * @param {int} The index of the token type to retrieve. 0 for the * current token, 1 for the next, -1 for the previous, etc. * @return {int} The token type of the token in the given position. * @method LA */ LA: function(index){ var total = index, tt; if (index > 0){ //TODO: Store 5 somewhere if (index > 5){ throw new Error("Too much lookahead."); } //get all those tokens while(total){ tt = this.get(); total--; } //unget all those tokens while(total < index){ this.unget(); total++; } } else if (index < 0){ if(this._lt[this._ltIndex+index]){ tt = this._lt[this._ltIndex+index].type; } else { throw new Error("Too much lookbehind."); } } else { tt = this._token.type; } return tt; }, /** * Looks ahead a certain number of tokens and returns the token at * that position. This will throw an error if you lookahead past the * end of input, past the size of the lookahead buffer, or back past * the first token in the lookahead buffer. * @param {int} The index of the token type to retrieve. 0 for the * current token, 1 for the next, -1 for the previous, etc. * @return {Object} The token of the token in the given position. * @method LA */ LT: function(index){ //lookahead first to prime the token buffer this.LA(index); //now find the token, subtract one because _ltIndex is already at the next index return this._lt[this._ltIndex+index-1]; }, /** * Returns the token type for the next token in the stream without * consuming it. * @return {int} The token type of the next token in the stream. * @method peek */ peek: function(){ return this.LA(1); }, /** * Returns the actual token object for the last consumed token. * @return {Token} The token object for the last consumed token. * @method token */ token: function(){ return this._token; }, /** * Returns the name of the token for the given token type. * @param {int} tokenType The type of token to get the name of. * @return {String} The name of the token or "UNKNOWN_TOKEN" for any * invalid token type. * @method tokenName */ tokenName: function(tokenType){ if (tokenType < 0 || tokenType > this._tokenData.length){ return "UNKNOWN_TOKEN"; } else { return this._tokenData[tokenType].name; } }, /** * Returns the token type value for the given token name. * @param {String} tokenName The name of the token whose value should be returned. * @return {int} The token type value for the given token name or -1 * for an unknown token. * @method tokenName */ tokenType: function(tokenName){ return this._tokenData[tokenName] || -1; }, /** * Returns the last consumed token to the token stream. * @method unget */ unget: function(){ //if (this._ltIndex > -1){ if (this._ltIndexCache.length){ this._ltIndex -= this._ltIndexCache.pop();//--; this._token = this._lt[this._ltIndex - 1]; } else { throw new Error("Too much lookahead."); } } }; parserlib.util = { StringReader: StringReader, SyntaxError : SyntaxError, SyntaxUnit : SyntaxUnit, EventTarget : EventTarget, TokenStreamBase : TokenStreamBase }; })(); /* Parser-Lib Copyright (c) 2009-2011 Nicholas C. Zakas. All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* Version v0.2.5, Build time: 7-May-2014 03:37:38 */ (function(){ var EventTarget = parserlib.util.EventTarget, TokenStreamBase = parserlib.util.TokenStreamBase, StringReader = parserlib.util.StringReader, SyntaxError = parserlib.util.SyntaxError, SyntaxUnit = parserlib.util.SyntaxUnit; var Colors = { aliceblue :"#f0f8ff", antiquewhite :"#faebd7", aqua :"#00ffff", aquamarine :"#7fffd4", azure :"#f0ffff", beige :"#f5f5dc", bisque :"#ffe4c4", black :"#000000", blanchedalmond :"#ffebcd", blue :"#0000ff", blueviolet :"#8a2be2", brown :"#a52a2a", burlywood :"#deb887", cadetblue :"#5f9ea0", chartreuse :"#7fff00", chocolate :"#d2691e", coral :"#ff7f50", cornflowerblue :"#6495ed", cornsilk :"#fff8dc", crimson :"#dc143c", cyan :"#00ffff", darkblue :"#00008b", darkcyan :"#008b8b", darkgoldenrod :"#b8860b", darkgray :"#a9a9a9", darkgrey :"#a9a9a9", darkgreen :"#006400", darkkhaki :"#bdb76b", darkmagenta :"#8b008b", darkolivegreen :"#556b2f", darkorange :"#ff8c00", darkorchid :"#9932cc", darkred :"#8b0000", darksalmon :"#e9967a", darkseagreen :"#8fbc8f", darkslateblue :"#483d8b", darkslategray :"#2f4f4f", darkslategrey :"#2f4f4f", darkturquoise :"#00ced1", darkviolet :"#9400d3", deeppink :"#ff1493", deepskyblue :"#00bfff", dimgray :"#696969", dimgrey :"#696969", dodgerblue :"#1e90ff", firebrick :"#b22222", floralwhite :"#fffaf0", forestgreen :"#228b22", fuchsia :"#ff00ff", gainsboro :"#dcdcdc", ghostwhite :"#f8f8ff", gold :"#ffd700", goldenrod :"#daa520", gray :"#808080", grey :"#808080", green :"#008000", greenyellow :"#adff2f", honeydew :"#f0fff0", hotpink :"#ff69b4", indianred :"#cd5c5c", indigo :"#4b0082", ivory :"#fffff0", khaki :"#f0e68c", lavender :"#e6e6fa", lavenderblush :"#fff0f5", lawngreen :"#7cfc00", lemonchiffon :"#fffacd", lightblue :"#add8e6", lightcoral :"#f08080", lightcyan :"#e0ffff", lightgoldenrodyellow :"#fafad2", lightgray :"#d3d3d3", lightgrey :"#d3d3d3", lightgreen :"#90ee90", lightpink :"#ffb6c1", lightsalmon :"#ffa07a", lightseagreen :"#20b2aa", lightskyblue :"#87cefa", lightslategray :"#778899", lightslategrey :"#778899", lightsteelblue :"#b0c4de", lightyellow :"#ffffe0", lime :"#00ff00", limegreen :"#32cd32", linen :"#faf0e6", magenta :"#ff00ff", maroon :"#800000", mediumaquamarine:"#66cdaa", mediumblue :"#0000cd", mediumorchid :"#ba55d3", mediumpurple :"#9370d8", mediumseagreen :"#3cb371", mediumslateblue :"#7b68ee", mediumspringgreen :"#00fa9a", mediumturquoise :"#48d1cc", mediumvioletred :"#c71585", midnightblue :"#191970", mintcream :"#f5fffa", mistyrose :"#ffe4e1", moccasin :"#ffe4b5", navajowhite :"#ffdead", navy :"#000080", oldlace :"#fdf5e6", olive :"#808000", olivedrab :"#6b8e23", orange :"#ffa500", orangered :"#ff4500", orchid :"#da70d6", palegoldenrod :"#eee8aa", palegreen :"#98fb98", paleturquoise :"#afeeee", palevioletred :"#d87093", papayawhip :"#ffefd5", peachpuff :"#ffdab9", peru :"#cd853f", pink :"#ffc0cb", plum :"#dda0dd", powderblue :"#b0e0e6", purple :"#800080", red :"#ff0000", rosybrown :"#bc8f8f", royalblue :"#4169e1", saddlebrown :"#8b4513", salmon :"#fa8072", sandybrown :"#f4a460", seagreen :"#2e8b57", seashell :"#fff5ee", sienna :"#a0522d", silver :"#c0c0c0", skyblue :"#87ceeb", slateblue :"#6a5acd", slategray :"#708090", slategrey :"#708090", snow :"#fffafa", springgreen :"#00ff7f", steelblue :"#4682b4", tan :"#d2b48c", teal :"#008080", thistle :"#d8bfd8", tomato :"#ff6347", turquoise :"#40e0d0", violet :"#ee82ee", wheat :"#f5deb3", white :"#ffffff", whitesmoke :"#f5f5f5", yellow :"#ffff00", yellowgreen :"#9acd32", //CSS2 system colors http://www.w3.org/TR/css3-color/#css2-system activeBorder :"Active window border.", activecaption :"Active window caption.", appworkspace :"Background color of multiple document interface.", background :"Desktop background.", buttonface :"The face background color for 3-D elements that appear 3-D due to one layer of surrounding border.", buttonhighlight :"The color of the border facing the light source for 3-D elements that appear 3-D due to one layer of surrounding border.", buttonshadow :"The color of the border away from the light source for 3-D elements that appear 3-D due to one layer of surrounding border.", buttontext :"Text on push buttons.", captiontext :"Text in caption, size box, and scrollbar arrow box.", graytext :"Grayed (disabled) text. This color is set to #000 if the current display driver does not support a solid gray color.", greytext :"Greyed (disabled) text. This color is set to #000 if the current display driver does not support a solid grey color.", highlight :"Item(s) selected in a control.", highlighttext :"Text of item(s) selected in a control.", inactiveborder :"Inactive window border.", inactivecaption :"Inactive window caption.", inactivecaptiontext :"Color of text in an inactive caption.", infobackground :"Background color for tooltip controls.", infotext :"Text color for tooltip controls.", menu :"Menu background.", menutext :"Text in menus.", scrollbar :"Scroll bar gray area.", threeddarkshadow :"The color of the darker (generally outer) of the two borders away from the light source for 3-D elements that appear 3-D due to two concentric layers of surrounding border.", threedface :"The face background color for 3-D elements that appear 3-D due to two concentric layers of surrounding border.", threedhighlight :"The color of the lighter (generally outer) of the two borders facing the light source for 3-D elements that appear 3-D due to two concentric layers of surrounding border.", threedlightshadow :"The color of the darker (generally inner) of the two borders facing the light source for 3-D elements that appear 3-D due to two concentric layers of surrounding border.", threedshadow :"The color of the lighter (generally inner) of the two borders away from the light source for 3-D elements that appear 3-D due to two concentric layers of surrounding border.", window :"Window background.", windowframe :"Window frame.", windowtext :"Text in windows." }; /*global SyntaxUnit, Parser*/ /** * Represents a selector combinator (whitespace, +, >). * @namespace parserlib.css * @class Combinator * @extends parserlib.util.SyntaxUnit * @constructor * @param {String} text The text representation of the unit. * @param {int} line The line of text on which the unit resides. * @param {int} col The column of text on which the unit resides. */ function Combinator(text, line, col){ SyntaxUnit.call(this, text, line, col, Parser.COMBINATOR_TYPE); /** * The type of modifier. * @type String * @property type */ this.type = "unknown"; //pretty simple if (/^\s+$/.test(text)){ this.type = "descendant"; } else if (text == ">"){ this.type = "child"; } else if (text == "+"){ this.type = "adjacent-sibling"; } else if (text == "~"){ this.type = "sibling"; } } Combinator.prototype = new SyntaxUnit(); Combinator.prototype.constructor = Combinator; /*global SyntaxUnit, Parser*/ /** * Represents a media feature, such as max-width:500. * @namespace parserlib.css * @class MediaFeature * @extends parserlib.util.SyntaxUnit * @constructor * @param {SyntaxUnit} name The name of the feature. * @param {SyntaxUnit} value The value of the feature or null if none. */ function MediaFeature(name, value){ SyntaxUnit.call(this, "(" + name + (value !== null ? ":" + value : "") + ")", name.startLine, name.startCol, Parser.MEDIA_FEATURE_TYPE); /** * The name of the media feature * @type String * @property name */ this.name = name; /** * The value for the feature or null if there is none. * @type SyntaxUnit * @property value */ this.value = value; } MediaFeature.prototype = new SyntaxUnit(); MediaFeature.prototype.constructor = MediaFeature; /*global SyntaxUnit, Parser*/ /** * Represents an individual media query. * @namespace parserlib.css * @class MediaQuery * @extends parserlib.util.SyntaxUnit * @constructor * @param {String} modifier The modifier "not" or "only" (or null). * @param {String} mediaType The type of media (i.e., "print"). * @param {Array} parts Array of selectors parts making up this selector. * @param {int} line The line of text on which the unit resides. * @param {int} col The column of text on which the unit resides. */ function MediaQuery(modifier, mediaType, features, line, col){ SyntaxUnit.call(this, (modifier ? modifier + " ": "") + (mediaType ? mediaType : "") + (mediaType && features.length > 0 ? " and " : "") + features.join(" and "), line, col, Parser.MEDIA_QUERY_TYPE); /** * The media modifier ("not" or "only") * @type String * @property modifier */ this.modifier = modifier; /** * The mediaType (i.e., "print") * @type String * @property mediaType */ this.mediaType = mediaType; /** * The parts that make up the selector. * @type Array * @property features */ this.features = features; } MediaQuery.prototype = new SyntaxUnit(); MediaQuery.prototype.constructor = MediaQuery; /*global Tokens, TokenStream, SyntaxError, Properties, Validation, ValidationError, SyntaxUnit, PropertyValue, PropertyValuePart, SelectorPart, SelectorSubPart, Selector, PropertyName, Combinator, MediaFeature, MediaQuery, EventTarget */ /** * A CSS3 parser. * @namespace parserlib.css * @class Parser * @constructor * @param {Object} options (Optional) Various options for the parser: * starHack (true|false) to allow IE6 star hack as valid, * underscoreHack (true|false) to interpret leading underscores * as IE6-7 targeting for known properties, ieFilters (true|false) * to indicate that IE < 8 filters should be accepted and not throw * syntax errors. */ function Parser(options){ //inherit event functionality EventTarget.call(this); this.options = options || {}; this._tokenStream = null; } //Static constants Parser.DEFAULT_TYPE = 0; Parser.COMBINATOR_TYPE = 1; Parser.MEDIA_FEATURE_TYPE = 2; Parser.MEDIA_QUERY_TYPE = 3; Parser.PROPERTY_NAME_TYPE = 4; Parser.PROPERTY_VALUE_TYPE = 5; Parser.PROPERTY_VALUE_PART_TYPE = 6; Parser.SELECTOR_TYPE = 7; Parser.SELECTOR_PART_TYPE = 8; Parser.SELECTOR_SUB_PART_TYPE = 9; Parser.prototype = function(){ var proto = new EventTarget(), //new prototype prop, additions = { //restore constructor constructor: Parser, //instance constants - yuck DEFAULT_TYPE : 0, COMBINATOR_TYPE : 1, MEDIA_FEATURE_TYPE : 2, MEDIA_QUERY_TYPE : 3, PROPERTY_NAME_TYPE : 4, PROPERTY_VALUE_TYPE : 5, PROPERTY_VALUE_PART_TYPE : 6, SELECTOR_TYPE : 7, SELECTOR_PART_TYPE : 8, SELECTOR_SUB_PART_TYPE : 9, //----------------------------------------------------------------- // Grammar //----------------------------------------------------------------- _stylesheet: function(){ /* * stylesheet * : [ CHARSET_SYM S* STRING S* ';' ]? * [S|CDO|CDC]* [ import [S|CDO|CDC]* ]* * [ namespace [S|CDO|CDC]* ]* * [ [ ruleset | media | page | font_face | keyframes ] [S|CDO|CDC]* ]* * ; */ var tokenStream = this._tokenStream, charset = null, count, token, tt; this.fire("startstylesheet"); //try to read character set this._charset(); this._skipCruft(); //try to read imports - may be more than one while (tokenStream.peek() == Tokens.IMPORT_SYM){ this._import(); this._skipCruft(); } //try to read namespaces - may be more than one while (tokenStream.peek() == Tokens.NAMESPACE_SYM){ this._namespace(); this._skipCruft(); } //get the next token tt = tokenStream.peek(); //try to read the rest while(tt > Tokens.EOF){ try { switch(tt){ case Tokens.MEDIA_SYM: this._media(); this._skipCruft(); break; case Tokens.PAGE_SYM: this._page(); this._skipCruft(); break; case Tokens.FONT_FACE_SYM: this._font_face(); this._skipCruft(); break; case Tokens.KEYFRAMES_SYM: this._keyframes(); this._skipCruft(); break; case Tokens.VIEWPORT_SYM: this._viewport(); this._skipCruft(); break; case Tokens.UNKNOWN_SYM: //unknown @ rule tokenStream.get(); if (!this.options.strict){ //fire error event this.fire({ type: "error", error: null, message: "Unknown @ rule: " + tokenStream.LT(0).value + ".", line: tokenStream.LT(0).startLine, col: tokenStream.LT(0).startCol }); //skip braces count=0; while (tokenStream.advance([Tokens.LBRACE, Tokens.RBRACE]) == Tokens.LBRACE){ count++; //keep track of nesting depth } while(count){ tokenStream.advance([Tokens.RBRACE]); count--; } } else { //not a syntax error, rethrow it throw new SyntaxError("Unknown @ rule.", tokenStream.LT(0).startLine, tokenStream.LT(0).startCol); } break; case Tokens.S: this._readWhitespace(); break; default: if(!this._ruleset()){ //error handling for known issues switch(tt){ case Tokens.CHARSET_SYM: token = tokenStream.LT(1); this._charset(false); throw new SyntaxError("@charset not allowed here.", token.startLine, token.startCol); case Tokens.IMPORT_SYM: token = tokenStream.LT(1); this._import(false); throw new SyntaxError("@import not allowed here.", token.startLine, token.startCol); case Tokens.NAMESPACE_SYM: token = tokenStream.LT(1); this._namespace(false); throw new SyntaxError("@namespace not allowed here.", token.startLine, token.startCol); default: tokenStream.get(); //get the last token this._unexpectedToken(tokenStream.token()); } } } } catch(ex) { if (ex instanceof SyntaxError && !this.options.strict){ this.fire({ type: "error", error: ex, message: ex.message, line: ex.line, col: ex.col }); } else { throw ex; } } tt = tokenStream.peek(); } if (tt != Tokens.EOF){ this._unexpectedToken(tokenStream.token()); } this.fire("endstylesheet"); }, _charset: function(emit){ var tokenStream = this._tokenStream, charset, token, line, col; if (tokenStream.match(Tokens.CHARSET_SYM)){ line = tokenStream.token().startLine; col = tokenStream.token().startCol; this._readWhitespace(); tokenStream.mustMatch(Tokens.STRING); token = tokenStream.token(); charset = token.value; this._readWhitespace(); tokenStream.mustMatch(Tokens.SEMICOLON); if (emit !== false){ this.fire({ type: "charset", charset:charset, line: line, col: col }); } } }, _import: function(emit){ /* * import * : IMPORT_SYM S* * [STRING|URI] S* media_query_list? ';' S* */ var tokenStream = this._tokenStream, tt, uri, importToken, mediaList = []; //read import symbol tokenStream.mustMatch(Tokens.IMPORT_SYM); importToken = tokenStream.token(); this._readWhitespace(); tokenStream.mustMatch([Tokens.STRING, Tokens.URI]); //grab the URI value uri = tokenStream.token().value.replace(/^(?:url\()?["']?([^"']+?)["']?\)?$/, "$1"); this._readWhitespace(); mediaList = this._media_query_list(); //must end with a semicolon tokenStream.mustMatch(Tokens.SEMICOLON); this._readWhitespace(); if (emit !== false){ this.fire({ type: "import", uri: uri, media: mediaList, line: importToken.startLine, col: importToken.startCol }); } }, _namespace: function(emit){ /* * namespace * : NAMESPACE_SYM S* [namespace_prefix S*]? [STRING|URI] S* ';' S* */ var tokenStream = this._tokenStream, line, col, prefix, uri; //read import symbol tokenStream.mustMatch(Tokens.NAMESPACE_SYM); line = tokenStream.token().startLine; col = tokenStream.token().startCol; this._readWhitespace(); //it's a namespace prefix - no _namespace_prefix() method because it's just an IDENT if (tokenStream.match(Tokens.IDENT)){ prefix = tokenStream.token().value; this._readWhitespace(); } tokenStream.mustMatch([Tokens.STRING, Tokens.URI]); /*if (!tokenStream.match(Tokens.STRING)){ tokenStream.mustMatch(Tokens.URI); }*/ //grab the URI value uri = tokenStream.token().value.replace(/(?:url\()?["']([^"']+)["']\)?/, "$1"); this._readWhitespace(); //must end with a semicolon tokenStream.mustMatch(Tokens.SEMICOLON); this._readWhitespace(); if (emit !== false){ this.fire({ type: "namespace", prefix: prefix, uri: uri, line: line, col: col }); } }, _media: function(){ /* * media * : MEDIA_SYM S* media_query_list S* '{' S* ruleset* '}' S* * ; */ var tokenStream = this._tokenStream, line, col, mediaList;// = []; //look for @media tokenStream.mustMatch(Tokens.MEDIA_SYM); line = tokenStream.token().startLine; col = tokenStream.token().startCol; this._readWhitespace(); mediaList = this._media_query_list(); tokenStream.mustMatch(Tokens.LBRACE); this._readWhitespace(); this.fire({ type: "startmedia", media: mediaList, line: line, col: col }); while(true) { if (tokenStream.peek() == Tokens.PAGE_SYM){ this._page(); } else if (tokenStream.peek() == Tokens.FONT_FACE_SYM){ this._font_face(); } else if (tokenStream.peek() == Tokens.VIEWPORT_SYM){ this._viewport(); } else if (!this._ruleset()){ break; } } tokenStream.mustMatch(Tokens.RBRACE); this._readWhitespace(); this.fire({ type: "endmedia", media: mediaList, line: line, col: col }); }, //CSS3 Media Queries _media_query_list: function(){ /* * media_query_list * : S* [media_query [ ',' S* media_query ]* ]? * ; */ var tokenStream = this._tokenStream, mediaList = []; this._readWhitespace(); if (tokenStream.peek() == Tokens.IDENT || tokenStream.peek() == Tokens.LPAREN){ mediaList.push(this._media_query()); } while(tokenStream.match(Tokens.COMMA)){ this._readWhitespace(); mediaList.push(this._media_query()); } return mediaList; }, /* * Note: "expression" in the grammar maps to the _media_expression * method. */ _media_query: function(){ /* * media_query * : [ONLY | NOT]? S* media_type S* [ AND S* expression ]* * | expression [ AND S* expression ]* * ; */ var tokenStream = this._tokenStream, type = null, ident = null, token = null, expressions = []; if (tokenStream.match(Tokens.IDENT)){ ident = tokenStream.token().value.toLowerCase(); //since there's no custom tokens for these, need to manually check if (ident != "only" && ident != "not"){ tokenStream.unget(); ident = null; } else { token = tokenStream.token(); } } this._readWhitespace(); if (tokenStream.peek() == Tokens.IDENT){ type = this._media_type(); if (token === null){ token = tokenStream.token(); } } else if (tokenStream.peek() == Tokens.LPAREN){ if (token === null){ token = tokenStream.LT(1); } expressions.push(this._media_expression()); } if (type === null && expressions.length === 0){ return null; } else { this._readWhitespace(); while (tokenStream.match(Tokens.IDENT)){ if (tokenStream.token().value.toLowerCase() != "and"){ this._unexpectedToken(tokenStream.token()); } this._readWhitespace(); expressions.push(this._media_expression()); } } return new MediaQuery(ident, type, expressions, token.startLine, token.startCol); }, //CSS3 Media Queries _media_type: function(){ /* * media_type * : IDENT * ; */ return this._media_feature(); }, /** * Note: in CSS3 Media Queries, this is called "expression". * Renamed here to avoid conflict with CSS3 Selectors * definition of "expression". Also note that "expr" in the * grammar now maps to "expression" from CSS3 selectors. * @method _media_expression * @private */ _media_expression: function(){ /* * expression * : '(' S* media_feature S* [ ':' S* expr ]? ')' S* * ; */ var tokenStream = this._tokenStream, feature = null, token, expression = null; tokenStream.mustMatch(Tokens.LPAREN); feature = this._media_feature(); this._readWhitespace(); if (tokenStream.match(Tokens.COLON)){ this._readWhitespace(); token = tokenStream.LT(1); expression = this._expression(); } tokenStream.mustMatch(Tokens.RPAREN); this._readWhitespace(); return new MediaFeature(feature, (expression ? new SyntaxUnit(expression, token.startLine, token.startCol) : null)); }, //CSS3 Media Queries _media_feature: function(){ /* * media_feature * : IDENT * ; */ var tokenStream = this._tokenStream; tokenStream.mustMatch(Tokens.IDENT); return SyntaxUnit.fromToken(tokenStream.token()); }, //CSS3 Paged Media _page: function(){ /* * page: * PAGE_SYM S* IDENT? pseudo_page? S* * '{' S* [ declaration | margin ]? [ ';' S* [ declaration | margin ]? ]* '}' S* * ; */ var tokenStream = this._tokenStream, line, col, identifier = null, pseudoPage = null; //look for @page tokenStream.mustMatch(Tokens.PAGE_SYM); line = tokenStream.token().startLine; col = tokenStream.token().startCol; this._readWhitespace(); if (tokenStream.match(Tokens.IDENT)){ identifier = tokenStream.token().value; //The value 'auto' may not be used as a page name and MUST be treated as a syntax error. if (identifier.toLowerCase() === "auto"){ this._unexpectedToken(tokenStream.token()); } } //see if there's a colon upcoming if (tokenStream.peek() == Tokens.COLON){ pseudoPage = this._pseudo_page(); } this._readWhitespace(); this.fire({ type: "startpage", id: identifier, pseudo: pseudoPage, line: line, col: col }); this._readDeclarations(true, true); this.fire({ type: "endpage", id: identifier, pseudo: pseudoPage, line: line, col: col }); }, //CSS3 Paged Media _margin: function(){ /* * margin : * margin_sym S* '{' declaration [ ';' S* declaration? ]* '}' S* * ; */ var tokenStream = this._tokenStream, line, col, marginSym = this._margin_sym(); if (marginSym){ line = tokenStream.token().startLine; col = tokenStream.token().startCol; this.fire({ type: "startpagemargin", margin: marginSym, line: line, col: col }); this._readDeclarations(true); this.fire({ type: "endpagemargin", margin: marginSym, line: line, col: col }); return true; } else { return false; } }, //CSS3 Paged Media _margin_sym: function(){ /* * margin_sym : * TOPLEFTCORNER_SYM | * TOPLEFT_SYM | * TOPCENTER_SYM | * TOPRIGHT_SYM | * TOPRIGHTCORNER_SYM | * BOTTOMLEFTCORNER_SYM | * BOTTOMLEFT_SYM | * BOTTOMCENTER_SYM | * BOTTOMRIGHT_SYM | * BOTTOMRIGHTCORNER_SYM | * LEFTTOP_SYM | * LEFTMIDDLE_SYM | * LEFTBOTTOM_SYM | * RIGHTTOP_SYM | * RIGHTMIDDLE_SYM | * RIGHTBOTTOM_SYM * ; */ var tokenStream = this._tokenStream; if(tokenStream.match([Tokens.TOPLEFTCORNER_SYM, Tokens.TOPLEFT_SYM, Tokens.TOPCENTER_SYM, Tokens.TOPRIGHT_SYM, Tokens.TOPRIGHTCORNER_SYM, Tokens.BOTTOMLEFTCORNER_SYM, Tokens.BOTTOMLEFT_SYM, Tokens.BOTTOMCENTER_SYM, Tokens.BOTTOMRIGHT_SYM, Tokens.BOTTOMRIGHTCORNER_SYM, Tokens.LEFTTOP_SYM, Tokens.LEFTMIDDLE_SYM, Tokens.LEFTBOTTOM_SYM, Tokens.RIGHTTOP_SYM, Tokens.RIGHTMIDDLE_SYM, Tokens.RIGHTBOTTOM_SYM])) { return SyntaxUnit.fromToken(tokenStream.token()); } else { return null; } }, _pseudo_page: function(){ /* * pseudo_page * : ':' IDENT * ; */ var tokenStream = this._tokenStream; tokenStream.mustMatch(Tokens.COLON); tokenStream.mustMatch(Tokens.IDENT); //TODO: CSS3 Paged Media says only "left", "center", and "right" are allowed return tokenStream.token().value; }, _font_face: function(){ /* * font_face * : FONT_FACE_SYM S* * '{' S* declaration [ ';' S* declaration ]* '}' S* * ; */ var tokenStream = this._tokenStream, line, col; //look for @page tokenStream.mustMatch(Tokens.FONT_FACE_SYM); line = tokenStream.token().startLine; col = tokenStream.token().startCol; this._readWhitespace(); this.fire({ type: "startfontface", line: line, col: col }); this._readDeclarations(true); this.fire({ type: "endfontface", line: line, col: col }); }, _viewport: function(){ /* * viewport * : VIEWPORT_SYM S* * '{' S* declaration? [ ';' S* declaration? ]* '}' S* * ; */ var tokenStream = this._tokenStream, line, col; tokenStream.mustMatch(Tokens.VIEWPORT_SYM); line = tokenStream.token().startLine; col = tokenStream.token().startCol; this._readWhitespace(); this.fire({ type: "startviewport", line: line, col: col }); this._readDeclarations(true); this.fire({ type: "endviewport", line: line, col: col }); }, _operator: function(inFunction){ /* * operator (outside function) * : '/' S* | ',' S* | /( empty )/ * operator (inside function) * : '/' S* | '+' S* | '*' S* | '-' S* /( empty )/ * ; */ var tokenStream = this._tokenStream, token = null; if (tokenStream.match([Tokens.SLASH, Tokens.COMMA]) || (inFunction && tokenStream.match([Tokens.PLUS, Tokens.STAR, Tokens.MINUS]))){ token = tokenStream.token(); this._readWhitespace(); } return token ? PropertyValuePart.fromToken(token) : null; }, _combinator: function(){ /* * combinator * : PLUS S* | GREATER S* | TILDE S* | S+ * ; */ var tokenStream = this._tokenStream, value = null, token; if(tokenStream.match([Tokens.PLUS, Tokens.GREATER, Tokens.TILDE])){ token = tokenStream.token(); value = new Combinator(token.value, token.startLine, token.startCol); this._readWhitespace(); } return value; }, _unary_operator: function(){ /* * unary_operator * : '-' | '+' * ; */ var tokenStream = this._tokenStream; if (tokenStream.match([Tokens.MINUS, Tokens.PLUS])){ return tokenStream.token().value; } else { return null; } }, _property: function(){ /* * property * : IDENT S* * ; */ var tokenStream = this._tokenStream, value = null, hack = null, tokenValue, token, line, col; //check for star hack - throws error if not allowed if (tokenStream.peek() == Tokens.STAR && this.options.starHack){ tokenStream.get(); token = tokenStream.token(); hack = token.value; line = token.startLine; col = token.startCol; } if(tokenStream.match(Tokens.IDENT)){ token = tokenStream.token(); tokenValue = token.value; //check for underscore hack - no error if not allowed because it's valid CSS syntax if (tokenValue.charAt(0) == "_" && this.options.underscoreHack){ hack = "_"; tokenValue = tokenValue.substring(1); } value = new PropertyName(tokenValue, hack, (line||token.startLine), (col||token.startCol)); this._readWhitespace(); } return value; }, //Augmented with CSS3 Selectors _ruleset: function(){ /* * ruleset * : selectors_group * '{' S* declaration? [ ';' S* declaration? ]* '}' S* * ; */ var tokenStream = this._tokenStream, tt, selectors; /* * Error Recovery: If even a single selector fails to parse, * then the entire ruleset should be thrown away. */ try { selectors = this._selectors_group(); } catch (ex){ if (ex instanceof SyntaxError && !this.options.strict){ //fire error event this.fire({ type: "error", error: ex, message: ex.message, line: ex.line, col: ex.col }); //skip over everything until closing brace tt = tokenStream.advance([Tokens.RBRACE]); if (tt == Tokens.RBRACE){ //if there's a right brace, the rule is finished so don't do anything } else { //otherwise, rethrow the error because it wasn't handled properly throw ex; } } else { //not a syntax error, rethrow it throw ex; } //trigger parser to continue return true; } //if it got here, all selectors parsed if (selectors){ this.fire({ type: "startrule", selectors: selectors, line: selectors[0].line, col: selectors[0].col }); this._readDeclarations(true); this.fire({ type: "endrule", selectors: selectors, line: selectors[0].line, col: selectors[0].col }); } return selectors; }, //CSS3 Selectors _selectors_group: function(){ /* * selectors_group * : selector [ COMMA S* selector ]* * ; */ var tokenStream = this._tokenStream, selectors = [], selector; selector = this._selector(); if (selector !== null){ selectors.push(selector); while(tokenStream.match(Tokens.COMMA)){ this._readWhitespace(); selector = this._selector(); if (selector !== null){ selectors.push(selector); } else { this._unexpectedToken(tokenStream.LT(1)); } } } return selectors.length ? selectors : null; }, //CSS3 Selectors _selector: function(){ /* * selector * : simple_selector_sequence [ combinator simple_selector_sequence ]* * ; */ var tokenStream = this._tokenStream, selector = [], nextSelector = null, combinator = null, ws = null; //if there's no simple selector, then there's no selector nextSelector = this._simple_selector_sequence(); if (nextSelector === null){ return null; } selector.push(nextSelector); do { //look for a combinator combinator = this._combinator(); if (combinator !== null){ selector.push(combinator); nextSelector = this._simple_selector_sequence(); //there must be a next selector if (nextSelector === null){ this._unexpectedToken(tokenStream.LT(1)); } else { //nextSelector is an instance of SelectorPart selector.push(nextSelector); } } else { //if there's not whitespace, we're done if (this._readWhitespace()){ //add whitespace separator ws = new Combinator(tokenStream.token().value, tokenStream.token().startLine, tokenStream.token().startCol); //combinator is not required combinator = this._combinator(); //selector is required if there's a combinator nextSelector = this._simple_selector_sequence(); if (nextSelector === null){ if (combinator !== null){ this._unexpectedToken(tokenStream.LT(1)); } } else { if (combinator !== null){ selector.push(combinator); } else { selector.push(ws); } selector.push(nextSelector); } } else { break; } } } while(true); return new Selector(selector, selector[0].line, selector[0].col); }, //CSS3 Selectors _simple_selector_sequence: function(){ /* * simple_selector_sequence * : [ type_selector | universal ] * [ HASH | class | attrib | pseudo | negation ]* * | [ HASH | class | attrib | pseudo | negation ]+ * ; */ var tokenStream = this._tokenStream, //parts of a simple selector elementName = null, modifiers = [], //complete selector text selectorText= "", //the different parts after the element name to search for components = [ //HASH function(){ return tokenStream.match(Tokens.HASH) ? new SelectorSubPart(tokenStream.token().value, "id", tokenStream.token().startLine, tokenStream.token().startCol) : null; }, this._class, this._attrib, this._pseudo, this._negation ], i = 0, len = components.length, component = null, found = false, line, col; //get starting line and column for the selector line = tokenStream.LT(1).startLine; col = tokenStream.LT(1).startCol; elementName = this._type_selector(); if (!elementName){ elementName = this._universal(); } if (elementName !== null){ selectorText += elementName; } while(true){ //whitespace means we're done if (tokenStream.peek() === Tokens.S){ break; } //check for each component while(i < len && component === null){ component = components[i++].call(this); } if (component === null){ //we don't have a selector if (selectorText === ""){ return null; } else { break; } } else { i = 0; modifiers.push(component); selectorText += component.toString(); component = null; } } return selectorText !== "" ? new SelectorPart(elementName, modifiers, selectorText, line, col) : null; }, //CSS3 Selectors _type_selector: function(){ /* * type_selector * : [ namespace_prefix ]? element_name * ; */ var tokenStream = this._tokenStream, ns = this._namespace_prefix(), elementName = this._element_name(); if (!elementName){ /* * Need to back out the namespace that was read due to both * type_selector and universal reading namespace_prefix * first. Kind of hacky, but only way I can figure out * right now how to not change the grammar. */ if (ns){ tokenStream.unget(); if (ns.length > 1){ tokenStream.unget(); } } return null; } else { if (ns){ elementName.text = ns + elementName.text; elementName.col -= ns.length; } return elementName; } }, //CSS3 Selectors _class: function(){ /* * class * : '.' IDENT * ; */ var tokenStream = this._tokenStream, token; if (tokenStream.match(Tokens.DOT)){ tokenStream.mustMatch(Tokens.IDENT); token = tokenStream.token(); return new SelectorSubPart("." + token.value, "class", token.startLine, token.startCol - 1); } else { return null; } }, //CSS3 Selectors _element_name: function(){ /* * element_name * : IDENT * ; */ var tokenStream = this._tokenStream, token; if (tokenStream.match(Tokens.IDENT)){ token = tokenStream.token(); return new SelectorSubPart(token.value, "elementName", token.startLine, token.startCol); } else { return null; } }, //CSS3 Selectors _namespace_prefix: function(){ /* * namespace_prefix * : [ IDENT | '*' ]? '|' * ; */ var tokenStream = this._tokenStream, value = ""; //verify that this is a namespace prefix if (tokenStream.LA(1) === Tokens.PIPE || tokenStream.LA(2) === Tokens.PIPE){ if(tokenStream.match([Tokens.IDENT, Tokens.STAR])){ value += tokenStream.token().value; } tokenStream.mustMatch(Tokens.PIPE); value += "|"; } return value.length ? value : null; }, //CSS3 Selectors _universal: function(){ /* * universal * : [ namespace_prefix ]? '*' * ; */ var tokenStream = this._tokenStream, value = "", ns; ns = this._namespace_prefix(); if(ns){ value += ns; } if(tokenStream.match(Tokens.STAR)){ value += "*"; } return value.length ? value : null; }, //CSS3 Selectors _attrib: function(){ /* * attrib * : '[' S* [ namespace_prefix ]? IDENT S* * [ [ PREFIXMATCH | * SUFFIXMATCH | * SUBSTRINGMATCH | * '=' | * INCLUDES | * DASHMATCH ] S* [ IDENT | STRING ] S* * ]? ']' * ; */ var tokenStream = this._tokenStream, value = null, ns, token; if (tokenStream.match(Tokens.LBRACKET)){ token = tokenStream.token(); value = token.value; value += this._readWhitespace(); ns = this._namespace_prefix(); if (ns){ value += ns; } tokenStream.mustMatch(Tokens.IDENT); value += tokenStream.token().value; value += this._readWhitespace(); if(tokenStream.match([Tokens.PREFIXMATCH, Tokens.SUFFIXMATCH, Tokens.SUBSTRINGMATCH, Tokens.EQUALS, Tokens.INCLUDES, Tokens.DASHMATCH])){ value += tokenStream.token().value; value += this._readWhitespace(); tokenStream.mustMatch([Tokens.IDENT, Tokens.STRING]); value += tokenStream.token().value; value += this._readWhitespace(); } tokenStream.mustMatch(Tokens.RBRACKET); return new SelectorSubPart(value + "]", "attribute", token.startLine, token.startCol); } else { return null; } }, //CSS3 Selectors _pseudo: function(){ /* * pseudo * : ':' ':'? [ IDENT | functional_pseudo ] * ; */ var tokenStream = this._tokenStream, pseudo = null, colons = ":", line, col; if (tokenStream.match(Tokens.COLON)){ if (tokenStream.match(Tokens.COLON)){ colons += ":"; } if (tokenStream.match(Tokens.IDENT)){ pseudo = tokenStream.token().value; line = tokenStream.token().startLine; col = tokenStream.token().startCol - colons.length; } else if (tokenStream.peek() == Tokens.FUNCTION){ line = tokenStream.LT(1).startLine; col = tokenStream.LT(1).startCol - colons.length; pseudo = this._functional_pseudo(); } if (pseudo){ pseudo = new SelectorSubPart(colons + pseudo, "pseudo", line, col); } } return pseudo; }, //CSS3 Selectors _functional_pseudo: function(){ /* * functional_pseudo * : FUNCTION S* expression ')' * ; */ var tokenStream = this._tokenStream, value = null; if(tokenStream.match(Tokens.FUNCTION)){ value = tokenStream.token().value; value += this._readWhitespace(); value += this._expression(); tokenStream.mustMatch(Tokens.RPAREN); value += ")"; } return value; }, //CSS3 Selectors _expression: function(){ /* * expression * : [ [ PLUS | '-' | DIMENSION | NUMBER | STRING | IDENT ] S* ]+ * ; */ var tokenStream = this._tokenStream, value = ""; while(tokenStream.match([Tokens.PLUS, Tokens.MINUS, Tokens.DIMENSION, Tokens.NUMBER, Tokens.STRING, Tokens.IDENT, Tokens.LENGTH, Tokens.FREQ, Tokens.ANGLE, Tokens.TIME, Tokens.RESOLUTION, Tokens.SLASH])){ value += tokenStream.token().value; value += this._readWhitespace(); } return value.length ? value : null; }, //CSS3 Selectors _negation: function(){ /* * negation * : NOT S* negation_arg S* ')' * ; */ var tokenStream = this._tokenStream, line, col, value = "", arg, subpart = null; if (tokenStream.match(Tokens.NOT)){ value = tokenStream.token().value; line = tokenStream.token().startLine; col = tokenStream.token().startCol; value += this._readWhitespace(); arg = this._negation_arg(); value += arg; value += this._readWhitespace(); tokenStream.match(Tokens.RPAREN); value += tokenStream.token().value; subpart = new SelectorSubPart(value, "not", line, col); subpart.args.push(arg); } return subpart; }, //CSS3 Selectors _negation_arg: function(){ /* * negation_arg * : type_selector | universal | HASH | class | attrib | pseudo * ; */ var tokenStream = this._tokenStream, args = [ this._type_selector, this._universal, function(){ return tokenStream.match(Tokens.HASH) ? new SelectorSubPart(tokenStream.token().value, "id", tokenStream.token().startLine, tokenStream.token().startCol) : null; }, this._class, this._attrib, this._pseudo ], arg = null, i = 0, len = args.length, elementName, line, col, part; line = tokenStream.LT(1).startLine; col = tokenStream.LT(1).startCol; while(i < len && arg === null){ arg = args[i].call(this); i++; } //must be a negation arg if (arg === null){ this._unexpectedToken(tokenStream.LT(1)); } //it's an element name if (arg.type == "elementName"){ part = new SelectorPart(arg, [], arg.toString(), line, col); } else { part = new SelectorPart(null, [arg], arg.toString(), line, col); } return part; }, _declaration: function(){ /* * declaration * : property ':' S* expr prio? * | /( empty )/ * ; */ var tokenStream = this._tokenStream, property = null, expr = null, prio = null, error = null, invalid = null, propertyName= ""; property = this._property(); if (property !== null){ tokenStream.mustMatch(Tokens.COLON); this._readWhitespace(); expr = this._expr(); //if there's no parts for the value, it's an error if (!expr || expr.length === 0){ this._unexpectedToken(tokenStream.LT(1)); } prio = this._prio(); /* * If hacks should be allowed, then only check the root * property. If hacks should not be allowed, treat * _property or *property as invalid properties. */ propertyName = property.toString(); if (this.options.starHack && property.hack == "*" || this.options.underscoreHack && property.hack == "_") { propertyName = property.text; } try { this._validateProperty(propertyName, expr); } catch (ex) { invalid = ex; } this.fire({ type: "property", property: property, value: expr, important: prio, line: property.line, col: property.col, invalid: invalid }); return true; } else { return false; } }, _prio: function(){ /* * prio * : IMPORTANT_SYM S* * ; */ var tokenStream = this._tokenStream, result = tokenStream.match(Tokens.IMPORTANT_SYM); this._readWhitespace(); return result; }, _expr: function(inFunction){ /* * expr * : term [ operator term ]* * ; */ var tokenStream = this._tokenStream, values = [], //valueParts = [], value = null, operator = null; value = this._term(inFunction); if (value !== null){ values.push(value); do { operator = this._operator(inFunction); //if there's an operator, keep building up the value parts if (operator){ values.push(operator); } /*else { //if there's not an operator, you have a full value values.push(new PropertyValue(valueParts, valueParts[0].line, valueParts[0].col)); valueParts = []; }*/ value = this._term(inFunction); if (value === null){ break; } else { values.push(value); } } while(true); } //cleanup /*if (valueParts.length){ values.push(new PropertyValue(valueParts, valueParts[0].line, valueParts[0].col)); }*/ return values.length > 0 ? new PropertyValue(values, values[0].line, values[0].col) : null; }, _term: function(inFunction){ /* * term * : unary_operator? * [ NUMBER S* | PERCENTAGE S* | LENGTH S* | ANGLE S* | * TIME S* | FREQ S* | function | ie_function ] * | STRING S* | IDENT S* | URI S* | UNICODERANGE S* | hexcolor * ; */ var tokenStream = this._tokenStream, unary = null, value = null, endChar = null, token, line, col; //returns the operator or null unary = this._unary_operator(); if (unary !== null){ line = tokenStream.token().startLine; col = tokenStream.token().startCol; } //exception for IE filters if (tokenStream.peek() == Tokens.IE_FUNCTION && this.options.ieFilters){ value = this._ie_function(); if (unary === null){ line = tokenStream.token().startLine; col = tokenStream.token().startCol; } //see if it's a simple block } else if (inFunction && tokenStream.match([Tokens.LPAREN, Tokens.LBRACE, Tokens.LBRACKET])){ token = tokenStream.token(); endChar = token.endChar; value = token.value + this._expr(inFunction).text; if (unary === null){ line = tokenStream.token().startLine; col = tokenStream.token().startCol; } tokenStream.mustMatch(Tokens.type(endChar)); value += endChar; this._readWhitespace(); //see if there's a simple match } else if (tokenStream.match([Tokens.NUMBER, Tokens.PERCENTAGE, Tokens.LENGTH, Tokens.ANGLE, Tokens.TIME, Tokens.FREQ, Tokens.STRING, Tokens.IDENT, Tokens.URI, Tokens.UNICODE_RANGE])){ value = tokenStream.token().value; if (unary === null){ line = tokenStream.token().startLine; col = tokenStream.token().startCol; } this._readWhitespace(); } else { //see if it's a color token = this._hexcolor(); if (token === null){ //if there's no unary, get the start of the next token for line/col info if (unary === null){ line = tokenStream.LT(1).startLine; col = tokenStream.LT(1).startCol; } //has to be a function if (value === null){ /* * This checks for alpha(opacity=0) style of IE * functions. IE_FUNCTION only presents progid: style. */ if (tokenStream.LA(3) == Tokens.EQUALS && this.options.ieFilters){ value = this._ie_function(); } else { value = this._function(); } } /*if (value === null){ return null; //throw new Error("Expected identifier at line " + tokenStream.token().startLine + ", character " + tokenStream.token().startCol + "."); }*/ } else { value = token.value; if (unary === null){ line = token.startLine; col = token.startCol; } } } return value !== null ? new PropertyValuePart(unary !== null ? unary + value : value, line, col) : null; }, _function: function(){ /* * function * : FUNCTION S* expr ')' S* * ; */ var tokenStream = this._tokenStream, functionText = null, expr = null, lt; if (tokenStream.match(Tokens.FUNCTION)){ functionText = tokenStream.token().value; this._readWhitespace(); expr = this._expr(true); functionText += expr; //START: Horrible hack in case it's an IE filter if (this.options.ieFilters && tokenStream.peek() == Tokens.EQUALS){ do { if (this._readWhitespace()){ functionText += tokenStream.token().value; } //might be second time in the loop if (tokenStream.LA(0) == Tokens.COMMA){ functionText += tokenStream.token().value; } tokenStream.match(Tokens.IDENT); functionText += tokenStream.token().value; tokenStream.match(Tokens.EQUALS); functionText += tokenStream.token().value; //functionText += this._term(); lt = tokenStream.peek(); while(lt != Tokens.COMMA && lt != Tokens.S && lt != Tokens.RPAREN){ tokenStream.get(); functionText += tokenStream.token().value; lt = tokenStream.peek(); } } while(tokenStream.match([Tokens.COMMA, Tokens.S])); } //END: Horrible Hack tokenStream.match(Tokens.RPAREN); functionText += ")"; this._readWhitespace(); } return functionText; }, _ie_function: function(){ /* (My own extension) * ie_function * : IE_FUNCTION S* IDENT '=' term [S* ','? IDENT '=' term]+ ')' S* * ; */ var tokenStream = this._tokenStream, functionText = null, expr = null, lt; //IE function can begin like a regular function, too if (tokenStream.match([Tokens.IE_FUNCTION, Tokens.FUNCTION])){ functionText = tokenStream.token().value; do { if (this._readWhitespace()){ functionText += tokenStream.token().value; } //might be second time in the loop if (tokenStream.LA(0) == Tokens.COMMA){ functionText += tokenStream.token().value; } tokenStream.match(Tokens.IDENT); functionText += tokenStream.token().value; tokenStream.match(Tokens.EQUALS); functionText += tokenStream.token().value; //functionText += this._term(); lt = tokenStream.peek(); while(lt != Tokens.COMMA && lt != Tokens.S && lt != Tokens.RPAREN){ tokenStream.get(); functionText += tokenStream.token().value; lt = tokenStream.peek(); } } while(tokenStream.match([Tokens.COMMA, Tokens.S])); tokenStream.match(Tokens.RPAREN); functionText += ")"; this._readWhitespace(); } return functionText; }, _hexcolor: function(){ /* * There is a constraint on the color that it must * have either 3 or 6 hex-digits (i.e., [0-9a-fA-F]) * after the "#"; e.g., "#000" is OK, but "#abcd" is not. * * hexcolor * : HASH S* * ; */ var tokenStream = this._tokenStream, token = null, color; if(tokenStream.match(Tokens.HASH)){ //need to do some validation here token = tokenStream.token(); color = token.value; if (!/#[a-f0-9]{3,6}/i.test(color)){ throw new SyntaxError("Expected a hex color but found '" + color + "' at line " + token.startLine + ", col " + token.startCol + ".", token.startLine, token.startCol); } this._readWhitespace(); } return token; }, //----------------------------------------------------------------- // Animations methods //----------------------------------------------------------------- _keyframes: function(){ /* * keyframes: * : KEYFRAMES_SYM S* keyframe_name S* '{' S* keyframe_rule* '}' { * ; */ var tokenStream = this._tokenStream, token, tt, name, prefix = ""; tokenStream.mustMatch(Tokens.KEYFRAMES_SYM); token = tokenStream.token(); if (/^@\-([^\-]+)\-/.test(token.value)) { prefix = RegExp.$1; } this._readWhitespace(); name = this._keyframe_name(); this._readWhitespace(); tokenStream.mustMatch(Tokens.LBRACE); this.fire({ type: "startkeyframes", name: name, prefix: prefix, line: token.startLine, col: token.startCol }); this._readWhitespace(); tt = tokenStream.peek(); //check for key while(tt == Tokens.IDENT || tt == Tokens.PERCENTAGE) { this._keyframe_rule(); this._readWhitespace(); tt = tokenStream.peek(); } this.fire({ type: "endkeyframes", name: name, prefix: prefix, line: token.startLine, col: token.startCol }); this._readWhitespace(); tokenStream.mustMatch(Tokens.RBRACE); }, _keyframe_name: function(){ /* * keyframe_name: * : IDENT * | STRING * ; */ var tokenStream = this._tokenStream, token; tokenStream.mustMatch([Tokens.IDENT, Tokens.STRING]); return SyntaxUnit.fromToken(tokenStream.token()); }, _keyframe_rule: function(){ /* * keyframe_rule: * : key_list S* * '{' S* declaration [ ';' S* declaration ]* '}' S* * ; */ var tokenStream = this._tokenStream, token, keyList = this._key_list(); this.fire({ type: "startkeyframerule", keys: keyList, line: keyList[0].line, col: keyList[0].col }); this._readDeclarations(true); this.fire({ type: "endkeyframerule", keys: keyList, line: keyList[0].line, col: keyList[0].col }); }, _key_list: function(){ /* * key_list: * : key [ S* ',' S* key]* * ; */ var tokenStream = this._tokenStream, token, key, keyList = []; //must be least one key keyList.push(this._key()); this._readWhitespace(); while(tokenStream.match(Tokens.COMMA)){ this._readWhitespace(); keyList.push(this._key()); this._readWhitespace(); } return keyList; }, _key: function(){ /* * There is a restriction that IDENT can be only "from" or "to". * * key * : PERCENTAGE * | IDENT * ; */ var tokenStream = this._tokenStream, token; if (tokenStream.match(Tokens.PERCENTAGE)){ return SyntaxUnit.fromToken(tokenStream.token()); } else if (tokenStream.match(Tokens.IDENT)){ token = tokenStream.token(); if (/from|to/i.test(token.value)){ return SyntaxUnit.fromToken(token); } tokenStream.unget(); } //if it gets here, there wasn't a valid token, so time to explode this._unexpectedToken(tokenStream.LT(1)); }, //----------------------------------------------------------------- // Helper methods //----------------------------------------------------------------- /** * Not part of CSS grammar, but useful for skipping over * combination of white space and HTML-style comments. * @return {void} * @method _skipCruft * @private */ _skipCruft: function(){ while(this._tokenStream.match([Tokens.S, Tokens.CDO, Tokens.CDC])){ //noop } }, /** * Not part of CSS grammar, but this pattern occurs frequently * in the official CSS grammar. Split out here to eliminate * duplicate code. * @param {Boolean} checkStart Indicates if the rule should check * for the left brace at the beginning. * @param {Boolean} readMargins Indicates if the rule should check * for margin patterns. * @return {void} * @method _readDeclarations * @private */ _readDeclarations: function(checkStart, readMargins){ /* * Reads the pattern * S* '{' S* declaration [ ';' S* declaration ]* '}' S* * or * S* '{' S* [ declaration | margin ]? [ ';' S* [ declaration | margin ]? ]* '}' S* * Note that this is how it is described in CSS3 Paged Media, but is actually incorrect. * A semicolon is only necessary following a declaration is there's another declaration * or margin afterwards. */ var tokenStream = this._tokenStream, tt; this._readWhitespace(); if (checkStart){ tokenStream.mustMatch(Tokens.LBRACE); } this._readWhitespace(); try { while(true){ if (tokenStream.match(Tokens.SEMICOLON) || (readMargins && this._margin())){ //noop } else if (this._declaration()){ if (!tokenStream.match(Tokens.SEMICOLON)){ break; } } else { break; } //if ((!this._margin() && !this._declaration()) || !tokenStream.match(Tokens.SEMICOLON)){ // break; //} this._readWhitespace(); } tokenStream.mustMatch(Tokens.RBRACE); this._readWhitespace(); } catch (ex) { if (ex instanceof SyntaxError && !this.options.strict){ //fire error event this.fire({ type: "error", error: ex, message: ex.message, line: ex.line, col: ex.col }); //see if there's another declaration tt = tokenStream.advance([Tokens.SEMICOLON, Tokens.RBRACE]); if (tt == Tokens.SEMICOLON){ //if there's a semicolon, then there might be another declaration this._readDeclarations(false, readMargins); } else if (tt != Tokens.RBRACE){ //if there's a right brace, the rule is finished so don't do anything //otherwise, rethrow the error because it wasn't handled properly throw ex; } } else { //not a syntax error, rethrow it throw ex; } } }, /** * In some cases, you can end up with two white space tokens in a * row. Instead of making a change in every function that looks for * white space, this function is used to match as much white space * as necessary. * @method _readWhitespace * @return {String} The white space if found, empty string if not. * @private */ _readWhitespace: function(){ var tokenStream = this._tokenStream, ws = ""; while(tokenStream.match(Tokens.S)){ ws += tokenStream.token().value; } return ws; }, /** * Throws an error when an unexpected token is found. * @param {Object} token The token that was found. * @method _unexpectedToken * @return {void} * @private */ _unexpectedToken: function(token){ throw new SyntaxError("Unexpected token '" + token.value + "' at line " + token.startLine + ", col " + token.startCol + ".", token.startLine, token.startCol); }, /** * Helper method used for parsing subparts of a style sheet. * @return {void} * @method _verifyEnd * @private */ _verifyEnd: function(){ if (this._tokenStream.LA(1) != Tokens.EOF){ this._unexpectedToken(this._tokenStream.LT(1)); } }, //----------------------------------------------------------------- // Validation methods //----------------------------------------------------------------- _validateProperty: function(property, value){ Validation.validate(property, value); }, //----------------------------------------------------------------- // Parsing methods //----------------------------------------------------------------- parse: function(input){ this._tokenStream = new TokenStream(input, Tokens); this._stylesheet(); }, parseStyleSheet: function(input){ //just passthrough return this.parse(input); }, parseMediaQuery: function(input){ this._tokenStream = new TokenStream(input, Tokens); var result = this._media_query(); //if there's anything more, then it's an invalid selector this._verifyEnd(); //otherwise return result return result; }, /** * Parses a property value (everything after the semicolon). * @return {parserlib.css.PropertyValue} The property value. * @throws parserlib.util.SyntaxError If an unexpected token is found. * @method parserPropertyValue */ parsePropertyValue: function(input){ this._tokenStream = new TokenStream(input, Tokens); this._readWhitespace(); var result = this._expr(); //okay to have a trailing white space this._readWhitespace(); //if there's anything more, then it's an invalid selector this._verifyEnd(); //otherwise return result return result; }, /** * Parses a complete CSS rule, including selectors and * properties. * @param {String} input The text to parser. * @return {Boolean} True if the parse completed successfully, false if not. * @method parseRule */ parseRule: function(input){ this._tokenStream = new TokenStream(input, Tokens); //skip any leading white space this._readWhitespace(); var result = this._ruleset(); //skip any trailing white space this._readWhitespace(); //if there's anything more, then it's an invalid selector this._verifyEnd(); //otherwise return result return result; }, /** * Parses a single CSS selector (no comma) * @param {String} input The text to parse as a CSS selector. * @return {Selector} An object representing the selector. * @throws parserlib.util.SyntaxError If an unexpected token is found. * @method parseSelector */ parseSelector: function(input){ this._tokenStream = new TokenStream(input, Tokens); //skip any leading white space this._readWhitespace(); var result = this._selector(); //skip any trailing white space this._readWhitespace(); //if there's anything more, then it's an invalid selector this._verifyEnd(); //otherwise return result return result; }, /** * Parses an HTML style attribute: a set of CSS declarations * separated by semicolons. * @param {String} input The text to parse as a style attribute * @return {void} * @method parseStyleAttribute */ parseStyleAttribute: function(input){ input += "}"; // for error recovery in _readDeclarations() this._tokenStream = new TokenStream(input, Tokens); this._readDeclarations(); } }; //copy over onto prototype for (prop in additions){ if (additions.hasOwnProperty(prop)){ proto[prop] = additions[prop]; } } return proto; }(); /* nth : S* [ ['-'|'+']? INTEGER? {N} [ S* ['-'|'+'] S* INTEGER ]? | ['-'|'+']? INTEGER | {O}{D}{D} | {E}{V}{E}{N} ] S* ; */ /*global Validation, ValidationTypes, ValidationError*/ var Properties = { //A "align-items" : "flex-start | flex-end | center | baseline | stretch", "align-content" : "flex-start | flex-end | center | space-between | space-around | stretch", "align-self" : "auto | flex-start | flex-end | center | baseline | stretch", "-webkit-align-items" : "flex-start | flex-end | center | baseline | stretch", "-webkit-align-content" : "flex-start | flex-end | center | space-between | space-around | stretch", "-webkit-align-self" : "auto | flex-start | flex-end | center | baseline | stretch", "alignment-adjust" : "auto | baseline | before-edge | text-before-edge | middle | central | after-edge | text-after-edge | ideographic | alphabetic | hanging | mathematical | | ", "alignment-baseline" : "baseline | use-script | before-edge | text-before-edge | after-edge | text-after-edge | central | middle | ideographic | alphabetic | hanging | mathematical", "animation" : 1, "animation-delay" : { multi: "